1
0
forked from Rowland/EG
EG/Cesium-1.132/Build/InlineWorkers.js
2025-08-25 17:48:13 +08:00

1 line
3.1 MiB

globalThis.CESIUM_WORKERS = atob("dmFyIENlc2l1bVdvcmtlcnMgPSAoKCkgPT4gewogIHZhciBfX2NyZWF0ZSA9IE9iamVjdC5jcmVhdGU7CiAgdmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKICB2YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgdmFyIF9fZ2V0T3duUHJvcE5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7CiAgdmFyIF9fZ2V0UHJvdG9PZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKICB2YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICB2YXIgX19yZXF1aXJlID0gLyogQF9fUFVSRV9fICovICgoeCkgPT4gdHlwZW9mIHJlcXVpcmUgIT09ICJ1bmRlZmluZWQiID8gcmVxdWlyZSA6IHR5cGVvZiBQcm94eSAhPT0gInVuZGVmaW5lZCIgPyBuZXcgUHJveHkoeCwgewogICAgZ2V0OiAoYTMsIGIpID0+ICh0eXBlb2YgcmVxdWlyZSAhPT0gInVuZGVmaW5lZCIgPyByZXF1aXJlIDogYTMpW2JdCiAgfSkgOiB4KShmdW5jdGlvbih4KSB7CiAgICBpZiAodHlwZW9mIHJlcXVpcmUgIT09ICJ1bmRlZmluZWQiKSByZXR1cm4gcmVxdWlyZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgdGhyb3cgRXJyb3IoJ0R5bmFtaWMgcmVxdWlyZSBvZiAiJyArIHggKyAnIiBpcyBub3Qgc3VwcG9ydGVkJyk7CiAgfSk7CiAgdmFyIF9fZ2xvYiA9IChtYXApID0+IChwYXRoKSA9PiB7CiAgICB2YXIgZm4gPSBtYXBbcGF0aF07CiAgICBpZiAoZm4pIHJldHVybiBmbigpOwogICAgdGhyb3cgbmV3IEVycm9yKCJNb2R1bGUgbm90IGZvdW5kIGluIGJ1bmRsZTogIiArIHBhdGgpOwogIH07CiAgdmFyIF9fZXNtID0gKGZuLCByZXMpID0+IGZ1bmN0aW9uIF9faW5pdCgpIHsKICAgIHJldHVybiBmbiAmJiAocmVzID0gKDAsIGZuW19fZ2V0T3duUHJvcE5hbWVzKGZuKVswXV0pKGZuID0gMCkpLCByZXM7CiAgfTsKICB2YXIgX19jb21tb25KUyA9IChjYiwgbW9kKSA9PiBmdW5jdGlvbiBfX3JlcXVpcmUyKCkgewogICAgcmV0dXJuIG1vZCB8fCAoMCwgY2JbX19nZXRPd25Qcm9wTmFtZXMoY2IpWzBdXSkoKG1vZCA9IHsgZXhwb3J0czoge30gfSkuZXhwb3J0cywgbW9kKSwgbW9kLmV4cG9ydHM7CiAgfTsKICB2YXIgX19leHBvcnQgPSAodGFyZ2V0LCBhbGwpID0+IHsKICAgIGZvciAodmFyIG5hbWUgaW4gYWxsKQogICAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsW25hbWVdLCBlbnVtZXJhYmxlOiB0cnVlIH0pOwogIH07CiAgdmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tLCBleGNlcHQsIGRlc2MpID0+IHsKICAgIGlmIChmcm9tICYmIHR5cGVvZiBmcm9tID09PSAib2JqZWN0IiB8fCB0eXBlb2YgZnJvbSA9PT0gImZ1bmN0aW9uIikgewogICAgICBmb3IgKGxldCBrZXkgb2YgX19nZXRPd25Qcm9wTmFtZXMoZnJvbSkpCiAgICAgICAgaWYgKCFfX2hhc093blByb3AuY2FsbCh0bywga2V5KSAmJiBrZXkgIT09IGV4Y2VwdCkKICAgICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTsKICAgIH0KICAgIHJldHVybiB0bzsKICB9OwogIHZhciBfX3RvRVNNID0gKG1vZCwgaXNOb2RlTW9kZSwgdGFyZ2V0KSA9PiAodGFyZ2V0ID0gbW9kICE9IG51bGwgPyBfX2NyZWF0ZShfX2dldFByb3RvT2YobW9kKSkgOiB7fSwgX19jb3B5UHJvcHMoCiAgICAvLyBJZiB0aGUgaW1wb3J0ZXIgaXMgaW4gbm9kZSBjb21wYXRpYmlsaXR5IG1vZGUgb3IgdGhpcyBpcyBub3QgYW4gRVNNCiAgICAvLyBmaWxlIHRoYXQgaGFzIGJlZW4gY29udmVydGVkIHRvIGEgQ29tbW9uSlMgZmlsZSB1c2luZyBhIEJhYmVsLQogICAgLy8gY29tcGF0aWJsZSB0cmFuc2Zvcm0gKGkuZS4gIl9fZXNNb2R1bGUiIGhhcyBub3QgYmVlbiBzZXQpLCB0aGVuIHNldAogICAgLy8gImRlZmF1bHQiIHRvIHRoZSBDb21tb25KUyAibW9kdWxlLmV4cG9ydHMiIGZvciBub2RlIGNvbXBhdGliaWxpdHkuCiAgICBpc05vZGVNb2RlIHx8ICFtb2QgfHwgIW1vZC5fX2VzTW9kdWxlID8gX19kZWZQcm9wKHRhcmdldCwgImRlZmF1bHQiLCB7IHZhbHVlOiBtb2QsIGVudW1lcmFibGU6IHRydWUgfSkgOiB0YXJnZXQsCiAgICBtb2QKICApKTsKICB2YXIgX190b0NvbW1vbkpTID0gKG1vZCkgPT4gX19jb3B5UHJvcHMoX19kZWZQcm9wKHt9LCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSksIG1vZCk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9kZWZpbmVkLmpzCiAgZnVuY3Rpb24gZGVmaW5lZCh2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlICE9PSB2b2lkIDAgJiYgdmFsdWUgIT09IG51bGw7CiAgfQogIHZhciBkZWZpbmVkX2RlZmF1bHQ7CiAgdmFyIGluaXRfZGVmaW5lZCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvZGVmaW5lZC5qcyIoKSB7CiAgICAgIGRlZmluZWRfZGVmYXVsdCA9IGRlZmluZWQ7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9EZXZlbG9wZXJFcnJvci5qcwogIGZ1bmN0aW9uIERldmVsb3BlckVycm9yKG1lc3NhZ2UpIHsKICAgIHRoaXMubmFtZSA9ICJEZXZlbG9wZXJFcnJvciI7CiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwogICAgbGV0IHN0YWNrOwogICAgdHJ5IHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHN0YWNrID0gZS5zdGFjazsKICAgIH0KICAgIHRoaXMuc3RhY2sgPSBzdGFjazsKICB9CiAgdmFyIERldmVsb3BlckVycm9yX2RlZmF1bHQ7CiAgdmFyIGluaXRfRGV2ZWxvcGVyRXJyb3IgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0RldmVsb3BlckVycm9yLmpzIigpIHsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoT2JqZWN0LmNyZWF0ZSkpIHsKICAgICAgICBEZXZlbG9wZXJFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7CiAgICAgICAgRGV2ZWxvcGVyRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGV2ZWxvcGVyRXJyb3I7CiAgICAgIH0KICAgICAgRGV2ZWxvcGVyRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgbGV0IHN0ciA9IGAke3RoaXMubmFtZX06ICR7dGhpcy5tZXNzYWdlfWA7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdCh0aGlzLnN0YWNrKSkgewogICAgICAgICAgc3RyICs9IGAKJHt0aGlzLnN0YWNrLnRvU3RyaW5nKCl9YDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgfTsKICAgICAgRGV2ZWxvcGVyRXJyb3IudGhyb3dJbnN0YW50aWF0aW9uRXJyb3IgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3IoCiAgICAgICAgICAiVGhpcyBmdW5jdGlvbiBkZWZpbmVzIGFuIGludGVyZmFjZSBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIgogICAgICAgICk7CiAgICAgIH07CiAgICAgIERldmVsb3BlckVycm9yX2RlZmF1bHQgPSBEZXZlbG9wZXJFcnJvcjsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NoZWNrLmpzCiAgZnVuY3Rpb24gZ2V0VW5kZWZpbmVkRXJyb3JNZXNzYWdlKG5hbWUpIHsKICAgIHJldHVybiBgJHtuYW1lfSBpcyByZXF1aXJlZCwgYWN0dWFsIHZhbHVlIHdhcyB1bmRlZmluZWRgOwogIH0KICBmdW5jdGlvbiBnZXRGYWlsZWRUeXBlRXJyb3JNZXNzYWdlKGFjdHVhbCwgZXhwZWN0ZWQsIG5hbWUpIHsKICAgIHJldHVybiBgRXhwZWN0ZWQgJHtuYW1lfSB0byBiZSB0eXBlb2YgJHtleHBlY3RlZH0sIGFjdHVhbCB0eXBlb2Ygd2FzICR7YWN0dWFsfWA7CiAgfQogIHZhciBDaGVjaywgQ2hlY2tfZGVmYXVsdDsKICB2YXIgaW5pdF9DaGVjayA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ2hlY2suanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBDaGVjayA9IHt9OwogICAgICBDaGVjay50eXBlT2YgPSB7fTsKICAgICAgQ2hlY2suZGVmaW5lZCA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh0ZXN0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoZ2V0VW5kZWZpbmVkRXJyb3JNZXNzYWdlKG5hbWUpKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5mdW5jID0gZnVuY3Rpb24obmFtZSwgdGVzdCkgewogICAgICAgIGlmICh0eXBlb2YgdGVzdCAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGdldEZhaWxlZFR5cGVFcnJvck1lc3NhZ2UodHlwZW9mIHRlc3QsICJmdW5jdGlvbiIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLnN0cmluZyA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAodHlwZW9mIHRlc3QgIT09ICJzdHJpbmciKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZSh0eXBlb2YgdGVzdCwgInN0cmluZyIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm51bWJlciA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAodHlwZW9mIHRlc3QgIT09ICJudW1iZXIiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZSh0eXBlb2YgdGVzdCwgIm51bWJlciIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm51bWJlci5sZXNzVGhhbiA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QsIGxpbWl0KSB7CiAgICAgICAgQ2hlY2sudHlwZU9mLm51bWJlcihuYW1lLCB0ZXN0KTsKICAgICAgICBpZiAodGVzdCA+PSBsaW1pdCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGBFeHBlY3RlZCAke25hbWV9IHRvIGJlIGxlc3MgdGhhbiAke2xpbWl0fSwgYWN0dWFsIHZhbHVlIHdhcyAke3Rlc3R9YAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscyA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QsIGxpbWl0KSB7CiAgICAgICAgQ2hlY2sudHlwZU9mLm51bWJlcihuYW1lLCB0ZXN0KTsKICAgICAgICBpZiAodGVzdCA+IGxpbWl0KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgYEV4cGVjdGVkICR7bmFtZX0gdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7bGltaXR9LCBhY3R1YWwgdmFsdWUgd2FzICR7dGVzdH1gCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbiA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QsIGxpbWl0KSB7CiAgICAgICAgQ2hlY2sudHlwZU9mLm51bWJlcihuYW1lLCB0ZXN0KTsKICAgICAgICBpZiAodGVzdCA8PSBsaW1pdCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGBFeHBlY3RlZCAke25hbWV9IHRvIGJlIGdyZWF0ZXIgdGhhbiAke2xpbWl0fSwgYWN0dWFsIHZhbHVlIHdhcyAke3Rlc3R9YAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscyA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QsIGxpbWl0KSB7CiAgICAgICAgQ2hlY2sudHlwZU9mLm51bWJlcihuYW1lLCB0ZXN0KTsKICAgICAgICBpZiAodGVzdCA8IGxpbWl0KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgYEV4cGVjdGVkICR7bmFtZX0gdG8gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7bGltaXR9LCBhY3R1YWwgdmFsdWUgd2FzICR7dGVzdH1gCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm9iamVjdCA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAodHlwZW9mIHRlc3QgIT09ICJvYmplY3QiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZSh0eXBlb2YgdGVzdCwgIm9iamVjdCIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLmJvb2wgPSBmdW5jdGlvbihuYW1lLCB0ZXN0KSB7CiAgICAgICAgaWYgKHR5cGVvZiB0ZXN0ICE9PSAiYm9vbGVhbiIpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICBnZXRGYWlsZWRUeXBlRXJyb3JNZXNzYWdlKHR5cGVvZiB0ZXN0LCAiYm9vbGVhbiIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLmJpZ2ludCA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAodHlwZW9mIHRlc3QgIT09ICJiaWdpbnQiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZSh0eXBlb2YgdGVzdCwgImJpZ2ludCIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm51bWJlci5lcXVhbHMgPSBmdW5jdGlvbihuYW1lMSwgbmFtZTIsIHRlc3QxLCB0ZXN0MikgewogICAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIobmFtZTEsIHRlc3QxKTsKICAgICAgICBDaGVjay50eXBlT2YubnVtYmVyKG5hbWUyLCB0ZXN0Mik7CiAgICAgICAgaWYgKHRlc3QxICE9PSB0ZXN0MikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGAke25hbWUxfSBtdXN0IGJlIGVxdWFsIHRvICR7bmFtZTJ9LCB0aGUgYWN0dWFsIHZhbHVlcyBhcmUgJHt0ZXN0MX0gYW5kICR7dGVzdDJ9YAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrX2RlZmF1bHQgPSBDaGVjazsKICAgIH0KICB9KTsKCiAgLy8gbm9kZV9tb2R1bGVzL21lcnNlbm5lLXR3aXN0ZXIvc3JjL21lcnNlbm5lLXR3aXN0ZXIuanMKICB2YXIgcmVxdWlyZV9tZXJzZW5uZV90d2lzdGVyID0gX19jb21tb25KUyh7CiAgICAibm9kZV9tb2R1bGVzL21lcnNlbm5lLXR3aXN0ZXIvc3JjL21lcnNlbm5lLXR3aXN0ZXIuanMiKGV4cG9ydHMyLCBtb2R1bGUpIHsKICAgICAgdmFyIE1lcnNlbm5lVHdpc3RlcjIgPSBmdW5jdGlvbihzZWVkKSB7CiAgICAgICAgaWYgKHNlZWQgPT0gdm9pZCAwKSB7CiAgICAgICAgICBzZWVkID0gKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuTiA9IDYyNDsKICAgICAgICB0aGlzLk0gPSAzOTc7CiAgICAgICAgdGhpcy5NQVRSSVhfQSA9IDI1Njc0ODM2MTU7CiAgICAgICAgdGhpcy5VUFBFUl9NQVNLID0gMjE0NzQ4MzY0ODsKICAgICAgICB0aGlzLkxPV0VSX01BU0sgPSAyMTQ3NDgzNjQ3OwogICAgICAgIHRoaXMubXQgPSBuZXcgQXJyYXkodGhpcy5OKTsKICAgICAgICB0aGlzLm10aSA9IHRoaXMuTiArIDE7CiAgICAgICAgaWYgKHNlZWQuY29uc3RydWN0b3IgPT0gQXJyYXkpIHsKICAgICAgICAgIHRoaXMuaW5pdF9ieV9hcnJheShzZWVkLCBzZWVkLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuaW5pdF9zZWVkKHNlZWQpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgTWVyc2VubmVUd2lzdGVyMi5wcm90b3R5cGUuaW5pdF9zZWVkID0gZnVuY3Rpb24ocykgewogICAgICAgIHRoaXMubXRbMF0gPSBzID4+PiAwOwogICAgICAgIGZvciAodGhpcy5tdGkgPSAxOyB0aGlzLm10aSA8IHRoaXMuTjsgdGhpcy5tdGkrKykgewogICAgICAgICAgdmFyIHMgPSB0aGlzLm10W3RoaXMubXRpIC0gMV0gXiB0aGlzLm10W3RoaXMubXRpIC0gMV0gPj4+IDMwOwogICAgICAgICAgdGhpcy5tdFt0aGlzLm10aV0gPSAoKChzICYgNDI5NDkwMTc2MCkgPj4+IDE2KSAqIDE4MTI0MzMyNTMgPDwgMTYpICsgKHMgJiA2NTUzNSkgKiAxODEyNDMzMjUzICsgdGhpcy5tdGk7CiAgICAgICAgICB0aGlzLm10W3RoaXMubXRpXSA+Pj49IDA7CiAgICAgICAgfQogICAgICB9OwogICAgICBNZXJzZW5uZVR3aXN0ZXIyLnByb3RvdHlwZS5pbml0X2J5X2FycmF5ID0gZnVuY3Rpb24oaW5pdF9rZXksIGtleV9sZW5ndGgpIHsKICAgICAgICB2YXIgaSwgaiwgazsKICAgICAgICB0aGlzLmluaXRfc2VlZCgxOTY1MDIxOCk7CiAgICAgICAgaSA9IDE7CiAgICAgICAgaiA9IDA7CiAgICAgICAgayA9IHRoaXMuTiA+IGtleV9sZW5ndGggPyB0aGlzLk4gOiBrZXlfbGVuZ3RoOwogICAgICAgIGZvciAoOyBrOyBrLS0pIHsKICAgICAgICAgIHZhciBzID0gdGhpcy5tdFtpIC0gMV0gXiB0aGlzLm10W2kgLSAxXSA+Pj4gMzA7CiAgICAgICAgICB0aGlzLm10W2ldID0gKHRoaXMubXRbaV0gXiAoKChzICYgNDI5NDkwMTc2MCkgPj4+IDE2KSAqIDE2NjQ1MjUgPDwgMTYpICsgKHMgJiA2NTUzNSkgKiAxNjY0NTI1KSArIGluaXRfa2V5W2pdICsgajsKICAgICAgICAgIHRoaXMubXRbaV0gPj4+PSAwOwogICAgICAgICAgaSsrOwogICAgICAgICAgaisrOwogICAgICAgICAgaWYgKGkgPj0gdGhpcy5OKSB7CiAgICAgICAgICAgIHRoaXMubXRbMF0gPSB0aGlzLm10W3RoaXMuTiAtIDFdOwogICAgICAgICAgICBpID0gMTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChqID49IGtleV9sZW5ndGgpIGogPSAwOwogICAgICAgIH0KICAgICAgICBmb3IgKGsgPSB0aGlzLk4gLSAxOyBrOyBrLS0pIHsKICAgICAgICAgIHZhciBzID0gdGhpcy5tdFtpIC0gMV0gXiB0aGlzLm10W2kgLSAxXSA+Pj4gMzA7CiAgICAgICAgICB0aGlzLm10W2ldID0gKHRoaXMubXRbaV0gXiAoKChzICYgNDI5NDkwMTc2MCkgPj4+IDE2KSAqIDE1NjYwODM5NDEgPDwgMTYpICsgKHMgJiA2NTUzNSkgKiAxNTY2MDgzOTQxKSAtIGk7CiAgICAgICAgICB0aGlzLm10W2ldID4+Pj0gMDsKICAgICAgICAgIGkrKzsKICAgICAgICAgIGlmIChpID49IHRoaXMuTikgewogICAgICAgICAgICB0aGlzLm10WzBdID0gdGhpcy5tdFt0aGlzLk4gLSAxXTsKICAgICAgICAgICAgaSA9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMubXRbMF0gPSAyMTQ3NDgzNjQ4OwogICAgICB9OwogICAgICBNZXJzZW5uZVR3aXN0ZXIyLnByb3RvdHlwZS5yYW5kb21faW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHk7CiAgICAgICAgdmFyIG1hZzAxID0gbmV3IEFycmF5KDAsIHRoaXMuTUFUUklYX0EpOwogICAgICAgIGlmICh0aGlzLm10aSA+PSB0aGlzLk4pIHsKICAgICAgICAgIHZhciBrazsKICAgICAgICAgIGlmICh0aGlzLm10aSA9PSB0aGlzLk4gKyAxKQogICAgICAgICAgICB0aGlzLmluaXRfc2VlZCg1NDg5KTsKICAgICAgICAgIGZvciAoa2sgPSAwOyBrayA8IHRoaXMuTiAtIHRoaXMuTTsga2srKykgewogICAgICAgICAgICB5ID0gdGhpcy5tdFtra10gJiB0aGlzLlVQUEVSX01BU0sgfCB0aGlzLm10W2trICsgMV0gJiB0aGlzLkxPV0VSX01BU0s7CiAgICAgICAgICAgIHRoaXMubXRba2tdID0gdGhpcy5tdFtrayArIHRoaXMuTV0gXiB5ID4+PiAxIF4gbWFnMDFbeSAmIDFdOwogICAgICAgICAgfQogICAgICAgICAgZm9yICg7IGtrIDwgdGhpcy5OIC0gMTsga2srKykgewogICAgICAgICAgICB5ID0gdGhpcy5tdFtra10gJiB0aGlzLlVQUEVSX01BU0sgfCB0aGlzLm10W2trICsgMV0gJiB0aGlzLkxPV0VSX01BU0s7CiAgICAgICAgICAgIHRoaXMubXRba2tdID0gdGhpcy5tdFtrayArICh0aGlzLk0gLSB0aGlzLk4pXSBeIHkgPj4+IDEgXiBtYWcwMVt5ICYgMV07CiAgICAgICAgICB9CiAgICAgICAgICB5ID0gdGhpcy5tdFt0aGlzLk4gLSAxXSAmIHRoaXMuVVBQRVJfTUFTSyB8IHRoaXMubXRbMF0gJiB0aGlzLkxPV0VSX01BU0s7CiAgICAgICAgICB0aGlzLm10W3RoaXMuTiAtIDFdID0gdGhpcy5tdFt0aGlzLk0gLSAxXSBeIHkgPj4+IDEgXiBtYWcwMVt5ICYgMV07CiAgICAgICAgICB0aGlzLm10aSA9IDA7CiAgICAgICAgfQogICAgICAgIHkgPSB0aGlzLm10W3RoaXMubXRpKytdOwogICAgICAgIHkgXj0geSA+Pj4gMTE7CiAgICAgICAgeSBePSB5IDw8IDcgJiAyNjM2OTI4NjQwOwogICAgICAgIHkgXj0geSA8PCAxNSAmIDQwMjI3MzA3NTI7CiAgICAgICAgeSBePSB5ID4+PiAxODsKICAgICAgICByZXR1cm4geSA+Pj4gMDsKICAgICAgfTsKICAgICAgTWVyc2VubmVUd2lzdGVyMi5wcm90b3R5cGUucmFuZG9tX2ludDMxID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmFuZG9tX2ludCgpID4+PiAxOwogICAgICB9OwogICAgICBNZXJzZW5uZVR3aXN0ZXIyLnByb3RvdHlwZS5yYW5kb21faW5jbCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnJhbmRvbV9pbnQoKSAqICgxIC8gNDI5NDk2NzI5NSk7CiAgICAgIH07CiAgICAgIE1lcnNlbm5lVHdpc3RlcjIucHJvdG90eXBlLnJhbmRvbSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnJhbmRvbV9pbnQoKSAqICgxIC8gNDI5NDk2NzI5Nik7CiAgICAgIH07CiAgICAgIE1lcnNlbm5lVHdpc3RlcjIucHJvdG90eXBlLnJhbmRvbV9leGNsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLnJhbmRvbV9pbnQoKSArIDAuNSkgKiAoMSAvIDQyOTQ5NjcyOTYpOwogICAgICB9OwogICAgICBNZXJzZW5uZVR3aXN0ZXIyLnByb3RvdHlwZS5yYW5kb21fbG9uZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhMyA9IHRoaXMucmFuZG9tX2ludCgpID4+PiA1LCBiID0gdGhpcy5yYW5kb21faW50KCkgPj4+IDY7CiAgICAgICAgcmV0dXJuIChhMyAqIDY3MTA4ODY0ICsgYikgKiAoMSAvIDkwMDcxOTkyNTQ3NDA5OTIpOwogICAgICB9OwogICAgICBtb2R1bGUuZXhwb3J0cyA9IE1lcnNlbm5lVHdpc3RlcjI7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9NYXRoLmpzCiAgdmFyIGltcG9ydF9tZXJzZW5uZV90d2lzdGVyLCBDZXNpdW1NYXRoLCBmYWN0b3JpYWxzLCByYW5kb21OdW1iZXJHZW5lcmF0b3IsIE1hdGhfZGVmYXVsdDsKICB2YXIgaW5pdF9NYXRoID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9NYXRoLmpzIigpIHsKICAgICAgaW1wb3J0X21lcnNlbm5lX3R3aXN0ZXIgPSBfX3RvRVNNKHJlcXVpcmVfbWVyc2VubmVfdHdpc3RlcigpLCAxKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBDZXNpdW1NYXRoID0ge307CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjEgPSAwLjE7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjIgPSAwLjAxOwogICAgICBDZXNpdW1NYXRoLkVQU0lMT04zID0gMWUtMzsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9ONCA9IDFlLTQ7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjUgPSAxZS01OwogICAgICBDZXNpdW1NYXRoLkVQU0lMT042ID0gMWUtNjsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9ONyA9IDFlLTc7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjggPSAxZS04OwogICAgICBDZXNpdW1NYXRoLkVQU0lMT045ID0gMWUtOTsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTAgPSAxZS0xMDsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTEgPSAxZS0xMTsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTIgPSAxZS0xMjsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTMgPSAxZS0xMzsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTQgPSAxZS0xNDsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTUgPSAxZS0xNTsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTYgPSAxZS0xNjsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTcgPSAxZS0xNzsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTggPSAxZS0xODsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTkgPSAxZS0xOTsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMjAgPSAxZS0yMDsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMjEgPSAxZS0yMTsKICAgICAgQ2VzaXVtTWF0aC5HUkFWSVRBVElPTkFMUEFSQU1FVEVSID0gMzk4NjAwNDQxOGU1OwogICAgICBDZXNpdW1NYXRoLlNPTEFSX1JBRElVUyA9IDY5NTVlNTsKICAgICAgQ2VzaXVtTWF0aC5MVU5BUl9SQURJVVMgPSAxNzM3NDAwOwogICAgICBDZXNpdW1NYXRoLlNJWFRZX0ZPVVJfS0lMT0JZVEVTID0gNjQgKiAxMDI0OwogICAgICBDZXNpdW1NYXRoLkZPVVJfR0lHQUJZVEVTID0gNCAqIDEwMjQgKiAxMDI0ICogMTAyNDsKICAgICAgQ2VzaXVtTWF0aC5zaWduID0gTWF0aC5zaWduID8/IGZ1bmN0aW9uIHNpZ24odmFsdWUpIHsKICAgICAgICB2YWx1ZSA9ICt2YWx1ZTsKICAgICAgICBpZiAodmFsdWUgPT09IDAgfHwgdmFsdWUgIT09IHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZSA+IDAgPyAxIDogLTE7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguc2lnbk5vdFplcm8gPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZSA8IDAgPyAtMSA6IDE7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgudG9TTm9ybSA9IGZ1bmN0aW9uKHZhbHVlLCByYW5nZU1heGltdW0pIHsKICAgICAgICByYW5nZU1heGltdW0gPSByYW5nZU1heGltdW0gPz8gMjU1OwogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKAogICAgICAgICAgKENlc2l1bU1hdGguY2xhbXAodmFsdWUsIC0xLCAxKSAqIDAuNSArIDAuNSkgKiByYW5nZU1heGltdW0KICAgICAgICApOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmZyb21TTm9ybSA9IGZ1bmN0aW9uKHZhbHVlLCByYW5nZU1heGltdW0pIHsKICAgICAgICByYW5nZU1heGltdW0gPSByYW5nZU1heGltdW0gPz8gMjU1OwogICAgICAgIHJldHVybiBDZXNpdW1NYXRoLmNsYW1wKHZhbHVlLCAwLCByYW5nZU1heGltdW0pIC8gcmFuZ2VNYXhpbXVtICogMiAtIDE7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubm9ybWFsaXplID0gZnVuY3Rpb24odmFsdWUsIHJhbmdlTWluaW11bSwgcmFuZ2VNYXhpbXVtKSB7CiAgICAgICAgcmFuZ2VNYXhpbXVtID0gTWF0aC5tYXgocmFuZ2VNYXhpbXVtIC0gcmFuZ2VNaW5pbXVtLCAwKTsKICAgICAgICByZXR1cm4gcmFuZ2VNYXhpbXVtID09PSAwID8gMCA6IENlc2l1bU1hdGguY2xhbXAoKHZhbHVlIC0gcmFuZ2VNaW5pbXVtKSAvIHJhbmdlTWF4aW11bSwgMCwgMSk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguc2luaCA9IE1hdGguc2luaCA/PyBmdW5jdGlvbiBzaW5oKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIChNYXRoLmV4cCh2YWx1ZSkgLSBNYXRoLmV4cCgtdmFsdWUpKSAvIDI7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguY29zaCA9IE1hdGguY29zaCA/PyBmdW5jdGlvbiBjb3NoKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIChNYXRoLmV4cCh2YWx1ZSkgKyBNYXRoLmV4cCgtdmFsdWUpKSAvIDI7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubGVycCA9IGZ1bmN0aW9uKHAsIHEsIHRpbWUpIHsKICAgICAgICByZXR1cm4gKDEgLSB0aW1lKSAqIHAgKyB0aW1lICogcTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5QSSA9IE1hdGguUEk7CiAgICAgIENlc2l1bU1hdGguT05FX09WRVJfUEkgPSAxIC8gTWF0aC5QSTsKICAgICAgQ2VzaXVtTWF0aC5QSV9PVkVSX1RXTyA9IE1hdGguUEkgLyAyOwogICAgICBDZXNpdW1NYXRoLlBJX09WRVJfVEhSRUUgPSBNYXRoLlBJIC8gMzsKICAgICAgQ2VzaXVtTWF0aC5QSV9PVkVSX0ZPVVIgPSBNYXRoLlBJIC8gNDsKICAgICAgQ2VzaXVtTWF0aC5QSV9PVkVSX1NJWCA9IE1hdGguUEkgLyA2OwogICAgICBDZXNpdW1NYXRoLlRIUkVFX1BJX09WRVJfVFdPID0gMyAqIE1hdGguUEkgLyAyOwogICAgICBDZXNpdW1NYXRoLlRXT19QSSA9IDIgKiBNYXRoLlBJOwogICAgICBDZXNpdW1NYXRoLk9ORV9PVkVSX1RXT19QSSA9IDEgLyAoMiAqIE1hdGguUEkpOwogICAgICBDZXNpdW1NYXRoLlJBRElBTlNfUEVSX0RFR1JFRSA9IE1hdGguUEkgLyAxODA7CiAgICAgIENlc2l1bU1hdGguREVHUkVFU19QRVJfUkFESUFOID0gMTgwIC8gTWF0aC5QSTsKICAgICAgQ2VzaXVtTWF0aC5SQURJQU5TX1BFUl9BUkNTRUNPTkQgPSBDZXNpdW1NYXRoLlJBRElBTlNfUEVSX0RFR1JFRSAvIDM2MDA7CiAgICAgIENlc2l1bU1hdGgudG9SYWRpYW5zID0gZnVuY3Rpb24oZGVncmVlcykgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGRlZ3JlZXMpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZGVncmVlcyBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRlZ3JlZXMgKiBDZXNpdW1NYXRoLlJBRElBTlNfUEVSX0RFR1JFRTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC50b0RlZ3JlZXMgPSBmdW5jdGlvbihyYWRpYW5zKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmFkaWFucykpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJyYWRpYW5zIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmFkaWFucyAqIENlc2l1bU1hdGguREVHUkVFU19QRVJfUkFESUFOOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmNvbnZlcnRMb25naXR1ZGVSYW5nZSA9IGZ1bmN0aW9uKGFuZ2xlKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYW5nbGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHR3b1BpID0gQ2VzaXVtTWF0aC5UV09fUEk7CiAgICAgICAgY29uc3Qgc2ltcGxpZmllZCA9IGFuZ2xlIC0gTWF0aC5mbG9vcihhbmdsZSAvIHR3b1BpKSAqIHR3b1BpOwogICAgICAgIGlmIChzaW1wbGlmaWVkIDwgLU1hdGguUEkpIHsKICAgICAgICAgIHJldHVybiBzaW1wbGlmaWVkICsgdHdvUGk7CiAgICAgICAgfQogICAgICAgIGlmIChzaW1wbGlmaWVkID49IE1hdGguUEkpIHsKICAgICAgICAgIHJldHVybiBzaW1wbGlmaWVkIC0gdHdvUGk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzaW1wbGlmaWVkOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmNsYW1wVG9MYXRpdHVkZVJhbmdlID0gZnVuY3Rpb24oYW5nbGUpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhbmdsZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhbmdsZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIENlc2l1bU1hdGguY2xhbXAoCiAgICAgICAgICBhbmdsZSwKICAgICAgICAgIC0xICogQ2VzaXVtTWF0aC5QSV9PVkVSX1RXTywKICAgICAgICAgIENlc2l1bU1hdGguUElfT1ZFUl9UV08KICAgICAgICApOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLm5lZ2F0aXZlUGlUb1BpID0gZnVuY3Rpb24oYW5nbGUpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhbmdsZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhbmdsZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKGFuZ2xlID49IC1DZXNpdW1NYXRoLlBJICYmIGFuZ2xlIDw9IENlc2l1bU1hdGguUEkpIHsKICAgICAgICAgIHJldHVybiBhbmdsZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIENlc2l1bU1hdGguemVyb1RvVHdvUGkoYW5nbGUgKyBDZXNpdW1NYXRoLlBJKSAtIENlc2l1bU1hdGguUEk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguemVyb1RvVHdvUGkgPSBmdW5jdGlvbihhbmdsZSkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFuZ2xlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFuZ2xlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoYW5nbGUgPj0gMCAmJiBhbmdsZSA8PSBDZXNpdW1NYXRoLlRXT19QSSkgewogICAgICAgICAgcmV0dXJuIGFuZ2xlOwogICAgICAgIH0KICAgICAgICBjb25zdCBtb2QgPSBDZXNpdW1NYXRoLm1vZChhbmdsZSwgQ2VzaXVtTWF0aC5UV09fUEkpOwogICAgICAgIGlmIChNYXRoLmFicyhtb2QpIDwgQ2VzaXVtTWF0aC5FUFNJTE9OMTQgJiYgTWF0aC5hYnMoYW5nbGUpID4gQ2VzaXVtTWF0aC5FUFNJTE9OMTQpIHsKICAgICAgICAgIHJldHVybiBDZXNpdW1NYXRoLlRXT19QSTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1vZDsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5tb2QgPSBmdW5jdGlvbihtLCBuKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJtIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChuKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm4gaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmIChuID09PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZGl2aXNvciBjYW5ub3QgYmUgMC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKENlc2l1bU1hdGguc2lnbihtKSA9PT0gQ2VzaXVtTWF0aC5zaWduKG4pICYmIE1hdGguYWJzKG0pIDwgTWF0aC5hYnMobikpIHsKICAgICAgICAgIHJldHVybiBtOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKG0gJSBuICsgbikgJSBuOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmVxdWFsc0Vwc2lsb24gPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVsYXRpdmVFcHNpbG9uLCBhYnNvbHV0ZUVwc2lsb24pIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChsZWZ0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImxlZnQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJpZ2h0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInJpZ2h0IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZWxhdGl2ZUVwc2lsb24gPSByZWxhdGl2ZUVwc2lsb24gPz8gMDsKICAgICAgICBhYnNvbHV0ZUVwc2lsb24gPSBhYnNvbHV0ZUVwc2lsb24gPz8gcmVsYXRpdmVFcHNpbG9uOwogICAgICAgIGNvbnN0IGFic0RpZmYgPSBNYXRoLmFicyhsZWZ0IC0gcmlnaHQpOwogICAgICAgIHJldHVybiBhYnNEaWZmIDw9IGFic29sdXRlRXBzaWxvbiB8fCBhYnNEaWZmIDw9IHJlbGF0aXZlRXBzaWxvbiAqIE1hdGgubWF4KE1hdGguYWJzKGxlZnQpLCBNYXRoLmFicyhyaWdodCkpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmxlc3NUaGFuID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIGFic29sdXRlRXBzaWxvbikgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGxlZnQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJpZ2h0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInNlY29uZCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYWJzb2x1dGVFcHNpbG9uKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodCA8IC1hYnNvbHV0ZUVwc2lsb247CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubGVzc1RoYW5PckVxdWFscyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBhYnNvbHV0ZUVwc2lsb24pIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChsZWZ0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImZpcnN0IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyaWdodCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFic29sdXRlRXBzaWxvbikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsZWZ0IC0gcmlnaHQgPCBhYnNvbHV0ZUVwc2lsb247CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguZ3JlYXRlclRoYW4gPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgYWJzb2x1dGVFcHNpbG9uKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobGVmdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJmaXJzdCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmlnaHQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgic2Vjb25kIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhYnNvbHV0ZUVwc2lsb24pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGVmdCAtIHJpZ2h0ID4gYWJzb2x1dGVFcHNpbG9uOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmdyZWF0ZXJUaGFuT3JFcXVhbHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgYWJzb2x1dGVFcHNpbG9uKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobGVmdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJmaXJzdCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmlnaHQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgic2Vjb25kIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhYnNvbHV0ZUVwc2lsb24pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGVmdCAtIHJpZ2h0ID4gLWFic29sdXRlRXBzaWxvbjsKICAgICAgfTsKICAgICAgZmFjdG9yaWFscyA9IFsxXTsKICAgICAgQ2VzaXVtTWF0aC5mYWN0b3JpYWwgPSBmdW5jdGlvbihuKSB7CiAgICAgICAgaWYgKHR5cGVvZiBuICE9PSAibnVtYmVyIiB8fCBuIDwgMCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJBIG51bWJlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBpcyByZXF1aXJlZC4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCBsZW5ndGggPSBmYWN0b3JpYWxzLmxlbmd0aDsKICAgICAgICBpZiAobiA+PSBsZW5ndGgpIHsKICAgICAgICAgIGxldCBzdW0gPSBmYWN0b3JpYWxzW2xlbmd0aCAtIDFdOwogICAgICAgICAgZm9yIChsZXQgaSA9IGxlbmd0aDsgaSA8PSBuOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgbmV4dCA9IHN1bSAqIGk7CiAgICAgICAgICAgIGZhY3RvcmlhbHMucHVzaChuZXh0KTsKICAgICAgICAgICAgc3VtID0gbmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhY3RvcmlhbHNbbl07CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguaW5jcmVtZW50V3JhcCA9IGZ1bmN0aW9uKG4sIG1heGltdW1WYWx1ZSwgbWluaW11bVZhbHVlKSB7CiAgICAgICAgbWluaW11bVZhbHVlID0gbWluaW11bVZhbHVlID8/IDA7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJuIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAobWF4aW11bVZhbHVlIDw9IG1pbmltdW1WYWx1ZSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm1heGltdW1WYWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBtaW5pbXVtVmFsdWUuIik7CiAgICAgICAgfQogICAgICAgICsrbjsKICAgICAgICBpZiAobiA+IG1heGltdW1WYWx1ZSkgewogICAgICAgICAgbiA9IG1pbmltdW1WYWx1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG47CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguaXNQb3dlck9mVHdvID0gZnVuY3Rpb24obikgewogICAgICAgIGlmICh0eXBlb2YgbiAhPT0gIm51bWJlciIgfHwgbiA8IDAgfHwgbiA+IDQyOTQ5NjcyOTUpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kICgyXjMyKS0xIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbiAhPT0gMCAmJiAobiAmIG4gLSAxKSA9PT0gMDsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5uZXh0UG93ZXJPZlR3byA9IGZ1bmN0aW9uKG4pIHsKICAgICAgICBpZiAodHlwZW9mIG4gIT09ICJudW1iZXIiIHx8IG4gPCAwIHx8IG4gPiAyMTQ3NDgzNjQ4KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyXjMxIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICAtLW47CiAgICAgICAgbiB8PSBuID4+IDE7CiAgICAgICAgbiB8PSBuID4+IDI7CiAgICAgICAgbiB8PSBuID4+IDQ7CiAgICAgICAgbiB8PSBuID4+IDg7CiAgICAgICAgbiB8PSBuID4+IDE2OwogICAgICAgICsrbjsKICAgICAgICByZXR1cm4gbjsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5wcmV2aW91c1Bvd2VyT2ZUd28gPSBmdW5jdGlvbihuKSB7CiAgICAgICAgaWYgKHR5cGVvZiBuICE9PSAibnVtYmVyIiB8fCBuIDwgMCB8fCBuID4gNDI5NDk2NzI5NSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIG4gfD0gbiA+PiAxOwogICAgICAgIG4gfD0gbiA+PiAyOwogICAgICAgIG4gfD0gbiA+PiA0OwogICAgICAgIG4gfD0gbiA+PiA4OwogICAgICAgIG4gfD0gbiA+PiAxNjsKICAgICAgICBuIHw9IG4gPj4gMzI7CiAgICAgICAgbiA9IChuID4+PiAwKSAtIChuID4+PiAxKTsKICAgICAgICByZXR1cm4gbjsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5jbGFtcCA9IGZ1bmN0aW9uKHZhbHVlLCBtaW4zLCBtYXgzKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoIm1pbiIsIG1pbjMpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigibWF4IiwgbWF4Myk7CiAgICAgICAgcmV0dXJuIHZhbHVlIDwgbWluMyA/IG1pbjMgOiB2YWx1ZSA+IG1heDMgPyBtYXgzIDogdmFsdWU7CiAgICAgIH07CiAgICAgIHJhbmRvbU51bWJlckdlbmVyYXRvciA9IG5ldyBpbXBvcnRfbWVyc2VubmVfdHdpc3Rlci5kZWZhdWx0KCk7CiAgICAgIENlc2l1bU1hdGguc2V0UmFuZG9tTnVtYmVyU2VlZCA9IGZ1bmN0aW9uKHNlZWQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChzZWVkKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInNlZWQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJhbmRvbU51bWJlckdlbmVyYXRvciA9IG5ldyBpbXBvcnRfbWVyc2VubmVfdHdpc3Rlci5kZWZhdWx0KHNlZWQpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLm5leHRSYW5kb21OdW1iZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcmFuZG9tTnVtYmVyR2VuZXJhdG9yLnJhbmRvbSgpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLnJhbmRvbUJldHdlZW4gPSBmdW5jdGlvbihtaW4zLCBtYXgzKSB7CiAgICAgICAgcmV0dXJuIENlc2l1bU1hdGgubmV4dFJhbmRvbU51bWJlcigpICogKG1heDMgLSBtaW4zKSArIG1pbjM7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguYWNvc0NsYW1wZWQgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHZhbHVlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInZhbHVlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gTWF0aC5hY29zKENlc2l1bU1hdGguY2xhbXAodmFsdWUsIC0xLCAxKSk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguYXNpbkNsYW1wZWQgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHZhbHVlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInZhbHVlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gTWF0aC5hc2luKENlc2l1bU1hdGguY2xhbXAodmFsdWUsIC0xLCAxKSk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguY2hvcmRMZW5ndGggPSBmdW5jdGlvbihhbmdsZSwgcmFkaXVzKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYW5nbGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJhZGl1cykpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJyYWRpdXMgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiAyICogcmFkaXVzICogTWF0aC5zaW4oYW5nbGUgKiAwLjUpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmxvZ0Jhc2UgPSBmdW5jdGlvbihudW1iZXIsIGJhc2UpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChudW1iZXIpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgibnVtYmVyIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChiYXNlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImJhc2UgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBNYXRoLmxvZyhudW1iZXIpIC8gTWF0aC5sb2coYmFzZSk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguY2JydCA9IE1hdGguY2JydCA/PyBmdW5jdGlvbiBjYnJ0KG51bWJlcikgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IE1hdGgucG93KE1hdGguYWJzKG51bWJlciksIDEgLyAzKTsKICAgICAgICByZXR1cm4gbnVtYmVyIDwgMCA/IC1yZXN1bHQgOiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubG9nMiA9IE1hdGgubG9nMiA/PyBmdW5jdGlvbiBsb2cyKG51bWJlcikgewogICAgICAgIHJldHVybiBNYXRoLmxvZyhudW1iZXIpICogTWF0aC5MT0cyRTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5mb2cgPSBmdW5jdGlvbihkaXN0YW5jZVRvQ2FtZXJhLCBkZW5zaXR5KSB7CiAgICAgICAgY29uc3Qgc2NhbGFyID0gZGlzdGFuY2VUb0NhbWVyYSAqIGRlbnNpdHk7CiAgICAgICAgcmV0dXJuIDEgLSBNYXRoLmV4cCgtKHNjYWxhciAqIHNjYWxhcikpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmZhc3RBcHByb3hpbWF0ZUF0YW4gPSBmdW5jdGlvbih4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJ4IiwgeCk7CiAgICAgICAgcmV0dXJuIHggKiAoLTAuMTc4NCAqIE1hdGguYWJzKHgpIC0gMC4wNjYzICogeCAqIHggKyAxLjAzMDEpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmZhc3RBcHByb3hpbWF0ZUF0YW4yID0gZnVuY3Rpb24oeCwgeSkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigieCIsIHgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigieSIsIHkpOwogICAgICAgIGxldCBvcHBvc2l0ZTsKICAgICAgICBsZXQgdCA9IE1hdGguYWJzKHgpOwogICAgICAgIG9wcG9zaXRlID0gTWF0aC5hYnMoeSk7CiAgICAgICAgY29uc3QgYWRqYWNlbnQgPSBNYXRoLm1heCh0LCBvcHBvc2l0ZSk7CiAgICAgICAgb3Bwb3NpdGUgPSBNYXRoLm1pbih0LCBvcHBvc2l0ZSk7CiAgICAgICAgY29uc3Qgb3Bwb3NpdGVPdmVyQWRqYWNlbnQgPSBvcHBvc2l0ZSAvIGFkamFjZW50OwogICAgICAgIGlmIChpc05hTihvcHBvc2l0ZU92ZXJBZGphY2VudCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJlaXRoZXIgeCBvciB5IG11c3QgYmUgbm9uemVybyIpOwogICAgICAgIH0KICAgICAgICB0ID0gQ2VzaXVtTWF0aC5mYXN0QXBwcm94aW1hdGVBdGFuKG9wcG9zaXRlT3ZlckFkamFjZW50KTsKICAgICAgICB0ID0gTWF0aC5hYnMoeSkgPiBNYXRoLmFicyh4KSA/IENlc2l1bU1hdGguUElfT1ZFUl9UV08gLSB0IDogdDsKICAgICAgICB0ID0geCA8IDAgPyBDZXNpdW1NYXRoLlBJIC0gdCA6IHQ7CiAgICAgICAgdCA9IHkgPCAwID8gLXQgOiB0OwogICAgICAgIHJldHVybiB0OwogICAgICB9OwogICAgICBNYXRoX2RlZmF1bHQgPSBDZXNpdW1NYXRoOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ2FydGVzaWFuMy5qcwogIGZ1bmN0aW9uIENhcnRlc2lhbjMoeCwgeSwgeikgewogICAgdGhpcy54ID0geCA/PyAwOwogICAgdGhpcy55ID0geSA/PyAwOwogICAgdGhpcy56ID0geiA/PyAwOwogIH0KICB2YXIgZGlzdGFuY2VTY3JhdGNoLCBsZXJwU2NyYXRjaCwgYW5nbGVCZXR3ZWVuU2NyYXRjaCwgYW5nbGVCZXR3ZWVuU2NyYXRjaDIsIG1vc3RPcnRob2dvbmFsQXhpc1NjcmF0Y2gsIHNjcmF0Y2hOLCBzY3JhdGNoSywgQ2FydGVzaWFuM19kZWZhdWx0OwogIHZhciBpbml0X0NhcnRlc2lhbjMgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NhcnRlc2lhbjMuanMiKCkgewogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBDYXJ0ZXNpYW4zLmZyb21TcGhlcmljYWwgPSBmdW5jdGlvbihzcGhlcmljYWwsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic3BoZXJpY2FsIiwgc3BoZXJpY2FsKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQ2FydGVzaWFuMygpOwogICAgICAgIH0KICAgICAgICBjb25zdCBjbG9jayA9IHNwaGVyaWNhbC5jbG9jazsKICAgICAgICBjb25zdCBjb25lID0gc3BoZXJpY2FsLmNvbmU7CiAgICAgICAgY29uc3QgbWFnbml0dWRlID0gc3BoZXJpY2FsLm1hZ25pdHVkZSA/PyAxOwogICAgICAgIGNvbnN0IHJhZGlhbCA9IG1hZ25pdHVkZSAqIE1hdGguc2luKGNvbmUpOwogICAgICAgIHJlc3VsdC54ID0gcmFkaWFsICogTWF0aC5jb3MoY2xvY2spOwogICAgICAgIHJlc3VsdC55ID0gcmFkaWFsICogTWF0aC5zaW4oY2xvY2spOwogICAgICAgIHJlc3VsdC56ID0gbWFnbml0dWRlICogTWF0aC5jb3MoY29uZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5mcm9tRWxlbWVudHMgPSBmdW5jdGlvbih4LCB5LCB6LCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENhcnRlc2lhbjMoeCwgeSwgeik7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC54ID0geDsKICAgICAgICByZXN1bHQueSA9IHk7CiAgICAgICAgcmVzdWx0LnogPSB6OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMuY2xvbmUgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoY2FydGVzaWFuMTEpKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENhcnRlc2lhbjMoY2FydGVzaWFuMTEueCwgY2FydGVzaWFuMTEueSwgY2FydGVzaWFuMTEueik7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC54ID0gY2FydGVzaWFuMTEueDsKICAgICAgICByZXN1bHQueSA9IGNhcnRlc2lhbjExLnk7CiAgICAgICAgcmVzdWx0LnogPSBjYXJ0ZXNpYW4xMS56OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMuZnJvbUNhcnRlc2lhbjQgPSBDYXJ0ZXNpYW4zLmNsb25lOwogICAgICBDYXJ0ZXNpYW4zLnBhY2tlZExlbmd0aCA9IDM7CiAgICAgIENhcnRlc2lhbjMucGFjayA9IGZ1bmN0aW9uKHZhbHVlLCBhcnJheSwgc3RhcnRpbmdJbmRleCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS54OwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS55OwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXhdID0gdmFsdWUuejsKICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQ2FydGVzaWFuMygpOwogICAgICAgIH0KICAgICAgICByZXN1bHQueCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0LnkgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdC56ID0gYXJyYXlbc3RhcnRpbmdJbmRleF07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5wYWNrQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CiAgICAgICAgY29uc3QgcmVzdWx0TGVuZ3RoID0gbGVuZ3RoICogMzsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXkocmVzdWx0TGVuZ3RoKTsKICAgICAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0Lmxlbmd0aCAhPT0gcmVzdWx0TGVuZ3RoKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgIklmIHJlc3VsdCBpcyBhIHR5cGVkIGFycmF5LCBpdCBtdXN0IGhhdmUgZXhhY3RseSBhcnJheS5sZW5ndGggKiAzIGVsZW1lbnRzIgogICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5sZW5ndGggIT09IHJlc3VsdExlbmd0aCkgewogICAgICAgICAgcmVzdWx0Lmxlbmd0aCA9IHJlc3VsdExlbmd0aDsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgQ2FydGVzaWFuMy5wYWNrKGFycmF5W2ldLCByZXN1bHQsIGkgKiAzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy51bnBhY2tBcnJheSA9IGZ1bmN0aW9uKGFycmF5LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJhcnJheS5sZW5ndGgiLCBhcnJheS5sZW5ndGgsIDMpOwogICAgICAgIGlmIChhcnJheS5sZW5ndGggJSAzICE9PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXJyYXkgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzLiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KGxlbmd0aCAvIDMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQubGVuZ3RoID0gbGVuZ3RoIC8gMzsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMykgewogICAgICAgICAgY29uc3QgaW5kZXggPSBpIC8gMzsKICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBDYXJ0ZXNpYW4zLnVucGFjayhhcnJheSwgaSwgcmVzdWx0W2luZGV4XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMuZnJvbUFycmF5ID0gQ2FydGVzaWFuMy51bnBhY2s7CiAgICAgIENhcnRlc2lhbjMubWF4aW11bUNvbXBvbmVudCA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGNhcnRlc2lhbjExLngsIGNhcnRlc2lhbjExLnksIGNhcnRlc2lhbjExLnopOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLm1pbmltdW1Db21wb25lbnQgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIHJldHVybiBNYXRoLm1pbihjYXJ0ZXNpYW4xMS54LCBjYXJ0ZXNpYW4xMS55LCBjYXJ0ZXNpYW4xMS56KTsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5taW5pbXVtQnlDb21wb25lbnQgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImZpcnN0IiwgZmlyc3QpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic2Vjb25kIiwgc2Vjb25kKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBNYXRoLm1pbihmaXJzdC54LCBzZWNvbmQueCk7CiAgICAgICAgcmVzdWx0LnkgPSBNYXRoLm1pbihmaXJzdC55LCBzZWNvbmQueSk7CiAgICAgICAgcmVzdWx0LnogPSBNYXRoLm1pbihmaXJzdC56LCBzZWNvbmQueik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5tYXhpbXVtQnlDb21wb25lbnQgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImZpcnN0IiwgZmlyc3QpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic2Vjb25kIiwgc2Vjb25kKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBNYXRoLm1heChmaXJzdC54LCBzZWNvbmQueCk7CiAgICAgICAgcmVzdWx0LnkgPSBNYXRoLm1heChmaXJzdC55LCBzZWNvbmQueSk7CiAgICAgICAgcmVzdWx0LnogPSBNYXRoLm1heChmaXJzdC56LCBzZWNvbmQueik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5jbGFtcCA9IGZ1bmN0aW9uKHZhbHVlLCBtaW4zLCBtYXgzLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWluIiwgbWluMyk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXgiLCBtYXgzKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3QgeCA9IE1hdGhfZGVmYXVsdC5jbGFtcCh2YWx1ZS54LCBtaW4zLngsIG1heDMueCk7CiAgICAgICAgY29uc3QgeSA9IE1hdGhfZGVmYXVsdC5jbGFtcCh2YWx1ZS55LCBtaW4zLnksIG1heDMueSk7CiAgICAgICAgY29uc3QgeiA9IE1hdGhfZGVmYXVsdC5jbGFtcCh2YWx1ZS56LCBtaW4zLnosIG1heDMueik7CiAgICAgICAgcmVzdWx0LnggPSB4OwogICAgICAgIHJlc3VsdC55ID0geTsKICAgICAgICByZXN1bHQueiA9IHo7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5tYWduaXR1ZGVTcXVhcmVkID0gZnVuY3Rpb24oY2FydGVzaWFuMTEpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsIGNhcnRlc2lhbjExKTsKICAgICAgICByZXR1cm4gY2FydGVzaWFuMTEueCAqIGNhcnRlc2lhbjExLnggKyBjYXJ0ZXNpYW4xMS55ICogY2FydGVzaWFuMTEueSArIGNhcnRlc2lhbjExLnogKiBjYXJ0ZXNpYW4xMS56OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLm1hZ25pdHVkZSA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExKSB7CiAgICAgICAgcmV0dXJuIE1hdGguc3FydChDYXJ0ZXNpYW4zLm1hZ25pdHVkZVNxdWFyZWQoY2FydGVzaWFuMTEpKTsKICAgICAgfTsKICAgICAgZGlzdGFuY2VTY3JhdGNoID0gbmV3IENhcnRlc2lhbjMoKTsKICAgICAgQ2FydGVzaWFuMy5kaXN0YW5jZSA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDYXJ0ZXNpYW4zLnN1YnRyYWN0KGxlZnQsIHJpZ2h0LCBkaXN0YW5jZVNjcmF0Y2gpOwogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4zLm1hZ25pdHVkZShkaXN0YW5jZVNjcmF0Y2gpOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLmRpc3RhbmNlU3F1YXJlZCA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDYXJ0ZXNpYW4zLnN1YnRyYWN0KGxlZnQsIHJpZ2h0LCBkaXN0YW5jZVNjcmF0Y2gpOwogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4zLm1hZ25pdHVkZVNxdWFyZWQoZGlzdGFuY2VTY3JhdGNoKTsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5ub3JtYWxpemUgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IG1hZ25pdHVkZSA9IENhcnRlc2lhbjMubWFnbml0dWRlKGNhcnRlc2lhbjExKTsKICAgICAgICByZXN1bHQueCA9IGNhcnRlc2lhbjExLnggLyBtYWduaXR1ZGU7CiAgICAgICAgcmVzdWx0LnkgPSBjYXJ0ZXNpYW4xMS55IC8gbWFnbml0dWRlOwogICAgICAgIHJlc3VsdC56ID0gY2FydGVzaWFuMTEueiAvIG1hZ25pdHVkZTsKICAgICAgICBpZiAoaXNOYU4ocmVzdWx0LngpIHx8IGlzTmFOKHJlc3VsdC55KSB8fCBpc05hTihyZXN1bHQueikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJub3JtYWxpemVkIHJlc3VsdCBpcyBub3QgYSBudW1iZXIiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5kb3QgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgcmV0dXJuIGxlZnQueCAqIHJpZ2h0LnggKyBsZWZ0LnkgKiByaWdodC55ICsgbGVmdC56ICogcmlnaHQuejsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5tdWx0aXBseUNvbXBvbmVudHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBsZWZ0LnggKiByaWdodC54OwogICAgICAgIHJlc3VsdC55ID0gbGVmdC55ICogcmlnaHQueTsKICAgICAgICByZXN1bHQueiA9IGxlZnQueiAqIHJpZ2h0Lno7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5kaXZpZGVDb21wb25lbnRzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC54ID0gbGVmdC54IC8gcmlnaHQueDsKICAgICAgICByZXN1bHQueSA9IGxlZnQueSAvIHJpZ2h0Lnk7CiAgICAgICAgcmVzdWx0LnogPSBsZWZ0LnogLyByaWdodC56OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMuYWRkID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC54ID0gbGVmdC54ICsgcmlnaHQueDsKICAgICAgICByZXN1bHQueSA9IGxlZnQueSArIHJpZ2h0Lnk7CiAgICAgICAgcmVzdWx0LnogPSBsZWZ0LnogKyByaWdodC56OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMuc3VidHJhY3QgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBsZWZ0LnggLSByaWdodC54OwogICAgICAgIHJlc3VsdC55ID0gbGVmdC55IC0gcmlnaHQueTsKICAgICAgICByZXN1bHQueiA9IGxlZnQueiAtIHJpZ2h0Lno7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5tdWx0aXBseUJ5U2NhbGFyID0gZnVuY3Rpb24oY2FydGVzaWFuMTEsIHNjYWxhciwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJzY2FsYXIiLCBzY2FsYXIpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IGNhcnRlc2lhbjExLnggKiBzY2FsYXI7CiAgICAgICAgcmVzdWx0LnkgPSBjYXJ0ZXNpYW4xMS55ICogc2NhbGFyOwogICAgICAgIHJlc3VsdC56ID0gY2FydGVzaWFuMTEueiAqIHNjYWxhcjsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLmRpdmlkZUJ5U2NhbGFyID0gZnVuY3Rpb24oY2FydGVzaWFuMTEsIHNjYWxhciwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJzY2FsYXIiLCBzY2FsYXIpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IGNhcnRlc2lhbjExLnggLyBzY2FsYXI7CiAgICAgICAgcmVzdWx0LnkgPSBjYXJ0ZXNpYW4xMS55IC8gc2NhbGFyOwogICAgICAgIHJlc3VsdC56ID0gY2FydGVzaWFuMTEueiAvIHNjYWxhcjsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLm5lZ2F0ZSA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsIGNhcnRlc2lhbjExKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSAtY2FydGVzaWFuMTEueDsKICAgICAgICByZXN1bHQueSA9IC1jYXJ0ZXNpYW4xMS55OwogICAgICAgIHJlc3VsdC56ID0gLWNhcnRlc2lhbjExLno7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5hYnMgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC54ID0gTWF0aC5hYnMoY2FydGVzaWFuMTEueCk7CiAgICAgICAgcmVzdWx0LnkgPSBNYXRoLmFicyhjYXJ0ZXNpYW4xMS55KTsKICAgICAgICByZXN1bHQueiA9IE1hdGguYWJzKGNhcnRlc2lhbjExLnopOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIGxlcnBTY3JhdGNoID0gbmV3IENhcnRlc2lhbjMoKTsKICAgICAgQ2FydGVzaWFuMy5sZXJwID0gZnVuY3Rpb24oc3RhcnQsIGVuZCwgdCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJzdGFydCIsIHN0YXJ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImVuZCIsIGVuZCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJ0IiwgdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIENhcnRlc2lhbjMubXVsdGlwbHlCeVNjYWxhcihlbmQsIHQsIGxlcnBTY3JhdGNoKTsKICAgICAgICByZXN1bHQgPSBDYXJ0ZXNpYW4zLm11bHRpcGx5QnlTY2FsYXIoc3RhcnQsIDEgLSB0LCByZXN1bHQpOwogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4zLmFkZChsZXJwU2NyYXRjaCwgcmVzdWx0LCByZXN1bHQpOwogICAgICB9OwogICAgICBhbmdsZUJldHdlZW5TY3JhdGNoID0gbmV3IENhcnRlc2lhbjMoKTsKICAgICAgYW5nbGVCZXR3ZWVuU2NyYXRjaDIgPSBuZXcgQ2FydGVzaWFuMygpOwogICAgICBDYXJ0ZXNpYW4zLmFuZ2xlQmV0d2VlbiA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDYXJ0ZXNpYW4zLm5vcm1hbGl6ZShsZWZ0LCBhbmdsZUJldHdlZW5TY3JhdGNoKTsKICAgICAgICBDYXJ0ZXNpYW4zLm5vcm1hbGl6ZShyaWdodCwgYW5nbGVCZXR3ZWVuU2NyYXRjaDIpOwogICAgICAgIGNvbnN0IGNvc2luZSA9IENhcnRlc2lhbjMuZG90KGFuZ2xlQmV0d2VlblNjcmF0Y2gsIGFuZ2xlQmV0d2VlblNjcmF0Y2gyKTsKICAgICAgICBjb25zdCBzaW5lID0gQ2FydGVzaWFuMy5tYWduaXR1ZGUoCiAgICAgICAgICBDYXJ0ZXNpYW4zLmNyb3NzKAogICAgICAgICAgICBhbmdsZUJldHdlZW5TY3JhdGNoLAogICAgICAgICAgICBhbmdsZUJldHdlZW5TY3JhdGNoMiwKICAgICAgICAgICAgYW5nbGVCZXR3ZWVuU2NyYXRjaAogICAgICAgICAgKQogICAgICAgICk7CiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIoc2luZSwgY29zaW5lKTsKICAgICAgfTsKICAgICAgbW9zdE9ydGhvZ29uYWxBeGlzU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zKCk7CiAgICAgIENhcnRlc2lhbjMubW9zdE9ydGhvZ29uYWxBeGlzID0gZnVuY3Rpb24oY2FydGVzaWFuMTEsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBjb25zdCBmID0gQ2FydGVzaWFuMy5ub3JtYWxpemUoY2FydGVzaWFuMTEsIG1vc3RPcnRob2dvbmFsQXhpc1NjcmF0Y2gpOwogICAgICAgIENhcnRlc2lhbjMuYWJzKGYsIGYpOwogICAgICAgIGlmIChmLnggPD0gZi55KSB7CiAgICAgICAgICBpZiAoZi54IDw9IGYueikgewogICAgICAgICAgICByZXN1bHQgPSBDYXJ0ZXNpYW4zLmNsb25lKENhcnRlc2lhbjMuVU5JVF9YLCByZXN1bHQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0ID0gQ2FydGVzaWFuMy5jbG9uZShDYXJ0ZXNpYW4zLlVOSVRfWiwgcmVzdWx0KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGYueSA8PSBmLnopIHsKICAgICAgICAgIHJlc3VsdCA9IENhcnRlc2lhbjMuY2xvbmUoQ2FydGVzaWFuMy5VTklUX1ksIHJlc3VsdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdCA9IENhcnRlc2lhbjMuY2xvbmUoQ2FydGVzaWFuMy5VTklUX1osIHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMucHJvamVjdFZlY3RvciA9IGZ1bmN0aW9uKGEzLCBiLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImEiLCBhMyk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJiIiwgYik7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IHNjYWxhciA9IENhcnRlc2lhbjMuZG90KGEzLCBiKSAvIENhcnRlc2lhbjMuZG90KGIsIGIpOwogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4zLm11bHRpcGx5QnlTY2FsYXIoYiwgc2NhbGFyLCByZXN1bHQpOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLmVxdWFscyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8IGRlZmluZWRfZGVmYXVsdChsZWZ0KSAmJiBkZWZpbmVkX2RlZmF1bHQocmlnaHQpICYmIGxlZnQueCA9PT0gcmlnaHQueCAmJiBsZWZ0LnkgPT09IHJpZ2h0LnkgJiYgbGVmdC56ID09PSByaWdodC56OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLmVxdWFsc0FycmF5ID0gZnVuY3Rpb24oY2FydGVzaWFuMTEsIGFycmF5LCBvZmZzZXQpIHsKICAgICAgICByZXR1cm4gY2FydGVzaWFuMTEueCA9PT0gYXJyYXlbb2Zmc2V0XSAmJiBjYXJ0ZXNpYW4xMS55ID09PSBhcnJheVtvZmZzZXQgKyAxXSAmJiBjYXJ0ZXNpYW4xMS56ID09PSBhcnJheVtvZmZzZXQgKyAyXTsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5lcXVhbHNFcHNpbG9uID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlbGF0aXZlRXBzaWxvbiwgYWJzb2x1dGVFcHNpbG9uKSB7CiAgICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8IGRlZmluZWRfZGVmYXVsdChsZWZ0KSAmJiBkZWZpbmVkX2RlZmF1bHQocmlnaHQpICYmIE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgbGVmdC54LAogICAgICAgICAgcmlnaHQueCwKICAgICAgICAgIHJlbGF0aXZlRXBzaWxvbiwKICAgICAgICAgIGFic29sdXRlRXBzaWxvbgogICAgICAgICkgJiYgTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oCiAgICAgICAgICBsZWZ0LnksCiAgICAgICAgICByaWdodC55LAogICAgICAgICAgcmVsYXRpdmVFcHNpbG9uLAogICAgICAgICAgYWJzb2x1dGVFcHNpbG9uCiAgICAgICAgKSAmJiBNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgIGxlZnQueiwKICAgICAgICAgIHJpZ2h0LnosCiAgICAgICAgICByZWxhdGl2ZUVwc2lsb24sCiAgICAgICAgICBhYnNvbHV0ZUVwc2lsb24KICAgICAgICApOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLmNyb3NzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IGxlZnRYID0gbGVmdC54OwogICAgICAgIGNvbnN0IGxlZnRZID0gbGVmdC55OwogICAgICAgIGNvbnN0IGxlZnRaID0gbGVmdC56OwogICAgICAgIGNvbnN0IHJpZ2h0WCA9IHJpZ2h0Lng7CiAgICAgICAgY29uc3QgcmlnaHRZID0gcmlnaHQueTsKICAgICAgICBjb25zdCByaWdodFogPSByaWdodC56OwogICAgICAgIGNvbnN0IHggPSBsZWZ0WSAqIHJpZ2h0WiAtIGxlZnRaICogcmlnaHRZOwogICAgICAgIGNvbnN0IHkgPSBsZWZ0WiAqIHJpZ2h0WCAtIGxlZnRYICogcmlnaHRaOwogICAgICAgIGNvbnN0IHogPSBsZWZ0WCAqIHJpZ2h0WSAtIGxlZnRZICogcmlnaHRYOwogICAgICAgIHJlc3VsdC54ID0geDsKICAgICAgICByZXN1bHQueSA9IHk7CiAgICAgICAgcmVzdWx0LnogPSB6OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMubWlkcG9pbnQgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSAobGVmdC54ICsgcmlnaHQueCkgKiAwLjU7CiAgICAgICAgcmVzdWx0LnkgPSAobGVmdC55ICsgcmlnaHQueSkgKiAwLjU7CiAgICAgICAgcmVzdWx0LnogPSAobGVmdC56ICsgcmlnaHQueikgKiAwLjU7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5mcm9tRGVncmVlcyA9IGZ1bmN0aW9uKGxvbmdpdHVkZSwgbGF0aXR1ZGUsIGhlaWdodCwgZWxsaXBzb2lkLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsIGxvbmdpdHVkZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsIGxhdGl0dWRlKTsKICAgICAgICBsb25naXR1ZGUgPSBNYXRoX2RlZmF1bHQudG9SYWRpYW5zKGxvbmdpdHVkZSk7CiAgICAgICAgbGF0aXR1ZGUgPSBNYXRoX2RlZmF1bHQudG9SYWRpYW5zKGxhdGl0dWRlKTsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuMy5mcm9tUmFkaWFucyhsb25naXR1ZGUsIGxhdGl0dWRlLCBoZWlnaHQsIGVsbGlwc29pZCwgcmVzdWx0KTsKICAgICAgfTsKICAgICAgc2NyYXRjaE4gPSBuZXcgQ2FydGVzaWFuMygpOwogICAgICBzY3JhdGNoSyA9IG5ldyBDYXJ0ZXNpYW4zKCk7CiAgICAgIENhcnRlc2lhbjMuX2VsbGlwc29pZFJhZGlpU3F1YXJlZCA9IG5ldyBDYXJ0ZXNpYW4zKAogICAgICAgIDYzNzgxMzcgKiA2Mzc4MTM3LAogICAgICAgIDYzNzgxMzcgKiA2Mzc4MTM3LAogICAgICAgIDYzNTY3NTIzMTQyNDUxNzllLTkgKiA2MzU2NzUyMzE0MjQ1MTc5ZS05CiAgICAgICk7CiAgICAgIENhcnRlc2lhbjMuZnJvbVJhZGlhbnMgPSBmdW5jdGlvbihsb25naXR1ZGUsIGxhdGl0dWRlLCBoZWlnaHQsIGVsbGlwc29pZCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJsb25naXR1ZGUiLCBsb25naXR1ZGUpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigibGF0aXR1ZGUiLCBsYXRpdHVkZSk7CiAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0ID8/IDA7CiAgICAgICAgY29uc3QgcmFkaWlTcXVhcmVkID0gIWRlZmluZWRfZGVmYXVsdChlbGxpcHNvaWQpID8gQ2FydGVzaWFuMy5fZWxsaXBzb2lkUmFkaWlTcXVhcmVkIDogZWxsaXBzb2lkLnJhZGlpU3F1YXJlZDsKICAgICAgICBjb25zdCBjb3NMYXRpdHVkZSA9IE1hdGguY29zKGxhdGl0dWRlKTsKICAgICAgICBzY3JhdGNoTi54ID0gY29zTGF0aXR1ZGUgKiBNYXRoLmNvcyhsb25naXR1ZGUpOwogICAgICAgIHNjcmF0Y2hOLnkgPSBjb3NMYXRpdHVkZSAqIE1hdGguc2luKGxvbmdpdHVkZSk7CiAgICAgICAgc2NyYXRjaE4ueiA9IE1hdGguc2luKGxhdGl0dWRlKTsKICAgICAgICBzY3JhdGNoTiA9IENhcnRlc2lhbjMubm9ybWFsaXplKHNjcmF0Y2hOLCBzY3JhdGNoTik7CiAgICAgICAgQ2FydGVzaWFuMy5tdWx0aXBseUNvbXBvbmVudHMocmFkaWlTcXVhcmVkLCBzY3JhdGNoTiwgc2NyYXRjaEspOwogICAgICAgIGNvbnN0IGdhbW1hID0gTWF0aC5zcXJ0KENhcnRlc2lhbjMuZG90KHNjcmF0Y2hOLCBzY3JhdGNoSykpOwogICAgICAgIHNjcmF0Y2hLID0gQ2FydGVzaWFuMy5kaXZpZGVCeVNjYWxhcihzY3JhdGNoSywgZ2FtbWEsIHNjcmF0Y2hLKTsKICAgICAgICBzY3JhdGNoTiA9IENhcnRlc2lhbjMubXVsdGlwbHlCeVNjYWxhcihzY3JhdGNoTiwgaGVpZ2h0LCBzY3JhdGNoTik7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IENhcnRlc2lhbjMoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIENhcnRlc2lhbjMuYWRkKHNjcmF0Y2hLLCBzY3JhdGNoTiwgcmVzdWx0KTsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5ID0gZnVuY3Rpb24oY29vcmRpbmF0ZXMsIGVsbGlwc29pZCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJjb29yZGluYXRlcyIsIGNvb3JkaW5hdGVzKTsKICAgICAgICBpZiAoY29vcmRpbmF0ZXMubGVuZ3RoIDwgMiB8fCBjb29yZGluYXRlcy5sZW5ndGggJSAyICE9PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgInRoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIGF0IGxlYXN0IDIiCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCBsZW5ndGggPSBjb29yZGluYXRlcy5sZW5ndGg7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KGxlbmd0aCAvIDIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQubGVuZ3RoID0gbGVuZ3RoIC8gMjsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgY29uc3QgbG9uZ2l0dWRlID0gY29vcmRpbmF0ZXNbaV07CiAgICAgICAgICBjb25zdCBsYXRpdHVkZSA9IGNvb3JkaW5hdGVzW2kgKyAxXTsKICAgICAgICAgIGNvbnN0IGluZGV4ID0gaSAvIDI7CiAgICAgICAgICByZXN1bHRbaW5kZXhdID0gQ2FydGVzaWFuMy5mcm9tRGVncmVlcygKICAgICAgICAgICAgbG9uZ2l0dWRlLAogICAgICAgICAgICBsYXRpdHVkZSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICByZXN1bHRbaW5kZXhdCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLmZyb21SYWRpYW5zQXJyYXkgPSBmdW5jdGlvbihjb29yZGluYXRlcywgZWxsaXBzb2lkLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImNvb3JkaW5hdGVzIiwgY29vcmRpbmF0ZXMpOwogICAgICAgIGlmIChjb29yZGluYXRlcy5sZW5ndGggPCAyIHx8IGNvb3JkaW5hdGVzLmxlbmd0aCAlIDIgIT09IDApIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiBhbmQgYXQgbGVhc3QgMiIKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxlbmd0aCA9IGNvb3JkaW5hdGVzLmxlbmd0aDsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXkobGVuZ3RoIC8gMik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdC5sZW5ndGggPSBsZW5ndGggLyAyOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgICBjb25zdCBsb25naXR1ZGUgPSBjb29yZGluYXRlc1tpXTsKICAgICAgICAgIGNvbnN0IGxhdGl0dWRlID0gY29vcmRpbmF0ZXNbaSArIDFdOwogICAgICAgICAgY29uc3QgaW5kZXggPSBpIC8gMjsKICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBDYXJ0ZXNpYW4zLmZyb21SYWRpYW5zKAogICAgICAgICAgICBsb25naXR1ZGUsCiAgICAgICAgICAgIGxhdGl0dWRlLAogICAgICAgICAgICAwLAogICAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICAgIHJlc3VsdFtpbmRleF0KICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMgPSBmdW5jdGlvbihjb29yZGluYXRlcywgZWxsaXBzb2lkLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImNvb3JkaW5hdGVzIiwgY29vcmRpbmF0ZXMpOwogICAgICAgIGlmIChjb29yZGluYXRlcy5sZW5ndGggPCAzIHx8IGNvb3JkaW5hdGVzLmxlbmd0aCAlIDMgIT09IDApIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxlbmd0aCA9IGNvb3JkaW5hdGVzLmxlbmd0aDsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXkobGVuZ3RoIC8gMyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdC5sZW5ndGggPSBsZW5ndGggLyAzOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAzKSB7CiAgICAgICAgICBjb25zdCBsb25naXR1ZGUgPSBjb29yZGluYXRlc1tpXTsKICAgICAgICAgIGNvbnN0IGxhdGl0dWRlID0gY29vcmRpbmF0ZXNbaSArIDFdOwogICAgICAgICAgY29uc3QgaGVpZ2h0ID0gY29vcmRpbmF0ZXNbaSArIDJdOwogICAgICAgICAgY29uc3QgaW5kZXggPSBpIC8gMzsKICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBDYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKAogICAgICAgICAgICBsb25naXR1ZGUsCiAgICAgICAgICAgIGxhdGl0dWRlLAogICAgICAgICAgICBoZWlnaHQsCiAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgcmVzdWx0W2luZGV4XQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5mcm9tUmFkaWFuc0FycmF5SGVpZ2h0cyA9IGZ1bmN0aW9uKGNvb3JkaW5hdGVzLCBlbGxpcHNvaWQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiY29vcmRpbmF0ZXMiLCBjb29yZGluYXRlcyk7CiAgICAgICAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA8IDMgfHwgY29vcmRpbmF0ZXMubGVuZ3RoICUgMyAhPT0gMCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJ0aGUgbnVtYmVyIG9mIGNvb3JkaW5hdGVzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzIGFuZCBhdCBsZWFzdCAzIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGVuZ3RoID0gY29vcmRpbmF0ZXMubGVuZ3RoOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShsZW5ndGggLyAzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0Lmxlbmd0aCA9IGxlbmd0aCAvIDM7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDMpIHsKICAgICAgICAgIGNvbnN0IGxvbmdpdHVkZSA9IGNvb3JkaW5hdGVzW2ldOwogICAgICAgICAgY29uc3QgbGF0aXR1ZGUgPSBjb29yZGluYXRlc1tpICsgMV07CiAgICAgICAgICBjb25zdCBoZWlnaHQgPSBjb29yZGluYXRlc1tpICsgMl07CiAgICAgICAgICBjb25zdCBpbmRleCA9IGkgLyAzOwogICAgICAgICAgcmVzdWx0W2luZGV4XSA9IENhcnRlc2lhbjMuZnJvbVJhZGlhbnMoCiAgICAgICAgICAgIGxvbmdpdHVkZSwKICAgICAgICAgICAgbGF0aXR1ZGUsCiAgICAgICAgICAgIGhlaWdodCwKICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICByZXN1bHRbaW5kZXhdCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLlpFUk8gPSBPYmplY3QuZnJlZXplKG5ldyBDYXJ0ZXNpYW4zKDAsIDAsIDApKTsKICAgICAgQ2FydGVzaWFuMy5PTkUgPSBPYmplY3QuZnJlZXplKG5ldyBDYXJ0ZXNpYW4zKDEsIDEsIDEpKTsKICAgICAgQ2FydGVzaWFuMy5VTklUX1ggPSBPYmplY3QuZnJlZXplKG5ldyBDYXJ0ZXNpYW4zKDEsIDAsIDApKTsKICAgICAgQ2FydGVzaWFuMy5VTklUX1kgPSBPYmplY3QuZnJlZXplKG5ldyBDYXJ0ZXNpYW4zKDAsIDEsIDApKTsKICAgICAgQ2FydGVzaWFuMy5VTklUX1ogPSBPYmplY3QuZnJlZXplKG5ldyBDYXJ0ZXNpYW4zKDAsIDAsIDEpKTsKICAgICAgQ2FydGVzaWFuMy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuMy5jbG9uZSh0aGlzLCByZXN1bHQpOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbihyaWdodCkgewogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4zLmVxdWFscyh0aGlzLCByaWdodCk7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMucHJvdG90eXBlLmVxdWFsc0Vwc2lsb24gPSBmdW5jdGlvbihyaWdodCwgcmVsYXRpdmVFcHNpbG9uLCBhYnNvbHV0ZUVwc2lsb24pIHsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuMy5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgdGhpcywKICAgICAgICAgIHJpZ2h0LAogICAgICAgICAgcmVsYXRpdmVFcHNpbG9uLAogICAgICAgICAgYWJzb2x1dGVFcHNpbG9uCiAgICAgICAgKTsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYCgke3RoaXMueH0sICR7dGhpcy55fSwgJHt0aGlzLnp9KWA7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdCA9IENhcnRlc2lhbjM7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9zY2FsZVRvR2VvZGV0aWNTdXJmYWNlLmpzCiAgZnVuY3Rpb24gc2NhbGVUb0dlb2RldGljU3VyZmFjZShjYXJ0ZXNpYW4xMSwgb25lT3ZlclJhZGlpLCBvbmVPdmVyUmFkaWlTcXVhcmVkLCBjZW50ZXJUb2xlcmFuY2VTcXVhcmVkLCByZXN1bHQpIHsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGNhcnRlc2lhbjExKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiY2FydGVzaWFuIGlzIHJlcXVpcmVkLiIpOwogICAgfQogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQob25lT3ZlclJhZGlpKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgib25lT3ZlclJhZGlpIGlzIHJlcXVpcmVkLiIpOwogICAgfQogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQob25lT3ZlclJhZGlpU3F1YXJlZCkpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm9uZU92ZXJSYWRpaVNxdWFyZWQgaXMgcmVxdWlyZWQuIik7CiAgICB9CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChjZW50ZXJUb2xlcmFuY2VTcXVhcmVkKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiY2VudGVyVG9sZXJhbmNlU3F1YXJlZCBpcyByZXF1aXJlZC4iKTsKICAgIH0KICAgIGNvbnN0IHBvc2l0aW9uWCA9IGNhcnRlc2lhbjExLng7CiAgICBjb25zdCBwb3NpdGlvblkgPSBjYXJ0ZXNpYW4xMS55OwogICAgY29uc3QgcG9zaXRpb25aID0gY2FydGVzaWFuMTEuejsKICAgIGNvbnN0IG9uZU92ZXJSYWRpaVggPSBvbmVPdmVyUmFkaWkueDsKICAgIGNvbnN0IG9uZU92ZXJSYWRpaVkgPSBvbmVPdmVyUmFkaWkueTsKICAgIGNvbnN0IG9uZU92ZXJSYWRpaVogPSBvbmVPdmVyUmFkaWkuejsKICAgIGNvbnN0IHgyID0gcG9zaXRpb25YICogcG9zaXRpb25YICogb25lT3ZlclJhZGlpWCAqIG9uZU92ZXJSYWRpaVg7CiAgICBjb25zdCB5MiA9IHBvc2l0aW9uWSAqIHBvc2l0aW9uWSAqIG9uZU92ZXJSYWRpaVkgKiBvbmVPdmVyUmFkaWlZOwogICAgY29uc3QgejIgPSBwb3NpdGlvblogKiBwb3NpdGlvblogKiBvbmVPdmVyUmFkaWlaICogb25lT3ZlclJhZGlpWjsKICAgIGNvbnN0IHNxdWFyZWROb3JtID0geDIgKyB5MiArIHoyOwogICAgY29uc3QgcmF0aW8gPSBNYXRoLnNxcnQoMSAvIHNxdWFyZWROb3JtKTsKICAgIGNvbnN0IGludGVyc2VjdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKAogICAgICBjYXJ0ZXNpYW4xMSwKICAgICAgcmF0aW8sCiAgICAgIHNjYWxlVG9HZW9kZXRpY1N1cmZhY2VJbnRlcnNlY3Rpb24KICAgICk7CiAgICBpZiAoc3F1YXJlZE5vcm0gPCBjZW50ZXJUb2xlcmFuY2VTcXVhcmVkKSB7CiAgICAgIHJldHVybiAhaXNGaW5pdGUocmF0aW8pID8gdm9pZCAwIDogQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGludGVyc2VjdGlvbiwgcmVzdWx0KTsKICAgIH0KICAgIGNvbnN0IG9uZU92ZXJSYWRpaVNxdWFyZWRYID0gb25lT3ZlclJhZGlpU3F1YXJlZC54OwogICAgY29uc3Qgb25lT3ZlclJhZGlpU3F1YXJlZFkgPSBvbmVPdmVyUmFkaWlTcXVhcmVkLnk7CiAgICBjb25zdCBvbmVPdmVyUmFkaWlTcXVhcmVkWiA9IG9uZU92ZXJSYWRpaVNxdWFyZWQuejsKICAgIGNvbnN0IGdyYWRpZW50ID0gc2NhbGVUb0dlb2RldGljU3VyZmFjZUdyYWRpZW50OwogICAgZ3JhZGllbnQueCA9IGludGVyc2VjdGlvbi54ICogb25lT3ZlclJhZGlpU3F1YXJlZFggKiAyOwogICAgZ3JhZGllbnQueSA9IGludGVyc2VjdGlvbi55ICogb25lT3ZlclJhZGlpU3F1YXJlZFkgKiAyOwogICAgZ3JhZGllbnQueiA9IGludGVyc2VjdGlvbi56ICogb25lT3ZlclJhZGlpU3F1YXJlZFogKiAyOwogICAgbGV0IGxhbWJkYSA9ICgxIC0gcmF0aW8pICogQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZShjYXJ0ZXNpYW4xMSkgLyAoMC41ICogQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZShncmFkaWVudCkpOwogICAgbGV0IGNvcnJlY3Rpb24gPSAwOwogICAgbGV0IGZ1bmM7CiAgICBsZXQgZGVub21pbmF0b3I7CiAgICBsZXQgeE11bHRpcGxpZXI7CiAgICBsZXQgeU11bHRpcGxpZXI7CiAgICBsZXQgek11bHRpcGxpZXI7CiAgICBsZXQgeE11bHRpcGxpZXIyOwogICAgbGV0IHlNdWx0aXBsaWVyMjsKICAgIGxldCB6TXVsdGlwbGllcjI7CiAgICBsZXQgeE11bHRpcGxpZXIzOwogICAgbGV0IHlNdWx0aXBsaWVyMzsKICAgIGxldCB6TXVsdGlwbGllcjM7CiAgICBkbyB7CiAgICAgIGxhbWJkYSAtPSBjb3JyZWN0aW9uOwogICAgICB4TXVsdGlwbGllciA9IDEgLyAoMSArIGxhbWJkYSAqIG9uZU92ZXJSYWRpaVNxdWFyZWRYKTsKICAgICAgeU11bHRpcGxpZXIgPSAxIC8gKDEgKyBsYW1iZGEgKiBvbmVPdmVyUmFkaWlTcXVhcmVkWSk7CiAgICAgIHpNdWx0aXBsaWVyID0gMSAvICgxICsgbGFtYmRhICogb25lT3ZlclJhZGlpU3F1YXJlZFopOwogICAgICB4TXVsdGlwbGllcjIgPSB4TXVsdGlwbGllciAqIHhNdWx0aXBsaWVyOwogICAgICB5TXVsdGlwbGllcjIgPSB5TXVsdGlwbGllciAqIHlNdWx0aXBsaWVyOwogICAgICB6TXVsdGlwbGllcjIgPSB6TXVsdGlwbGllciAqIHpNdWx0aXBsaWVyOwogICAgICB4TXVsdGlwbGllcjMgPSB4TXVsdGlwbGllcjIgKiB4TXVsdGlwbGllcjsKICAgICAgeU11bHRpcGxpZXIzID0geU11bHRpcGxpZXIyICogeU11bHRpcGxpZXI7CiAgICAgIHpNdWx0aXBsaWVyMyA9IHpNdWx0aXBsaWVyMiAqIHpNdWx0aXBsaWVyOwogICAgICBmdW5jID0geDIgKiB4TXVsdGlwbGllcjIgKyB5MiAqIHlNdWx0aXBsaWVyMiArIHoyICogek11bHRpcGxpZXIyIC0gMTsKICAgICAgZGVub21pbmF0b3IgPSB4MiAqIHhNdWx0aXBsaWVyMyAqIG9uZU92ZXJSYWRpaVNxdWFyZWRYICsgeTIgKiB5TXVsdGlwbGllcjMgKiBvbmVPdmVyUmFkaWlTcXVhcmVkWSArIHoyICogek11bHRpcGxpZXIzICogb25lT3ZlclJhZGlpU3F1YXJlZFo7CiAgICAgIGNvbnN0IGRlcml2YXRpdmUgPSAtMiAqIGRlbm9taW5hdG9yOwogICAgICBjb3JyZWN0aW9uID0gZnVuYyAvIGRlcml2YXRpdmU7CiAgICB9IHdoaWxlIChNYXRoLmFicyhmdW5jKSA+IE1hdGhfZGVmYXVsdC5FUFNJTE9OMTIpOwogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICByZXR1cm4gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgKICAgICAgICBwb3NpdGlvblggKiB4TXVsdGlwbGllciwKICAgICAgICBwb3NpdGlvblkgKiB5TXVsdGlwbGllciwKICAgICAgICBwb3NpdGlvblogKiB6TXVsdGlwbGllcgogICAgICApOwogICAgfQogICAgcmVzdWx0LnggPSBwb3NpdGlvblggKiB4TXVsdGlwbGllcjsKICAgIHJlc3VsdC55ID0gcG9zaXRpb25ZICogeU11bHRpcGxpZXI7CiAgICByZXN1bHQueiA9IHBvc2l0aW9uWiAqIHpNdWx0aXBsaWVyOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgdmFyIHNjYWxlVG9HZW9kZXRpY1N1cmZhY2VJbnRlcnNlY3Rpb24sIHNjYWxlVG9HZW9kZXRpY1N1cmZhY2VHcmFkaWVudCwgc2NhbGVUb0dlb2RldGljU3VyZmFjZV9kZWZhdWx0OwogIHZhciBpbml0X3NjYWxlVG9HZW9kZXRpY1N1cmZhY2UgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL3NjYWxlVG9HZW9kZXRpY1N1cmZhY2UuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIHNjYWxlVG9HZW9kZXRpY1N1cmZhY2VJbnRlcnNlY3Rpb24gPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjYWxlVG9HZW9kZXRpY1N1cmZhY2VHcmFkaWVudCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NhbGVUb0dlb2RldGljU3VyZmFjZV9kZWZhdWx0ID0gc2NhbGVUb0dlb2RldGljU3VyZmFjZTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NhcnRvZ3JhcGhpYy5qcwogIGZ1bmN0aW9uIENhcnRvZ3JhcGhpYyhsb25naXR1ZGUsIGxhdGl0dWRlLCBoZWlnaHQpIHsKICAgIHRoaXMubG9uZ2l0dWRlID0gbG9uZ2l0dWRlID8/IDA7CiAgICB0aGlzLmxhdGl0dWRlID0gbGF0aXR1ZGUgPz8gMDsKICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0ID8/IDA7CiAgfQogIHZhciBjYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpY04sIGNhcnRlc2lhblRvQ2FydG9ncmFwaGljUCwgY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWNILCBDYXJ0b2dyYXBoaWNfZGVmYXVsdDsKICB2YXIgaW5pdF9DYXJ0b2dyYXBoaWMgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NhcnRvZ3JhcGhpYy5qcyIoKSB7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKCk7CiAgICAgIENhcnRvZ3JhcGhpYy5mcm9tUmFkaWFucyA9IGZ1bmN0aW9uKGxvbmdpdHVkZSwgbGF0aXR1ZGUsIGhlaWdodCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJsb25naXR1ZGUiLCBsb25naXR1ZGUpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigibGF0aXR1ZGUiLCBsYXRpdHVkZSk7CiAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0ID8/IDA7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBDYXJ0b2dyYXBoaWMobG9uZ2l0dWRlLCBsYXRpdHVkZSwgaGVpZ2h0KTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LmxvbmdpdHVkZSA9IGxvbmdpdHVkZTsKICAgICAgICByZXN1bHQubGF0aXR1ZGUgPSBsYXRpdHVkZTsKICAgICAgICByZXN1bHQuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyA9IGZ1bmN0aW9uKGxvbmdpdHVkZSwgbGF0aXR1ZGUsIGhlaWdodCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJsb25naXR1ZGUiLCBsb25naXR1ZGUpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigibGF0aXR1ZGUiLCBsYXRpdHVkZSk7CiAgICAgICAgbG9uZ2l0dWRlID0gTWF0aF9kZWZhdWx0LnRvUmFkaWFucyhsb25naXR1ZGUpOwogICAgICAgIGxhdGl0dWRlID0gTWF0aF9kZWZhdWx0LnRvUmFkaWFucyhsYXRpdHVkZSk7CiAgICAgICAgcmV0dXJuIENhcnRvZ3JhcGhpYy5mcm9tUmFkaWFucyhsb25naXR1ZGUsIGxhdGl0dWRlLCBoZWlnaHQsIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIGNhcnRlc2lhblRvQ2FydG9ncmFwaGljTiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWNQID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpY0ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIENhcnRvZ3JhcGhpYy5fZWxsaXBzb2lkT25lT3ZlclJhZGlpID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgKICAgICAgICAxIC8gNjM3ODEzNywKICAgICAgICAxIC8gNjM3ODEzNywKICAgICAgICAxIC8gNjM1Njc1MjMxNDI0NTE3OWUtOQogICAgICApOwogICAgICBDYXJ0b2dyYXBoaWMuX2VsbGlwc29pZE9uZU92ZXJSYWRpaVNxdWFyZWQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KAogICAgICAgIDEgLyAoNjM3ODEzNyAqIDYzNzgxMzcpLAogICAgICAgIDEgLyAoNjM3ODEzNyAqIDYzNzgxMzcpLAogICAgICAgIDEgLyAoNjM1Njc1MjMxNDI0NTE3OWUtOSAqIDYzNTY3NTIzMTQyNDUxNzllLTkpCiAgICAgICk7CiAgICAgIENhcnRvZ3JhcGhpYy5fZWxsaXBzb2lkQ2VudGVyVG9sZXJhbmNlU3F1YXJlZCA9IE1hdGhfZGVmYXVsdC5FUFNJTE9OMTsKICAgICAgQ2FydG9ncmFwaGljLmZyb21DYXJ0ZXNpYW4gPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgZWxsaXBzb2lkLCByZXN1bHQpIHsKICAgICAgICBjb25zdCBvbmVPdmVyUmFkaWkgPSBkZWZpbmVkX2RlZmF1bHQoZWxsaXBzb2lkKSA/IGVsbGlwc29pZC5vbmVPdmVyUmFkaWkgOiBDYXJ0b2dyYXBoaWMuX2VsbGlwc29pZE9uZU92ZXJSYWRpaTsKICAgICAgICBjb25zdCBvbmVPdmVyUmFkaWlTcXVhcmVkID0gZGVmaW5lZF9kZWZhdWx0KGVsbGlwc29pZCkgPyBlbGxpcHNvaWQub25lT3ZlclJhZGlpU3F1YXJlZCA6IENhcnRvZ3JhcGhpYy5fZWxsaXBzb2lkT25lT3ZlclJhZGlpU3F1YXJlZDsKICAgICAgICBjb25zdCBjZW50ZXJUb2xlcmFuY2VTcXVhcmVkID0gZGVmaW5lZF9kZWZhdWx0KGVsbGlwc29pZCkgPyBlbGxpcHNvaWQuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQgOiBDYXJ0b2dyYXBoaWMuX2VsbGlwc29pZENlbnRlclRvbGVyYW5jZVNxdWFyZWQ7CiAgICAgICAgY29uc3QgcCA9IHNjYWxlVG9HZW9kZXRpY1N1cmZhY2VfZGVmYXVsdCgKICAgICAgICAgIGNhcnRlc2lhbjExLAogICAgICAgICAgb25lT3ZlclJhZGlpLAogICAgICAgICAgb25lT3ZlclJhZGlpU3F1YXJlZCwKICAgICAgICAgIGNlbnRlclRvbGVyYW5jZVNxdWFyZWQsCiAgICAgICAgICBjYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpY1AKICAgICAgICApOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHApKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBsZXQgbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUNvbXBvbmVudHMoCiAgICAgICAgICBwLAogICAgICAgICAgb25lT3ZlclJhZGlpU3F1YXJlZCwKICAgICAgICAgIGNhcnRlc2lhblRvQ2FydG9ncmFwaGljTgogICAgICAgICk7CiAgICAgICAgbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUobiwgbik7CiAgICAgICAgY29uc3QgaCA9IENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChjYXJ0ZXNpYW4xMSwgcCwgY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWNIKTsKICAgICAgICBjb25zdCBsb25naXR1ZGUgPSBNYXRoLmF0YW4yKG4ueSwgbi54KTsKICAgICAgICBjb25zdCBsYXRpdHVkZSA9IE1hdGguYXNpbihuLnopOwogICAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGhfZGVmYXVsdC5zaWduKENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoaCwgY2FydGVzaWFuMTEpKSAqIENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUoaCk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBDYXJ0b2dyYXBoaWMobG9uZ2l0dWRlLCBsYXRpdHVkZSwgaGVpZ2h0KTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LmxvbmdpdHVkZSA9IGxvbmdpdHVkZTsKICAgICAgICByZXN1bHQubGF0aXR1ZGUgPSBsYXRpdHVkZTsKICAgICAgICByZXN1bHQuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRvZ3JhcGhpYy50b0NhcnRlc2lhbiA9IGZ1bmN0aW9uKGNhcnRvZ3JhcGhpYzIsIGVsbGlwc29pZCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWMiLCBjYXJ0b2dyYXBoaWMyKTsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21SYWRpYW5zKAogICAgICAgICAgY2FydG9ncmFwaGljMi5sb25naXR1ZGUsCiAgICAgICAgICBjYXJ0b2dyYXBoaWMyLmxhdGl0dWRlLAogICAgICAgICAgY2FydG9ncmFwaGljMi5oZWlnaHQsCiAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICByZXN1bHQKICAgICAgICApOwogICAgICB9OwogICAgICBDYXJ0b2dyYXBoaWMuY2xvbmUgPSBmdW5jdGlvbihjYXJ0b2dyYXBoaWMyLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChjYXJ0b2dyYXBoaWMyKSkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBDYXJ0b2dyYXBoaWMoCiAgICAgICAgICAgIGNhcnRvZ3JhcGhpYzIubG9uZ2l0dWRlLAogICAgICAgICAgICBjYXJ0b2dyYXBoaWMyLmxhdGl0dWRlLAogICAgICAgICAgICBjYXJ0b2dyYXBoaWMyLmhlaWdodAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LmxvbmdpdHVkZSA9IGNhcnRvZ3JhcGhpYzIubG9uZ2l0dWRlOwogICAgICAgIHJlc3VsdC5sYXRpdHVkZSA9IGNhcnRvZ3JhcGhpYzIubGF0aXR1ZGU7CiAgICAgICAgcmVzdWx0LmhlaWdodCA9IGNhcnRvZ3JhcGhpYzIuaGVpZ2h0OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRvZ3JhcGhpYy5lcXVhbHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkgewogICAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodCB8fCBkZWZpbmVkX2RlZmF1bHQobGVmdCkgJiYgZGVmaW5lZF9kZWZhdWx0KHJpZ2h0KSAmJiBsZWZ0LmxvbmdpdHVkZSA9PT0gcmlnaHQubG9uZ2l0dWRlICYmIGxlZnQubGF0aXR1ZGUgPT09IHJpZ2h0LmxhdGl0dWRlICYmIGxlZnQuaGVpZ2h0ID09PSByaWdodC5oZWlnaHQ7CiAgICAgIH07CiAgICAgIENhcnRvZ3JhcGhpYy5lcXVhbHNFcHNpbG9uID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIGVwc2lsb24pIHsKICAgICAgICBlcHNpbG9uID0gZXBzaWxvbiA/PyAwOwogICAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodCB8fCBkZWZpbmVkX2RlZmF1bHQobGVmdCkgJiYgZGVmaW5lZF9kZWZhdWx0KHJpZ2h0KSAmJiBNYXRoLmFicyhsZWZ0LmxvbmdpdHVkZSAtIHJpZ2h0LmxvbmdpdHVkZSkgPD0gZXBzaWxvbiAmJiBNYXRoLmFicyhsZWZ0LmxhdGl0dWRlIC0gcmlnaHQubGF0aXR1ZGUpIDw9IGVwc2lsb24gJiYgTWF0aC5hYnMobGVmdC5oZWlnaHQgLSByaWdodC5oZWlnaHQpIDw9IGVwc2lsb247CiAgICAgIH07CiAgICAgIENhcnRvZ3JhcGhpYy5aRVJPID0gT2JqZWN0LmZyZWV6ZShuZXcgQ2FydG9ncmFwaGljKDAsIDAsIDApKTsKICAgICAgQ2FydG9ncmFwaGljLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJldHVybiBDYXJ0b2dyYXBoaWMuY2xvbmUodGhpcywgcmVzdWx0KTsKICAgICAgfTsKICAgICAgQ2FydG9ncmFwaGljLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbihyaWdodCkgewogICAgICAgIHJldHVybiBDYXJ0b2dyYXBoaWMuZXF1YWxzKHRoaXMsIHJpZ2h0KTsKICAgICAgfTsKICAgICAgQ2FydG9ncmFwaGljLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uID0gZnVuY3Rpb24ocmlnaHQsIGVwc2lsb24pIHsKICAgICAgICByZXR1cm4gQ2FydG9ncmFwaGljLmVxdWFsc0Vwc2lsb24odGhpcywgcmlnaHQsIGVwc2lsb24pOwogICAgICB9OwogICAgICBDYXJ0b2dyYXBoaWMucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGAoJHt0aGlzLmxvbmdpdHVkZX0sICR7dGhpcy5sYXRpdHVkZX0sICR7dGhpcy5oZWlnaHR9KWA7CiAgICAgIH07CiAgICAgIENhcnRvZ3JhcGhpY19kZWZhdWx0ID0gQ2FydG9ncmFwaGljOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ2FydGVzaWFuMi5qcwogIGZ1bmN0aW9uIENhcnRlc2lhbjIoeCwgeSkgewogICAgdGhpcy54ID0geCA/PyAwOwogICAgdGhpcy55ID0geSA/PyAwOwogIH0KICB2YXIgZGlzdGFuY2VTY3JhdGNoMiwgbGVycFNjcmF0Y2gyLCBhbmdsZUJldHdlZW5TY3JhdGNoMywgYW5nbGVCZXR3ZWVuU2NyYXRjaDIyLCBtb3N0T3J0aG9nb25hbEF4aXNTY3JhdGNoMiwgQ2FydGVzaWFuMl9kZWZhdWx0OwogIHZhciBpbml0X0NhcnRlc2lhbjIgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NhcnRlc2lhbjIuanMiKCkgewogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBDYXJ0ZXNpYW4yLmZyb21FbGVtZW50cyA9IGZ1bmN0aW9uKHgsIHksIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgQ2FydGVzaWFuMih4LCB5KTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnggPSB4OwogICAgICAgIHJlc3VsdC55ID0geTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4yLmNsb25lID0gZnVuY3Rpb24oY2FydGVzaWFuMTEsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGNhcnRlc2lhbjExKSkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBDYXJ0ZXNpYW4yKGNhcnRlc2lhbjExLngsIGNhcnRlc2lhbjExLnkpOwogICAgICAgIH0KICAgICAgICByZXN1bHQueCA9IGNhcnRlc2lhbjExLng7CiAgICAgICAgcmVzdWx0LnkgPSBjYXJ0ZXNpYW4xMS55OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjIuZnJvbUNhcnRlc2lhbjMgPSBDYXJ0ZXNpYW4yLmNsb25lOwogICAgICBDYXJ0ZXNpYW4yLmZyb21DYXJ0ZXNpYW40ID0gQ2FydGVzaWFuMi5jbG9uZTsKICAgICAgQ2FydGVzaWFuMi5wYWNrZWRMZW5ndGggPSAyOwogICAgICBDYXJ0ZXNpYW4yLnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUueDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4XSA9IHZhbHVlLnk7CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4yLnVucGFjayA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydGluZ0luZGV4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IENhcnRlc2lhbjIoKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnggPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdC55ID0gYXJyYXlbc3RhcnRpbmdJbmRleF07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMi5wYWNrQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CiAgICAgICAgY29uc3QgcmVzdWx0TGVuZ3RoID0gbGVuZ3RoICogMjsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXkocmVzdWx0TGVuZ3RoKTsKICAgICAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0Lmxlbmd0aCAhPT0gcmVzdWx0TGVuZ3RoKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgIklmIHJlc3VsdCBpcyBhIHR5cGVkIGFycmF5LCBpdCBtdXN0IGhhdmUgZXhhY3RseSBhcnJheS5sZW5ndGggKiAyIGVsZW1lbnRzIgogICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5sZW5ndGggIT09IHJlc3VsdExlbmd0aCkgewogICAgICAgICAgcmVzdWx0Lmxlbmd0aCA9IHJlc3VsdExlbmd0aDsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgQ2FydGVzaWFuMi5wYWNrKGFycmF5W2ldLCByZXN1bHQsIGkgKiAyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMi51bnBhY2tBcnJheSA9IGZ1bmN0aW9uKGFycmF5LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJhcnJheS5sZW5ndGgiLCBhcnJheS5sZW5ndGgsIDIpOwogICAgICAgIGlmIChhcnJheS5sZW5ndGggJSAyICE9PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXJyYXkgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyLiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KGxlbmd0aCAvIDIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQubGVuZ3RoID0gbGVuZ3RoIC8gMjsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgY29uc3QgaW5kZXggPSBpIC8gMjsKICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBDYXJ0ZXNpYW4yLnVucGFjayhhcnJheSwgaSwgcmVzdWx0W2luZGV4XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjIuZnJvbUFycmF5ID0gQ2FydGVzaWFuMi51bnBhY2s7CiAgICAgIENhcnRlc2lhbjIubWF4aW11bUNvbXBvbmVudCA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGNhcnRlc2lhbjExLngsIGNhcnRlc2lhbjExLnkpOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4yLm1pbmltdW1Db21wb25lbnQgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIHJldHVybiBNYXRoLm1pbihjYXJ0ZXNpYW4xMS54LCBjYXJ0ZXNpYW4xMS55KTsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMi5taW5pbXVtQnlDb21wb25lbnQgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImZpcnN0IiwgZmlyc3QpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic2Vjb25kIiwgc2Vjb25kKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBNYXRoLm1pbihmaXJzdC54LCBzZWNvbmQueCk7CiAgICAgICAgcmVzdWx0LnkgPSBNYXRoLm1pbihmaXJzdC55LCBzZWNvbmQueSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMi5tYXhpbXVtQnlDb21wb25lbnQgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImZpcnN0IiwgZmlyc3QpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic2Vjb25kIiwgc2Vjb25kKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBNYXRoLm1heChmaXJzdC54LCBzZWNvbmQueCk7CiAgICAgICAgcmVzdWx0LnkgPSBNYXRoLm1heChmaXJzdC55LCBzZWNvbmQueSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMi5jbGFtcCA9IGZ1bmN0aW9uKHZhbHVlLCBtaW4zLCBtYXgzLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWluIiwgbWluMyk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXgiLCBtYXgzKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3QgeCA9IE1hdGhfZGVmYXVsdC5jbGFtcCh2YWx1ZS54LCBtaW4zLngsIG1heDMueCk7CiAgICAgICAgY29uc3QgeSA9IE1hdGhfZGVmYXVsdC5jbGFtcCh2YWx1ZS55LCBtaW4zLnksIG1heDMueSk7CiAgICAgICAgcmVzdWx0LnggPSB4OwogICAgICAgIHJlc3VsdC55ID0geTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4yLm1hZ25pdHVkZVNxdWFyZWQgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIHJldHVybiBjYXJ0ZXNpYW4xMS54ICogY2FydGVzaWFuMTEueCArIGNhcnRlc2lhbjExLnkgKiBjYXJ0ZXNpYW4xMS55OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4yLm1hZ25pdHVkZSA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExKSB7CiAgICAgICAgcmV0dXJuIE1hdGguc3FydChDYXJ0ZXNpYW4yLm1hZ25pdHVkZVNxdWFyZWQoY2FydGVzaWFuMTEpKTsKICAgICAgfTsKICAgICAgZGlzdGFuY2VTY3JhdGNoMiA9IG5ldyBDYXJ0ZXNpYW4yKCk7CiAgICAgIENhcnRlc2lhbjIuZGlzdGFuY2UgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2FydGVzaWFuMi5zdWJ0cmFjdChsZWZ0LCByaWdodCwgZGlzdGFuY2VTY3JhdGNoMik7CiAgICAgICAgcmV0dXJuIENhcnRlc2lhbjIubWFnbml0dWRlKGRpc3RhbmNlU2NyYXRjaDIpOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4yLmRpc3RhbmNlU3F1YXJlZCA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDYXJ0ZXNpYW4yLnN1YnRyYWN0KGxlZnQsIHJpZ2h0LCBkaXN0YW5jZVNjcmF0Y2gyKTsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuMi5tYWduaXR1ZGVTcXVhcmVkKGRpc3RhbmNlU2NyYXRjaDIpOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4yLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsIGNhcnRlc2lhbjExKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3QgbWFnbml0dWRlID0gQ2FydGVzaWFuMi5tYWduaXR1ZGUoY2FydGVzaWFuMTEpOwogICAgICAgIHJlc3VsdC54ID0gY2FydGVzaWFuMTEueCAvIG1hZ25pdHVkZTsKICAgICAgICByZXN1bHQueSA9IGNhcnRlc2lhbjExLnkgLyBtYWduaXR1ZGU7CiAgICAgICAgaWYgKGlzTmFOKHJlc3VsdC54KSB8fCBpc05hTihyZXN1bHQueSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJub3JtYWxpemVkIHJlc3VsdCBpcyBub3QgYSBudW1iZXIiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMi5kb3QgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgcmV0dXJuIGxlZnQueCAqIHJpZ2h0LnggKyBsZWZ0LnkgKiByaWdodC55OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4yLmNyb3NzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImxlZnQiLCBsZWZ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJpZ2h0IiwgcmlnaHQpOwogICAgICAgIHJldHVybiBsZWZ0LnggKiByaWdodC55IC0gbGVmdC55ICogcmlnaHQueDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMi5tdWx0aXBseUNvbXBvbmVudHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBsZWZ0LnggKiByaWdodC54OwogICAgICAgIHJlc3VsdC55ID0gbGVmdC55ICogcmlnaHQueTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4yLmRpdmlkZUNvbXBvbmVudHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBsZWZ0LnggLyByaWdodC54OwogICAgICAgIHJlc3VsdC55ID0gbGVmdC55IC8gcmlnaHQueTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4yLmFkZCA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImxlZnQiLCBsZWZ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJpZ2h0IiwgcmlnaHQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IGxlZnQueCArIHJpZ2h0Lng7CiAgICAgICAgcmVzdWx0LnkgPSBsZWZ0LnkgKyByaWdodC55OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjIuc3VidHJhY3QgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBsZWZ0LnggLSByaWdodC54OwogICAgICAgIHJlc3VsdC55ID0gbGVmdC55IC0gcmlnaHQueTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4yLm11bHRpcGx5QnlTY2FsYXIgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgc2NhbGFyLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsIGNhcnRlc2lhbjExKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoInNjYWxhciIsIHNjYWxhcik7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC54ID0gY2FydGVzaWFuMTEueCAqIHNjYWxhcjsKICAgICAgICByZXN1bHQueSA9IGNhcnRlc2lhbjExLnkgKiBzY2FsYXI7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMi5kaXZpZGVCeVNjYWxhciA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExLCBzY2FsYXIsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigic2NhbGFyIiwgc2NhbGFyKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBjYXJ0ZXNpYW4xMS54IC8gc2NhbGFyOwogICAgICAgIHJlc3VsdC55ID0gY2FydGVzaWFuMTEueSAvIHNjYWxhcjsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4yLm5lZ2F0ZSA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsIGNhcnRlc2lhbjExKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSAtY2FydGVzaWFuMTEueDsKICAgICAgICByZXN1bHQueSA9IC1jYXJ0ZXNpYW4xMS55OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjIuYWJzID0gZnVuY3Rpb24oY2FydGVzaWFuMTEsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IE1hdGguYWJzKGNhcnRlc2lhbjExLngpOwogICAgICAgIHJlc3VsdC55ID0gTWF0aC5hYnMoY2FydGVzaWFuMTEueSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgbGVycFNjcmF0Y2gyID0gbmV3IENhcnRlc2lhbjIoKTsKICAgICAgQ2FydGVzaWFuMi5sZXJwID0gZnVuY3Rpb24oc3RhcnQsIGVuZCwgdCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJzdGFydCIsIHN0YXJ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImVuZCIsIGVuZCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJ0IiwgdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIENhcnRlc2lhbjIubXVsdGlwbHlCeVNjYWxhcihlbmQsIHQsIGxlcnBTY3JhdGNoMik7CiAgICAgICAgcmVzdWx0ID0gQ2FydGVzaWFuMi5tdWx0aXBseUJ5U2NhbGFyKHN0YXJ0LCAxIC0gdCwgcmVzdWx0KTsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuMi5hZGQobGVycFNjcmF0Y2gyLCByZXN1bHQsIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIGFuZ2xlQmV0d2VlblNjcmF0Y2gzID0gbmV3IENhcnRlc2lhbjIoKTsKICAgICAgYW5nbGVCZXR3ZWVuU2NyYXRjaDIyID0gbmV3IENhcnRlc2lhbjIoKTsKICAgICAgQ2FydGVzaWFuMi5hbmdsZUJldHdlZW4gPSBmdW5jdGlvbihsZWZ0LCByaWdodCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2FydGVzaWFuMi5ub3JtYWxpemUobGVmdCwgYW5nbGVCZXR3ZWVuU2NyYXRjaDMpOwogICAgICAgIENhcnRlc2lhbjIubm9ybWFsaXplKHJpZ2h0LCBhbmdsZUJldHdlZW5TY3JhdGNoMjIpOwogICAgICAgIHJldHVybiBNYXRoX2RlZmF1bHQuYWNvc0NsYW1wZWQoCiAgICAgICAgICBDYXJ0ZXNpYW4yLmRvdChhbmdsZUJldHdlZW5TY3JhdGNoMywgYW5nbGVCZXR3ZWVuU2NyYXRjaDIyKQogICAgICAgICk7CiAgICAgIH07CiAgICAgIG1vc3RPcnRob2dvbmFsQXhpc1NjcmF0Y2gyID0gbmV3IENhcnRlc2lhbjIoKTsKICAgICAgQ2FydGVzaWFuMi5tb3N0T3J0aG9nb25hbEF4aXMgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IGYgPSBDYXJ0ZXNpYW4yLm5vcm1hbGl6ZShjYXJ0ZXNpYW4xMSwgbW9zdE9ydGhvZ29uYWxBeGlzU2NyYXRjaDIpOwogICAgICAgIENhcnRlc2lhbjIuYWJzKGYsIGYpOwogICAgICAgIGlmIChmLnggPD0gZi55KSB7CiAgICAgICAgICByZXN1bHQgPSBDYXJ0ZXNpYW4yLmNsb25lKENhcnRlc2lhbjIuVU5JVF9YLCByZXN1bHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQgPSBDYXJ0ZXNpYW4yLmNsb25lKENhcnRlc2lhbjIuVU5JVF9ZLCByZXN1bHQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4yLmVxdWFscyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8IGRlZmluZWRfZGVmYXVsdChsZWZ0KSAmJiBkZWZpbmVkX2RlZmF1bHQocmlnaHQpICYmIGxlZnQueCA9PT0gcmlnaHQueCAmJiBsZWZ0LnkgPT09IHJpZ2h0Lnk7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjIuZXF1YWxzQXJyYXkgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgYXJyYXksIG9mZnNldCkgewogICAgICAgIHJldHVybiBjYXJ0ZXNpYW4xMS54ID09PSBhcnJheVtvZmZzZXRdICYmIGNhcnRlc2lhbjExLnkgPT09IGFycmF5W29mZnNldCArIDFdOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4yLmVxdWFsc0Vwc2lsb24gPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVsYXRpdmVFcHNpbG9uLCBhYnNvbHV0ZUVwc2lsb24pIHsKICAgICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgZGVmaW5lZF9kZWZhdWx0KGxlZnQpICYmIGRlZmluZWRfZGVmYXVsdChyaWdodCkgJiYgTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oCiAgICAgICAgICBsZWZ0LngsCiAgICAgICAgICByaWdodC54LAogICAgICAgICAgcmVsYXRpdmVFcHNpbG9uLAogICAgICAgICAgYWJzb2x1dGVFcHNpbG9uCiAgICAgICAgKSAmJiBNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgIGxlZnQueSwKICAgICAgICAgIHJpZ2h0LnksCiAgICAgICAgICByZWxhdGl2ZUVwc2lsb24sCiAgICAgICAgICBhYnNvbHV0ZUVwc2lsb24KICAgICAgICApOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4yLlpFUk8gPSBPYmplY3QuZnJlZXplKG5ldyBDYXJ0ZXNpYW4yKDAsIDApKTsKICAgICAgQ2FydGVzaWFuMi5PTkUgPSBPYmplY3QuZnJlZXplKG5ldyBDYXJ0ZXNpYW4yKDEsIDEpKTsKICAgICAgQ2FydGVzaWFuMi5VTklUX1ggPSBPYmplY3QuZnJlZXplKG5ldyBDYXJ0ZXNpYW4yKDEsIDApKTsKICAgICAgQ2FydGVzaWFuMi5VTklUX1kgPSBPYmplY3QuZnJlZXplKG5ldyBDYXJ0ZXNpYW4yKDAsIDEpKTsKICAgICAgQ2FydGVzaWFuMi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuMi5jbG9uZSh0aGlzLCByZXN1bHQpOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4yLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbihyaWdodCkgewogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4yLmVxdWFscyh0aGlzLCByaWdodCk7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjIucHJvdG90eXBlLmVxdWFsc0Vwc2lsb24gPSBmdW5jdGlvbihyaWdodCwgcmVsYXRpdmVFcHNpbG9uLCBhYnNvbHV0ZUVwc2lsb24pIHsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuMi5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgdGhpcywKICAgICAgICAgIHJpZ2h0LAogICAgICAgICAgcmVsYXRpdmVFcHNpbG9uLAogICAgICAgICAgYWJzb2x1dGVFcHNpbG9uCiAgICAgICAgKTsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYCgke3RoaXMueH0sICR7dGhpcy55fSlgOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4yX2RlZmF1bHQgPSBDYXJ0ZXNpYW4yOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvRWxsaXBzb2lkLmpzCiAgZnVuY3Rpb24gaW5pdGlhbGl6ZShlbGxpcHNvaWQsIHgsIHksIHopIHsKICAgIHggPSB4ID8/IDA7CiAgICB5ID0geSA/PyAwOwogICAgeiA9IHogPz8gMDsKICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJ4IiwgeCwgMCk7CiAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieSIsIHksIDApOwogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoInoiLCB6LCAwKTsKICAgIGVsbGlwc29pZC5fcmFkaWkgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KHgsIHksIHopOwogICAgZWxsaXBzb2lkLl9yYWRpaVNxdWFyZWQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KHggKiB4LCB5ICogeSwgeiAqIHopOwogICAgZWxsaXBzb2lkLl9yYWRpaVRvVGhlRm91cnRoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgKICAgICAgeCAqIHggKiB4ICogeCwKICAgICAgeSAqIHkgKiB5ICogeSwKICAgICAgeiAqIHogKiB6ICogegogICAgKTsKICAgIGVsbGlwc29pZC5fb25lT3ZlclJhZGlpID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgKICAgICAgeCA9PT0gMCA/IDAgOiAxIC8geCwKICAgICAgeSA9PT0gMCA/IDAgOiAxIC8geSwKICAgICAgeiA9PT0gMCA/IDAgOiAxIC8gegogICAgKTsKICAgIGVsbGlwc29pZC5fb25lT3ZlclJhZGlpU3F1YXJlZCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoCiAgICAgIHggPT09IDAgPyAwIDogMSAvICh4ICogeCksCiAgICAgIHkgPT09IDAgPyAwIDogMSAvICh5ICogeSksCiAgICAgIHogPT09IDAgPyAwIDogMSAvICh6ICogeikKICAgICk7CiAgICBlbGxpcHNvaWQuX21pbmltdW1SYWRpdXMgPSBNYXRoLm1pbih4LCB5LCB6KTsKICAgIGVsbGlwc29pZC5fbWF4aW11bVJhZGl1cyA9IE1hdGgubWF4KHgsIHksIHopOwogICAgZWxsaXBzb2lkLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkID0gTWF0aF9kZWZhdWx0LkVQU0lMT04xOwogICAgaWYgKGVsbGlwc29pZC5fcmFkaWlTcXVhcmVkLnogIT09IDApIHsKICAgICAgZWxsaXBzb2lkLl9zcXVhcmVkWE92ZXJTcXVhcmVkWiA9IGVsbGlwc29pZC5fcmFkaWlTcXVhcmVkLnggLyBlbGxpcHNvaWQuX3JhZGlpU3F1YXJlZC56OwogICAgfQogIH0KICBmdW5jdGlvbiBFbGxpcHNvaWQoeCwgeSwgeikgewogICAgdGhpcy5fcmFkaWkgPSB2b2lkIDA7CiAgICB0aGlzLl9yYWRpaVNxdWFyZWQgPSB2b2lkIDA7CiAgICB0aGlzLl9yYWRpaVRvVGhlRm91cnRoID0gdm9pZCAwOwogICAgdGhpcy5fb25lT3ZlclJhZGlpID0gdm9pZCAwOwogICAgdGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZCA9IHZvaWQgMDsKICAgIHRoaXMuX21pbmltdW1SYWRpdXMgPSB2b2lkIDA7CiAgICB0aGlzLl9tYXhpbXVtUmFkaXVzID0gdm9pZCAwOwogICAgdGhpcy5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZCA9IHZvaWQgMDsKICAgIHRoaXMuX3NxdWFyZWRYT3ZlclNxdWFyZWRaID0gdm9pZCAwOwogICAgaW5pdGlhbGl6ZSh0aGlzLCB4LCB5LCB6KTsKICB9CiAgZnVuY3Rpb24gZ2F1c3NMZWdlbmRyZVF1YWRyYXR1cmUoYTMsIGIsIGZ1bmMpIHsKICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigiYSIsIGEzKTsKICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigiYiIsIGIpOwogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YuZnVuYygiZnVuYyIsIGZ1bmMpOwogICAgY29uc3QgeE1lYW4gPSAwLjUgKiAoYiArIGEzKTsKICAgIGNvbnN0IHhSYW5nZSA9IDAuNSAqIChiIC0gYTMpOwogICAgbGV0IHN1bSA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDU7IGkrKykgewogICAgICBjb25zdCBkeCA9IHhSYW5nZSAqIGFic2Npc3Nhc1tpXTsKICAgICAgc3VtICs9IHdlaWdodHNbaV0gKiAoZnVuYyh4TWVhbiArIGR4KSArIGZ1bmMoeE1lYW4gLSBkeCkpOwogICAgfQogICAgc3VtICo9IHhSYW5nZTsKICAgIHJldHVybiBzdW07CiAgfQogIHZhciBjYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbk5vcm1hbCwgY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW5LLCBjYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpY04yLCBjYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpY1AyLCBjYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpY0gyLCBzY3JhdGNoRW5kcG9pbnQsIGFic2Npc3Nhcywgd2VpZ2h0cywgRWxsaXBzb2lkX2RlZmF1bHQ7CiAgdmFyIGluaXRfRWxsaXBzb2lkID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9FbGxpcHNvaWQuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjIoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2FydG9ncmFwaGljKCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGluaXRfc2NhbGVUb0dlb2RldGljU3VyZmFjZSgpOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhFbGxpcHNvaWQucHJvdG90eXBlLCB7CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgcmFkaWkgb2YgdGhlIGVsbGlwc29pZC4KICAgICAgICAgKiBAbWVtYmVyb2YgRWxsaXBzb2lkLnByb3RvdHlwZQogICAgICAgICAqIEB0eXBlIHtDYXJ0ZXNpYW4zfQogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqLwogICAgICAgIHJhZGlpOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmFkaWk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBzcXVhcmVkIHJhZGlpIG9mIHRoZSBlbGxpcHNvaWQuCiAgICAgICAgICogQG1lbWJlcm9mIEVsbGlwc29pZC5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7Q2FydGVzaWFuM30KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKi8KICAgICAgICByYWRpaVNxdWFyZWQ6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yYWRpaVNxdWFyZWQ7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSByYWRpaSBvZiB0aGUgZWxsaXBzb2lkIHJhaXNlIHRvIHRoZSBmb3VydGggcG93ZXIuCiAgICAgICAgICogQG1lbWJlcm9mIEVsbGlwc29pZC5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7Q2FydGVzaWFuM30KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKi8KICAgICAgICByYWRpaVRvVGhlRm91cnRoOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmFkaWlUb1RoZUZvdXJ0aDsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgb25lIG92ZXIgdGhlIHJhZGlpIG9mIHRoZSBlbGxpcHNvaWQuCiAgICAgICAgICogQG1lbWJlcm9mIEVsbGlwc29pZC5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7Q2FydGVzaWFuM30KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKi8KICAgICAgICBvbmVPdmVyUmFkaWk6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vbmVPdmVyUmFkaWk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIG9uZSBvdmVyIHRoZSBzcXVhcmVkIHJhZGlpIG9mIHRoZSBlbGxpcHNvaWQuCiAgICAgICAgICogQG1lbWJlcm9mIEVsbGlwc29pZC5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7Q2FydGVzaWFuM30KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKi8KICAgICAgICBvbmVPdmVyUmFkaWlTcXVhcmVkOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZDsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIG1pbmltdW0gcmFkaXVzIG9mIHRoZSBlbGxpcHNvaWQuCiAgICAgICAgICogQG1lbWJlcm9mIEVsbGlwc29pZC5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqLwogICAgICAgIG1pbmltdW1SYWRpdXM6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9taW5pbXVtUmFkaXVzOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgbWF4aW11bSByYWRpdXMgb2YgdGhlIGVsbGlwc29pZC4KICAgICAgICAgKiBAbWVtYmVyb2YgRWxsaXBzb2lkLnByb3RvdHlwZQogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICovCiAgICAgICAgbWF4aW11bVJhZGl1czogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21heGltdW1SYWRpdXM7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgRWxsaXBzb2lkLmNsb25lID0gZnVuY3Rpb24oZWxsaXBzb2lkLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChlbGxpcHNvaWQpKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBjb25zdCByYWRpaSA9IGVsbGlwc29pZC5fcmFkaWk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBFbGxpcHNvaWQocmFkaWkueCwgcmFkaWkueSwgcmFkaWkueik7CiAgICAgICAgfQogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShyYWRpaSwgcmVzdWx0Ll9yYWRpaSk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGVsbGlwc29pZC5fcmFkaWlTcXVhcmVkLCByZXN1bHQuX3JhZGlpU3F1YXJlZCk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGVsbGlwc29pZC5fcmFkaWlUb1RoZUZvdXJ0aCwgcmVzdWx0Ll9yYWRpaVRvVGhlRm91cnRoKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoZWxsaXBzb2lkLl9vbmVPdmVyUmFkaWksIHJlc3VsdC5fb25lT3ZlclJhZGlpKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoZWxsaXBzb2lkLl9vbmVPdmVyUmFkaWlTcXVhcmVkLCByZXN1bHQuX29uZU92ZXJSYWRpaVNxdWFyZWQpOwogICAgICAgIHJlc3VsdC5fbWluaW11bVJhZGl1cyA9IGVsbGlwc29pZC5fbWluaW11bVJhZGl1czsKICAgICAgICByZXN1bHQuX21heGltdW1SYWRpdXMgPSBlbGxpcHNvaWQuX21heGltdW1SYWRpdXM7CiAgICAgICAgcmVzdWx0Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkID0gZWxsaXBzb2lkLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEVsbGlwc29pZC5mcm9tQ2FydGVzaWFuMyA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgRWxsaXBzb2lkKCk7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGNhcnRlc2lhbjExKSkgewogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgaW5pdGlhbGl6ZShyZXN1bHQsIGNhcnRlc2lhbjExLngsIGNhcnRlc2lhbjExLnksIGNhcnRlc2lhbjExLnopOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEVsbGlwc29pZC5XR1M4NCA9IE9iamVjdC5mcmVlemUoCiAgICAgICAgbmV3IEVsbGlwc29pZCg2Mzc4MTM3LCA2Mzc4MTM3LCA2MzU2NzUyMzE0MjQ1MTc5ZS05KQogICAgICApOwogICAgICBFbGxpcHNvaWQuVU5JVF9TUEhFUkUgPSBPYmplY3QuZnJlZXplKG5ldyBFbGxpcHNvaWQoMSwgMSwgMSkpOwogICAgICBFbGxpcHNvaWQuTU9PTiA9IE9iamVjdC5mcmVlemUoCiAgICAgICAgbmV3IEVsbGlwc29pZCgKICAgICAgICAgIE1hdGhfZGVmYXVsdC5MVU5BUl9SQURJVVMsCiAgICAgICAgICBNYXRoX2RlZmF1bHQuTFVOQVJfUkFESVVTLAogICAgICAgICAgTWF0aF9kZWZhdWx0LkxVTkFSX1JBRElVUwogICAgICAgICkKICAgICAgKTsKICAgICAgRWxsaXBzb2lkLl9kZWZhdWx0ID0gRWxsaXBzb2lkLldHUzg0OwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhFbGxpcHNvaWQsIHsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZGVmYXVsdCBlbGxpcHNvaWQgdXNlZCB3aGVuIG5vdCBvdGhlcndpc2Ugc3BlY2lmaWVkLgogICAgICAgICAqIEBtZW1iZXJvZiBFbGxpcHNvaWQKICAgICAgICAgKiBAdHlwZSB7RWxsaXBzb2lkfQogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogQ2VzaXVtLkVsbGlwc29pZC5kZWZhdWx0ID0gQ2VzaXVtLkVsbGlwc29pZC5NT09OOwogICAgICAgICAqCiAgICAgICAgICogLy8gQXBvbGxvIDExIGxhbmRpbmcgc2l0ZQogICAgICAgICAqIGNvbnN0IHBvc2l0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbVJhZGlhbnMoCiAgICAgICAgICogICAwLjY3NDE2LAogICAgICAgICAqICAgMjMuNDczMTUsCiAgICAgICAgICogKTsKICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gRWxsaXBzb2lkLl9kZWZhdWx0OwogICAgICAgICAgfSwKICAgICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICAgICAgRWxsaXBzb2lkLl9kZWZhdWx0ID0gdmFsdWU7CiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5fZWxsaXBzb2lkUmFkaWlTcXVhcmVkID0gdmFsdWUucmFkaWlTcXVhcmVkOwogICAgICAgICAgICBDYXJ0b2dyYXBoaWNfZGVmYXVsdC5fZWxsaXBzb2lkT25lT3ZlclJhZGlpID0gdmFsdWUub25lT3ZlclJhZGlpOwogICAgICAgICAgICBDYXJ0b2dyYXBoaWNfZGVmYXVsdC5fZWxsaXBzb2lkT25lT3ZlclJhZGlpU3F1YXJlZCA9IHZhbHVlLm9uZU92ZXJSYWRpaVNxdWFyZWQ7CiAgICAgICAgICAgIENhcnRvZ3JhcGhpY19kZWZhdWx0Ll9lbGxpcHNvaWRDZW50ZXJUb2xlcmFuY2VTcXVhcmVkID0gdmFsdWUuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgRWxsaXBzb2lkLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJldHVybiBFbGxpcHNvaWQuY2xvbmUodGhpcywgcmVzdWx0KTsKICAgICAgfTsKICAgICAgRWxsaXBzb2lkLnBhY2tlZExlbmd0aCA9IENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgIEVsbGlwc29pZC5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2sodmFsdWUuX3JhZGlpLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9OwogICAgICBFbGxpcHNvaWQudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBjb25zdCByYWRpaSA9IENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2soYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIHJldHVybiBFbGxpcHNvaWQuZnJvbUNhcnRlc2lhbjMocmFkaWksIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIEVsbGlwc29pZC5wcm90b3R5cGUuZ2VvY2VudHJpY1N1cmZhY2VOb3JtYWwgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplOwogICAgICBFbGxpcHNvaWQucHJvdG90eXBlLmdlb2RldGljU3VyZmFjZU5vcm1hbENhcnRvZ3JhcGhpYyA9IGZ1bmN0aW9uKGNhcnRvZ3JhcGhpYzIsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydG9ncmFwaGljIiwgY2FydG9ncmFwaGljMik7CiAgICAgICAgY29uc3QgbG9uZ2l0dWRlID0gY2FydG9ncmFwaGljMi5sb25naXR1ZGU7CiAgICAgICAgY29uc3QgbGF0aXR1ZGUgPSBjYXJ0b2dyYXBoaWMyLmxhdGl0dWRlOwogICAgICAgIGNvbnN0IGNvc0xhdGl0dWRlID0gTWF0aC5jb3MobGF0aXR1ZGUpOwogICAgICAgIGNvbnN0IHggPSBjb3NMYXRpdHVkZSAqIE1hdGguY29zKGxvbmdpdHVkZSk7CiAgICAgICAgY29uc3QgeSA9IGNvc0xhdGl0dWRlICogTWF0aC5zaW4obG9uZ2l0dWRlKTsKICAgICAgICBjb25zdCB6ID0gTWF0aC5zaW4obGF0aXR1ZGUpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnggPSB4OwogICAgICAgIHJlc3VsdC55ID0geTsKICAgICAgICByZXN1bHQueiA9IHo7CiAgICAgICAgcmV0dXJuIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUocmVzdWx0LCByZXN1bHQpOwogICAgICB9OwogICAgICBFbGxpcHNvaWQucHJvdG90eXBlLmdlb2RldGljU3VyZmFjZU5vcm1hbCA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsIGNhcnRlc2lhbjExKTsKICAgICAgICBpZiAoaXNOYU4oY2FydGVzaWFuMTEueCkgfHwgaXNOYU4oY2FydGVzaWFuMTEueSkgfHwgaXNOYU4oY2FydGVzaWFuMTEueikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJjYXJ0ZXNpYW4gaGFzIGEgTmFOIGNvbXBvbmVudCIpOwogICAgICAgIH0KICAgICAgICBpZiAoQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24oY2FydGVzaWFuMTEsIENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjE0KSkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlDb21wb25lbnRzKAogICAgICAgICAgY2FydGVzaWFuMTEsCiAgICAgICAgICB0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkLAogICAgICAgICAgcmVzdWx0CiAgICAgICAgKTsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShyZXN1bHQsIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIGNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuTm9ybWFsID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbksgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIEVsbGlwc29pZC5wcm90b3R5cGUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4gPSBmdW5jdGlvbihjYXJ0b2dyYXBoaWMyLCByZXN1bHQpIHsKICAgICAgICBjb25zdCBuID0gY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW5Ob3JtYWw7CiAgICAgICAgY29uc3QgayA9IGNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuSzsKICAgICAgICB0aGlzLmdlb2RldGljU3VyZmFjZU5vcm1hbENhcnRvZ3JhcGhpYyhjYXJ0b2dyYXBoaWMyLCBuKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlDb21wb25lbnRzKHRoaXMuX3JhZGlpU3F1YXJlZCwgbiwgayk7CiAgICAgICAgY29uc3QgZ2FtbWEgPSBNYXRoLnNxcnQoQ2FydGVzaWFuM19kZWZhdWx0LmRvdChuLCBrKSk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmRpdmlkZUJ5U2NhbGFyKGssIGdhbW1hLCBrKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihuLCBjYXJ0b2dyYXBoaWMyLmhlaWdodCwgbik7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gQ2FydGVzaWFuM19kZWZhdWx0LmFkZChrLCBuLCByZXN1bHQpOwogICAgICB9OwogICAgICBFbGxpcHNvaWQucHJvdG90eXBlLmNhcnRvZ3JhcGhpY0FycmF5VG9DYXJ0ZXNpYW5BcnJheSA9IGZ1bmN0aW9uKGNhcnRvZ3JhcGhpY3MsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiY2FydG9ncmFwaGljcyIsIGNhcnRvZ3JhcGhpY3MpOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IGNhcnRvZ3JhcGhpY3MubGVuZ3RoOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQubGVuZ3RoID0gbGVuZ3RoOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICByZXN1bHRbaV0gPSB0aGlzLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGNhcnRvZ3JhcGhpY3NbaV0sIHJlc3VsdFtpXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIGNhcnRlc2lhblRvQ2FydG9ncmFwaGljTjIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGNhcnRlc2lhblRvQ2FydG9ncmFwaGljUDIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGNhcnRlc2lhblRvQ2FydG9ncmFwaGljSDIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIEVsbGlwc29pZC5wcm90b3R5cGUuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgcmVzdWx0KSB7CiAgICAgICAgY29uc3QgcCA9IHRoaXMuc2NhbGVUb0dlb2RldGljU3VyZmFjZShjYXJ0ZXNpYW4xMSwgY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWNQMik7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocCkpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG4gPSB0aGlzLmdlb2RldGljU3VyZmFjZU5vcm1hbChwLCBjYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpY04yKTsKICAgICAgICBjb25zdCBoID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KGNhcnRlc2lhbjExLCBwLCBjYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpY0gyKTsKICAgICAgICBjb25zdCBsb25naXR1ZGUgPSBNYXRoLmF0YW4yKG4ueSwgbi54KTsKICAgICAgICBjb25zdCBsYXRpdHVkZSA9IE1hdGguYXNpbihuLnopOwogICAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGhfZGVmYXVsdC5zaWduKENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoaCwgY2FydGVzaWFuMTEpKSAqIENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUoaCk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdChsb25naXR1ZGUsIGxhdGl0dWRlLCBoZWlnaHQpOwogICAgICAgIH0KICAgICAgICByZXN1bHQubG9uZ2l0dWRlID0gbG9uZ2l0dWRlOwogICAgICAgIHJlc3VsdC5sYXRpdHVkZSA9IGxhdGl0dWRlOwogICAgICAgIHJlc3VsdC5oZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgRWxsaXBzb2lkLnByb3RvdHlwZS5jYXJ0ZXNpYW5BcnJheVRvQ2FydG9ncmFwaGljQXJyYXkgPSBmdW5jdGlvbihjYXJ0ZXNpYW5zLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImNhcnRlc2lhbnMiLCBjYXJ0ZXNpYW5zKTsKICAgICAgICBjb25zdCBsZW5ndGggPSBjYXJ0ZXNpYW5zLmxlbmd0aDsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXkobGVuZ3RoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0Lmxlbmd0aCA9IGxlbmd0aDsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgcmVzdWx0W2ldID0gdGhpcy5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhjYXJ0ZXNpYW5zW2ldLCByZXN1bHRbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBFbGxpcHNvaWQucHJvdG90eXBlLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgcmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIHNjYWxlVG9HZW9kZXRpY1N1cmZhY2VfZGVmYXVsdCgKICAgICAgICAgIGNhcnRlc2lhbjExLAogICAgICAgICAgdGhpcy5fb25lT3ZlclJhZGlpLAogICAgICAgICAgdGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZCwKICAgICAgICAgIHRoaXMuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQsCiAgICAgICAgICByZXN1bHQKICAgICAgICApOwogICAgICB9OwogICAgICBFbGxpcHNvaWQucHJvdG90eXBlLnNjYWxlVG9HZW9jZW50cmljU3VyZmFjZSA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsIGNhcnRlc2lhbjExKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBvc2l0aW9uWCA9IGNhcnRlc2lhbjExLng7CiAgICAgICAgY29uc3QgcG9zaXRpb25ZID0gY2FydGVzaWFuMTEueTsKICAgICAgICBjb25zdCBwb3NpdGlvblogPSBjYXJ0ZXNpYW4xMS56OwogICAgICAgIGNvbnN0IG9uZU92ZXJSYWRpaVNxdWFyZWQgPSB0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkOwogICAgICAgIGNvbnN0IGJldGEgPSAxIC8gTWF0aC5zcXJ0KAogICAgICAgICAgcG9zaXRpb25YICogcG9zaXRpb25YICogb25lT3ZlclJhZGlpU3F1YXJlZC54ICsgcG9zaXRpb25ZICogcG9zaXRpb25ZICogb25lT3ZlclJhZGlpU3F1YXJlZC55ICsgcG9zaXRpb25aICogcG9zaXRpb25aICogb25lT3ZlclJhZGlpU3F1YXJlZC56CiAgICAgICAgKTsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoY2FydGVzaWFuMTEsIGJldGEsIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIEVsbGlwc29pZC5wcm90b3R5cGUudHJhbnNmb3JtUG9zaXRpb25Ub1NjYWxlZFNwYWNlID0gZnVuY3Rpb24ocG9zaXRpb24sIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUNvbXBvbmVudHMocG9zaXRpb24sIHRoaXMuX29uZU92ZXJSYWRpaSwgcmVzdWx0KTsKICAgICAgfTsKICAgICAgRWxsaXBzb2lkLnByb3RvdHlwZS50cmFuc2Zvcm1Qb3NpdGlvbkZyb21TY2FsZWRTcGFjZSA9IGZ1bmN0aW9uKHBvc2l0aW9uLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlDb21wb25lbnRzKHBvc2l0aW9uLCB0aGlzLl9yYWRpaSwgcmVzdWx0KTsKICAgICAgfTsKICAgICAgRWxsaXBzb2lkLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbihyaWdodCkgewogICAgICAgIHJldHVybiB0aGlzID09PSByaWdodCB8fCBkZWZpbmVkX2RlZmF1bHQocmlnaHQpICYmIENhcnRlc2lhbjNfZGVmYXVsdC5lcXVhbHModGhpcy5fcmFkaWksIHJpZ2h0Ll9yYWRpaSk7CiAgICAgIH07CiAgICAgIEVsbGlwc29pZC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmFkaWkudG9TdHJpbmcoKTsKICAgICAgfTsKICAgICAgRWxsaXBzb2lkLnByb3RvdHlwZS5nZXRTdXJmYWNlTm9ybWFsSW50ZXJzZWN0aW9uV2l0aFpBeGlzID0gZnVuY3Rpb24ocG9zaXRpb24sIGJ1ZmZlciwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJwb3NpdGlvbiIsIHBvc2l0aW9uKTsKICAgICAgICBpZiAoIU1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgdGhpcy5fcmFkaWkueCwKICAgICAgICAgIHRoaXMuX3JhZGlpLnksCiAgICAgICAgICBNYXRoX2RlZmF1bHQuRVBTSUxPTjE1CiAgICAgICAgKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJFbGxpcHNvaWQgbXVzdCBiZSBhbiBlbGxpcHNvaWQgb2YgcmV2b2x1dGlvbiAocmFkaWkueCA9PSByYWRpaS55KSIKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbigiRWxsaXBzb2lkLnJhZGlpLnoiLCB0aGlzLl9yYWRpaS56LCAwKTsKICAgICAgICBidWZmZXIgPSBidWZmZXIgPz8gMDsKICAgICAgICBjb25zdCBzcXVhcmVkWE92ZXJTcXVhcmVkWiA9IHRoaXMuX3NxdWFyZWRYT3ZlclNxdWFyZWRaOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnggPSAwOwogICAgICAgIHJlc3VsdC55ID0gMDsKICAgICAgICByZXN1bHQueiA9IHBvc2l0aW9uLnogKiAoMSAtIHNxdWFyZWRYT3ZlclNxdWFyZWRaKTsKICAgICAgICBpZiAoTWF0aC5hYnMocmVzdWx0LnopID49IHRoaXMuX3JhZGlpLnogLSBidWZmZXIpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hFbmRwb2ludCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgRWxsaXBzb2lkLnByb3RvdHlwZS5nZXRMb2NhbEN1cnZhdHVyZSA9IGZ1bmN0aW9uKHN1cmZhY2VQb3NpdGlvbiwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJzdXJmYWNlUG9zaXRpb24iLCBzdXJmYWNlUG9zaXRpb24pOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcHJpbWVWZXJ0aWNhbEVuZHBvaW50ID0gdGhpcy5nZXRTdXJmYWNlTm9ybWFsSW50ZXJzZWN0aW9uV2l0aFpBeGlzKAogICAgICAgICAgc3VyZmFjZVBvc2l0aW9uLAogICAgICAgICAgMCwKICAgICAgICAgIHNjcmF0Y2hFbmRwb2ludAogICAgICAgICk7CiAgICAgICAgY29uc3QgcHJpbWVWZXJ0aWNhbFJhZGl1cyA9IENhcnRlc2lhbjNfZGVmYXVsdC5kaXN0YW5jZSgKICAgICAgICAgIHN1cmZhY2VQb3NpdGlvbiwKICAgICAgICAgIHByaW1lVmVydGljYWxFbmRwb2ludAogICAgICAgICk7CiAgICAgICAgY29uc3QgcmFkaXVzUmF0aW8gPSB0aGlzLm1pbmltdW1SYWRpdXMgKiBwcmltZVZlcnRpY2FsUmFkaXVzIC8gdGhpcy5tYXhpbXVtUmFkaXVzICoqIDI7CiAgICAgICAgY29uc3QgbWVyaWRpb25hbFJhZGl1cyA9IHByaW1lVmVydGljYWxSYWRpdXMgKiByYWRpdXNSYXRpbyAqKiAyOwogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4yX2RlZmF1bHQuZnJvbUVsZW1lbnRzKAogICAgICAgICAgMSAvIHByaW1lVmVydGljYWxSYWRpdXMsCiAgICAgICAgICAxIC8gbWVyaWRpb25hbFJhZGl1cywKICAgICAgICAgIHJlc3VsdAogICAgICAgICk7CiAgICAgIH07CiAgICAgIGFic2Npc3NhcyA9IFsKICAgICAgICAwLjE0ODg3NDMzODk4MTYzLAogICAgICAgIDAuNDMzMzk1Mzk0MTI5MjUsCiAgICAgICAgMC42Nzk0MDk1NjgyOTkwMiwKICAgICAgICAwLjg2NTA2MzM2NjY4ODk4LAogICAgICAgIDAuOTczOTA2NTI4NTE3MTcsCiAgICAgICAgMAogICAgICBdOwogICAgICB3ZWlnaHRzID0gWwogICAgICAgIDAuMjk1NTI0MjI0NzE0NzUsCiAgICAgICAgMC4yNjkyNjY3MTkzMDk5OSwKICAgICAgICAwLjIxOTA4NjM2MjUxNTk4LAogICAgICAgIDAuMTQ5NDUxMzQ5MTUwNTgsCiAgICAgICAgMC4wNjY2NzEzNDQzMDg2ODQsCiAgICAgICAgMAogICAgICBdOwogICAgICBFbGxpcHNvaWQucHJvdG90eXBlLnN1cmZhY2VBcmVhID0gZnVuY3Rpb24ocmVjdGFuZ2xlKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLCByZWN0YW5nbGUpOwogICAgICAgIGNvbnN0IG1pbkxvbmdpdHVkZSA9IHJlY3RhbmdsZS53ZXN0OwogICAgICAgIGxldCBtYXhMb25naXR1ZGUgPSByZWN0YW5nbGUuZWFzdDsKICAgICAgICBjb25zdCBtaW5MYXRpdHVkZSA9IHJlY3RhbmdsZS5zb3V0aDsKICAgICAgICBjb25zdCBtYXhMYXRpdHVkZSA9IHJlY3RhbmdsZS5ub3J0aDsKICAgICAgICB3aGlsZSAobWF4TG9uZ2l0dWRlIDwgbWluTG9uZ2l0dWRlKSB7CiAgICAgICAgICBtYXhMb25naXR1ZGUgKz0gTWF0aF9kZWZhdWx0LlRXT19QSTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmFkaWlTcXVhcmVkID0gdGhpcy5fcmFkaWlTcXVhcmVkOwogICAgICAgIGNvbnN0IGEyMiA9IHJhZGlpU3F1YXJlZC54OwogICAgICAgIGNvbnN0IGIyID0gcmFkaWlTcXVhcmVkLnk7CiAgICAgICAgY29uc3QgYzIgPSByYWRpaVNxdWFyZWQuejsKICAgICAgICBjb25zdCBhMmIyID0gYTIyICogYjI7CiAgICAgICAgcmV0dXJuIGdhdXNzTGVnZW5kcmVRdWFkcmF0dXJlKG1pbkxhdGl0dWRlLCBtYXhMYXRpdHVkZSwgZnVuY3Rpb24obGF0KSB7CiAgICAgICAgICBjb25zdCBzaW5QaGkgPSBNYXRoLmNvcyhsYXQpOwogICAgICAgICAgY29uc3QgY29zUGhpID0gTWF0aC5zaW4obGF0KTsKICAgICAgICAgIHJldHVybiBNYXRoLmNvcyhsYXQpICogZ2F1c3NMZWdlbmRyZVF1YWRyYXR1cmUobWluTG9uZ2l0dWRlLCBtYXhMb25naXR1ZGUsIGZ1bmN0aW9uKGxvbikgewogICAgICAgICAgICBjb25zdCBjb3NUaGV0YSA9IE1hdGguY29zKGxvbik7CiAgICAgICAgICAgIGNvbnN0IHNpblRoZXRhID0gTWF0aC5zaW4obG9uKTsKICAgICAgICAgICAgcmV0dXJuIE1hdGguc3FydCgKICAgICAgICAgICAgICBhMmIyICogY29zUGhpICogY29zUGhpICsgYzIgKiAoYjIgKiBjb3NUaGV0YSAqIGNvc1RoZXRhICsgYTIyICogc2luVGhldGEgKiBzaW5UaGV0YSkgKiBzaW5QaGkgKiBzaW5QaGkKICAgICAgICAgICAgKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBFbGxpcHNvaWRfZGVmYXVsdCA9IEVsbGlwc29pZDsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0dlb2dyYXBoaWNQcm9qZWN0aW9uLmpzCiAgZnVuY3Rpb24gR2VvZ3JhcGhpY1Byb2plY3Rpb24oZWxsaXBzb2lkKSB7CiAgICB0aGlzLl9lbGxpcHNvaWQgPSBlbGxpcHNvaWQgPz8gRWxsaXBzb2lkX2RlZmF1bHQuZGVmYXVsdDsKICAgIHRoaXMuX3NlbWltYWpvckF4aXMgPSB0aGlzLl9lbGxpcHNvaWQubWF4aW11bVJhZGl1czsKICAgIHRoaXMuX29uZU92ZXJTZW1pbWFqb3JBeGlzID0gMSAvIHRoaXMuX3NlbWltYWpvckF4aXM7CiAgfQogIHZhciBHZW9ncmFwaGljUHJvamVjdGlvbl9kZWZhdWx0OwogIHZhciBpbml0X0dlb2dyYXBoaWNQcm9qZWN0aW9uID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9HZW9ncmFwaGljUHJvamVjdGlvbi5qcyIoKSB7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRvZ3JhcGhpYygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhHZW9ncmFwaGljUHJvamVjdGlvbi5wcm90b3R5cGUsIHsKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSB7QGxpbmsgRWxsaXBzb2lkfS4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBHZW9ncmFwaGljUHJvamVjdGlvbi5wcm90b3R5cGUKICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtFbGxpcHNvaWR9CiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICovCiAgICAgICAgZWxsaXBzb2lkOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxsaXBzb2lkOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIEdlb2dyYXBoaWNQcm9qZWN0aW9uLnByb3RvdHlwZS5wcm9qZWN0ID0gZnVuY3Rpb24oY2FydG9ncmFwaGljMiwgcmVzdWx0KSB7CiAgICAgICAgY29uc3Qgc2VtaW1ham9yQXhpcyA9IHRoaXMuX3NlbWltYWpvckF4aXM7CiAgICAgICAgY29uc3QgeCA9IGNhcnRvZ3JhcGhpYzIubG9uZ2l0dWRlICogc2VtaW1ham9yQXhpczsKICAgICAgICBjb25zdCB5ID0gY2FydG9ncmFwaGljMi5sYXRpdHVkZSAqIHNlbWltYWpvckF4aXM7CiAgICAgICAgY29uc3QgeiA9IGNhcnRvZ3JhcGhpYzIuaGVpZ2h0OwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KHgsIHksIHopOwogICAgICAgIH0KICAgICAgICByZXN1bHQueCA9IHg7CiAgICAgICAgcmVzdWx0LnkgPSB5OwogICAgICAgIHJlc3VsdC56ID0gejsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBHZW9ncmFwaGljUHJvamVjdGlvbi5wcm90b3R5cGUudW5wcm9qZWN0ID0gZnVuY3Rpb24oY2FydGVzaWFuMTEsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGNhcnRlc2lhbjExKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImNhcnRlc2lhbiBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBvbmVPdmVyRWFydGhTZW1pbWFqb3JBeGlzID0gdGhpcy5fb25lT3ZlclNlbWltYWpvckF4aXM7CiAgICAgICAgY29uc3QgbG9uZ2l0dWRlID0gY2FydGVzaWFuMTEueCAqIG9uZU92ZXJFYXJ0aFNlbWltYWpvckF4aXM7CiAgICAgICAgY29uc3QgbGF0aXR1ZGUgPSBjYXJ0ZXNpYW4xMS55ICogb25lT3ZlckVhcnRoU2VtaW1ham9yQXhpczsKICAgICAgICBjb25zdCBoZWlnaHQgPSBjYXJ0ZXNpYW4xMS56OwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQobG9uZ2l0dWRlLCBsYXRpdHVkZSwgaGVpZ2h0KTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LmxvbmdpdHVkZSA9IGxvbmdpdHVkZTsKICAgICAgICByZXN1bHQubGF0aXR1ZGUgPSBsYXRpdHVkZTsKICAgICAgICByZXN1bHQuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEdlb2dyYXBoaWNQcm9qZWN0aW9uX2RlZmF1bHQgPSBHZW9ncmFwaGljUHJvamVjdGlvbjsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0ludGVyc2VjdC5qcwogIHZhciBJbnRlcnNlY3QsIEludGVyc2VjdF9kZWZhdWx0OwogIHZhciBpbml0X0ludGVyc2VjdCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvSW50ZXJzZWN0LmpzIigpIHsKICAgICAgSW50ZXJzZWN0ID0gewogICAgICAgIC8qKgogICAgICAgICAqIFJlcHJlc2VudHMgdGhhdCBhbiBvYmplY3QgaXMgbm90IGNvbnRhaW5lZCB3aXRoaW4gdGhlIGZydXN0dW0uCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIE9VVFNJREU6IC0xLAogICAgICAgIC8qKgogICAgICAgICAqIFJlcHJlc2VudHMgdGhhdCBhbiBvYmplY3QgaW50ZXJzZWN0cyBvbmUgb2YgdGhlIGZydXN0dW0ncyBwbGFuZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIElOVEVSU0VDVElORzogMCwKICAgICAgICAvKioKICAgICAgICAgKiBSZXByZXNlbnRzIHRoYXQgYW4gb2JqZWN0IGlzIGZ1bGx5IHdpdGhpbiB0aGUgZnJ1c3R1bS4KICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgSU5TSURFOiAxCiAgICAgIH07CiAgICAgIEludGVyc2VjdF9kZWZhdWx0ID0gT2JqZWN0LmZyZWV6ZShJbnRlcnNlY3QpOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvSW50ZXJ2YWwuanMKICBmdW5jdGlvbiBJbnRlcnZhbChzdGFydCwgc3RvcCkgewogICAgdGhpcy5zdGFydCA9IHN0YXJ0ID8/IDA7CiAgICB0aGlzLnN0b3AgPSBzdG9wID8/IDA7CiAgfQogIHZhciBJbnRlcnZhbF9kZWZhdWx0OwogIHZhciBpbml0X0ludGVydmFsID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9JbnRlcnZhbC5qcyIoKSB7CiAgICAgIEludGVydmFsX2RlZmF1bHQgPSBJbnRlcnZhbDsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL01hdHJpeDMuanMKICBmdW5jdGlvbiBNYXRyaXgzKGNvbHVtbjBSb3cwLCBjb2x1bW4xUm93MCwgY29sdW1uMlJvdzAsIGNvbHVtbjBSb3cxLCBjb2x1bW4xUm93MSwgY29sdW1uMlJvdzEsIGNvbHVtbjBSb3cyLCBjb2x1bW4xUm93MiwgY29sdW1uMlJvdzIpIHsKICAgIHRoaXNbMF0gPSBjb2x1bW4wUm93MCA/PyAwOwogICAgdGhpc1sxXSA9IGNvbHVtbjBSb3cxID8/IDA7CiAgICB0aGlzWzJdID0gY29sdW1uMFJvdzIgPz8gMDsKICAgIHRoaXNbM10gPSBjb2x1bW4xUm93MCA/PyAwOwogICAgdGhpc1s0XSA9IGNvbHVtbjFSb3cxID8/IDA7CiAgICB0aGlzWzVdID0gY29sdW1uMVJvdzIgPz8gMDsKICAgIHRoaXNbNl0gPSBjb2x1bW4yUm93MCA/PyAwOwogICAgdGhpc1s3XSA9IGNvbHVtbjJSb3cxID8/IDA7CiAgICB0aGlzWzhdID0gY29sdW1uMlJvdzIgPz8gMDsKICB9CiAgZnVuY3Rpb24gY29tcHV0ZUZyb2Jlbml1c05vcm0obWF0cml4KSB7CiAgICBsZXQgbm9ybSA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDk7ICsraSkgewogICAgICBjb25zdCB0ZW1wID0gbWF0cml4W2ldOwogICAgICBub3JtICs9IHRlbXAgKiB0ZW1wOwogICAgfQogICAgcmV0dXJuIE1hdGguc3FydChub3JtKTsKICB9CiAgZnVuY3Rpb24gb2ZmRGlhZ29uYWxGcm9iZW5pdXNOb3JtKG1hdHJpeCkgewogICAgbGV0IG5vcm0gPSAwOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICAgY29uc3QgdGVtcCA9IG1hdHJpeFtNYXRyaXgzLmdldEVsZW1lbnRJbmRleChjb2xWYWxbaV0sIHJvd1ZhbFtpXSldOwogICAgICBub3JtICs9IDIgKiB0ZW1wICogdGVtcDsKICAgIH0KICAgIHJldHVybiBNYXRoLnNxcnQobm9ybSk7CiAgfQogIGZ1bmN0aW9uIHNodXJEZWNvbXBvc2l0aW9uKG1hdHJpeCwgcmVzdWx0KSB7CiAgICBjb25zdCB0b2xlcmFuY2UgPSBNYXRoX2RlZmF1bHQuRVBTSUxPTjE1OwogICAgbGV0IG1heERpYWdvbmFsID0gMDsKICAgIGxldCByb3RBeGlzMiA9IDE7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgICBjb25zdCB0ZW1wID0gTWF0aC5hYnMoCiAgICAgICAgbWF0cml4W01hdHJpeDMuZ2V0RWxlbWVudEluZGV4KGNvbFZhbFtpXSwgcm93VmFsW2ldKV0KICAgICAgKTsKICAgICAgaWYgKHRlbXAgPiBtYXhEaWFnb25hbCkgewogICAgICAgIHJvdEF4aXMyID0gaTsKICAgICAgICBtYXhEaWFnb25hbCA9IHRlbXA7CiAgICAgIH0KICAgIH0KICAgIGxldCBjID0gMTsKICAgIGxldCBzID0gMDsKICAgIGNvbnN0IHAgPSByb3dWYWxbcm90QXhpczJdOwogICAgY29uc3QgcSA9IGNvbFZhbFtyb3RBeGlzMl07CiAgICBpZiAoTWF0aC5hYnMobWF0cml4W01hdHJpeDMuZ2V0RWxlbWVudEluZGV4KHEsIHApXSkgPiB0b2xlcmFuY2UpIHsKICAgICAgY29uc3QgcXEgPSBtYXRyaXhbTWF0cml4My5nZXRFbGVtZW50SW5kZXgocSwgcSldOwogICAgICBjb25zdCBwcCA9IG1hdHJpeFtNYXRyaXgzLmdldEVsZW1lbnRJbmRleChwLCBwKV07CiAgICAgIGNvbnN0IHFwID0gbWF0cml4W01hdHJpeDMuZ2V0RWxlbWVudEluZGV4KHEsIHApXTsKICAgICAgY29uc3QgdGF1ID0gKHFxIC0gcHApIC8gMiAvIHFwOwogICAgICBsZXQgdDsKICAgICAgaWYgKHRhdSA8IDApIHsKICAgICAgICB0ID0gLTEgLyAoLXRhdSArIE1hdGguc3FydCgxICsgdGF1ICogdGF1KSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdCA9IDEgLyAodGF1ICsgTWF0aC5zcXJ0KDEgKyB0YXUgKiB0YXUpKTsKICAgICAgfQogICAgICBjID0gMSAvIE1hdGguc3FydCgxICsgdCAqIHQpOwogICAgICBzID0gdCAqIGM7CiAgICB9CiAgICByZXN1bHQgPSBNYXRyaXgzLmNsb25lKE1hdHJpeDMuSURFTlRJVFksIHJlc3VsdCk7CiAgICByZXN1bHRbTWF0cml4My5nZXRFbGVtZW50SW5kZXgocCwgcCldID0gcmVzdWx0W01hdHJpeDMuZ2V0RWxlbWVudEluZGV4KHEsIHEpXSA9IGM7CiAgICByZXN1bHRbTWF0cml4My5nZXRFbGVtZW50SW5kZXgocSwgcCldID0gczsKICAgIHJlc3VsdFtNYXRyaXgzLmdldEVsZW1lbnRJbmRleChwLCBxKV0gPSAtczsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIHZhciBzY2FsZVNjcmF0Y2gxLCBzY2FsZVNjcmF0Y2gyLCBzY3JhdGNoQ29sdW1uLCBzY2FsZVNjcmF0Y2gzLCBzY2FsZVNjcmF0Y2g0LCBzY2FsZVNjcmF0Y2g1LCByb3dWYWwsIGNvbFZhbCwgak1hdHJpeCwgak1hdHJpeFRyYW5zcG9zZSwgc2NyYXRjaFRyYW5zcG9zZU1hdHJpeCwgTWF0cml4M19kZWZhdWx0OwogIHZhciBpbml0X01hdHJpeDMgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL01hdHJpeDMuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgTWF0cml4My5wYWNrZWRMZW5ndGggPSA5OwogICAgICBNYXRyaXgzLnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWVbMF07CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlWzFdOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZVsyXTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWVbM107CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlWzRdOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZVs1XTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWVbNl07CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlWzddOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZVs4XTsKICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH07CiAgICAgIE1hdHJpeDMudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgTWF0cml4MygpOwogICAgICAgIH0KICAgICAgICByZXN1bHRbMF0gPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdFsxXSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0WzJdID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICByZXN1bHRbM10gPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdFs0XSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0WzVdID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICByZXN1bHRbNl0gPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdFs3XSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0WzhdID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXgzLnBhY2tBcnJheSA9IGZ1bmN0aW9uKGFycmF5LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKICAgICAgICBjb25zdCByZXN1bHRMZW5ndGggPSBsZW5ndGggKiA5OwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShyZXN1bHRMZW5ndGgpOwogICAgICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiByZXN1bHQubGVuZ3RoICE9PSByZXN1bHRMZW5ndGgpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAiSWYgcmVzdWx0IGlzIGEgdHlwZWQgYXJyYXksIGl0IG11c3QgaGF2ZSBleGFjdGx5IGFycmF5Lmxlbmd0aCAqIDkgZWxlbWVudHMiCiAgICAgICAgICApOwogICAgICAgIH0gZWxzZSBpZiAocmVzdWx0Lmxlbmd0aCAhPT0gcmVzdWx0TGVuZ3RoKSB7CiAgICAgICAgICByZXN1bHQubGVuZ3RoID0gcmVzdWx0TGVuZ3RoOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgICBNYXRyaXgzLnBhY2soYXJyYXlbaV0sIHJlc3VsdCwgaSAqIDkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXgzLnVucGFja0FycmF5ID0gZnVuY3Rpb24oYXJyYXksIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsIGFycmF5Lmxlbmd0aCwgOSk7CiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCAlIDkgIT09IDApIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhcnJheSBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDkuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXkobGVuZ3RoIC8gOSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdC5sZW5ndGggPSBsZW5ndGggLyA5OwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSA5KSB7CiAgICAgICAgICBjb25zdCBpbmRleCA9IGkgLyA5OwogICAgICAgICAgcmVzdWx0W2luZGV4XSA9IE1hdHJpeDMudW5wYWNrKGFycmF5LCBpLCByZXN1bHRbaW5kZXhdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4My5jbG9uZSA9IGZ1bmN0aW9uKG1hdHJpeCwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobWF0cml4KSkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBNYXRyaXgzKAogICAgICAgICAgICBtYXRyaXhbMF0sCiAgICAgICAgICAgIG1hdHJpeFszXSwKICAgICAgICAgICAgbWF0cml4WzZdLAogICAgICAgICAgICBtYXRyaXhbMV0sCiAgICAgICAgICAgIG1hdHJpeFs0XSwKICAgICAgICAgICAgbWF0cml4WzddLAogICAgICAgICAgICBtYXRyaXhbMl0sCiAgICAgICAgICAgIG1hdHJpeFs1XSwKICAgICAgICAgICAgbWF0cml4WzhdCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXN1bHRbMF0gPSBtYXRyaXhbMF07CiAgICAgICAgcmVzdWx0WzFdID0gbWF0cml4WzFdOwogICAgICAgIHJlc3VsdFsyXSA9IG1hdHJpeFsyXTsKICAgICAgICByZXN1bHRbM10gPSBtYXRyaXhbM107CiAgICAgICAgcmVzdWx0WzRdID0gbWF0cml4WzRdOwogICAgICAgIHJlc3VsdFs1XSA9IG1hdHJpeFs1XTsKICAgICAgICByZXN1bHRbNl0gPSBtYXRyaXhbNl07CiAgICAgICAgcmVzdWx0WzddID0gbWF0cml4WzddOwogICAgICAgIHJlc3VsdFs4XSA9IG1hdHJpeFs4XTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXgzLmZyb21BcnJheSA9IE1hdHJpeDMudW5wYWNrOwogICAgICBNYXRyaXgzLmZyb21Db2x1bW5NYWpvckFycmF5ID0gZnVuY3Rpb24odmFsdWVzLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoInZhbHVlcyIsIHZhbHVlcyk7CiAgICAgICAgcmV0dXJuIE1hdHJpeDMuY2xvbmUodmFsdWVzLCByZXN1bHQpOwogICAgICB9OwogICAgICBNYXRyaXgzLmZyb21Sb3dNYWpvckFycmF5ID0gZnVuY3Rpb24odmFsdWVzLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoInZhbHVlcyIsIHZhbHVlcyk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBNYXRyaXgzKAogICAgICAgICAgICB2YWx1ZXNbMF0sCiAgICAgICAgICAgIHZhbHVlc1sxXSwKICAgICAgICAgICAgdmFsdWVzWzJdLAogICAgICAgICAgICB2YWx1ZXNbM10sCiAgICAgICAgICAgIHZhbHVlc1s0XSwKICAgICAgICAgICAgdmFsdWVzWzVdLAogICAgICAgICAgICB2YWx1ZXNbNl0sCiAgICAgICAgICAgIHZhbHVlc1s3XSwKICAgICAgICAgICAgdmFsdWVzWzhdCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXN1bHRbMF0gPSB2YWx1ZXNbMF07CiAgICAgICAgcmVzdWx0WzFdID0gdmFsdWVzWzNdOwogICAgICAgIHJlc3VsdFsyXSA9IHZhbHVlc1s2XTsKICAgICAgICByZXN1bHRbM10gPSB2YWx1ZXNbMV07CiAgICAgICAgcmVzdWx0WzRdID0gdmFsdWVzWzRdOwogICAgICAgIHJlc3VsdFs1XSA9IHZhbHVlc1s3XTsKICAgICAgICByZXN1bHRbNl0gPSB2YWx1ZXNbMl07CiAgICAgICAgcmVzdWx0WzddID0gdmFsdWVzWzVdOwogICAgICAgIHJlc3VsdFs4XSA9IHZhbHVlc1s4XTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXgzLmZyb21RdWF0ZXJuaW9uID0gZnVuY3Rpb24ocXVhdGVybmlvbiwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJxdWF0ZXJuaW9uIiwgcXVhdGVybmlvbik7CiAgICAgICAgY29uc3QgeDIgPSBxdWF0ZXJuaW9uLnggKiBxdWF0ZXJuaW9uLng7CiAgICAgICAgY29uc3QgeHkgPSBxdWF0ZXJuaW9uLnggKiBxdWF0ZXJuaW9uLnk7CiAgICAgICAgY29uc3QgeHogPSBxdWF0ZXJuaW9uLnggKiBxdWF0ZXJuaW9uLno7CiAgICAgICAgY29uc3QgeHcgPSBxdWF0ZXJuaW9uLnggKiBxdWF0ZXJuaW9uLnc7CiAgICAgICAgY29uc3QgeTIgPSBxdWF0ZXJuaW9uLnkgKiBxdWF0ZXJuaW9uLnk7CiAgICAgICAgY29uc3QgeXogPSBxdWF0ZXJuaW9uLnkgKiBxdWF0ZXJuaW9uLno7CiAgICAgICAgY29uc3QgeXcgPSBxdWF0ZXJuaW9uLnkgKiBxdWF0ZXJuaW9uLnc7CiAgICAgICAgY29uc3QgejIgPSBxdWF0ZXJuaW9uLnogKiBxdWF0ZXJuaW9uLno7CiAgICAgICAgY29uc3QgencgPSBxdWF0ZXJuaW9uLnogKiBxdWF0ZXJuaW9uLnc7CiAgICAgICAgY29uc3QgdzIgPSBxdWF0ZXJuaW9uLncgKiBxdWF0ZXJuaW9uLnc7CiAgICAgICAgY29uc3QgbTAwID0geDIgLSB5MiAtIHoyICsgdzI7CiAgICAgICAgY29uc3QgbTAxID0gMiAqICh4eSAtIHp3KTsKICAgICAgICBjb25zdCBtMDIgPSAyICogKHh6ICsgeXcpOwogICAgICAgIGNvbnN0IG0xMCA9IDIgKiAoeHkgKyB6dyk7CiAgICAgICAgY29uc3QgbTExID0gLXgyICsgeTIgLSB6MiArIHcyOwogICAgICAgIGNvbnN0IG0xMiA9IDIgKiAoeXogLSB4dyk7CiAgICAgICAgY29uc3QgbTIwID0gMiAqICh4eiAtIHl3KTsKICAgICAgICBjb25zdCBtMjEgPSAyICogKHl6ICsgeHcpOwogICAgICAgIGNvbnN0IG0yMiA9IC14MiAtIHkyICsgejIgKyB3MjsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IE1hdHJpeDMobTAwLCBtMDEsIG0wMiwgbTEwLCBtMTEsIG0xMiwgbTIwLCBtMjEsIG0yMik7CiAgICAgICAgfQogICAgICAgIHJlc3VsdFswXSA9IG0wMDsKICAgICAgICByZXN1bHRbMV0gPSBtMTA7CiAgICAgICAgcmVzdWx0WzJdID0gbTIwOwogICAgICAgIHJlc3VsdFszXSA9IG0wMTsKICAgICAgICByZXN1bHRbNF0gPSBtMTE7CiAgICAgICAgcmVzdWx0WzVdID0gbTIxOwogICAgICAgIHJlc3VsdFs2XSA9IG0wMjsKICAgICAgICByZXN1bHRbN10gPSBtMTI7CiAgICAgICAgcmVzdWx0WzhdID0gbTIyOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDMuZnJvbUhlYWRpbmdQaXRjaFJvbGwgPSBmdW5jdGlvbihoZWFkaW5nUGl0Y2hSb2xsLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImhlYWRpbmdQaXRjaFJvbGwiLCBoZWFkaW5nUGl0Y2hSb2xsKTsKICAgICAgICBjb25zdCBjb3NUaGV0YSA9IE1hdGguY29zKC1oZWFkaW5nUGl0Y2hSb2xsLnBpdGNoKTsKICAgICAgICBjb25zdCBjb3NQc2kgPSBNYXRoLmNvcygtaGVhZGluZ1BpdGNoUm9sbC5oZWFkaW5nKTsKICAgICAgICBjb25zdCBjb3NQaGkgPSBNYXRoLmNvcyhoZWFkaW5nUGl0Y2hSb2xsLnJvbGwpOwogICAgICAgIGNvbnN0IHNpblRoZXRhID0gTWF0aC5zaW4oLWhlYWRpbmdQaXRjaFJvbGwucGl0Y2gpOwogICAgICAgIGNvbnN0IHNpblBzaSA9IE1hdGguc2luKC1oZWFkaW5nUGl0Y2hSb2xsLmhlYWRpbmcpOwogICAgICAgIGNvbnN0IHNpblBoaSA9IE1hdGguc2luKGhlYWRpbmdQaXRjaFJvbGwucm9sbCk7CiAgICAgICAgY29uc3QgbTAwID0gY29zVGhldGEgKiBjb3NQc2k7CiAgICAgICAgY29uc3QgbTAxID0gLWNvc1BoaSAqIHNpblBzaSArIHNpblBoaSAqIHNpblRoZXRhICogY29zUHNpOwogICAgICAgIGNvbnN0IG0wMiA9IHNpblBoaSAqIHNpblBzaSArIGNvc1BoaSAqIHNpblRoZXRhICogY29zUHNpOwogICAgICAgIGNvbnN0IG0xMCA9IGNvc1RoZXRhICogc2luUHNpOwogICAgICAgIGNvbnN0IG0xMSA9IGNvc1BoaSAqIGNvc1BzaSArIHNpblBoaSAqIHNpblRoZXRhICogc2luUHNpOwogICAgICAgIGNvbnN0IG0xMiA9IC1zaW5QaGkgKiBjb3NQc2kgKyBjb3NQaGkgKiBzaW5UaGV0YSAqIHNpblBzaTsKICAgICAgICBjb25zdCBtMjAgPSAtc2luVGhldGE7CiAgICAgICAgY29uc3QgbTIxID0gc2luUGhpICogY29zVGhldGE7CiAgICAgICAgY29uc3QgbTIyID0gY29zUGhpICogY29zVGhldGE7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBNYXRyaXgzKG0wMCwgbTAxLCBtMDIsIG0xMCwgbTExLCBtMTIsIG0yMCwgbTIxLCBtMjIpOwogICAgICAgIH0KICAgICAgICByZXN1bHRbMF0gPSBtMDA7CiAgICAgICAgcmVzdWx0WzFdID0gbTEwOwogICAgICAgIHJlc3VsdFsyXSA9IG0yMDsKICAgICAgICByZXN1bHRbM10gPSBtMDE7CiAgICAgICAgcmVzdWx0WzRdID0gbTExOwogICAgICAgIHJlc3VsdFs1XSA9IG0yMTsKICAgICAgICByZXN1bHRbNl0gPSBtMDI7CiAgICAgICAgcmVzdWx0WzddID0gbTEyOwogICAgICAgIHJlc3VsdFs4XSA9IG0yMjsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXgzLmZyb21TY2FsZSA9IGZ1bmN0aW9uKHNjYWxlLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInNjYWxlIiwgc2NhbGUpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgTWF0cml4MyhzY2FsZS54LCAwLCAwLCAwLCBzY2FsZS55LCAwLCAwLCAwLCBzY2FsZS56KTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0WzBdID0gc2NhbGUueDsKICAgICAgICByZXN1bHRbMV0gPSAwOwogICAgICAgIHJlc3VsdFsyXSA9IDA7CiAgICAgICAgcmVzdWx0WzNdID0gMDsKICAgICAgICByZXN1bHRbNF0gPSBzY2FsZS55OwogICAgICAgIHJlc3VsdFs1XSA9IDA7CiAgICAgICAgcmVzdWx0WzZdID0gMDsKICAgICAgICByZXN1bHRbN10gPSAwOwogICAgICAgIHJlc3VsdFs4XSA9IHNjYWxlLno7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4My5mcm9tVW5pZm9ybVNjYWxlID0gZnVuY3Rpb24oc2NhbGUsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigic2NhbGUiLCBzY2FsZSk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBNYXRyaXgzKHNjYWxlLCAwLCAwLCAwLCBzY2FsZSwgMCwgMCwgMCwgc2NhbGUpOwogICAgICAgIH0KICAgICAgICByZXN1bHRbMF0gPSBzY2FsZTsKICAgICAgICByZXN1bHRbMV0gPSAwOwogICAgICAgIHJlc3VsdFsyXSA9IDA7CiAgICAgICAgcmVzdWx0WzNdID0gMDsKICAgICAgICByZXN1bHRbNF0gPSBzY2FsZTsKICAgICAgICByZXN1bHRbNV0gPSAwOwogICAgICAgIHJlc3VsdFs2XSA9IDA7CiAgICAgICAgcmVzdWx0WzddID0gMDsKICAgICAgICByZXN1bHRbOF0gPSBzY2FsZTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXgzLmZyb21Dcm9zc1Byb2R1Y3QgPSBmdW5jdGlvbih2ZWN0b3IsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgidmVjdG9yIiwgdmVjdG9yKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IE1hdHJpeDMoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIC12ZWN0b3IueiwKICAgICAgICAgICAgdmVjdG9yLnksCiAgICAgICAgICAgIHZlY3Rvci56LAogICAgICAgICAgICAwLAogICAgICAgICAgICAtdmVjdG9yLngsCiAgICAgICAgICAgIC12ZWN0b3IueSwKICAgICAgICAgICAgdmVjdG9yLngsCiAgICAgICAgICAgIDAKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdFswXSA9IDA7CiAgICAgICAgcmVzdWx0WzFdID0gdmVjdG9yLno7CiAgICAgICAgcmVzdWx0WzJdID0gLXZlY3Rvci55OwogICAgICAgIHJlc3VsdFszXSA9IC12ZWN0b3IuejsKICAgICAgICByZXN1bHRbNF0gPSAwOwogICAgICAgIHJlc3VsdFs1XSA9IHZlY3Rvci54OwogICAgICAgIHJlc3VsdFs2XSA9IHZlY3Rvci55OwogICAgICAgIHJlc3VsdFs3XSA9IC12ZWN0b3IueDsKICAgICAgICByZXN1bHRbOF0gPSAwOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDMuZnJvbVJvdGF0aW9uWCA9IGZ1bmN0aW9uKGFuZ2xlLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoImFuZ2xlIiwgYW5nbGUpOwogICAgICAgIGNvbnN0IGNvc0FuZ2xlID0gTWF0aC5jb3MoYW5nbGUpOwogICAgICAgIGNvbnN0IHNpbkFuZ2xlID0gTWF0aC5zaW4oYW5nbGUpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgTWF0cml4MygKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgY29zQW5nbGUsCiAgICAgICAgICAgIC1zaW5BbmdsZSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgc2luQW5nbGUsCiAgICAgICAgICAgIGNvc0FuZ2xlCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXN1bHRbMF0gPSAxOwogICAgICAgIHJlc3VsdFsxXSA9IDA7CiAgICAgICAgcmVzdWx0WzJdID0gMDsKICAgICAgICByZXN1bHRbM10gPSAwOwogICAgICAgIHJlc3VsdFs0XSA9IGNvc0FuZ2xlOwogICAgICAgIHJlc3VsdFs1XSA9IHNpbkFuZ2xlOwogICAgICAgIHJlc3VsdFs2XSA9IDA7CiAgICAgICAgcmVzdWx0WzddID0gLXNpbkFuZ2xlOwogICAgICAgIHJlc3VsdFs4XSA9IGNvc0FuZ2xlOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDMuZnJvbVJvdGF0aW9uWSA9IGZ1bmN0aW9uKGFuZ2xlLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoImFuZ2xlIiwgYW5nbGUpOwogICAgICAgIGNvbnN0IGNvc0FuZ2xlID0gTWF0aC5jb3MoYW5nbGUpOwogICAgICAgIGNvbnN0IHNpbkFuZ2xlID0gTWF0aC5zaW4oYW5nbGUpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgTWF0cml4MygKICAgICAgICAgICAgY29zQW5nbGUsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIHNpbkFuZ2xlLAogICAgICAgICAgICAwLAogICAgICAgICAgICAxLAogICAgICAgICAgICAwLAogICAgICAgICAgICAtc2luQW5nbGUsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIGNvc0FuZ2xlCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXN1bHRbMF0gPSBjb3NBbmdsZTsKICAgICAgICByZXN1bHRbMV0gPSAwOwogICAgICAgIHJlc3VsdFsyXSA9IC1zaW5BbmdsZTsKICAgICAgICByZXN1bHRbM10gPSAwOwogICAgICAgIHJlc3VsdFs0XSA9IDE7CiAgICAgICAgcmVzdWx0WzVdID0gMDsKICAgICAgICByZXN1bHRbNl0gPSBzaW5BbmdsZTsKICAgICAgICByZXN1bHRbN10gPSAwOwogICAgICAgIHJlc3VsdFs4XSA9IGNvc0FuZ2xlOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDMuZnJvbVJvdGF0aW9uWiA9IGZ1bmN0aW9uKGFuZ2xlLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoImFuZ2xlIiwgYW5nbGUpOwogICAgICAgIGNvbnN0IGNvc0FuZ2xlID0gTWF0aC5jb3MoYW5nbGUpOwogICAgICAgIGNvbnN0IHNpbkFuZ2xlID0gTWF0aC5zaW4oYW5nbGUpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgTWF0cml4MygKICAgICAgICAgICAgY29zQW5nbGUsCiAgICAgICAgICAgIC1zaW5BbmdsZSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgc2luQW5nbGUsCiAgICAgICAgICAgIGNvc0FuZ2xlLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAxCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXN1bHRbMF0gPSBjb3NBbmdsZTsKICAgICAgICByZXN1bHRbMV0gPSBzaW5BbmdsZTsKICAgICAgICByZXN1bHRbMl0gPSAwOwogICAgICAgIHJlc3VsdFszXSA9IC1zaW5BbmdsZTsKICAgICAgICByZXN1bHRbNF0gPSBjb3NBbmdsZTsKICAgICAgICByZXN1bHRbNV0gPSAwOwogICAgICAgIHJlc3VsdFs2XSA9IDA7CiAgICAgICAgcmVzdWx0WzddID0gMDsKICAgICAgICByZXN1bHRbOF0gPSAxOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDMudG9BcnJheSA9IGZ1bmN0aW9uKG1hdHJpeCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIG1hdHJpeFswXSwKICAgICAgICAgICAgbWF0cml4WzFdLAogICAgICAgICAgICBtYXRyaXhbMl0sCiAgICAgICAgICAgIG1hdHJpeFszXSwKICAgICAgICAgICAgbWF0cml4WzRdLAogICAgICAgICAgICBtYXRyaXhbNV0sCiAgICAgICAgICAgIG1hdHJpeFs2XSwKICAgICAgICAgICAgbWF0cml4WzddLAogICAgICAgICAgICBtYXRyaXhbOF0KICAgICAgICAgIF07CiAgICAgICAgfQogICAgICAgIHJlc3VsdFswXSA9IG1hdHJpeFswXTsKICAgICAgICByZXN1bHRbMV0gPSBtYXRyaXhbMV07CiAgICAgICAgcmVzdWx0WzJdID0gbWF0cml4WzJdOwogICAgICAgIHJlc3VsdFszXSA9IG1hdHJpeFszXTsKICAgICAgICByZXN1bHRbNF0gPSBtYXRyaXhbNF07CiAgICAgICAgcmVzdWx0WzVdID0gbWF0cml4WzVdOwogICAgICAgIHJlc3VsdFs2XSA9IG1hdHJpeFs2XTsKICAgICAgICByZXN1bHRbN10gPSBtYXRyaXhbN107CiAgICAgICAgcmVzdWx0WzhdID0gbWF0cml4WzhdOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDMuZ2V0RWxlbWVudEluZGV4ID0gZnVuY3Rpb24oY29sdW1uLCByb3cpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygicm93Iiwgcm93LCAwKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygicm93Iiwgcm93LCAyKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiY29sdW1uIiwgY29sdW1uLCAwKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiY29sdW1uIiwgY29sdW1uLCAyKTsKICAgICAgICByZXR1cm4gY29sdW1uICogMyArIHJvdzsKICAgICAgfTsKICAgICAgTWF0cml4My5nZXRDb2x1bW4gPSBmdW5jdGlvbihtYXRyaXgsIGluZGV4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImluZGV4IiwgaW5kZXgsIDApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJpbmRleCIsIGluZGV4LCAyKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGluZGV4ICogMzsKICAgICAgICBjb25zdCB4ID0gbWF0cml4W3N0YXJ0SW5kZXhdOwogICAgICAgIGNvbnN0IHkgPSBtYXRyaXhbc3RhcnRJbmRleCArIDFdOwogICAgICAgIGNvbnN0IHogPSBtYXRyaXhbc3RhcnRJbmRleCArIDJdOwogICAgICAgIHJlc3VsdC54ID0geDsKICAgICAgICByZXN1bHQueSA9IHk7CiAgICAgICAgcmVzdWx0LnogPSB6OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDMuc2V0Q29sdW1uID0gZnVuY3Rpb24obWF0cml4LCBpbmRleCwgY2FydGVzaWFuMTEsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF0cml4IiwgbWF0cml4KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiaW5kZXgiLCBpbmRleCwgMCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImluZGV4IiwgaW5kZXgsIDIpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQgPSBNYXRyaXgzLmNsb25lKG1hdHJpeCwgcmVzdWx0KTsKICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gaW5kZXggKiAzOwogICAgICAgIHJlc3VsdFtzdGFydEluZGV4XSA9IGNhcnRlc2lhbjExLng7CiAgICAgICAgcmVzdWx0W3N0YXJ0SW5kZXggKyAxXSA9IGNhcnRlc2lhbjExLnk7CiAgICAgICAgcmVzdWx0W3N0YXJ0SW5kZXggKyAyXSA9IGNhcnRlc2lhbjExLno7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4My5nZXRSb3cgPSBmdW5jdGlvbihtYXRyaXgsIGluZGV4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImluZGV4IiwgaW5kZXgsIDApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJpbmRleCIsIGluZGV4LCAyKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3QgeCA9IG1hdHJpeFtpbmRleF07CiAgICAgICAgY29uc3QgeSA9IG1hdHJpeFtpbmRleCArIDNdOwogICAgICAgIGNvbnN0IHogPSBtYXRyaXhbaW5kZXggKyA2XTsKICAgICAgICByZXN1bHQueCA9IHg7CiAgICAgICAgcmVzdWx0LnkgPSB5OwogICAgICAgIHJlc3VsdC56ID0gejsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXgzLnNldFJvdyA9IGZ1bmN0aW9uKG1hdHJpeCwgaW5kZXgsIGNhcnRlc2lhbjExLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImluZGV4IiwgaW5kZXgsIDApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJpbmRleCIsIGluZGV4LCAyKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsIGNhcnRlc2lhbjExKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0ID0gTWF0cml4My5jbG9uZShtYXRyaXgsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0W2luZGV4XSA9IGNhcnRlc2lhbjExLng7CiAgICAgICAgcmVzdWx0W2luZGV4ICsgM10gPSBjYXJ0ZXNpYW4xMS55OwogICAgICAgIHJlc3VsdFtpbmRleCArIDZdID0gY2FydGVzaWFuMTEuejsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBzY2FsZVNjcmF0Y2gxID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBNYXRyaXgzLnNldFNjYWxlID0gZnVuY3Rpb24obWF0cml4LCBzY2FsZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic2NhbGUiLCBzY2FsZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IGV4aXN0aW5nU2NhbGUgPSBNYXRyaXgzLmdldFNjYWxlKG1hdHJpeCwgc2NhbGVTY3JhdGNoMSk7CiAgICAgICAgY29uc3Qgc2NhbGVSYXRpb1ggPSBzY2FsZS54IC8gZXhpc3RpbmdTY2FsZS54OwogICAgICAgIGNvbnN0IHNjYWxlUmF0aW9ZID0gc2NhbGUueSAvIGV4aXN0aW5nU2NhbGUueTsKICAgICAgICBjb25zdCBzY2FsZVJhdGlvWiA9IHNjYWxlLnogLyBleGlzdGluZ1NjYWxlLno7CiAgICAgICAgcmVzdWx0WzBdID0gbWF0cml4WzBdICogc2NhbGVSYXRpb1g7CiAgICAgICAgcmVzdWx0WzFdID0gbWF0cml4WzFdICogc2NhbGVSYXRpb1g7CiAgICAgICAgcmVzdWx0WzJdID0gbWF0cml4WzJdICogc2NhbGVSYXRpb1g7CiAgICAgICAgcmVzdWx0WzNdID0gbWF0cml4WzNdICogc2NhbGVSYXRpb1k7CiAgICAgICAgcmVzdWx0WzRdID0gbWF0cml4WzRdICogc2NhbGVSYXRpb1k7CiAgICAgICAgcmVzdWx0WzVdID0gbWF0cml4WzVdICogc2NhbGVSYXRpb1k7CiAgICAgICAgcmVzdWx0WzZdID0gbWF0cml4WzZdICogc2NhbGVSYXRpb1o7CiAgICAgICAgcmVzdWx0WzddID0gbWF0cml4WzddICogc2NhbGVSYXRpb1o7CiAgICAgICAgcmVzdWx0WzhdID0gbWF0cml4WzhdICogc2NhbGVSYXRpb1o7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgc2NhbGVTY3JhdGNoMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgTWF0cml4My5zZXRVbmlmb3JtU2NhbGUgPSBmdW5jdGlvbihtYXRyaXgsIHNjYWxlLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJzY2FsZSIsIHNjYWxlKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3QgZXhpc3RpbmdTY2FsZSA9IE1hdHJpeDMuZ2V0U2NhbGUobWF0cml4LCBzY2FsZVNjcmF0Y2gyKTsKICAgICAgICBjb25zdCBzY2FsZVJhdGlvWCA9IHNjYWxlIC8gZXhpc3RpbmdTY2FsZS54OwogICAgICAgIGNvbnN0IHNjYWxlUmF0aW9ZID0gc2NhbGUgLyBleGlzdGluZ1NjYWxlLnk7CiAgICAgICAgY29uc3Qgc2NhbGVSYXRpb1ogPSBzY2FsZSAvIGV4aXN0aW5nU2NhbGUuejsKICAgICAgICByZXN1bHRbMF0gPSBtYXRyaXhbMF0gKiBzY2FsZVJhdGlvWDsKICAgICAgICByZXN1bHRbMV0gPSBtYXRyaXhbMV0gKiBzY2FsZVJhdGlvWDsKICAgICAgICByZXN1bHRbMl0gPSBtYXRyaXhbMl0gKiBzY2FsZVJhdGlvWDsKICAgICAgICByZXN1bHRbM10gPSBtYXRyaXhbM10gKiBzY2FsZVJhdGlvWTsKICAgICAgICByZXN1bHRbNF0gPSBtYXRyaXhbNF0gKiBzY2FsZVJhdGlvWTsKICAgICAgICByZXN1bHRbNV0gPSBtYXRyaXhbNV0gKiBzY2FsZVJhdGlvWTsKICAgICAgICByZXN1bHRbNl0gPSBtYXRyaXhbNl0gKiBzY2FsZVJhdGlvWjsKICAgICAgICByZXN1bHRbN10gPSBtYXRyaXhbN10gKiBzY2FsZVJhdGlvWjsKICAgICAgICByZXN1bHRbOF0gPSBtYXRyaXhbOF0gKiBzY2FsZVJhdGlvWjsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBzY3JhdGNoQ29sdW1uID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBNYXRyaXgzLmdldFNjYWxlID0gZnVuY3Rpb24obWF0cml4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC54ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZSgKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tRWxlbWVudHMobWF0cml4WzBdLCBtYXRyaXhbMV0sIG1hdHJpeFsyXSwgc2NyYXRjaENvbHVtbikKICAgICAgICApOwogICAgICAgIHJlc3VsdC55ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZSgKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tRWxlbWVudHMobWF0cml4WzNdLCBtYXRyaXhbNF0sIG1hdHJpeFs1XSwgc2NyYXRjaENvbHVtbikKICAgICAgICApOwogICAgICAgIHJlc3VsdC56ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZSgKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tRWxlbWVudHMobWF0cml4WzZdLCBtYXRyaXhbN10sIG1hdHJpeFs4XSwgc2NyYXRjaENvbHVtbikKICAgICAgICApOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHNjYWxlU2NyYXRjaDMgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIE1hdHJpeDMuZ2V0TWF4aW11bVNjYWxlID0gZnVuY3Rpb24obWF0cml4KSB7CiAgICAgICAgTWF0cml4My5nZXRTY2FsZShtYXRyaXgsIHNjYWxlU2NyYXRjaDMpOwogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4zX2RlZmF1bHQubWF4aW11bUNvbXBvbmVudChzY2FsZVNjcmF0Y2gzKTsKICAgICAgfTsKICAgICAgc2NhbGVTY3JhdGNoNCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgTWF0cml4My5zZXRSb3RhdGlvbiA9IGZ1bmN0aW9uKG1hdHJpeCwgcm90YXRpb24sIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF0cml4IiwgbWF0cml4KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3Qgc2NhbGUgPSBNYXRyaXgzLmdldFNjYWxlKG1hdHJpeCwgc2NhbGVTY3JhdGNoNCk7CiAgICAgICAgcmVzdWx0WzBdID0gcm90YXRpb25bMF0gKiBzY2FsZS54OwogICAgICAgIHJlc3VsdFsxXSA9IHJvdGF0aW9uWzFdICogc2NhbGUueDsKICAgICAgICByZXN1bHRbMl0gPSByb3RhdGlvblsyXSAqIHNjYWxlLng7CiAgICAgICAgcmVzdWx0WzNdID0gcm90YXRpb25bM10gKiBzY2FsZS55OwogICAgICAgIHJlc3VsdFs0XSA9IHJvdGF0aW9uWzRdICogc2NhbGUueTsKICAgICAgICByZXN1bHRbNV0gPSByb3RhdGlvbls1XSAqIHNjYWxlLnk7CiAgICAgICAgcmVzdWx0WzZdID0gcm90YXRpb25bNl0gKiBzY2FsZS56OwogICAgICAgIHJlc3VsdFs3XSA9IHJvdGF0aW9uWzddICogc2NhbGUuejsKICAgICAgICByZXN1bHRbOF0gPSByb3RhdGlvbls4XSAqIHNjYWxlLno7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgc2NhbGVTY3JhdGNoNSA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgTWF0cml4My5nZXRSb3RhdGlvbiA9IGZ1bmN0aW9uKG1hdHJpeCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBjb25zdCBzY2FsZSA9IE1hdHJpeDMuZ2V0U2NhbGUobWF0cml4LCBzY2FsZVNjcmF0Y2g1KTsKICAgICAgICByZXN1bHRbMF0gPSBtYXRyaXhbMF0gLyBzY2FsZS54OwogICAgICAgIHJlc3VsdFsxXSA9IG1hdHJpeFsxXSAvIHNjYWxlLng7CiAgICAgICAgcmVzdWx0WzJdID0gbWF0cml4WzJdIC8gc2NhbGUueDsKICAgICAgICByZXN1bHRbM10gPSBtYXRyaXhbM10gLyBzY2FsZS55OwogICAgICAgIHJlc3VsdFs0XSA9IG1hdHJpeFs0XSAvIHNjYWxlLnk7CiAgICAgICAgcmVzdWx0WzVdID0gbWF0cml4WzVdIC8gc2NhbGUueTsKICAgICAgICByZXN1bHRbNl0gPSBtYXRyaXhbNl0gLyBzY2FsZS56OwogICAgICAgIHJlc3VsdFs3XSA9IG1hdHJpeFs3XSAvIHNjYWxlLno7CiAgICAgICAgcmVzdWx0WzhdID0gbWF0cml4WzhdIC8gc2NhbGUuejsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXgzLm11bHRpcGx5ID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IGNvbHVtbjBSb3cwID0gbGVmdFswXSAqIHJpZ2h0WzBdICsgbGVmdFszXSAqIHJpZ2h0WzFdICsgbGVmdFs2XSAqIHJpZ2h0WzJdOwogICAgICAgIGNvbnN0IGNvbHVtbjBSb3cxID0gbGVmdFsxXSAqIHJpZ2h0WzBdICsgbGVmdFs0XSAqIHJpZ2h0WzFdICsgbGVmdFs3XSAqIHJpZ2h0WzJdOwogICAgICAgIGNvbnN0IGNvbHVtbjBSb3cyID0gbGVmdFsyXSAqIHJpZ2h0WzBdICsgbGVmdFs1XSAqIHJpZ2h0WzFdICsgbGVmdFs4XSAqIHJpZ2h0WzJdOwogICAgICAgIGNvbnN0IGNvbHVtbjFSb3cwID0gbGVmdFswXSAqIHJpZ2h0WzNdICsgbGVmdFszXSAqIHJpZ2h0WzRdICsgbGVmdFs2XSAqIHJpZ2h0WzVdOwogICAgICAgIGNvbnN0IGNvbHVtbjFSb3cxID0gbGVmdFsxXSAqIHJpZ2h0WzNdICsgbGVmdFs0XSAqIHJpZ2h0WzRdICsgbGVmdFs3XSAqIHJpZ2h0WzVdOwogICAgICAgIGNvbnN0IGNvbHVtbjFSb3cyID0gbGVmdFsyXSAqIHJpZ2h0WzNdICsgbGVmdFs1XSAqIHJpZ2h0WzRdICsgbGVmdFs4XSAqIHJpZ2h0WzVdOwogICAgICAgIGNvbnN0IGNvbHVtbjJSb3cwID0gbGVmdFswXSAqIHJpZ2h0WzZdICsgbGVmdFszXSAqIHJpZ2h0WzddICsgbGVmdFs2XSAqIHJpZ2h0WzhdOwogICAgICAgIGNvbnN0IGNvbHVtbjJSb3cxID0gbGVmdFsxXSAqIHJpZ2h0WzZdICsgbGVmdFs0XSAqIHJpZ2h0WzddICsgbGVmdFs3XSAqIHJpZ2h0WzhdOwogICAgICAgIGNvbnN0IGNvbHVtbjJSb3cyID0gbGVmdFsyXSAqIHJpZ2h0WzZdICsgbGVmdFs1XSAqIHJpZ2h0WzddICsgbGVmdFs4XSAqIHJpZ2h0WzhdOwogICAgICAgIHJlc3VsdFswXSA9IGNvbHVtbjBSb3cwOwogICAgICAgIHJlc3VsdFsxXSA9IGNvbHVtbjBSb3cxOwogICAgICAgIHJlc3VsdFsyXSA9IGNvbHVtbjBSb3cyOwogICAgICAgIHJlc3VsdFszXSA9IGNvbHVtbjFSb3cwOwogICAgICAgIHJlc3VsdFs0XSA9IGNvbHVtbjFSb3cxOwogICAgICAgIHJlc3VsdFs1XSA9IGNvbHVtbjFSb3cyOwogICAgICAgIHJlc3VsdFs2XSA9IGNvbHVtbjJSb3cwOwogICAgICAgIHJlc3VsdFs3XSA9IGNvbHVtbjJSb3cxOwogICAgICAgIHJlc3VsdFs4XSA9IGNvbHVtbjJSb3cyOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDMuYWRkID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdFswXSA9IGxlZnRbMF0gKyByaWdodFswXTsKICAgICAgICByZXN1bHRbMV0gPSBsZWZ0WzFdICsgcmlnaHRbMV07CiAgICAgICAgcmVzdWx0WzJdID0gbGVmdFsyXSArIHJpZ2h0WzJdOwogICAgICAgIHJlc3VsdFszXSA9IGxlZnRbM10gKyByaWdodFszXTsKICAgICAgICByZXN1bHRbNF0gPSBsZWZ0WzRdICsgcmlnaHRbNF07CiAgICAgICAgcmVzdWx0WzVdID0gbGVmdFs1XSArIHJpZ2h0WzVdOwogICAgICAgIHJlc3VsdFs2XSA9IGxlZnRbNl0gKyByaWdodFs2XTsKICAgICAgICByZXN1bHRbN10gPSBsZWZ0WzddICsgcmlnaHRbN107CiAgICAgICAgcmVzdWx0WzhdID0gbGVmdFs4XSArIHJpZ2h0WzhdOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDMuc3VidHJhY3QgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0WzBdID0gbGVmdFswXSAtIHJpZ2h0WzBdOwogICAgICAgIHJlc3VsdFsxXSA9IGxlZnRbMV0gLSByaWdodFsxXTsKICAgICAgICByZXN1bHRbMl0gPSBsZWZ0WzJdIC0gcmlnaHRbMl07CiAgICAgICAgcmVzdWx0WzNdID0gbGVmdFszXSAtIHJpZ2h0WzNdOwogICAgICAgIHJlc3VsdFs0XSA9IGxlZnRbNF0gLSByaWdodFs0XTsKICAgICAgICByZXN1bHRbNV0gPSBsZWZ0WzVdIC0gcmlnaHRbNV07CiAgICAgICAgcmVzdWx0WzZdID0gbGVmdFs2XSAtIHJpZ2h0WzZdOwogICAgICAgIHJlc3VsdFs3XSA9IGxlZnRbN10gLSByaWdodFs3XTsKICAgICAgICByZXN1bHRbOF0gPSBsZWZ0WzhdIC0gcmlnaHRbOF07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4My5tdWx0aXBseUJ5VmVjdG9yID0gZnVuY3Rpb24obWF0cml4LCBjYXJ0ZXNpYW4xMSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBjb25zdCB2WCA9IGNhcnRlc2lhbjExLng7CiAgICAgICAgY29uc3QgdlkgPSBjYXJ0ZXNpYW4xMS55OwogICAgICAgIGNvbnN0IHZaID0gY2FydGVzaWFuMTEuejsKICAgICAgICBjb25zdCB4ID0gbWF0cml4WzBdICogdlggKyBtYXRyaXhbM10gKiB2WSArIG1hdHJpeFs2XSAqIHZaOwogICAgICAgIGNvbnN0IHkgPSBtYXRyaXhbMV0gKiB2WCArIG1hdHJpeFs0XSAqIHZZICsgbWF0cml4WzddICogdlo7CiAgICAgICAgY29uc3QgeiA9IG1hdHJpeFsyXSAqIHZYICsgbWF0cml4WzVdICogdlkgKyBtYXRyaXhbOF0gKiB2WjsKICAgICAgICByZXN1bHQueCA9IHg7CiAgICAgICAgcmVzdWx0LnkgPSB5OwogICAgICAgIHJlc3VsdC56ID0gejsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXgzLm11bHRpcGx5QnlTY2FsYXIgPSBmdW5jdGlvbihtYXRyaXgsIHNjYWxhciwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigic2NhbGFyIiwgc2NhbGFyKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0WzBdID0gbWF0cml4WzBdICogc2NhbGFyOwogICAgICAgIHJlc3VsdFsxXSA9IG1hdHJpeFsxXSAqIHNjYWxhcjsKICAgICAgICByZXN1bHRbMl0gPSBtYXRyaXhbMl0gKiBzY2FsYXI7CiAgICAgICAgcmVzdWx0WzNdID0gbWF0cml4WzNdICogc2NhbGFyOwogICAgICAgIHJlc3VsdFs0XSA9IG1hdHJpeFs0XSAqIHNjYWxhcjsKICAgICAgICByZXN1bHRbNV0gPSBtYXRyaXhbNV0gKiBzY2FsYXI7CiAgICAgICAgcmVzdWx0WzZdID0gbWF0cml4WzZdICogc2NhbGFyOwogICAgICAgIHJlc3VsdFs3XSA9IG1hdHJpeFs3XSAqIHNjYWxhcjsKICAgICAgICByZXN1bHRbOF0gPSBtYXRyaXhbOF0gKiBzY2FsYXI7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4My5tdWx0aXBseUJ5U2NhbGUgPSBmdW5jdGlvbihtYXRyaXgsIHNjYWxlLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJzY2FsZSIsIHNjYWxlKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0WzBdID0gbWF0cml4WzBdICogc2NhbGUueDsKICAgICAgICByZXN1bHRbMV0gPSBtYXRyaXhbMV0gKiBzY2FsZS54OwogICAgICAgIHJlc3VsdFsyXSA9IG1hdHJpeFsyXSAqIHNjYWxlLng7CiAgICAgICAgcmVzdWx0WzNdID0gbWF0cml4WzNdICogc2NhbGUueTsKICAgICAgICByZXN1bHRbNF0gPSBtYXRyaXhbNF0gKiBzY2FsZS55OwogICAgICAgIHJlc3VsdFs1XSA9IG1hdHJpeFs1XSAqIHNjYWxlLnk7CiAgICAgICAgcmVzdWx0WzZdID0gbWF0cml4WzZdICogc2NhbGUuejsKICAgICAgICByZXN1bHRbN10gPSBtYXRyaXhbN10gKiBzY2FsZS56OwogICAgICAgIHJlc3VsdFs4XSA9IG1hdHJpeFs4XSAqIHNjYWxlLno7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4My5tdWx0aXBseUJ5VW5pZm9ybVNjYWxlID0gZnVuY3Rpb24obWF0cml4LCBzY2FsZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigic2NhbGUiLCBzY2FsZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdFswXSA9IG1hdHJpeFswXSAqIHNjYWxlOwogICAgICAgIHJlc3VsdFsxXSA9IG1hdHJpeFsxXSAqIHNjYWxlOwogICAgICAgIHJlc3VsdFsyXSA9IG1hdHJpeFsyXSAqIHNjYWxlOwogICAgICAgIHJlc3VsdFszXSA9IG1hdHJpeFszXSAqIHNjYWxlOwogICAgICAgIHJlc3VsdFs0XSA9IG1hdHJpeFs0XSAqIHNjYWxlOwogICAgICAgIHJlc3VsdFs1XSA9IG1hdHJpeFs1XSAqIHNjYWxlOwogICAgICAgIHJlc3VsdFs2XSA9IG1hdHJpeFs2XSAqIHNjYWxlOwogICAgICAgIHJlc3VsdFs3XSA9IG1hdHJpeFs3XSAqIHNjYWxlOwogICAgICAgIHJlc3VsdFs4XSA9IG1hdHJpeFs4XSAqIHNjYWxlOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDMubmVnYXRlID0gZnVuY3Rpb24obWF0cml4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdFswXSA9IC1tYXRyaXhbMF07CiAgICAgICAgcmVzdWx0WzFdID0gLW1hdHJpeFsxXTsKICAgICAgICByZXN1bHRbMl0gPSAtbWF0cml4WzJdOwogICAgICAgIHJlc3VsdFszXSA9IC1tYXRyaXhbM107CiAgICAgICAgcmVzdWx0WzRdID0gLW1hdHJpeFs0XTsKICAgICAgICByZXN1bHRbNV0gPSAtbWF0cml4WzVdOwogICAgICAgIHJlc3VsdFs2XSA9IC1tYXRyaXhbNl07CiAgICAgICAgcmVzdWx0WzddID0gLW1hdHJpeFs3XTsKICAgICAgICByZXN1bHRbOF0gPSAtbWF0cml4WzhdOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDMudHJhbnNwb3NlID0gZnVuY3Rpb24obWF0cml4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IGNvbHVtbjBSb3cwID0gbWF0cml4WzBdOwogICAgICAgIGNvbnN0IGNvbHVtbjBSb3cxID0gbWF0cml4WzNdOwogICAgICAgIGNvbnN0IGNvbHVtbjBSb3cyID0gbWF0cml4WzZdOwogICAgICAgIGNvbnN0IGNvbHVtbjFSb3cwID0gbWF0cml4WzFdOwogICAgICAgIGNvbnN0IGNvbHVtbjFSb3cxID0gbWF0cml4WzRdOwogICAgICAgIGNvbnN0IGNvbHVtbjFSb3cyID0gbWF0cml4WzddOwogICAgICAgIGNvbnN0IGNvbHVtbjJSb3cwID0gbWF0cml4WzJdOwogICAgICAgIGNvbnN0IGNvbHVtbjJSb3cxID0gbWF0cml4WzVdOwogICAgICAgIGNvbnN0IGNvbHVtbjJSb3cyID0gbWF0cml4WzhdOwogICAgICAgIHJlc3VsdFswXSA9IGNvbHVtbjBSb3cwOwogICAgICAgIHJlc3VsdFsxXSA9IGNvbHVtbjBSb3cxOwogICAgICAgIHJlc3VsdFsyXSA9IGNvbHVtbjBSb3cyOwogICAgICAgIHJlc3VsdFszXSA9IGNvbHVtbjFSb3cwOwogICAgICAgIHJlc3VsdFs0XSA9IGNvbHVtbjFSb3cxOwogICAgICAgIHJlc3VsdFs1XSA9IGNvbHVtbjFSb3cyOwogICAgICAgIHJlc3VsdFs2XSA9IGNvbHVtbjJSb3cwOwogICAgICAgIHJlc3VsdFs3XSA9IGNvbHVtbjJSb3cxOwogICAgICAgIHJlc3VsdFs4XSA9IGNvbHVtbjJSb3cyOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHJvd1ZhbCA9IFsxLCAwLCAwXTsKICAgICAgY29sVmFsID0gWzIsIDIsIDFdOwogICAgICBqTWF0cml4ID0gbmV3IE1hdHJpeDMoKTsKICAgICAgak1hdHJpeFRyYW5zcG9zZSA9IG5ldyBNYXRyaXgzKCk7CiAgICAgIE1hdHJpeDMuY29tcHV0ZUVpZ2VuRGVjb21wb3NpdGlvbiA9IGZ1bmN0aW9uKG1hdHJpeCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIGNvbnN0IHRvbGVyYW5jZSA9IE1hdGhfZGVmYXVsdC5FUFNJTE9OMjA7CiAgICAgICAgY29uc3QgbWF4U3dlZXBzID0gMTA7CiAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICBsZXQgc3dlZXAgPSAwOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IHt9OwogICAgICAgIH0KICAgICAgICBjb25zdCB1bml0YXJ5TWF0cml4ID0gcmVzdWx0LnVuaXRhcnkgPSBNYXRyaXgzLmNsb25lKAogICAgICAgICAgTWF0cml4My5JREVOVElUWSwKICAgICAgICAgIHJlc3VsdC51bml0YXJ5CiAgICAgICAgKTsKICAgICAgICBjb25zdCBkaWFnTWF0cml4ID0gcmVzdWx0LmRpYWdvbmFsID0gTWF0cml4My5jbG9uZShtYXRyaXgsIHJlc3VsdC5kaWFnb25hbCk7CiAgICAgICAgY29uc3QgZXBzaWxvbiA9IHRvbGVyYW5jZSAqIGNvbXB1dGVGcm9iZW5pdXNOb3JtKGRpYWdNYXRyaXgpOwogICAgICAgIHdoaWxlIChzd2VlcCA8IG1heFN3ZWVwcyAmJiBvZmZEaWFnb25hbEZyb2Jlbml1c05vcm0oZGlhZ01hdHJpeCkgPiBlcHNpbG9uKSB7CiAgICAgICAgICBzaHVyRGVjb21wb3NpdGlvbihkaWFnTWF0cml4LCBqTWF0cml4KTsKICAgICAgICAgIE1hdHJpeDMudHJhbnNwb3NlKGpNYXRyaXgsIGpNYXRyaXhUcmFuc3Bvc2UpOwogICAgICAgICAgTWF0cml4My5tdWx0aXBseShkaWFnTWF0cml4LCBqTWF0cml4LCBkaWFnTWF0cml4KTsKICAgICAgICAgIE1hdHJpeDMubXVsdGlwbHkoak1hdHJpeFRyYW5zcG9zZSwgZGlhZ01hdHJpeCwgZGlhZ01hdHJpeCk7CiAgICAgICAgICBNYXRyaXgzLm11bHRpcGx5KHVuaXRhcnlNYXRyaXgsIGpNYXRyaXgsIHVuaXRhcnlNYXRyaXgpOwogICAgICAgICAgaWYgKCsrY291bnQgPiAyKSB7CiAgICAgICAgICAgICsrc3dlZXA7CiAgICAgICAgICAgIGNvdW50ID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4My5hYnMgPSBmdW5jdGlvbihtYXRyaXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF0cml4IiwgbWF0cml4KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0WzBdID0gTWF0aC5hYnMobWF0cml4WzBdKTsKICAgICAgICByZXN1bHRbMV0gPSBNYXRoLmFicyhtYXRyaXhbMV0pOwogICAgICAgIHJlc3VsdFsyXSA9IE1hdGguYWJzKG1hdHJpeFsyXSk7CiAgICAgICAgcmVzdWx0WzNdID0gTWF0aC5hYnMobWF0cml4WzNdKTsKICAgICAgICByZXN1bHRbNF0gPSBNYXRoLmFicyhtYXRyaXhbNF0pOwogICAgICAgIHJlc3VsdFs1XSA9IE1hdGguYWJzKG1hdHJpeFs1XSk7CiAgICAgICAgcmVzdWx0WzZdID0gTWF0aC5hYnMobWF0cml4WzZdKTsKICAgICAgICByZXN1bHRbN10gPSBNYXRoLmFicyhtYXRyaXhbN10pOwogICAgICAgIHJlc3VsdFs4XSA9IE1hdGguYWJzKG1hdHJpeFs4XSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4My5kZXRlcm1pbmFudCA9IGZ1bmN0aW9uKG1hdHJpeCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF0cml4IiwgbWF0cml4KTsKICAgICAgICBjb25zdCBtMTEgPSBtYXRyaXhbMF07CiAgICAgICAgY29uc3QgbTIxID0gbWF0cml4WzNdOwogICAgICAgIGNvbnN0IG0zMSA9IG1hdHJpeFs2XTsKICAgICAgICBjb25zdCBtMTIgPSBtYXRyaXhbMV07CiAgICAgICAgY29uc3QgbTIyID0gbWF0cml4WzRdOwogICAgICAgIGNvbnN0IG0zMiA9IG1hdHJpeFs3XTsKICAgICAgICBjb25zdCBtMTMgPSBtYXRyaXhbMl07CiAgICAgICAgY29uc3QgbTIzID0gbWF0cml4WzVdOwogICAgICAgIGNvbnN0IG0zMyA9IG1hdHJpeFs4XTsKICAgICAgICByZXR1cm4gbTExICogKG0yMiAqIG0zMyAtIG0yMyAqIG0zMikgKyBtMTIgKiAobTIzICogbTMxIC0gbTIxICogbTMzKSArIG0xMyAqIChtMjEgKiBtMzIgLSBtMjIgKiBtMzEpOwogICAgICB9OwogICAgICBNYXRyaXgzLmludmVyc2UgPSBmdW5jdGlvbihtYXRyaXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF0cml4IiwgbWF0cml4KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3QgbTExID0gbWF0cml4WzBdOwogICAgICAgIGNvbnN0IG0yMSA9IG1hdHJpeFsxXTsKICAgICAgICBjb25zdCBtMzEgPSBtYXRyaXhbMl07CiAgICAgICAgY29uc3QgbTEyID0gbWF0cml4WzNdOwogICAgICAgIGNvbnN0IG0yMiA9IG1hdHJpeFs0XTsKICAgICAgICBjb25zdCBtMzIgPSBtYXRyaXhbNV07CiAgICAgICAgY29uc3QgbTEzID0gbWF0cml4WzZdOwogICAgICAgIGNvbnN0IG0yMyA9IG1hdHJpeFs3XTsKICAgICAgICBjb25zdCBtMzMgPSBtYXRyaXhbOF07CiAgICAgICAgY29uc3QgZGV0ZXJtaW5hbnQgPSBNYXRyaXgzLmRldGVybWluYW50KG1hdHJpeCk7CiAgICAgICAgaWYgKE1hdGguYWJzKGRldGVybWluYW50KSA8PSBNYXRoX2RlZmF1bHQuRVBTSUxPTjE1KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgibWF0cml4IGlzIG5vdCBpbnZlcnRpYmxlIik7CiAgICAgICAgfQogICAgICAgIHJlc3VsdFswXSA9IG0yMiAqIG0zMyAtIG0yMyAqIG0zMjsKICAgICAgICByZXN1bHRbMV0gPSBtMjMgKiBtMzEgLSBtMjEgKiBtMzM7CiAgICAgICAgcmVzdWx0WzJdID0gbTIxICogbTMyIC0gbTIyICogbTMxOwogICAgICAgIHJlc3VsdFszXSA9IG0xMyAqIG0zMiAtIG0xMiAqIG0zMzsKICAgICAgICByZXN1bHRbNF0gPSBtMTEgKiBtMzMgLSBtMTMgKiBtMzE7CiAgICAgICAgcmVzdWx0WzVdID0gbTEyICogbTMxIC0gbTExICogbTMyOwogICAgICAgIHJlc3VsdFs2XSA9IG0xMiAqIG0yMyAtIG0xMyAqIG0yMjsKICAgICAgICByZXN1bHRbN10gPSBtMTMgKiBtMjEgLSBtMTEgKiBtMjM7CiAgICAgICAgcmVzdWx0WzhdID0gbTExICogbTIyIC0gbTEyICogbTIxOwogICAgICAgIGNvbnN0IHNjYWxlID0gMSAvIGRldGVybWluYW50OwogICAgICAgIHJldHVybiBNYXRyaXgzLm11bHRpcGx5QnlTY2FsYXIocmVzdWx0LCBzY2FsZSwgcmVzdWx0KTsKICAgICAgfTsKICAgICAgc2NyYXRjaFRyYW5zcG9zZU1hdHJpeCA9IG5ldyBNYXRyaXgzKCk7CiAgICAgIE1hdHJpeDMuaW52ZXJzZVRyYW5zcG9zZSA9IGZ1bmN0aW9uKG1hdHJpeCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXR1cm4gTWF0cml4My5pbnZlcnNlKAogICAgICAgICAgTWF0cml4My50cmFuc3Bvc2UobWF0cml4LCBzY3JhdGNoVHJhbnNwb3NlTWF0cml4KSwKICAgICAgICAgIHJlc3VsdAogICAgICAgICk7CiAgICAgIH07CiAgICAgIE1hdHJpeDMuZXF1YWxzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQpIHsKICAgICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgZGVmaW5lZF9kZWZhdWx0KGxlZnQpICYmIGRlZmluZWRfZGVmYXVsdChyaWdodCkgJiYgbGVmdFswXSA9PT0gcmlnaHRbMF0gJiYgbGVmdFsxXSA9PT0gcmlnaHRbMV0gJiYgbGVmdFsyXSA9PT0gcmlnaHRbMl0gJiYgbGVmdFszXSA9PT0gcmlnaHRbM10gJiYgbGVmdFs0XSA9PT0gcmlnaHRbNF0gJiYgbGVmdFs1XSA9PT0gcmlnaHRbNV0gJiYgbGVmdFs2XSA9PT0gcmlnaHRbNl0gJiYgbGVmdFs3XSA9PT0gcmlnaHRbN10gJiYgbGVmdFs4XSA9PT0gcmlnaHRbOF07CiAgICAgIH07CiAgICAgIE1hdHJpeDMuZXF1YWxzRXBzaWxvbiA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBlcHNpbG9uKSB7CiAgICAgICAgZXBzaWxvbiA9IGVwc2lsb24gPz8gMDsKICAgICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgZGVmaW5lZF9kZWZhdWx0KGxlZnQpICYmIGRlZmluZWRfZGVmYXVsdChyaWdodCkgJiYgTWF0aC5hYnMobGVmdFswXSAtIHJpZ2h0WzBdKSA8PSBlcHNpbG9uICYmIE1hdGguYWJzKGxlZnRbMV0gLSByaWdodFsxXSkgPD0gZXBzaWxvbiAmJiBNYXRoLmFicyhsZWZ0WzJdIC0gcmlnaHRbMl0pIDw9IGVwc2lsb24gJiYgTWF0aC5hYnMobGVmdFszXSAtIHJpZ2h0WzNdKSA8PSBlcHNpbG9uICYmIE1hdGguYWJzKGxlZnRbNF0gLSByaWdodFs0XSkgPD0gZXBzaWxvbiAmJiBNYXRoLmFicyhsZWZ0WzVdIC0gcmlnaHRbNV0pIDw9IGVwc2lsb24gJiYgTWF0aC5hYnMobGVmdFs2XSAtIHJpZ2h0WzZdKSA8PSBlcHNpbG9uICYmIE1hdGguYWJzKGxlZnRbN10gLSByaWdodFs3XSkgPD0gZXBzaWxvbiAmJiBNYXRoLmFicyhsZWZ0WzhdIC0gcmlnaHRbOF0pIDw9IGVwc2lsb247CiAgICAgIH07CiAgICAgIE1hdHJpeDMuSURFTlRJVFkgPSBPYmplY3QuZnJlZXplKAogICAgICAgIG5ldyBNYXRyaXgzKDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEpCiAgICAgICk7CiAgICAgIE1hdHJpeDMuWkVSTyA9IE9iamVjdC5mcmVlemUoCiAgICAgICAgbmV3IE1hdHJpeDMoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCkKICAgICAgKTsKICAgICAgTWF0cml4My5DT0xVTU4wUk9XMCA9IDA7CiAgICAgIE1hdHJpeDMuQ09MVU1OMFJPVzEgPSAxOwogICAgICBNYXRyaXgzLkNPTFVNTjBST1cyID0gMjsKICAgICAgTWF0cml4My5DT0xVTU4xUk9XMCA9IDM7CiAgICAgIE1hdHJpeDMuQ09MVU1OMVJPVzEgPSA0OwogICAgICBNYXRyaXgzLkNPTFVNTjFST1cyID0gNTsKICAgICAgTWF0cml4My5DT0xVTU4yUk9XMCA9IDY7CiAgICAgIE1hdHJpeDMuQ09MVU1OMlJPVzEgPSA3OwogICAgICBNYXRyaXgzLkNPTFVNTjJST1cyID0gODsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTWF0cml4My5wcm90b3R5cGUsIHsKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24uCiAgICAgICAgICogQG1lbWJlcm9mIE1hdHJpeDMucHJvdG90eXBlCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqLwogICAgICAgIGxlbmd0aDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIE1hdHJpeDMucGFja2VkTGVuZ3RoOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIE1hdHJpeDMucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIE1hdHJpeDMuY2xvbmUodGhpcywgcmVzdWx0KTsKICAgICAgfTsKICAgICAgTWF0cml4My5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24ocmlnaHQpIHsKICAgICAgICByZXR1cm4gTWF0cml4My5lcXVhbHModGhpcywgcmlnaHQpOwogICAgICB9OwogICAgICBNYXRyaXgzLmVxdWFsc0FycmF5ID0gZnVuY3Rpb24obWF0cml4LCBhcnJheSwgb2Zmc2V0KSB7CiAgICAgICAgcmV0dXJuIG1hdHJpeFswXSA9PT0gYXJyYXlbb2Zmc2V0XSAmJiBtYXRyaXhbMV0gPT09IGFycmF5W29mZnNldCArIDFdICYmIG1hdHJpeFsyXSA9PT0gYXJyYXlbb2Zmc2V0ICsgMl0gJiYgbWF0cml4WzNdID09PSBhcnJheVtvZmZzZXQgKyAzXSAmJiBtYXRyaXhbNF0gPT09IGFycmF5W29mZnNldCArIDRdICYmIG1hdHJpeFs1XSA9PT0gYXJyYXlbb2Zmc2V0ICsgNV0gJiYgbWF0cml4WzZdID09PSBhcnJheVtvZmZzZXQgKyA2XSAmJiBtYXRyaXhbN10gPT09IGFycmF5W29mZnNldCArIDddICYmIG1hdHJpeFs4XSA9PT0gYXJyYXlbb2Zmc2V0ICsgOF07CiAgICAgIH07CiAgICAgIE1hdHJpeDMucHJvdG90eXBlLmVxdWFsc0Vwc2lsb24gPSBmdW5jdGlvbihyaWdodCwgZXBzaWxvbikgewogICAgICAgIHJldHVybiBNYXRyaXgzLmVxdWFsc0Vwc2lsb24odGhpcywgcmlnaHQsIGVwc2lsb24pOwogICAgICB9OwogICAgICBNYXRyaXgzLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBgKCR7dGhpc1swXX0sICR7dGhpc1szXX0sICR7dGhpc1s2XX0pCigke3RoaXNbMV19LCAke3RoaXNbNF19LCAke3RoaXNbN119KQooJHt0aGlzWzJdfSwgJHt0aGlzWzVdfSwgJHt0aGlzWzhdfSlgOwogICAgICB9OwogICAgICBNYXRyaXgzX2RlZmF1bHQgPSBNYXRyaXgzOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ2FydGVzaWFuNC5qcwogIGZ1bmN0aW9uIENhcnRlc2lhbjQoeCwgeSwgeiwgdykgewogICAgdGhpcy54ID0geCA/PyAwOwogICAgdGhpcy55ID0geSA/PyAwOwogICAgdGhpcy56ID0geiA/PyAwOwogICAgdGhpcy53ID0gdyA/PyAwOwogIH0KICB2YXIgZGlzdGFuY2VTY3JhdGNoMywgbGVycFNjcmF0Y2gzLCBtb3N0T3J0aG9nb25hbEF4aXNTY3JhdGNoMywgc2NyYXRjaEYzMkFycmF5LCBzY3JhdGNoVThBcnJheSwgdGVzdFUzMiwgdGVzdFU4LCBsaXR0bGVFbmRpYW4sIENhcnRlc2lhbjRfZGVmYXVsdDsKICB2YXIgaW5pdF9DYXJ0ZXNpYW40ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9DYXJ0ZXNpYW40LmpzIigpIHsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgQ2FydGVzaWFuNC5mcm9tRWxlbWVudHMgPSBmdW5jdGlvbih4LCB5LCB6LCB3LCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENhcnRlc2lhbjQoeCwgeSwgeiwgdyk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC54ID0geDsKICAgICAgICByZXN1bHQueSA9IHk7CiAgICAgICAgcmVzdWx0LnogPSB6OwogICAgICAgIHJlc3VsdC53ID0gdzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW40LmZyb21Db2xvciA9IGZ1bmN0aW9uKGNvbG9yLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNvbG9yIiwgY29sb3IpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgQ2FydGVzaWFuNChjb2xvci5yZWQsIGNvbG9yLmdyZWVuLCBjb2xvci5ibHVlLCBjb2xvci5hbHBoYSk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC54ID0gY29sb3IucmVkOwogICAgICAgIHJlc3VsdC55ID0gY29sb3IuZ3JlZW47CiAgICAgICAgcmVzdWx0LnogPSBjb2xvci5ibHVlOwogICAgICAgIHJlc3VsdC53ID0gY29sb3IuYWxwaGE7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuNC5jbG9uZSA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChjYXJ0ZXNpYW4xMSkpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgQ2FydGVzaWFuNChjYXJ0ZXNpYW4xMS54LCBjYXJ0ZXNpYW4xMS55LCBjYXJ0ZXNpYW4xMS56LCBjYXJ0ZXNpYW4xMS53KTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnggPSBjYXJ0ZXNpYW4xMS54OwogICAgICAgIHJlc3VsdC55ID0gY2FydGVzaWFuMTEueTsKICAgICAgICByZXN1bHQueiA9IGNhcnRlc2lhbjExLno7CiAgICAgICAgcmVzdWx0LncgPSBjYXJ0ZXNpYW4xMS53OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjQucGFja2VkTGVuZ3RoID0gNDsKICAgICAgQ2FydGVzaWFuNC5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLng7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLnk7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLno7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleF0gPSB2YWx1ZS53OwogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuNC51bnBhY2sgPSBmdW5jdGlvbihhcnJheSwgc3RhcnRpbmdJbmRleCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBDYXJ0ZXNpYW40KCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC54ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICByZXN1bHQueSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0LnogPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdC53ID0gYXJyYXlbc3RhcnRpbmdJbmRleF07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuNC5wYWNrQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CiAgICAgICAgY29uc3QgcmVzdWx0TGVuZ3RoID0gbGVuZ3RoICogNDsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXkocmVzdWx0TGVuZ3RoKTsKICAgICAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0Lmxlbmd0aCAhPT0gcmVzdWx0TGVuZ3RoKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgIklmIHJlc3VsdCBpcyBhIHR5cGVkIGFycmF5LCBpdCBtdXN0IGhhdmUgZXhhY3RseSBhcnJheS5sZW5ndGggKiA0IGVsZW1lbnRzIgogICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5sZW5ndGggIT09IHJlc3VsdExlbmd0aCkgewogICAgICAgICAgcmVzdWx0Lmxlbmd0aCA9IHJlc3VsdExlbmd0aDsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgQ2FydGVzaWFuNC5wYWNrKGFycmF5W2ldLCByZXN1bHQsIGkgKiA0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuNC51bnBhY2tBcnJheSA9IGZ1bmN0aW9uKGFycmF5LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJhcnJheS5sZW5ndGgiLCBhcnJheS5sZW5ndGgsIDQpOwogICAgICAgIGlmIChhcnJheS5sZW5ndGggJSA0ICE9PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXJyYXkgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KGxlbmd0aCAvIDQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQubGVuZ3RoID0gbGVuZ3RoIC8gNDsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gNCkgewogICAgICAgICAgY29uc3QgaW5kZXggPSBpIC8gNDsKICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBDYXJ0ZXNpYW40LnVucGFjayhhcnJheSwgaSwgcmVzdWx0W2luZGV4XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjQuZnJvbUFycmF5ID0gQ2FydGVzaWFuNC51bnBhY2s7CiAgICAgIENhcnRlc2lhbjQubWF4aW11bUNvbXBvbmVudCA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGNhcnRlc2lhbjExLngsIGNhcnRlc2lhbjExLnksIGNhcnRlc2lhbjExLnosIGNhcnRlc2lhbjExLncpOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW40Lm1pbmltdW1Db21wb25lbnQgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIHJldHVybiBNYXRoLm1pbihjYXJ0ZXNpYW4xMS54LCBjYXJ0ZXNpYW4xMS55LCBjYXJ0ZXNpYW4xMS56LCBjYXJ0ZXNpYW4xMS53KTsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuNC5taW5pbXVtQnlDb21wb25lbnQgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImZpcnN0IiwgZmlyc3QpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic2Vjb25kIiwgc2Vjb25kKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBNYXRoLm1pbihmaXJzdC54LCBzZWNvbmQueCk7CiAgICAgICAgcmVzdWx0LnkgPSBNYXRoLm1pbihmaXJzdC55LCBzZWNvbmQueSk7CiAgICAgICAgcmVzdWx0LnogPSBNYXRoLm1pbihmaXJzdC56LCBzZWNvbmQueik7CiAgICAgICAgcmVzdWx0LncgPSBNYXRoLm1pbihmaXJzdC53LCBzZWNvbmQudyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuNC5tYXhpbXVtQnlDb21wb25lbnQgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImZpcnN0IiwgZmlyc3QpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic2Vjb25kIiwgc2Vjb25kKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBNYXRoLm1heChmaXJzdC54LCBzZWNvbmQueCk7CiAgICAgICAgcmVzdWx0LnkgPSBNYXRoLm1heChmaXJzdC55LCBzZWNvbmQueSk7CiAgICAgICAgcmVzdWx0LnogPSBNYXRoLm1heChmaXJzdC56LCBzZWNvbmQueik7CiAgICAgICAgcmVzdWx0LncgPSBNYXRoLm1heChmaXJzdC53LCBzZWNvbmQudyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuNC5jbGFtcCA9IGZ1bmN0aW9uKHZhbHVlLCBtaW4zLCBtYXgzLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWluIiwgbWluMyk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXgiLCBtYXgzKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3QgeCA9IE1hdGhfZGVmYXVsdC5jbGFtcCh2YWx1ZS54LCBtaW4zLngsIG1heDMueCk7CiAgICAgICAgY29uc3QgeSA9IE1hdGhfZGVmYXVsdC5jbGFtcCh2YWx1ZS55LCBtaW4zLnksIG1heDMueSk7CiAgICAgICAgY29uc3QgeiA9IE1hdGhfZGVmYXVsdC5jbGFtcCh2YWx1ZS56LCBtaW4zLnosIG1heDMueik7CiAgICAgICAgY29uc3QgdyA9IE1hdGhfZGVmYXVsdC5jbGFtcCh2YWx1ZS53LCBtaW4zLncsIG1heDMudyk7CiAgICAgICAgcmVzdWx0LnggPSB4OwogICAgICAgIHJlc3VsdC55ID0geTsKICAgICAgICByZXN1bHQueiA9IHo7CiAgICAgICAgcmVzdWx0LncgPSB3OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjQubWFnbml0dWRlU3F1YXJlZCA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgcmV0dXJuIGNhcnRlc2lhbjExLnggKiBjYXJ0ZXNpYW4xMS54ICsgY2FydGVzaWFuMTEueSAqIGNhcnRlc2lhbjExLnkgKyBjYXJ0ZXNpYW4xMS56ICogY2FydGVzaWFuMTEueiArIGNhcnRlc2lhbjExLncgKiBjYXJ0ZXNpYW4xMS53OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW40Lm1hZ25pdHVkZSA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExKSB7CiAgICAgICAgcmV0dXJuIE1hdGguc3FydChDYXJ0ZXNpYW40Lm1hZ25pdHVkZVNxdWFyZWQoY2FydGVzaWFuMTEpKTsKICAgICAgfTsKICAgICAgZGlzdGFuY2VTY3JhdGNoMyA9IG5ldyBDYXJ0ZXNpYW40KCk7CiAgICAgIENhcnRlc2lhbjQuZGlzdGFuY2UgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2FydGVzaWFuNC5zdWJ0cmFjdChsZWZ0LCByaWdodCwgZGlzdGFuY2VTY3JhdGNoMyk7CiAgICAgICAgcmV0dXJuIENhcnRlc2lhbjQubWFnbml0dWRlKGRpc3RhbmNlU2NyYXRjaDMpOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW40LmRpc3RhbmNlU3F1YXJlZCA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDYXJ0ZXNpYW40LnN1YnRyYWN0KGxlZnQsIHJpZ2h0LCBkaXN0YW5jZVNjcmF0Y2gzKTsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuNC5tYWduaXR1ZGVTcXVhcmVkKGRpc3RhbmNlU2NyYXRjaDMpOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW40Lm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsIGNhcnRlc2lhbjExKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3QgbWFnbml0dWRlID0gQ2FydGVzaWFuNC5tYWduaXR1ZGUoY2FydGVzaWFuMTEpOwogICAgICAgIHJlc3VsdC54ID0gY2FydGVzaWFuMTEueCAvIG1hZ25pdHVkZTsKICAgICAgICByZXN1bHQueSA9IGNhcnRlc2lhbjExLnkgLyBtYWduaXR1ZGU7CiAgICAgICAgcmVzdWx0LnogPSBjYXJ0ZXNpYW4xMS56IC8gbWFnbml0dWRlOwogICAgICAgIHJlc3VsdC53ID0gY2FydGVzaWFuMTEudyAvIG1hZ25pdHVkZTsKICAgICAgICBpZiAoaXNOYU4ocmVzdWx0LngpIHx8IGlzTmFOKHJlc3VsdC55KSB8fCBpc05hTihyZXN1bHQueikgfHwgaXNOYU4ocmVzdWx0LncpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjQuZG90ID0gZnVuY3Rpb24obGVmdCwgcmlnaHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImxlZnQiLCBsZWZ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJpZ2h0IiwgcmlnaHQpOwogICAgICAgIHJldHVybiBsZWZ0LnggKiByaWdodC54ICsgbGVmdC55ICogcmlnaHQueSArIGxlZnQueiAqIHJpZ2h0LnogKyBsZWZ0LncgKiByaWdodC53OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW40Lm11bHRpcGx5Q29tcG9uZW50cyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImxlZnQiLCBsZWZ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJpZ2h0IiwgcmlnaHQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IGxlZnQueCAqIHJpZ2h0Lng7CiAgICAgICAgcmVzdWx0LnkgPSBsZWZ0LnkgKiByaWdodC55OwogICAgICAgIHJlc3VsdC56ID0gbGVmdC56ICogcmlnaHQuejsKICAgICAgICByZXN1bHQudyA9IGxlZnQudyAqIHJpZ2h0Lnc7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuNC5kaXZpZGVDb21wb25lbnRzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC54ID0gbGVmdC54IC8gcmlnaHQueDsKICAgICAgICByZXN1bHQueSA9IGxlZnQueSAvIHJpZ2h0Lnk7CiAgICAgICAgcmVzdWx0LnogPSBsZWZ0LnogLyByaWdodC56OwogICAgICAgIHJlc3VsdC53ID0gbGVmdC53IC8gcmlnaHQudzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW40LmFkZCA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImxlZnQiLCBsZWZ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJpZ2h0IiwgcmlnaHQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IGxlZnQueCArIHJpZ2h0Lng7CiAgICAgICAgcmVzdWx0LnkgPSBsZWZ0LnkgKyByaWdodC55OwogICAgICAgIHJlc3VsdC56ID0gbGVmdC56ICsgcmlnaHQuejsKICAgICAgICByZXN1bHQudyA9IGxlZnQudyArIHJpZ2h0Lnc7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuNC5zdWJ0cmFjdCA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImxlZnQiLCBsZWZ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJpZ2h0IiwgcmlnaHQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IGxlZnQueCAtIHJpZ2h0Lng7CiAgICAgICAgcmVzdWx0LnkgPSBsZWZ0LnkgLSByaWdodC55OwogICAgICAgIHJlc3VsdC56ID0gbGVmdC56IC0gcmlnaHQuejsKICAgICAgICByZXN1bHQudyA9IGxlZnQudyAtIHJpZ2h0Lnc7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuNC5tdWx0aXBseUJ5U2NhbGFyID0gZnVuY3Rpb24oY2FydGVzaWFuMTEsIHNjYWxhciwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJzY2FsYXIiLCBzY2FsYXIpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IGNhcnRlc2lhbjExLnggKiBzY2FsYXI7CiAgICAgICAgcmVzdWx0LnkgPSBjYXJ0ZXNpYW4xMS55ICogc2NhbGFyOwogICAgICAgIHJlc3VsdC56ID0gY2FydGVzaWFuMTEueiAqIHNjYWxhcjsKICAgICAgICByZXN1bHQudyA9IGNhcnRlc2lhbjExLncgKiBzY2FsYXI7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuNC5kaXZpZGVCeVNjYWxhciA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExLCBzY2FsYXIsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigic2NhbGFyIiwgc2NhbGFyKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBjYXJ0ZXNpYW4xMS54IC8gc2NhbGFyOwogICAgICAgIHJlc3VsdC55ID0gY2FydGVzaWFuMTEueSAvIHNjYWxhcjsKICAgICAgICByZXN1bHQueiA9IGNhcnRlc2lhbjExLnogLyBzY2FsYXI7CiAgICAgICAgcmVzdWx0LncgPSBjYXJ0ZXNpYW4xMS53IC8gc2NhbGFyOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjQubmVnYXRlID0gZnVuY3Rpb24oY2FydGVzaWFuMTEsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IC1jYXJ0ZXNpYW4xMS54OwogICAgICAgIHJlc3VsdC55ID0gLWNhcnRlc2lhbjExLnk7CiAgICAgICAgcmVzdWx0LnogPSAtY2FydGVzaWFuMTEuejsKICAgICAgICByZXN1bHQudyA9IC1jYXJ0ZXNpYW4xMS53OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjQuYWJzID0gZnVuY3Rpb24oY2FydGVzaWFuMTEsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IE1hdGguYWJzKGNhcnRlc2lhbjExLngpOwogICAgICAgIHJlc3VsdC55ID0gTWF0aC5hYnMoY2FydGVzaWFuMTEueSk7CiAgICAgICAgcmVzdWx0LnogPSBNYXRoLmFicyhjYXJ0ZXNpYW4xMS56KTsKICAgICAgICByZXN1bHQudyA9IE1hdGguYWJzKGNhcnRlc2lhbjExLncpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIGxlcnBTY3JhdGNoMyA9IG5ldyBDYXJ0ZXNpYW40KCk7CiAgICAgIENhcnRlc2lhbjQubGVycCA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic3RhcnQiLCBzdGFydCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJlbmQiLCBlbmQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigidCIsIHQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBDYXJ0ZXNpYW40Lm11bHRpcGx5QnlTY2FsYXIoZW5kLCB0LCBsZXJwU2NyYXRjaDMpOwogICAgICAgIHJlc3VsdCA9IENhcnRlc2lhbjQubXVsdGlwbHlCeVNjYWxhcihzdGFydCwgMSAtIHQsIHJlc3VsdCk7CiAgICAgICAgcmV0dXJuIENhcnRlc2lhbjQuYWRkKGxlcnBTY3JhdGNoMywgcmVzdWx0LCByZXN1bHQpOwogICAgICB9OwogICAgICBtb3N0T3J0aG9nb25hbEF4aXNTY3JhdGNoMyA9IG5ldyBDYXJ0ZXNpYW40KCk7CiAgICAgIENhcnRlc2lhbjQubW9zdE9ydGhvZ29uYWxBeGlzID0gZnVuY3Rpb24oY2FydGVzaWFuMTEsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBjb25zdCBmID0gQ2FydGVzaWFuNC5ub3JtYWxpemUoY2FydGVzaWFuMTEsIG1vc3RPcnRob2dvbmFsQXhpc1NjcmF0Y2gzKTsKICAgICAgICBDYXJ0ZXNpYW40LmFicyhmLCBmKTsKICAgICAgICBpZiAoZi54IDw9IGYueSkgewogICAgICAgICAgaWYgKGYueCA8PSBmLnopIHsKICAgICAgICAgICAgaWYgKGYueCA8PSBmLncpIHsKICAgICAgICAgICAgICByZXN1bHQgPSBDYXJ0ZXNpYW40LmNsb25lKENhcnRlc2lhbjQuVU5JVF9YLCByZXN1bHQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlc3VsdCA9IENhcnRlc2lhbjQuY2xvbmUoQ2FydGVzaWFuNC5VTklUX1csIHJlc3VsdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoZi56IDw9IGYudykgewogICAgICAgICAgICByZXN1bHQgPSBDYXJ0ZXNpYW40LmNsb25lKENhcnRlc2lhbjQuVU5JVF9aLCByZXN1bHQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0ID0gQ2FydGVzaWFuNC5jbG9uZShDYXJ0ZXNpYW40LlVOSVRfVywgcmVzdWx0KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGYueSA8PSBmLnopIHsKICAgICAgICAgIGlmIChmLnkgPD0gZi53KSB7CiAgICAgICAgICAgIHJlc3VsdCA9IENhcnRlc2lhbjQuY2xvbmUoQ2FydGVzaWFuNC5VTklUX1ksIHJlc3VsdCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXN1bHQgPSBDYXJ0ZXNpYW40LmNsb25lKENhcnRlc2lhbjQuVU5JVF9XLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZi56IDw9IGYudykgewogICAgICAgICAgcmVzdWx0ID0gQ2FydGVzaWFuNC5jbG9uZShDYXJ0ZXNpYW40LlVOSVRfWiwgcmVzdWx0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0ID0gQ2FydGVzaWFuNC5jbG9uZShDYXJ0ZXNpYW40LlVOSVRfVywgcmVzdWx0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuNC5lcXVhbHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkgewogICAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodCB8fCBkZWZpbmVkX2RlZmF1bHQobGVmdCkgJiYgZGVmaW5lZF9kZWZhdWx0KHJpZ2h0KSAmJiBsZWZ0LnggPT09IHJpZ2h0LnggJiYgbGVmdC55ID09PSByaWdodC55ICYmIGxlZnQueiA9PT0gcmlnaHQueiAmJiBsZWZ0LncgPT09IHJpZ2h0Lnc7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjQuZXF1YWxzQXJyYXkgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgYXJyYXksIG9mZnNldCkgewogICAgICAgIHJldHVybiBjYXJ0ZXNpYW4xMS54ID09PSBhcnJheVtvZmZzZXRdICYmIGNhcnRlc2lhbjExLnkgPT09IGFycmF5W29mZnNldCArIDFdICYmIGNhcnRlc2lhbjExLnogPT09IGFycmF5W29mZnNldCArIDJdICYmIGNhcnRlc2lhbjExLncgPT09IGFycmF5W29mZnNldCArIDNdOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW40LmVxdWFsc0Vwc2lsb24gPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVsYXRpdmVFcHNpbG9uLCBhYnNvbHV0ZUVwc2lsb24pIHsKICAgICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgZGVmaW5lZF9kZWZhdWx0KGxlZnQpICYmIGRlZmluZWRfZGVmYXVsdChyaWdodCkgJiYgTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oCiAgICAgICAgICBsZWZ0LngsCiAgICAgICAgICByaWdodC54LAogICAgICAgICAgcmVsYXRpdmVFcHNpbG9uLAogICAgICAgICAgYWJzb2x1dGVFcHNpbG9uCiAgICAgICAgKSAmJiBNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgIGxlZnQueSwKICAgICAgICAgIHJpZ2h0LnksCiAgICAgICAgICByZWxhdGl2ZUVwc2lsb24sCiAgICAgICAgICBhYnNvbHV0ZUVwc2lsb24KICAgICAgICApICYmIE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgbGVmdC56LAogICAgICAgICAgcmlnaHQueiwKICAgICAgICAgIHJlbGF0aXZlRXBzaWxvbiwKICAgICAgICAgIGFic29sdXRlRXBzaWxvbgogICAgICAgICkgJiYgTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oCiAgICAgICAgICBsZWZ0LncsCiAgICAgICAgICByaWdodC53LAogICAgICAgICAgcmVsYXRpdmVFcHNpbG9uLAogICAgICAgICAgYWJzb2x1dGVFcHNpbG9uCiAgICAgICAgKTsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuNC5aRVJPID0gT2JqZWN0LmZyZWV6ZShuZXcgQ2FydGVzaWFuNCgwLCAwLCAwLCAwKSk7CiAgICAgIENhcnRlc2lhbjQuT05FID0gT2JqZWN0LmZyZWV6ZShuZXcgQ2FydGVzaWFuNCgxLCAxLCAxLCAxKSk7CiAgICAgIENhcnRlc2lhbjQuVU5JVF9YID0gT2JqZWN0LmZyZWV6ZShuZXcgQ2FydGVzaWFuNCgxLCAwLCAwLCAwKSk7CiAgICAgIENhcnRlc2lhbjQuVU5JVF9ZID0gT2JqZWN0LmZyZWV6ZShuZXcgQ2FydGVzaWFuNCgwLCAxLCAwLCAwKSk7CiAgICAgIENhcnRlc2lhbjQuVU5JVF9aID0gT2JqZWN0LmZyZWV6ZShuZXcgQ2FydGVzaWFuNCgwLCAwLCAxLCAwKSk7CiAgICAgIENhcnRlc2lhbjQuVU5JVF9XID0gT2JqZWN0LmZyZWV6ZShuZXcgQ2FydGVzaWFuNCgwLCAwLCAwLCAxKSk7CiAgICAgIENhcnRlc2lhbjQucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIENhcnRlc2lhbjQuY2xvbmUodGhpcywgcmVzdWx0KTsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuNC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24ocmlnaHQpIHsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuNC5lcXVhbHModGhpcywgcmlnaHQpOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW40LnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uID0gZnVuY3Rpb24ocmlnaHQsIHJlbGF0aXZlRXBzaWxvbiwgYWJzb2x1dGVFcHNpbG9uKSB7CiAgICAgICAgcmV0dXJuIENhcnRlc2lhbjQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgIHRoaXMsCiAgICAgICAgICByaWdodCwKICAgICAgICAgIHJlbGF0aXZlRXBzaWxvbiwKICAgICAgICAgIGFic29sdXRlRXBzaWxvbgogICAgICAgICk7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGAoJHt0aGlzLnh9LCAke3RoaXMueX0sICR7dGhpcy56fSwgJHt0aGlzLnd9KWA7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hGMzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoMSk7CiAgICAgIHNjcmF0Y2hVOEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoc2NyYXRjaEYzMkFycmF5LmJ1ZmZlcik7CiAgICAgIHRlc3RVMzIgPSBuZXcgVWludDMyQXJyYXkoWzI4NzQ1NDAyMF0pOwogICAgICB0ZXN0VTggPSBuZXcgVWludDhBcnJheSh0ZXN0VTMyLmJ1ZmZlcik7CiAgICAgIGxpdHRsZUVuZGlhbiA9IHRlc3RVOFswXSA9PT0gNjg7CiAgICAgIENhcnRlc2lhbjQucGFja0Zsb2F0ID0gZnVuY3Rpb24odmFsdWUsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IENhcnRlc2lhbjQoKTsKICAgICAgICB9CiAgICAgICAgc2NyYXRjaEYzMkFycmF5WzBdID0gdmFsdWU7CiAgICAgICAgaWYgKGxpdHRsZUVuZGlhbikgewogICAgICAgICAgcmVzdWx0LnggPSBzY3JhdGNoVThBcnJheVswXTsKICAgICAgICAgIHJlc3VsdC55ID0gc2NyYXRjaFU4QXJyYXlbMV07CiAgICAgICAgICByZXN1bHQueiA9IHNjcmF0Y2hVOEFycmF5WzJdOwogICAgICAgICAgcmVzdWx0LncgPSBzY3JhdGNoVThBcnJheVszXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0LnggPSBzY3JhdGNoVThBcnJheVszXTsKICAgICAgICAgIHJlc3VsdC55ID0gc2NyYXRjaFU4QXJyYXlbMl07CiAgICAgICAgICByZXN1bHQueiA9IHNjcmF0Y2hVOEFycmF5WzFdOwogICAgICAgICAgcmVzdWx0LncgPSBzY3JhdGNoVThBcnJheVswXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuNC51bnBhY2tGbG9hdCA9IGZ1bmN0aW9uKHBhY2tlZEZsb2F0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJwYWNrZWRGbG9hdCIsIHBhY2tlZEZsb2F0KTsKICAgICAgICBpZiAobGl0dGxlRW5kaWFuKSB7CiAgICAgICAgICBzY3JhdGNoVThBcnJheVswXSA9IHBhY2tlZEZsb2F0Lng7CiAgICAgICAgICBzY3JhdGNoVThBcnJheVsxXSA9IHBhY2tlZEZsb2F0Lnk7CiAgICAgICAgICBzY3JhdGNoVThBcnJheVsyXSA9IHBhY2tlZEZsb2F0Lno7CiAgICAgICAgICBzY3JhdGNoVThBcnJheVszXSA9IHBhY2tlZEZsb2F0Lnc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNjcmF0Y2hVOEFycmF5WzBdID0gcGFja2VkRmxvYXQudzsKICAgICAgICAgIHNjcmF0Y2hVOEFycmF5WzFdID0gcGFja2VkRmxvYXQuejsKICAgICAgICAgIHNjcmF0Y2hVOEFycmF5WzJdID0gcGFja2VkRmxvYXQueTsKICAgICAgICAgIHNjcmF0Y2hVOEFycmF5WzNdID0gcGFja2VkRmxvYXQueDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNjcmF0Y2hGMzJBcnJheVswXTsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuNF9kZWZhdWx0ID0gQ2FydGVzaWFuNDsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0Zyb3plbi5qcwogIHZhciBGcm96ZW4sIEZyb3plbl9kZWZhdWx0OwogIHZhciBpbml0X0Zyb3plbiA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvRnJvemVuLmpzIigpIHsKICAgICAgRnJvemVuID0ge307CiAgICAgIEZyb3plbi5FTVBUWV9PQkpFQ1QgPSBPYmplY3QuZnJlZXplKHt9KTsKICAgICAgRnJvemVuLkVNUFRZX0FSUkFZID0gT2JqZWN0LmZyZWV6ZShbXSk7CiAgICAgIEZyb3plbl9kZWZhdWx0ID0gRnJvemVuOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUnVudGltZUVycm9yLmpzCiAgZnVuY3Rpb24gUnVudGltZUVycm9yKG1lc3NhZ2UpIHsKICAgIHRoaXMubmFtZSA9ICJSdW50aW1lRXJyb3IiOwogICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKICAgIGxldCBzdGFjazsKICAgIHRyeSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigpOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzdGFjayA9IGUuc3RhY2s7CiAgICB9CiAgICB0aGlzLnN0YWNrID0gc3RhY2s7CiAgfQogIHZhciBSdW50aW1lRXJyb3JfZGVmYXVsdDsKICB2YXIgaW5pdF9SdW50aW1lRXJyb3IgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1J1bnRpbWVFcnJvci5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KE9iamVjdC5jcmVhdGUpKSB7CiAgICAgICAgUnVudGltZUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTsKICAgICAgICBSdW50aW1lRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUnVudGltZUVycm9yOwogICAgICB9CiAgICAgIFJ1bnRpbWVFcnJvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICBsZXQgc3RyID0gYCR7dGhpcy5uYW1lfTogJHt0aGlzLm1lc3NhZ2V9YDsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHRoaXMuc3RhY2spKSB7CiAgICAgICAgICBzdHIgKz0gYAoke3RoaXMuc3RhY2sudG9TdHJpbmcoKX1gOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RyOwogICAgICB9OwogICAgICBSdW50aW1lRXJyb3JfZGVmYXVsdCA9IFJ1bnRpbWVFcnJvcjsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL01hdHJpeDQuanMKICBmdW5jdGlvbiBNYXRyaXg0KGNvbHVtbjBSb3cwLCBjb2x1bW4xUm93MCwgY29sdW1uMlJvdzAsIGNvbHVtbjNSb3cwLCBjb2x1bW4wUm93MSwgY29sdW1uMVJvdzEsIGNvbHVtbjJSb3cxLCBjb2x1bW4zUm93MSwgY29sdW1uMFJvdzIsIGNvbHVtbjFSb3cyLCBjb2x1bW4yUm93MiwgY29sdW1uM1JvdzIsIGNvbHVtbjBSb3czLCBjb2x1bW4xUm93MywgY29sdW1uMlJvdzMsIGNvbHVtbjNSb3czKSB7CiAgICB0aGlzWzBdID0gY29sdW1uMFJvdzAgPz8gMDsKICAgIHRoaXNbMV0gPSBjb2x1bW4wUm93MSA/PyAwOwogICAgdGhpc1syXSA9IGNvbHVtbjBSb3cyID8/IDA7CiAgICB0aGlzWzNdID0gY29sdW1uMFJvdzMgPz8gMDsKICAgIHRoaXNbNF0gPSBjb2x1bW4xUm93MCA/PyAwOwogICAgdGhpc1s1XSA9IGNvbHVtbjFSb3cxID8/IDA7CiAgICB0aGlzWzZdID0gY29sdW1uMVJvdzIgPz8gMDsKICAgIHRoaXNbN10gPSBjb2x1bW4xUm93MyA/PyAwOwogICAgdGhpc1s4XSA9IGNvbHVtbjJSb3cwID8/IDA7CiAgICB0aGlzWzldID0gY29sdW1uMlJvdzEgPz8gMDsKICAgIHRoaXNbMTBdID0gY29sdW1uMlJvdzIgPz8gMDsKICAgIHRoaXNbMTFdID0gY29sdW1uMlJvdzMgPz8gMDsKICAgIHRoaXNbMTJdID0gY29sdW1uM1JvdzAgPz8gMDsKICAgIHRoaXNbMTNdID0gY29sdW1uM1JvdzEgPz8gMDsKICAgIHRoaXNbMTRdID0gY29sdW1uM1JvdzIgPz8gMDsKICAgIHRoaXNbMTVdID0gY29sdW1uM1JvdzMgPz8gMDsKICB9CiAgdmFyIGZyb21DYW1lcmFGLCBmcm9tQ2FtZXJhUiwgZnJvbUNhbWVyYVUsIHNjYWxlU2NyYXRjaDEyLCBzY2FsZVNjcmF0Y2gyMiwgc2NyYXRjaENvbHVtbjIsIHNjYWxlU2NyYXRjaDMyLCBzY2FsZVNjcmF0Y2g0Miwgc2NhbGVTY3JhdGNoNTIsIHNjcmF0Y2hJbnZlcnNlUm90YXRpb24sIHNjcmF0Y2hNYXRyaXgzWmVybywgc2NyYXRjaEJvdHRvbVJvdywgc2NyYXRjaEV4cGVjdGVkQm90dG9tUm93LCBzY3JhdGNoVHJhbnNwb3NlTWF0cml4MiwgTWF0cml4NF9kZWZhdWx0OwogIHZhciBpbml0X01hdHJpeDQgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL01hdHJpeDQuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW40KCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGluaXRfTWF0cml4MygpOwogICAgICBpbml0X1J1bnRpbWVFcnJvcigpOwogICAgICBNYXRyaXg0LnBhY2tlZExlbmd0aCA9IDE2OwogICAgICBNYXRyaXg0LnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWVbMF07CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlWzFdOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZVsyXTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWVbM107CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlWzRdOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZVs1XTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWVbNl07CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlWzddOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZVs4XTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWVbOV07CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlWzEwXTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWVbMTFdOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZVsxMl07CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlWzEzXTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWVbMTRdOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXhdID0gdmFsdWVbMTVdOwogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfTsKICAgICAgTWF0cml4NC51bnBhY2sgPSBmdW5jdGlvbihhcnJheSwgc3RhcnRpbmdJbmRleCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBNYXRyaXg0KCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdFswXSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0WzFdID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICByZXN1bHRbMl0gPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdFszXSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0WzRdID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICByZXN1bHRbNV0gPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdFs2XSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0WzddID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICByZXN1bHRbOF0gPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdFs5XSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0WzEwXSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0WzExXSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0WzEyXSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0WzEzXSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0WzE0XSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0WzE1XSA9IGFycmF5W3N0YXJ0aW5nSW5kZXhdOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDQucGFja0FycmF5ID0gZnVuY3Rpb24oYXJyYXksIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgICAgIGNvbnN0IHJlc3VsdExlbmd0aCA9IGxlbmd0aCAqIDE2OwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShyZXN1bHRMZW5ndGgpOwogICAgICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiByZXN1bHQubGVuZ3RoICE9PSByZXN1bHRMZW5ndGgpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAiSWYgcmVzdWx0IGlzIGEgdHlwZWQgYXJyYXksIGl0IG11c3QgaGF2ZSBleGFjdGx5IGFycmF5Lmxlbmd0aCAqIDE2IGVsZW1lbnRzIgogICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5sZW5ndGggIT09IHJlc3VsdExlbmd0aCkgewogICAgICAgICAgcmVzdWx0Lmxlbmd0aCA9IHJlc3VsdExlbmd0aDsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgTWF0cml4NC5wYWNrKGFycmF5W2ldLCByZXN1bHQsIGkgKiAxNik7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDQudW5wYWNrQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiYXJyYXkubGVuZ3RoIiwgYXJyYXkubGVuZ3RoLCAxNik7CiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCAlIDE2ICE9PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXJyYXkgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShsZW5ndGggLyAxNik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdC5sZW5ndGggPSBsZW5ndGggLyAxNjsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMTYpIHsKICAgICAgICAgIGNvbnN0IGluZGV4ID0gaSAvIDE2OwogICAgICAgICAgcmVzdWx0W2luZGV4XSA9IE1hdHJpeDQudW5wYWNrKGFycmF5LCBpLCByZXN1bHRbaW5kZXhdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4NC5jbG9uZSA9IGZ1bmN0aW9uKG1hdHJpeCwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobWF0cml4KSkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBNYXRyaXg0KAogICAgICAgICAgICBtYXRyaXhbMF0sCiAgICAgICAgICAgIG1hdHJpeFs0XSwKICAgICAgICAgICAgbWF0cml4WzhdLAogICAgICAgICAgICBtYXRyaXhbMTJdLAogICAgICAgICAgICBtYXRyaXhbMV0sCiAgICAgICAgICAgIG1hdHJpeFs1XSwKICAgICAgICAgICAgbWF0cml4WzldLAogICAgICAgICAgICBtYXRyaXhbMTNdLAogICAgICAgICAgICBtYXRyaXhbMl0sCiAgICAgICAgICAgIG1hdHJpeFs2XSwKICAgICAgICAgICAgbWF0cml4WzEwXSwKICAgICAgICAgICAgbWF0cml4WzE0XSwKICAgICAgICAgICAgbWF0cml4WzNdLAogICAgICAgICAgICBtYXRyaXhbN10sCiAgICAgICAgICAgIG1hdHJpeFsxMV0sCiAgICAgICAgICAgIG1hdHJpeFsxNV0KICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdFswXSA9IG1hdHJpeFswXTsKICAgICAgICByZXN1bHRbMV0gPSBtYXRyaXhbMV07CiAgICAgICAgcmVzdWx0WzJdID0gbWF0cml4WzJdOwogICAgICAgIHJlc3VsdFszXSA9IG1hdHJpeFszXTsKICAgICAgICByZXN1bHRbNF0gPSBtYXRyaXhbNF07CiAgICAgICAgcmVzdWx0WzVdID0gbWF0cml4WzVdOwogICAgICAgIHJlc3VsdFs2XSA9IG1hdHJpeFs2XTsKICAgICAgICByZXN1bHRbN10gPSBtYXRyaXhbN107CiAgICAgICAgcmVzdWx0WzhdID0gbWF0cml4WzhdOwogICAgICAgIHJlc3VsdFs5XSA9IG1hdHJpeFs5XTsKICAgICAgICByZXN1bHRbMTBdID0gbWF0cml4WzEwXTsKICAgICAgICByZXN1bHRbMTFdID0gbWF0cml4WzExXTsKICAgICAgICByZXN1bHRbMTJdID0gbWF0cml4WzEyXTsKICAgICAgICByZXN1bHRbMTNdID0gbWF0cml4WzEzXTsKICAgICAgICByZXN1bHRbMTRdID0gbWF0cml4WzE0XTsKICAgICAgICByZXN1bHRbMTVdID0gbWF0cml4WzE1XTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXg0LmZyb21BcnJheSA9IE1hdHJpeDQudW5wYWNrOwogICAgICBNYXRyaXg0LmZyb21Db2x1bW5NYWpvckFycmF5ID0gZnVuY3Rpb24odmFsdWVzLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoInZhbHVlcyIsIHZhbHVlcyk7CiAgICAgICAgcmV0dXJuIE1hdHJpeDQuY2xvbmUodmFsdWVzLCByZXN1bHQpOwogICAgICB9OwogICAgICBNYXRyaXg0LmZyb21Sb3dNYWpvckFycmF5ID0gZnVuY3Rpb24odmFsdWVzLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoInZhbHVlcyIsIHZhbHVlcyk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBNYXRyaXg0KAogICAgICAgICAgICB2YWx1ZXNbMF0sCiAgICAgICAgICAgIHZhbHVlc1sxXSwKICAgICAgICAgICAgdmFsdWVzWzJdLAogICAgICAgICAgICB2YWx1ZXNbM10sCiAgICAgICAgICAgIHZhbHVlc1s0XSwKICAgICAgICAgICAgdmFsdWVzWzVdLAogICAgICAgICAgICB2YWx1ZXNbNl0sCiAgICAgICAgICAgIHZhbHVlc1s3XSwKICAgICAgICAgICAgdmFsdWVzWzhdLAogICAgICAgICAgICB2YWx1ZXNbOV0sCiAgICAgICAgICAgIHZhbHVlc1sxMF0sCiAgICAgICAgICAgIHZhbHVlc1sxMV0sCiAgICAgICAgICAgIHZhbHVlc1sxMl0sCiAgICAgICAgICAgIHZhbHVlc1sxM10sCiAgICAgICAgICAgIHZhbHVlc1sxNF0sCiAgICAgICAgICAgIHZhbHVlc1sxNV0KICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdFswXSA9IHZhbHVlc1swXTsKICAgICAgICByZXN1bHRbMV0gPSB2YWx1ZXNbNF07CiAgICAgICAgcmVzdWx0WzJdID0gdmFsdWVzWzhdOwogICAgICAgIHJlc3VsdFszXSA9IHZhbHVlc1sxMl07CiAgICAgICAgcmVzdWx0WzRdID0gdmFsdWVzWzFdOwogICAgICAgIHJlc3VsdFs1XSA9IHZhbHVlc1s1XTsKICAgICAgICByZXN1bHRbNl0gPSB2YWx1ZXNbOV07CiAgICAgICAgcmVzdWx0WzddID0gdmFsdWVzWzEzXTsKICAgICAgICByZXN1bHRbOF0gPSB2YWx1ZXNbMl07CiAgICAgICAgcmVzdWx0WzldID0gdmFsdWVzWzZdOwogICAgICAgIHJlc3VsdFsxMF0gPSB2YWx1ZXNbMTBdOwogICAgICAgIHJlc3VsdFsxMV0gPSB2YWx1ZXNbMTRdOwogICAgICAgIHJlc3VsdFsxMl0gPSB2YWx1ZXNbM107CiAgICAgICAgcmVzdWx0WzEzXSA9IHZhbHVlc1s3XTsKICAgICAgICByZXN1bHRbMTRdID0gdmFsdWVzWzExXTsKICAgICAgICByZXN1bHRbMTVdID0gdmFsdWVzWzE1XTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXg0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uID0gZnVuY3Rpb24ocm90YXRpb24sIHRyYW5zbGF0aW9uMiwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyb3RhdGlvbiIsIHJvdGF0aW9uKTsKICAgICAgICB0cmFuc2xhdGlvbjIgPSB0cmFuc2xhdGlvbjIgPz8gQ2FydGVzaWFuM19kZWZhdWx0LlpFUk87CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBNYXRyaXg0KAogICAgICAgICAgICByb3RhdGlvblswXSwKICAgICAgICAgICAgcm90YXRpb25bM10sCiAgICAgICAgICAgIHJvdGF0aW9uWzZdLAogICAgICAgICAgICB0cmFuc2xhdGlvbjIueCwKICAgICAgICAgICAgcm90YXRpb25bMV0sCiAgICAgICAgICAgIHJvdGF0aW9uWzRdLAogICAgICAgICAgICByb3RhdGlvbls3XSwKICAgICAgICAgICAgdHJhbnNsYXRpb24yLnksCiAgICAgICAgICAgIHJvdGF0aW9uWzJdLAogICAgICAgICAgICByb3RhdGlvbls1XSwKICAgICAgICAgICAgcm90YXRpb25bOF0sCiAgICAgICAgICAgIHRyYW5zbGF0aW9uMi56LAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAxCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXN1bHRbMF0gPSByb3RhdGlvblswXTsKICAgICAgICByZXN1bHRbMV0gPSByb3RhdGlvblsxXTsKICAgICAgICByZXN1bHRbMl0gPSByb3RhdGlvblsyXTsKICAgICAgICByZXN1bHRbM10gPSAwOwogICAgICAgIHJlc3VsdFs0XSA9IHJvdGF0aW9uWzNdOwogICAgICAgIHJlc3VsdFs1XSA9IHJvdGF0aW9uWzRdOwogICAgICAgIHJlc3VsdFs2XSA9IHJvdGF0aW9uWzVdOwogICAgICAgIHJlc3VsdFs3XSA9IDA7CiAgICAgICAgcmVzdWx0WzhdID0gcm90YXRpb25bNl07CiAgICAgICAgcmVzdWx0WzldID0gcm90YXRpb25bN107CiAgICAgICAgcmVzdWx0WzEwXSA9IHJvdGF0aW9uWzhdOwogICAgICAgIHJlc3VsdFsxMV0gPSAwOwogICAgICAgIHJlc3VsdFsxMl0gPSB0cmFuc2xhdGlvbjIueDsKICAgICAgICByZXN1bHRbMTNdID0gdHJhbnNsYXRpb24yLnk7CiAgICAgICAgcmVzdWx0WzE0XSA9IHRyYW5zbGF0aW9uMi56OwogICAgICAgIHJlc3VsdFsxNV0gPSAxOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDQuZnJvbVRyYW5zbGF0aW9uUXVhdGVybmlvblJvdGF0aW9uU2NhbGUgPSBmdW5jdGlvbih0cmFuc2xhdGlvbjIsIHJvdGF0aW9uLCBzY2FsZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ0cmFuc2xhdGlvbiIsIHRyYW5zbGF0aW9uMik7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyb3RhdGlvbiIsIHJvdGF0aW9uKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInNjYWxlIiwgc2NhbGUpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBNYXRyaXg0KCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHNjYWxlWCA9IHNjYWxlLng7CiAgICAgICAgY29uc3Qgc2NhbGVZID0gc2NhbGUueTsKICAgICAgICBjb25zdCBzY2FsZVogPSBzY2FsZS56OwogICAgICAgIGNvbnN0IHgyID0gcm90YXRpb24ueCAqIHJvdGF0aW9uLng7CiAgICAgICAgY29uc3QgeHkgPSByb3RhdGlvbi54ICogcm90YXRpb24ueTsKICAgICAgICBjb25zdCB4eiA9IHJvdGF0aW9uLnggKiByb3RhdGlvbi56OwogICAgICAgIGNvbnN0IHh3ID0gcm90YXRpb24ueCAqIHJvdGF0aW9uLnc7CiAgICAgICAgY29uc3QgeTIgPSByb3RhdGlvbi55ICogcm90YXRpb24ueTsKICAgICAgICBjb25zdCB5eiA9IHJvdGF0aW9uLnkgKiByb3RhdGlvbi56OwogICAgICAgIGNvbnN0IHl3ID0gcm90YXRpb24ueSAqIHJvdGF0aW9uLnc7CiAgICAgICAgY29uc3QgejIgPSByb3RhdGlvbi56ICogcm90YXRpb24uejsKICAgICAgICBjb25zdCB6dyA9IHJvdGF0aW9uLnogKiByb3RhdGlvbi53OwogICAgICAgIGNvbnN0IHcyID0gcm90YXRpb24udyAqIHJvdGF0aW9uLnc7CiAgICAgICAgY29uc3QgbTAwID0geDIgLSB5MiAtIHoyICsgdzI7CiAgICAgICAgY29uc3QgbTAxID0gMiAqICh4eSAtIHp3KTsKICAgICAgICBjb25zdCBtMDIgPSAyICogKHh6ICsgeXcpOwogICAgICAgIGNvbnN0IG0xMCA9IDIgKiAoeHkgKyB6dyk7CiAgICAgICAgY29uc3QgbTExID0gLXgyICsgeTIgLSB6MiArIHcyOwogICAgICAgIGNvbnN0IG0xMiA9IDIgKiAoeXogLSB4dyk7CiAgICAgICAgY29uc3QgbTIwID0gMiAqICh4eiAtIHl3KTsKICAgICAgICBjb25zdCBtMjEgPSAyICogKHl6ICsgeHcpOwogICAgICAgIGNvbnN0IG0yMiA9IC14MiAtIHkyICsgejIgKyB3MjsKICAgICAgICByZXN1bHRbMF0gPSBtMDAgKiBzY2FsZVg7CiAgICAgICAgcmVzdWx0WzFdID0gbTEwICogc2NhbGVYOwogICAgICAgIHJlc3VsdFsyXSA9IG0yMCAqIHNjYWxlWDsKICAgICAgICByZXN1bHRbM10gPSAwOwogICAgICAgIHJlc3VsdFs0XSA9IG0wMSAqIHNjYWxlWTsKICAgICAgICByZXN1bHRbNV0gPSBtMTEgKiBzY2FsZVk7CiAgICAgICAgcmVzdWx0WzZdID0gbTIxICogc2NhbGVZOwogICAgICAgIHJlc3VsdFs3XSA9IDA7CiAgICAgICAgcmVzdWx0WzhdID0gbTAyICogc2NhbGVaOwogICAgICAgIHJlc3VsdFs5XSA9IG0xMiAqIHNjYWxlWjsKICAgICAgICByZXN1bHRbMTBdID0gbTIyICogc2NhbGVaOwogICAgICAgIHJlc3VsdFsxMV0gPSAwOwogICAgICAgIHJlc3VsdFsxMl0gPSB0cmFuc2xhdGlvbjIueDsKICAgICAgICByZXN1bHRbMTNdID0gdHJhbnNsYXRpb24yLnk7CiAgICAgICAgcmVzdWx0WzE0XSA9IHRyYW5zbGF0aW9uMi56OwogICAgICAgIHJlc3VsdFsxNV0gPSAxOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDQuZnJvbVRyYW5zbGF0aW9uUm90YXRpb25TY2FsZSA9IGZ1bmN0aW9uKHRyYW5zbGF0aW9uUm90YXRpb25TY2FsZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ0cmFuc2xhdGlvblJvdGF0aW9uU2NhbGUiLCB0cmFuc2xhdGlvblJvdGF0aW9uU2NhbGUpOwogICAgICAgIHJldHVybiBNYXRyaXg0LmZyb21UcmFuc2xhdGlvblF1YXRlcm5pb25Sb3RhdGlvblNjYWxlKAogICAgICAgICAgdHJhbnNsYXRpb25Sb3RhdGlvblNjYWxlLnRyYW5zbGF0aW9uLAogICAgICAgICAgdHJhbnNsYXRpb25Sb3RhdGlvblNjYWxlLnJvdGF0aW9uLAogICAgICAgICAgdHJhbnNsYXRpb25Sb3RhdGlvblNjYWxlLnNjYWxlLAogICAgICAgICAgcmVzdWx0CiAgICAgICAgKTsKICAgICAgfTsKICAgICAgTWF0cml4NC5mcm9tVHJhbnNsYXRpb24gPSBmdW5jdGlvbih0cmFuc2xhdGlvbjIsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgidHJhbnNsYXRpb24iLCB0cmFuc2xhdGlvbjIpOwogICAgICAgIHJldHVybiBNYXRyaXg0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uKE1hdHJpeDNfZGVmYXVsdC5JREVOVElUWSwgdHJhbnNsYXRpb24yLCByZXN1bHQpOwogICAgICB9OwogICAgICBNYXRyaXg0LmZyb21TY2FsZSA9IGZ1bmN0aW9uKHNjYWxlLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInNjYWxlIiwgc2NhbGUpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgTWF0cml4NCgKICAgICAgICAgICAgc2NhbGUueCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgc2NhbGUueSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgc2NhbGUueiwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0WzBdID0gc2NhbGUueDsKICAgICAgICByZXN1bHRbMV0gPSAwOwogICAgICAgIHJlc3VsdFsyXSA9IDA7CiAgICAgICAgcmVzdWx0WzNdID0gMDsKICAgICAgICByZXN1bHRbNF0gPSAwOwogICAgICAgIHJlc3VsdFs1XSA9IHNjYWxlLnk7CiAgICAgICAgcmVzdWx0WzZdID0gMDsKICAgICAgICByZXN1bHRbN10gPSAwOwogICAgICAgIHJlc3VsdFs4XSA9IDA7CiAgICAgICAgcmVzdWx0WzldID0gMDsKICAgICAgICByZXN1bHRbMTBdID0gc2NhbGUuejsKICAgICAgICByZXN1bHRbMTFdID0gMDsKICAgICAgICByZXN1bHRbMTJdID0gMDsKICAgICAgICByZXN1bHRbMTNdID0gMDsKICAgICAgICByZXN1bHRbMTRdID0gMDsKICAgICAgICByZXN1bHRbMTVdID0gMTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXg0LmZyb21Vbmlmb3JtU2NhbGUgPSBmdW5jdGlvbihzY2FsZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJzY2FsZSIsIHNjYWxlKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IE1hdHJpeDQoCiAgICAgICAgICAgIHNjYWxlLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICBzY2FsZSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgc2NhbGUsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdFswXSA9IHNjYWxlOwogICAgICAgIHJlc3VsdFsxXSA9IDA7CiAgICAgICAgcmVzdWx0WzJdID0gMDsKICAgICAgICByZXN1bHRbM10gPSAwOwogICAgICAgIHJlc3VsdFs0XSA9IDA7CiAgICAgICAgcmVzdWx0WzVdID0gc2NhbGU7CiAgICAgICAgcmVzdWx0WzZdID0gMDsKICAgICAgICByZXN1bHRbN10gPSAwOwogICAgICAgIHJlc3VsdFs4XSA9IDA7CiAgICAgICAgcmVzdWx0WzldID0gMDsKICAgICAgICByZXN1bHRbMTBdID0gc2NhbGU7CiAgICAgICAgcmVzdWx0WzExXSA9IDA7CiAgICAgICAgcmVzdWx0WzEyXSA9IDA7CiAgICAgICAgcmVzdWx0WzEzXSA9IDA7CiAgICAgICAgcmVzdWx0WzE0XSA9IDA7CiAgICAgICAgcmVzdWx0WzE1XSA9IDE7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4NC5mcm9tUm90YXRpb24gPSBmdW5jdGlvbihyb3RhdGlvbiwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyb3RhdGlvbiIsIHJvdGF0aW9uKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgTWF0cml4NCgpOwogICAgICAgIH0KICAgICAgICByZXN1bHRbMF0gPSByb3RhdGlvblswXTsKICAgICAgICByZXN1bHRbMV0gPSByb3RhdGlvblsxXTsKICAgICAgICByZXN1bHRbMl0gPSByb3RhdGlvblsyXTsKICAgICAgICByZXN1bHRbM10gPSAwOwogICAgICAgIHJlc3VsdFs0XSA9IHJvdGF0aW9uWzNdOwogICAgICAgIHJlc3VsdFs1XSA9IHJvdGF0aW9uWzRdOwogICAgICAgIHJlc3VsdFs2XSA9IHJvdGF0aW9uWzVdOwogICAgICAgIHJlc3VsdFs3XSA9IDA7CiAgICAgICAgcmVzdWx0WzhdID0gcm90YXRpb25bNl07CiAgICAgICAgcmVzdWx0WzldID0gcm90YXRpb25bN107CiAgICAgICAgcmVzdWx0WzEwXSA9IHJvdGF0aW9uWzhdOwogICAgICAgIHJlc3VsdFsxMV0gPSAwOwogICAgICAgIHJlc3VsdFsxMl0gPSAwOwogICAgICAgIHJlc3VsdFsxM10gPSAwOwogICAgICAgIHJlc3VsdFsxNF0gPSAwOwogICAgICAgIHJlc3VsdFsxNV0gPSAxOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIGZyb21DYW1lcmFGID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBmcm9tQ2FtZXJhUiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgZnJvbUNhbWVyYVUgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIE1hdHJpeDQuZnJvbUNhbWVyYSA9IGZ1bmN0aW9uKGNhbWVyYSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYW1lcmEiLCBjYW1lcmEpOwogICAgICAgIGNvbnN0IHBvc2l0aW9uID0gY2FtZXJhLnBvc2l0aW9uOwogICAgICAgIGNvbnN0IGRpcmVjdGlvbjIgPSBjYW1lcmEuZGlyZWN0aW9uOwogICAgICAgIGNvbnN0IHVwID0gY2FtZXJhLnVwOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FtZXJhLnBvc2l0aW9uIiwgcG9zaXRpb24pOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FtZXJhLmRpcmVjdGlvbiIsIGRpcmVjdGlvbjIpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FtZXJhLnVwIiwgdXApOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoZGlyZWN0aW9uMiwgZnJvbUNhbWVyYUYpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3MoZnJvbUNhbWVyYUYsIHVwLCBmcm9tQ2FtZXJhUiksCiAgICAgICAgICBmcm9tQ2FtZXJhUgogICAgICAgICk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhmcm9tQ2FtZXJhUiwgZnJvbUNhbWVyYUYsIGZyb21DYW1lcmFVKSwKICAgICAgICAgIGZyb21DYW1lcmFVCiAgICAgICAgKTsKICAgICAgICBjb25zdCBzWCA9IGZyb21DYW1lcmFSLng7CiAgICAgICAgY29uc3Qgc1kgPSBmcm9tQ2FtZXJhUi55OwogICAgICAgIGNvbnN0IHNaID0gZnJvbUNhbWVyYVIuejsKICAgICAgICBjb25zdCBmWCA9IGZyb21DYW1lcmFGLng7CiAgICAgICAgY29uc3QgZlkgPSBmcm9tQ2FtZXJhRi55OwogICAgICAgIGNvbnN0IGZaID0gZnJvbUNhbWVyYUYuejsKICAgICAgICBjb25zdCB1WCA9IGZyb21DYW1lcmFVLng7CiAgICAgICAgY29uc3QgdVkgPSBmcm9tQ2FtZXJhVS55OwogICAgICAgIGNvbnN0IHVaID0gZnJvbUNhbWVyYVUuejsKICAgICAgICBjb25zdCBwb3NpdGlvblggPSBwb3NpdGlvbi54OwogICAgICAgIGNvbnN0IHBvc2l0aW9uWSA9IHBvc2l0aW9uLnk7CiAgICAgICAgY29uc3QgcG9zaXRpb25aID0gcG9zaXRpb24uejsKICAgICAgICBjb25zdCB0MCA9IHNYICogLXBvc2l0aW9uWCArIHNZICogLXBvc2l0aW9uWSArIHNaICogLXBvc2l0aW9uWjsKICAgICAgICBjb25zdCB0MSA9IHVYICogLXBvc2l0aW9uWCArIHVZICogLXBvc2l0aW9uWSArIHVaICogLXBvc2l0aW9uWjsKICAgICAgICBjb25zdCB0MiA9IGZYICogcG9zaXRpb25YICsgZlkgKiBwb3NpdGlvblkgKyBmWiAqIHBvc2l0aW9uWjsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IE1hdHJpeDQoCiAgICAgICAgICAgIHNYLAogICAgICAgICAgICBzWSwKICAgICAgICAgICAgc1osCiAgICAgICAgICAgIHQwLAogICAgICAgICAgICB1WCwKICAgICAgICAgICAgdVksCiAgICAgICAgICAgIHVaLAogICAgICAgICAgICB0MSwKICAgICAgICAgICAgLWZYLAogICAgICAgICAgICAtZlksCiAgICAgICAgICAgIC1mWiwKICAgICAgICAgICAgdDIsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdFswXSA9IHNYOwogICAgICAgIHJlc3VsdFsxXSA9IHVYOwogICAgICAgIHJlc3VsdFsyXSA9IC1mWDsKICAgICAgICByZXN1bHRbM10gPSAwOwogICAgICAgIHJlc3VsdFs0XSA9IHNZOwogICAgICAgIHJlc3VsdFs1XSA9IHVZOwogICAgICAgIHJlc3VsdFs2XSA9IC1mWTsKICAgICAgICByZXN1bHRbN10gPSAwOwogICAgICAgIHJlc3VsdFs4XSA9IHNaOwogICAgICAgIHJlc3VsdFs5XSA9IHVaOwogICAgICAgIHJlc3VsdFsxMF0gPSAtZlo7CiAgICAgICAgcmVzdWx0WzExXSA9IDA7CiAgICAgICAgcmVzdWx0WzEyXSA9IHQwOwogICAgICAgIHJlc3VsdFsxM10gPSB0MTsKICAgICAgICByZXN1bHRbMTRdID0gdDI7CiAgICAgICAgcmVzdWx0WzE1XSA9IDE7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4NC5jb21wdXRlUGVyc3BlY3RpdmVGaWVsZE9mVmlldyA9IGZ1bmN0aW9uKGZvdlksIGFzcGVjdFJhdGlvLCBuZWFyLCBmYXIsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbigiZm92WSIsIGZvdlksIDApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbigiZm92WSIsIGZvdlksIE1hdGguUEkpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbigibmVhciIsIG5lYXIsIDApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbigiZmFyIiwgZmFyLCAwKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3QgYm90dG9tID0gTWF0aC50YW4oZm92WSAqIDAuNSk7CiAgICAgICAgY29uc3QgY29sdW1uMVJvdzEgPSAxIC8gYm90dG9tOwogICAgICAgIGNvbnN0IGNvbHVtbjBSb3cwID0gY29sdW1uMVJvdzEgLyBhc3BlY3RSYXRpbzsKICAgICAgICBjb25zdCBjb2x1bW4yUm93MiA9IChmYXIgKyBuZWFyKSAvIChuZWFyIC0gZmFyKTsKICAgICAgICBjb25zdCBjb2x1bW4zUm93MiA9IDIgKiBmYXIgKiBuZWFyIC8gKG5lYXIgLSBmYXIpOwogICAgICAgIHJlc3VsdFswXSA9IGNvbHVtbjBSb3cwOwogICAgICAgIHJlc3VsdFsxXSA9IDA7CiAgICAgICAgcmVzdWx0WzJdID0gMDsKICAgICAgICByZXN1bHRbM10gPSAwOwogICAgICAgIHJlc3VsdFs0XSA9IDA7CiAgICAgICAgcmVzdWx0WzVdID0gY29sdW1uMVJvdzE7CiAgICAgICAgcmVzdWx0WzZdID0gMDsKICAgICAgICByZXN1bHRbN10gPSAwOwogICAgICAgIHJlc3VsdFs4XSA9IDA7CiAgICAgICAgcmVzdWx0WzldID0gMDsKICAgICAgICByZXN1bHRbMTBdID0gY29sdW1uMlJvdzI7CiAgICAgICAgcmVzdWx0WzExXSA9IC0xOwogICAgICAgIHJlc3VsdFsxMl0gPSAwOwogICAgICAgIHJlc3VsdFsxM10gPSAwOwogICAgICAgIHJlc3VsdFsxNF0gPSBjb2x1bW4zUm93MjsKICAgICAgICByZXN1bHRbMTVdID0gMDsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXg0LmNvbXB1dGVPcnRob2dyYXBoaWNPZmZDZW50ZXIgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhciwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoImJvdHRvbSIsIGJvdHRvbSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJ0b3AiLCB0b3ApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigibmVhciIsIG5lYXIpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigiZmFyIiwgZmFyKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgbGV0IGEzID0gMSAvIChyaWdodCAtIGxlZnQpOwogICAgICAgIGxldCBiID0gMSAvICh0b3AgLSBib3R0b20pOwogICAgICAgIGxldCBjID0gMSAvIChmYXIgLSBuZWFyKTsKICAgICAgICBjb25zdCB0eCA9IC0ocmlnaHQgKyBsZWZ0KSAqIGEzOwogICAgICAgIGNvbnN0IHR5ID0gLSh0b3AgKyBib3R0b20pICogYjsKICAgICAgICBjb25zdCB0eiA9IC0oZmFyICsgbmVhcikgKiBjOwogICAgICAgIGEzICo9IDI7CiAgICAgICAgYiAqPSAyOwogICAgICAgIGMgKj0gLTI7CiAgICAgICAgcmVzdWx0WzBdID0gYTM7CiAgICAgICAgcmVzdWx0WzFdID0gMDsKICAgICAgICByZXN1bHRbMl0gPSAwOwogICAgICAgIHJlc3VsdFszXSA9IDA7CiAgICAgICAgcmVzdWx0WzRdID0gMDsKICAgICAgICByZXN1bHRbNV0gPSBiOwogICAgICAgIHJlc3VsdFs2XSA9IDA7CiAgICAgICAgcmVzdWx0WzddID0gMDsKICAgICAgICByZXN1bHRbOF0gPSAwOwogICAgICAgIHJlc3VsdFs5XSA9IDA7CiAgICAgICAgcmVzdWx0WzEwXSA9IGM7CiAgICAgICAgcmVzdWx0WzExXSA9IDA7CiAgICAgICAgcmVzdWx0WzEyXSA9IHR4OwogICAgICAgIHJlc3VsdFsxM10gPSB0eTsKICAgICAgICByZXN1bHRbMTRdID0gdHo7CiAgICAgICAgcmVzdWx0WzE1XSA9IDE7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4NC5jb21wdXRlUGVyc3BlY3RpdmVPZmZDZW50ZXIgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhciwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoImJvdHRvbSIsIGJvdHRvbSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJ0b3AiLCB0b3ApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigibmVhciIsIG5lYXIpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigiZmFyIiwgZmFyKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3QgY29sdW1uMFJvdzAgPSAyICogbmVhciAvIChyaWdodCAtIGxlZnQpOwogICAgICAgIGNvbnN0IGNvbHVtbjFSb3cxID0gMiAqIG5lYXIgLyAodG9wIC0gYm90dG9tKTsKICAgICAgICBjb25zdCBjb2x1bW4yUm93MCA9IChyaWdodCArIGxlZnQpIC8gKHJpZ2h0IC0gbGVmdCk7CiAgICAgICAgY29uc3QgY29sdW1uMlJvdzEgPSAodG9wICsgYm90dG9tKSAvICh0b3AgLSBib3R0b20pOwogICAgICAgIGNvbnN0IGNvbHVtbjJSb3cyID0gLShmYXIgKyBuZWFyKSAvIChmYXIgLSBuZWFyKTsKICAgICAgICBjb25zdCBjb2x1bW4yUm93MyA9IC0xOwogICAgICAgIGNvbnN0IGNvbHVtbjNSb3cyID0gLTIgKiBmYXIgKiBuZWFyIC8gKGZhciAtIG5lYXIpOwogICAgICAgIHJlc3VsdFswXSA9IGNvbHVtbjBSb3cwOwogICAgICAgIHJlc3VsdFsxXSA9IDA7CiAgICAgICAgcmVzdWx0WzJdID0gMDsKICAgICAgICByZXN1bHRbM10gPSAwOwogICAgICAgIHJlc3VsdFs0XSA9IDA7CiAgICAgICAgcmVzdWx0WzVdID0gY29sdW1uMVJvdzE7CiAgICAgICAgcmVzdWx0WzZdID0gMDsKICAgICAgICByZXN1bHRbN10gPSAwOwogICAgICAgIHJlc3VsdFs4XSA9IGNvbHVtbjJSb3cwOwogICAgICAgIHJlc3VsdFs5XSA9IGNvbHVtbjJSb3cxOwogICAgICAgIHJlc3VsdFsxMF0gPSBjb2x1bW4yUm93MjsKICAgICAgICByZXN1bHRbMTFdID0gY29sdW1uMlJvdzM7CiAgICAgICAgcmVzdWx0WzEyXSA9IDA7CiAgICAgICAgcmVzdWx0WzEzXSA9IDA7CiAgICAgICAgcmVzdWx0WzE0XSA9IGNvbHVtbjNSb3cyOwogICAgICAgIHJlc3VsdFsxNV0gPSAwOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDQuY29tcHV0ZUluZmluaXRlUGVyc3BlY3RpdmVPZmZDZW50ZXIgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJib3R0b20iLCBib3R0b20pOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigidG9wIiwgdG9wKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoIm5lYXIiLCBuZWFyKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3QgY29sdW1uMFJvdzAgPSAyICogbmVhciAvIChyaWdodCAtIGxlZnQpOwogICAgICAgIGNvbnN0IGNvbHVtbjFSb3cxID0gMiAqIG5lYXIgLyAodG9wIC0gYm90dG9tKTsKICAgICAgICBjb25zdCBjb2x1bW4yUm93MCA9IChyaWdodCArIGxlZnQpIC8gKHJpZ2h0IC0gbGVmdCk7CiAgICAgICAgY29uc3QgY29sdW1uMlJvdzEgPSAodG9wICsgYm90dG9tKSAvICh0b3AgLSBib3R0b20pOwogICAgICAgIGNvbnN0IGNvbHVtbjJSb3cyID0gLTE7CiAgICAgICAgY29uc3QgY29sdW1uMlJvdzMgPSAtMTsKICAgICAgICBjb25zdCBjb2x1bW4zUm93MiA9IC0yICogbmVhcjsKICAgICAgICByZXN1bHRbMF0gPSBjb2x1bW4wUm93MDsKICAgICAgICByZXN1bHRbMV0gPSAwOwogICAgICAgIHJlc3VsdFsyXSA9IDA7CiAgICAgICAgcmVzdWx0WzNdID0gMDsKICAgICAgICByZXN1bHRbNF0gPSAwOwogICAgICAgIHJlc3VsdFs1XSA9IGNvbHVtbjFSb3cxOwogICAgICAgIHJlc3VsdFs2XSA9IDA7CiAgICAgICAgcmVzdWx0WzddID0gMDsKICAgICAgICByZXN1bHRbOF0gPSBjb2x1bW4yUm93MDsKICAgICAgICByZXN1bHRbOV0gPSBjb2x1bW4yUm93MTsKICAgICAgICByZXN1bHRbMTBdID0gY29sdW1uMlJvdzI7CiAgICAgICAgcmVzdWx0WzExXSA9IGNvbHVtbjJSb3czOwogICAgICAgIHJlc3VsdFsxMl0gPSAwOwogICAgICAgIHJlc3VsdFsxM10gPSAwOwogICAgICAgIHJlc3VsdFsxNF0gPSBjb2x1bW4zUm93MjsKICAgICAgICByZXN1bHRbMTVdID0gMDsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXg0LmNvbXB1dGVWaWV3cG9ydFRyYW5zZm9ybWF0aW9uID0gZnVuY3Rpb24odmlld3BvcnQsIG5lYXJEZXB0aFJhbmdlLCBmYXJEZXB0aFJhbmdlLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgTWF0cml4NCgpOwogICAgICAgIH0KICAgICAgICB2aWV3cG9ydCA9IHZpZXdwb3J0ID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgICAgICBjb25zdCB4ID0gdmlld3BvcnQueCA/PyAwOwogICAgICAgIGNvbnN0IHkgPSB2aWV3cG9ydC55ID8/IDA7CiAgICAgICAgY29uc3Qgd2lkdGggPSB2aWV3cG9ydC53aWR0aCA/PyAwOwogICAgICAgIGNvbnN0IGhlaWdodCA9IHZpZXdwb3J0LmhlaWdodCA/PyAwOwogICAgICAgIG5lYXJEZXB0aFJhbmdlID0gbmVhckRlcHRoUmFuZ2UgPz8gMDsKICAgICAgICBmYXJEZXB0aFJhbmdlID0gZmFyRGVwdGhSYW5nZSA/PyAxOwogICAgICAgIGNvbnN0IGhhbGZXaWR0aCA9IHdpZHRoICogMC41OwogICAgICAgIGNvbnN0IGhhbGZIZWlnaHQgPSBoZWlnaHQgKiAwLjU7CiAgICAgICAgY29uc3QgaGFsZkRlcHRoID0gKGZhckRlcHRoUmFuZ2UgLSBuZWFyRGVwdGhSYW5nZSkgKiAwLjU7CiAgICAgICAgY29uc3QgY29sdW1uMFJvdzAgPSBoYWxmV2lkdGg7CiAgICAgICAgY29uc3QgY29sdW1uMVJvdzEgPSBoYWxmSGVpZ2h0OwogICAgICAgIGNvbnN0IGNvbHVtbjJSb3cyID0gaGFsZkRlcHRoOwogICAgICAgIGNvbnN0IGNvbHVtbjNSb3cwID0geCArIGhhbGZXaWR0aDsKICAgICAgICBjb25zdCBjb2x1bW4zUm93MSA9IHkgKyBoYWxmSGVpZ2h0OwogICAgICAgIGNvbnN0IGNvbHVtbjNSb3cyID0gbmVhckRlcHRoUmFuZ2UgKyBoYWxmRGVwdGg7CiAgICAgICAgY29uc3QgY29sdW1uM1JvdzMgPSAxOwogICAgICAgIHJlc3VsdFswXSA9IGNvbHVtbjBSb3cwOwogICAgICAgIHJlc3VsdFsxXSA9IDA7CiAgICAgICAgcmVzdWx0WzJdID0gMDsKICAgICAgICByZXN1bHRbM10gPSAwOwogICAgICAgIHJlc3VsdFs0XSA9IDA7CiAgICAgICAgcmVzdWx0WzVdID0gY29sdW1uMVJvdzE7CiAgICAgICAgcmVzdWx0WzZdID0gMDsKICAgICAgICByZXN1bHRbN10gPSAwOwogICAgICAgIHJlc3VsdFs4XSA9IDA7CiAgICAgICAgcmVzdWx0WzldID0gMDsKICAgICAgICByZXN1bHRbMTBdID0gY29sdW1uMlJvdzI7CiAgICAgICAgcmVzdWx0WzExXSA9IDA7CiAgICAgICAgcmVzdWx0WzEyXSA9IGNvbHVtbjNSb3cwOwogICAgICAgIHJlc3VsdFsxM10gPSBjb2x1bW4zUm93MTsKICAgICAgICByZXN1bHRbMTRdID0gY29sdW1uM1JvdzI7CiAgICAgICAgcmVzdWx0WzE1XSA9IGNvbHVtbjNSb3czOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDQuY29tcHV0ZVZpZXcgPSBmdW5jdGlvbihwb3NpdGlvbiwgZGlyZWN0aW9uMiwgdXAsIHJpZ2h0LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInBvc2l0aW9uIiwgcG9zaXRpb24pOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiZGlyZWN0aW9uIiwgZGlyZWN0aW9uMik7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ1cCIsIHVwKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJpZ2h0IiwgcmlnaHQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHRbMF0gPSByaWdodC54OwogICAgICAgIHJlc3VsdFsxXSA9IHVwLng7CiAgICAgICAgcmVzdWx0WzJdID0gLWRpcmVjdGlvbjIueDsKICAgICAgICByZXN1bHRbM10gPSAwOwogICAgICAgIHJlc3VsdFs0XSA9IHJpZ2h0Lnk7CiAgICAgICAgcmVzdWx0WzVdID0gdXAueTsKICAgICAgICByZXN1bHRbNl0gPSAtZGlyZWN0aW9uMi55OwogICAgICAgIHJlc3VsdFs3XSA9IDA7CiAgICAgICAgcmVzdWx0WzhdID0gcmlnaHQuejsKICAgICAgICByZXN1bHRbOV0gPSB1cC56OwogICAgICAgIHJlc3VsdFsxMF0gPSAtZGlyZWN0aW9uMi56OwogICAgICAgIHJlc3VsdFsxMV0gPSAwOwogICAgICAgIHJlc3VsdFsxMl0gPSAtQ2FydGVzaWFuM19kZWZhdWx0LmRvdChyaWdodCwgcG9zaXRpb24pOwogICAgICAgIHJlc3VsdFsxM10gPSAtQ2FydGVzaWFuM19kZWZhdWx0LmRvdCh1cCwgcG9zaXRpb24pOwogICAgICAgIHJlc3VsdFsxNF0gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KGRpcmVjdGlvbjIsIHBvc2l0aW9uKTsKICAgICAgICByZXN1bHRbMTVdID0gMTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXg0LnRvQXJyYXkgPSBmdW5jdGlvbihtYXRyaXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF0cml4IiwgbWF0cml4KTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICBtYXRyaXhbMF0sCiAgICAgICAgICAgIG1hdHJpeFsxXSwKICAgICAgICAgICAgbWF0cml4WzJdLAogICAgICAgICAgICBtYXRyaXhbM10sCiAgICAgICAgICAgIG1hdHJpeFs0XSwKICAgICAgICAgICAgbWF0cml4WzVdLAogICAgICAgICAgICBtYXRyaXhbNl0sCiAgICAgICAgICAgIG1hdHJpeFs3XSwKICAgICAgICAgICAgbWF0cml4WzhdLAogICAgICAgICAgICBtYXRyaXhbOV0sCiAgICAgICAgICAgIG1hdHJpeFsxMF0sCiAgICAgICAgICAgIG1hdHJpeFsxMV0sCiAgICAgICAgICAgIG1hdHJpeFsxMl0sCiAgICAgICAgICAgIG1hdHJpeFsxM10sCiAgICAgICAgICAgIG1hdHJpeFsxNF0sCiAgICAgICAgICAgIG1hdHJpeFsxNV0KICAgICAgICAgIF07CiAgICAgICAgfQogICAgICAgIHJlc3VsdFswXSA9IG1hdHJpeFswXTsKICAgICAgICByZXN1bHRbMV0gPSBtYXRyaXhbMV07CiAgICAgICAgcmVzdWx0WzJdID0gbWF0cml4WzJdOwogICAgICAgIHJlc3VsdFszXSA9IG1hdHJpeFszXTsKICAgICAgICByZXN1bHRbNF0gPSBtYXRyaXhbNF07CiAgICAgICAgcmVzdWx0WzVdID0gbWF0cml4WzVdOwogICAgICAgIHJlc3VsdFs2XSA9IG1hdHJpeFs2XTsKICAgICAgICByZXN1bHRbN10gPSBtYXRyaXhbN107CiAgICAgICAgcmVzdWx0WzhdID0gbWF0cml4WzhdOwogICAgICAgIHJlc3VsdFs5XSA9IG1hdHJpeFs5XTsKICAgICAgICByZXN1bHRbMTBdID0gbWF0cml4WzEwXTsKICAgICAgICByZXN1bHRbMTFdID0gbWF0cml4WzExXTsKICAgICAgICByZXN1bHRbMTJdID0gbWF0cml4WzEyXTsKICAgICAgICByZXN1bHRbMTNdID0gbWF0cml4WzEzXTsKICAgICAgICByZXN1bHRbMTRdID0gbWF0cml4WzE0XTsKICAgICAgICByZXN1bHRbMTVdID0gbWF0cml4WzE1XTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXg0LmdldEVsZW1lbnRJbmRleCA9IGZ1bmN0aW9uKGNvbHVtbiwgcm93KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoInJvdyIsIHJvdywgMCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoInJvdyIsIHJvdywgMyk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImNvbHVtbiIsIGNvbHVtbiwgMCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImNvbHVtbiIsIGNvbHVtbiwgMyk7CiAgICAgICAgcmV0dXJuIGNvbHVtbiAqIDQgKyByb3c7CiAgICAgIH07CiAgICAgIE1hdHJpeDQuZ2V0Q29sdW1uID0gZnVuY3Rpb24obWF0cml4LCBpbmRleCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJpbmRleCIsIGluZGV4LCAwKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiaW5kZXgiLCBpbmRleCwgMyk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBpbmRleCAqIDQ7CiAgICAgICAgY29uc3QgeCA9IG1hdHJpeFtzdGFydEluZGV4XTsKICAgICAgICBjb25zdCB5ID0gbWF0cml4W3N0YXJ0SW5kZXggKyAxXTsKICAgICAgICBjb25zdCB6ID0gbWF0cml4W3N0YXJ0SW5kZXggKyAyXTsKICAgICAgICBjb25zdCB3ID0gbWF0cml4W3N0YXJ0SW5kZXggKyAzXTsKICAgICAgICByZXN1bHQueCA9IHg7CiAgICAgICAgcmVzdWx0LnkgPSB5OwogICAgICAgIHJlc3VsdC56ID0gejsKICAgICAgICByZXN1bHQudyA9IHc7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4NC5zZXRDb2x1bW4gPSBmdW5jdGlvbihtYXRyaXgsIGluZGV4LCBjYXJ0ZXNpYW4xMSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJpbmRleCIsIGluZGV4LCAwKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiaW5kZXgiLCBpbmRleCwgMyk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdCA9IE1hdHJpeDQuY2xvbmUobWF0cml4LCByZXN1bHQpOwogICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBpbmRleCAqIDQ7CiAgICAgICAgcmVzdWx0W3N0YXJ0SW5kZXhdID0gY2FydGVzaWFuMTEueDsKICAgICAgICByZXN1bHRbc3RhcnRJbmRleCArIDFdID0gY2FydGVzaWFuMTEueTsKICAgICAgICByZXN1bHRbc3RhcnRJbmRleCArIDJdID0gY2FydGVzaWFuMTEuejsKICAgICAgICByZXN1bHRbc3RhcnRJbmRleCArIDNdID0gY2FydGVzaWFuMTEudzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXg0LmdldFJvdyA9IGZ1bmN0aW9uKG1hdHJpeCwgaW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF0cml4IiwgbWF0cml4KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiaW5kZXgiLCBpbmRleCwgMCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImluZGV4IiwgaW5kZXgsIDMpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBjb25zdCB4ID0gbWF0cml4W2luZGV4XTsKICAgICAgICBjb25zdCB5ID0gbWF0cml4W2luZGV4ICsgNF07CiAgICAgICAgY29uc3QgeiA9IG1hdHJpeFtpbmRleCArIDhdOwogICAgICAgIGNvbnN0IHcgPSBtYXRyaXhbaW5kZXggKyAxMl07CiAgICAgICAgcmVzdWx0LnggPSB4OwogICAgICAgIHJlc3VsdC55ID0geTsKICAgICAgICByZXN1bHQueiA9IHo7CiAgICAgICAgcmVzdWx0LncgPSB3OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDQuc2V0Um93ID0gZnVuY3Rpb24obWF0cml4LCBpbmRleCwgY2FydGVzaWFuMTEsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF0cml4IiwgbWF0cml4KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiaW5kZXgiLCBpbmRleCwgMCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImluZGV4IiwgaW5kZXgsIDMpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQgPSBNYXRyaXg0LmNsb25lKG1hdHJpeCwgcmVzdWx0KTsKICAgICAgICByZXN1bHRbaW5kZXhdID0gY2FydGVzaWFuMTEueDsKICAgICAgICByZXN1bHRbaW5kZXggKyA0XSA9IGNhcnRlc2lhbjExLnk7CiAgICAgICAgcmVzdWx0W2luZGV4ICsgOF0gPSBjYXJ0ZXNpYW4xMS56OwogICAgICAgIHJlc3VsdFtpbmRleCArIDEyXSA9IGNhcnRlc2lhbjExLnc7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4NC5zZXRUcmFuc2xhdGlvbiA9IGZ1bmN0aW9uKG1hdHJpeCwgdHJhbnNsYXRpb24yLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ0cmFuc2xhdGlvbiIsIHRyYW5zbGF0aW9uMik7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdFswXSA9IG1hdHJpeFswXTsKICAgICAgICByZXN1bHRbMV0gPSBtYXRyaXhbMV07CiAgICAgICAgcmVzdWx0WzJdID0gbWF0cml4WzJdOwogICAgICAgIHJlc3VsdFszXSA9IG1hdHJpeFszXTsKICAgICAgICByZXN1bHRbNF0gPSBtYXRyaXhbNF07CiAgICAgICAgcmVzdWx0WzVdID0gbWF0cml4WzVdOwogICAgICAgIHJlc3VsdFs2XSA9IG1hdHJpeFs2XTsKICAgICAgICByZXN1bHRbN10gPSBtYXRyaXhbN107CiAgICAgICAgcmVzdWx0WzhdID0gbWF0cml4WzhdOwogICAgICAgIHJlc3VsdFs5XSA9IG1hdHJpeFs5XTsKICAgICAgICByZXN1bHRbMTBdID0gbWF0cml4WzEwXTsKICAgICAgICByZXN1bHRbMTFdID0gbWF0cml4WzExXTsKICAgICAgICByZXN1bHRbMTJdID0gdHJhbnNsYXRpb24yLng7CiAgICAgICAgcmVzdWx0WzEzXSA9IHRyYW5zbGF0aW9uMi55OwogICAgICAgIHJlc3VsdFsxNF0gPSB0cmFuc2xhdGlvbjIuejsKICAgICAgICByZXN1bHRbMTVdID0gbWF0cml4WzE1XTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBzY2FsZVNjcmF0Y2gxMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgTWF0cml4NC5zZXRTY2FsZSA9IGZ1bmN0aW9uKG1hdHJpeCwgc2NhbGUsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF0cml4IiwgbWF0cml4KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInNjYWxlIiwgc2NhbGUpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBjb25zdCBleGlzdGluZ1NjYWxlID0gTWF0cml4NC5nZXRTY2FsZShtYXRyaXgsIHNjYWxlU2NyYXRjaDEyKTsKICAgICAgICBjb25zdCBzY2FsZVJhdGlvWCA9IHNjYWxlLnggLyBleGlzdGluZ1NjYWxlLng7CiAgICAgICAgY29uc3Qgc2NhbGVSYXRpb1kgPSBzY2FsZS55IC8gZXhpc3RpbmdTY2FsZS55OwogICAgICAgIGNvbnN0IHNjYWxlUmF0aW9aID0gc2NhbGUueiAvIGV4aXN0aW5nU2NhbGUuejsKICAgICAgICByZXN1bHRbMF0gPSBtYXRyaXhbMF0gKiBzY2FsZVJhdGlvWDsKICAgICAgICByZXN1bHRbMV0gPSBtYXRyaXhbMV0gKiBzY2FsZVJhdGlvWDsKICAgICAgICByZXN1bHRbMl0gPSBtYXRyaXhbMl0gKiBzY2FsZVJhdGlvWDsKICAgICAgICByZXN1bHRbM10gPSBtYXRyaXhbM107CiAgICAgICAgcmVzdWx0WzRdID0gbWF0cml4WzRdICogc2NhbGVSYXRpb1k7CiAgICAgICAgcmVzdWx0WzVdID0gbWF0cml4WzVdICogc2NhbGVSYXRpb1k7CiAgICAgICAgcmVzdWx0WzZdID0gbWF0cml4WzZdICogc2NhbGVSYXRpb1k7CiAgICAgICAgcmVzdWx0WzddID0gbWF0cml4WzddOwogICAgICAgIHJlc3VsdFs4XSA9IG1hdHJpeFs4XSAqIHNjYWxlUmF0aW9aOwogICAgICAgIHJlc3VsdFs5XSA9IG1hdHJpeFs5XSAqIHNjYWxlUmF0aW9aOwogICAgICAgIHJlc3VsdFsxMF0gPSBtYXRyaXhbMTBdICogc2NhbGVSYXRpb1o7CiAgICAgICAgcmVzdWx0WzExXSA9IG1hdHJpeFsxMV07CiAgICAgICAgcmVzdWx0WzEyXSA9IG1hdHJpeFsxMl07CiAgICAgICAgcmVzdWx0WzEzXSA9IG1hdHJpeFsxM107CiAgICAgICAgcmVzdWx0WzE0XSA9IG1hdHJpeFsxNF07CiAgICAgICAgcmVzdWx0WzE1XSA9IG1hdHJpeFsxNV07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgc2NhbGVTY3JhdGNoMjIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIE1hdHJpeDQuc2V0VW5pZm9ybVNjYWxlID0gZnVuY3Rpb24obWF0cml4LCBzY2FsZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigic2NhbGUiLCBzY2FsZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IGV4aXN0aW5nU2NhbGUgPSBNYXRyaXg0LmdldFNjYWxlKG1hdHJpeCwgc2NhbGVTY3JhdGNoMjIpOwogICAgICAgIGNvbnN0IHNjYWxlUmF0aW9YID0gc2NhbGUgLyBleGlzdGluZ1NjYWxlLng7CiAgICAgICAgY29uc3Qgc2NhbGVSYXRpb1kgPSBzY2FsZSAvIGV4aXN0aW5nU2NhbGUueTsKICAgICAgICBjb25zdCBzY2FsZVJhdGlvWiA9IHNjYWxlIC8gZXhpc3RpbmdTY2FsZS56OwogICAgICAgIHJlc3VsdFswXSA9IG1hdHJpeFswXSAqIHNjYWxlUmF0aW9YOwogICAgICAgIHJlc3VsdFsxXSA9IG1hdHJpeFsxXSAqIHNjYWxlUmF0aW9YOwogICAgICAgIHJlc3VsdFsyXSA9IG1hdHJpeFsyXSAqIHNjYWxlUmF0aW9YOwogICAgICAgIHJlc3VsdFszXSA9IG1hdHJpeFszXTsKICAgICAgICByZXN1bHRbNF0gPSBtYXRyaXhbNF0gKiBzY2FsZVJhdGlvWTsKICAgICAgICByZXN1bHRbNV0gPSBtYXRyaXhbNV0gKiBzY2FsZVJhdGlvWTsKICAgICAgICByZXN1bHRbNl0gPSBtYXRyaXhbNl0gKiBzY2FsZVJhdGlvWTsKICAgICAgICByZXN1bHRbN10gPSBtYXRyaXhbN107CiAgICAgICAgcmVzdWx0WzhdID0gbWF0cml4WzhdICogc2NhbGVSYXRpb1o7CiAgICAgICAgcmVzdWx0WzldID0gbWF0cml4WzldICogc2NhbGVSYXRpb1o7CiAgICAgICAgcmVzdWx0WzEwXSA9IG1hdHJpeFsxMF0gKiBzY2FsZVJhdGlvWjsKICAgICAgICByZXN1bHRbMTFdID0gbWF0cml4WzExXTsKICAgICAgICByZXN1bHRbMTJdID0gbWF0cml4WzEyXTsKICAgICAgICByZXN1bHRbMTNdID0gbWF0cml4WzEzXTsKICAgICAgICByZXN1bHRbMTRdID0gbWF0cml4WzE0XTsKICAgICAgICByZXN1bHRbMTVdID0gbWF0cml4WzE1XTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBzY3JhdGNoQ29sdW1uMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgTWF0cml4NC5nZXRTY2FsZSA9IGZ1bmN0aW9uKG1hdHJpeCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUVsZW1lbnRzKG1hdHJpeFswXSwgbWF0cml4WzFdLCBtYXRyaXhbMl0sIHNjcmF0Y2hDb2x1bW4yKQogICAgICAgICk7CiAgICAgICAgcmVzdWx0LnkgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlKAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmZyb21FbGVtZW50cyhtYXRyaXhbNF0sIG1hdHJpeFs1XSwgbWF0cml4WzZdLCBzY3JhdGNoQ29sdW1uMikKICAgICAgICApOwogICAgICAgIHJlc3VsdC56ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZSgKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tRWxlbWVudHMobWF0cml4WzhdLCBtYXRyaXhbOV0sIG1hdHJpeFsxMF0sIHNjcmF0Y2hDb2x1bW4yKQogICAgICAgICk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgc2NhbGVTY3JhdGNoMzIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIE1hdHJpeDQuZ2V0TWF4aW11bVNjYWxlID0gZnVuY3Rpb24obWF0cml4KSB7CiAgICAgICAgTWF0cml4NC5nZXRTY2FsZShtYXRyaXgsIHNjYWxlU2NyYXRjaDMyKTsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuM19kZWZhdWx0Lm1heGltdW1Db21wb25lbnQoc2NhbGVTY3JhdGNoMzIpOwogICAgICB9OwogICAgICBzY2FsZVNjcmF0Y2g0MiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgTWF0cml4NC5zZXRSb3RhdGlvbiA9IGZ1bmN0aW9uKG1hdHJpeCwgcm90YXRpb24sIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF0cml4IiwgbWF0cml4KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3Qgc2NhbGUgPSBNYXRyaXg0LmdldFNjYWxlKG1hdHJpeCwgc2NhbGVTY3JhdGNoNDIpOwogICAgICAgIHJlc3VsdFswXSA9IHJvdGF0aW9uWzBdICogc2NhbGUueDsKICAgICAgICByZXN1bHRbMV0gPSByb3RhdGlvblsxXSAqIHNjYWxlLng7CiAgICAgICAgcmVzdWx0WzJdID0gcm90YXRpb25bMl0gKiBzY2FsZS54OwogICAgICAgIHJlc3VsdFszXSA9IG1hdHJpeFszXTsKICAgICAgICByZXN1bHRbNF0gPSByb3RhdGlvblszXSAqIHNjYWxlLnk7CiAgICAgICAgcmVzdWx0WzVdID0gcm90YXRpb25bNF0gKiBzY2FsZS55OwogICAgICAgIHJlc3VsdFs2XSA9IHJvdGF0aW9uWzVdICogc2NhbGUueTsKICAgICAgICByZXN1bHRbN10gPSBtYXRyaXhbN107CiAgICAgICAgcmVzdWx0WzhdID0gcm90YXRpb25bNl0gKiBzY2FsZS56OwogICAgICAgIHJlc3VsdFs5XSA9IHJvdGF0aW9uWzddICogc2NhbGUuejsKICAgICAgICByZXN1bHRbMTBdID0gcm90YXRpb25bOF0gKiBzY2FsZS56OwogICAgICAgIHJlc3VsdFsxMV0gPSBtYXRyaXhbMTFdOwogICAgICAgIHJlc3VsdFsxMl0gPSBtYXRyaXhbMTJdOwogICAgICAgIHJlc3VsdFsxM10gPSBtYXRyaXhbMTNdOwogICAgICAgIHJlc3VsdFsxNF0gPSBtYXRyaXhbMTRdOwogICAgICAgIHJlc3VsdFsxNV0gPSBtYXRyaXhbMTVdOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHNjYWxlU2NyYXRjaDUyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBNYXRyaXg0LmdldFJvdGF0aW9uID0gZnVuY3Rpb24obWF0cml4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IHNjYWxlID0gTWF0cml4NC5nZXRTY2FsZShtYXRyaXgsIHNjYWxlU2NyYXRjaDUyKTsKICAgICAgICByZXN1bHRbMF0gPSBtYXRyaXhbMF0gLyBzY2FsZS54OwogICAgICAgIHJlc3VsdFsxXSA9IG1hdHJpeFsxXSAvIHNjYWxlLng7CiAgICAgICAgcmVzdWx0WzJdID0gbWF0cml4WzJdIC8gc2NhbGUueDsKICAgICAgICByZXN1bHRbM10gPSBtYXRyaXhbNF0gLyBzY2FsZS55OwogICAgICAgIHJlc3VsdFs0XSA9IG1hdHJpeFs1XSAvIHNjYWxlLnk7CiAgICAgICAgcmVzdWx0WzVdID0gbWF0cml4WzZdIC8gc2NhbGUueTsKICAgICAgICByZXN1bHRbNl0gPSBtYXRyaXhbOF0gLyBzY2FsZS56OwogICAgICAgIHJlc3VsdFs3XSA9IG1hdHJpeFs5XSAvIHNjYWxlLno7CiAgICAgICAgcmVzdWx0WzhdID0gbWF0cml4WzEwXSAvIHNjYWxlLno7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4NC5tdWx0aXBseSA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImxlZnQiLCBsZWZ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJpZ2h0IiwgcmlnaHQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBjb25zdCBsZWZ0MCA9IGxlZnRbMF07CiAgICAgICAgY29uc3QgbGVmdDEgPSBsZWZ0WzFdOwogICAgICAgIGNvbnN0IGxlZnQyID0gbGVmdFsyXTsKICAgICAgICBjb25zdCBsZWZ0MyA9IGxlZnRbM107CiAgICAgICAgY29uc3QgbGVmdDQgPSBsZWZ0WzRdOwogICAgICAgIGNvbnN0IGxlZnQ1ID0gbGVmdFs1XTsKICAgICAgICBjb25zdCBsZWZ0NiA9IGxlZnRbNl07CiAgICAgICAgY29uc3QgbGVmdDcgPSBsZWZ0WzddOwogICAgICAgIGNvbnN0IGxlZnQ4ID0gbGVmdFs4XTsKICAgICAgICBjb25zdCBsZWZ0OSA9IGxlZnRbOV07CiAgICAgICAgY29uc3QgbGVmdDEwID0gbGVmdFsxMF07CiAgICAgICAgY29uc3QgbGVmdDExID0gbGVmdFsxMV07CiAgICAgICAgY29uc3QgbGVmdDEyID0gbGVmdFsxMl07CiAgICAgICAgY29uc3QgbGVmdDEzID0gbGVmdFsxM107CiAgICAgICAgY29uc3QgbGVmdDE0ID0gbGVmdFsxNF07CiAgICAgICAgY29uc3QgbGVmdDE1ID0gbGVmdFsxNV07CiAgICAgICAgY29uc3QgcmlnaHQwID0gcmlnaHRbMF07CiAgICAgICAgY29uc3QgcmlnaHQxID0gcmlnaHRbMV07CiAgICAgICAgY29uc3QgcmlnaHQyID0gcmlnaHRbMl07CiAgICAgICAgY29uc3QgcmlnaHQzID0gcmlnaHRbM107CiAgICAgICAgY29uc3QgcmlnaHQ0ID0gcmlnaHRbNF07CiAgICAgICAgY29uc3QgcmlnaHQ1ID0gcmlnaHRbNV07CiAgICAgICAgY29uc3QgcmlnaHQ2ID0gcmlnaHRbNl07CiAgICAgICAgY29uc3QgcmlnaHQ3ID0gcmlnaHRbN107CiAgICAgICAgY29uc3QgcmlnaHQ4ID0gcmlnaHRbOF07CiAgICAgICAgY29uc3QgcmlnaHQ5ID0gcmlnaHRbOV07CiAgICAgICAgY29uc3QgcmlnaHQxMCA9IHJpZ2h0WzEwXTsKICAgICAgICBjb25zdCByaWdodDExID0gcmlnaHRbMTFdOwogICAgICAgIGNvbnN0IHJpZ2h0MTIgPSByaWdodFsxMl07CiAgICAgICAgY29uc3QgcmlnaHQxMyA9IHJpZ2h0WzEzXTsKICAgICAgICBjb25zdCByaWdodDE0ID0gcmlnaHRbMTRdOwogICAgICAgIGNvbnN0IHJpZ2h0MTUgPSByaWdodFsxNV07CiAgICAgICAgY29uc3QgY29sdW1uMFJvdzAgPSBsZWZ0MCAqIHJpZ2h0MCArIGxlZnQ0ICogcmlnaHQxICsgbGVmdDggKiByaWdodDIgKyBsZWZ0MTIgKiByaWdodDM7CiAgICAgICAgY29uc3QgY29sdW1uMFJvdzEgPSBsZWZ0MSAqIHJpZ2h0MCArIGxlZnQ1ICogcmlnaHQxICsgbGVmdDkgKiByaWdodDIgKyBsZWZ0MTMgKiByaWdodDM7CiAgICAgICAgY29uc3QgY29sdW1uMFJvdzIgPSBsZWZ0MiAqIHJpZ2h0MCArIGxlZnQ2ICogcmlnaHQxICsgbGVmdDEwICogcmlnaHQyICsgbGVmdDE0ICogcmlnaHQzOwogICAgICAgIGNvbnN0IGNvbHVtbjBSb3czID0gbGVmdDMgKiByaWdodDAgKyBsZWZ0NyAqIHJpZ2h0MSArIGxlZnQxMSAqIHJpZ2h0MiArIGxlZnQxNSAqIHJpZ2h0MzsKICAgICAgICBjb25zdCBjb2x1bW4xUm93MCA9IGxlZnQwICogcmlnaHQ0ICsgbGVmdDQgKiByaWdodDUgKyBsZWZ0OCAqIHJpZ2h0NiArIGxlZnQxMiAqIHJpZ2h0NzsKICAgICAgICBjb25zdCBjb2x1bW4xUm93MSA9IGxlZnQxICogcmlnaHQ0ICsgbGVmdDUgKiByaWdodDUgKyBsZWZ0OSAqIHJpZ2h0NiArIGxlZnQxMyAqIHJpZ2h0NzsKICAgICAgICBjb25zdCBjb2x1bW4xUm93MiA9IGxlZnQyICogcmlnaHQ0ICsgbGVmdDYgKiByaWdodDUgKyBsZWZ0MTAgKiByaWdodDYgKyBsZWZ0MTQgKiByaWdodDc7CiAgICAgICAgY29uc3QgY29sdW1uMVJvdzMgPSBsZWZ0MyAqIHJpZ2h0NCArIGxlZnQ3ICogcmlnaHQ1ICsgbGVmdDExICogcmlnaHQ2ICsgbGVmdDE1ICogcmlnaHQ3OwogICAgICAgIGNvbnN0IGNvbHVtbjJSb3cwID0gbGVmdDAgKiByaWdodDggKyBsZWZ0NCAqIHJpZ2h0OSArIGxlZnQ4ICogcmlnaHQxMCArIGxlZnQxMiAqIHJpZ2h0MTE7CiAgICAgICAgY29uc3QgY29sdW1uMlJvdzEgPSBsZWZ0MSAqIHJpZ2h0OCArIGxlZnQ1ICogcmlnaHQ5ICsgbGVmdDkgKiByaWdodDEwICsgbGVmdDEzICogcmlnaHQxMTsKICAgICAgICBjb25zdCBjb2x1bW4yUm93MiA9IGxlZnQyICogcmlnaHQ4ICsgbGVmdDYgKiByaWdodDkgKyBsZWZ0MTAgKiByaWdodDEwICsgbGVmdDE0ICogcmlnaHQxMTsKICAgICAgICBjb25zdCBjb2x1bW4yUm93MyA9IGxlZnQzICogcmlnaHQ4ICsgbGVmdDcgKiByaWdodDkgKyBsZWZ0MTEgKiByaWdodDEwICsgbGVmdDE1ICogcmlnaHQxMTsKICAgICAgICBjb25zdCBjb2x1bW4zUm93MCA9IGxlZnQwICogcmlnaHQxMiArIGxlZnQ0ICogcmlnaHQxMyArIGxlZnQ4ICogcmlnaHQxNCArIGxlZnQxMiAqIHJpZ2h0MTU7CiAgICAgICAgY29uc3QgY29sdW1uM1JvdzEgPSBsZWZ0MSAqIHJpZ2h0MTIgKyBsZWZ0NSAqIHJpZ2h0MTMgKyBsZWZ0OSAqIHJpZ2h0MTQgKyBsZWZ0MTMgKiByaWdodDE1OwogICAgICAgIGNvbnN0IGNvbHVtbjNSb3cyID0gbGVmdDIgKiByaWdodDEyICsgbGVmdDYgKiByaWdodDEzICsgbGVmdDEwICogcmlnaHQxNCArIGxlZnQxNCAqIHJpZ2h0MTU7CiAgICAgICAgY29uc3QgY29sdW1uM1JvdzMgPSBsZWZ0MyAqIHJpZ2h0MTIgKyBsZWZ0NyAqIHJpZ2h0MTMgKyBsZWZ0MTEgKiByaWdodDE0ICsgbGVmdDE1ICogcmlnaHQxNTsKICAgICAgICByZXN1bHRbMF0gPSBjb2x1bW4wUm93MDsKICAgICAgICByZXN1bHRbMV0gPSBjb2x1bW4wUm93MTsKICAgICAgICByZXN1bHRbMl0gPSBjb2x1bW4wUm93MjsKICAgICAgICByZXN1bHRbM10gPSBjb2x1bW4wUm93MzsKICAgICAgICByZXN1bHRbNF0gPSBjb2x1bW4xUm93MDsKICAgICAgICByZXN1bHRbNV0gPSBjb2x1bW4xUm93MTsKICAgICAgICByZXN1bHRbNl0gPSBjb2x1bW4xUm93MjsKICAgICAgICByZXN1bHRbN10gPSBjb2x1bW4xUm93MzsKICAgICAgICByZXN1bHRbOF0gPSBjb2x1bW4yUm93MDsKICAgICAgICByZXN1bHRbOV0gPSBjb2x1bW4yUm93MTsKICAgICAgICByZXN1bHRbMTBdID0gY29sdW1uMlJvdzI7CiAgICAgICAgcmVzdWx0WzExXSA9IGNvbHVtbjJSb3czOwogICAgICAgIHJlc3VsdFsxMl0gPSBjb2x1bW4zUm93MDsKICAgICAgICByZXN1bHRbMTNdID0gY29sdW1uM1JvdzE7CiAgICAgICAgcmVzdWx0WzE0XSA9IGNvbHVtbjNSb3cyOwogICAgICAgIHJlc3VsdFsxNV0gPSBjb2x1bW4zUm93MzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXg0LmFkZCA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImxlZnQiLCBsZWZ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJpZ2h0IiwgcmlnaHQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHRbMF0gPSBsZWZ0WzBdICsgcmlnaHRbMF07CiAgICAgICAgcmVzdWx0WzFdID0gbGVmdFsxXSArIHJpZ2h0WzFdOwogICAgICAgIHJlc3VsdFsyXSA9IGxlZnRbMl0gKyByaWdodFsyXTsKICAgICAgICByZXN1bHRbM10gPSBsZWZ0WzNdICsgcmlnaHRbM107CiAgICAgICAgcmVzdWx0WzRdID0gbGVmdFs0XSArIHJpZ2h0WzRdOwogICAgICAgIHJlc3VsdFs1XSA9IGxlZnRbNV0gKyByaWdodFs1XTsKICAgICAgICByZXN1bHRbNl0gPSBsZWZ0WzZdICsgcmlnaHRbNl07CiAgICAgICAgcmVzdWx0WzddID0gbGVmdFs3XSArIHJpZ2h0WzddOwogICAgICAgIHJlc3VsdFs4XSA9IGxlZnRbOF0gKyByaWdodFs4XTsKICAgICAgICByZXN1bHRbOV0gPSBsZWZ0WzldICsgcmlnaHRbOV07CiAgICAgICAgcmVzdWx0WzEwXSA9IGxlZnRbMTBdICsgcmlnaHRbMTBdOwogICAgICAgIHJlc3VsdFsxMV0gPSBsZWZ0WzExXSArIHJpZ2h0WzExXTsKICAgICAgICByZXN1bHRbMTJdID0gbGVmdFsxMl0gKyByaWdodFsxMl07CiAgICAgICAgcmVzdWx0WzEzXSA9IGxlZnRbMTNdICsgcmlnaHRbMTNdOwogICAgICAgIHJlc3VsdFsxNF0gPSBsZWZ0WzE0XSArIHJpZ2h0WzE0XTsKICAgICAgICByZXN1bHRbMTVdID0gbGVmdFsxNV0gKyByaWdodFsxNV07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4NC5zdWJ0cmFjdCA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImxlZnQiLCBsZWZ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJpZ2h0IiwgcmlnaHQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHRbMF0gPSBsZWZ0WzBdIC0gcmlnaHRbMF07CiAgICAgICAgcmVzdWx0WzFdID0gbGVmdFsxXSAtIHJpZ2h0WzFdOwogICAgICAgIHJlc3VsdFsyXSA9IGxlZnRbMl0gLSByaWdodFsyXTsKICAgICAgICByZXN1bHRbM10gPSBsZWZ0WzNdIC0gcmlnaHRbM107CiAgICAgICAgcmVzdWx0WzRdID0gbGVmdFs0XSAtIHJpZ2h0WzRdOwogICAgICAgIHJlc3VsdFs1XSA9IGxlZnRbNV0gLSByaWdodFs1XTsKICAgICAgICByZXN1bHRbNl0gPSBsZWZ0WzZdIC0gcmlnaHRbNl07CiAgICAgICAgcmVzdWx0WzddID0gbGVmdFs3XSAtIHJpZ2h0WzddOwogICAgICAgIHJlc3VsdFs4XSA9IGxlZnRbOF0gLSByaWdodFs4XTsKICAgICAgICByZXN1bHRbOV0gPSBsZWZ0WzldIC0gcmlnaHRbOV07CiAgICAgICAgcmVzdWx0WzEwXSA9IGxlZnRbMTBdIC0gcmlnaHRbMTBdOwogICAgICAgIHJlc3VsdFsxMV0gPSBsZWZ0WzExXSAtIHJpZ2h0WzExXTsKICAgICAgICByZXN1bHRbMTJdID0gbGVmdFsxMl0gLSByaWdodFsxMl07CiAgICAgICAgcmVzdWx0WzEzXSA9IGxlZnRbMTNdIC0gcmlnaHRbMTNdOwogICAgICAgIHJlc3VsdFsxNF0gPSBsZWZ0WzE0XSAtIHJpZ2h0WzE0XTsKICAgICAgICByZXN1bHRbMTVdID0gbGVmdFsxNV0gLSByaWdodFsxNV07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4NC5tdWx0aXBseVRyYW5zZm9ybWF0aW9uID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IGxlZnQwID0gbGVmdFswXTsKICAgICAgICBjb25zdCBsZWZ0MSA9IGxlZnRbMV07CiAgICAgICAgY29uc3QgbGVmdDIgPSBsZWZ0WzJdOwogICAgICAgIGNvbnN0IGxlZnQ0ID0gbGVmdFs0XTsKICAgICAgICBjb25zdCBsZWZ0NSA9IGxlZnRbNV07CiAgICAgICAgY29uc3QgbGVmdDYgPSBsZWZ0WzZdOwogICAgICAgIGNvbnN0IGxlZnQ4ID0gbGVmdFs4XTsKICAgICAgICBjb25zdCBsZWZ0OSA9IGxlZnRbOV07CiAgICAgICAgY29uc3QgbGVmdDEwID0gbGVmdFsxMF07CiAgICAgICAgY29uc3QgbGVmdDEyID0gbGVmdFsxMl07CiAgICAgICAgY29uc3QgbGVmdDEzID0gbGVmdFsxM107CiAgICAgICAgY29uc3QgbGVmdDE0ID0gbGVmdFsxNF07CiAgICAgICAgY29uc3QgcmlnaHQwID0gcmlnaHRbMF07CiAgICAgICAgY29uc3QgcmlnaHQxID0gcmlnaHRbMV07CiAgICAgICAgY29uc3QgcmlnaHQyID0gcmlnaHRbMl07CiAgICAgICAgY29uc3QgcmlnaHQ0ID0gcmlnaHRbNF07CiAgICAgICAgY29uc3QgcmlnaHQ1ID0gcmlnaHRbNV07CiAgICAgICAgY29uc3QgcmlnaHQ2ID0gcmlnaHRbNl07CiAgICAgICAgY29uc3QgcmlnaHQ4ID0gcmlnaHRbOF07CiAgICAgICAgY29uc3QgcmlnaHQ5ID0gcmlnaHRbOV07CiAgICAgICAgY29uc3QgcmlnaHQxMCA9IHJpZ2h0WzEwXTsKICAgICAgICBjb25zdCByaWdodDEyID0gcmlnaHRbMTJdOwogICAgICAgIGNvbnN0IHJpZ2h0MTMgPSByaWdodFsxM107CiAgICAgICAgY29uc3QgcmlnaHQxNCA9IHJpZ2h0WzE0XTsKICAgICAgICBjb25zdCBjb2x1bW4wUm93MCA9IGxlZnQwICogcmlnaHQwICsgbGVmdDQgKiByaWdodDEgKyBsZWZ0OCAqIHJpZ2h0MjsKICAgICAgICBjb25zdCBjb2x1bW4wUm93MSA9IGxlZnQxICogcmlnaHQwICsgbGVmdDUgKiByaWdodDEgKyBsZWZ0OSAqIHJpZ2h0MjsKICAgICAgICBjb25zdCBjb2x1bW4wUm93MiA9IGxlZnQyICogcmlnaHQwICsgbGVmdDYgKiByaWdodDEgKyBsZWZ0MTAgKiByaWdodDI7CiAgICAgICAgY29uc3QgY29sdW1uMVJvdzAgPSBsZWZ0MCAqIHJpZ2h0NCArIGxlZnQ0ICogcmlnaHQ1ICsgbGVmdDggKiByaWdodDY7CiAgICAgICAgY29uc3QgY29sdW1uMVJvdzEgPSBsZWZ0MSAqIHJpZ2h0NCArIGxlZnQ1ICogcmlnaHQ1ICsgbGVmdDkgKiByaWdodDY7CiAgICAgICAgY29uc3QgY29sdW1uMVJvdzIgPSBsZWZ0MiAqIHJpZ2h0NCArIGxlZnQ2ICogcmlnaHQ1ICsgbGVmdDEwICogcmlnaHQ2OwogICAgICAgIGNvbnN0IGNvbHVtbjJSb3cwID0gbGVmdDAgKiByaWdodDggKyBsZWZ0NCAqIHJpZ2h0OSArIGxlZnQ4ICogcmlnaHQxMDsKICAgICAgICBjb25zdCBjb2x1bW4yUm93MSA9IGxlZnQxICogcmlnaHQ4ICsgbGVmdDUgKiByaWdodDkgKyBsZWZ0OSAqIHJpZ2h0MTA7CiAgICAgICAgY29uc3QgY29sdW1uMlJvdzIgPSBsZWZ0MiAqIHJpZ2h0OCArIGxlZnQ2ICogcmlnaHQ5ICsgbGVmdDEwICogcmlnaHQxMDsKICAgICAgICBjb25zdCBjb2x1bW4zUm93MCA9IGxlZnQwICogcmlnaHQxMiArIGxlZnQ0ICogcmlnaHQxMyArIGxlZnQ4ICogcmlnaHQxNCArIGxlZnQxMjsKICAgICAgICBjb25zdCBjb2x1bW4zUm93MSA9IGxlZnQxICogcmlnaHQxMiArIGxlZnQ1ICogcmlnaHQxMyArIGxlZnQ5ICogcmlnaHQxNCArIGxlZnQxMzsKICAgICAgICBjb25zdCBjb2x1bW4zUm93MiA9IGxlZnQyICogcmlnaHQxMiArIGxlZnQ2ICogcmlnaHQxMyArIGxlZnQxMCAqIHJpZ2h0MTQgKyBsZWZ0MTQ7CiAgICAgICAgcmVzdWx0WzBdID0gY29sdW1uMFJvdzA7CiAgICAgICAgcmVzdWx0WzFdID0gY29sdW1uMFJvdzE7CiAgICAgICAgcmVzdWx0WzJdID0gY29sdW1uMFJvdzI7CiAgICAgICAgcmVzdWx0WzNdID0gMDsKICAgICAgICByZXN1bHRbNF0gPSBjb2x1bW4xUm93MDsKICAgICAgICByZXN1bHRbNV0gPSBjb2x1bW4xUm93MTsKICAgICAgICByZXN1bHRbNl0gPSBjb2x1bW4xUm93MjsKICAgICAgICByZXN1bHRbN10gPSAwOwogICAgICAgIHJlc3VsdFs4XSA9IGNvbHVtbjJSb3cwOwogICAgICAgIHJlc3VsdFs5XSA9IGNvbHVtbjJSb3cxOwogICAgICAgIHJlc3VsdFsxMF0gPSBjb2x1bW4yUm93MjsKICAgICAgICByZXN1bHRbMTFdID0gMDsKICAgICAgICByZXN1bHRbMTJdID0gY29sdW1uM1JvdzA7CiAgICAgICAgcmVzdWx0WzEzXSA9IGNvbHVtbjNSb3cxOwogICAgICAgIHJlc3VsdFsxNF0gPSBjb2x1bW4zUm93MjsKICAgICAgICByZXN1bHRbMTVdID0gMTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXg0Lm11bHRpcGx5QnlNYXRyaXgzID0gZnVuY3Rpb24obWF0cml4LCByb3RhdGlvbiwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicm90YXRpb24iLCByb3RhdGlvbik7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IGxlZnQwID0gbWF0cml4WzBdOwogICAgICAgIGNvbnN0IGxlZnQxID0gbWF0cml4WzFdOwogICAgICAgIGNvbnN0IGxlZnQyID0gbWF0cml4WzJdOwogICAgICAgIGNvbnN0IGxlZnQ0ID0gbWF0cml4WzRdOwogICAgICAgIGNvbnN0IGxlZnQ1ID0gbWF0cml4WzVdOwogICAgICAgIGNvbnN0IGxlZnQ2ID0gbWF0cml4WzZdOwogICAgICAgIGNvbnN0IGxlZnQ4ID0gbWF0cml4WzhdOwogICAgICAgIGNvbnN0IGxlZnQ5ID0gbWF0cml4WzldOwogICAgICAgIGNvbnN0IGxlZnQxMCA9IG1hdHJpeFsxMF07CiAgICAgICAgY29uc3QgcmlnaHQwID0gcm90YXRpb25bMF07CiAgICAgICAgY29uc3QgcmlnaHQxID0gcm90YXRpb25bMV07CiAgICAgICAgY29uc3QgcmlnaHQyID0gcm90YXRpb25bMl07CiAgICAgICAgY29uc3QgcmlnaHQ0ID0gcm90YXRpb25bM107CiAgICAgICAgY29uc3QgcmlnaHQ1ID0gcm90YXRpb25bNF07CiAgICAgICAgY29uc3QgcmlnaHQ2ID0gcm90YXRpb25bNV07CiAgICAgICAgY29uc3QgcmlnaHQ4ID0gcm90YXRpb25bNl07CiAgICAgICAgY29uc3QgcmlnaHQ5ID0gcm90YXRpb25bN107CiAgICAgICAgY29uc3QgcmlnaHQxMCA9IHJvdGF0aW9uWzhdOwogICAgICAgIGNvbnN0IGNvbHVtbjBSb3cwID0gbGVmdDAgKiByaWdodDAgKyBsZWZ0NCAqIHJpZ2h0MSArIGxlZnQ4ICogcmlnaHQyOwogICAgICAgIGNvbnN0IGNvbHVtbjBSb3cxID0gbGVmdDEgKiByaWdodDAgKyBsZWZ0NSAqIHJpZ2h0MSArIGxlZnQ5ICogcmlnaHQyOwogICAgICAgIGNvbnN0IGNvbHVtbjBSb3cyID0gbGVmdDIgKiByaWdodDAgKyBsZWZ0NiAqIHJpZ2h0MSArIGxlZnQxMCAqIHJpZ2h0MjsKICAgICAgICBjb25zdCBjb2x1bW4xUm93MCA9IGxlZnQwICogcmlnaHQ0ICsgbGVmdDQgKiByaWdodDUgKyBsZWZ0OCAqIHJpZ2h0NjsKICAgICAgICBjb25zdCBjb2x1bW4xUm93MSA9IGxlZnQxICogcmlnaHQ0ICsgbGVmdDUgKiByaWdodDUgKyBsZWZ0OSAqIHJpZ2h0NjsKICAgICAgICBjb25zdCBjb2x1bW4xUm93MiA9IGxlZnQyICogcmlnaHQ0ICsgbGVmdDYgKiByaWdodDUgKyBsZWZ0MTAgKiByaWdodDY7CiAgICAgICAgY29uc3QgY29sdW1uMlJvdzAgPSBsZWZ0MCAqIHJpZ2h0OCArIGxlZnQ0ICogcmlnaHQ5ICsgbGVmdDggKiByaWdodDEwOwogICAgICAgIGNvbnN0IGNvbHVtbjJSb3cxID0gbGVmdDEgKiByaWdodDggKyBsZWZ0NSAqIHJpZ2h0OSArIGxlZnQ5ICogcmlnaHQxMDsKICAgICAgICBjb25zdCBjb2x1bW4yUm93MiA9IGxlZnQyICogcmlnaHQ4ICsgbGVmdDYgKiByaWdodDkgKyBsZWZ0MTAgKiByaWdodDEwOwogICAgICAgIHJlc3VsdFswXSA9IGNvbHVtbjBSb3cwOwogICAgICAgIHJlc3VsdFsxXSA9IGNvbHVtbjBSb3cxOwogICAgICAgIHJlc3VsdFsyXSA9IGNvbHVtbjBSb3cyOwogICAgICAgIHJlc3VsdFszXSA9IDA7CiAgICAgICAgcmVzdWx0WzRdID0gY29sdW1uMVJvdzA7CiAgICAgICAgcmVzdWx0WzVdID0gY29sdW1uMVJvdzE7CiAgICAgICAgcmVzdWx0WzZdID0gY29sdW1uMVJvdzI7CiAgICAgICAgcmVzdWx0WzddID0gMDsKICAgICAgICByZXN1bHRbOF0gPSBjb2x1bW4yUm93MDsKICAgICAgICByZXN1bHRbOV0gPSBjb2x1bW4yUm93MTsKICAgICAgICByZXN1bHRbMTBdID0gY29sdW1uMlJvdzI7CiAgICAgICAgcmVzdWx0WzExXSA9IDA7CiAgICAgICAgcmVzdWx0WzEyXSA9IG1hdHJpeFsxMl07CiAgICAgICAgcmVzdWx0WzEzXSA9IG1hdHJpeFsxM107CiAgICAgICAgcmVzdWx0WzE0XSA9IG1hdHJpeFsxNF07CiAgICAgICAgcmVzdWx0WzE1XSA9IG1hdHJpeFsxNV07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4NC5tdWx0aXBseUJ5VHJhbnNsYXRpb24gPSBmdW5jdGlvbihtYXRyaXgsIHRyYW5zbGF0aW9uMiwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgidHJhbnNsYXRpb24iLCB0cmFuc2xhdGlvbjIpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBjb25zdCB4ID0gdHJhbnNsYXRpb24yLng7CiAgICAgICAgY29uc3QgeSA9IHRyYW5zbGF0aW9uMi55OwogICAgICAgIGNvbnN0IHogPSB0cmFuc2xhdGlvbjIuejsKICAgICAgICBjb25zdCB0eCA9IHggKiBtYXRyaXhbMF0gKyB5ICogbWF0cml4WzRdICsgeiAqIG1hdHJpeFs4XSArIG1hdHJpeFsxMl07CiAgICAgICAgY29uc3QgdHkgPSB4ICogbWF0cml4WzFdICsgeSAqIG1hdHJpeFs1XSArIHogKiBtYXRyaXhbOV0gKyBtYXRyaXhbMTNdOwogICAgICAgIGNvbnN0IHR6ID0geCAqIG1hdHJpeFsyXSArIHkgKiBtYXRyaXhbNl0gKyB6ICogbWF0cml4WzEwXSArIG1hdHJpeFsxNF07CiAgICAgICAgcmVzdWx0WzBdID0gbWF0cml4WzBdOwogICAgICAgIHJlc3VsdFsxXSA9IG1hdHJpeFsxXTsKICAgICAgICByZXN1bHRbMl0gPSBtYXRyaXhbMl07CiAgICAgICAgcmVzdWx0WzNdID0gbWF0cml4WzNdOwogICAgICAgIHJlc3VsdFs0XSA9IG1hdHJpeFs0XTsKICAgICAgICByZXN1bHRbNV0gPSBtYXRyaXhbNV07CiAgICAgICAgcmVzdWx0WzZdID0gbWF0cml4WzZdOwogICAgICAgIHJlc3VsdFs3XSA9IG1hdHJpeFs3XTsKICAgICAgICByZXN1bHRbOF0gPSBtYXRyaXhbOF07CiAgICAgICAgcmVzdWx0WzldID0gbWF0cml4WzldOwogICAgICAgIHJlc3VsdFsxMF0gPSBtYXRyaXhbMTBdOwogICAgICAgIHJlc3VsdFsxMV0gPSBtYXRyaXhbMTFdOwogICAgICAgIHJlc3VsdFsxMl0gPSB0eDsKICAgICAgICByZXN1bHRbMTNdID0gdHk7CiAgICAgICAgcmVzdWx0WzE0XSA9IHR6OwogICAgICAgIHJlc3VsdFsxNV0gPSBtYXRyaXhbMTVdOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDQubXVsdGlwbHlCeVNjYWxlID0gZnVuY3Rpb24obWF0cml4LCBzY2FsZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic2NhbGUiLCBzY2FsZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IHNjYWxlWCA9IHNjYWxlLng7CiAgICAgICAgY29uc3Qgc2NhbGVZID0gc2NhbGUueTsKICAgICAgICBjb25zdCBzY2FsZVogPSBzY2FsZS56OwogICAgICAgIGlmIChzY2FsZVggPT09IDEgJiYgc2NhbGVZID09PSAxICYmIHNjYWxlWiA9PT0gMSkgewogICAgICAgICAgcmV0dXJuIE1hdHJpeDQuY2xvbmUobWF0cml4LCByZXN1bHQpOwogICAgICAgIH0KICAgICAgICByZXN1bHRbMF0gPSBzY2FsZVggKiBtYXRyaXhbMF07CiAgICAgICAgcmVzdWx0WzFdID0gc2NhbGVYICogbWF0cml4WzFdOwogICAgICAgIHJlc3VsdFsyXSA9IHNjYWxlWCAqIG1hdHJpeFsyXTsKICAgICAgICByZXN1bHRbM10gPSBtYXRyaXhbM107CiAgICAgICAgcmVzdWx0WzRdID0gc2NhbGVZICogbWF0cml4WzRdOwogICAgICAgIHJlc3VsdFs1XSA9IHNjYWxlWSAqIG1hdHJpeFs1XTsKICAgICAgICByZXN1bHRbNl0gPSBzY2FsZVkgKiBtYXRyaXhbNl07CiAgICAgICAgcmVzdWx0WzddID0gbWF0cml4WzddOwogICAgICAgIHJlc3VsdFs4XSA9IHNjYWxlWiAqIG1hdHJpeFs4XTsKICAgICAgICByZXN1bHRbOV0gPSBzY2FsZVogKiBtYXRyaXhbOV07CiAgICAgICAgcmVzdWx0WzEwXSA9IHNjYWxlWiAqIG1hdHJpeFsxMF07CiAgICAgICAgcmVzdWx0WzExXSA9IG1hdHJpeFsxMV07CiAgICAgICAgcmVzdWx0WzEyXSA9IG1hdHJpeFsxMl07CiAgICAgICAgcmVzdWx0WzEzXSA9IG1hdHJpeFsxM107CiAgICAgICAgcmVzdWx0WzE0XSA9IG1hdHJpeFsxNF07CiAgICAgICAgcmVzdWx0WzE1XSA9IG1hdHJpeFsxNV07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4NC5tdWx0aXBseUJ5VW5pZm9ybVNjYWxlID0gZnVuY3Rpb24obWF0cml4LCBzY2FsZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigic2NhbGUiLCBzY2FsZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdFswXSA9IG1hdHJpeFswXSAqIHNjYWxlOwogICAgICAgIHJlc3VsdFsxXSA9IG1hdHJpeFsxXSAqIHNjYWxlOwogICAgICAgIHJlc3VsdFsyXSA9IG1hdHJpeFsyXSAqIHNjYWxlOwogICAgICAgIHJlc3VsdFszXSA9IG1hdHJpeFszXTsKICAgICAgICByZXN1bHRbNF0gPSBtYXRyaXhbNF0gKiBzY2FsZTsKICAgICAgICByZXN1bHRbNV0gPSBtYXRyaXhbNV0gKiBzY2FsZTsKICAgICAgICByZXN1bHRbNl0gPSBtYXRyaXhbNl0gKiBzY2FsZTsKICAgICAgICByZXN1bHRbN10gPSBtYXRyaXhbN107CiAgICAgICAgcmVzdWx0WzhdID0gbWF0cml4WzhdICogc2NhbGU7CiAgICAgICAgcmVzdWx0WzldID0gbWF0cml4WzldICogc2NhbGU7CiAgICAgICAgcmVzdWx0WzEwXSA9IG1hdHJpeFsxMF0gKiBzY2FsZTsKICAgICAgICByZXN1bHRbMTFdID0gbWF0cml4WzExXTsKICAgICAgICByZXN1bHRbMTJdID0gbWF0cml4WzEyXTsKICAgICAgICByZXN1bHRbMTNdID0gbWF0cml4WzEzXTsKICAgICAgICByZXN1bHRbMTRdID0gbWF0cml4WzE0XTsKICAgICAgICByZXN1bHRbMTVdID0gbWF0cml4WzE1XTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXg0Lm11bHRpcGx5QnlWZWN0b3IgPSBmdW5jdGlvbihtYXRyaXgsIGNhcnRlc2lhbjExLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IHZYID0gY2FydGVzaWFuMTEueDsKICAgICAgICBjb25zdCB2WSA9IGNhcnRlc2lhbjExLnk7CiAgICAgICAgY29uc3QgdlogPSBjYXJ0ZXNpYW4xMS56OwogICAgICAgIGNvbnN0IHZXID0gY2FydGVzaWFuMTEudzsKICAgICAgICBjb25zdCB4ID0gbWF0cml4WzBdICogdlggKyBtYXRyaXhbNF0gKiB2WSArIG1hdHJpeFs4XSAqIHZaICsgbWF0cml4WzEyXSAqIHZXOwogICAgICAgIGNvbnN0IHkgPSBtYXRyaXhbMV0gKiB2WCArIG1hdHJpeFs1XSAqIHZZICsgbWF0cml4WzldICogdlogKyBtYXRyaXhbMTNdICogdlc7CiAgICAgICAgY29uc3QgeiA9IG1hdHJpeFsyXSAqIHZYICsgbWF0cml4WzZdICogdlkgKyBtYXRyaXhbMTBdICogdlogKyBtYXRyaXhbMTRdICogdlc7CiAgICAgICAgY29uc3QgdyA9IG1hdHJpeFszXSAqIHZYICsgbWF0cml4WzddICogdlkgKyBtYXRyaXhbMTFdICogdlogKyBtYXRyaXhbMTVdICogdlc7CiAgICAgICAgcmVzdWx0LnggPSB4OwogICAgICAgIHJlc3VsdC55ID0geTsKICAgICAgICByZXN1bHQueiA9IHo7CiAgICAgICAgcmVzdWx0LncgPSB3OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDQubXVsdGlwbHlCeVBvaW50QXNWZWN0b3IgPSBmdW5jdGlvbihtYXRyaXgsIGNhcnRlc2lhbjExLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IHZYID0gY2FydGVzaWFuMTEueDsKICAgICAgICBjb25zdCB2WSA9IGNhcnRlc2lhbjExLnk7CiAgICAgICAgY29uc3QgdlogPSBjYXJ0ZXNpYW4xMS56OwogICAgICAgIGNvbnN0IHggPSBtYXRyaXhbMF0gKiB2WCArIG1hdHJpeFs0XSAqIHZZICsgbWF0cml4WzhdICogdlo7CiAgICAgICAgY29uc3QgeSA9IG1hdHJpeFsxXSAqIHZYICsgbWF0cml4WzVdICogdlkgKyBtYXRyaXhbOV0gKiB2WjsKICAgICAgICBjb25zdCB6ID0gbWF0cml4WzJdICogdlggKyBtYXRyaXhbNl0gKiB2WSArIG1hdHJpeFsxMF0gKiB2WjsKICAgICAgICByZXN1bHQueCA9IHg7CiAgICAgICAgcmVzdWx0LnkgPSB5OwogICAgICAgIHJlc3VsdC56ID0gejsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXg0Lm11bHRpcGx5QnlQb2ludCA9IGZ1bmN0aW9uKG1hdHJpeCwgY2FydGVzaWFuMTEsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF0cml4IiwgbWF0cml4KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsIGNhcnRlc2lhbjExKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3QgdlggPSBjYXJ0ZXNpYW4xMS54OwogICAgICAgIGNvbnN0IHZZID0gY2FydGVzaWFuMTEueTsKICAgICAgICBjb25zdCB2WiA9IGNhcnRlc2lhbjExLno7CiAgICAgICAgY29uc3QgeCA9IG1hdHJpeFswXSAqIHZYICsgbWF0cml4WzRdICogdlkgKyBtYXRyaXhbOF0gKiB2WiArIG1hdHJpeFsxMl07CiAgICAgICAgY29uc3QgeSA9IG1hdHJpeFsxXSAqIHZYICsgbWF0cml4WzVdICogdlkgKyBtYXRyaXhbOV0gKiB2WiArIG1hdHJpeFsxM107CiAgICAgICAgY29uc3QgeiA9IG1hdHJpeFsyXSAqIHZYICsgbWF0cml4WzZdICogdlkgKyBtYXRyaXhbMTBdICogdlogKyBtYXRyaXhbMTRdOwogICAgICAgIHJlc3VsdC54ID0geDsKICAgICAgICByZXN1bHQueSA9IHk7CiAgICAgICAgcmVzdWx0LnogPSB6OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDQubXVsdGlwbHlCeVNjYWxhciA9IGZ1bmN0aW9uKG1hdHJpeCwgc2NhbGFyLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJzY2FsYXIiLCBzY2FsYXIpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHRbMF0gPSBtYXRyaXhbMF0gKiBzY2FsYXI7CiAgICAgICAgcmVzdWx0WzFdID0gbWF0cml4WzFdICogc2NhbGFyOwogICAgICAgIHJlc3VsdFsyXSA9IG1hdHJpeFsyXSAqIHNjYWxhcjsKICAgICAgICByZXN1bHRbM10gPSBtYXRyaXhbM10gKiBzY2FsYXI7CiAgICAgICAgcmVzdWx0WzRdID0gbWF0cml4WzRdICogc2NhbGFyOwogICAgICAgIHJlc3VsdFs1XSA9IG1hdHJpeFs1XSAqIHNjYWxhcjsKICAgICAgICByZXN1bHRbNl0gPSBtYXRyaXhbNl0gKiBzY2FsYXI7CiAgICAgICAgcmVzdWx0WzddID0gbWF0cml4WzddICogc2NhbGFyOwogICAgICAgIHJlc3VsdFs4XSA9IG1hdHJpeFs4XSAqIHNjYWxhcjsKICAgICAgICByZXN1bHRbOV0gPSBtYXRyaXhbOV0gKiBzY2FsYXI7CiAgICAgICAgcmVzdWx0WzEwXSA9IG1hdHJpeFsxMF0gKiBzY2FsYXI7CiAgICAgICAgcmVzdWx0WzExXSA9IG1hdHJpeFsxMV0gKiBzY2FsYXI7CiAgICAgICAgcmVzdWx0WzEyXSA9IG1hdHJpeFsxMl0gKiBzY2FsYXI7CiAgICAgICAgcmVzdWx0WzEzXSA9IG1hdHJpeFsxM10gKiBzY2FsYXI7CiAgICAgICAgcmVzdWx0WzE0XSA9IG1hdHJpeFsxNF0gKiBzY2FsYXI7CiAgICAgICAgcmVzdWx0WzE1XSA9IG1hdHJpeFsxNV0gKiBzY2FsYXI7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4NC5uZWdhdGUgPSBmdW5jdGlvbihtYXRyaXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF0cml4IiwgbWF0cml4KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0WzBdID0gLW1hdHJpeFswXTsKICAgICAgICByZXN1bHRbMV0gPSAtbWF0cml4WzFdOwogICAgICAgIHJlc3VsdFsyXSA9IC1tYXRyaXhbMl07CiAgICAgICAgcmVzdWx0WzNdID0gLW1hdHJpeFszXTsKICAgICAgICByZXN1bHRbNF0gPSAtbWF0cml4WzRdOwogICAgICAgIHJlc3VsdFs1XSA9IC1tYXRyaXhbNV07CiAgICAgICAgcmVzdWx0WzZdID0gLW1hdHJpeFs2XTsKICAgICAgICByZXN1bHRbN10gPSAtbWF0cml4WzddOwogICAgICAgIHJlc3VsdFs4XSA9IC1tYXRyaXhbOF07CiAgICAgICAgcmVzdWx0WzldID0gLW1hdHJpeFs5XTsKICAgICAgICByZXN1bHRbMTBdID0gLW1hdHJpeFsxMF07CiAgICAgICAgcmVzdWx0WzExXSA9IC1tYXRyaXhbMTFdOwogICAgICAgIHJlc3VsdFsxMl0gPSAtbWF0cml4WzEyXTsKICAgICAgICByZXN1bHRbMTNdID0gLW1hdHJpeFsxM107CiAgICAgICAgcmVzdWx0WzE0XSA9IC1tYXRyaXhbMTRdOwogICAgICAgIHJlc3VsdFsxNV0gPSAtbWF0cml4WzE1XTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXg0LnRyYW5zcG9zZSA9IGZ1bmN0aW9uKG1hdHJpeCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBjb25zdCBtYXRyaXgxID0gbWF0cml4WzFdOwogICAgICAgIGNvbnN0IG1hdHJpeDIgPSBtYXRyaXhbMl07CiAgICAgICAgY29uc3QgbWF0cml4MyA9IG1hdHJpeFszXTsKICAgICAgICBjb25zdCBtYXRyaXg2ID0gbWF0cml4WzZdOwogICAgICAgIGNvbnN0IG1hdHJpeDcgPSBtYXRyaXhbN107CiAgICAgICAgY29uc3QgbWF0cml4MTEgPSBtYXRyaXhbMTFdOwogICAgICAgIHJlc3VsdFswXSA9IG1hdHJpeFswXTsKICAgICAgICByZXN1bHRbMV0gPSBtYXRyaXhbNF07CiAgICAgICAgcmVzdWx0WzJdID0gbWF0cml4WzhdOwogICAgICAgIHJlc3VsdFszXSA9IG1hdHJpeFsxMl07CiAgICAgICAgcmVzdWx0WzRdID0gbWF0cml4MTsKICAgICAgICByZXN1bHRbNV0gPSBtYXRyaXhbNV07CiAgICAgICAgcmVzdWx0WzZdID0gbWF0cml4WzldOwogICAgICAgIHJlc3VsdFs3XSA9IG1hdHJpeFsxM107CiAgICAgICAgcmVzdWx0WzhdID0gbWF0cml4MjsKICAgICAgICByZXN1bHRbOV0gPSBtYXRyaXg2OwogICAgICAgIHJlc3VsdFsxMF0gPSBtYXRyaXhbMTBdOwogICAgICAgIHJlc3VsdFsxMV0gPSBtYXRyaXhbMTRdOwogICAgICAgIHJlc3VsdFsxMl0gPSBtYXRyaXgzOwogICAgICAgIHJlc3VsdFsxM10gPSBtYXRyaXg3OwogICAgICAgIHJlc3VsdFsxNF0gPSBtYXRyaXgxMTsKICAgICAgICByZXN1bHRbMTVdID0gbWF0cml4WzE1XTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXg0LmFicyA9IGZ1bmN0aW9uKG1hdHJpeCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHRbMF0gPSBNYXRoLmFicyhtYXRyaXhbMF0pOwogICAgICAgIHJlc3VsdFsxXSA9IE1hdGguYWJzKG1hdHJpeFsxXSk7CiAgICAgICAgcmVzdWx0WzJdID0gTWF0aC5hYnMobWF0cml4WzJdKTsKICAgICAgICByZXN1bHRbM10gPSBNYXRoLmFicyhtYXRyaXhbM10pOwogICAgICAgIHJlc3VsdFs0XSA9IE1hdGguYWJzKG1hdHJpeFs0XSk7CiAgICAgICAgcmVzdWx0WzVdID0gTWF0aC5hYnMobWF0cml4WzVdKTsKICAgICAgICByZXN1bHRbNl0gPSBNYXRoLmFicyhtYXRyaXhbNl0pOwogICAgICAgIHJlc3VsdFs3XSA9IE1hdGguYWJzKG1hdHJpeFs3XSk7CiAgICAgICAgcmVzdWx0WzhdID0gTWF0aC5hYnMobWF0cml4WzhdKTsKICAgICAgICByZXN1bHRbOV0gPSBNYXRoLmFicyhtYXRyaXhbOV0pOwogICAgICAgIHJlc3VsdFsxMF0gPSBNYXRoLmFicyhtYXRyaXhbMTBdKTsKICAgICAgICByZXN1bHRbMTFdID0gTWF0aC5hYnMobWF0cml4WzExXSk7CiAgICAgICAgcmVzdWx0WzEyXSA9IE1hdGguYWJzKG1hdHJpeFsxMl0pOwogICAgICAgIHJlc3VsdFsxM10gPSBNYXRoLmFicyhtYXRyaXhbMTNdKTsKICAgICAgICByZXN1bHRbMTRdID0gTWF0aC5hYnMobWF0cml4WzE0XSk7CiAgICAgICAgcmVzdWx0WzE1XSA9IE1hdGguYWJzKG1hdHJpeFsxNV0pOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDQuZXF1YWxzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQpIHsKICAgICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgZGVmaW5lZF9kZWZhdWx0KGxlZnQpICYmIGRlZmluZWRfZGVmYXVsdChyaWdodCkgJiYgLy8gVHJhbnNsYXRpb24KICAgICAgICBsZWZ0WzEyXSA9PT0gcmlnaHRbMTJdICYmIGxlZnRbMTNdID09PSByaWdodFsxM10gJiYgbGVmdFsxNF0gPT09IHJpZ2h0WzE0XSAmJiAvLyBSb3RhdGlvbi9zY2FsZQogICAgICAgIGxlZnRbMF0gPT09IHJpZ2h0WzBdICYmIGxlZnRbMV0gPT09IHJpZ2h0WzFdICYmIGxlZnRbMl0gPT09IHJpZ2h0WzJdICYmIGxlZnRbNF0gPT09IHJpZ2h0WzRdICYmIGxlZnRbNV0gPT09IHJpZ2h0WzVdICYmIGxlZnRbNl0gPT09IHJpZ2h0WzZdICYmIGxlZnRbOF0gPT09IHJpZ2h0WzhdICYmIGxlZnRbOV0gPT09IHJpZ2h0WzldICYmIGxlZnRbMTBdID09PSByaWdodFsxMF0gJiYgLy8gQm90dG9tIHJvdwogICAgICAgIGxlZnRbM10gPT09IHJpZ2h0WzNdICYmIGxlZnRbN10gPT09IHJpZ2h0WzddICYmIGxlZnRbMTFdID09PSByaWdodFsxMV0gJiYgbGVmdFsxNV0gPT09IHJpZ2h0WzE1XTsKICAgICAgfTsKICAgICAgTWF0cml4NC5lcXVhbHNFcHNpbG9uID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIGVwc2lsb24pIHsKICAgICAgICBlcHNpbG9uID0gZXBzaWxvbiA/PyAwOwogICAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodCB8fCBkZWZpbmVkX2RlZmF1bHQobGVmdCkgJiYgZGVmaW5lZF9kZWZhdWx0KHJpZ2h0KSAmJiBNYXRoLmFicyhsZWZ0WzBdIC0gcmlnaHRbMF0pIDw9IGVwc2lsb24gJiYgTWF0aC5hYnMobGVmdFsxXSAtIHJpZ2h0WzFdKSA8PSBlcHNpbG9uICYmIE1hdGguYWJzKGxlZnRbMl0gLSByaWdodFsyXSkgPD0gZXBzaWxvbiAmJiBNYXRoLmFicyhsZWZ0WzNdIC0gcmlnaHRbM10pIDw9IGVwc2lsb24gJiYgTWF0aC5hYnMobGVmdFs0XSAtIHJpZ2h0WzRdKSA8PSBlcHNpbG9uICYmIE1hdGguYWJzKGxlZnRbNV0gLSByaWdodFs1XSkgPD0gZXBzaWxvbiAmJiBNYXRoLmFicyhsZWZ0WzZdIC0gcmlnaHRbNl0pIDw9IGVwc2lsb24gJiYgTWF0aC5hYnMobGVmdFs3XSAtIHJpZ2h0WzddKSA8PSBlcHNpbG9uICYmIE1hdGguYWJzKGxlZnRbOF0gLSByaWdodFs4XSkgPD0gZXBzaWxvbiAmJiBNYXRoLmFicyhsZWZ0WzldIC0gcmlnaHRbOV0pIDw9IGVwc2lsb24gJiYgTWF0aC5hYnMobGVmdFsxMF0gLSByaWdodFsxMF0pIDw9IGVwc2lsb24gJiYgTWF0aC5hYnMobGVmdFsxMV0gLSByaWdodFsxMV0pIDw9IGVwc2lsb24gJiYgTWF0aC5hYnMobGVmdFsxMl0gLSByaWdodFsxMl0pIDw9IGVwc2lsb24gJiYgTWF0aC5hYnMobGVmdFsxM10gLSByaWdodFsxM10pIDw9IGVwc2lsb24gJiYgTWF0aC5hYnMobGVmdFsxNF0gLSByaWdodFsxNF0pIDw9IGVwc2lsb24gJiYgTWF0aC5hYnMobGVmdFsxNV0gLSByaWdodFsxNV0pIDw9IGVwc2lsb247CiAgICAgIH07CiAgICAgIE1hdHJpeDQuZ2V0VHJhbnNsYXRpb24gPSBmdW5jdGlvbihtYXRyaXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF0cml4IiwgbWF0cml4KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBtYXRyaXhbMTJdOwogICAgICAgIHJlc3VsdC55ID0gbWF0cml4WzEzXTsKICAgICAgICByZXN1bHQueiA9IG1hdHJpeFsxNF07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4NC5nZXRNYXRyaXgzID0gZnVuY3Rpb24obWF0cml4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdFswXSA9IG1hdHJpeFswXTsKICAgICAgICByZXN1bHRbMV0gPSBtYXRyaXhbMV07CiAgICAgICAgcmVzdWx0WzJdID0gbWF0cml4WzJdOwogICAgICAgIHJlc3VsdFszXSA9IG1hdHJpeFs0XTsKICAgICAgICByZXN1bHRbNF0gPSBtYXRyaXhbNV07CiAgICAgICAgcmVzdWx0WzVdID0gbWF0cml4WzZdOwogICAgICAgIHJlc3VsdFs2XSA9IG1hdHJpeFs4XTsKICAgICAgICByZXN1bHRbN10gPSBtYXRyaXhbOV07CiAgICAgICAgcmVzdWx0WzhdID0gbWF0cml4WzEwXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBzY3JhdGNoSW52ZXJzZVJvdGF0aW9uID0gbmV3IE1hdHJpeDNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoTWF0cml4M1plcm8gPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hCb3R0b21Sb3cgPSBuZXcgQ2FydGVzaWFuNF9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hFeHBlY3RlZEJvdHRvbVJvdyA9IG5ldyBDYXJ0ZXNpYW40X2RlZmF1bHQoMCwgMCwgMCwgMSk7CiAgICAgIE1hdHJpeDQuaW52ZXJzZSA9IGZ1bmN0aW9uKG1hdHJpeCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBjb25zdCBzcmMwID0gbWF0cml4WzBdOwogICAgICAgIGNvbnN0IHNyYzEgPSBtYXRyaXhbNF07CiAgICAgICAgY29uc3Qgc3JjMiA9IG1hdHJpeFs4XTsKICAgICAgICBjb25zdCBzcmMzID0gbWF0cml4WzEyXTsKICAgICAgICBjb25zdCBzcmM0ID0gbWF0cml4WzFdOwogICAgICAgIGNvbnN0IHNyYzUgPSBtYXRyaXhbNV07CiAgICAgICAgY29uc3Qgc3JjNiA9IG1hdHJpeFs5XTsKICAgICAgICBjb25zdCBzcmM3ID0gbWF0cml4WzEzXTsKICAgICAgICBjb25zdCBzcmM4ID0gbWF0cml4WzJdOwogICAgICAgIGNvbnN0IHNyYzkgPSBtYXRyaXhbNl07CiAgICAgICAgY29uc3Qgc3JjMTAgPSBtYXRyaXhbMTBdOwogICAgICAgIGNvbnN0IHNyYzExID0gbWF0cml4WzE0XTsKICAgICAgICBjb25zdCBzcmMxMiA9IG1hdHJpeFszXTsKICAgICAgICBjb25zdCBzcmMxMyA9IG1hdHJpeFs3XTsKICAgICAgICBjb25zdCBzcmMxNCA9IG1hdHJpeFsxMV07CiAgICAgICAgY29uc3Qgc3JjMTUgPSBtYXRyaXhbMTVdOwogICAgICAgIGxldCB0bXAwID0gc3JjMTAgKiBzcmMxNTsKICAgICAgICBsZXQgdG1wMSA9IHNyYzExICogc3JjMTQ7CiAgICAgICAgbGV0IHRtcDIgPSBzcmM5ICogc3JjMTU7CiAgICAgICAgbGV0IHRtcDMgPSBzcmMxMSAqIHNyYzEzOwogICAgICAgIGxldCB0bXA0ID0gc3JjOSAqIHNyYzE0OwogICAgICAgIGxldCB0bXA1ID0gc3JjMTAgKiBzcmMxMzsKICAgICAgICBsZXQgdG1wNiA9IHNyYzggKiBzcmMxNTsKICAgICAgICBsZXQgdG1wNyA9IHNyYzExICogc3JjMTI7CiAgICAgICAgbGV0IHRtcDggPSBzcmM4ICogc3JjMTQ7CiAgICAgICAgbGV0IHRtcDkgPSBzcmMxMCAqIHNyYzEyOwogICAgICAgIGxldCB0bXAxMCA9IHNyYzggKiBzcmMxMzsKICAgICAgICBsZXQgdG1wMTEgPSBzcmM5ICogc3JjMTI7CiAgICAgICAgY29uc3QgZHN0MCA9IHRtcDAgKiBzcmM1ICsgdG1wMyAqIHNyYzYgKyB0bXA0ICogc3JjNyAtICh0bXAxICogc3JjNSArIHRtcDIgKiBzcmM2ICsgdG1wNSAqIHNyYzcpOwogICAgICAgIGNvbnN0IGRzdDEgPSB0bXAxICogc3JjNCArIHRtcDYgKiBzcmM2ICsgdG1wOSAqIHNyYzcgLSAodG1wMCAqIHNyYzQgKyB0bXA3ICogc3JjNiArIHRtcDggKiBzcmM3KTsKICAgICAgICBjb25zdCBkc3QyID0gdG1wMiAqIHNyYzQgKyB0bXA3ICogc3JjNSArIHRtcDEwICogc3JjNyAtICh0bXAzICogc3JjNCArIHRtcDYgKiBzcmM1ICsgdG1wMTEgKiBzcmM3KTsKICAgICAgICBjb25zdCBkc3QzID0gdG1wNSAqIHNyYzQgKyB0bXA4ICogc3JjNSArIHRtcDExICogc3JjNiAtICh0bXA0ICogc3JjNCArIHRtcDkgKiBzcmM1ICsgdG1wMTAgKiBzcmM2KTsKICAgICAgICBjb25zdCBkc3Q0ID0gdG1wMSAqIHNyYzEgKyB0bXAyICogc3JjMiArIHRtcDUgKiBzcmMzIC0gKHRtcDAgKiBzcmMxICsgdG1wMyAqIHNyYzIgKyB0bXA0ICogc3JjMyk7CiAgICAgICAgY29uc3QgZHN0NSA9IHRtcDAgKiBzcmMwICsgdG1wNyAqIHNyYzIgKyB0bXA4ICogc3JjMyAtICh0bXAxICogc3JjMCArIHRtcDYgKiBzcmMyICsgdG1wOSAqIHNyYzMpOwogICAgICAgIGNvbnN0IGRzdDYgPSB0bXAzICogc3JjMCArIHRtcDYgKiBzcmMxICsgdG1wMTEgKiBzcmMzIC0gKHRtcDIgKiBzcmMwICsgdG1wNyAqIHNyYzEgKyB0bXAxMCAqIHNyYzMpOwogICAgICAgIGNvbnN0IGRzdDcgPSB0bXA0ICogc3JjMCArIHRtcDkgKiBzcmMxICsgdG1wMTAgKiBzcmMyIC0gKHRtcDUgKiBzcmMwICsgdG1wOCAqIHNyYzEgKyB0bXAxMSAqIHNyYzIpOwogICAgICAgIHRtcDAgPSBzcmMyICogc3JjNzsKICAgICAgICB0bXAxID0gc3JjMyAqIHNyYzY7CiAgICAgICAgdG1wMiA9IHNyYzEgKiBzcmM3OwogICAgICAgIHRtcDMgPSBzcmMzICogc3JjNTsKICAgICAgICB0bXA0ID0gc3JjMSAqIHNyYzY7CiAgICAgICAgdG1wNSA9IHNyYzIgKiBzcmM1OwogICAgICAgIHRtcDYgPSBzcmMwICogc3JjNzsKICAgICAgICB0bXA3ID0gc3JjMyAqIHNyYzQ7CiAgICAgICAgdG1wOCA9IHNyYzAgKiBzcmM2OwogICAgICAgIHRtcDkgPSBzcmMyICogc3JjNDsKICAgICAgICB0bXAxMCA9IHNyYzAgKiBzcmM1OwogICAgICAgIHRtcDExID0gc3JjMSAqIHNyYzQ7CiAgICAgICAgY29uc3QgZHN0OCA9IHRtcDAgKiBzcmMxMyArIHRtcDMgKiBzcmMxNCArIHRtcDQgKiBzcmMxNSAtICh0bXAxICogc3JjMTMgKyB0bXAyICogc3JjMTQgKyB0bXA1ICogc3JjMTUpOwogICAgICAgIGNvbnN0IGRzdDkgPSB0bXAxICogc3JjMTIgKyB0bXA2ICogc3JjMTQgKyB0bXA5ICogc3JjMTUgLSAodG1wMCAqIHNyYzEyICsgdG1wNyAqIHNyYzE0ICsgdG1wOCAqIHNyYzE1KTsKICAgICAgICBjb25zdCBkc3QxMCA9IHRtcDIgKiBzcmMxMiArIHRtcDcgKiBzcmMxMyArIHRtcDEwICogc3JjMTUgLSAodG1wMyAqIHNyYzEyICsgdG1wNiAqIHNyYzEzICsgdG1wMTEgKiBzcmMxNSk7CiAgICAgICAgY29uc3QgZHN0MTEgPSB0bXA1ICogc3JjMTIgKyB0bXA4ICogc3JjMTMgKyB0bXAxMSAqIHNyYzE0IC0gKHRtcDQgKiBzcmMxMiArIHRtcDkgKiBzcmMxMyArIHRtcDEwICogc3JjMTQpOwogICAgICAgIGNvbnN0IGRzdDEyID0gdG1wMiAqIHNyYzEwICsgdG1wNSAqIHNyYzExICsgdG1wMSAqIHNyYzkgLSAodG1wNCAqIHNyYzExICsgdG1wMCAqIHNyYzkgKyB0bXAzICogc3JjMTApOwogICAgICAgIGNvbnN0IGRzdDEzID0gdG1wOCAqIHNyYzExICsgdG1wMCAqIHNyYzggKyB0bXA3ICogc3JjMTAgLSAodG1wNiAqIHNyYzEwICsgdG1wOSAqIHNyYzExICsgdG1wMSAqIHNyYzgpOwogICAgICAgIGNvbnN0IGRzdDE0ID0gdG1wNiAqIHNyYzkgKyB0bXAxMSAqIHNyYzExICsgdG1wMyAqIHNyYzggLSAodG1wMTAgKiBzcmMxMSArIHRtcDIgKiBzcmM4ICsgdG1wNyAqIHNyYzkpOwogICAgICAgIGNvbnN0IGRzdDE1ID0gdG1wMTAgKiBzcmMxMCArIHRtcDQgKiBzcmM4ICsgdG1wOSAqIHNyYzkgLSAodG1wOCAqIHNyYzkgKyB0bXAxMSAqIHNyYzEwICsgdG1wNSAqIHNyYzgpOwogICAgICAgIGxldCBkZXQgPSBzcmMwICogZHN0MCArIHNyYzEgKiBkc3QxICsgc3JjMiAqIGRzdDIgKyBzcmMzICogZHN0MzsKICAgICAgICBpZiAoTWF0aC5hYnMoZGV0KSA8IE1hdGhfZGVmYXVsdC5FUFNJTE9OMjEpIHsKICAgICAgICAgIGlmIChNYXRyaXgzX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgICAgTWF0cml4NC5nZXRNYXRyaXgzKG1hdHJpeCwgc2NyYXRjaEludmVyc2VSb3RhdGlvbiksCiAgICAgICAgICAgIHNjcmF0Y2hNYXRyaXgzWmVybywKICAgICAgICAgICAgTWF0aF9kZWZhdWx0LkVQU0lMT043CiAgICAgICAgICApICYmIENhcnRlc2lhbjRfZGVmYXVsdC5lcXVhbHMoCiAgICAgICAgICAgIE1hdHJpeDQuZ2V0Um93KG1hdHJpeCwgMywgc2NyYXRjaEJvdHRvbVJvdyksCiAgICAgICAgICAgIHNjcmF0Y2hFeHBlY3RlZEJvdHRvbVJvdwogICAgICAgICAgKSkgewogICAgICAgICAgICByZXN1bHRbMF0gPSAwOwogICAgICAgICAgICByZXN1bHRbMV0gPSAwOwogICAgICAgICAgICByZXN1bHRbMl0gPSAwOwogICAgICAgICAgICByZXN1bHRbM10gPSAwOwogICAgICAgICAgICByZXN1bHRbNF0gPSAwOwogICAgICAgICAgICByZXN1bHRbNV0gPSAwOwogICAgICAgICAgICByZXN1bHRbNl0gPSAwOwogICAgICAgICAgICByZXN1bHRbN10gPSAwOwogICAgICAgICAgICByZXN1bHRbOF0gPSAwOwogICAgICAgICAgICByZXN1bHRbOV0gPSAwOwogICAgICAgICAgICByZXN1bHRbMTBdID0gMDsKICAgICAgICAgICAgcmVzdWx0WzExXSA9IDA7CiAgICAgICAgICAgIHJlc3VsdFsxMl0gPSAtbWF0cml4WzEyXTsKICAgICAgICAgICAgcmVzdWx0WzEzXSA9IC1tYXRyaXhbMTNdOwogICAgICAgICAgICByZXN1bHRbMTRdID0gLW1hdHJpeFsxNF07CiAgICAgICAgICAgIHJlc3VsdFsxNV0gPSAxOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAibWF0cml4IGlzIG5vdCBpbnZlcnRpYmxlIGJlY2F1c2UgaXRzIGRldGVybWluYXRlIGlzIHplcm8uIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZGV0ID0gMSAvIGRldDsKICAgICAgICByZXN1bHRbMF0gPSBkc3QwICogZGV0OwogICAgICAgIHJlc3VsdFsxXSA9IGRzdDEgKiBkZXQ7CiAgICAgICAgcmVzdWx0WzJdID0gZHN0MiAqIGRldDsKICAgICAgICByZXN1bHRbM10gPSBkc3QzICogZGV0OwogICAgICAgIHJlc3VsdFs0XSA9IGRzdDQgKiBkZXQ7CiAgICAgICAgcmVzdWx0WzVdID0gZHN0NSAqIGRldDsKICAgICAgICByZXN1bHRbNl0gPSBkc3Q2ICogZGV0OwogICAgICAgIHJlc3VsdFs3XSA9IGRzdDcgKiBkZXQ7CiAgICAgICAgcmVzdWx0WzhdID0gZHN0OCAqIGRldDsKICAgICAgICByZXN1bHRbOV0gPSBkc3Q5ICogZGV0OwogICAgICAgIHJlc3VsdFsxMF0gPSBkc3QxMCAqIGRldDsKICAgICAgICByZXN1bHRbMTFdID0gZHN0MTEgKiBkZXQ7CiAgICAgICAgcmVzdWx0WzEyXSA9IGRzdDEyICogZGV0OwogICAgICAgIHJlc3VsdFsxM10gPSBkc3QxMyAqIGRldDsKICAgICAgICByZXN1bHRbMTRdID0gZHN0MTQgKiBkZXQ7CiAgICAgICAgcmVzdWx0WzE1XSA9IGRzdDE1ICogZGV0OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDQuaW52ZXJzZVRyYW5zZm9ybWF0aW9uID0gZnVuY3Rpb24obWF0cml4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IG1hdHJpeDAgPSBtYXRyaXhbMF07CiAgICAgICAgY29uc3QgbWF0cml4MSA9IG1hdHJpeFsxXTsKICAgICAgICBjb25zdCBtYXRyaXgyID0gbWF0cml4WzJdOwogICAgICAgIGNvbnN0IG1hdHJpeDQgPSBtYXRyaXhbNF07CiAgICAgICAgY29uc3QgbWF0cml4NSA9IG1hdHJpeFs1XTsKICAgICAgICBjb25zdCBtYXRyaXg2ID0gbWF0cml4WzZdOwogICAgICAgIGNvbnN0IG1hdHJpeDggPSBtYXRyaXhbOF07CiAgICAgICAgY29uc3QgbWF0cml4OSA9IG1hdHJpeFs5XTsKICAgICAgICBjb25zdCBtYXRyaXgxMCA9IG1hdHJpeFsxMF07CiAgICAgICAgY29uc3QgdlggPSBtYXRyaXhbMTJdOwogICAgICAgIGNvbnN0IHZZID0gbWF0cml4WzEzXTsKICAgICAgICBjb25zdCB2WiA9IG1hdHJpeFsxNF07CiAgICAgICAgY29uc3QgeCA9IC1tYXRyaXgwICogdlggLSBtYXRyaXgxICogdlkgLSBtYXRyaXgyICogdlo7CiAgICAgICAgY29uc3QgeSA9IC1tYXRyaXg0ICogdlggLSBtYXRyaXg1ICogdlkgLSBtYXRyaXg2ICogdlo7CiAgICAgICAgY29uc3QgeiA9IC1tYXRyaXg4ICogdlggLSBtYXRyaXg5ICogdlkgLSBtYXRyaXgxMCAqIHZaOwogICAgICAgIHJlc3VsdFswXSA9IG1hdHJpeDA7CiAgICAgICAgcmVzdWx0WzFdID0gbWF0cml4NDsKICAgICAgICByZXN1bHRbMl0gPSBtYXRyaXg4OwogICAgICAgIHJlc3VsdFszXSA9IDA7CiAgICAgICAgcmVzdWx0WzRdID0gbWF0cml4MTsKICAgICAgICByZXN1bHRbNV0gPSBtYXRyaXg1OwogICAgICAgIHJlc3VsdFs2XSA9IG1hdHJpeDk7CiAgICAgICAgcmVzdWx0WzddID0gMDsKICAgICAgICByZXN1bHRbOF0gPSBtYXRyaXgyOwogICAgICAgIHJlc3VsdFs5XSA9IG1hdHJpeDY7CiAgICAgICAgcmVzdWx0WzEwXSA9IG1hdHJpeDEwOwogICAgICAgIHJlc3VsdFsxMV0gPSAwOwogICAgICAgIHJlc3VsdFsxMl0gPSB4OwogICAgICAgIHJlc3VsdFsxM10gPSB5OwogICAgICAgIHJlc3VsdFsxNF0gPSB6OwogICAgICAgIHJlc3VsdFsxNV0gPSAxOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hUcmFuc3Bvc2VNYXRyaXgyID0gbmV3IE1hdHJpeDQoKTsKICAgICAgTWF0cml4NC5pbnZlcnNlVHJhbnNwb3NlID0gZnVuY3Rpb24obWF0cml4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJldHVybiBNYXRyaXg0LmludmVyc2UoCiAgICAgICAgICBNYXRyaXg0LnRyYW5zcG9zZShtYXRyaXgsIHNjcmF0Y2hUcmFuc3Bvc2VNYXRyaXgyKSwKICAgICAgICAgIHJlc3VsdAogICAgICAgICk7CiAgICAgIH07CiAgICAgIE1hdHJpeDQuSURFTlRJVFkgPSBPYmplY3QuZnJlZXplKAogICAgICAgIG5ldyBNYXRyaXg0KAogICAgICAgICAgMSwKICAgICAgICAgIDAsCiAgICAgICAgICAwLAogICAgICAgICAgMCwKICAgICAgICAgIDAsCiAgICAgICAgICAxLAogICAgICAgICAgMCwKICAgICAgICAgIDAsCiAgICAgICAgICAwLAogICAgICAgICAgMCwKICAgICAgICAgIDEsCiAgICAgICAgICAwLAogICAgICAgICAgMCwKICAgICAgICAgIDAsCiAgICAgICAgICAwLAogICAgICAgICAgMQogICAgICAgICkKICAgICAgKTsKICAgICAgTWF0cml4NC5aRVJPID0gT2JqZWN0LmZyZWV6ZSgKICAgICAgICBuZXcgTWF0cml4NCgKICAgICAgICAgIDAsCiAgICAgICAgICAwLAogICAgICAgICAgMCwKICAgICAgICAgIDAsCiAgICAgICAgICAwLAogICAgICAgICAgMCwKICAgICAgICAgIDAsCiAgICAgICAgICAwLAogICAgICAgICAgMCwKICAgICAgICAgIDAsCiAgICAgICAgICAwLAogICAgICAgICAgMCwKICAgICAgICAgIDAsCiAgICAgICAgICAwLAogICAgICAgICAgMCwKICAgICAgICAgIDAKICAgICAgICApCiAgICAgICk7CiAgICAgIE1hdHJpeDQuQ09MVU1OMFJPVzAgPSAwOwogICAgICBNYXRyaXg0LkNPTFVNTjBST1cxID0gMTsKICAgICAgTWF0cml4NC5DT0xVTU4wUk9XMiA9IDI7CiAgICAgIE1hdHJpeDQuQ09MVU1OMFJPVzMgPSAzOwogICAgICBNYXRyaXg0LkNPTFVNTjFST1cwID0gNDsKICAgICAgTWF0cml4NC5DT0xVTU4xUk9XMSA9IDU7CiAgICAgIE1hdHJpeDQuQ09MVU1OMVJPVzIgPSA2OwogICAgICBNYXRyaXg0LkNPTFVNTjFST1czID0gNzsKICAgICAgTWF0cml4NC5DT0xVTU4yUk9XMCA9IDg7CiAgICAgIE1hdHJpeDQuQ09MVU1OMlJPVzEgPSA5OwogICAgICBNYXRyaXg0LkNPTFVNTjJST1cyID0gMTA7CiAgICAgIE1hdHJpeDQuQ09MVU1OMlJPVzMgPSAxMTsKICAgICAgTWF0cml4NC5DT0xVTU4zUk9XMCA9IDEyOwogICAgICBNYXRyaXg0LkNPTFVNTjNST1cxID0gMTM7CiAgICAgIE1hdHJpeDQuQ09MVU1OM1JPVzIgPSAxNDsKICAgICAgTWF0cml4NC5DT0xVTU4zUk9XMyA9IDE1OwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhNYXRyaXg0LnByb3RvdHlwZSwgewogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgY29sbGVjdGlvbi4KICAgICAgICAgKiBAbWVtYmVyb2YgTWF0cml4NC5wcm90b3R5cGUKICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgbGVuZ3RoOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gTWF0cml4NC5wYWNrZWRMZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgTWF0cml4NC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICByZXR1cm4gTWF0cml4NC5jbG9uZSh0aGlzLCByZXN1bHQpOwogICAgICB9OwogICAgICBNYXRyaXg0LnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbihyaWdodCkgewogICAgICAgIHJldHVybiBNYXRyaXg0LmVxdWFscyh0aGlzLCByaWdodCk7CiAgICAgIH07CiAgICAgIE1hdHJpeDQuZXF1YWxzQXJyYXkgPSBmdW5jdGlvbihtYXRyaXgsIGFycmF5LCBvZmZzZXQpIHsKICAgICAgICByZXR1cm4gbWF0cml4WzBdID09PSBhcnJheVtvZmZzZXRdICYmIG1hdHJpeFsxXSA9PT0gYXJyYXlbb2Zmc2V0ICsgMV0gJiYgbWF0cml4WzJdID09PSBhcnJheVtvZmZzZXQgKyAyXSAmJiBtYXRyaXhbM10gPT09IGFycmF5W29mZnNldCArIDNdICYmIG1hdHJpeFs0XSA9PT0gYXJyYXlbb2Zmc2V0ICsgNF0gJiYgbWF0cml4WzVdID09PSBhcnJheVtvZmZzZXQgKyA1XSAmJiBtYXRyaXhbNl0gPT09IGFycmF5W29mZnNldCArIDZdICYmIG1hdHJpeFs3XSA9PT0gYXJyYXlbb2Zmc2V0ICsgN10gJiYgbWF0cml4WzhdID09PSBhcnJheVtvZmZzZXQgKyA4XSAmJiBtYXRyaXhbOV0gPT09IGFycmF5W29mZnNldCArIDldICYmIG1hdHJpeFsxMF0gPT09IGFycmF5W29mZnNldCArIDEwXSAmJiBtYXRyaXhbMTFdID09PSBhcnJheVtvZmZzZXQgKyAxMV0gJiYgbWF0cml4WzEyXSA9PT0gYXJyYXlbb2Zmc2V0ICsgMTJdICYmIG1hdHJpeFsxM10gPT09IGFycmF5W29mZnNldCArIDEzXSAmJiBtYXRyaXhbMTRdID09PSBhcnJheVtvZmZzZXQgKyAxNF0gJiYgbWF0cml4WzE1XSA9PT0gYXJyYXlbb2Zmc2V0ICsgMTVdOwogICAgICB9OwogICAgICBNYXRyaXg0LnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uID0gZnVuY3Rpb24ocmlnaHQsIGVwc2lsb24pIHsKICAgICAgICByZXR1cm4gTWF0cml4NC5lcXVhbHNFcHNpbG9uKHRoaXMsIHJpZ2h0LCBlcHNpbG9uKTsKICAgICAgfTsKICAgICAgTWF0cml4NC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYCgke3RoaXNbMF19LCAke3RoaXNbNF19LCAke3RoaXNbOF19LCAke3RoaXNbMTJdfSkKKCR7dGhpc1sxXX0sICR7dGhpc1s1XX0sICR7dGhpc1s5XX0sICR7dGhpc1sxM119KQooJHt0aGlzWzJdfSwgJHt0aGlzWzZdfSwgJHt0aGlzWzEwXX0sICR7dGhpc1sxNF19KQooJHt0aGlzWzNdfSwgJHt0aGlzWzddfSwgJHt0aGlzWzExXX0sICR7dGhpc1sxNV19KWA7CiAgICAgIH07CiAgICAgIE1hdHJpeDRfZGVmYXVsdCA9IE1hdHJpeDQ7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9iaW5hcnlTZWFyY2guanMKICBmdW5jdGlvbiBiaW5hcnlTZWFyY2goYXJyYXksIGl0ZW1Ub0ZpbmQsIGNvbXBhcmF0b3IpIHsKICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoIml0ZW1Ub0ZpbmQiLCBpdGVtVG9GaW5kKTsKICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiY29tcGFyYXRvciIsIGNvbXBhcmF0b3IpOwogICAgbGV0IGxvdyA9IDA7CiAgICBsZXQgaGlnaCA9IGFycmF5Lmxlbmd0aCAtIDE7CiAgICBsZXQgaTsKICAgIGxldCBjb21wYXJpc29uOwogICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CiAgICAgIGkgPSB+figobG93ICsgaGlnaCkgLyAyKTsKICAgICAgY29tcGFyaXNvbiA9IGNvbXBhcmF0b3IoYXJyYXlbaV0sIGl0ZW1Ub0ZpbmQpOwogICAgICBpZiAoY29tcGFyaXNvbiA8IDApIHsKICAgICAgICBsb3cgPSBpICsgMTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoY29tcGFyaXNvbiA+IDApIHsKICAgICAgICBoaWdoID0gaSAtIDE7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gfihoaWdoICsgMSk7CiAgfQogIHZhciBiaW5hcnlTZWFyY2hfZGVmYXVsdDsKICB2YXIgaW5pdF9iaW5hcnlTZWFyY2ggPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2JpbmFyeVNlYXJjaC5qcyIoKSB7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgYmluYXJ5U2VhcmNoX2RlZmF1bHQgPSBiaW5hcnlTZWFyY2g7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9FYXJ0aE9yaWVudGF0aW9uUGFyYW1ldGVyc1NhbXBsZS5qcwogIGZ1bmN0aW9uIEVhcnRoT3JpZW50YXRpb25QYXJhbWV0ZXJzU2FtcGxlKHhQb2xlV2FuZGVyLCB5UG9sZVdhbmRlciwgeFBvbGVPZmZzZXQsIHlQb2xlT2Zmc2V0LCB1dDFNaW51c1V0YykgewogICAgdGhpcy54UG9sZVdhbmRlciA9IHhQb2xlV2FuZGVyOwogICAgdGhpcy55UG9sZVdhbmRlciA9IHlQb2xlV2FuZGVyOwogICAgdGhpcy54UG9sZU9mZnNldCA9IHhQb2xlT2Zmc2V0OwogICAgdGhpcy55UG9sZU9mZnNldCA9IHlQb2xlT2Zmc2V0OwogICAgdGhpcy51dDFNaW51c1V0YyA9IHV0MU1pbnVzVXRjOwogIH0KICB2YXIgRWFydGhPcmllbnRhdGlvblBhcmFtZXRlcnNTYW1wbGVfZGVmYXVsdDsKICB2YXIgaW5pdF9FYXJ0aE9yaWVudGF0aW9uUGFyYW1ldGVyc1NhbXBsZSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvRWFydGhPcmllbnRhdGlvblBhcmFtZXRlcnNTYW1wbGUuanMiKCkgewogICAgICBFYXJ0aE9yaWVudGF0aW9uUGFyYW1ldGVyc1NhbXBsZV9kZWZhdWx0ID0gRWFydGhPcmllbnRhdGlvblBhcmFtZXRlcnNTYW1wbGU7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9pc0xlYXBZZWFyLmpzCiAgZnVuY3Rpb24gaXNMZWFwWWVhcih5ZWFyKSB7CiAgICBpZiAoeWVhciA9PT0gbnVsbCB8fCBpc05hTih5ZWFyKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgieWVhciBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhIG51bWJlci4iKTsKICAgIH0KICAgIHJldHVybiB5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwIHx8IHllYXIgJSA0MDAgPT09IDA7CiAgfQogIHZhciBpc0xlYXBZZWFyX2RlZmF1bHQ7CiAgdmFyIGluaXRfaXNMZWFwWWVhciA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvaXNMZWFwWWVhci5qcyIoKSB7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaXNMZWFwWWVhcl9kZWZhdWx0ID0gaXNMZWFwWWVhcjsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0dyZWdvcmlhbkRhdGUuanMKICBmdW5jdGlvbiBHcmVnb3JpYW5EYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCwgaXNMZWFwU2Vjb25kKSB7CiAgICBjb25zdCBtaW5pbXVtWWVhciA9IDE7CiAgICBjb25zdCBtaW5pbXVtTW9udGggPSAxOwogICAgY29uc3QgbWluaW11bURheSA9IDE7CiAgICBjb25zdCBtaW5pbXVtSG91ciA9IDA7CiAgICBjb25zdCBtaW5pbXVtTWludXRlID0gMDsKICAgIGNvbnN0IG1pbmltdW1TZWNvbmQgPSAwOwogICAgY29uc3QgbWluaW11bU1pbGxpc2Vjb25kID0gMDsKICAgIHllYXIgPSB5ZWFyID8/IG1pbmltdW1ZZWFyOwogICAgbW9udGggPSBtb250aCA/PyBtaW5pbXVtTW9udGg7CiAgICBkYXkgPSBkYXkgPz8gbWluaW11bURheTsKICAgIGhvdXIgPSBob3VyID8/IG1pbmltdW1Ib3VyOwogICAgbWludXRlID0gbWludXRlID8/IG1pbmltdW1NaW51dGU7CiAgICBzZWNvbmQgPSBzZWNvbmQgPz8gbWluaW11bVNlY29uZDsKICAgIG1pbGxpc2Vjb25kID0gbWlsbGlzZWNvbmQgPz8gbWluaW11bU1pbGxpc2Vjb25kOwogICAgaXNMZWFwU2Vjb25kID0gaXNMZWFwU2Vjb25kID8/IGZhbHNlOwogICAgdmFsaWRhdGVSYW5nZSgpOwogICAgdmFsaWRhdGVEYXRlKCk7CiAgICB0aGlzLnllYXIgPSB5ZWFyOwogICAgdGhpcy5tb250aCA9IG1vbnRoOwogICAgdGhpcy5kYXkgPSBkYXk7CiAgICB0aGlzLmhvdXIgPSBob3VyOwogICAgdGhpcy5taW51dGUgPSBtaW51dGU7CiAgICB0aGlzLnNlY29uZCA9IHNlY29uZDsKICAgIHRoaXMubWlsbGlzZWNvbmQgPSBtaWxsaXNlY29uZDsKICAgIHRoaXMuaXNMZWFwU2Vjb25kID0gaXNMZWFwU2Vjb25kOwogICAgZnVuY3Rpb24gdmFsaWRhdGVSYW5nZSgpIHsKICAgICAgY29uc3QgbWF4aW11bVllYXIgPSA5OTk5OwogICAgICBjb25zdCBtYXhpbXVtTW9udGggPSAxMjsKICAgICAgY29uc3QgbWF4aW11bURheSA9IDMxOwogICAgICBjb25zdCBtYXhpbXVtSG91ciA9IDIzOwogICAgICBjb25zdCBtYXhpbXVtTWludXRlID0gNTk7CiAgICAgIGNvbnN0IG1heGltdW1TZWNvbmQgPSA1OTsKICAgICAgY29uc3QgZXhjbHVkZWRNYXhpbXVtTWlsaXNlY29uZCA9IDFlMzsKICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIlllYXIiLCB5ZWFyLCBtaW5pbXVtWWVhcik7CiAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJZZWFyIiwgeWVhciwgbWF4aW11bVllYXIpOwogICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiTW9udGgiLCBtb250aCwgbWluaW11bU1vbnRoKTsKICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIk1vbnRoIiwgbW9udGgsIG1heGltdW1Nb250aCk7CiAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJEYXkiLCBkYXksIG1pbmltdW1EYXkpOwogICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiRGF5IiwgZGF5LCBtYXhpbXVtRGF5KTsKICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIkhvdXIiLCBob3VyLCBtaW5pbXVtSG91cik7CiAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJIb3VyIiwgaG91ciwgbWF4aW11bUhvdXIpOwogICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiTWludXRlIiwgbWludXRlLCBtaW5pbXVtTWludXRlKTsKICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIk1pbnV0ZSIsIG1pbnV0ZSwgbWF4aW11bU1pbnV0ZSk7CiAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLmJvb2woIklzTGVhcFNlY29uZCIsIGlzTGVhcFNlY29uZCk7CiAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJTZWNvbmQiLCBzZWNvbmQsIG1pbmltdW1TZWNvbmQpOwogICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygKICAgICAgICAiU2Vjb25kIiwKICAgICAgICBzZWNvbmQsCiAgICAgICAgaXNMZWFwU2Vjb25kID8gbWF4aW11bVNlY29uZCArIDEgOiBtYXhpbXVtU2Vjb25kCiAgICAgICk7CiAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKAogICAgICAgICJNaWxsaXNlY29uZCIsCiAgICAgICAgbWlsbGlzZWNvbmQsCiAgICAgICAgbWluaW11bU1pbGxpc2Vjb25kCiAgICAgICk7CiAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbigKICAgICAgICAiTWlsbGlzZWNvbmQiLAogICAgICAgIG1pbGxpc2Vjb25kLAogICAgICAgIGV4Y2x1ZGVkTWF4aW11bU1pbGlzZWNvbmQKICAgICAgKTsKICAgIH0KICAgIGZ1bmN0aW9uIHZhbGlkYXRlRGF0ZSgpIHsKICAgICAgY29uc3QgZGF5c0luTW9udGgyID0gbW9udGggPT09IDIgJiYgaXNMZWFwWWVhcl9kZWZhdWx0KHllYXIpID8gZGF5c0luWWVhclttb250aCAtIDFdICsgMSA6IGRheXNJblllYXJbbW9udGggLSAxXTsKICAgICAgaWYgKGRheSA+IGRheXNJbk1vbnRoMikgewogICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJNb250aCBhbmQgRGF5IHJlcHJlc2VudHMgaW52YWxpZCBkYXRlIik7CiAgICAgIH0KICAgIH0KICB9CiAgdmFyIGRheXNJblllYXIsIEdyZWdvcmlhbkRhdGVfZGVmYXVsdDsKICB2YXIgaW5pdF9HcmVnb3JpYW5EYXRlID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9HcmVnb3JpYW5EYXRlLmpzIigpIHsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfaXNMZWFwWWVhcigpOwogICAgICBkYXlzSW5ZZWFyID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdOwogICAgICBHcmVnb3JpYW5EYXRlX2RlZmF1bHQgPSBHcmVnb3JpYW5EYXRlOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvTGVhcFNlY29uZC5qcwogIGZ1bmN0aW9uIExlYXBTZWNvbmQoZGF0ZSwgb2Zmc2V0KSB7CiAgICB0aGlzLmp1bGlhbkRhdGUgPSBkYXRlOwogICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CiAgfQogIHZhciBMZWFwU2Vjb25kX2RlZmF1bHQ7CiAgdmFyIGluaXRfTGVhcFNlY29uZCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvTGVhcFNlY29uZC5qcyIoKSB7CiAgICAgIExlYXBTZWNvbmRfZGVmYXVsdCA9IExlYXBTZWNvbmQ7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9UaW1lQ29uc3RhbnRzLmpzCiAgdmFyIFRpbWVDb25zdGFudHMsIFRpbWVDb25zdGFudHNfZGVmYXVsdDsKICB2YXIgaW5pdF9UaW1lQ29uc3RhbnRzID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9UaW1lQ29uc3RhbnRzLmpzIigpIHsKICAgICAgVGltZUNvbnN0YW50cyA9IHsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIHNlY29uZHMgaW4gb25lIG1pbGxpc2Vjb25kOiA8Y29kZT4wLjAwMTwvY29kZT4KICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFNFQ09ORFNfUEVSX01JTExJU0VDT05EOiAxZS0zLAogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBpbiBvbmUgbWludXRlOiA8Y29kZT42MDwvY29kZT4uCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBTRUNPTkRTX1BFUl9NSU5VVEU6IDYwLAogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBudW1iZXIgb2YgbWludXRlcyBpbiBvbmUgaG91cjogPGNvZGU+NjA8L2NvZGU+LgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgTUlOVVRFU19QRVJfSE9VUjogNjAsCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG51bWJlciBvZiBob3VycyBpbiBvbmUgZGF5OiA8Y29kZT4yNDwvY29kZT4uCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBIT1VSU19QRVJfREFZOiAyNCwKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIHNlY29uZHMgaW4gb25lIGhvdXI6IDxjb2RlPjM2MDA8L2NvZGU+LgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgU0VDT05EU19QRVJfSE9VUjogMzYwMCwKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgaW4gb25lIGRheTogPGNvZGU+MTQ0MDwvY29kZT4uCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBNSU5VVEVTX1BFUl9EQVk6IDE0NDAsCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG51bWJlciBvZiBzZWNvbmRzIGluIG9uZSBkYXksIGlnbm9yaW5nIGxlYXAgc2Vjb25kczogPGNvZGU+ODY0MDA8L2NvZGU+LgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgU0VDT05EU19QRVJfREFZOiA4NjQwMCwKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgaW4gb25lIEp1bGlhbiBjZW50dXJ5OiA8Y29kZT4zNjUyNTwvY29kZT4uCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBEQVlTX1BFUl9KVUxJQU5fQ0VOVFVSWTogMzY1MjUsCiAgICAgICAgLyoqCiAgICAgICAgICogT25lIHRyaWxsaW9udGggb2YgYSBzZWNvbmQuCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBQSUNPU0VDT05EOiAxZS05LAogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyB0byBzdWJ0cmFjdCBmcm9tIGEgSnVsaWFuIGRhdGUgdG8gZGV0ZXJtaW5lIHRoZQogICAgICAgICAqIG1vZGlmaWVkIEp1bGlhbiBkYXRlLCB3aGljaCBnaXZlcyB0aGUgbnVtYmVyIG9mIGRheXMgc2luY2UgbWlkbmlnaHQKICAgICAgICAgKiBvbiBOb3ZlbWJlciAxNywgMTg1OC4KICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIE1PRElGSUVEX0pVTElBTl9EQVRFX0RJRkZFUkVOQ0U6IDI0MDAwMDA1ZS0xCiAgICAgIH07CiAgICAgIFRpbWVDb25zdGFudHNfZGVmYXVsdCA9IE9iamVjdC5mcmVlemUoVGltZUNvbnN0YW50cyk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9UaW1lU3RhbmRhcmQuanMKICB2YXIgVGltZVN0YW5kYXJkLCBUaW1lU3RhbmRhcmRfZGVmYXVsdDsKICB2YXIgaW5pdF9UaW1lU3RhbmRhcmQgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1RpbWVTdGFuZGFyZC5qcyIoKSB7CiAgICAgIFRpbWVTdGFuZGFyZCA9IHsKICAgICAgICAvKioKICAgICAgICAgKiBSZXByZXNlbnRzIHRoZSBjb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSAoVVRDKSB0aW1lIHN0YW5kYXJkLgogICAgICAgICAqCiAgICAgICAgICogVVRDIGlzIHJlbGF0ZWQgdG8gVEFJIGFjY29yZGluZyB0byB0aGUgcmVsYXRpb25zaGlwCiAgICAgICAgICogPGNvZGU+VVRDID0gVEFJIC0gZGVsdGFUPC9jb2RlPiB3aGVyZSA8Y29kZT5kZWx0YVQ8L2NvZGU+IGlzIHRoZSBudW1iZXIgb2YgbGVhcAogICAgICAgICAqIHNlY29uZHMgd2hpY2ggaGF2ZSBiZWVuIGludHJvZHVjZWQgYXMgb2YgdGhlIHRpbWUgaW4gVEFJLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBVVEM6IDAsCiAgICAgICAgLyoqCiAgICAgICAgICogUmVwcmVzZW50cyB0aGUgSW50ZXJuYXRpb25hbCBBdG9taWMgVGltZSAoVEFJKSB0aW1lIHN0YW5kYXJkLgogICAgICAgICAqIFRBSSBpcyB0aGUgcHJpbmNpcGFsIHRpbWUgc3RhbmRhcmQgdG8gd2hpY2ggdGhlIG90aGVyIHRpbWUgc3RhbmRhcmRzIGFyZSByZWxhdGVkLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBUQUk6IDEKICAgICAgfTsKICAgICAgVGltZVN0YW5kYXJkX2RlZmF1bHQgPSBPYmplY3QuZnJlZXplKFRpbWVTdGFuZGFyZCk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9KdWxpYW5EYXRlLmpzCiAgZnVuY3Rpb24gY29tcGFyZUxlYXBTZWNvbmREYXRlcyhsZWFwU2Vjb25kLCBkYXRlVG9GaW5kKSB7CiAgICByZXR1cm4gSnVsaWFuRGF0ZS5jb21wYXJlKGxlYXBTZWNvbmQuanVsaWFuRGF0ZSwgZGF0ZVRvRmluZC5qdWxpYW5EYXRlKTsKICB9CiAgZnVuY3Rpb24gY29udmVydFV0Y1RvVGFpKGp1bGlhbkRhdGUpIHsKICAgIGJpbmFyeVNlYXJjaFNjcmF0Y2hMZWFwU2Vjb25kLmp1bGlhbkRhdGUgPSBqdWxpYW5EYXRlOwogICAgY29uc3QgbGVhcFNlY29uZHMgPSBKdWxpYW5EYXRlLmxlYXBTZWNvbmRzOwogICAgbGV0IGluZGV4ID0gYmluYXJ5U2VhcmNoX2RlZmF1bHQoCiAgICAgIGxlYXBTZWNvbmRzLAogICAgICBiaW5hcnlTZWFyY2hTY3JhdGNoTGVhcFNlY29uZCwKICAgICAgY29tcGFyZUxlYXBTZWNvbmREYXRlcwogICAgKTsKICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgaW5kZXggPSB+aW5kZXg7CiAgICB9CiAgICBpZiAoaW5kZXggPj0gbGVhcFNlY29uZHMubGVuZ3RoKSB7CiAgICAgIGluZGV4ID0gbGVhcFNlY29uZHMubGVuZ3RoIC0gMTsKICAgIH0KICAgIGxldCBvZmZzZXQgPSBsZWFwU2Vjb25kc1tpbmRleF0ub2Zmc2V0OwogICAgaWYgKGluZGV4ID4gMCkgewogICAgICBjb25zdCBkaWZmZXJlbmNlID0gSnVsaWFuRGF0ZS5zZWNvbmRzRGlmZmVyZW5jZSgKICAgICAgICBsZWFwU2Vjb25kc1tpbmRleF0uanVsaWFuRGF0ZSwKICAgICAgICBqdWxpYW5EYXRlCiAgICAgICk7CiAgICAgIGlmIChkaWZmZXJlbmNlID4gb2Zmc2V0KSB7CiAgICAgICAgaW5kZXgtLTsKICAgICAgICBvZmZzZXQgPSBsZWFwU2Vjb25kc1tpbmRleF0ub2Zmc2V0OwogICAgICB9CiAgICB9CiAgICBKdWxpYW5EYXRlLmFkZFNlY29uZHMoanVsaWFuRGF0ZSwgb2Zmc2V0LCBqdWxpYW5EYXRlKTsKICB9CiAgZnVuY3Rpb24gY29udmVydFRhaVRvVXRjKGp1bGlhbkRhdGUsIHJlc3VsdCkgewogICAgYmluYXJ5U2VhcmNoU2NyYXRjaExlYXBTZWNvbmQuanVsaWFuRGF0ZSA9IGp1bGlhbkRhdGU7CiAgICBjb25zdCBsZWFwU2Vjb25kcyA9IEp1bGlhbkRhdGUubGVhcFNlY29uZHM7CiAgICBsZXQgaW5kZXggPSBiaW5hcnlTZWFyY2hfZGVmYXVsdCgKICAgICAgbGVhcFNlY29uZHMsCiAgICAgIGJpbmFyeVNlYXJjaFNjcmF0Y2hMZWFwU2Vjb25kLAogICAgICBjb21wYXJlTGVhcFNlY29uZERhdGVzCiAgICApOwogICAgaWYgKGluZGV4IDwgMCkgewogICAgICBpbmRleCA9IH5pbmRleDsKICAgIH0KICAgIGlmIChpbmRleCA9PT0gMCkgewogICAgICByZXR1cm4gSnVsaWFuRGF0ZS5hZGRTZWNvbmRzKGp1bGlhbkRhdGUsIC1sZWFwU2Vjb25kc1swXS5vZmZzZXQsIHJlc3VsdCk7CiAgICB9CiAgICBpZiAoaW5kZXggPj0gbGVhcFNlY29uZHMubGVuZ3RoKSB7CiAgICAgIHJldHVybiBKdWxpYW5EYXRlLmFkZFNlY29uZHMoCiAgICAgICAganVsaWFuRGF0ZSwKICAgICAgICAtbGVhcFNlY29uZHNbaW5kZXggLSAxXS5vZmZzZXQsCiAgICAgICAgcmVzdWx0CiAgICAgICk7CiAgICB9CiAgICBjb25zdCBkaWZmZXJlbmNlID0gSnVsaWFuRGF0ZS5zZWNvbmRzRGlmZmVyZW5jZSgKICAgICAgbGVhcFNlY29uZHNbaW5kZXhdLmp1bGlhbkRhdGUsCiAgICAgIGp1bGlhbkRhdGUKICAgICk7CiAgICBpZiAoZGlmZmVyZW5jZSA9PT0gMCkgewogICAgICByZXR1cm4gSnVsaWFuRGF0ZS5hZGRTZWNvbmRzKAogICAgICAgIGp1bGlhbkRhdGUsCiAgICAgICAgLWxlYXBTZWNvbmRzW2luZGV4XS5vZmZzZXQsCiAgICAgICAgcmVzdWx0CiAgICAgICk7CiAgICB9CiAgICBpZiAoZGlmZmVyZW5jZSA8PSAxKSB7CiAgICAgIHJldHVybiB2b2lkIDA7CiAgICB9CiAgICByZXR1cm4gSnVsaWFuRGF0ZS5hZGRTZWNvbmRzKAogICAgICBqdWxpYW5EYXRlLAogICAgICAtbGVhcFNlY29uZHNbLS1pbmRleF0ub2Zmc2V0LAogICAgICByZXN1bHQKICAgICk7CiAgfQogIGZ1bmN0aW9uIHNldENvbXBvbmVudHMod2hvbGVEYXlzLCBzZWNvbmRzT2ZEYXksIGp1bGlhbkRhdGUpIHsKICAgIGNvbnN0IGV4dHJhRGF5cyA9IHNlY29uZHNPZkRheSAvIFRpbWVDb25zdGFudHNfZGVmYXVsdC5TRUNPTkRTX1BFUl9EQVkgfCAwOwogICAgd2hvbGVEYXlzICs9IGV4dHJhRGF5czsKICAgIHNlY29uZHNPZkRheSAtPSBUaW1lQ29uc3RhbnRzX2RlZmF1bHQuU0VDT05EU19QRVJfREFZICogZXh0cmFEYXlzOwogICAgaWYgKHNlY29uZHNPZkRheSA8IDApIHsKICAgICAgd2hvbGVEYXlzLS07CiAgICAgIHNlY29uZHNPZkRheSArPSBUaW1lQ29uc3RhbnRzX2RlZmF1bHQuU0VDT05EU19QRVJfREFZOwogICAgfQogICAganVsaWFuRGF0ZS5kYXlOdW1iZXIgPSB3aG9sZURheXM7CiAgICBqdWxpYW5EYXRlLnNlY29uZHNPZkRheSA9IHNlY29uZHNPZkRheTsKICAgIHJldHVybiBqdWxpYW5EYXRlOwogIH0KICBmdW5jdGlvbiBjb21wdXRlSnVsaWFuRGF0ZUNvbXBvbmVudHMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kKSB7CiAgICBjb25zdCBhMyA9IChtb250aCAtIDE0KSAvIDEyIHwgMDsKICAgIGNvbnN0IGIgPSB5ZWFyICsgNDgwMCArIGEzOwogICAgbGV0IGRheU51bWJlciA9ICgxNDYxICogYiAvIDQgfCAwKSArICgzNjcgKiAobW9udGggLSAyIC0gMTIgKiBhMykgLyAxMiB8IDApIC0gKDMgKiAoKGIgKyAxMDApIC8gMTAwIHwgMCkgLyA0IHwgMCkgKyBkYXkgLSAzMjA3NTsKICAgIGhvdXIgPSBob3VyIC0gMTI7CiAgICBpZiAoaG91ciA8IDApIHsKICAgICAgaG91ciArPSAyNDsKICAgIH0KICAgIGNvbnN0IHNlY29uZHNPZkRheSA9IHNlY29uZCArIChob3VyICogVGltZUNvbnN0YW50c19kZWZhdWx0LlNFQ09ORFNfUEVSX0hPVVIgKyBtaW51dGUgKiBUaW1lQ29uc3RhbnRzX2RlZmF1bHQuU0VDT05EU19QRVJfTUlOVVRFICsgbWlsbGlzZWNvbmQgKiBUaW1lQ29uc3RhbnRzX2RlZmF1bHQuU0VDT05EU19QRVJfTUlMTElTRUNPTkQpOwogICAgaWYgKHNlY29uZHNPZkRheSA+PSA0MzIwMCkgewogICAgICBkYXlOdW1iZXIgLT0gMTsKICAgIH0KICAgIHJldHVybiBbZGF5TnVtYmVyLCBzZWNvbmRzT2ZEYXldOwogIH0KICBmdW5jdGlvbiBKdWxpYW5EYXRlKGp1bGlhbkRheU51bWJlciwgc2Vjb25kc09mRGF5LCB0aW1lU3RhbmRhcmQpIHsKICAgIHRoaXMuZGF5TnVtYmVyID0gdm9pZCAwOwogICAgdGhpcy5zZWNvbmRzT2ZEYXkgPSB2b2lkIDA7CiAgICBqdWxpYW5EYXlOdW1iZXIgPSBqdWxpYW5EYXlOdW1iZXIgPz8gMDsKICAgIHNlY29uZHNPZkRheSA9IHNlY29uZHNPZkRheSA/PyAwOwogICAgdGltZVN0YW5kYXJkID0gdGltZVN0YW5kYXJkID8/IFRpbWVTdGFuZGFyZF9kZWZhdWx0LlVUQzsKICAgIGNvbnN0IHdob2xlRGF5cyA9IGp1bGlhbkRheU51bWJlciB8IDA7CiAgICBzZWNvbmRzT2ZEYXkgPSBzZWNvbmRzT2ZEYXkgKyAoanVsaWFuRGF5TnVtYmVyIC0gd2hvbGVEYXlzKSAqIFRpbWVDb25zdGFudHNfZGVmYXVsdC5TRUNPTkRTX1BFUl9EQVk7CiAgICBzZXRDb21wb25lbnRzKHdob2xlRGF5cywgc2Vjb25kc09mRGF5LCB0aGlzKTsKICAgIGlmICh0aW1lU3RhbmRhcmQgPT09IFRpbWVTdGFuZGFyZF9kZWZhdWx0LlVUQykgewogICAgICBjb252ZXJ0VXRjVG9UYWkodGhpcyk7CiAgICB9CiAgfQogIHZhciBncmVnb3JpYW5EYXRlU2NyYXRjaCwgZGF5c0luTW9udGgsIGRheXNJbkxlYXBGZWJydWFyeSwgYmluYXJ5U2VhcmNoU2NyYXRjaExlYXBTZWNvbmQsIG1hdGNoQ2FsZW5kYXJZZWFyLCBtYXRjaENhbGVuZGFyTW9udGgsIG1hdGNoT3JkaW5hbERhdGUsIG1hdGNoV2Vla0RhdGUsIG1hdGNoQ2FsZW5kYXJEYXRlLCB1dGNPZmZzZXQsIG1hdGNoSG91cnMsIG1hdGNoSG91cnNNaW51dGVzLCBtYXRjaEhvdXJzTWludXRlc1NlY29uZHMsIGlzbzg2MDFFcnJvck1lc3NhZ2UsIHRvR3JlZ29yaWFuRGF0ZVNjcmF0Y2gsIEp1bGlhbkRhdGVfZGVmYXVsdDsKICB2YXIgaW5pdF9KdWxpYW5EYXRlID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9KdWxpYW5EYXRlLmpzIigpIHsKICAgICAgaW5pdF9iaW5hcnlTZWFyY2goKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9HcmVnb3JpYW5EYXRlKCk7CiAgICAgIGluaXRfaXNMZWFwWWVhcigpOwogICAgICBpbml0X0xlYXBTZWNvbmQoKTsKICAgICAgaW5pdF9UaW1lQ29uc3RhbnRzKCk7CiAgICAgIGluaXRfVGltZVN0YW5kYXJkKCk7CiAgICAgIGdyZWdvcmlhbkRhdGVTY3JhdGNoID0gbmV3IEdyZWdvcmlhbkRhdGVfZGVmYXVsdCgpOwogICAgICBkYXlzSW5Nb250aCA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTsKICAgICAgZGF5c0luTGVhcEZlYnJ1YXJ5ID0gMjk7CiAgICAgIGJpbmFyeVNlYXJjaFNjcmF0Y2hMZWFwU2Vjb25kID0gbmV3IExlYXBTZWNvbmRfZGVmYXVsdCgpOwogICAgICBtYXRjaENhbGVuZGFyWWVhciA9IC9eKFxkezR9KSQvOwogICAgICBtYXRjaENhbGVuZGFyTW9udGggPSAvXihcZHs0fSktKFxkezJ9KSQvOwogICAgICBtYXRjaE9yZGluYWxEYXRlID0gL14oXGR7NH0pLT8oXGR7M30pJC87CiAgICAgIG1hdGNoV2Vla0RhdGUgPSAvXihcZHs0fSktP1coXGR7Mn0pLT8oXGR7MX0pPyQvOwogICAgICBtYXRjaENhbGVuZGFyRGF0ZSA9IC9eKFxkezR9KS0/KFxkezJ9KS0/KFxkezJ9KSQvOwogICAgICB1dGNPZmZzZXQgPSAvKFtaK1wtXSk/KFxkezJ9KT86PyhcZHsyfSk/JC87CiAgICAgIG1hdGNoSG91cnMgPSAvXihcZHsyfSkoXC5cZCspPy8uc291cmNlICsgdXRjT2Zmc2V0LnNvdXJjZTsKICAgICAgbWF0Y2hIb3Vyc01pbnV0ZXMgPSAvXihcZHsyfSk6PyhcZHsyfSkoXC5cZCspPy8uc291cmNlICsgdXRjT2Zmc2V0LnNvdXJjZTsKICAgICAgbWF0Y2hIb3Vyc01pbnV0ZXNTZWNvbmRzID0gL14oXGR7Mn0pOj8oXGR7Mn0pOj8oXGR7Mn0pKFwuXGQrKT8vLnNvdXJjZSArIHV0Y09mZnNldC5zb3VyY2U7CiAgICAgIGlzbzg2MDFFcnJvck1lc3NhZ2UgPSAiSW52YWxpZCBJU08gODYwMSBkYXRlLiI7CiAgICAgIEp1bGlhbkRhdGUuZnJvbUdyZWdvcmlhbkRhdGUgPSBmdW5jdGlvbihkYXRlLCByZXN1bHQpIHsKICAgICAgICBpZiAoIShkYXRlIGluc3RhbmNlb2YgR3JlZ29yaWFuRGF0ZV9kZWZhdWx0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImRhdGUgbXVzdCBiZSBhIHZhbGlkIEdyZWdvcmlhbkRhdGUuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBjb21wdXRlSnVsaWFuRGF0ZUNvbXBvbmVudHMoCiAgICAgICAgICBkYXRlLnllYXIsCiAgICAgICAgICBkYXRlLm1vbnRoLAogICAgICAgICAgZGF0ZS5kYXksCiAgICAgICAgICBkYXRlLmhvdXIsCiAgICAgICAgICBkYXRlLm1pbnV0ZSwKICAgICAgICAgIGRhdGUuc2Vjb25kLAogICAgICAgICAgZGF0ZS5taWxsaXNlY29uZAogICAgICAgICk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBKdWxpYW5EYXRlKGNvbXBvbmVudHNbMF0sIGNvbXBvbmVudHNbMV0sIFRpbWVTdGFuZGFyZF9kZWZhdWx0LlVUQyk7CiAgICAgICAgfQogICAgICAgIHNldENvbXBvbmVudHMoY29tcG9uZW50c1swXSwgY29tcG9uZW50c1sxXSwgcmVzdWx0KTsKICAgICAgICBjb252ZXJ0VXRjVG9UYWkocmVzdWx0KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBKdWxpYW5EYXRlLmZyb21EYXRlID0gZnVuY3Rpb24oZGF0ZSwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCEoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHx8IGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImRhdGUgbXVzdCBiZSBhIHZhbGlkIEphdmFTY3JpcHQgRGF0ZS4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IGNvbXB1dGVKdWxpYW5EYXRlQ29tcG9uZW50cygKICAgICAgICAgIGRhdGUuZ2V0VVRDRnVsbFllYXIoKSwKICAgICAgICAgIGRhdGUuZ2V0VVRDTW9udGgoKSArIDEsCiAgICAgICAgICBkYXRlLmdldFVUQ0RhdGUoKSwKICAgICAgICAgIGRhdGUuZ2V0VVRDSG91cnMoKSwKICAgICAgICAgIGRhdGUuZ2V0VVRDTWludXRlcygpLAogICAgICAgICAgZGF0ZS5nZXRVVENTZWNvbmRzKCksCiAgICAgICAgICBkYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpCiAgICAgICAgKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IEp1bGlhbkRhdGUoY29tcG9uZW50c1swXSwgY29tcG9uZW50c1sxXSwgVGltZVN0YW5kYXJkX2RlZmF1bHQuVVRDKTsKICAgICAgICB9CiAgICAgICAgc2V0Q29tcG9uZW50cyhjb21wb25lbnRzWzBdLCBjb21wb25lbnRzWzFdLCByZXN1bHQpOwogICAgICAgIGNvbnZlcnRVdGNUb1RhaShyZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEp1bGlhbkRhdGUuZnJvbUlzbzg2MDEgPSBmdW5jdGlvbihpc284NjAxU3RyaW5nLCByZXN1bHQpIHsKICAgICAgICBpZiAodHlwZW9mIGlzbzg2MDFTdHJpbmcgIT09ICJzdHJpbmciKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdChpc284NjAxRXJyb3JNZXNzYWdlKTsKICAgICAgICB9CiAgICAgICAgaXNvODYwMVN0cmluZyA9IGlzbzg2MDFTdHJpbmcucmVwbGFjZSgiLCIsICIuIik7CiAgICAgICAgbGV0IHRva2VucyA9IGlzbzg2MDFTdHJpbmcuc3BsaXQoIlQiKTsKICAgICAgICBsZXQgeWVhcjsKICAgICAgICBsZXQgbW9udGggPSAxOwogICAgICAgIGxldCBkYXkgPSAxOwogICAgICAgIGxldCBob3VyID0gMDsKICAgICAgICBsZXQgbWludXRlID0gMDsKICAgICAgICBsZXQgc2Vjb25kID0gMDsKICAgICAgICBsZXQgbWlsbGlzZWNvbmQgPSAwOwogICAgICAgIGNvbnN0IGRhdGUgPSB0b2tlbnNbMF07CiAgICAgICAgY29uc3QgdGltZSA9IHRva2Vuc1sxXTsKICAgICAgICBsZXQgdG1wMjsKICAgICAgICBsZXQgaW5MZWFwWWVhcjsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChkYXRlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoaXNvODYwMUVycm9yTWVzc2FnZSk7CiAgICAgICAgfQogICAgICAgIGxldCBkYXNoQ291bnQ7CiAgICAgICAgdG9rZW5zID0gZGF0ZS5tYXRjaChtYXRjaENhbGVuZGFyRGF0ZSk7CiAgICAgICAgaWYgKHRva2VucyAhPT0gbnVsbCkgewogICAgICAgICAgZGFzaENvdW50ID0gZGF0ZS5zcGxpdCgiLSIpLmxlbmd0aCAtIDE7CiAgICAgICAgICBpZiAoZGFzaENvdW50ID4gMCAmJiBkYXNoQ291bnQgIT09IDIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoaXNvODYwMUVycm9yTWVzc2FnZSk7CiAgICAgICAgICB9CiAgICAgICAgICB5ZWFyID0gK3Rva2Vuc1sxXTsKICAgICAgICAgIG1vbnRoID0gK3Rva2Vuc1syXTsKICAgICAgICAgIGRheSA9ICt0b2tlbnNbM107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRva2VucyA9IGRhdGUubWF0Y2gobWF0Y2hDYWxlbmRhck1vbnRoKTsKICAgICAgICAgIGlmICh0b2tlbnMgIT09IG51bGwpIHsKICAgICAgICAgICAgeWVhciA9ICt0b2tlbnNbMV07CiAgICAgICAgICAgIG1vbnRoID0gK3Rva2Vuc1syXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRva2VucyA9IGRhdGUubWF0Y2gobWF0Y2hDYWxlbmRhclllYXIpOwogICAgICAgICAgICBpZiAodG9rZW5zICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgeWVhciA9ICt0b2tlbnNbMV07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbGV0IGRheU9mWWVhcjsKICAgICAgICAgICAgICB0b2tlbnMgPSBkYXRlLm1hdGNoKG1hdGNoT3JkaW5hbERhdGUpOwogICAgICAgICAgICAgIGlmICh0b2tlbnMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHllYXIgPSArdG9rZW5zWzFdOwogICAgICAgICAgICAgICAgZGF5T2ZZZWFyID0gK3Rva2Vuc1syXTsKICAgICAgICAgICAgICAgIGluTGVhcFllYXIgPSBpc0xlYXBZZWFyX2RlZmF1bHQoeWVhcik7CiAgICAgICAgICAgICAgICBpZiAoZGF5T2ZZZWFyIDwgMSB8fCBpbkxlYXBZZWFyICYmIGRheU9mWWVhciA+IDM2NiB8fCAhaW5MZWFwWWVhciAmJiBkYXlPZlllYXIgPiAzNjUpIHsKICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoaXNvODYwMUVycm9yTWVzc2FnZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IGRhdGUubWF0Y2gobWF0Y2hXZWVrRGF0ZSk7CiAgICAgICAgICAgICAgICBpZiAodG9rZW5zICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIHllYXIgPSArdG9rZW5zWzFdOwogICAgICAgICAgICAgICAgICBjb25zdCB3ZWVrTnVtYmVyID0gK3Rva2Vuc1syXTsKICAgICAgICAgICAgICAgICAgY29uc3QgZGF5T2ZXZWVrID0gK3Rva2Vuc1szXSB8fCAwOwogICAgICAgICAgICAgICAgICBkYXNoQ291bnQgPSBkYXRlLnNwbGl0KCItIikubGVuZ3RoIC0gMTsKICAgICAgICAgICAgICAgICAgaWYgKGRhc2hDb3VudCA+IDAgJiYgKCFkZWZpbmVkX2RlZmF1bHQodG9rZW5zWzNdKSAmJiBkYXNoQ291bnQgIT09IDEgfHwgZGVmaW5lZF9kZWZhdWx0KHRva2Vuc1szXSkgJiYgZGFzaENvdW50ICE9PSAyKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KGlzbzg2MDFFcnJvck1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGNvbnN0IGphbnVhcnk0ID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgMCwgNCkpOwogICAgICAgICAgICAgICAgICBkYXlPZlllYXIgPSB3ZWVrTnVtYmVyICogNyArIGRheU9mV2VlayAtIGphbnVhcnk0LmdldFVUQ0RheSgpIC0gMzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KGlzbzg2MDFFcnJvck1lc3NhZ2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0bXAyID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgMCwgMSkpOwogICAgICAgICAgICAgIHRtcDIuc2V0VVRDRGF0ZShkYXlPZlllYXIpOwogICAgICAgICAgICAgIG1vbnRoID0gdG1wMi5nZXRVVENNb250aCgpICsgMTsKICAgICAgICAgICAgICBkYXkgPSB0bXAyLmdldFVUQ0RhdGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpbkxlYXBZZWFyID0gaXNMZWFwWWVhcl9kZWZhdWx0KHllYXIpOwogICAgICAgIGlmIChtb250aCA8IDEgfHwgbW9udGggPiAxMiB8fCBkYXkgPCAxIHx8IChtb250aCAhPT0gMiB8fCAhaW5MZWFwWWVhcikgJiYgZGF5ID4gZGF5c0luTW9udGhbbW9udGggLSAxXSB8fCBpbkxlYXBZZWFyICYmIG1vbnRoID09PSAyICYmIGRheSA+IGRheXNJbkxlYXBGZWJydWFyeSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoaXNvODYwMUVycm9yTWVzc2FnZSk7CiAgICAgICAgfQogICAgICAgIGxldCBvZmZzZXRJbmRleDsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHRpbWUpKSB7CiAgICAgICAgICB0b2tlbnMgPSB0aW1lLm1hdGNoKG1hdGNoSG91cnNNaW51dGVzU2Vjb25kcyk7CiAgICAgICAgICBpZiAodG9rZW5zICE9PSBudWxsKSB7CiAgICAgICAgICAgIGRhc2hDb3VudCA9IHRpbWUuc3BsaXQoIjoiKS5sZW5ndGggLSAxOwogICAgICAgICAgICBpZiAoZGFzaENvdW50ID4gMCAmJiBkYXNoQ291bnQgIT09IDIgJiYgZGFzaENvdW50ICE9PSAzKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoaXNvODYwMUVycm9yTWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaG91ciA9ICt0b2tlbnNbMV07CiAgICAgICAgICAgIG1pbnV0ZSA9ICt0b2tlbnNbMl07CiAgICAgICAgICAgIHNlY29uZCA9ICt0b2tlbnNbM107CiAgICAgICAgICAgIG1pbGxpc2Vjb25kID0gKyh0b2tlbnNbNF0gfHwgMCkgKiAxZTM7CiAgICAgICAgICAgIG9mZnNldEluZGV4ID0gNTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRva2VucyA9IHRpbWUubWF0Y2gobWF0Y2hIb3Vyc01pbnV0ZXMpOwogICAgICAgICAgICBpZiAodG9rZW5zICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgZGFzaENvdW50ID0gdGltZS5zcGxpdCgiOiIpLmxlbmd0aCAtIDE7CiAgICAgICAgICAgICAgaWYgKGRhc2hDb3VudCA+IDIpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KGlzbzg2MDFFcnJvck1lc3NhZ2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBob3VyID0gK3Rva2Vuc1sxXTsKICAgICAgICAgICAgICBtaW51dGUgPSArdG9rZW5zWzJdOwogICAgICAgICAgICAgIHNlY29uZCA9ICsodG9rZW5zWzNdIHx8IDApICogNjA7CiAgICAgICAgICAgICAgb2Zmc2V0SW5kZXggPSA0OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRva2VucyA9IHRpbWUubWF0Y2gobWF0Y2hIb3Vycyk7CiAgICAgICAgICAgICAgaWYgKHRva2VucyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaG91ciA9ICt0b2tlbnNbMV07CiAgICAgICAgICAgICAgICBtaW51dGUgPSArKHRva2Vuc1syXSB8fCAwKSAqIDYwOwogICAgICAgICAgICAgICAgb2Zmc2V0SW5kZXggPSAzOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdChpc284NjAxRXJyb3JNZXNzYWdlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChtaW51dGUgPj0gNjAgfHwgc2Vjb25kID49IDYxIHx8IGhvdXIgPiAyNCB8fCBob3VyID09PSAyNCAmJiAobWludXRlID4gMCB8fCBzZWNvbmQgPiAwIHx8IG1pbGxpc2Vjb25kID4gMCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoaXNvODYwMUVycm9yTWVzc2FnZSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0b2tlbnNbb2Zmc2V0SW5kZXhdOwogICAgICAgICAgY29uc3Qgb2Zmc2V0SG91cnMgPSArdG9rZW5zW29mZnNldEluZGV4ICsgMV07CiAgICAgICAgICBjb25zdCBvZmZzZXRNaW51dGVzID0gKyh0b2tlbnNbb2Zmc2V0SW5kZXggKyAyXSB8fCAwKTsKICAgICAgICAgIHN3aXRjaCAob2Zmc2V0KSB7CiAgICAgICAgICAgIGNhc2UgIisiOgogICAgICAgICAgICAgIGhvdXIgPSBob3VyIC0gb2Zmc2V0SG91cnM7CiAgICAgICAgICAgICAgbWludXRlID0gbWludXRlIC0gb2Zmc2V0TWludXRlczsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiLSI6CiAgICAgICAgICAgICAgaG91ciA9IGhvdXIgKyBvZmZzZXRIb3VyczsKICAgICAgICAgICAgICBtaW51dGUgPSBtaW51dGUgKyBvZmZzZXRNaW51dGVzOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJaIjoKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBtaW51dGUgPSBtaW51dGUgKyBuZXcgRGF0ZSgKICAgICAgICAgICAgICAgIERhdGUuVVRDKHllYXIsIG1vbnRoIC0gMSwgZGF5LCBob3VyLCBtaW51dGUpCiAgICAgICAgICAgICAgKS5nZXRUaW1lem9uZU9mZnNldCgpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBpc0xlYXBTZWNvbmQgPSBzZWNvbmQgPT09IDYwOwogICAgICAgIGlmIChpc0xlYXBTZWNvbmQpIHsKICAgICAgICAgIHNlY29uZC0tOwogICAgICAgIH0KICAgICAgICB3aGlsZSAobWludXRlID49IDYwKSB7CiAgICAgICAgICBtaW51dGUgLT0gNjA7CiAgICAgICAgICBob3VyKys7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChob3VyID49IDI0KSB7CiAgICAgICAgICBob3VyIC09IDI0OwogICAgICAgICAgZGF5Kys7CiAgICAgICAgfQogICAgICAgIHRtcDIgPSBpbkxlYXBZZWFyICYmIG1vbnRoID09PSAyID8gZGF5c0luTGVhcEZlYnJ1YXJ5IDogZGF5c0luTW9udGhbbW9udGggLSAxXTsKICAgICAgICB3aGlsZSAoZGF5ID4gdG1wMikgewogICAgICAgICAgZGF5IC09IHRtcDI7CiAgICAgICAgICBtb250aCsrOwogICAgICAgICAgaWYgKG1vbnRoID4gMTIpIHsKICAgICAgICAgICAgbW9udGggLT0gMTI7CiAgICAgICAgICAgIHllYXIrKzsKICAgICAgICAgIH0KICAgICAgICAgIHRtcDIgPSBpbkxlYXBZZWFyICYmIG1vbnRoID09PSAyID8gZGF5c0luTGVhcEZlYnJ1YXJ5IDogZGF5c0luTW9udGhbbW9udGggLSAxXTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKG1pbnV0ZSA8IDApIHsKICAgICAgICAgIG1pbnV0ZSArPSA2MDsKICAgICAgICAgIGhvdXItLTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKGhvdXIgPCAwKSB7CiAgICAgICAgICBob3VyICs9IDI0OwogICAgICAgICAgZGF5LS07CiAgICAgICAgfQogICAgICAgIHdoaWxlIChkYXkgPCAxKSB7CiAgICAgICAgICBtb250aC0tOwogICAgICAgICAgaWYgKG1vbnRoIDwgMSkgewogICAgICAgICAgICBtb250aCArPSAxMjsKICAgICAgICAgICAgeWVhci0tOwogICAgICAgICAgfQogICAgICAgICAgdG1wMiA9IGluTGVhcFllYXIgJiYgbW9udGggPT09IDIgPyBkYXlzSW5MZWFwRmVicnVhcnkgOiBkYXlzSW5Nb250aFttb250aCAtIDFdOwogICAgICAgICAgZGF5ICs9IHRtcDI7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBjb21wdXRlSnVsaWFuRGF0ZUNvbXBvbmVudHMoCiAgICAgICAgICB5ZWFyLAogICAgICAgICAgbW9udGgsCiAgICAgICAgICBkYXksCiAgICAgICAgICBob3VyLAogICAgICAgICAgbWludXRlLAogICAgICAgICAgc2Vjb25kLAogICAgICAgICAgbWlsbGlzZWNvbmQKICAgICAgICApOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBKdWxpYW5EYXRlKGNvbXBvbmVudHNbMF0sIGNvbXBvbmVudHNbMV0sIFRpbWVTdGFuZGFyZF9kZWZhdWx0LlVUQyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNldENvbXBvbmVudHMoY29tcG9uZW50c1swXSwgY29tcG9uZW50c1sxXSwgcmVzdWx0KTsKICAgICAgICAgIGNvbnZlcnRVdGNUb1RhaShyZXN1bHQpOwogICAgICAgIH0KICAgICAgICBpZiAoaXNMZWFwU2Vjb25kKSB7CiAgICAgICAgICBKdWxpYW5EYXRlLmFkZFNlY29uZHMocmVzdWx0LCAxLCByZXN1bHQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBKdWxpYW5EYXRlLm5vdyA9IGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJldHVybiBKdWxpYW5EYXRlLmZyb21EYXRlKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLCByZXN1bHQpOwogICAgICB9OwogICAgICB0b0dyZWdvcmlhbkRhdGVTY3JhdGNoID0gbmV3IEp1bGlhbkRhdGUoMCwgMCwgVGltZVN0YW5kYXJkX2RlZmF1bHQuVEFJKTsKICAgICAgSnVsaWFuRGF0ZS50b0dyZWdvcmlhbkRhdGUgPSBmdW5jdGlvbihqdWxpYW5EYXRlLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChqdWxpYW5EYXRlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImp1bGlhbkRhdGUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGxldCBpc0xlYXBTZWNvbmQgPSBmYWxzZTsKICAgICAgICBsZXQgdGhpc1V0YyA9IGNvbnZlcnRUYWlUb1V0YyhqdWxpYW5EYXRlLCB0b0dyZWdvcmlhbkRhdGVTY3JhdGNoKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh0aGlzVXRjKSkgewogICAgICAgICAgSnVsaWFuRGF0ZS5hZGRTZWNvbmRzKGp1bGlhbkRhdGUsIC0xLCB0b0dyZWdvcmlhbkRhdGVTY3JhdGNoKTsKICAgICAgICAgIHRoaXNVdGMgPSBjb252ZXJ0VGFpVG9VdGModG9HcmVnb3JpYW5EYXRlU2NyYXRjaCwgdG9HcmVnb3JpYW5EYXRlU2NyYXRjaCk7CiAgICAgICAgICBpc0xlYXBTZWNvbmQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBsZXQganVsaWFuRGF5TnVtYmVyID0gdGhpc1V0Yy5kYXlOdW1iZXI7CiAgICAgICAgY29uc3Qgc2Vjb25kc09mRGF5ID0gdGhpc1V0Yy5zZWNvbmRzT2ZEYXk7CiAgICAgICAgaWYgKHNlY29uZHNPZkRheSA+PSA0MzIwMCkgewogICAgICAgICAganVsaWFuRGF5TnVtYmVyICs9IDE7CiAgICAgICAgfQogICAgICAgIGxldCBMID0ganVsaWFuRGF5TnVtYmVyICsgNjg1NjkgfCAwOwogICAgICAgIGNvbnN0IE4gPSA0ICogTCAvIDE0NjA5NyB8IDA7CiAgICAgICAgTCA9IEwgLSAoKDE0NjA5NyAqIE4gKyAzKSAvIDQgfCAwKSB8IDA7CiAgICAgICAgY29uc3QgSSA9IDRlMyAqIChMICsgMSkgLyAxNDYxMDAxIHwgMDsKICAgICAgICBMID0gTCAtICgxNDYxICogSSAvIDQgfCAwKSArIDMxIHwgMDsKICAgICAgICBjb25zdCBKID0gODAgKiBMIC8gMjQ0NyB8IDA7CiAgICAgICAgY29uc3QgZGF5ID0gTCAtICgyNDQ3ICogSiAvIDgwIHwgMCkgfCAwOwogICAgICAgIEwgPSBKIC8gMTEgfCAwOwogICAgICAgIGNvbnN0IG1vbnRoID0gSiArIDIgLSAxMiAqIEwgfCAwOwogICAgICAgIGNvbnN0IHllYXIgPSAxMDAgKiAoTiAtIDQ5KSArIEkgKyBMIHwgMDsKICAgICAgICBsZXQgaG91ciA9IHNlY29uZHNPZkRheSAvIFRpbWVDb25zdGFudHNfZGVmYXVsdC5TRUNPTkRTX1BFUl9IT1VSIHwgMDsKICAgICAgICBsZXQgcmVtYWluaW5nU2Vjb25kcyA9IHNlY29uZHNPZkRheSAtIGhvdXIgKiBUaW1lQ29uc3RhbnRzX2RlZmF1bHQuU0VDT05EU19QRVJfSE9VUjsKICAgICAgICBjb25zdCBtaW51dGUgPSByZW1haW5pbmdTZWNvbmRzIC8gVGltZUNvbnN0YW50c19kZWZhdWx0LlNFQ09ORFNfUEVSX01JTlVURSB8IDA7CiAgICAgICAgcmVtYWluaW5nU2Vjb25kcyA9IHJlbWFpbmluZ1NlY29uZHMgLSBtaW51dGUgKiBUaW1lQ29uc3RhbnRzX2RlZmF1bHQuU0VDT05EU19QRVJfTUlOVVRFOwogICAgICAgIGxldCBzZWNvbmQgPSByZW1haW5pbmdTZWNvbmRzIHwgMDsKICAgICAgICBjb25zdCBtaWxsaXNlY29uZCA9IChyZW1haW5pbmdTZWNvbmRzIC0gc2Vjb25kKSAvIFRpbWVDb25zdGFudHNfZGVmYXVsdC5TRUNPTkRTX1BFUl9NSUxMSVNFQ09ORDsKICAgICAgICBob3VyICs9IDEyOwogICAgICAgIGlmIChob3VyID4gMjMpIHsKICAgICAgICAgIGhvdXIgLT0gMjQ7CiAgICAgICAgfQogICAgICAgIGlmIChpc0xlYXBTZWNvbmQpIHsKICAgICAgICAgIHNlY29uZCArPSAxOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IEdyZWdvcmlhbkRhdGVfZGVmYXVsdCgKICAgICAgICAgICAgeWVhciwKICAgICAgICAgICAgbW9udGgsCiAgICAgICAgICAgIGRheSwKICAgICAgICAgICAgaG91ciwKICAgICAgICAgICAgbWludXRlLAogICAgICAgICAgICBzZWNvbmQsCiAgICAgICAgICAgIG1pbGxpc2Vjb25kLAogICAgICAgICAgICBpc0xlYXBTZWNvbmQKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC55ZWFyID0geWVhcjsKICAgICAgICByZXN1bHQubW9udGggPSBtb250aDsKICAgICAgICByZXN1bHQuZGF5ID0gZGF5OwogICAgICAgIHJlc3VsdC5ob3VyID0gaG91cjsKICAgICAgICByZXN1bHQubWludXRlID0gbWludXRlOwogICAgICAgIHJlc3VsdC5zZWNvbmQgPSBzZWNvbmQ7CiAgICAgICAgcmVzdWx0Lm1pbGxpc2Vjb25kID0gbWlsbGlzZWNvbmQ7CiAgICAgICAgcmVzdWx0LmlzTGVhcFNlY29uZCA9IGlzTGVhcFNlY29uZDsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBKdWxpYW5EYXRlLnRvRGF0ZSA9IGZ1bmN0aW9uKGp1bGlhbkRhdGUpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChqdWxpYW5EYXRlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImp1bGlhbkRhdGUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGdEYXRlID0gSnVsaWFuRGF0ZS50b0dyZWdvcmlhbkRhdGUoanVsaWFuRGF0ZSwgZ3JlZ29yaWFuRGF0ZVNjcmF0Y2gpOwogICAgICAgIGxldCBzZWNvbmQgPSBnRGF0ZS5zZWNvbmQ7CiAgICAgICAgaWYgKGdEYXRlLmlzTGVhcFNlY29uZCkgewogICAgICAgICAgc2Vjb25kIC09IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgRGF0ZSgKICAgICAgICAgIERhdGUuVVRDKAogICAgICAgICAgICBnRGF0ZS55ZWFyLAogICAgICAgICAgICBnRGF0ZS5tb250aCAtIDEsCiAgICAgICAgICAgIGdEYXRlLmRheSwKICAgICAgICAgICAgZ0RhdGUuaG91ciwKICAgICAgICAgICAgZ0RhdGUubWludXRlLAogICAgICAgICAgICBzZWNvbmQsCiAgICAgICAgICAgIGdEYXRlLm1pbGxpc2Vjb25kCiAgICAgICAgICApCiAgICAgICAgKTsKICAgICAgfTsKICAgICAgSnVsaWFuRGF0ZS50b0lzbzg2MDEgPSBmdW5jdGlvbihqdWxpYW5EYXRlLCBwcmVjaXNpb24pIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChqdWxpYW5EYXRlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImp1bGlhbkRhdGUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGdEYXRlID0gSnVsaWFuRGF0ZS50b0dyZWdvcmlhbkRhdGUoanVsaWFuRGF0ZSwgZ3JlZ29yaWFuRGF0ZVNjcmF0Y2gpOwogICAgICAgIGxldCB5ZWFyID0gZ0RhdGUueWVhcjsKICAgICAgICBsZXQgbW9udGggPSBnRGF0ZS5tb250aDsKICAgICAgICBsZXQgZGF5ID0gZ0RhdGUuZGF5OwogICAgICAgIGxldCBob3VyID0gZ0RhdGUuaG91cjsKICAgICAgICBjb25zdCBtaW51dGUgPSBnRGF0ZS5taW51dGU7CiAgICAgICAgY29uc3Qgc2Vjb25kID0gZ0RhdGUuc2Vjb25kOwogICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kID0gZ0RhdGUubWlsbGlzZWNvbmQ7CiAgICAgICAgaWYgKHllYXIgPT09IDFlNCAmJiBtb250aCA9PT0gMSAmJiBkYXkgPT09IDEgJiYgaG91ciA9PT0gMCAmJiBtaW51dGUgPT09IDAgJiYgc2Vjb25kID09PSAwICYmIG1pbGxpc2Vjb25kID09PSAwKSB7CiAgICAgICAgICB5ZWFyID0gOTk5OTsKICAgICAgICAgIG1vbnRoID0gMTI7CiAgICAgICAgICBkYXkgPSAzMTsKICAgICAgICAgIGhvdXIgPSAyNDsKICAgICAgICB9CiAgICAgICAgbGV0IG1pbGxpc2Vjb25kU3RyOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHByZWNpc2lvbikgJiYgbWlsbGlzZWNvbmQgIT09IDApIHsKICAgICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kSHVuZHJlZHMgPSBtaWxsaXNlY29uZCAqIDAuMDE7CiAgICAgICAgICBtaWxsaXNlY29uZFN0ciA9IG1pbGxpc2Vjb25kSHVuZHJlZHMgPCAxZS02ID8gbWlsbGlzZWNvbmRIdW5kcmVkcy50b0ZpeGVkKDIwKS5yZXBsYWNlKCIuIiwgIiIpLnJlcGxhY2UoLzArJC8sICIiKSA6IG1pbGxpc2Vjb25kSHVuZHJlZHMudG9TdHJpbmcoKS5yZXBsYWNlKCIuIiwgIiIpOwogICAgICAgICAgcmV0dXJuIGAke3llYXIudG9TdHJpbmcoKS5wYWRTdGFydCg0LCAiMCIpfS0ke21vbnRoLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKX0tJHtkYXkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfVQke2hvdXIudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfToke21pbnV0ZS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9OiR7c2Vjb25kLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKX0uJHttaWxsaXNlY29uZFN0cn1aYDsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocHJlY2lzaW9uKSB8fCBwcmVjaXNpb24gPT09IDApIHsKICAgICAgICAgIHJldHVybiBgJHt5ZWFyLnRvU3RyaW5nKCkucGFkU3RhcnQoNCwgIjAiKX0tJHttb250aC50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9LSR7ZGF5LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKX1UJHtob3VyLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKX06JHttaW51dGUudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfToke3NlY29uZC50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9WmA7CiAgICAgICAgfQogICAgICAgIG1pbGxpc2Vjb25kU3RyID0gKG1pbGxpc2Vjb25kICogMC4wMSkudG9GaXhlZChwcmVjaXNpb24pLnJlcGxhY2UoIi4iLCAiIikuc2xpY2UoMCwgcHJlY2lzaW9uKTsKICAgICAgICByZXR1cm4gYCR7eWVhci50b1N0cmluZygpLnBhZFN0YXJ0KDQsICIwIil9LSR7bW9udGgudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfS0ke2RheS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9VCR7aG91ci50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9OiR7bWludXRlLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKX06JHtzZWNvbmQudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfS4ke21pbGxpc2Vjb25kU3RyfVpgOwogICAgICB9OwogICAgICBKdWxpYW5EYXRlLmNsb25lID0gZnVuY3Rpb24oanVsaWFuRGF0ZSwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoanVsaWFuRGF0ZSkpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgSnVsaWFuRGF0ZSgKICAgICAgICAgICAganVsaWFuRGF0ZS5kYXlOdW1iZXIsCiAgICAgICAgICAgIGp1bGlhbkRhdGUuc2Vjb25kc09mRGF5LAogICAgICAgICAgICBUaW1lU3RhbmRhcmRfZGVmYXVsdC5UQUkKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5kYXlOdW1iZXIgPSBqdWxpYW5EYXRlLmRheU51bWJlcjsKICAgICAgICByZXN1bHQuc2Vjb25kc09mRGF5ID0ganVsaWFuRGF0ZS5zZWNvbmRzT2ZEYXk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgSnVsaWFuRGF0ZS5jb21wYXJlID0gZnVuY3Rpb24obGVmdCwgcmlnaHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChsZWZ0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImxlZnQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJpZ2h0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInJpZ2h0IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBqdWxpYW5EYXlOdW1iZXJEaWZmZXJlbmNlID0gbGVmdC5kYXlOdW1iZXIgLSByaWdodC5kYXlOdW1iZXI7CiAgICAgICAgaWYgKGp1bGlhbkRheU51bWJlckRpZmZlcmVuY2UgIT09IDApIHsKICAgICAgICAgIHJldHVybiBqdWxpYW5EYXlOdW1iZXJEaWZmZXJlbmNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGVmdC5zZWNvbmRzT2ZEYXkgLSByaWdodC5zZWNvbmRzT2ZEYXk7CiAgICAgIH07CiAgICAgIEp1bGlhbkRhdGUuZXF1YWxzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQpIHsKICAgICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgZGVmaW5lZF9kZWZhdWx0KGxlZnQpICYmIGRlZmluZWRfZGVmYXVsdChyaWdodCkgJiYgbGVmdC5kYXlOdW1iZXIgPT09IHJpZ2h0LmRheU51bWJlciAmJiBsZWZ0LnNlY29uZHNPZkRheSA9PT0gcmlnaHQuc2Vjb25kc09mRGF5OwogICAgICB9OwogICAgICBKdWxpYW5EYXRlLmVxdWFsc0Vwc2lsb24gPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgZXBzaWxvbikgewogICAgICAgIGVwc2lsb24gPSBlcHNpbG9uID8/IDA7CiAgICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8IGRlZmluZWRfZGVmYXVsdChsZWZ0KSAmJiBkZWZpbmVkX2RlZmF1bHQocmlnaHQpICYmIE1hdGguYWJzKEp1bGlhbkRhdGUuc2Vjb25kc0RpZmZlcmVuY2UobGVmdCwgcmlnaHQpKSA8PSBlcHNpbG9uOwogICAgICB9OwogICAgICBKdWxpYW5EYXRlLnRvdGFsRGF5cyA9IGZ1bmN0aW9uKGp1bGlhbkRhdGUpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChqdWxpYW5EYXRlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImp1bGlhbkRhdGUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBqdWxpYW5EYXRlLmRheU51bWJlciArIGp1bGlhbkRhdGUuc2Vjb25kc09mRGF5IC8gVGltZUNvbnN0YW50c19kZWZhdWx0LlNFQ09ORFNfUEVSX0RBWTsKICAgICAgfTsKICAgICAgSnVsaWFuRGF0ZS5zZWNvbmRzRGlmZmVyZW5jZSA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobGVmdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJsZWZ0IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyaWdodCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJyaWdodCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZGF5RGlmZmVyZW5jZSA9IChsZWZ0LmRheU51bWJlciAtIHJpZ2h0LmRheU51bWJlcikgKiBUaW1lQ29uc3RhbnRzX2RlZmF1bHQuU0VDT05EU19QRVJfREFZOwogICAgICAgIHJldHVybiBkYXlEaWZmZXJlbmNlICsgKGxlZnQuc2Vjb25kc09mRGF5IC0gcmlnaHQuc2Vjb25kc09mRGF5KTsKICAgICAgfTsKICAgICAgSnVsaWFuRGF0ZS5kYXlzRGlmZmVyZW5jZSA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobGVmdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJsZWZ0IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyaWdodCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJyaWdodCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZGF5RGlmZmVyZW5jZSA9IGxlZnQuZGF5TnVtYmVyIC0gcmlnaHQuZGF5TnVtYmVyOwogICAgICAgIGNvbnN0IHNlY29uZERpZmZlcmVuY2UgPSAobGVmdC5zZWNvbmRzT2ZEYXkgLSByaWdodC5zZWNvbmRzT2ZEYXkpIC8gVGltZUNvbnN0YW50c19kZWZhdWx0LlNFQ09ORFNfUEVSX0RBWTsKICAgICAgICByZXR1cm4gZGF5RGlmZmVyZW5jZSArIHNlY29uZERpZmZlcmVuY2U7CiAgICAgIH07CiAgICAgIEp1bGlhbkRhdGUuY29tcHV0ZVRhaU1pbnVzVXRjID0gZnVuY3Rpb24oanVsaWFuRGF0ZSkgewogICAgICAgIGJpbmFyeVNlYXJjaFNjcmF0Y2hMZWFwU2Vjb25kLmp1bGlhbkRhdGUgPSBqdWxpYW5EYXRlOwogICAgICAgIGNvbnN0IGxlYXBTZWNvbmRzID0gSnVsaWFuRGF0ZS5sZWFwU2Vjb25kczsKICAgICAgICBsZXQgaW5kZXggPSBiaW5hcnlTZWFyY2hfZGVmYXVsdCgKICAgICAgICAgIGxlYXBTZWNvbmRzLAogICAgICAgICAgYmluYXJ5U2VhcmNoU2NyYXRjaExlYXBTZWNvbmQsCiAgICAgICAgICBjb21wYXJlTGVhcFNlY29uZERhdGVzCiAgICAgICAgKTsKICAgICAgICBpZiAoaW5kZXggPCAwKSB7CiAgICAgICAgICBpbmRleCA9IH5pbmRleDsKICAgICAgICAgIC0taW5kZXg7CiAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CiAgICAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxlYXBTZWNvbmRzW2luZGV4XS5vZmZzZXQ7CiAgICAgIH07CiAgICAgIEp1bGlhbkRhdGUuYWRkU2Vjb25kcyA9IGZ1bmN0aW9uKGp1bGlhbkRhdGUsIHNlY29uZHMsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGp1bGlhbkRhdGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgianVsaWFuRGF0ZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoc2Vjb25kcykpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJzZWNvbmRzIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgicmVzdWx0IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2V0Q29tcG9uZW50cygKICAgICAgICAgIGp1bGlhbkRhdGUuZGF5TnVtYmVyLAogICAgICAgICAganVsaWFuRGF0ZS5zZWNvbmRzT2ZEYXkgKyBzZWNvbmRzLAogICAgICAgICAgcmVzdWx0CiAgICAgICAgKTsKICAgICAgfTsKICAgICAgSnVsaWFuRGF0ZS5hZGRNaW51dGVzID0gZnVuY3Rpb24oanVsaWFuRGF0ZSwgbWludXRlcywgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoanVsaWFuRGF0ZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJqdWxpYW5EYXRlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChtaW51dGVzKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm1pbnV0ZXMgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJyZXN1bHQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG5ld1NlY29uZHNPZkRheSA9IGp1bGlhbkRhdGUuc2Vjb25kc09mRGF5ICsgbWludXRlcyAqIFRpbWVDb25zdGFudHNfZGVmYXVsdC5TRUNPTkRTX1BFUl9NSU5VVEU7CiAgICAgICAgcmV0dXJuIHNldENvbXBvbmVudHMoanVsaWFuRGF0ZS5kYXlOdW1iZXIsIG5ld1NlY29uZHNPZkRheSwgcmVzdWx0KTsKICAgICAgfTsKICAgICAgSnVsaWFuRGF0ZS5hZGRIb3VycyA9IGZ1bmN0aW9uKGp1bGlhbkRhdGUsIGhvdXJzLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChqdWxpYW5EYXRlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImp1bGlhbkRhdGUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGhvdXJzKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImhvdXJzIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgicmVzdWx0IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBuZXdTZWNvbmRzT2ZEYXkgPSBqdWxpYW5EYXRlLnNlY29uZHNPZkRheSArIGhvdXJzICogVGltZUNvbnN0YW50c19kZWZhdWx0LlNFQ09ORFNfUEVSX0hPVVI7CiAgICAgICAgcmV0dXJuIHNldENvbXBvbmVudHMoanVsaWFuRGF0ZS5kYXlOdW1iZXIsIG5ld1NlY29uZHNPZkRheSwgcmVzdWx0KTsKICAgICAgfTsKICAgICAgSnVsaWFuRGF0ZS5hZGREYXlzID0gZnVuY3Rpb24oanVsaWFuRGF0ZSwgZGF5cywgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoanVsaWFuRGF0ZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJqdWxpYW5EYXRlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChkYXlzKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImRheXMgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJyZXN1bHQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG5ld0p1bGlhbkRheU51bWJlciA9IGp1bGlhbkRhdGUuZGF5TnVtYmVyICsgZGF5czsKICAgICAgICByZXR1cm4gc2V0Q29tcG9uZW50cyhuZXdKdWxpYW5EYXlOdW1iZXIsIGp1bGlhbkRhdGUuc2Vjb25kc09mRGF5LCByZXN1bHQpOwogICAgICB9OwogICAgICBKdWxpYW5EYXRlLmxlc3NUaGFuID0gZnVuY3Rpb24obGVmdCwgcmlnaHQpIHsKICAgICAgICByZXR1cm4gSnVsaWFuRGF0ZS5jb21wYXJlKGxlZnQsIHJpZ2h0KSA8IDA7CiAgICAgIH07CiAgICAgIEp1bGlhbkRhdGUubGVzc1RoYW5PckVxdWFscyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgcmV0dXJuIEp1bGlhbkRhdGUuY29tcGFyZShsZWZ0LCByaWdodCkgPD0gMDsKICAgICAgfTsKICAgICAgSnVsaWFuRGF0ZS5ncmVhdGVyVGhhbiA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgcmV0dXJuIEp1bGlhbkRhdGUuY29tcGFyZShsZWZ0LCByaWdodCkgPiAwOwogICAgICB9OwogICAgICBKdWxpYW5EYXRlLmdyZWF0ZXJUaGFuT3JFcXVhbHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkgewogICAgICAgIHJldHVybiBKdWxpYW5EYXRlLmNvbXBhcmUobGVmdCwgcmlnaHQpID49IDA7CiAgICAgIH07CiAgICAgIEp1bGlhbkRhdGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIEp1bGlhbkRhdGUuY2xvbmUodGhpcywgcmVzdWx0KTsKICAgICAgfTsKICAgICAgSnVsaWFuRGF0ZS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24ocmlnaHQpIHsKICAgICAgICByZXR1cm4gSnVsaWFuRGF0ZS5lcXVhbHModGhpcywgcmlnaHQpOwogICAgICB9OwogICAgICBKdWxpYW5EYXRlLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uID0gZnVuY3Rpb24ocmlnaHQsIGVwc2lsb24pIHsKICAgICAgICByZXR1cm4gSnVsaWFuRGF0ZS5lcXVhbHNFcHNpbG9uKHRoaXMsIHJpZ2h0LCBlcHNpbG9uKTsKICAgICAgfTsKICAgICAgSnVsaWFuRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gSnVsaWFuRGF0ZS50b0lzbzg2MDEodGhpcyk7CiAgICAgIH07CiAgICAgIEp1bGlhbkRhdGUubGVhcFNlY29uZHMgPSBbCiAgICAgICAgbmV3IExlYXBTZWNvbmRfZGVmYXVsdChuZXcgSnVsaWFuRGF0ZSgyNDQxMzE3LCA0MzIxMCwgVGltZVN0YW5kYXJkX2RlZmF1bHQuVEFJKSwgMTApLAogICAgICAgIC8vIEphbnVhcnkgMSwgMTk3MiAwMDowMDowMCBVVEMKICAgICAgICBuZXcgTGVhcFNlY29uZF9kZWZhdWx0KG5ldyBKdWxpYW5EYXRlKDI0NDE0OTksIDQzMjExLCBUaW1lU3RhbmRhcmRfZGVmYXVsdC5UQUkpLCAxMSksCiAgICAgICAgLy8gSnVseSAxLCAxOTcyIDAwOjAwOjAwIFVUQwogICAgICAgIG5ldyBMZWFwU2Vjb25kX2RlZmF1bHQobmV3IEp1bGlhbkRhdGUoMjQ0MTY4MywgNDMyMTIsIFRpbWVTdGFuZGFyZF9kZWZhdWx0LlRBSSksIDEyKSwKICAgICAgICAvLyBKYW51YXJ5IDEsIDE5NzMgMDA6MDA6MDAgVVRDCiAgICAgICAgbmV3IExlYXBTZWNvbmRfZGVmYXVsdChuZXcgSnVsaWFuRGF0ZSgyNDQyMDQ4LCA0MzIxMywgVGltZVN0YW5kYXJkX2RlZmF1bHQuVEFJKSwgMTMpLAogICAgICAgIC8vIEphbnVhcnkgMSwgMTk3NCAwMDowMDowMCBVVEMKICAgICAgICBuZXcgTGVhcFNlY29uZF9kZWZhdWx0KG5ldyBKdWxpYW5EYXRlKDI0NDI0MTMsIDQzMjE0LCBUaW1lU3RhbmRhcmRfZGVmYXVsdC5UQUkpLCAxNCksCiAgICAgICAgLy8gSmFudWFyeSAxLCAxOTc1IDAwOjAwOjAwIFVUQwogICAgICAgIG5ldyBMZWFwU2Vjb25kX2RlZmF1bHQobmV3IEp1bGlhbkRhdGUoMjQ0Mjc3OCwgNDMyMTUsIFRpbWVTdGFuZGFyZF9kZWZhdWx0LlRBSSksIDE1KSwKICAgICAgICAvLyBKYW51YXJ5IDEsIDE5NzYgMDA6MDA6MDAgVVRDCiAgICAgICAgbmV3IExlYXBTZWNvbmRfZGVmYXVsdChuZXcgSnVsaWFuRGF0ZSgyNDQzMTQ0LCA0MzIxNiwgVGltZVN0YW5kYXJkX2RlZmF1bHQuVEFJKSwgMTYpLAogICAgICAgIC8vIEphbnVhcnkgMSwgMTk3NyAwMDowMDowMCBVVEMKICAgICAgICBuZXcgTGVhcFNlY29uZF9kZWZhdWx0KG5ldyBKdWxpYW5EYXRlKDI0NDM1MDksIDQzMjE3LCBUaW1lU3RhbmRhcmRfZGVmYXVsdC5UQUkpLCAxNyksCiAgICAgICAgLy8gSmFudWFyeSAxLCAxOTc4IDAwOjAwOjAwIFVUQwogICAgICAgIG5ldyBMZWFwU2Vjb25kX2RlZmF1bHQobmV3IEp1bGlhbkRhdGUoMjQ0Mzg3NCwgNDMyMTgsIFRpbWVTdGFuZGFyZF9kZWZhdWx0LlRBSSksIDE4KSwKICAgICAgICAvLyBKYW51YXJ5IDEsIDE5NzkgMDA6MDA6MDAgVVRDCiAgICAgICAgbmV3IExlYXBTZWNvbmRfZGVmYXVsdChuZXcgSnVsaWFuRGF0ZSgyNDQ0MjM5LCA0MzIxOSwgVGltZVN0YW5kYXJkX2RlZmF1bHQuVEFJKSwgMTkpLAogICAgICAgIC8vIEphbnVhcnkgMSwgMTk4MCAwMDowMDowMCBVVEMKICAgICAgICBuZXcgTGVhcFNlY29uZF9kZWZhdWx0KG5ldyBKdWxpYW5EYXRlKDI0NDQ3ODYsIDQzMjIwLCBUaW1lU3RhbmRhcmRfZGVmYXVsdC5UQUkpLCAyMCksCiAgICAgICAgLy8gSnVseSAxLCAxOTgxIDAwOjAwOjAwIFVUQwogICAgICAgIG5ldyBMZWFwU2Vjb25kX2RlZmF1bHQobmV3IEp1bGlhbkRhdGUoMjQ0NTE1MSwgNDMyMjEsIFRpbWVTdGFuZGFyZF9kZWZhdWx0LlRBSSksIDIxKSwKICAgICAgICAvLyBKdWx5IDEsIDE5ODIgMDA6MDA6MDAgVVRDCiAgICAgICAgbmV3IExlYXBTZWNvbmRfZGVmYXVsdChuZXcgSnVsaWFuRGF0ZSgyNDQ1NTE2LCA0MzIyMiwgVGltZVN0YW5kYXJkX2RlZmF1bHQuVEFJKSwgMjIpLAogICAgICAgIC8vIEp1bHkgMSwgMTk4MyAwMDowMDowMCBVVEMKICAgICAgICBuZXcgTGVhcFNlY29uZF9kZWZhdWx0KG5ldyBKdWxpYW5EYXRlKDI0NDYyNDcsIDQzMjIzLCBUaW1lU3RhbmRhcmRfZGVmYXVsdC5UQUkpLCAyMyksCiAgICAgICAgLy8gSnVseSAxLCAxOTg1IDAwOjAwOjAwIFVUQwogICAgICAgIG5ldyBMZWFwU2Vjb25kX2RlZmF1bHQobmV3IEp1bGlhbkRhdGUoMjQ0NzE2MSwgNDMyMjQsIFRpbWVTdGFuZGFyZF9kZWZhdWx0LlRBSSksIDI0KSwKICAgICAgICAvLyBKYW51YXJ5IDEsIDE5ODggMDA6MDA6MDAgVVRDCiAgICAgICAgbmV3IExlYXBTZWNvbmRfZGVmYXVsdChuZXcgSnVsaWFuRGF0ZSgyNDQ3ODkyLCA0MzIyNSwgVGltZVN0YW5kYXJkX2RlZmF1bHQuVEFJKSwgMjUpLAogICAgICAgIC8vIEphbnVhcnkgMSwgMTk5MCAwMDowMDowMCBVVEMKICAgICAgICBuZXcgTGVhcFNlY29uZF9kZWZhdWx0KG5ldyBKdWxpYW5EYXRlKDI0NDgyNTcsIDQzMjI2LCBUaW1lU3RhbmRhcmRfZGVmYXVsdC5UQUkpLCAyNiksCiAgICAgICAgLy8gSmFudWFyeSAxLCAxOTkxIDAwOjAwOjAwIFVUQwogICAgICAgIG5ldyBMZWFwU2Vjb25kX2RlZmF1bHQobmV3IEp1bGlhbkRhdGUoMjQ0ODgwNCwgNDMyMjcsIFRpbWVTdGFuZGFyZF9kZWZhdWx0LlRBSSksIDI3KSwKICAgICAgICAvLyBKdWx5IDEsIDE5OTIgMDA6MDA6MDAgVVRDCiAgICAgICAgbmV3IExlYXBTZWNvbmRfZGVmYXVsdChuZXcgSnVsaWFuRGF0ZSgyNDQ5MTY5LCA0MzIyOCwgVGltZVN0YW5kYXJkX2RlZmF1bHQuVEFJKSwgMjgpLAogICAgICAgIC8vIEp1bHkgMSwgMTk5MyAwMDowMDowMCBVVEMKICAgICAgICBuZXcgTGVhcFNlY29uZF9kZWZhdWx0KG5ldyBKdWxpYW5EYXRlKDI0NDk1MzQsIDQzMjI5LCBUaW1lU3RhbmRhcmRfZGVmYXVsdC5UQUkpLCAyOSksCiAgICAgICAgLy8gSnVseSAxLCAxOTk0IDAwOjAwOjAwIFVUQwogICAgICAgIG5ldyBMZWFwU2Vjb25kX2RlZmF1bHQobmV3IEp1bGlhbkRhdGUoMjQ1MDA4MywgNDMyMzAsIFRpbWVTdGFuZGFyZF9kZWZhdWx0LlRBSSksIDMwKSwKICAgICAgICAvLyBKYW51YXJ5IDEsIDE5OTYgMDA6MDA6MDAgVVRDCiAgICAgICAgbmV3IExlYXBTZWNvbmRfZGVmYXVsdChuZXcgSnVsaWFuRGF0ZSgyNDUwNjMwLCA0MzIzMSwgVGltZVN0YW5kYXJkX2RlZmF1bHQuVEFJKSwgMzEpLAogICAgICAgIC8vIEp1bHkgMSwgMTk5NyAwMDowMDowMCBVVEMKICAgICAgICBuZXcgTGVhcFNlY29uZF9kZWZhdWx0KG5ldyBKdWxpYW5EYXRlKDI0NTExNzksIDQzMjMyLCBUaW1lU3RhbmRhcmRfZGVmYXVsdC5UQUkpLCAzMiksCiAgICAgICAgLy8gSmFudWFyeSAxLCAxOTk5IDAwOjAwOjAwIFVUQwogICAgICAgIG5ldyBMZWFwU2Vjb25kX2RlZmF1bHQobmV3IEp1bGlhbkRhdGUoMjQ1MzczNiwgNDMyMzMsIFRpbWVTdGFuZGFyZF9kZWZhdWx0LlRBSSksIDMzKSwKICAgICAgICAvLyBKYW51YXJ5IDEsIDIwMDYgMDA6MDA6MDAgVVRDCiAgICAgICAgbmV3IExlYXBTZWNvbmRfZGVmYXVsdChuZXcgSnVsaWFuRGF0ZSgyNDU0ODMyLCA0MzIzNCwgVGltZVN0YW5kYXJkX2RlZmF1bHQuVEFJKSwgMzQpLAogICAgICAgIC8vIEphbnVhcnkgMSwgMjAwOSAwMDowMDowMCBVVEMKICAgICAgICBuZXcgTGVhcFNlY29uZF9kZWZhdWx0KG5ldyBKdWxpYW5EYXRlKDI0NTYxMDksIDQzMjM1LCBUaW1lU3RhbmRhcmRfZGVmYXVsdC5UQUkpLCAzNSksCiAgICAgICAgLy8gSnVseSAxLCAyMDEyIDAwOjAwOjAwIFVUQwogICAgICAgIG5ldyBMZWFwU2Vjb25kX2RlZmF1bHQobmV3IEp1bGlhbkRhdGUoMjQ1NzIwNCwgNDMyMzYsIFRpbWVTdGFuZGFyZF9kZWZhdWx0LlRBSSksIDM2KSwKICAgICAgICAvLyBKdWx5IDEsIDIwMTUgMDA6MDA6MDAgVVRDCiAgICAgICAgbmV3IExlYXBTZWNvbmRfZGVmYXVsdChuZXcgSnVsaWFuRGF0ZSgyNDU3NzU0LCA0MzIzNywgVGltZVN0YW5kYXJkX2RlZmF1bHQuVEFJKSwgMzcpCiAgICAgICAgLy8gSmFudWFyeSAxLCAyMDE3IDAwOjAwOjAwIFVUQwogICAgICBdOwogICAgICBKdWxpYW5EYXRlX2RlZmF1bHQgPSBKdWxpYW5EYXRlOwogICAgfQogIH0pOwoKICAvLyBub2RlX21vZHVsZXMvdXJpanMvc3JjL3B1bnljb2RlLmpzCiAgdmFyIHJlcXVpcmVfcHVueWNvZGUgPSBfX2NvbW1vbkpTKHsKICAgICJub2RlX21vZHVsZXMvdXJpanMvc3JjL3B1bnljb2RlLmpzIihleHBvcnRzMiwgbW9kdWxlKSB7CiAgICAgIC8qISBodHRwczovL210aHMuYmUvcHVueWNvZGUgdjEuNC4wIGJ5IEBtYXRoaWFzICovCiAgICAgIChmdW5jdGlvbihyb290KSB7CiAgICAgICAgdmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMyID09ICJvYmplY3QiICYmIGV4cG9ydHMyICYmICFleHBvcnRzMi5ub2RlVHlwZSAmJiBleHBvcnRzMjsKICAgICAgICB2YXIgZnJlZU1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlOwogICAgICAgIHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAib2JqZWN0IiAmJiBnbG9iYWw7CiAgICAgICAgaWYgKGZyZWVHbG9iYWwuZ2xvYmFsID09PSBmcmVlR2xvYmFsIHx8IGZyZWVHbG9iYWwud2luZG93ID09PSBmcmVlR2xvYmFsIHx8IGZyZWVHbG9iYWwuc2VsZiA9PT0gZnJlZUdsb2JhbCkgewogICAgICAgICAgcm9vdCA9IGZyZWVHbG9iYWw7CiAgICAgICAgfQogICAgICAgIHZhciBwdW55Y29kZSwgbWF4SW50ID0gMjE0NzQ4MzY0NywgYmFzZSA9IDM2LCB0TWluID0gMSwgdE1heCA9IDI2LCBza2V3ID0gMzgsIGRhbXAgPSA3MDAsIGluaXRpYWxCaWFzID0gNzIsIGluaXRpYWxOID0gMTI4LCBkZWxpbWl0ZXIgPSAiLSIsIHJlZ2V4UHVueWNvZGUgPSAvXnhuLS0vLCByZWdleE5vbkFTQ0lJID0gL1teXHgyMC1ceDdFXS8sIHJlZ2V4U2VwYXJhdG9ycyA9IC9bXHgyRVx1MzAwMlx1RkYwRVx1RkY2MV0vZywgZXJyb3JzID0gewogICAgICAgICAgIm92ZXJmbG93IjogIk92ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzIiwKICAgICAgICAgICJub3QtYmFzaWMiOiAiSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KSIsCiAgICAgICAgICAiaW52YWxpZC1pbnB1dCI6ICJJbnZhbGlkIGlucHV0IgogICAgICAgIH0sIGJhc2VNaW51c1RNaW4gPSBiYXNlIC0gdE1pbiwgZmxvb3IgPSBNYXRoLmZsb29yLCBzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLCBrZXk7CiAgICAgICAgZnVuY3Rpb24gZXJyb3IodHlwZSkgewogICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoZXJyb3JzW3R5cGVdKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gbWFwKGFycmF5LCBmbikgewogICAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgIHdoaWxlIChsZW5ndGgtLSkgewogICAgICAgICAgICByZXN1bHRbbGVuZ3RoXSA9IGZuKGFycmF5W2xlbmd0aF0pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gbWFwRG9tYWluKHN0cmluZywgZm4pIHsKICAgICAgICAgIHZhciBwYXJ0cyA9IHN0cmluZy5zcGxpdCgiQCIpOwogICAgICAgICAgdmFyIHJlc3VsdCA9ICIiOwogICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgcmVzdWx0ID0gcGFydHNbMF0gKyAiQCI7CiAgICAgICAgICAgIHN0cmluZyA9IHBhcnRzWzFdOwogICAgICAgICAgfQogICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocmVnZXhTZXBhcmF0b3JzLCAiLiIpOwogICAgICAgICAgdmFyIGxhYmVscyA9IHN0cmluZy5zcGxpdCgiLiIpOwogICAgICAgICAgdmFyIGVuY29kZWQgPSBtYXAobGFiZWxzLCBmbikuam9pbigiLiIpOwogICAgICAgICAgcmV0dXJuIHJlc3VsdCArIGVuY29kZWQ7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHVjczJkZWNvZGUoc3RyaW5nKSB7CiAgICAgICAgICB2YXIgb3V0cHV0ID0gW10sIGNvdW50ZXIgPSAwLCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoLCB2YWx1ZSwgZXh0cmE7CiAgICAgICAgICB3aGlsZSAoY291bnRlciA8IGxlbmd0aCkgewogICAgICAgICAgICB2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7CiAgICAgICAgICAgIGlmICh2YWx1ZSA+PSA1NTI5NiAmJiB2YWx1ZSA8PSA1NjMxOSAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7CiAgICAgICAgICAgICAgZXh0cmEgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspOwogICAgICAgICAgICAgIGlmICgoZXh0cmEgJiA2NDUxMikgPT0gNTYzMjApIHsKICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKCgodmFsdWUgJiAxMDIzKSA8PCAxMCkgKyAoZXh0cmEgJiAxMDIzKSArIDY1NTM2KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godmFsdWUpOwogICAgICAgICAgICAgICAgY291bnRlci0tOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBvdXRwdXQucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHVjczJlbmNvZGUoYXJyYXkpIHsKICAgICAgICAgIHJldHVybiBtYXAoYXJyYXksIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHZhciBvdXRwdXQgPSAiIjsKICAgICAgICAgICAgaWYgKHZhbHVlID4gNjU1MzUpIHsKICAgICAgICAgICAgICB2YWx1ZSAtPSA2NTUzNjsKICAgICAgICAgICAgICBvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlID4+PiAxMCAmIDEwMjMgfCA1NTI5Nik7CiAgICAgICAgICAgICAgdmFsdWUgPSA1NjMyMCB8IHZhbHVlICYgMTAyMzsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKICAgICAgICAgIH0pLmpvaW4oIiIpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBiYXNpY1RvRGlnaXQoY29kZVBvaW50KSB7CiAgICAgICAgICBpZiAoY29kZVBvaW50IC0gNDggPCAxMCkgewogICAgICAgICAgICByZXR1cm4gY29kZVBvaW50IC0gMjI7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY29kZVBvaW50IC0gNjUgPCAyNikgewogICAgICAgICAgICByZXR1cm4gY29kZVBvaW50IC0gNjU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY29kZVBvaW50IC0gOTcgPCAyNikgewogICAgICAgICAgICByZXR1cm4gY29kZVBvaW50IC0gOTc7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYmFzZTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZGlnaXRUb0Jhc2ljKGRpZ2l0LCBmbGFnKSB7CiAgICAgICAgICByZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpIC0gKChmbGFnICE9IDApIDw8IDUpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBhZGFwdChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHsKICAgICAgICAgIHZhciBrID0gMDsKICAgICAgICAgIGRlbHRhID0gZmlyc3RUaW1lID8gZmxvb3IoZGVsdGEgLyBkYW1wKSA6IGRlbHRhID4+IDE7CiAgICAgICAgICBkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7CiAgICAgICAgICBmb3IgKDsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHsKICAgICAgICAgICAgZGVsdGEgPSBmbG9vcihkZWx0YSAvIGJhc2VNaW51c1RNaW4pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGRlY29kZTMoaW5wdXQpIHsKICAgICAgICAgIHZhciBvdXRwdXQgPSBbXSwgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGgsIG91dCwgaSA9IDAsIG4gPSBpbml0aWFsTiwgYmlhcyA9IGluaXRpYWxCaWFzLCBiYXNpYywgaiwgaW5kZXgsIG9sZGksIHcsIGssIGRpZ2l0LCB0LCBiYXNlTWludXNUOwogICAgICAgICAgYmFzaWMgPSBpbnB1dC5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpOwogICAgICAgICAgaWYgKGJhc2ljIDwgMCkgewogICAgICAgICAgICBiYXNpYyA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmFzaWM7ICsraikgewogICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChqKSA+PSAxMjgpIHsKICAgICAgICAgICAgICBlcnJvcigibm90LWJhc2ljIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0cHV0LnB1c2goaW5wdXQuY2hhckNvZGVBdChqKSk7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGluZGV4ID0gYmFzaWMgPiAwID8gYmFzaWMgKyAxIDogMDsgaW5kZXggPCBpbnB1dExlbmd0aDsgKSB7CiAgICAgICAgICAgIGZvciAob2xkaSA9IGksIHcgPSAxLCBrID0gYmFzZTsgOyBrICs9IGJhc2UpIHsKICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gaW5wdXRMZW5ndGgpIHsKICAgICAgICAgICAgICAgIGVycm9yKCJpbnZhbGlkLWlucHV0Iik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGRpZ2l0ID0gYmFzaWNUb0RpZ2l0KGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrKykpOwogICAgICAgICAgICAgIGlmIChkaWdpdCA+PSBiYXNlIHx8IGRpZ2l0ID4gZmxvb3IoKG1heEludCAtIGkpIC8gdykpIHsKICAgICAgICAgICAgICAgIGVycm9yKCJvdmVyZmxvdyIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpICs9IGRpZ2l0ICogdzsKICAgICAgICAgICAgICB0ID0gayA8PSBiaWFzID8gdE1pbiA6IGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXM7CiAgICAgICAgICAgICAgaWYgKGRpZ2l0IDwgdCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJhc2VNaW51c1QgPSBiYXNlIC0gdDsKICAgICAgICAgICAgICBpZiAodyA+IGZsb29yKG1heEludCAvIGJhc2VNaW51c1QpKSB7CiAgICAgICAgICAgICAgICBlcnJvcigib3ZlcmZsb3ciKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdyAqPSBiYXNlTWludXNUOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG91dCA9IG91dHB1dC5sZW5ndGggKyAxOwogICAgICAgICAgICBiaWFzID0gYWRhcHQoaSAtIG9sZGksIG91dCwgb2xkaSA9PSAwKTsKICAgICAgICAgICAgaWYgKGZsb29yKGkgLyBvdXQpID4gbWF4SW50IC0gbikgewogICAgICAgICAgICAgIGVycm9yKCJvdmVyZmxvdyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG4gKz0gZmxvb3IoaSAvIG91dCk7CiAgICAgICAgICAgIGkgJT0gb3V0OwogICAgICAgICAgICBvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdWNzMmVuY29kZShvdXRwdXQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBlbmNvZGUoaW5wdXQpIHsKICAgICAgICAgIHZhciBuLCBkZWx0YSwgaGFuZGxlZENQQ291bnQsIGJhc2ljTGVuZ3RoLCBiaWFzLCBqLCBtLCBxLCBrLCB0LCBjdXJyZW50VmFsdWUsIG91dHB1dCA9IFtdLCBpbnB1dExlbmd0aCwgaGFuZGxlZENQQ291bnRQbHVzT25lLCBiYXNlTWludXNULCBxTWludXNUOwogICAgICAgICAgaW5wdXQgPSB1Y3MyZGVjb2RlKGlucHV0KTsKICAgICAgICAgIGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoOwogICAgICAgICAgbiA9IGluaXRpYWxOOwogICAgICAgICAgZGVsdGEgPSAwOwogICAgICAgICAgYmlhcyA9IGluaXRpYWxCaWFzOwogICAgICAgICAgZm9yIChqID0gMDsgaiA8IGlucHV0TGVuZ3RoOyArK2opIHsKICAgICAgICAgICAgY3VycmVudFZhbHVlID0gaW5wdXRbal07CiAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPCAxMjgpIHsKICAgICAgICAgICAgICBvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGhhbmRsZWRDUENvdW50ID0gYmFzaWNMZW5ndGggPSBvdXRwdXQubGVuZ3RoOwogICAgICAgICAgaWYgKGJhc2ljTGVuZ3RoKSB7CiAgICAgICAgICAgIG91dHB1dC5wdXNoKGRlbGltaXRlcik7CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoaGFuZGxlZENQQ291bnQgPCBpbnB1dExlbmd0aCkgewogICAgICAgICAgICBmb3IgKG0gPSBtYXhJbnQsIGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikgewogICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGlucHV0W2pdOwogICAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPj0gbiAmJiBjdXJyZW50VmFsdWUgPCBtKSB7CiAgICAgICAgICAgICAgICBtID0gY3VycmVudFZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7CiAgICAgICAgICAgIGlmIChtIC0gbiA+IGZsb29yKChtYXhJbnQgLSBkZWx0YSkgLyBoYW5kbGVkQ1BDb3VudFBsdXNPbmUpKSB7CiAgICAgICAgICAgICAgZXJyb3IoIm92ZXJmbG93Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTsKICAgICAgICAgICAgbiA9IG07CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7CiAgICAgICAgICAgICAgY3VycmVudFZhbHVlID0gaW5wdXRbal07CiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA8IG4gJiYgKytkZWx0YSA+IG1heEludCkgewogICAgICAgICAgICAgICAgZXJyb3IoIm92ZXJmbG93Iik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT0gbikgewogICAgICAgICAgICAgICAgZm9yIChxID0gZGVsdGEsIGsgPSBiYXNlOyA7IGsgKz0gYmFzZSkgewogICAgICAgICAgICAgICAgICB0ID0gayA8PSBiaWFzID8gdE1pbiA6IGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXM7CiAgICAgICAgICAgICAgICAgIGlmIChxIDwgdCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHFNaW51c1QgPSBxIC0gdDsKICAgICAgICAgICAgICAgICAgYmFzZU1pbnVzVCA9IGJhc2UgLSB0OwogICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCgKICAgICAgICAgICAgICAgICAgICBzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHQgKyBxTWludXNUICUgYmFzZU1pbnVzVCwgMCkpCiAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgIHEgPSBmbG9vcihxTWludXNUIC8gYmFzZU1pbnVzVCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHEsIDApKSk7CiAgICAgICAgICAgICAgICBiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT0gYmFzaWNMZW5ndGgpOwogICAgICAgICAgICAgICAgZGVsdGEgPSAwOwogICAgICAgICAgICAgICAgKytoYW5kbGVkQ1BDb3VudDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKytkZWx0YTsKICAgICAgICAgICAgKytuOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG91dHB1dC5qb2luKCIiKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gdG9Vbmljb2RlKGlucHV0KSB7CiAgICAgICAgICByZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHsKICAgICAgICAgICAgcmV0dXJuIHJlZ2V4UHVueWNvZGUudGVzdChzdHJpbmcpID8gZGVjb2RlMyhzdHJpbmcuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSkgOiBzdHJpbmc7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gdG9BU0NJSShpbnB1dCkgewogICAgICAgICAgcmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24oc3RyaW5nKSB7CiAgICAgICAgICAgIHJldHVybiByZWdleE5vbkFTQ0lJLnRlc3Qoc3RyaW5nKSA/ICJ4bi0tIiArIGVuY29kZShzdHJpbmcpIDogc3RyaW5nOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHB1bnljb2RlID0gewogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgUHVueWNvZGUuanMgdmVyc2lvbiBudW1iZXIuCiAgICAgICAgICAgKiBAbWVtYmVyT2YgcHVueWNvZGUKICAgICAgICAgICAqIEB0eXBlIFN0cmluZwogICAgICAgICAgICovCiAgICAgICAgICAidmVyc2lvbiI6ICIxLjMuMiIsCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEFuIG9iamVjdCBvZiBtZXRob2RzIHRvIGNvbnZlcnQgZnJvbSBKYXZhU2NyaXB0J3MgaW50ZXJuYWwgY2hhcmFjdGVyCiAgICAgICAgICAgKiByZXByZXNlbnRhdGlvbiAoVUNTLTIpIHRvIFVuaWNvZGUgY29kZSBwb2ludHMsIGFuZCBiYWNrLgogICAgICAgICAgICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+CiAgICAgICAgICAgKiBAbWVtYmVyT2YgcHVueWNvZGUKICAgICAgICAgICAqIEB0eXBlIE9iamVjdAogICAgICAgICAgICovCiAgICAgICAgICAidWNzMiI6IHsKICAgICAgICAgICAgImRlY29kZSI6IHVjczJkZWNvZGUsCiAgICAgICAgICAgICJlbmNvZGUiOiB1Y3MyZW5jb2RlCiAgICAgICAgICB9LAogICAgICAgICAgImRlY29kZSI6IGRlY29kZTMsCiAgICAgICAgICAiZW5jb2RlIjogZW5jb2RlLAogICAgICAgICAgInRvQVNDSUkiOiB0b0FTQ0lJLAogICAgICAgICAgInRvVW5pY29kZSI6IHRvVW5pY29kZQogICAgICAgIH07CiAgICAgICAgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PSAib2JqZWN0IiAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgICBkZWZpbmUoInB1bnljb2RlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBwdW55Y29kZTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAoZnJlZUV4cG9ydHMgJiYgZnJlZU1vZHVsZSkgewogICAgICAgICAgaWYgKG1vZHVsZS5leHBvcnRzID09IGZyZWVFeHBvcnRzKSB7CiAgICAgICAgICAgIGZyZWVNb2R1bGUuZXhwb3J0cyA9IHB1bnljb2RlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChrZXkgaW4gcHVueWNvZGUpIHsKICAgICAgICAgICAgICBwdW55Y29kZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIChmcmVlRXhwb3J0c1trZXldID0gcHVueWNvZGVba2V5XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgcm9vdC5wdW55Y29kZSA9IHB1bnljb2RlOwogICAgICAgIH0KICAgICAgfSkoZXhwb3J0czIpOwogICAgfQogIH0pOwoKICAvLyBub2RlX21vZHVsZXMvdXJpanMvc3JjL0lQdjYuanMKICB2YXIgcmVxdWlyZV9JUHY2ID0gX19jb21tb25KUyh7CiAgICAibm9kZV9tb2R1bGVzL3VyaWpzL3NyYy9JUHY2LmpzIihleHBvcnRzMiwgbW9kdWxlKSB7CiAgICAgIC8qIQogICAgICAgKiBVUkkuanMgLSBNdXRhdGluZyBVUkxzCiAgICAgICAqIElQdjYgU3VwcG9ydAogICAgICAgKgogICAgICAgKiBWZXJzaW9uOiAxLjE5LjExCiAgICAgICAqCiAgICAgICAqIEF1dGhvcjogUm9kbmV5IFJlaG0KICAgICAgICogV2ViOiBodHRwOi8vbWVkaWFsaXplLmdpdGh1Yi5pby9VUkkuanMvCiAgICAgICAqCiAgICAgICAqIExpY2Vuc2VkIHVuZGVyCiAgICAgICAqICAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZQogICAgICAgKgogICAgICAgKi8KICAgICAgKGZ1bmN0aW9uKHJvb3QsIGZhY3RvcnkpIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICJvYmplY3QiICYmIG1vZHVsZS5leHBvcnRzKSB7CiAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgewogICAgICAgICAgZGVmaW5lKGZhY3RvcnkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByb290LklQdjYgPSBmYWN0b3J5KHJvb3QpOwogICAgICAgIH0KICAgICAgfSkoZXhwb3J0czIsIGZ1bmN0aW9uKHJvb3QpIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgdmFyIF9JUHY2ID0gcm9vdCAmJiByb290LklQdjY7CiAgICAgICAgZnVuY3Rpb24gYmVzdFByZXNlbnRhdGlvbihhZGRyZXNzKSB7CiAgICAgICAgICB2YXIgX2FkZHJlc3MgPSBhZGRyZXNzLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICB2YXIgc2VnbWVudHMgPSBfYWRkcmVzcy5zcGxpdCgiOiIpOwogICAgICAgICAgdmFyIGxlbmd0aCA9IHNlZ21lbnRzLmxlbmd0aDsKICAgICAgICAgIHZhciB0b3RhbCA9IDg7CiAgICAgICAgICBpZiAoc2VnbWVudHNbMF0gPT09ICIiICYmIHNlZ21lbnRzWzFdID09PSAiIiAmJiBzZWdtZW50c1syXSA9PT0gIiIpIHsKICAgICAgICAgICAgc2VnbWVudHMuc2hpZnQoKTsKICAgICAgICAgICAgc2VnbWVudHMuc2hpZnQoKTsKICAgICAgICAgIH0gZWxzZSBpZiAoc2VnbWVudHNbMF0gPT09ICIiICYmIHNlZ21lbnRzWzFdID09PSAiIikgewogICAgICAgICAgICBzZWdtZW50cy5zaGlmdCgpOwogICAgICAgICAgfSBlbHNlIGlmIChzZWdtZW50c1tsZW5ndGggLSAxXSA9PT0gIiIgJiYgc2VnbWVudHNbbGVuZ3RoIC0gMl0gPT09ICIiKSB7CiAgICAgICAgICAgIHNlZ21lbnRzLnBvcCgpOwogICAgICAgICAgfQogICAgICAgICAgbGVuZ3RoID0gc2VnbWVudHMubGVuZ3RoOwogICAgICAgICAgaWYgKHNlZ21lbnRzW2xlbmd0aCAtIDFdLmluZGV4T2YoIi4iKSAhPT0gLTEpIHsKICAgICAgICAgICAgdG90YWwgPSA3OwogICAgICAgICAgfQogICAgICAgICAgdmFyIHBvczsKICAgICAgICAgIGZvciAocG9zID0gMDsgcG9zIDwgbGVuZ3RoOyBwb3MrKykgewogICAgICAgICAgICBpZiAoc2VnbWVudHNbcG9zXSA9PT0gIiIpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHBvcyA8IHRvdGFsKSB7CiAgICAgICAgICAgIHNlZ21lbnRzLnNwbGljZShwb3MsIDEsICIwMDAwIik7CiAgICAgICAgICAgIHdoaWxlIChzZWdtZW50cy5sZW5ndGggPCB0b3RhbCkgewogICAgICAgICAgICAgIHNlZ21lbnRzLnNwbGljZShwb3MsIDAsICIwMDAwIik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHZhciBfc2VnbWVudHM7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvdGFsOyBpKyspIHsKICAgICAgICAgICAgX3NlZ21lbnRzID0gc2VnbWVudHNbaV0uc3BsaXQoIiIpOwogICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDM7IGorKykgewogICAgICAgICAgICAgIGlmIChfc2VnbWVudHNbMF0gPT09ICIwIiAmJiBfc2VnbWVudHMubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgX3NlZ21lbnRzLnNwbGljZSgwLCAxKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlZ21lbnRzW2ldID0gX3NlZ21lbnRzLmpvaW4oIiIpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGJlc3QgPSAtMTsKICAgICAgICAgIHZhciBfYmVzdCA9IDA7CiAgICAgICAgICB2YXIgX2N1cnJlbnQgPSAwOwogICAgICAgICAgdmFyIGN1cnJlbnQgPSAtMTsKICAgICAgICAgIHZhciBpbnplcm9lcyA9IGZhbHNlOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsOyBpKyspIHsKICAgICAgICAgICAgaWYgKGluemVyb2VzKSB7CiAgICAgICAgICAgICAgaWYgKHNlZ21lbnRzW2ldID09PSAiMCIpIHsKICAgICAgICAgICAgICAgIF9jdXJyZW50ICs9IDE7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGluemVyb2VzID0gZmFsc2U7CiAgICAgICAgICAgICAgICBpZiAoX2N1cnJlbnQgPiBfYmVzdCkgewogICAgICAgICAgICAgICAgICBiZXN0ID0gY3VycmVudDsKICAgICAgICAgICAgICAgICAgX2Jlc3QgPSBfY3VycmVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWYgKHNlZ21lbnRzW2ldID09PSAiMCIpIHsKICAgICAgICAgICAgICAgIGluemVyb2VzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBpOwogICAgICAgICAgICAgICAgX2N1cnJlbnQgPSAxOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKF9jdXJyZW50ID4gX2Jlc3QpIHsKICAgICAgICAgICAgYmVzdCA9IGN1cnJlbnQ7CiAgICAgICAgICAgIF9iZXN0ID0gX2N1cnJlbnQ7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoX2Jlc3QgPiAxKSB7CiAgICAgICAgICAgIHNlZ21lbnRzLnNwbGljZShiZXN0LCBfYmVzdCwgIiIpOwogICAgICAgICAgfQogICAgICAgICAgbGVuZ3RoID0gc2VnbWVudHMubGVuZ3RoOwogICAgICAgICAgdmFyIHJlc3VsdCA9ICIiOwogICAgICAgICAgaWYgKHNlZ21lbnRzWzBdID09PSAiIikgewogICAgICAgICAgICByZXN1bHQgPSAiOiI7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgcmVzdWx0ICs9IHNlZ21lbnRzW2ldOwogICAgICAgICAgICBpZiAoaSA9PT0gbGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlc3VsdCArPSAiOiI7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc2VnbWVudHNbbGVuZ3RoIC0gMV0gPT09ICIiKSB7CiAgICAgICAgICAgIHJlc3VsdCArPSAiOiI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBub0NvbmZsaWN0KCkgewogICAgICAgICAgaWYgKHJvb3QuSVB2NiA9PT0gdGhpcykgewogICAgICAgICAgICByb290LklQdjYgPSBfSVB2NjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgYmVzdDogYmVzdFByZXNlbnRhdGlvbiwKICAgICAgICAgIG5vQ29uZmxpY3QKICAgICAgICB9OwogICAgICB9KTsKICAgIH0KICB9KTsKCiAgLy8gbm9kZV9tb2R1bGVzL3VyaWpzL3NyYy9TZWNvbmRMZXZlbERvbWFpbnMuanMKICB2YXIgcmVxdWlyZV9TZWNvbmRMZXZlbERvbWFpbnMgPSBfX2NvbW1vbkpTKHsKICAgICJub2RlX21vZHVsZXMvdXJpanMvc3JjL1NlY29uZExldmVsRG9tYWlucy5qcyIoZXhwb3J0czIsIG1vZHVsZSkgewogICAgICAvKiEKICAgICAgICogVVJJLmpzIC0gTXV0YXRpbmcgVVJMcwogICAgICAgKiBTZWNvbmQgTGV2ZWwgRG9tYWluIChTTEQpIFN1cHBvcnQKICAgICAgICoKICAgICAgICogVmVyc2lvbjogMS4xOS4xMQogICAgICAgKgogICAgICAgKiBBdXRob3I6IFJvZG5leSBSZWhtCiAgICAgICAqIFdlYjogaHR0cDovL21lZGlhbGl6ZS5naXRodWIuaW8vVVJJLmpzLwogICAgICAgKgogICAgICAgKiBMaWNlbnNlZCB1bmRlcgogICAgICAgKiAgIE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UKICAgICAgICoKICAgICAgICovCiAgICAgIChmdW5jdGlvbihyb290LCBmYWN0b3J5KSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGlmICh0eXBlb2YgbW9kdWxlID09PSAib2JqZWN0IiAmJiBtb2R1bGUuZXhwb3J0cykgewogICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAgIGRlZmluZShmYWN0b3J5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcm9vdC5TZWNvbmRMZXZlbERvbWFpbnMgPSBmYWN0b3J5KHJvb3QpOwogICAgICAgIH0KICAgICAgfSkoZXhwb3J0czIsIGZ1bmN0aW9uKHJvb3QpIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgdmFyIF9TZWNvbmRMZXZlbERvbWFpbnMgPSByb290ICYmIHJvb3QuU2Vjb25kTGV2ZWxEb21haW5zOwogICAgICAgIHZhciBTTEQgPSB7CiAgICAgICAgICAvLyBsaXN0IG9mIGtub3duIFNlY29uZCBMZXZlbCBEb21haW5zCiAgICAgICAgICAvLyBjb252ZXJ0ZWQgbGlzdCBvZiBTTERzIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2dhdmluZ21pbGxlci9zZWNvbmQtbGV2ZWwtZG9tYWlucwogICAgICAgICAgLy8gLS0tLQogICAgICAgICAgLy8gcHVibGljc3VmZml4Lm9yZyBpcyBtb3JlIGN1cnJlbnQgYW5kIGFjdHVhbGx5IHVzZWQgYnkgYSBjb3VwbGUgb2YgYnJvd3NlcnMgaW50ZXJuYWxseS4KICAgICAgICAgIC8vIGRvd25zaWRlIGlzIGl0IGFsc28gY29udGFpbnMgZG9tYWlucyBsaWtlICJkeW5kbnMub3JnIiAtIHdoaWNoIGlzIGZpbmUgZm9yIHRoZSBzZWN1cml0eQogICAgICAgICAgLy8gaXNzdWVzIGJyb3dzZXIgaGF2ZSB0byBkZWFsIHdpdGggKFNPUCBmb3IgY29va2llcywgZXRjKSAtIGJ1dCBpcyB3YXkgb3ZlcmJvYXJkIGZvciBVUkkuanMKICAgICAgICAgIC8vIC0tLS0KICAgICAgICAgIGxpc3Q6IHsKICAgICAgICAgICAgImFjIjogIiBjb20gZ292IG1pbCBuZXQgb3JnICIsCiAgICAgICAgICAgICJhZSI6ICIgYWMgY28gZ292IG1pbCBuYW1lIG5ldCBvcmcgcHJvIHNjaCAiLAogICAgICAgICAgICAiYWYiOiAiIGNvbSBlZHUgZ292IG5ldCBvcmcgIiwKICAgICAgICAgICAgImFsIjogIiBjb20gZWR1IGdvdiBtaWwgbmV0IG9yZyAiLAogICAgICAgICAgICAiYW8iOiAiIGNvIGVkIGd2IGl0IG9nIHBiICIsCiAgICAgICAgICAgICJhciI6ICIgY29tIGVkdSBnb2IgZ292IGludCBtaWwgbmV0IG9yZyB0dXIgIiwKICAgICAgICAgICAgImF0IjogIiBhYyBjbyBndiBvciAiLAogICAgICAgICAgICAiYXUiOiAiIGFzbiBjb20gY3Npcm8gZWR1IGdvdiBpZCBuZXQgb3JnICIsCiAgICAgICAgICAgICJiYSI6ICIgY28gY29tIGVkdSBnb3YgbWlsIG5ldCBvcmcgcnMgdW5iaSB1bm1vIHVuc2EgdW50eiB1bnplICIsCiAgICAgICAgICAgICJiYiI6ICIgYml6IGNvIGNvbSBlZHUgZ292IGluZm8gbmV0IG9yZyBzdG9yZSB0diAiLAogICAgICAgICAgICAiYmgiOiAiIGJpeiBjYyBjb20gZWR1IGdvdiBpbmZvIG5ldCBvcmcgIiwKICAgICAgICAgICAgImJuIjogIiBjb20gZWR1IGdvdiBuZXQgb3JnICIsCiAgICAgICAgICAgICJibyI6ICIgY29tIGVkdSBnb2IgZ292IGludCBtaWwgbmV0IG9yZyB0diAiLAogICAgICAgICAgICAiYnIiOiAiIGFkbSBhZHYgYWdyIGFtIGFycSBhcnQgYXRvIGIgYmlvIGJsb2cgYm1kIGNpbSBjbmcgY250IGNvbSBjb29wIGVjbiBlZHUgZW5nIGVzcCBldGMgZXRpIGZhciBmbG9nIGZtIGZuZCBmb3QgZnN0IGcxMiBnZ2YgZ292IGltYiBpbmQgaW5mIGpvciBqdXMgbGVsIG1hdCBtZWQgbWlsIG11cyBuZXQgbm9tIG5vdCBudHIgb2RvIG9yZyBwcGcgcHJvIHBzYyBwc2kgcXNsIHJlYyBzbGcgc3J2IHRtcCB0cmQgdHVyIHR2IHZldCB2bG9nIHdpa2kgemxnICIsCiAgICAgICAgICAgICJicyI6ICIgY29tIGVkdSBnb3YgbmV0IG9yZyAiLAogICAgICAgICAgICAiYnoiOiAiIGR1IGV0IG9tIG92IHJnICIsCiAgICAgICAgICAgICJjYSI6ICIgYWIgYmMgbWIgbmIgbmYgbmwgbnMgbnQgbnUgb24gcGUgcWMgc2sgeWsgIiwKICAgICAgICAgICAgImNrIjogIiBiaXogY28gZWR1IGdlbiBnb3YgaW5mbyBuZXQgb3JnICIsCiAgICAgICAgICAgICJjbiI6ICIgYWMgYWggYmogY29tIGNxIGVkdSBmaiBnZCBnb3YgZ3MgZ3ggZ3ogaGEgaGIgaGUgaGkgaGwgaG4gamwganMganggbG4gbWlsIG5ldCBubSBueCBvcmcgcWggc2Mgc2Qgc2ggc24gc3ggdGogdHcgeGogeHogeW4gemogIiwKICAgICAgICAgICAgImNvIjogIiBjb20gZWR1IGdvdiBtaWwgbmV0IG5vbSBvcmcgIiwKICAgICAgICAgICAgImNyIjogIiBhYyBjIGNvIGVkIGZpIGdvIG9yIHNhICIsCiAgICAgICAgICAgICJjeSI6ICIgYWMgYml6IGNvbSBla2xvZ2VzIGdvdiBsdGQgbmFtZSBuZXQgb3JnIHBhcmxpYW1lbnQgcHJlc3MgcHJvIHRtICIsCiAgICAgICAgICAgICJkbyI6ICIgYXJ0IGNvbSBlZHUgZ29iIGdvdiBtaWwgbmV0IG9yZyBzbGQgd2ViICIsCiAgICAgICAgICAgICJkeiI6ICIgYXJ0IGFzc28gY29tIGVkdSBnb3YgbmV0IG9yZyBwb2wgIiwKICAgICAgICAgICAgImVjIjogIiBjb20gZWR1IGZpbiBnb3YgaW5mbyBtZWQgbWlsIG5ldCBvcmcgcHJvICIsCiAgICAgICAgICAgICJlZyI6ICIgY29tIGVkdSBldW4gZ292IG1pbCBuYW1lIG5ldCBvcmcgc2NpICIsCiAgICAgICAgICAgICJlciI6ICIgY29tIGVkdSBnb3YgaW5kIG1pbCBuZXQgb3JnIHJvY2hlc3QgdyAiLAogICAgICAgICAgICAiZXMiOiAiIGNvbSBlZHUgZ29iIG5vbSBvcmcgIiwKICAgICAgICAgICAgImV0IjogIiBiaXogY29tIGVkdSBnb3YgaW5mbyBuYW1lIG5ldCBvcmcgIiwKICAgICAgICAgICAgImZqIjogIiBhYyBiaXogY29tIGluZm8gbWlsIG5hbWUgbmV0IG9yZyBwcm8gIiwKICAgICAgICAgICAgImZrIjogIiBhYyBjbyBnb3YgbmV0IG5vbSBvcmcgIiwKICAgICAgICAgICAgImZyIjogIiBhc3NvIGNvbSBmIGdvdXYgbm9tIHByZCBwcmVzc2UgdG0gIiwKICAgICAgICAgICAgImdnIjogIiBjbyBuZXQgb3JnICIsCiAgICAgICAgICAgICJnaCI6ICIgY29tIGVkdSBnb3YgbWlsIG9yZyAiLAogICAgICAgICAgICAiZ24iOiAiIGFjIGNvbSBnb3YgbmV0IG9yZyAiLAogICAgICAgICAgICAiZ3IiOiAiIGNvbSBlZHUgZ292IG1pbCBuZXQgb3JnICIsCiAgICAgICAgICAgICJndCI6ICIgY29tIGVkdSBnb2IgaW5kIG1pbCBuZXQgb3JnICIsCiAgICAgICAgICAgICJndSI6ICIgY29tIGVkdSBnb3YgbmV0IG9yZyAiLAogICAgICAgICAgICAiaGsiOiAiIGNvbSBlZHUgZ292IGlkdiBuZXQgb3JnICIsCiAgICAgICAgICAgICJodSI6ICIgMjAwMCBhZ3JhciBib2x0IGNhc2lubyBjaXR5IGNvIGVyb3RpY2EgZXJvdGlrYSBmaWxtIGZvcnVtIGdhbWVzIGhvdGVsIGluZm8gaW5nYXRsYW4gam9nYXN6IGtvbnl2ZWxvIGxha2FzIG1lZGlhIG5ld3Mgb3JnIHByaXYgcmVrbGFtIHNleCBzaG9wIHNwb3J0IHN1bGkgc3pleCB0bSB0b3pzZGUgdXRhemFzIHZpZGVvICIsCiAgICAgICAgICAgICJpZCI6ICIgYWMgY28gZ28gbWlsIG5ldCBvciBzY2ggd2ViICIsCiAgICAgICAgICAgICJpbCI6ICIgYWMgY28gZ292IGlkZiBrMTIgbXVuaSBuZXQgb3JnICIsCiAgICAgICAgICAgICJpbiI6ICIgYWMgY28gZWR1IGVybmV0IGZpcm0gZ2VuIGdvdiBpIGluZCBtaWwgbmV0IG5pYyBvcmcgcmVzICIsCiAgICAgICAgICAgICJpcSI6ICIgY29tIGVkdSBnb3YgaSBtaWwgbmV0IG9yZyAiLAogICAgICAgICAgICAiaXIiOiAiIGFjIGNvIGRuc3NlYyBnb3YgaSBpZCBuZXQgb3JnIHNjaCAiLAogICAgICAgICAgICAiaXQiOiAiIGVkdSBnb3YgIiwKICAgICAgICAgICAgImplIjogIiBjbyBuZXQgb3JnICIsCiAgICAgICAgICAgICJqbyI6ICIgY29tIGVkdSBnb3YgbWlsIG5hbWUgbmV0IG9yZyBzY2ggIiwKICAgICAgICAgICAgImpwIjogIiBhYyBhZCBjbyBlZCBnbyBnciBsZyBuZSBvciAiLAogICAgICAgICAgICAia2UiOiAiIGFjIGNvIGdvIGluZm8gbWUgbW9iaSBuZSBvciBzYyAiLAogICAgICAgICAgICAia2giOiAiIGNvbSBlZHUgZ292IG1pbCBuZXQgb3JnIHBlciAiLAogICAgICAgICAgICAia2kiOiAiIGJpeiBjb20gZGUgZWR1IGdvdiBpbmZvIG1vYiBuZXQgb3JnIHRlbCAiLAogICAgICAgICAgICAia20iOiAiIGFzc28gY29tIGNvb3AgZWR1IGdvdXYgayBtZWRlY2luIG1pbCBub20gbm90YWlyZXMgcGhhcm1hY2llbnMgcHJlc3NlIHRtIHZldGVyaW5haXJlICIsCiAgICAgICAgICAgICJrbiI6ICIgZWR1IGdvdiBuZXQgb3JnICIsCiAgICAgICAgICAgICJrciI6ICIgYWMgYnVzYW4gY2h1bmdidWsgY2h1bmduYW0gY28gZGFlZ3UgZGFlamVvbiBlcyBnYW5nd29uIGdvIGd3YW5nanUgZ3llb25nYnVrIGd5ZW9uZ2dpIGd5ZW9uZ25hbSBocyBpbmNoZW9uIGplanUgamVvbmJ1ayBqZW9ubmFtIGsga2cgbWlsIG1zIG5lIG9yIHBlIHJlIHNjIHNlb3VsIHVsc2FuICIsCiAgICAgICAgICAgICJrdyI6ICIgY29tIGVkdSBnb3YgbmV0IG9yZyAiLAogICAgICAgICAgICAia3kiOiAiIGNvbSBlZHUgZ292IG5ldCBvcmcgIiwKICAgICAgICAgICAgImt6IjogIiBjb20gZWR1IGdvdiBtaWwgbmV0IG9yZyAiLAogICAgICAgICAgICAibGIiOiAiIGNvbSBlZHUgZ292IG5ldCBvcmcgIiwKICAgICAgICAgICAgImxrIjogIiBhc3NuIGNvbSBlZHUgZ292IGdycCBob3RlbCBpbnQgbHRkIG5ldCBuZ28gb3JnIHNjaCBzb2Mgd2ViICIsCiAgICAgICAgICAgICJsciI6ICIgY29tIGVkdSBnb3YgbmV0IG9yZyAiLAogICAgICAgICAgICAibHYiOiAiIGFzbiBjb20gY29uZiBlZHUgZ292IGlkIG1pbCBuZXQgb3JnICIsCiAgICAgICAgICAgICJseSI6ICIgY29tIGVkdSBnb3YgaWQgbWVkIG5ldCBvcmcgcGxjIHNjaCAiLAogICAgICAgICAgICAibWEiOiAiIGFjIGNvIGdvdiBtIG5ldCBvcmcgcHJlc3MgIiwKICAgICAgICAgICAgIm1jIjogIiBhc3NvIHRtICIsCiAgICAgICAgICAgICJtZSI6ICIgYWMgY28gZWR1IGdvdiBpdHMgbmV0IG9yZyBwcml2ICIsCiAgICAgICAgICAgICJtZyI6ICIgY29tIGVkdSBnb3YgbWlsIG5vbSBvcmcgcHJkIHRtICIsCiAgICAgICAgICAgICJtayI6ICIgY29tIGVkdSBnb3YgaW5mIG5hbWUgbmV0IG9yZyBwcm8gIiwKICAgICAgICAgICAgIm1sIjogIiBjb20gZWR1IGdvdiBuZXQgb3JnIHByZXNzZSAiLAogICAgICAgICAgICAibW4iOiAiIGVkdSBnb3Ygb3JnICIsCiAgICAgICAgICAgICJtbyI6ICIgY29tIGVkdSBnb3YgbmV0IG9yZyAiLAogICAgICAgICAgICAibXQiOiAiIGNvbSBlZHUgZ292IG5ldCBvcmcgIiwKICAgICAgICAgICAgIm12IjogIiBhZXJvIGJpeiBjb20gY29vcCBlZHUgZ292IGluZm8gaW50IG1pbCBtdXNldW0gbmFtZSBuZXQgb3JnIHBybyAiLAogICAgICAgICAgICAibXciOiAiIGFjIGNvIGNvbSBjb29wIGVkdSBnb3YgaW50IG11c2V1bSBuZXQgb3JnICIsCiAgICAgICAgICAgICJteCI6ICIgY29tIGVkdSBnb2IgbmV0IG9yZyAiLAogICAgICAgICAgICAibXkiOiAiIGNvbSBlZHUgZ292IG1pbCBuYW1lIG5ldCBvcmcgc2NoICIsCiAgICAgICAgICAgICJuZiI6ICIgYXJ0cyBjb20gZmlybSBpbmZvIG5ldCBvdGhlciBwZXIgcmVjIHN0b3JlIHdlYiAiLAogICAgICAgICAgICAibmciOiAiIGJpeiBjb20gZWR1IGdvdiBtaWwgbW9iaSBuYW1lIG5ldCBvcmcgc2NoICIsCiAgICAgICAgICAgICJuaSI6ICIgYWMgY28gY29tIGVkdSBnb2IgbWlsIG5ldCBub20gb3JnICIsCiAgICAgICAgICAgICJucCI6ICIgY29tIGVkdSBnb3YgbWlsIG5ldCBvcmcgIiwKICAgICAgICAgICAgIm5yIjogIiBiaXogY29tIGVkdSBnb3YgaW5mbyBuZXQgb3JnICIsCiAgICAgICAgICAgICJvbSI6ICIgYWMgYml6IGNvIGNvbSBlZHUgZ292IG1lZCBtaWwgbXVzZXVtIG5ldCBvcmcgcHJvIHNjaCAiLAogICAgICAgICAgICAicGUiOiAiIGNvbSBlZHUgZ29iIG1pbCBuZXQgbm9tIG9yZyBzbGQgIiwKICAgICAgICAgICAgInBoIjogIiBjb20gZWR1IGdvdiBpIG1pbCBuZXQgbmdvIG9yZyAiLAogICAgICAgICAgICAicGsiOiAiIGJpeiBjb20gZWR1IGZhbSBnb2IgZ29rIGdvbiBnb3AgZ29zIGdvdiBuZXQgb3JnIHdlYiAiLAogICAgICAgICAgICAicGwiOiAiIGFydCBiaWFseXN0b2sgYml6IGNvbSBlZHUgZ2RhIGdkYW5zayBnb3J6b3cgZ292IGluZm8ga2F0b3dpY2Uga3Jha293IGxvZHogbHVibGluIG1pbCBuZXQgbmdvIG9sc3p0eW4gb3JnIHBvem5hbiBwd3IgcmFkb20gc2x1cHNrIHN6Y3plY2luIHRvcnVuIHdhcnN6YXdhIHdhdyB3cm9jIHdyb2NsYXcgemdvcmEgIiwKICAgICAgICAgICAgInByIjogIiBhYyBiaXogY29tIGVkdSBlc3QgZ292IGluZm8gaXNsYSBuYW1lIG5ldCBvcmcgcHJvIHByb2YgIiwKICAgICAgICAgICAgInBzIjogIiBjb20gZWR1IGdvdiBuZXQgb3JnIHBsbyBzZWMgIiwKICAgICAgICAgICAgInB3IjogIiBiZWxhdSBjbyBlZCBnbyBuZSBvciAiLAogICAgICAgICAgICAicm8iOiAiIGFydHMgY29tIGZpcm0gaW5mbyBub20gbnQgb3JnIHJlYyBzdG9yZSB0bSB3d3cgIiwKICAgICAgICAgICAgInJzIjogIiBhYyBjbyBlZHUgZ292IGluIG9yZyAiLAogICAgICAgICAgICAic2IiOiAiIGNvbSBlZHUgZ292IG5ldCBvcmcgIiwKICAgICAgICAgICAgInNjIjogIiBjb20gZWR1IGdvdiBuZXQgb3JnICIsCiAgICAgICAgICAgICJzaCI6ICIgY28gY29tIGVkdSBnb3YgbmV0IG5vbSBvcmcgIiwKICAgICAgICAgICAgInNsIjogIiBjb20gZWR1IGdvdiBuZXQgb3JnICIsCiAgICAgICAgICAgICJzdCI6ICIgY28gY29tIGNvbnN1bGFkbyBlZHUgZW1iYWl4YWRhIGdvdiBtaWwgbmV0IG9yZyBwcmluY2lwZSBzYW90b21lIHN0b3JlICIsCiAgICAgICAgICAgICJzdiI6ICIgY29tIGVkdSBnb2Igb3JnIHJlZCAiLAogICAgICAgICAgICAic3oiOiAiIGFjIGNvIG9yZyAiLAogICAgICAgICAgICAidHIiOiAiIGF2IGJicyBiZWwgYml6IGNvbSBkciBlZHUgZ2VuIGdvdiBpbmZvIGsxMiBuYW1lIG5ldCBvcmcgcG9sIHRlbCB0c2sgdHYgd2ViICIsCiAgICAgICAgICAgICJ0dCI6ICIgYWVybyBiaXogY2F0IGNvIGNvbSBjb29wIGVkdSBnb3YgaW5mbyBpbnQgam9icyBtaWwgbW9iaSBtdXNldW0gbmFtZSBuZXQgb3JnIHBybyB0ZWwgdHJhdmVsICIsCiAgICAgICAgICAgICJ0dyI6ICIgY2x1YiBjb20gZWJpeiBlZHUgZ2FtZSBnb3YgaWR2IG1pbCBuZXQgb3JnICIsCiAgICAgICAgICAgICJtdSI6ICIgYWMgY28gY29tIGdvdiBuZXQgb3Igb3JnICIsCiAgICAgICAgICAgICJteiI6ICIgYWMgY28gZWR1IGdvdiBvcmcgIiwKICAgICAgICAgICAgIm5hIjogIiBjbyBjb20gIiwKICAgICAgICAgICAgIm56IjogIiBhYyBjbyBjcmkgZ2VlayBnZW4gZ292dCBoZWFsdGggaXdpIG1hb3JpIG1pbCBuZXQgb3JnIHBhcmxpYW1lbnQgc2Nob29sICIsCiAgICAgICAgICAgICJwYSI6ICIgYWJvIGFjIGNvbSBlZHUgZ29iIGluZyBtZWQgbmV0IG5vbSBvcmcgc2xkICIsCiAgICAgICAgICAgICJwdCI6ICIgY29tIGVkdSBnb3YgaW50IG5ldCBub21lIG9yZyBwdWJsICIsCiAgICAgICAgICAgICJweSI6ICIgY29tIGVkdSBnb3YgbWlsIG5ldCBvcmcgIiwKICAgICAgICAgICAgInFhIjogIiBjb20gZWR1IGdvdiBtaWwgbmV0IG9yZyAiLAogICAgICAgICAgICAicmUiOiAiIGFzc28gY29tIG5vbSAiLAogICAgICAgICAgICAicnUiOiAiIGFjIGFkeWdleWEgYWx0YWkgYW11ciBhcmtoYW5nZWxzayBhc3RyYWtoYW4gYmFzaGtpcmlhIGJlbGdvcm9kIGJpciBicnlhbnNrIGJ1cnlhdGlhIGNiZyBjaGVsIGNoZWx5YWJpbnNrIGNoaXRhIGNodWtvdGthIGNodXZhc2hpYSBjb20gZGFnZXN0YW4gZS1idXJnIGVkdSBnb3YgZ3Jvem55IGludCBpcmt1dHNrIGl2YW5vdm8gaXpoZXZzayBqYXIgam9zaGthci1vbGEga2FsbXlraWEga2FsdWdhIGthbWNoYXRrYSBrYXJlbGlhIGthemFuIGtjaHIga2VtZXJvdm8ga2hhYmFyb3ZzayBraGFrYXNzaWEga2h2IGtpcm92IGtvZW5pZyBrb21pIGtvc3Ryb21hIGtyYW5veWFyc2sga3ViYW4ga3VyZ2FuIGt1cnNrIGxpcGV0c2sgbWFnYWRhbiBtYXJpIG1hcmktZWwgbWFyaW5lIG1pbCBtb3Jkb3ZpYSBtb3NyZWcgbXNrIG11cm1hbnNrIG5hbGNoaWsgbmV0IG5ub3Ygbm92IG5vdm9zaWJpcnNrIG5zayBvbXNrIG9yZW5idXJnIG9yZyBvcnlvbCBwZW56YSBwZXJtIHBwIHBza292IHB0eiBybmQgcnlhemFuIHNha2hhbGluIHNhbWFyYSBzYXJhdG92IHNpbWJpcnNrIHNtb2xlbnNrIHNwYiBzdGF2cm9wb2wgc3R2IHN1cmd1dCB0YW1ib3YgdGF0YXJzdGFuIHRvbSB0b21zayB0c2FyaXRzeW4gdHNrIHR1bGEgdHV2YSB0dmVyIHR5dW1lbiB1ZG0gdWRtdXJ0aWEgdWxhbi11ZGUgdmxhZGlrYXZrYXogdmxhZGltaXIgdmxhZGl2b3N0b2sgdm9sZ29ncmFkIHZvbG9nZGEgdm9yb25lemggdnJuIHZ5YXRrYSB5YWt1dGlhIHlhbWFsIHlla2F0ZXJpbmJ1cmcgeXV6aG5vLXNha2hhbGluc2sgIiwKICAgICAgICAgICAgInJ3IjogIiBhYyBjbyBjb20gZWR1IGdvdXYgZ292IGludCBtaWwgbmV0ICIsCiAgICAgICAgICAgICJzYSI6ICIgY29tIGVkdSBnb3YgbWVkIG5ldCBvcmcgcHViIHNjaCAiLAogICAgICAgICAgICAic2QiOiAiIGNvbSBlZHUgZ292IGluZm8gbWVkIG5ldCBvcmcgdHYgIiwKICAgICAgICAgICAgInNlIjogIiBhIGFjIGIgYmQgYyBkIGUgZiBnIGggaSBrIGwgbSBuIG8gb3JnIHAgcGFydGkgcHAgcHJlc3MgciBzIHQgdG0gdSB3IHggeSB6ICIsCiAgICAgICAgICAgICJzZyI6ICIgY29tIGVkdSBnb3YgaWRuIG5ldCBvcmcgcGVyICIsCiAgICAgICAgICAgICJzbiI6ICIgYXJ0IGNvbSBlZHUgZ291diBvcmcgcGVyc28gdW5pdiAiLAogICAgICAgICAgICAic3kiOiAiIGNvbSBlZHUgZ292IG1pbCBuZXQgbmV3cyBvcmcgIiwKICAgICAgICAgICAgInRoIjogIiBhYyBjbyBnbyBpbiBtaSBuZXQgb3IgIiwKICAgICAgICAgICAgInRqIjogIiBhYyBiaXogY28gY29tIGVkdSBnbyBnb3YgaW5mbyBpbnQgbWlsIG5hbWUgbmV0IG5pYyBvcmcgdGVzdCB3ZWIgIiwKICAgICAgICAgICAgInRuIjogIiBhZ3JpbmV0IGNvbSBkZWZlbnNlIGVkdW5ldCBlbnMgZmluIGdvdiBpbmQgaW5mbyBpbnRsIG1pbmNvbSBuYXQgbmV0IG9yZyBwZXJzbyBybnJ0IHJucyBybnUgdG91cmlzbSAiLAogICAgICAgICAgICAidHoiOiAiIGFjIGNvIGdvIG5lIG9yICIsCiAgICAgICAgICAgICJ1YSI6ICIgYml6IGNoZXJrYXNzeSBjaGVybmlnb3YgY2hlcm5vdnRzeSBjayBjbiBjbyBjb20gY3JpbWVhIGN2IGRuIGRuZXByb3BldHJvdnNrIGRvbmV0c2sgZHAgZWR1IGdvdiBpZiBpbiBpdmFuby1mcmFua2l2c2sga2gga2hhcmtvdiBraGVyc29uIGtobWVsbml0c2tpeSBraWV2IGtpcm92b2dyYWQga20ga3Iga3Mga3YgbGcgbHVnYW5zayBsdXRzayBsdml2IG1lIG1rIG5ldCBuaWtvbGFldiBvZCBvZGVzc2Egb3JnIHBsIHBvbHRhdmEgcHAgcm92bm8gcnYgc2ViYXN0b3BvbCBzdW15IHRlIHRlcm5vcGlsIHV6aGdvcm9kIHZpbm5pY2Egdm4gemFwb3Jpemh6aGUgemhpdG9taXIgenAgenQgIiwKICAgICAgICAgICAgInVnIjogIiBhYyBjbyBnbyBuZSBvciBvcmcgc2MgIiwKICAgICAgICAgICAgInVrIjogIiBhYyBibCBicml0aXNoLWxpYnJhcnkgY28gY3ltIGdvdiBnb3Z0IGljbmV0IGpldCBsZWEgbHRkIG1lIG1pbCBtb2QgbmF0aW9uYWwtbGlicmFyeS1zY290bGFuZCBuZWwgbmV0IG5ocyBuaWMgbmxzIG9yZyBvcmduIHBhcmxpYW1lbnQgcGxjIHBvbGljZSBzY2ggc2NvdCBzb2MgIiwKICAgICAgICAgICAgInVzIjogIiBkbmkgZmVkIGlzYSBraWRzIG5zbiAiLAogICAgICAgICAgICAidXkiOiAiIGNvbSBlZHUgZ3ViIG1pbCBuZXQgb3JnICIsCiAgICAgICAgICAgICJ2ZSI6ICIgY28gY29tIGVkdSBnb2IgaW5mbyBtaWwgbmV0IG9yZyB3ZWIgIiwKICAgICAgICAgICAgInZpIjogIiBjbyBjb20gazEyIG5ldCBvcmcgIiwKICAgICAgICAgICAgInZuIjogIiBhYyBiaXogY29tIGVkdSBnb3YgaGVhbHRoIGluZm8gaW50IG5hbWUgbmV0IG9yZyBwcm8gIiwKICAgICAgICAgICAgInllIjogIiBjbyBjb20gZ292IGx0ZCBtZSBuZXQgb3JnIHBsYyAiLAogICAgICAgICAgICAieXUiOiAiIGFjIGNvIGVkdSBnb3Ygb3JnICIsCiAgICAgICAgICAgICJ6YSI6ICIgYWMgYWdyaWMgYWx0IGJvdXJzZSBjaXR5IGNvIGN5YmVybmV0IGRiIGVkdSBnb3YgZ3JvbmRhciBpYWNjZXNzIGltdCBpbmNhIGxhbmRlc2lnbiBsYXcgbWlsIG5ldCBuZ28gbmlzIG5vbSBvbGl2ZXR0aSBvcmcgcGl4IHNjaG9vbCB0bSB3ZWIgIiwKICAgICAgICAgICAgInptIjogIiBhYyBjbyBjb20gZWR1IGdvdiBuZXQgb3JnIHNjaCAiLAogICAgICAgICAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DZW50cmFsTmljI1NlY29uZC1sZXZlbF9kb21haW5zCiAgICAgICAgICAgICJjb20iOiAiYXIgYnIgY24gZGUgZXUgZ2IgZ3IgaHUganBuIGtyIG5vIHFjIHJ1IHNhIHNlIHVrIHVzIHV5IHphICIsCiAgICAgICAgICAgICJuZXQiOiAiZ2IganAgc2UgdWsgIiwKICAgICAgICAgICAgIm9yZyI6ICJhZSIsCiAgICAgICAgICAgICJkZSI6ICJjb20gIgogICAgICAgICAgfSwKICAgICAgICAgIC8vIGdvcmhpbGwgMjAxMy0xMC0yNTogVXNpbmcgaW5kZXhPZigpIGluc3RlYWQgUmVnZXhwKCkuIFNpZ25pZmljYW50IGJvb3N0CiAgICAgICAgICAvLyBpbiBib3RoIHBlcmZvcm1hbmNlIGFuZCBtZW1vcnkgZm9vdHByaW50LiBObyBpbml0aWFsaXphdGlvbiByZXF1aXJlZC4KICAgICAgICAgIC8vIGh0dHA6Ly9qc3BlcmYuY29tL3VyaS1qcy1zbGQtcmVnZXgtdnMtYmluYXJ5LXNlYXJjaC80CiAgICAgICAgICAvLyBGb2xsb3dpbmcgbWV0aG9kcyB1c2UgbGFzdEluZGV4T2YoKSByYXRoZXIgdGhhbiBhcnJheS5zcGxpdCgpIGluIG9yZGVyCiAgICAgICAgICAvLyB0byBhdm9pZCBhbnkgbWVtb3J5IGFsbG9jYXRpb25zLgogICAgICAgICAgaGFzOiBmdW5jdGlvbihkb21haW4pIHsKICAgICAgICAgICAgdmFyIHRsZE9mZnNldCA9IGRvbWFpbi5sYXN0SW5kZXhPZigiLiIpOwogICAgICAgICAgICBpZiAodGxkT2Zmc2V0IDw9IDAgfHwgdGxkT2Zmc2V0ID49IGRvbWFpbi5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzbGRPZmZzZXQgPSBkb21haW4ubGFzdEluZGV4T2YoIi4iLCB0bGRPZmZzZXQgLSAxKTsKICAgICAgICAgICAgaWYgKHNsZE9mZnNldCA8PSAwIHx8IHNsZE9mZnNldCA+PSB0bGRPZmZzZXQgLSAxKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzbGRMaXN0ID0gU0xELmxpc3RbZG9tYWluLnNsaWNlKHRsZE9mZnNldCArIDEpXTsKICAgICAgICAgICAgaWYgKCFzbGRMaXN0KSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzbGRMaXN0LmluZGV4T2YoIiAiICsgZG9tYWluLnNsaWNlKHNsZE9mZnNldCArIDEsIHRsZE9mZnNldCkgKyAiICIpID49IDA7CiAgICAgICAgICB9LAogICAgICAgICAgaXM6IGZ1bmN0aW9uKGRvbWFpbikgewogICAgICAgICAgICB2YXIgdGxkT2Zmc2V0ID0gZG9tYWluLmxhc3RJbmRleE9mKCIuIik7CiAgICAgICAgICAgIGlmICh0bGRPZmZzZXQgPD0gMCB8fCB0bGRPZmZzZXQgPj0gZG9tYWluLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHNsZE9mZnNldCA9IGRvbWFpbi5sYXN0SW5kZXhPZigiLiIsIHRsZE9mZnNldCAtIDEpOwogICAgICAgICAgICBpZiAoc2xkT2Zmc2V0ID49IDApIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHNsZExpc3QgPSBTTEQubGlzdFtkb21haW4uc2xpY2UodGxkT2Zmc2V0ICsgMSldOwogICAgICAgICAgICBpZiAoIXNsZExpc3QpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNsZExpc3QuaW5kZXhPZigiICIgKyBkb21haW4uc2xpY2UoMCwgdGxkT2Zmc2V0KSArICIgIikgPj0gMDsKICAgICAgICAgIH0sCiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKGRvbWFpbikgewogICAgICAgICAgICB2YXIgdGxkT2Zmc2V0ID0gZG9tYWluLmxhc3RJbmRleE9mKCIuIik7CiAgICAgICAgICAgIGlmICh0bGRPZmZzZXQgPD0gMCB8fCB0bGRPZmZzZXQgPj0gZG9tYWluLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2xkT2Zmc2V0ID0gZG9tYWluLmxhc3RJbmRleE9mKCIuIiwgdGxkT2Zmc2V0IC0gMSk7CiAgICAgICAgICAgIGlmIChzbGRPZmZzZXQgPD0gMCB8fCBzbGRPZmZzZXQgPj0gdGxkT2Zmc2V0IC0gMSkgewogICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzbGRMaXN0ID0gU0xELmxpc3RbZG9tYWluLnNsaWNlKHRsZE9mZnNldCArIDEpXTsKICAgICAgICAgICAgaWYgKCFzbGRMaXN0KSB7CiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNsZExpc3QuaW5kZXhPZigiICIgKyBkb21haW4uc2xpY2Uoc2xkT2Zmc2V0ICsgMSwgdGxkT2Zmc2V0KSArICIgIikgPCAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGRvbWFpbi5zbGljZShzbGRPZmZzZXQgKyAxKTsKICAgICAgICAgIH0sCiAgICAgICAgICBub0NvbmZsaWN0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKHJvb3QuU2Vjb25kTGV2ZWxEb21haW5zID09PSB0aGlzKSB7CiAgICAgICAgICAgICAgcm9vdC5TZWNvbmRMZXZlbERvbWFpbnMgPSBfU2Vjb25kTGV2ZWxEb21haW5zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIFNMRDsKICAgICAgfSk7CiAgICB9CiAgfSk7CgogIC8vIG5vZGVfbW9kdWxlcy91cmlqcy9zcmMvVVJJLmpzCiAgdmFyIHJlcXVpcmVfVVJJID0gX19jb21tb25KUyh7CiAgICAibm9kZV9tb2R1bGVzL3VyaWpzL3NyYy9VUkkuanMiKGV4cG9ydHMyLCBtb2R1bGUpIHsKICAgICAgLyohCiAgICAgICAqIFVSSS5qcyAtIE11dGF0aW5nIFVSTHMKICAgICAgICoKICAgICAgICogVmVyc2lvbjogMS4xOS4xMQogICAgICAgKgogICAgICAgKiBBdXRob3I6IFJvZG5leSBSZWhtCiAgICAgICAqIFdlYjogaHR0cDovL21lZGlhbGl6ZS5naXRodWIuaW8vVVJJLmpzLwogICAgICAgKgogICAgICAgKiBMaWNlbnNlZCB1bmRlcgogICAgICAgKiAgIE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UKICAgICAgICoKICAgICAgICovCiAgICAgIChmdW5jdGlvbihyb290LCBmYWN0b3J5KSB7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIGlmICh0eXBlb2YgbW9kdWxlID09PSAib2JqZWN0IiAmJiBtb2R1bGUuZXhwb3J0cykgewogICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmVfcHVueWNvZGUoKSwgcmVxdWlyZV9JUHY2KCksIHJlcXVpcmVfU2Vjb25kTGV2ZWxEb21haW5zKCkpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgICBkZWZpbmUoWyIuL3B1bnljb2RlIiwgIi4vSVB2NiIsICIuL1NlY29uZExldmVsRG9tYWlucyJdLCBmYWN0b3J5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcm9vdC5VUkkgPSBmYWN0b3J5KHJvb3QucHVueWNvZGUsIHJvb3QuSVB2Niwgcm9vdC5TZWNvbmRMZXZlbERvbWFpbnMsIHJvb3QpOwogICAgICAgIH0KICAgICAgfSkoZXhwb3J0czIsIGZ1bmN0aW9uKHB1bnljb2RlLCBJUHY2LCBTTEQsIHJvb3QpIHsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgdmFyIF9VUkkgPSByb290ICYmIHJvb3QuVVJJOwogICAgICAgIGZ1bmN0aW9uIFVSSSh1cmwsIGJhc2UpIHsKICAgICAgICAgIHZhciBfdXJsU3VwcGxpZWQgPSBhcmd1bWVudHMubGVuZ3RoID49IDE7CiAgICAgICAgICB2YXIgX2Jhc2VTdXBwbGllZCA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMjsKICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBVUkkpKSB7CiAgICAgICAgICAgIGlmIChfdXJsU3VwcGxpZWQpIHsKICAgICAgICAgICAgICBpZiAoX2Jhc2VTdXBwbGllZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkodXJsLCBiYXNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkodXJsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFVSSSgpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHVybCA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGlmIChfdXJsU3VwcGxpZWQpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmRlZmluZWQgaXMgbm90IGEgdmFsaWQgYXJndW1lbnQgZm9yIFVSSSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgdXJsID0gbG9jYXRpb24uaHJlZiArICIiOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHVybCA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodXJsID09PSBudWxsKSB7CiAgICAgICAgICAgIGlmIChfdXJsU3VwcGxpZWQpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJudWxsIGlzIG5vdCBhIHZhbGlkIGFyZ3VtZW50IGZvciBVUkkiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdGhpcy5ocmVmKHVybCk7CiAgICAgICAgICBpZiAoYmFzZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmFic29sdXRlVG8oYmFzZSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gL15bMC05XSskLy50ZXN0KHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgVVJJLnZlcnNpb24gPSAiMS4xOS4xMSI7CiAgICAgICAgdmFyIHAgPSBVUkkucHJvdG90eXBlOwogICAgICAgIHZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5OwogICAgICAgIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4KHN0cmluZykgewogICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8W1xdXC9cXF0pL2csICJcXCQxIik7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGdldFR5cGUodmFsdWUpIHsKICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIHJldHVybiAiVW5kZWZpbmVkIjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBTdHJpbmcoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSkuc2xpY2UoOCwgLTEpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBpc0FycmF5KG9iaikgewogICAgICAgICAgcmV0dXJuIGdldFR5cGUob2JqKSA9PT0gIkFycmF5IjsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZmlsdGVyQXJyYXlWYWx1ZXMoZGF0YSwgdmFsdWUpIHsKICAgICAgICAgIHZhciBsb29rdXAgPSB7fTsKICAgICAgICAgIHZhciBpLCBsZW5ndGg7CiAgICAgICAgICBpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICJSZWdFeHAiKSB7CiAgICAgICAgICAgIGxvb2t1cCA9IG51bGw7CiAgICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbG9va3VwW3ZhbHVlW2ldXSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxvb2t1cFt2YWx1ZV0gPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChpID0gMCwgbGVuZ3RoID0gZGF0YS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgX21hdGNoID0gbG9va3VwICYmIGxvb2t1cFtkYXRhW2ldXSAhPT0gdm9pZCAwIHx8ICFsb29rdXAgJiYgdmFsdWUudGVzdChkYXRhW2ldKTsKICAgICAgICAgICAgaWYgKF9tYXRjaCkgewogICAgICAgICAgICAgIGRhdGEuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgIGxlbmd0aC0tOwogICAgICAgICAgICAgIGktLTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGFycmF5Q29udGFpbnMobGlzdCwgdmFsdWUpIHsKICAgICAgICAgIHZhciBpLCBsZW5ndGg7CiAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuZ3RoID0gdmFsdWUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBpZiAoIWFycmF5Q29udGFpbnMobGlzdCwgdmFsdWVbaV0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgdmFyIF90eXBlID0gZ2V0VHlwZSh2YWx1ZSk7CiAgICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBsaXN0Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChfdHlwZSA9PT0gIlJlZ0V4cCIpIHsKICAgICAgICAgICAgICBpZiAodHlwZW9mIGxpc3RbaV0gPT09ICJzdHJpbmciICYmIGxpc3RbaV0ubWF0Y2godmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGlzdFtpXSA9PT0gdmFsdWUpIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBhcnJheXNFcXVhbChvbmUsIHR3bykgewogICAgICAgICAgaWYgKCFpc0FycmF5KG9uZSkgfHwgIWlzQXJyYXkodHdvKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAob25lLmxlbmd0aCAhPT0gdHdvLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBvbmUuc29ydCgpOwogICAgICAgICAgdHdvLnNvcnQoKTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gb25lLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICBpZiAob25lW2ldICE9PSB0d29baV0pIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiB0cmltU2xhc2hlcyh0ZXh0KSB7CiAgICAgICAgICB2YXIgdHJpbV9leHByZXNzaW9uID0gL15cLyt8XC8rJC9nOwogICAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSh0cmltX2V4cHJlc3Npb24sICIiKTsKICAgICAgICB9CiAgICAgICAgVVJJLl9wYXJ0cyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvdG9jb2w6IG51bGwsCiAgICAgICAgICAgIHVzZXJuYW1lOiBudWxsLAogICAgICAgICAgICBwYXNzd29yZDogbnVsbCwKICAgICAgICAgICAgaG9zdG5hbWU6IG51bGwsCiAgICAgICAgICAgIHVybjogbnVsbCwKICAgICAgICAgICAgcG9ydDogbnVsbCwKICAgICAgICAgICAgcGF0aDogbnVsbCwKICAgICAgICAgICAgcXVlcnk6IG51bGwsCiAgICAgICAgICAgIGZyYWdtZW50OiBudWxsLAogICAgICAgICAgICAvLyBzdGF0ZQogICAgICAgICAgICBwcmV2ZW50SW52YWxpZEhvc3RuYW1lOiBVUkkucHJldmVudEludmFsaWRIb3N0bmFtZSwKICAgICAgICAgICAgZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzOiBVUkkuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLAogICAgICAgICAgICBlc2NhcGVRdWVyeVNwYWNlOiBVUkkuZXNjYXBlUXVlcnlTcGFjZQogICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIFVSSS5wcmV2ZW50SW52YWxpZEhvc3RuYW1lID0gZmFsc2U7CiAgICAgICAgVVJJLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyA9IGZhbHNlOwogICAgICAgIFVSSS5lc2NhcGVRdWVyeVNwYWNlID0gdHJ1ZTsKICAgICAgICBVUkkucHJvdG9jb2xfZXhwcmVzc2lvbiA9IC9eW2Etel1bYS16MC05ListXSokL2k7CiAgICAgICAgVVJJLmlkbl9leHByZXNzaW9uID0gL1teYS16MC05XC5fLV0vaTsKICAgICAgICBVUkkucHVueWNvZGVfZXhwcmVzc2lvbiA9IC8oeG4tLSkvaTsKICAgICAgICBVUkkuaXA0X2V4cHJlc3Npb24gPSAvXlxkezEsM31cLlxkezEsM31cLlxkezEsM31cLlxkezEsM30kLzsKICAgICAgICBVUkkuaXA2X2V4cHJlc3Npb24gPSAvXlxzKigoKFswLTlBLUZhLWZdezEsNH06KXs3fShbMC05QS1GYS1mXXsxLDR9fDopKXwoKFswLTlBLUZhLWZdezEsNH06KXs2fSg6WzAtOUEtRmEtZl17MSw0fXwoKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKFwuKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKXszfSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezV9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsMn0pfDooKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKFwuKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKXszfSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezR9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsM30pfCgoOlswLTlBLUZhLWZdezEsNH0pPzooKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKFwuKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKXszfSkpfDopKXwoKFswLTlBLUZhLWZdezEsNH06KXszfSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDR9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDJ9OigoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezJ9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsNX0pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsM306KCgyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKShcLigyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKSl7M30pKXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7MX0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSw2fSl8KCg6WzAtOUEtRmEtZl17MSw0fSl7MCw0fTooKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKFwuKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKXszfSkpfDopKXwoOigoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDd9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDV9OigoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KSl8OikpKSglLispP1xzKiQvOwogICAgICAgIFVSSS5maW5kX3VyaV9leHByZXNzaW9uID0gL1xiKCg/OlthLXpdW1x3LV0rOig/OlwvezEsM318W2EtejAtOSVdKXx3d3dcZHswLDN9Wy5dfFthLXowLTkuXC1dK1suXVthLXpdezIsNH1cLykoPzpbXlxzKCk8Pl0rfFwoKFteXHMoKTw+XSt8KFwoW15ccygpPD5dK1wpKSkqXCkpKyg/OlwoKFteXHMoKTw+XSt8KFwoW15ccygpPD5dK1wpKSkqXCl8W15cc2AhKClcW1xde307OiciLiw8Pj/Cq8K74oCc4oCd4oCY4oCZXSkpL2lnOwogICAgICAgIFVSSS5maW5kVXJpID0gewogICAgICAgICAgLy8gdmFsaWQgInNjaGVtZTovLyIgb3IgInd3dy4iCiAgICAgICAgICBzdGFydDogL1xiKD86KFthLXpdW2EtejAtOS4rLV0qOlwvXC8pfHd3d1wuKS9naSwKICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIG5leHQgd2hpdGVzcGFjZQogICAgICAgICAgZW5kOiAvW1xzXHJcbl18JC8sCiAgICAgICAgICAvLyB0cmltIHRyYWlsaW5nIHB1bmN0dWF0aW9uIGNhcHR1cmVkIGJ5IGVuZCBSZWdFeHAKICAgICAgICAgIHRyaW06IC9bYCEoKVxbXF17fTs6JyIuLDw+P8KrwrvigJzigJ3igJ7igJjigJldKyQvLAogICAgICAgICAgLy8gYmFsYW5jZWQgcGFyZW5zIGluY2x1c2lvbiAoKSwgW10sIHt9LCA8PgogICAgICAgICAgcGFyZW5zOiAvKFwoW15cKV0qXCl8XFtbXlxdXSpcXXxce1tefV0qXH18PFtePl0qPikvZwogICAgICAgIH07CiAgICAgICAgVVJJLmxlYWRpbmdfd2hpdGVzcGFjZV9leHByZXNzaW9uID0gL15bXHgwMC1ceDIwXHUwMGEwXHUxNjgwXHUyMDAwLVx1MjAwYVx1MjAyOFx1MjAyOVx1MjAyZlx1MjA1Zlx1MzAwMFx1ZmVmZl0rLzsKICAgICAgICBVUkkuYXNjaWlfdGFiX3doaXRlc3BhY2UgPSAvW1x1MDAwOVx1MDAwQVx1MDAwRF0rL2c7CiAgICAgICAgVVJJLmRlZmF1bHRQb3J0cyA9IHsKICAgICAgICAgIGh0dHA6ICI4MCIsCiAgICAgICAgICBodHRwczogIjQ0MyIsCiAgICAgICAgICBmdHA6ICIyMSIsCiAgICAgICAgICBnb3BoZXI6ICI3MCIsCiAgICAgICAgICB3czogIjgwIiwKICAgICAgICAgIHdzczogIjQ0MyIKICAgICAgICB9OwogICAgICAgIFVSSS5ob3N0UHJvdG9jb2xzID0gWwogICAgICAgICAgImh0dHAiLAogICAgICAgICAgImh0dHBzIgogICAgICAgIF07CiAgICAgICAgVVJJLmludmFsaWRfaG9zdG5hbWVfY2hhcmFjdGVycyA9IC9bXmEtekEtWjAtOVwuXC06X10vOwogICAgICAgIFVSSS5kb21BdHRyaWJ1dGVzID0gewogICAgICAgICAgImEiOiAiaHJlZiIsCiAgICAgICAgICAiYmxvY2txdW90ZSI6ICJjaXRlIiwKICAgICAgICAgICJsaW5rIjogImhyZWYiLAogICAgICAgICAgImJhc2UiOiAiaHJlZiIsCiAgICAgICAgICAic2NyaXB0IjogInNyYyIsCiAgICAgICAgICAiZm9ybSI6ICJhY3Rpb24iLAogICAgICAgICAgImltZyI6ICJzcmMiLAogICAgICAgICAgImFyZWEiOiAiaHJlZiIsCiAgICAgICAgICAiaWZyYW1lIjogInNyYyIsCiAgICAgICAgICAiZW1iZWQiOiAic3JjIiwKICAgICAgICAgICJzb3VyY2UiOiAic3JjIiwKICAgICAgICAgICJ0cmFjayI6ICJzcmMiLAogICAgICAgICAgImlucHV0IjogInNyYyIsCiAgICAgICAgICAvLyBidXQgb25seSBpZiB0eXBlPSJpbWFnZSIKICAgICAgICAgICJhdWRpbyI6ICJzcmMiLAogICAgICAgICAgInZpZGVvIjogInNyYyIKICAgICAgICB9OwogICAgICAgIFVSSS5nZXREb21BdHRyaWJ1dGUgPSBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUgfHwgIW5vZGUubm9kZU5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gImlucHV0IiAmJiBub2RlLnR5cGUgIT09ICJpbWFnZSIpIHsKICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBVUkkuZG9tQXR0cmlidXRlc1tub2RlTmFtZV07CiAgICAgICAgfTsKICAgICAgICBmdW5jdGlvbiBlc2NhcGVGb3JEdW1iRmlyZWZveDM2KHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gZXNjYXBlKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gc3RyaWN0RW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZykgewogICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmcpLnJlcGxhY2UoL1shJygpKl0vZywgZXNjYXBlRm9yRHVtYkZpcmVmb3gzNikucmVwbGFjZSgvXCovZywgIiUyQSIpOwogICAgICAgIH0KICAgICAgICBVUkkuZW5jb2RlID0gc3RyaWN0RW5jb2RlVVJJQ29tcG9uZW50OwogICAgICAgIFVSSS5kZWNvZGUgPSBkZWNvZGVVUklDb21wb25lbnQ7CiAgICAgICAgVVJJLmlzbzg4NTkgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIFVSSS5lbmNvZGUgPSBlc2NhcGU7CiAgICAgICAgICBVUkkuZGVjb2RlID0gdW5lc2NhcGU7CiAgICAgICAgfTsKICAgICAgICBVUkkudW5pY29kZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgVVJJLmVuY29kZSA9IHN0cmljdEVuY29kZVVSSUNvbXBvbmVudDsKICAgICAgICAgIFVSSS5kZWNvZGUgPSBkZWNvZGVVUklDb21wb25lbnQ7CiAgICAgICAgfTsKICAgICAgICBVUkkuY2hhcmFjdGVycyA9IHsKICAgICAgICAgIHBhdGhuYW1lOiB7CiAgICAgICAgICAgIGVuY29kZTogewogICAgICAgICAgICAgIC8vIFJGQzM5ODYgMi4xOiBGb3IgY29uc2lzdGVuY3ksIFVSSSBwcm9kdWNlcnMgYW5kIG5vcm1hbGl6ZXJzIHNob3VsZAogICAgICAgICAgICAgIC8vIHVzZSB1cHBlcmNhc2UgaGV4YWRlY2ltYWwgZGlnaXRzIGZvciBhbGwgcGVyY2VudC1lbmNvZGluZ3MuCiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogLyUoMjR8MjZ8MkJ8MkN8M0J8M0R8M0F8NDApL2lnLAogICAgICAgICAgICAgIG1hcDogewogICAgICAgICAgICAgICAgLy8gLS5ffiEnKCkqCiAgICAgICAgICAgICAgICAiJTI0IjogIiQiLAogICAgICAgICAgICAgICAgIiUyNiI6ICImIiwKICAgICAgICAgICAgICAgICIlMkIiOiAiKyIsCiAgICAgICAgICAgICAgICAiJTJDIjogIiwiLAogICAgICAgICAgICAgICAgIiUzQiI6ICI7IiwKICAgICAgICAgICAgICAgICIlM0QiOiAiPSIsCiAgICAgICAgICAgICAgICAiJTNBIjogIjoiLAogICAgICAgICAgICAgICAgIiU0MCI6ICJAIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGVjb2RlOiB7CiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogL1tcL1w/I10vZywKICAgICAgICAgICAgICBtYXA6IHsKICAgICAgICAgICAgICAgICIvIjogIiUyRiIsCiAgICAgICAgICAgICAgICAiPyI6ICIlM0YiLAogICAgICAgICAgICAgICAgIiMiOiAiJTIzIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIHJlc2VydmVkOiB7CiAgICAgICAgICAgIGVuY29kZTogewogICAgICAgICAgICAgIC8vIFJGQzM5ODYgMi4xOiBGb3IgY29uc2lzdGVuY3ksIFVSSSBwcm9kdWNlcnMgYW5kIG5vcm1hbGl6ZXJzIHNob3VsZAogICAgICAgICAgICAgIC8vIHVzZSB1cHBlcmNhc2UgaGV4YWRlY2ltYWwgZGlnaXRzIGZvciBhbGwgcGVyY2VudC1lbmNvZGluZ3MuCiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogLyUoMjF8MjN8MjR8MjZ8Mjd8Mjh8Mjl8MkF8MkJ8MkN8MkZ8M0F8M0J8M0R8M0Z8NDB8NUJ8NUQpL2lnLAogICAgICAgICAgICAgIG1hcDogewogICAgICAgICAgICAgICAgLy8gZ2VuLWRlbGltcwogICAgICAgICAgICAgICAgIiUzQSI6ICI6IiwKICAgICAgICAgICAgICAgICIlMkYiOiAiLyIsCiAgICAgICAgICAgICAgICAiJTNGIjogIj8iLAogICAgICAgICAgICAgICAgIiUyMyI6ICIjIiwKICAgICAgICAgICAgICAgICIlNUIiOiAiWyIsCiAgICAgICAgICAgICAgICAiJTVEIjogIl0iLAogICAgICAgICAgICAgICAgIiU0MCI6ICJAIiwKICAgICAgICAgICAgICAgIC8vIHN1Yi1kZWxpbXMKICAgICAgICAgICAgICAgICIlMjEiOiAiISIsCiAgICAgICAgICAgICAgICAiJTI0IjogIiQiLAogICAgICAgICAgICAgICAgIiUyNiI6ICImIiwKICAgICAgICAgICAgICAgICIlMjciOiAiJyIsCiAgICAgICAgICAgICAgICAiJTI4IjogIigiLAogICAgICAgICAgICAgICAgIiUyOSI6ICIpIiwKICAgICAgICAgICAgICAgICIlMkEiOiAiKiIsCiAgICAgICAgICAgICAgICAiJTJCIjogIisiLAogICAgICAgICAgICAgICAgIiUyQyI6ICIsIiwKICAgICAgICAgICAgICAgICIlM0IiOiAiOyIsCiAgICAgICAgICAgICAgICAiJTNEIjogIj0iCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgdXJucGF0aDogewogICAgICAgICAgICAvLyBUaGUgY2hhcmFjdGVycyB1bmRlciBgZW5jb2RlYCBhcmUgdGhlIGNoYXJhY3RlcnMgY2FsbGVkIG91dCBieSBSRkMgMjE0MSBhcyBiZWluZyBhY2NlcHRhYmxlCiAgICAgICAgICAgIC8vIGZvciB1c2FnZSBpbiBhIFVSTi4gUkZDMjE0MSBhbHNvIGNhbGxzIG91dCAiLSIsICIuIiwgYW5kICJfIiBhcyBhY2NlcHRhYmxlIGNoYXJhY3RlcnMsIGJ1dAogICAgICAgICAgICAvLyB0aGVzZSBhcmVuJ3QgZW5jb2RlZCBieSBlbmNvZGVVUklDb21wb25lbnQsIHNvIHdlIGRvbid0IGhhdmUgdG8gY2FsbCB0aGVtIG91dCBoZXJlLiBBbHNvCiAgICAgICAgICAgIC8vIG5vdGUgdGhhdCB0aGUgY29sb24gY2hhcmFjdGVyIGlzIG5vdCBmZWF0dXJlZCBpbiB0aGUgZW5jb2RpbmcgbWFwOyB0aGlzIGlzIGJlY2F1c2UgVVJJLmpzCiAgICAgICAgICAgIC8vIGdpdmVzIHRoZSBjb2xvbnMgaW4gVVJOcyBzZW1hbnRpYyBtZWFuaW5nIGFzIHRoZSBkZWxpbWl0ZXJzIG9mIHBhdGggc2VnZW1lbnRzLCBhbmQgc28gaXQKICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBhcHBlYXIgdW5lbmNvZGVkIGluIGEgc2VnbWVudCBpdHNlbGYuCiAgICAgICAgICAgIC8vIFNlZSBhbHNvIHRoZSBub3RlIGFib3ZlIGFib3V0IFJGQzM5ODYgYW5kIGNhcGl0YWxhbGl6ZWQgaGV4IGRpZ2l0cy4KICAgICAgICAgICAgZW5jb2RlOiB7CiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogLyUoMjF8MjR8Mjd8Mjh8Mjl8MkF8MkJ8MkN8M0J8M0R8NDApL2lnLAogICAgICAgICAgICAgIG1hcDogewogICAgICAgICAgICAgICAgIiUyMSI6ICIhIiwKICAgICAgICAgICAgICAgICIlMjQiOiAiJCIsCiAgICAgICAgICAgICAgICAiJTI3IjogIiciLAogICAgICAgICAgICAgICAgIiUyOCI6ICIoIiwKICAgICAgICAgICAgICAgICIlMjkiOiAiKSIsCiAgICAgICAgICAgICAgICAiJTJBIjogIioiLAogICAgICAgICAgICAgICAgIiUyQiI6ICIrIiwKICAgICAgICAgICAgICAgICIlMkMiOiAiLCIsCiAgICAgICAgICAgICAgICAiJTNCIjogIjsiLAogICAgICAgICAgICAgICAgIiUzRCI6ICI9IiwKICAgICAgICAgICAgICAgICIlNDAiOiAiQCIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIFRoZXNlIGNoYXJhY3RlcnMgYXJlIHRoZSBjaGFyYWN0ZXJzIGNhbGxlZCBvdXQgYnkgUkZDMjE0MSBhcyAicmVzZXJ2ZWQiIGNoYXJhY3RlcnMgdGhhdAogICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgYXBwZWFyIGluIGEgVVJOLCBwbHVzIHRoZSBjb2xvbiBjaGFyYWN0ZXIgKHNlZSBub3RlIGFib3ZlKS4KICAgICAgICAgICAgZGVjb2RlOiB7CiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogL1tcL1w/IzpdL2csCiAgICAgICAgICAgICAgbWFwOiB7CiAgICAgICAgICAgICAgICAiLyI6ICIlMkYiLAogICAgICAgICAgICAgICAgIj8iOiAiJTNGIiwKICAgICAgICAgICAgICAgICIjIjogIiUyMyIsCiAgICAgICAgICAgICAgICAiOiI6ICIlM0EiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBVUkkuZW5jb2RlUXVlcnkgPSBmdW5jdGlvbihzdHJpbmcsIGVzY2FwZVF1ZXJ5U3BhY2UpIHsKICAgICAgICAgIHZhciBlc2NhcGVkID0gVVJJLmVuY29kZShzdHJpbmcgKyAiIik7CiAgICAgICAgICBpZiAoZXNjYXBlUXVlcnlTcGFjZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGVzY2FwZVF1ZXJ5U3BhY2UgPSBVUkkuZXNjYXBlUXVlcnlTcGFjZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBlc2NhcGVRdWVyeVNwYWNlID8gZXNjYXBlZC5yZXBsYWNlKC8lMjAvZywgIisiKSA6IGVzY2FwZWQ7CiAgICAgICAgfTsKICAgICAgICBVUkkuZGVjb2RlUXVlcnkgPSBmdW5jdGlvbihzdHJpbmcsIGVzY2FwZVF1ZXJ5U3BhY2UpIHsKICAgICAgICAgIHN0cmluZyArPSAiIjsKICAgICAgICAgIGlmIChlc2NhcGVRdWVyeVNwYWNlID09PSB2b2lkIDApIHsKICAgICAgICAgICAgZXNjYXBlUXVlcnlTcGFjZSA9IFVSSS5lc2NhcGVRdWVyeVNwYWNlOwogICAgICAgICAgfQogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuIFVSSS5kZWNvZGUoZXNjYXBlUXVlcnlTcGFjZSA/IHN0cmluZy5yZXBsYWNlKC9cKy9nLCAiJTIwIikgOiBzdHJpbmcpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICByZXR1cm4gc3RyaW5nOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIF9wYXJ0cyA9IHsgImVuY29kZSI6ICJlbmNvZGUiLCAiZGVjb2RlIjogImRlY29kZSIgfTsKICAgICAgICB2YXIgX3BhcnQ7CiAgICAgICAgdmFyIGdlbmVyYXRlQWNjZXNzb3IgPSBmdW5jdGlvbihfZ3JvdXAsIF9wYXJ0MikgewogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIHJldHVybiBVUklbX3BhcnQyXShzdHJpbmcgKyAiIikucmVwbGFjZShVUkkuY2hhcmFjdGVyc1tfZ3JvdXBdW19wYXJ0Ml0uZXhwcmVzc2lvbiwgZnVuY3Rpb24oYykgewogICAgICAgICAgICAgICAgcmV0dXJuIFVSSS5jaGFyYWN0ZXJzW19ncm91cF1bX3BhcnQyXS5tYXBbY107CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgZm9yIChfcGFydCBpbiBfcGFydHMpIHsKICAgICAgICAgIFVSSVtfcGFydCArICJQYXRoU2VnbWVudCJdID0gZ2VuZXJhdGVBY2Nlc3NvcigicGF0aG5hbWUiLCBfcGFydHNbX3BhcnRdKTsKICAgICAgICAgIFVSSVtfcGFydCArICJVcm5QYXRoU2VnbWVudCJdID0gZ2VuZXJhdGVBY2Nlc3NvcigidXJucGF0aCIsIF9wYXJ0c1tfcGFydF0pOwogICAgICAgIH0KICAgICAgICB2YXIgZ2VuZXJhdGVTZWdtZW50ZWRQYXRoRnVuY3Rpb24gPSBmdW5jdGlvbihfc2VwLCBfY29kaW5nRnVuY05hbWUsIF9pbm5lckNvZGluZ0Z1bmNOYW1lKSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7CiAgICAgICAgICAgIHZhciBhY3R1YWxDb2RpbmdGdW5jOwogICAgICAgICAgICBpZiAoIV9pbm5lckNvZGluZ0Z1bmNOYW1lKSB7CiAgICAgICAgICAgICAgYWN0dWFsQ29kaW5nRnVuYyA9IFVSSVtfY29kaW5nRnVuY05hbWVdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGFjdHVhbENvZGluZ0Z1bmMgPSBmdW5jdGlvbihzdHJpbmcyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gVVJJW19jb2RpbmdGdW5jTmFtZV0oVVJJW19pbm5lckNvZGluZ0Z1bmNOYW1lXShzdHJpbmcyKSk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2VnbWVudHMgPSAoc3RyaW5nICsgIiIpLnNwbGl0KF9zZXApOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBzZWdtZW50c1tpXSA9IGFjdHVhbENvZGluZ0Z1bmMoc2VnbWVudHNbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWdtZW50cy5qb2luKF9zZXApOwogICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIFVSSS5kZWNvZGVQYXRoID0gZ2VuZXJhdGVTZWdtZW50ZWRQYXRoRnVuY3Rpb24oIi8iLCAiZGVjb2RlUGF0aFNlZ21lbnQiKTsKICAgICAgICBVUkkuZGVjb2RlVXJuUGF0aCA9IGdlbmVyYXRlU2VnbWVudGVkUGF0aEZ1bmN0aW9uKCI6IiwgImRlY29kZVVyblBhdGhTZWdtZW50Iik7CiAgICAgICAgVVJJLnJlY29kZVBhdGggPSBnZW5lcmF0ZVNlZ21lbnRlZFBhdGhGdW5jdGlvbigiLyIsICJlbmNvZGVQYXRoU2VnbWVudCIsICJkZWNvZGUiKTsKICAgICAgICBVUkkucmVjb2RlVXJuUGF0aCA9IGdlbmVyYXRlU2VnbWVudGVkUGF0aEZ1bmN0aW9uKCI6IiwgImVuY29kZVVyblBhdGhTZWdtZW50IiwgImRlY29kZSIpOwogICAgICAgIFVSSS5lbmNvZGVSZXNlcnZlZCA9IGdlbmVyYXRlQWNjZXNzb3IoInJlc2VydmVkIiwgImVuY29kZSIpOwogICAgICAgIFVSSS5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZywgcGFydHMpIHsKICAgICAgICAgIHZhciBwb3M7CiAgICAgICAgICBpZiAoIXBhcnRzKSB7CiAgICAgICAgICAgIHBhcnRzID0gewogICAgICAgICAgICAgIHByZXZlbnRJbnZhbGlkSG9zdG5hbWU6IFVSSS5wcmV2ZW50SW52YWxpZEhvc3RuYW1lCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShVUkkubGVhZGluZ193aGl0ZXNwYWNlX2V4cHJlc3Npb24sICIiKTsKICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKFVSSS5hc2NpaV90YWJfd2hpdGVzcGFjZSwgIiIpOwogICAgICAgICAgcG9zID0gc3RyaW5nLmluZGV4T2YoIiMiKTsKICAgICAgICAgIGlmIChwb3MgPiAtMSkgewogICAgICAgICAgICBwYXJ0cy5mcmFnbWVudCA9IHN0cmluZy5zdWJzdHJpbmcocG9zICsgMSkgfHwgbnVsbDsKICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBwb3MpOwogICAgICAgICAgfQogICAgICAgICAgcG9zID0gc3RyaW5nLmluZGV4T2YoIj8iKTsKICAgICAgICAgIGlmIChwb3MgPiAtMSkgewogICAgICAgICAgICBwYXJ0cy5xdWVyeSA9IHN0cmluZy5zdWJzdHJpbmcocG9zICsgMSkgfHwgbnVsbDsKICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBwb3MpOwogICAgICAgICAgfQogICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoL14oaHR0cHM/fGZ0cHx3c3M/KT86K1svXFxdKi9pLCAiJDE6Ly8iKTsKICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9eWy9cXF17Mix9L2ksICIvLyIpOwogICAgICAgICAgaWYgKHN0cmluZy5zdWJzdHJpbmcoMCwgMikgPT09ICIvLyIpIHsKICAgICAgICAgICAgcGFydHMucHJvdG9jb2wgPSBudWxsOwogICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKDIpOwogICAgICAgICAgICBzdHJpbmcgPSBVUkkucGFyc2VBdXRob3JpdHkoc3RyaW5nLCBwYXJ0cyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwb3MgPSBzdHJpbmcuaW5kZXhPZigiOiIpOwogICAgICAgICAgICBpZiAocG9zID4gLTEpIHsKICAgICAgICAgICAgICBwYXJ0cy5wcm90b2NvbCA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKSB8fCBudWxsOwogICAgICAgICAgICAgIGlmIChwYXJ0cy5wcm90b2NvbCAmJiAhcGFydHMucHJvdG9jb2wubWF0Y2goVVJJLnByb3RvY29sX2V4cHJlc3Npb24pKSB7CiAgICAgICAgICAgICAgICBwYXJ0cy5wcm90b2NvbCA9IHZvaWQgMDsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmluZy5zdWJzdHJpbmcocG9zICsgMSwgcG9zICsgMykucmVwbGFjZSgvXFwvZywgIi8iKSA9PT0gIi8vIikgewogICAgICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZyhwb3MgKyAzKTsKICAgICAgICAgICAgICAgIHN0cmluZyA9IFVSSS5wYXJzZUF1dGhvcml0eShzdHJpbmcsIHBhcnRzKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZyhwb3MgKyAxKTsKICAgICAgICAgICAgICAgIHBhcnRzLnVybiA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBwYXJ0cy5wYXRoID0gc3RyaW5nOwogICAgICAgICAgcmV0dXJuIHBhcnRzOwogICAgICAgIH07CiAgICAgICAgVVJJLnBhcnNlSG9zdCA9IGZ1bmN0aW9uKHN0cmluZywgcGFydHMpIHsKICAgICAgICAgIGlmICghc3RyaW5nKSB7CiAgICAgICAgICAgIHN0cmluZyA9ICIiOwogICAgICAgICAgfQogICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoL1xcL2csICIvIik7CiAgICAgICAgICB2YXIgcG9zID0gc3RyaW5nLmluZGV4T2YoIi8iKTsKICAgICAgICAgIHZhciBicmFja2V0UG9zOwogICAgICAgICAgdmFyIHQ7CiAgICAgICAgICBpZiAocG9zID09PSAtMSkgewogICAgICAgICAgICBwb3MgPSBzdHJpbmcubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0cmluZy5jaGFyQXQoMCkgPT09ICJbIikgewogICAgICAgICAgICBicmFja2V0UG9zID0gc3RyaW5nLmluZGV4T2YoIl0iKTsKICAgICAgICAgICAgcGFydHMuaG9zdG5hbWUgPSBzdHJpbmcuc3Vic3RyaW5nKDEsIGJyYWNrZXRQb3MpIHx8IG51bGw7CiAgICAgICAgICAgIHBhcnRzLnBvcnQgPSBzdHJpbmcuc3Vic3RyaW5nKGJyYWNrZXRQb3MgKyAyLCBwb3MpIHx8IG51bGw7CiAgICAgICAgICAgIGlmIChwYXJ0cy5wb3J0ID09PSAiLyIpIHsKICAgICAgICAgICAgICBwYXJ0cy5wb3J0ID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIGZpcnN0Q29sb24gPSBzdHJpbmcuaW5kZXhPZigiOiIpOwogICAgICAgICAgICB2YXIgZmlyc3RTbGFzaCA9IHN0cmluZy5pbmRleE9mKCIvIik7CiAgICAgICAgICAgIHZhciBuZXh0Q29sb24gPSBzdHJpbmcuaW5kZXhPZigiOiIsIGZpcnN0Q29sb24gKyAxKTsKICAgICAgICAgICAgaWYgKG5leHRDb2xvbiAhPT0gLTEgJiYgKGZpcnN0U2xhc2ggPT09IC0xIHx8IG5leHRDb2xvbiA8IGZpcnN0U2xhc2gpKSB7CiAgICAgICAgICAgICAgcGFydHMuaG9zdG5hbWUgPSBzdHJpbmcuc3Vic3RyaW5nKDAsIHBvcykgfHwgbnVsbDsKICAgICAgICAgICAgICBwYXJ0cy5wb3J0ID0gbnVsbDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0ID0gc3RyaW5nLnN1YnN0cmluZygwLCBwb3MpLnNwbGl0KCI6Iik7CiAgICAgICAgICAgICAgcGFydHMuaG9zdG5hbWUgPSB0WzBdIHx8IG51bGw7CiAgICAgICAgICAgICAgcGFydHMucG9ydCA9IHRbMV0gfHwgbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHBhcnRzLmhvc3RuYW1lICYmIHN0cmluZy5zdWJzdHJpbmcocG9zKS5jaGFyQXQoMCkgIT09ICIvIikgewogICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgc3RyaW5nID0gIi8iICsgc3RyaW5nOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHBhcnRzLnByZXZlbnRJbnZhbGlkSG9zdG5hbWUpIHsKICAgICAgICAgICAgVVJJLmVuc3VyZVZhbGlkSG9zdG5hbWUocGFydHMuaG9zdG5hbWUsIHBhcnRzLnByb3RvY29sKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXJ0cy5wb3J0KSB7CiAgICAgICAgICAgIFVSSS5lbnN1cmVWYWxpZFBvcnQocGFydHMucG9ydCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhwb3MpIHx8ICIvIjsKICAgICAgICB9OwogICAgICAgIFVSSS5wYXJzZUF1dGhvcml0eSA9IGZ1bmN0aW9uKHN0cmluZywgcGFydHMpIHsKICAgICAgICAgIHN0cmluZyA9IFVSSS5wYXJzZVVzZXJpbmZvKHN0cmluZywgcGFydHMpOwogICAgICAgICAgcmV0dXJuIFVSSS5wYXJzZUhvc3Qoc3RyaW5nLCBwYXJ0cyk7CiAgICAgICAgfTsKICAgICAgICBVUkkucGFyc2VVc2VyaW5mbyA9IGZ1bmN0aW9uKHN0cmluZywgcGFydHMpIHsKICAgICAgICAgIHZhciBfc3RyaW5nID0gc3RyaW5nOwogICAgICAgICAgdmFyIGZpcnN0QmFja1NsYXNoID0gc3RyaW5nLmluZGV4T2YoIlxcIik7CiAgICAgICAgICBpZiAoZmlyc3RCYWNrU2xhc2ggIT09IC0xKSB7CiAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cXC9nLCAiLyIpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGZpcnN0U2xhc2ggPSBzdHJpbmcuaW5kZXhPZigiLyIpOwogICAgICAgICAgdmFyIHBvcyA9IHN0cmluZy5sYXN0SW5kZXhPZigiQCIsIGZpcnN0U2xhc2ggPiAtMSA/IGZpcnN0U2xhc2ggOiBzdHJpbmcubGVuZ3RoIC0gMSk7CiAgICAgICAgICB2YXIgdDsKICAgICAgICAgIGlmIChwb3MgPiAtMSAmJiAoZmlyc3RTbGFzaCA9PT0gLTEgfHwgcG9zIDwgZmlyc3RTbGFzaCkpIHsKICAgICAgICAgICAgdCA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKS5zcGxpdCgiOiIpOwogICAgICAgICAgICBwYXJ0cy51c2VybmFtZSA9IHRbMF0gPyBVUkkuZGVjb2RlKHRbMF0pIDogbnVsbDsKICAgICAgICAgICAgdC5zaGlmdCgpOwogICAgICAgICAgICBwYXJ0cy5wYXNzd29yZCA9IHRbMF0gPyBVUkkuZGVjb2RlKHQuam9pbigiOiIpKSA6IG51bGw7CiAgICAgICAgICAgIHN0cmluZyA9IF9zdHJpbmcuc3Vic3RyaW5nKHBvcyArIDEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcGFydHMudXNlcm5hbWUgPSBudWxsOwogICAgICAgICAgICBwYXJ0cy5wYXNzd29yZCA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc3RyaW5nOwogICAgICAgIH07CiAgICAgICAgVVJJLnBhcnNlUXVlcnkgPSBmdW5jdGlvbihzdHJpbmcsIGVzY2FwZVF1ZXJ5U3BhY2UpIHsKICAgICAgICAgIGlmICghc3RyaW5nKSB7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgIH0KICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC8mKy9nLCAiJiIpLnJlcGxhY2UoL15cPyomKnwmKyQvZywgIiIpOwogICAgICAgICAgaWYgKCFzdHJpbmcpIHsKICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgfQogICAgICAgICAgdmFyIGl0ZW1zID0ge307CiAgICAgICAgICB2YXIgc3BsaXRzID0gc3RyaW5nLnNwbGl0KCImIik7CiAgICAgICAgICB2YXIgbGVuZ3RoID0gc3BsaXRzLmxlbmd0aDsKICAgICAgICAgIHZhciB2MywgbmFtZSwgdmFsdWU7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHYzID0gc3BsaXRzW2ldLnNwbGl0KCI9Iik7CiAgICAgICAgICAgIG5hbWUgPSBVUkkuZGVjb2RlUXVlcnkodjMuc2hpZnQoKSwgZXNjYXBlUXVlcnlTcGFjZSk7CiAgICAgICAgICAgIHZhbHVlID0gdjMubGVuZ3RoID8gVVJJLmRlY29kZVF1ZXJ5KHYzLmpvaW4oIj0iKSwgZXNjYXBlUXVlcnlTcGFjZSkgOiBudWxsOwogICAgICAgICAgICBpZiAobmFtZSA9PT0gIl9fcHJvdG9fXyIpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNPd24uY2FsbChpdGVtcywgbmFtZSkpIHsKICAgICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW1zW25hbWVdID09PSAic3RyaW5nIiB8fCBpdGVtc1tuYW1lXSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgaXRlbXNbbmFtZV0gPSBbaXRlbXNbbmFtZV1dOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpdGVtc1tuYW1lXS5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpdGVtc1tuYW1lXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gaXRlbXM7CiAgICAgICAgfTsKICAgICAgICBVUkkuYnVpbGQgPSBmdW5jdGlvbihwYXJ0cykgewogICAgICAgICAgdmFyIHQgPSAiIjsKICAgICAgICAgIHZhciByZXF1aXJlQWJzb2x1dGVQYXRoID0gZmFsc2U7CiAgICAgICAgICBpZiAocGFydHMucHJvdG9jb2wpIHsKICAgICAgICAgICAgdCArPSBwYXJ0cy5wcm90b2NvbCArICI6IjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghcGFydHMudXJuICYmICh0IHx8IHBhcnRzLmhvc3RuYW1lKSkgewogICAgICAgICAgICB0ICs9ICIvLyI7CiAgICAgICAgICAgIHJlcXVpcmVBYnNvbHV0ZVBhdGggPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgdCArPSBVUkkuYnVpbGRBdXRob3JpdHkocGFydHMpIHx8ICIiOwogICAgICAgICAgaWYgKHR5cGVvZiBwYXJ0cy5wYXRoID09PSAic3RyaW5nIikgewogICAgICAgICAgICBpZiAocGFydHMucGF0aC5jaGFyQXQoMCkgIT09ICIvIiAmJiByZXF1aXJlQWJzb2x1dGVQYXRoKSB7CiAgICAgICAgICAgICAgdCArPSAiLyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdCArPSBwYXJ0cy5wYXRoOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHR5cGVvZiBwYXJ0cy5xdWVyeSA9PT0gInN0cmluZyIgJiYgcGFydHMucXVlcnkpIHsKICAgICAgICAgICAgdCArPSAiPyIgKyBwYXJ0cy5xdWVyeTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0eXBlb2YgcGFydHMuZnJhZ21lbnQgPT09ICJzdHJpbmciICYmIHBhcnRzLmZyYWdtZW50KSB7CiAgICAgICAgICAgIHQgKz0gIiMiICsgcGFydHMuZnJhZ21lbnQ7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdDsKICAgICAgICB9OwogICAgICAgIFVSSS5idWlsZEhvc3QgPSBmdW5jdGlvbihwYXJ0cykgewogICAgICAgICAgdmFyIHQgPSAiIjsKICAgICAgICAgIGlmICghcGFydHMuaG9zdG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgfSBlbHNlIGlmIChVUkkuaXA2X2V4cHJlc3Npb24udGVzdChwYXJ0cy5ob3N0bmFtZSkpIHsKICAgICAgICAgICAgdCArPSAiWyIgKyBwYXJ0cy5ob3N0bmFtZSArICJdIjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHQgKz0gcGFydHMuaG9zdG5hbWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocGFydHMucG9ydCkgewogICAgICAgICAgICB0ICs9ICI6IiArIHBhcnRzLnBvcnQ7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdDsKICAgICAgICB9OwogICAgICAgIFVSSS5idWlsZEF1dGhvcml0eSA9IGZ1bmN0aW9uKHBhcnRzKSB7CiAgICAgICAgICByZXR1cm4gVVJJLmJ1aWxkVXNlcmluZm8ocGFydHMpICsgVVJJLmJ1aWxkSG9zdChwYXJ0cyk7CiAgICAgICAgfTsKICAgICAgICBVUkkuYnVpbGRVc2VyaW5mbyA9IGZ1bmN0aW9uKHBhcnRzKSB7CiAgICAgICAgICB2YXIgdCA9ICIiOwogICAgICAgICAgaWYgKHBhcnRzLnVzZXJuYW1lKSB7CiAgICAgICAgICAgIHQgKz0gVVJJLmVuY29kZShwYXJ0cy51c2VybmFtZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocGFydHMucGFzc3dvcmQpIHsKICAgICAgICAgICAgdCArPSAiOiIgKyBVUkkuZW5jb2RlKHBhcnRzLnBhc3N3b3JkKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgIHQgKz0gIkAiOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgfTsKICAgICAgICBVUkkuYnVpbGRRdWVyeSA9IGZ1bmN0aW9uKGRhdGEsIGR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycywgZXNjYXBlUXVlcnlTcGFjZSkgewogICAgICAgICAgdmFyIHQgPSAiIjsKICAgICAgICAgIHZhciB1bmlxdWUsIGtleSwgaSwgbGVuZ3RoOwogICAgICAgICAgZm9yIChrZXkgaW4gZGF0YSkgewogICAgICAgICAgICBpZiAoa2V5ID09PSAiX19wcm90b19fIikgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGhhc093bi5jYWxsKGRhdGEsIGtleSkpIHsKICAgICAgICAgICAgICBpZiAoaXNBcnJheShkYXRhW2tleV0pKSB7CiAgICAgICAgICAgICAgICB1bmlxdWUgPSB7fTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IGRhdGFba2V5XS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICBpZiAoZGF0YVtrZXldW2ldICE9PSB2b2lkIDAgJiYgdW5pcXVlW2RhdGFba2V5XVtpXSArICIiXSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICAgICAgdCArPSAiJiIgKyBVUkkuYnVpbGRRdWVyeVBhcmFtZXRlcihrZXksIGRhdGFba2V5XVtpXSwgZXNjYXBlUXVlcnlTcGFjZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyAhPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAgdW5pcXVlW2RhdGFba2V5XVtpXSArICIiXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhW2tleV0gIT09IHZvaWQgMCkgewogICAgICAgICAgICAgICAgdCArPSAiJiIgKyBVUkkuYnVpbGRRdWVyeVBhcmFtZXRlcihrZXksIGRhdGFba2V5XSwgZXNjYXBlUXVlcnlTcGFjZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdC5zdWJzdHJpbmcoMSk7CiAgICAgICAgfTsKICAgICAgICBVUkkuYnVpbGRRdWVyeVBhcmFtZXRlciA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBlc2NhcGVRdWVyeVNwYWNlKSB7CiAgICAgICAgICByZXR1cm4gVVJJLmVuY29kZVF1ZXJ5KG5hbWUsIGVzY2FwZVF1ZXJ5U3BhY2UpICsgKHZhbHVlICE9PSBudWxsID8gIj0iICsgVVJJLmVuY29kZVF1ZXJ5KHZhbHVlLCBlc2NhcGVRdWVyeVNwYWNlKSA6ICIiKTsKICAgICAgICB9OwogICAgICAgIFVSSS5hZGRRdWVyeSA9IGZ1bmN0aW9uKGRhdGEsIG5hbWUsIHZhbHVlKSB7CiAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBuYW1lKSB7CiAgICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKG5hbWUsIGtleSkpIHsKICAgICAgICAgICAgICAgIFVSSS5hZGRRdWVyeShkYXRhLCBrZXksIG5hbWVba2V5XSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuYW1lID09PSAic3RyaW5nIikgewogICAgICAgICAgICBpZiAoZGF0YVtuYW1lXSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgZGF0YVtuYW1lXSA9IHZhbHVlOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YVtuYW1lXSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICBkYXRhW25hbWVdID0gW2RhdGFbbmFtZV1dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgICAgICB2YWx1ZSA9IFt2YWx1ZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YVtuYW1lXSA9IChkYXRhW25hbWVdIHx8IFtdKS5jb25jYXQodmFsdWUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiVVJJLmFkZFF1ZXJ5KCkgYWNjZXB0cyBhbiBvYmplY3QsIHN0cmluZyBhcyB0aGUgbmFtZSBwYXJhbWV0ZXIiKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFVSSS5zZXRRdWVyeSA9IGZ1bmN0aW9uKGRhdGEsIG5hbWUsIHZhbHVlKSB7CiAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBuYW1lKSB7CiAgICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKG5hbWUsIGtleSkpIHsKICAgICAgICAgICAgICAgIFVSSS5zZXRRdWVyeShkYXRhLCBrZXksIG5hbWVba2V5XSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuYW1lID09PSAic3RyaW5nIikgewogICAgICAgICAgICBkYXRhW25hbWVdID0gdmFsdWUgPT09IHZvaWQgMCA/IG51bGwgOiB2YWx1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlVSSS5zZXRRdWVyeSgpIGFjY2VwdHMgYW4gb2JqZWN0LCBzdHJpbmcgYXMgdGhlIG5hbWUgcGFyYW1ldGVyIik7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBVUkkucmVtb3ZlUXVlcnkgPSBmdW5jdGlvbihkYXRhLCBuYW1lLCB2YWx1ZSkgewogICAgICAgICAgdmFyIGksIGxlbmd0aCwga2V5OwogICAgICAgICAgaWYgKGlzQXJyYXkobmFtZSkpIHsKICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuZ3RoID0gbmFtZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGRhdGFbbmFtZVtpXV0gPSB2b2lkIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0VHlwZShuYW1lKSA9PT0gIlJlZ0V4cCIpIHsKICAgICAgICAgICAgZm9yIChrZXkgaW4gZGF0YSkgewogICAgICAgICAgICAgIGlmIChuYW1lLnRlc3Qoa2V5KSkgewogICAgICAgICAgICAgICAgZGF0YVtrZXldID0gdm9pZCAwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgZm9yIChrZXkgaW4gbmFtZSkgewogICAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChuYW1lLCBrZXkpKSB7CiAgICAgICAgICAgICAgICBVUkkucmVtb3ZlUXVlcnkoZGF0YSwga2V5LCBuYW1lW2tleV0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgICBpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICJSZWdFeHAiKSB7CiAgICAgICAgICAgICAgICBpZiAoIWlzQXJyYXkoZGF0YVtuYW1lXSkgJiYgdmFsdWUudGVzdChkYXRhW25hbWVdKSkgewogICAgICAgICAgICAgICAgICBkYXRhW25hbWVdID0gdm9pZCAwOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgZGF0YVtuYW1lXSA9IGZpbHRlckFycmF5VmFsdWVzKGRhdGFbbmFtZV0sIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFbbmFtZV0gPT09IFN0cmluZyh2YWx1ZSkgJiYgKCFpc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPT09IDEpKSB7CiAgICAgICAgICAgICAgICBkYXRhW25hbWVdID0gdm9pZCAwOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShkYXRhW25hbWVdKSkgewogICAgICAgICAgICAgICAgZGF0YVtuYW1lXSA9IGZpbHRlckFycmF5VmFsdWVzKGRhdGFbbmFtZV0sIHZhbHVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZGF0YVtuYW1lXSA9IHZvaWQgMDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiVVJJLnJlbW92ZVF1ZXJ5KCkgYWNjZXB0cyBhbiBvYmplY3QsIHN0cmluZywgUmVnRXhwIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIiKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFVSSS5oYXNRdWVyeSA9IGZ1bmN0aW9uKGRhdGEsIG5hbWUsIHZhbHVlLCB3aXRoaW5BcnJheSkgewogICAgICAgICAgc3dpdGNoIChnZXRUeXBlKG5hbWUpKSB7CiAgICAgICAgICAgIGNhc2UgIlN0cmluZyI6CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIlJlZ0V4cCI6CiAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChkYXRhLCBrZXkpKSB7CiAgICAgICAgICAgICAgICAgIGlmIChuYW1lLnRlc3Qoa2V5KSAmJiAodmFsdWUgPT09IHZvaWQgMCB8fCBVUkkuaGFzUXVlcnkoZGF0YSwga2V5LCB2YWx1ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICBjYXNlICJPYmplY3QiOgogICAgICAgICAgICAgIGZvciAodmFyIF9rZXkgaW4gbmFtZSkgewogICAgICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKG5hbWUsIF9rZXkpKSB7CiAgICAgICAgICAgICAgICAgIGlmICghVVJJLmhhc1F1ZXJ5KGRhdGEsIF9rZXksIG5hbWVbX2tleV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlVSSS5oYXNRdWVyeSgpIGFjY2VwdHMgYSBzdHJpbmcsIHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBvYmplY3QgYXMgdGhlIG5hbWUgcGFyYW1ldGVyIik7CiAgICAgICAgICB9CiAgICAgICAgICBzd2l0Y2ggKGdldFR5cGUodmFsdWUpKSB7CiAgICAgICAgICAgIGNhc2UgIlVuZGVmaW5lZCI6CiAgICAgICAgICAgICAgcmV0dXJuIG5hbWUgaW4gZGF0YTsKICAgICAgICAgICAgLy8gZGF0YVtuYW1lXSAhPT0gdW5kZWZpbmVkOwogICAgICAgICAgICBjYXNlICJCb29sZWFuIjoKICAgICAgICAgICAgICB2YXIgX2Jvb2x5ID0gQm9vbGVhbihpc0FycmF5KGRhdGFbbmFtZV0pID8gZGF0YVtuYW1lXS5sZW5ndGggOiBkYXRhW25hbWVdKTsKICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IF9ib29seTsKICAgICAgICAgICAgY2FzZSAiRnVuY3Rpb24iOgogICAgICAgICAgICAgIHJldHVybiAhIXZhbHVlKGRhdGFbbmFtZV0sIG5hbWUsIGRhdGEpOwogICAgICAgICAgICBjYXNlICJBcnJheSI6CiAgICAgICAgICAgICAgaWYgKCFpc0FycmF5KGRhdGFbbmFtZV0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciBvcCA9IHdpdGhpbkFycmF5ID8gYXJyYXlDb250YWlucyA6IGFycmF5c0VxdWFsOwogICAgICAgICAgICAgIHJldHVybiBvcChkYXRhW25hbWVdLCB2YWx1ZSk7CiAgICAgICAgICAgIGNhc2UgIlJlZ0V4cCI6CiAgICAgICAgICAgICAgaWYgKCFpc0FycmF5KGRhdGFbbmFtZV0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihkYXRhW25hbWVdICYmIGRhdGFbbmFtZV0ubWF0Y2godmFsdWUpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKCF3aXRoaW5BcnJheSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gYXJyYXlDb250YWlucyhkYXRhW25hbWVdLCB2YWx1ZSk7CiAgICAgICAgICAgIGNhc2UgIk51bWJlciI6CiAgICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpOwogICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovCiAgICAgICAgICAgIGNhc2UgIlN0cmluZyI6CiAgICAgICAgICAgICAgaWYgKCFpc0FycmF5KGRhdGFbbmFtZV0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YVtuYW1lXSA9PT0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICghd2l0aGluQXJyYXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGFycmF5Q29udGFpbnMoZGF0YVtuYW1lXSwgdmFsdWUpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlVSSS5oYXNRdWVyeSgpIGFjY2VwdHMgdW5kZWZpbmVkLCBib29sZWFuLCBzdHJpbmcsIG51bWJlciwgUmVnRXhwLCBGdW5jdGlvbiBhcyB0aGUgdmFsdWUgcGFyYW1ldGVyIik7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBVUkkuam9pblBhdGhzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgaW5wdXQgPSBbXTsKICAgICAgICAgIHZhciBzZWdtZW50cyA9IFtdOwogICAgICAgICAgdmFyIG5vbkVtcHR5U2VnbWVudHMgPSAwOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIHVybCA9IG5ldyBVUkkoYXJndW1lbnRzW2ldKTsKICAgICAgICAgICAgaW5wdXQucHVzaCh1cmwpOwogICAgICAgICAgICB2YXIgX3NlZ21lbnRzID0gdXJsLnNlZ21lbnQoKTsKICAgICAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCBfc2VnbWVudHMubGVuZ3RoOyBzKyspIHsKICAgICAgICAgICAgICBpZiAodHlwZW9mIF9zZWdtZW50c1tzXSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIHNlZ21lbnRzLnB1c2goX3NlZ21lbnRzW3NdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKF9zZWdtZW50c1tzXSkgewogICAgICAgICAgICAgICAgbm9uRW1wdHlTZWdtZW50cysrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCFzZWdtZW50cy5sZW5ndGggfHwgIW5vbkVtcHR5U2VnbWVudHMpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkoIiIpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHVyaSA9IG5ldyBVUkkoIiIpLnNlZ21lbnQoc2VnbWVudHMpOwogICAgICAgICAgaWYgKGlucHV0WzBdLnBhdGgoKSA9PT0gIiIgfHwgaW5wdXRbMF0ucGF0aCgpLnNsaWNlKDAsIDEpID09PSAiLyIpIHsKICAgICAgICAgICAgdXJpLnBhdGgoIi8iICsgdXJpLnBhdGgoKSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdXJpLm5vcm1hbGl6ZSgpOwogICAgICAgIH07CiAgICAgICAgVVJJLmNvbW1vblBhdGggPSBmdW5jdGlvbihvbmUsIHR3bykgewogICAgICAgICAgdmFyIGxlbmd0aCA9IE1hdGgubWluKG9uZS5sZW5ndGgsIHR3by5sZW5ndGgpOwogICAgICAgICAgdmFyIHBvczsKICAgICAgICAgIGZvciAocG9zID0gMDsgcG9zIDwgbGVuZ3RoOyBwb3MrKykgewogICAgICAgICAgICBpZiAob25lLmNoYXJBdChwb3MpICE9PSB0d28uY2hhckF0KHBvcykpIHsKICAgICAgICAgICAgICBwb3MtLTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHBvcyA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG9uZS5jaGFyQXQoMCkgPT09IHR3by5jaGFyQXQoMCkgJiYgb25lLmNoYXJBdCgwKSA9PT0gIi8iID8gIi8iIDogIiI7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAob25lLmNoYXJBdChwb3MpICE9PSAiLyIgfHwgdHdvLmNoYXJBdChwb3MpICE9PSAiLyIpIHsKICAgICAgICAgICAgcG9zID0gb25lLnN1YnN0cmluZygwLCBwb3MpLmxhc3RJbmRleE9mKCIvIik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gb25lLnN1YnN0cmluZygwLCBwb3MgKyAxKTsKICAgICAgICB9OwogICAgICAgIFVSSS53aXRoaW5TdHJpbmcgPSBmdW5jdGlvbihzdHJpbmcsIGNhbGxiYWNrLCBvcHRpb25zKSB7CiAgICAgICAgICBvcHRpb25zIHx8IChvcHRpb25zID0ge30pOwogICAgICAgICAgdmFyIF9zdGFydCA9IG9wdGlvbnMuc3RhcnQgfHwgVVJJLmZpbmRVcmkuc3RhcnQ7CiAgICAgICAgICB2YXIgX2VuZCA9IG9wdGlvbnMuZW5kIHx8IFVSSS5maW5kVXJpLmVuZDsKICAgICAgICAgIHZhciBfdHJpbSA9IG9wdGlvbnMudHJpbSB8fCBVUkkuZmluZFVyaS50cmltOwogICAgICAgICAgdmFyIF9wYXJlbnMgPSBvcHRpb25zLnBhcmVucyB8fCBVUkkuZmluZFVyaS5wYXJlbnM7CiAgICAgICAgICB2YXIgX2F0dHJpYnV0ZU9wZW4gPSAvW2EtejAtOS1dPVsiJ10/JC9pOwogICAgICAgICAgX3N0YXJ0Lmxhc3RJbmRleCA9IDA7CiAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBfc3RhcnQuZXhlYyhzdHJpbmcpOwogICAgICAgICAgICBpZiAoIW1hdGNoKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHN0YXJ0ID0gbWF0Y2guaW5kZXg7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmlnbm9yZUh0bWwpIHsKICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlT3BlbiA9IHN0cmluZy5zbGljZShNYXRoLm1heChzdGFydCAtIDMsIDApLCBzdGFydCk7CiAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZU9wZW4gJiYgX2F0dHJpYnV0ZU9wZW4udGVzdChhdHRyaWJ1dGVPcGVuKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBlbmQgPSBzdGFydCArIHN0cmluZy5zbGljZShzdGFydCkuc2VhcmNoKF9lbmQpOwogICAgICAgICAgICB2YXIgc2xpY2UgPSBzdHJpbmcuc2xpY2Uoc3RhcnQsIGVuZCk7CiAgICAgICAgICAgIHZhciBwYXJlbnNFbmQgPSAtMTsKICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICB2YXIgcGFyZW5zTWF0Y2ggPSBfcGFyZW5zLmV4ZWMoc2xpY2UpOwogICAgICAgICAgICAgIGlmICghcGFyZW5zTWF0Y2gpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB2YXIgcGFyZW5zTWF0Y2hFbmQgPSBwYXJlbnNNYXRjaC5pbmRleCArIHBhcmVuc01hdGNoWzBdLmxlbmd0aDsKICAgICAgICAgICAgICBwYXJlbnNFbmQgPSBNYXRoLm1heChwYXJlbnNFbmQsIHBhcmVuc01hdGNoRW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocGFyZW5zRW5kID4gLTEpIHsKICAgICAgICAgICAgICBzbGljZSA9IHNsaWNlLnNsaWNlKDAsIHBhcmVuc0VuZCkgKyBzbGljZS5zbGljZShwYXJlbnNFbmQpLnJlcGxhY2UoX3RyaW0sICIiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzbGljZSA9IHNsaWNlLnJlcGxhY2UoX3RyaW0sICIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2xpY2UubGVuZ3RoIDw9IG1hdGNoWzBdLmxlbmd0aCkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvcHRpb25zLmlnbm9yZSAmJiBvcHRpb25zLmlnbm9yZS50ZXN0KHNsaWNlKSkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgc2xpY2UubGVuZ3RoOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gY2FsbGJhY2soc2xpY2UsIHN0YXJ0LCBlbmQsIHN0cmluZyk7CiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgewogICAgICAgICAgICAgIF9zdGFydC5sYXN0SW5kZXggPSBlbmQ7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nKHJlc3VsdCk7CiAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5zbGljZSgwLCBzdGFydCkgKyByZXN1bHQgKyBzdHJpbmcuc2xpY2UoZW5kKTsKICAgICAgICAgICAgX3N0YXJ0Lmxhc3RJbmRleCA9IHN0YXJ0ICsgcmVzdWx0Lmxlbmd0aDsKICAgICAgICAgIH0KICAgICAgICAgIF9zdGFydC5sYXN0SW5kZXggPSAwOwogICAgICAgICAgcmV0dXJuIHN0cmluZzsKICAgICAgICB9OwogICAgICAgIFVSSS5lbnN1cmVWYWxpZEhvc3RuYW1lID0gZnVuY3Rpb24odjMsIHByb3RvY29sKSB7CiAgICAgICAgICB2YXIgaGFzSG9zdG5hbWUgPSAhIXYzOwogICAgICAgICAgdmFyIGhhc1Byb3RvY29sID0gISFwcm90b2NvbDsKICAgICAgICAgIHZhciByZWplY3RFbXB0eUhvc3RuYW1lID0gZmFsc2U7CiAgICAgICAgICBpZiAoaGFzUHJvdG9jb2wpIHsKICAgICAgICAgICAgcmVqZWN0RW1wdHlIb3N0bmFtZSA9IGFycmF5Q29udGFpbnMoVVJJLmhvc3RQcm90b2NvbHMsIHByb3RvY29sKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChyZWplY3RFbXB0eUhvc3RuYW1lICYmICFoYXNIb3N0bmFtZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJIb3N0bmFtZSBjYW5ub3QgYmUgZW1wdHksIGlmIHByb3RvY29sIGlzICIgKyBwcm90b2NvbCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHYzICYmIHYzLm1hdGNoKFVSSS5pbnZhbGlkX2hvc3RuYW1lX2NoYXJhY3RlcnMpKSB7CiAgICAgICAgICAgIGlmICghcHVueWNvZGUpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdIb3N0bmFtZSAiJyArIHYzICsgJyIgY29udGFpbnMgY2hhcmFjdGVycyBvdGhlciB0aGFuIFtBLVowLTkuLTpfXSBhbmQgUHVueWNvZGUuanMgaXMgbm90IGF2YWlsYWJsZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwdW55Y29kZS50b0FTQ0lJKHYzKS5tYXRjaChVUkkuaW52YWxpZF9ob3N0bmFtZV9jaGFyYWN0ZXJzKSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0hvc3RuYW1lICInICsgdjMgKyAnIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tOl9dJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFVSSS5lbnN1cmVWYWxpZFBvcnQgPSBmdW5jdGlvbih2MykgewogICAgICAgICAgaWYgKCF2MykgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgcG9ydCA9IE51bWJlcih2Myk7CiAgICAgICAgICBpZiAoaXNJbnRlZ2VyKHBvcnQpICYmIHBvcnQgPiAwICYmIHBvcnQgPCA2NTUzNikgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQb3J0ICInICsgdjMgKyAnIiBpcyBub3QgYSB2YWxpZCBwb3J0Jyk7CiAgICAgICAgfTsKICAgICAgICBVUkkubm9Db25mbGljdCA9IGZ1bmN0aW9uKHJlbW92ZUFsbCkgewogICAgICAgICAgaWYgKHJlbW92ZUFsbCkgewogICAgICAgICAgICB2YXIgdW5jb25mbGljdGVkID0gewogICAgICAgICAgICAgIFVSSTogdGhpcy5ub0NvbmZsaWN0KCkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHJvb3QuVVJJVGVtcGxhdGUgJiYgdHlwZW9mIHJvb3QuVVJJVGVtcGxhdGUubm9Db25mbGljdCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgIHVuY29uZmxpY3RlZC5VUklUZW1wbGF0ZSA9IHJvb3QuVVJJVGVtcGxhdGUubm9Db25mbGljdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyb290LklQdjYgJiYgdHlwZW9mIHJvb3QuSVB2Ni5ub0NvbmZsaWN0ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgdW5jb25mbGljdGVkLklQdjYgPSByb290LklQdjYubm9Db25mbGljdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyb290LlNlY29uZExldmVsRG9tYWlucyAmJiB0eXBlb2Ygcm9vdC5TZWNvbmRMZXZlbERvbWFpbnMubm9Db25mbGljdCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgIHVuY29uZmxpY3RlZC5TZWNvbmRMZXZlbERvbWFpbnMgPSByb290LlNlY29uZExldmVsRG9tYWlucy5ub0NvbmZsaWN0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHVuY29uZmxpY3RlZDsKICAgICAgICAgIH0gZWxzZSBpZiAocm9vdC5VUkkgPT09IHRoaXMpIHsKICAgICAgICAgICAgcm9vdC5VUkkgPSBfVVJJOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBwLmJ1aWxkID0gZnVuY3Rpb24oZGVmZXJCdWlsZCkgewogICAgICAgICAgaWYgKGRlZmVyQnVpbGQgPT09IHRydWUpIHsKICAgICAgICAgICAgdGhpcy5fZGVmZXJyZWRfYnVpbGQgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIGlmIChkZWZlckJ1aWxkID09PSB2b2lkIDAgfHwgdGhpcy5fZGVmZXJyZWRfYnVpbGQpIHsKICAgICAgICAgICAgdGhpcy5fc3RyaW5nID0gVVJJLmJ1aWxkKHRoaXMuX3BhcnRzKTsKICAgICAgICAgICAgdGhpcy5fZGVmZXJyZWRfYnVpbGQgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgcC5jbG9uZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIG5ldyBVUkkodGhpcyk7CiAgICAgICAgfTsKICAgICAgICBwLnZhbHVlT2YgPSBwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZChmYWxzZSkuX3N0cmluZzsKICAgICAgICB9OwogICAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlU2ltcGxlQWNjZXNzb3IoX3BhcnQyKSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odjMsIGJ1aWxkKSB7CiAgICAgICAgICAgIGlmICh2MyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRzW19wYXJ0Ml0gfHwgIiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5fcGFydHNbX3BhcnQyXSA9IHYzIHx8IG51bGw7CiAgICAgICAgICAgICAgdGhpcy5idWlsZCghYnVpbGQpOwogICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBnZW5lcmF0ZVByZWZpeEFjY2Vzc29yKF9wYXJ0MiwgX2tleSkgewogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHYzLCBidWlsZCkgewogICAgICAgICAgICBpZiAodjMgPT09IHZvaWQgMCkgewogICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJ0c1tfcGFydDJdIHx8ICIiOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmICh2MyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdjMgPSB2MyArICIiOwogICAgICAgICAgICAgICAgaWYgKHYzLmNoYXJBdCgwKSA9PT0gX2tleSkgewogICAgICAgICAgICAgICAgICB2MyA9IHYzLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGhpcy5fcGFydHNbX3BhcnQyXSA9IHYzOwogICAgICAgICAgICAgIHRoaXMuYnVpbGQoIWJ1aWxkKTsKICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcC5wcm90b2NvbCA9IGdlbmVyYXRlU2ltcGxlQWNjZXNzb3IoInByb3RvY29sIik7CiAgICAgICAgcC51c2VybmFtZSA9IGdlbmVyYXRlU2ltcGxlQWNjZXNzb3IoInVzZXJuYW1lIik7CiAgICAgICAgcC5wYXNzd29yZCA9IGdlbmVyYXRlU2ltcGxlQWNjZXNzb3IoInBhc3N3b3JkIik7CiAgICAgICAgcC5ob3N0bmFtZSA9IGdlbmVyYXRlU2ltcGxlQWNjZXNzb3IoImhvc3RuYW1lIik7CiAgICAgICAgcC5wb3J0ID0gZ2VuZXJhdGVTaW1wbGVBY2Nlc3NvcigicG9ydCIpOwogICAgICAgIHAucXVlcnkgPSBnZW5lcmF0ZVByZWZpeEFjY2Vzc29yKCJxdWVyeSIsICI/Iik7CiAgICAgICAgcC5mcmFnbWVudCA9IGdlbmVyYXRlUHJlZml4QWNjZXNzb3IoImZyYWdtZW50IiwgIiMiKTsKICAgICAgICBwLnNlYXJjaCA9IGZ1bmN0aW9uKHYzLCBidWlsZCkgewogICAgICAgICAgdmFyIHQgPSB0aGlzLnF1ZXJ5KHYzLCBidWlsZCk7CiAgICAgICAgICByZXR1cm4gdHlwZW9mIHQgPT09ICJzdHJpbmciICYmIHQubGVuZ3RoID8gIj8iICsgdCA6IHQ7CiAgICAgICAgfTsKICAgICAgICBwLmhhc2ggPSBmdW5jdGlvbih2MywgYnVpbGQpIHsKICAgICAgICAgIHZhciB0ID0gdGhpcy5mcmFnbWVudCh2MywgYnVpbGQpOwogICAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAic3RyaW5nIiAmJiB0Lmxlbmd0aCA/ICIjIiArIHQgOiB0OwogICAgICAgIH07CiAgICAgICAgcC5wYXRobmFtZSA9IGZ1bmN0aW9uKHYzLCBidWlsZCkgewogICAgICAgICAgaWYgKHYzID09PSB2b2lkIDAgfHwgdjMgPT09IHRydWUpIHsKICAgICAgICAgICAgdmFyIHJlcyA9IHRoaXMuX3BhcnRzLnBhdGggfHwgKHRoaXMuX3BhcnRzLmhvc3RuYW1lID8gIi8iIDogIiIpOwogICAgICAgICAgICByZXR1cm4gdjMgPyAodGhpcy5fcGFydHMudXJuID8gVVJJLmRlY29kZVVyblBhdGggOiBVUkkuZGVjb2RlUGF0aCkocmVzKSA6IHJlczsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9wYXJ0cy51cm4pIHsKICAgICAgICAgICAgICB0aGlzLl9wYXJ0cy5wYXRoID0gdjMgPyBVUkkucmVjb2RlVXJuUGF0aCh2MykgOiAiIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLl9wYXJ0cy5wYXRoID0gdjMgPyBVUkkucmVjb2RlUGF0aCh2MykgOiAiLyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5idWlsZCghYnVpbGQpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHAucGF0aCA9IHAucGF0aG5hbWU7CiAgICAgICAgcC5ocmVmID0gZnVuY3Rpb24oaHJlZiwgYnVpbGQpIHsKICAgICAgICAgIHZhciBrZXk7CiAgICAgICAgICBpZiAoaHJlZiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9zdHJpbmcgPSAiIjsKICAgICAgICAgIHRoaXMuX3BhcnRzID0gVVJJLl9wYXJ0cygpOwogICAgICAgICAgdmFyIF9VUkkyID0gaHJlZiBpbnN0YW5jZW9mIFVSSTsKICAgICAgICAgIHZhciBfb2JqZWN0ID0gdHlwZW9mIGhyZWYgPT09ICJvYmplY3QiICYmIChocmVmLmhvc3RuYW1lIHx8IGhyZWYucGF0aCB8fCBocmVmLnBhdGhuYW1lKTsKICAgICAgICAgIGlmIChocmVmLm5vZGVOYW1lKSB7CiAgICAgICAgICAgIHZhciBhdHRyaWJ1dGUgPSBVUkkuZ2V0RG9tQXR0cmlidXRlKGhyZWYpOwogICAgICAgICAgICBocmVmID0gaHJlZlthdHRyaWJ1dGVdIHx8ICIiOwogICAgICAgICAgICBfb2JqZWN0ID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIV9VUkkyICYmIF9vYmplY3QgJiYgaHJlZi5wYXRobmFtZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGhyZWYgPSBocmVmLnRvU3RyaW5nKCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodHlwZW9mIGhyZWYgPT09ICJzdHJpbmciIHx8IGhyZWYgaW5zdGFuY2VvZiBTdHJpbmcpIHsKICAgICAgICAgICAgdGhpcy5fcGFydHMgPSBVUkkucGFyc2UoU3RyaW5nKGhyZWYpLCB0aGlzLl9wYXJ0cyk7CiAgICAgICAgICB9IGVsc2UgaWYgKF9VUkkyIHx8IF9vYmplY3QpIHsKICAgICAgICAgICAgdmFyIHNyYyA9IF9VUkkyID8gaHJlZi5fcGFydHMgOiBocmVmOwogICAgICAgICAgICBmb3IgKGtleSBpbiBzcmMpIHsKICAgICAgICAgICAgICBpZiAoa2V5ID09PSAicXVlcnkiKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKHRoaXMuX3BhcnRzLCBrZXkpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wYXJ0c1trZXldID0gc3JjW2tleV07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzcmMucXVlcnkpIHsKICAgICAgICAgICAgICB0aGlzLnF1ZXJ5KHNyYy5xdWVyeSwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIGlucHV0Iik7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmJ1aWxkKCFidWlsZCk7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIHAuaXMgPSBmdW5jdGlvbih3aGF0KSB7CiAgICAgICAgICB2YXIgaXAgPSBmYWxzZTsKICAgICAgICAgIHZhciBpcDQgPSBmYWxzZTsKICAgICAgICAgIHZhciBpcDYgPSBmYWxzZTsKICAgICAgICAgIHZhciBuYW1lID0gZmFsc2U7CiAgICAgICAgICB2YXIgc2xkID0gZmFsc2U7CiAgICAgICAgICB2YXIgaWRuID0gZmFsc2U7CiAgICAgICAgICB2YXIgcHVueWNvZGUyID0gZmFsc2U7CiAgICAgICAgICB2YXIgcmVsYXRpdmUgPSAhdGhpcy5fcGFydHMudXJuOwogICAgICAgICAgaWYgKHRoaXMuX3BhcnRzLmhvc3RuYW1lKSB7CiAgICAgICAgICAgIHJlbGF0aXZlID0gZmFsc2U7CiAgICAgICAgICAgIGlwNCA9IFVSSS5pcDRfZXhwcmVzc2lvbi50ZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKTsKICAgICAgICAgICAgaXA2ID0gVVJJLmlwNl9leHByZXNzaW9uLnRlc3QodGhpcy5fcGFydHMuaG9zdG5hbWUpOwogICAgICAgICAgICBpcCA9IGlwNCB8fCBpcDY7CiAgICAgICAgICAgIG5hbWUgPSAhaXA7CiAgICAgICAgICAgIHNsZCA9IG5hbWUgJiYgU0xEICYmIFNMRC5oYXModGhpcy5fcGFydHMuaG9zdG5hbWUpOwogICAgICAgICAgICBpZG4gPSBuYW1lICYmIFVSSS5pZG5fZXhwcmVzc2lvbi50ZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKTsKICAgICAgICAgICAgcHVueWNvZGUyID0gbmFtZSAmJiBVUkkucHVueWNvZGVfZXhwcmVzc2lvbi50ZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIHN3aXRjaCAod2hhdC50b0xvd2VyQ2FzZSgpKSB7CiAgICAgICAgICAgIGNhc2UgInJlbGF0aXZlIjoKICAgICAgICAgICAgICByZXR1cm4gcmVsYXRpdmU7CiAgICAgICAgICAgIGNhc2UgImFic29sdXRlIjoKICAgICAgICAgICAgICByZXR1cm4gIXJlbGF0aXZlOwogICAgICAgICAgICAvLyBob3N0bmFtZSBpZGVudGlmaWNhdGlvbgogICAgICAgICAgICBjYXNlICJkb21haW4iOgogICAgICAgICAgICBjYXNlICJuYW1lIjoKICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKICAgICAgICAgICAgY2FzZSAic2xkIjoKICAgICAgICAgICAgICByZXR1cm4gc2xkOwogICAgICAgICAgICBjYXNlICJpcCI6CiAgICAgICAgICAgICAgcmV0dXJuIGlwOwogICAgICAgICAgICBjYXNlICJpcDQiOgogICAgICAgICAgICBjYXNlICJpcHY0IjoKICAgICAgICAgICAgY2FzZSAiaW5ldDQiOgogICAgICAgICAgICAgIHJldHVybiBpcDQ7CiAgICAgICAgICAgIGNhc2UgImlwNiI6CiAgICAgICAgICAgIGNhc2UgImlwdjYiOgogICAgICAgICAgICBjYXNlICJpbmV0NiI6CiAgICAgICAgICAgICAgcmV0dXJuIGlwNjsKICAgICAgICAgICAgY2FzZSAiaWRuIjoKICAgICAgICAgICAgICByZXR1cm4gaWRuOwogICAgICAgICAgICBjYXNlICJ1cmwiOgogICAgICAgICAgICAgIHJldHVybiAhdGhpcy5fcGFydHMudXJuOwogICAgICAgICAgICBjYXNlICJ1cm4iOgogICAgICAgICAgICAgIHJldHVybiAhIXRoaXMuX3BhcnRzLnVybjsKICAgICAgICAgICAgY2FzZSAicHVueWNvZGUiOgogICAgICAgICAgICAgIHJldHVybiBwdW55Y29kZTI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9OwogICAgICAgIHZhciBfcHJvdG9jb2wgPSBwLnByb3RvY29sOwogICAgICAgIHZhciBfcG9ydCA9IHAucG9ydDsKICAgICAgICB2YXIgX2hvc3RuYW1lID0gcC5ob3N0bmFtZTsKICAgICAgICBwLnByb3RvY29sID0gZnVuY3Rpb24odjMsIGJ1aWxkKSB7CiAgICAgICAgICBpZiAodjMpIHsKICAgICAgICAgICAgdjMgPSB2My5yZXBsYWNlKC86KFwvXC8pPyQvLCAiIik7CiAgICAgICAgICAgIGlmICghdjMubWF0Y2goVVJJLnByb3RvY29sX2V4cHJlc3Npb24pKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUHJvdG9jb2wgIicgKyB2MyArIGAiIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05ListXSBvciBkb2Vzbid0IHN0YXJ0IHdpdGggW0EtWl1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIF9wcm90b2NvbC5jYWxsKHRoaXMsIHYzLCBidWlsZCk7CiAgICAgICAgfTsKICAgICAgICBwLnNjaGVtZSA9IHAucHJvdG9jb2w7CiAgICAgICAgcC5wb3J0ID0gZnVuY3Rpb24odjMsIGJ1aWxkKSB7CiAgICAgICAgICBpZiAodGhpcy5fcGFydHMudXJuKSB7CiAgICAgICAgICAgIHJldHVybiB2MyA9PT0gdm9pZCAwID8gIiIgOiB0aGlzOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHYzICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgaWYgKHYzID09PSAwKSB7CiAgICAgICAgICAgICAgdjMgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2MykgewogICAgICAgICAgICAgIHYzICs9ICIiOwogICAgICAgICAgICAgIGlmICh2My5jaGFyQXQoMCkgPT09ICI6IikgewogICAgICAgICAgICAgICAgdjMgPSB2My5zdWJzdHJpbmcoMSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIFVSSS5lbnN1cmVWYWxpZFBvcnQodjMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gX3BvcnQuY2FsbCh0aGlzLCB2MywgYnVpbGQpOwogICAgICAgIH07CiAgICAgICAgcC5ob3N0bmFtZSA9IGZ1bmN0aW9uKHYzLCBidWlsZCkgewogICAgICAgICAgaWYgKHRoaXMuX3BhcnRzLnVybikgewogICAgICAgICAgICByZXR1cm4gdjMgPT09IHZvaWQgMCA/ICIiIDogdGhpczsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2MyAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIHZhciB4ID0geyBwcmV2ZW50SW52YWxpZEhvc3RuYW1lOiB0aGlzLl9wYXJ0cy5wcmV2ZW50SW52YWxpZEhvc3RuYW1lIH07CiAgICAgICAgICAgIHZhciByZXMgPSBVUkkucGFyc2VIb3N0KHYzLCB4KTsKICAgICAgICAgICAgaWYgKHJlcyAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgIicgKyB2MyArICciIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05Li1dJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdjMgPSB4Lmhvc3RuYW1lOwogICAgICAgICAgICBpZiAodGhpcy5fcGFydHMucHJldmVudEludmFsaWRIb3N0bmFtZSkgewogICAgICAgICAgICAgIFVSSS5lbnN1cmVWYWxpZEhvc3RuYW1lKHYzLCB0aGlzLl9wYXJ0cy5wcm90b2NvbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBfaG9zdG5hbWUuY2FsbCh0aGlzLCB2MywgYnVpbGQpOwogICAgICAgIH07CiAgICAgICAgcC5vcmlnaW4gPSBmdW5jdGlvbih2MywgYnVpbGQpIHsKICAgICAgICAgIGlmICh0aGlzLl9wYXJ0cy51cm4pIHsKICAgICAgICAgICAgcmV0dXJuIHYzID09PSB2b2lkIDAgPyAiIiA6IHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodjMgPT09IHZvaWQgMCkgewogICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0aGlzLnByb3RvY29sKCk7CiAgICAgICAgICAgIHZhciBhdXRob3JpdHkgPSB0aGlzLmF1dGhvcml0eSgpOwogICAgICAgICAgICBpZiAoIWF1dGhvcml0eSkgewogICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHByb3RvY29sID8gcHJvdG9jb2wgKyAiOi8vIiA6ICIiKSArIHRoaXMuYXV0aG9yaXR5KCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgb3JpZ2luID0gVVJJKHYzKTsKICAgICAgICAgICAgdGhpcy5wcm90b2NvbChvcmlnaW4ucHJvdG9jb2woKSkuYXV0aG9yaXR5KG9yaWdpbi5hdXRob3JpdHkoKSkuYnVpbGQoIWJ1aWxkKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwLmhvc3QgPSBmdW5jdGlvbih2MywgYnVpbGQpIHsKICAgICAgICAgIGlmICh0aGlzLl9wYXJ0cy51cm4pIHsKICAgICAgICAgICAgcmV0dXJuIHYzID09PSB2b2lkIDAgPyAiIiA6IHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodjMgPT09IHZvaWQgMCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFydHMuaG9zdG5hbWUgPyBVUkkuYnVpbGRIb3N0KHRoaXMuX3BhcnRzKSA6ICIiOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIHJlcyA9IFVSSS5wYXJzZUhvc3QodjMsIHRoaXMuX3BhcnRzKTsKICAgICAgICAgICAgaWYgKHJlcyAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgIicgKyB2MyArICciIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05Li1dJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5idWlsZCghYnVpbGQpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHAuYXV0aG9yaXR5ID0gZnVuY3Rpb24odjMsIGJ1aWxkKSB7CiAgICAgICAgICBpZiAodGhpcy5fcGFydHMudXJuKSB7CiAgICAgICAgICAgIHJldHVybiB2MyA9PT0gdm9pZCAwID8gIiIgOiB0aGlzOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHYzID09PSB2b2lkIDApIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRzLmhvc3RuYW1lID8gVVJJLmJ1aWxkQXV0aG9yaXR5KHRoaXMuX3BhcnRzKSA6ICIiOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIHJlcyA9IFVSSS5wYXJzZUF1dGhvcml0eSh2MywgdGhpcy5fcGFydHMpOwogICAgICAgICAgICBpZiAocmVzICE9PSAiLyIpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdIb3N0bmFtZSAiJyArIHYzICsgJyIgY29udGFpbnMgY2hhcmFjdGVycyBvdGhlciB0aGFuIFtBLVowLTkuLV0nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmJ1aWxkKCFidWlsZCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcC51c2VyaW5mbyA9IGZ1bmN0aW9uKHYzLCBidWlsZCkgewogICAgICAgICAgaWYgKHRoaXMuX3BhcnRzLnVybikgewogICAgICAgICAgICByZXR1cm4gdjMgPT09IHZvaWQgMCA/ICIiIDogdGhpczsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2MyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIHZhciB0ID0gVVJJLmJ1aWxkVXNlcmluZm8odGhpcy5fcGFydHMpOwogICAgICAgICAgICByZXR1cm4gdCA/IHQuc3Vic3RyaW5nKDAsIHQubGVuZ3RoIC0gMSkgOiB0OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHYzW3YzLmxlbmd0aCAtIDFdICE9PSAiQCIpIHsKICAgICAgICAgICAgICB2MyArPSAiQCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgVVJJLnBhcnNlVXNlcmluZm8odjMsIHRoaXMuX3BhcnRzKTsKICAgICAgICAgICAgdGhpcy5idWlsZCghYnVpbGQpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHAucmVzb3VyY2UgPSBmdW5jdGlvbih2MywgYnVpbGQpIHsKICAgICAgICAgIHZhciBwYXJ0czsKICAgICAgICAgIGlmICh2MyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdGgoKSArIHRoaXMuc2VhcmNoKCkgKyB0aGlzLmhhc2goKTsKICAgICAgICAgIH0KICAgICAgICAgIHBhcnRzID0gVVJJLnBhcnNlKHYzKTsKICAgICAgICAgIHRoaXMuX3BhcnRzLnBhdGggPSBwYXJ0cy5wYXRoOwogICAgICAgICAgdGhpcy5fcGFydHMucXVlcnkgPSBwYXJ0cy5xdWVyeTsKICAgICAgICAgIHRoaXMuX3BhcnRzLmZyYWdtZW50ID0gcGFydHMuZnJhZ21lbnQ7CiAgICAgICAgICB0aGlzLmJ1aWxkKCFidWlsZCk7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIHAuc3ViZG9tYWluID0gZnVuY3Rpb24odjMsIGJ1aWxkKSB7CiAgICAgICAgICBpZiAodGhpcy5fcGFydHMudXJuKSB7CiAgICAgICAgICAgIHJldHVybiB2MyA9PT0gdm9pZCAwID8gIiIgOiB0aGlzOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHYzID09PSB2b2lkIDApIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9wYXJ0cy5ob3N0bmFtZSB8fCB0aGlzLmlzKCJJUCIpKSB7CiAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBlbmQgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5sZW5ndGggLSB0aGlzLmRvbWFpbigpLmxlbmd0aCAtIDE7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5zdWJzdHJpbmcoMCwgZW5kKSB8fCAiIjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciBlID0gdGhpcy5fcGFydHMuaG9zdG5hbWUubGVuZ3RoIC0gdGhpcy5kb21haW4oKS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBzdWIgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5zdWJzdHJpbmcoMCwgZSk7CiAgICAgICAgICAgIHZhciByZXBsYWNlID0gbmV3IFJlZ0V4cCgiXiIgKyBlc2NhcGVSZWdFeChzdWIpKTsKICAgICAgICAgICAgaWYgKHYzICYmIHYzLmNoYXJBdCh2My5sZW5ndGggLSAxKSAhPT0gIi4iKSB7CiAgICAgICAgICAgICAgdjMgKz0gIi4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2My5pbmRleE9mKCI6IikgIT09IC0xKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRG9tYWlucyBjYW5ub3QgY29udGFpbiBjb2xvbnMiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodjMpIHsKICAgICAgICAgICAgICBVUkkuZW5zdXJlVmFsaWRIb3N0bmFtZSh2MywgdGhpcy5fcGFydHMucHJvdG9jb2wpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gdGhpcy5fcGFydHMuaG9zdG5hbWUucmVwbGFjZShyZXBsYWNlLCB2Myk7CiAgICAgICAgICAgIHRoaXMuYnVpbGQoIWJ1aWxkKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwLmRvbWFpbiA9IGZ1bmN0aW9uKHYzLCBidWlsZCkgewogICAgICAgICAgaWYgKHRoaXMuX3BhcnRzLnVybikgewogICAgICAgICAgICByZXR1cm4gdjMgPT09IHZvaWQgMCA/ICIiIDogdGhpczsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0eXBlb2YgdjMgPT09ICJib29sZWFuIikgewogICAgICAgICAgICBidWlsZCA9IHYzOwogICAgICAgICAgICB2MyA9IHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2MyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fcGFydHMuaG9zdG5hbWUgfHwgdGhpcy5pcygiSVAiKSkgewogICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdCA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLm1hdGNoKC9cLi9nKTsKICAgICAgICAgICAgaWYgKHQgJiYgdC5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRzLmhvc3RuYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBlbmQgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5sZW5ndGggLSB0aGlzLnRsZChidWlsZCkubGVuZ3RoIC0gMTsKICAgICAgICAgICAgZW5kID0gdGhpcy5fcGFydHMuaG9zdG5hbWUubGFzdEluZGV4T2YoIi4iLCBlbmQgLSAxKSArIDE7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5zdWJzdHJpbmcoZW5kKSB8fCAiIjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghdjMpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW5ub3Qgc2V0IGRvbWFpbiBlbXB0eSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2My5pbmRleE9mKCI6IikgIT09IC0xKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRG9tYWlucyBjYW5ub3QgY29udGFpbiBjb2xvbnMiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBVUkkuZW5zdXJlVmFsaWRIb3N0bmFtZSh2MywgdGhpcy5fcGFydHMucHJvdG9jb2wpOwogICAgICAgICAgICBpZiAoIXRoaXMuX3BhcnRzLmhvc3RuYW1lIHx8IHRoaXMuaXMoIklQIikpIHsKICAgICAgICAgICAgICB0aGlzLl9wYXJ0cy5ob3N0bmFtZSA9IHYzOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhciByZXBsYWNlID0gbmV3IFJlZ0V4cChlc2NhcGVSZWdFeCh0aGlzLmRvbWFpbigpKSArICIkIik7CiAgICAgICAgICAgICAgdGhpcy5fcGFydHMuaG9zdG5hbWUgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5yZXBsYWNlKHJlcGxhY2UsIHYzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmJ1aWxkKCFidWlsZCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcC50bGQgPSBmdW5jdGlvbih2MywgYnVpbGQpIHsKICAgICAgICAgIGlmICh0aGlzLl9wYXJ0cy51cm4pIHsKICAgICAgICAgICAgcmV0dXJuIHYzID09PSB2b2lkIDAgPyAiIiA6IHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodHlwZW9mIHYzID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgYnVpbGQgPSB2MzsKICAgICAgICAgICAgdjMgPSB2b2lkIDA7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodjMgPT09IHZvaWQgMCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX3BhcnRzLmhvc3RuYW1lIHx8IHRoaXMuaXMoIklQIikpIHsKICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHBvcyA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLmxhc3RJbmRleE9mKCIuIik7CiAgICAgICAgICAgIHZhciB0bGQgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5zdWJzdHJpbmcocG9zICsgMSk7CiAgICAgICAgICAgIGlmIChidWlsZCAhPT0gdHJ1ZSAmJiBTTEQgJiYgU0xELmxpc3RbdGxkLnRvTG93ZXJDYXNlKCldKSB7CiAgICAgICAgICAgICAgcmV0dXJuIFNMRC5nZXQodGhpcy5fcGFydHMuaG9zdG5hbWUpIHx8IHRsZDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGxkOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIHJlcGxhY2U7CiAgICAgICAgICAgIGlmICghdjMpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW5ub3Qgc2V0IFRMRCBlbXB0eSIpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHYzLm1hdGNoKC9bXmEtekEtWjAtOS1dLykpIHsKICAgICAgICAgICAgICBpZiAoU0xEICYmIFNMRC5pcyh2MykpIHsKICAgICAgICAgICAgICAgIHJlcGxhY2UgPSBuZXcgUmVnRXhwKGVzY2FwZVJlZ0V4KHRoaXMudGxkKCkpICsgIiQiKTsKICAgICAgICAgICAgICAgIHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gdGhpcy5fcGFydHMuaG9zdG5hbWUucmVwbGFjZShyZXBsYWNlLCB2Myk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RMRCAiJyArIHYzICsgJyIgY29udGFpbnMgY2hhcmFjdGVycyBvdGhlciB0aGFuIFtBLVowLTldJyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9wYXJ0cy5ob3N0bmFtZSB8fCB0aGlzLmlzKCJJUCIpKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJjYW5ub3Qgc2V0IFRMRCBvbiBub24tZG9tYWluIGhvc3QiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXBsYWNlID0gbmV3IFJlZ0V4cChlc2NhcGVSZWdFeCh0aGlzLnRsZCgpKSArICIkIik7CiAgICAgICAgICAgICAgdGhpcy5fcGFydHMuaG9zdG5hbWUgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5yZXBsYWNlKHJlcGxhY2UsIHYzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmJ1aWxkKCFidWlsZCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcC5kaXJlY3RvcnkgPSBmdW5jdGlvbih2MywgYnVpbGQpIHsKICAgICAgICAgIGlmICh0aGlzLl9wYXJ0cy51cm4pIHsKICAgICAgICAgICAgcmV0dXJuIHYzID09PSB2b2lkIDAgPyAiIiA6IHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodjMgPT09IHZvaWQgMCB8fCB2MyA9PT0gdHJ1ZSkgewogICAgICAgICAgICBpZiAoIXRoaXMuX3BhcnRzLnBhdGggJiYgIXRoaXMuX3BhcnRzLmhvc3RuYW1lKSB7CiAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9wYXJ0cy5wYXRoID09PSAiLyIpIHsKICAgICAgICAgICAgICByZXR1cm4gIi8iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBlbmQgPSB0aGlzLl9wYXJ0cy5wYXRoLmxlbmd0aCAtIHRoaXMuZmlsZW5hbWUoKS5sZW5ndGggLSAxOwogICAgICAgICAgICB2YXIgcmVzID0gdGhpcy5fcGFydHMucGF0aC5zdWJzdHJpbmcoMCwgZW5kKSB8fCAodGhpcy5fcGFydHMuaG9zdG5hbWUgPyAiLyIgOiAiIik7CiAgICAgICAgICAgIHJldHVybiB2MyA/IFVSSS5kZWNvZGVQYXRoKHJlcykgOiByZXM7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgZSA9IHRoaXMuX3BhcnRzLnBhdGgubGVuZ3RoIC0gdGhpcy5maWxlbmFtZSgpLmxlbmd0aDsKICAgICAgICAgICAgdmFyIGRpcmVjdG9yeSA9IHRoaXMuX3BhcnRzLnBhdGguc3Vic3RyaW5nKDAsIGUpOwogICAgICAgICAgICB2YXIgcmVwbGFjZSA9IG5ldyBSZWdFeHAoIl4iICsgZXNjYXBlUmVnRXgoZGlyZWN0b3J5KSk7CiAgICAgICAgICAgIGlmICghdGhpcy5pcygicmVsYXRpdmUiKSkgewogICAgICAgICAgICAgIGlmICghdjMpIHsKICAgICAgICAgICAgICAgIHYzID0gIi8iOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodjMuY2hhckF0KDApICE9PSAiLyIpIHsKICAgICAgICAgICAgICAgIHYzID0gIi8iICsgdjM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2MyAmJiB2My5jaGFyQXQodjMubGVuZ3RoIC0gMSkgIT09ICIvIikgewogICAgICAgICAgICAgIHYzICs9ICIvIjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2MyA9IFVSSS5yZWNvZGVQYXRoKHYzKTsKICAgICAgICAgICAgdGhpcy5fcGFydHMucGF0aCA9IHRoaXMuX3BhcnRzLnBhdGgucmVwbGFjZShyZXBsYWNlLCB2Myk7CiAgICAgICAgICAgIHRoaXMuYnVpbGQoIWJ1aWxkKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwLmZpbGVuYW1lID0gZnVuY3Rpb24odjMsIGJ1aWxkKSB7CiAgICAgICAgICBpZiAodGhpcy5fcGFydHMudXJuKSB7CiAgICAgICAgICAgIHJldHVybiB2MyA9PT0gdm9pZCAwID8gIiIgOiB0aGlzOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHR5cGVvZiB2MyAhPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9wYXJ0cy5wYXRoIHx8IHRoaXMuX3BhcnRzLnBhdGggPT09ICIvIikgewogICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcG9zID0gdGhpcy5fcGFydHMucGF0aC5sYXN0SW5kZXhPZigiLyIpOwogICAgICAgICAgICB2YXIgcmVzID0gdGhpcy5fcGFydHMucGF0aC5zdWJzdHJpbmcocG9zICsgMSk7CiAgICAgICAgICAgIHJldHVybiB2MyA/IFVSSS5kZWNvZGVQYXRoU2VnbWVudChyZXMpIDogcmVzOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIG11dGF0ZWREaXJlY3RvcnkgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHYzLmNoYXJBdCgwKSA9PT0gIi8iKSB7CiAgICAgICAgICAgICAgdjMgPSB2My5zdWJzdHJpbmcoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHYzLm1hdGNoKC9cLj9cLy8pKSB7CiAgICAgICAgICAgICAgbXV0YXRlZERpcmVjdG9yeSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlcGxhY2UgPSBuZXcgUmVnRXhwKGVzY2FwZVJlZ0V4KHRoaXMuZmlsZW5hbWUoKSkgKyAiJCIpOwogICAgICAgICAgICB2MyA9IFVSSS5yZWNvZGVQYXRoKHYzKTsKICAgICAgICAgICAgdGhpcy5fcGFydHMucGF0aCA9IHRoaXMuX3BhcnRzLnBhdGgucmVwbGFjZShyZXBsYWNlLCB2Myk7CiAgICAgICAgICAgIGlmIChtdXRhdGVkRGlyZWN0b3J5KSB7CiAgICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVQYXRoKGJ1aWxkKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLmJ1aWxkKCFidWlsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwLnN1ZmZpeCA9IGZ1bmN0aW9uKHYzLCBidWlsZCkgewogICAgICAgICAgaWYgKHRoaXMuX3BhcnRzLnVybikgewogICAgICAgICAgICByZXR1cm4gdjMgPT09IHZvaWQgMCA/ICIiIDogdGhpczsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2MyA9PT0gdm9pZCAwIHx8IHYzID09PSB0cnVlKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fcGFydHMucGF0aCB8fCB0aGlzLl9wYXJ0cy5wYXRoID09PSAiLyIpIHsKICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGZpbGVuYW1lID0gdGhpcy5maWxlbmFtZSgpOwogICAgICAgICAgICB2YXIgcG9zID0gZmlsZW5hbWUubGFzdEluZGV4T2YoIi4iKTsKICAgICAgICAgICAgdmFyIHMsIHJlczsKICAgICAgICAgICAgaWYgKHBvcyA9PT0gLTEpIHsKICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcyA9IGZpbGVuYW1lLnN1YnN0cmluZyhwb3MgKyAxKTsKICAgICAgICAgICAgcmVzID0gL15bYS16MC05JV0rJC9pLnRlc3QocykgPyBzIDogIiI7CiAgICAgICAgICAgIHJldHVybiB2MyA/IFVSSS5kZWNvZGVQYXRoU2VnbWVudChyZXMpIDogcmVzOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHYzLmNoYXJBdCgwKSA9PT0gIi4iKSB7CiAgICAgICAgICAgICAgdjMgPSB2My5zdWJzdHJpbmcoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHN1ZmZpeCA9IHRoaXMuc3VmZml4KCk7CiAgICAgICAgICAgIHZhciByZXBsYWNlOwogICAgICAgICAgICBpZiAoIXN1ZmZpeCkgewogICAgICAgICAgICAgIGlmICghdjMpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLl9wYXJ0cy5wYXRoICs9ICIuIiArIFVSSS5yZWNvZGVQYXRoKHYzKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghdjMpIHsKICAgICAgICAgICAgICByZXBsYWNlID0gbmV3IFJlZ0V4cChlc2NhcGVSZWdFeCgiLiIgKyBzdWZmaXgpICsgIiQiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXBsYWNlID0gbmV3IFJlZ0V4cChlc2NhcGVSZWdFeChzdWZmaXgpICsgIiQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmVwbGFjZSkgewogICAgICAgICAgICAgIHYzID0gVVJJLnJlY29kZVBhdGgodjMpOwogICAgICAgICAgICAgIHRoaXMuX3BhcnRzLnBhdGggPSB0aGlzLl9wYXJ0cy5wYXRoLnJlcGxhY2UocmVwbGFjZSwgdjMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuYnVpbGQoIWJ1aWxkKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwLnNlZ21lbnQgPSBmdW5jdGlvbihzZWdtZW50LCB2MywgYnVpbGQpIHsKICAgICAgICAgIHZhciBzZXBhcmF0b3IgPSB0aGlzLl9wYXJ0cy51cm4gPyAiOiIgOiAiLyI7CiAgICAgICAgICB2YXIgcGF0aCA9IHRoaXMucGF0aCgpOwogICAgICAgICAgdmFyIGFic29sdXRlID0gcGF0aC5zdWJzdHJpbmcoMCwgMSkgPT09ICIvIjsKICAgICAgICAgIHZhciBzZWdtZW50cyA9IHBhdGguc3BsaXQoc2VwYXJhdG9yKTsKICAgICAgICAgIGlmIChzZWdtZW50ICE9PSB2b2lkIDAgJiYgdHlwZW9mIHNlZ21lbnQgIT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIGJ1aWxkID0gdjM7CiAgICAgICAgICAgIHYzID0gc2VnbWVudDsKICAgICAgICAgICAgc2VnbWVudCA9IHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzZWdtZW50ICE9PSB2b2lkIDAgJiYgdHlwZW9mIHNlZ21lbnQgIT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIHNlZ21lbnQgIicgKyBzZWdtZW50ICsgJyIsIG11c3QgYmUgMC1iYXNlZCBpbnRlZ2VyJyk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYWJzb2x1dGUpIHsKICAgICAgICAgICAgc2VnbWVudHMuc2hpZnQoKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzZWdtZW50IDwgMCkgewogICAgICAgICAgICBzZWdtZW50ID0gTWF0aC5tYXgoc2VnbWVudHMubGVuZ3RoICsgc2VnbWVudCwgMCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodjMgPT09IHZvaWQgMCkgewogICAgICAgICAgICByZXR1cm4gc2VnbWVudCA9PT0gdm9pZCAwID8gc2VnbWVudHMgOiBzZWdtZW50c1tzZWdtZW50XTsKICAgICAgICAgIH0gZWxzZSBpZiAoc2VnbWVudCA9PT0gbnVsbCB8fCBzZWdtZW50c1tzZWdtZW50XSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGlmIChpc0FycmF5KHYzKSkgewogICAgICAgICAgICAgIHNlZ21lbnRzID0gW107CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSB2My5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICghdjNbaV0ubGVuZ3RoICYmICghc2VnbWVudHMubGVuZ3RoIHx8ICFzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXS5sZW5ndGgpKSB7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNlZ21lbnRzLmxlbmd0aCAmJiAhc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV0ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgIHNlZ21lbnRzLnBvcCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2VnbWVudHMucHVzaCh0cmltU2xhc2hlcyh2M1tpXSkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICh2MyB8fCB0eXBlb2YgdjMgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgdjMgPSB0cmltU2xhc2hlcyh2Myk7CiAgICAgICAgICAgICAgaWYgKHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdID09PSAiIikgewogICAgICAgICAgICAgICAgc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV0gPSB2MzsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2VnbWVudHMucHVzaCh2Myk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAodjMpIHsKICAgICAgICAgICAgICBzZWdtZW50c1tzZWdtZW50XSA9IHRyaW1TbGFzaGVzKHYzKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzZWdtZW50cy5zcGxpY2Uoc2VnbWVudCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChhYnNvbHV0ZSkgewogICAgICAgICAgICBzZWdtZW50cy51bnNoaWZ0KCIiKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aGlzLnBhdGgoc2VnbWVudHMuam9pbihzZXBhcmF0b3IpLCBidWlsZCk7CiAgICAgICAgfTsKICAgICAgICBwLnNlZ21lbnRDb2RlZCA9IGZ1bmN0aW9uKHNlZ21lbnQsIHYzLCBidWlsZCkgewogICAgICAgICAgdmFyIHNlZ21lbnRzLCBpLCBsOwogICAgICAgICAgaWYgKHR5cGVvZiBzZWdtZW50ICE9PSAibnVtYmVyIikgewogICAgICAgICAgICBidWlsZCA9IHYzOwogICAgICAgICAgICB2MyA9IHNlZ21lbnQ7CiAgICAgICAgICAgIHNlZ21lbnQgPSB2b2lkIDA7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodjMgPT09IHZvaWQgMCkgewogICAgICAgICAgICBzZWdtZW50cyA9IHRoaXMuc2VnbWVudChzZWdtZW50LCB2MywgYnVpbGQpOwogICAgICAgICAgICBpZiAoIWlzQXJyYXkoc2VnbWVudHMpKSB7CiAgICAgICAgICAgICAgc2VnbWVudHMgPSBzZWdtZW50cyAhPT0gdm9pZCAwID8gVVJJLmRlY29kZShzZWdtZW50cykgOiB2b2lkIDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICAgICAgc2VnbWVudHNbaV0gPSBVUkkuZGVjb2RlKHNlZ21lbnRzW2ldKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlZ21lbnRzOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFpc0FycmF5KHYzKSkgewogICAgICAgICAgICB2MyA9IHR5cGVvZiB2MyA9PT0gInN0cmluZyIgfHwgdjMgaW5zdGFuY2VvZiBTdHJpbmcgPyBVUkkuZW5jb2RlKHYzKSA6IHYzOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IHYzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICAgIHYzW2ldID0gVVJJLmVuY29kZSh2M1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnQoc2VnbWVudCwgdjMsIGJ1aWxkKTsKICAgICAgICB9OwogICAgICAgIHZhciBxID0gcC5xdWVyeTsKICAgICAgICBwLnF1ZXJ5ID0gZnVuY3Rpb24odjMsIGJ1aWxkKSB7CiAgICAgICAgICBpZiAodjMgPT09IHRydWUpIHsKICAgICAgICAgICAgcmV0dXJuIFVSSS5wYXJzZVF1ZXJ5KHRoaXMuX3BhcnRzLnF1ZXJ5LCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTsKICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHYzID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIHZhciBkYXRhID0gVVJJLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gdjMuY2FsbCh0aGlzLCBkYXRhKTsKICAgICAgICAgICAgdGhpcy5fcGFydHMucXVlcnkgPSBVUkkuYnVpbGRRdWVyeShyZXN1bHQgfHwgZGF0YSwgdGhpcy5fcGFydHMuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTsKICAgICAgICAgICAgdGhpcy5idWlsZCghYnVpbGQpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIH0gZWxzZSBpZiAodjMgIT09IHZvaWQgMCAmJiB0eXBlb2YgdjMgIT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIHRoaXMuX3BhcnRzLnF1ZXJ5ID0gVVJJLmJ1aWxkUXVlcnkodjMsIHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycywgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7CiAgICAgICAgICAgIHRoaXMuYnVpbGQoIWJ1aWxkKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gcS5jYWxsKHRoaXMsIHYzLCBidWlsZCk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwLnNldFF1ZXJ5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIGJ1aWxkKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IFVSSS5wYXJzZVF1ZXJ5KHRoaXMuX3BhcnRzLnF1ZXJ5LCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTsKICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIgfHwgbmFtZSBpbnN0YW5jZW9mIFN0cmluZykgewogICAgICAgICAgICBkYXRhW25hbWVdID0gdmFsdWUgIT09IHZvaWQgMCA/IHZhbHVlIDogbnVsbDsKICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBuYW1lKSB7CiAgICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKG5hbWUsIGtleSkpIHsKICAgICAgICAgICAgICAgIGRhdGFba2V5XSA9IG5hbWVba2V5XTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlVSSS5hZGRRdWVyeSgpIGFjY2VwdHMgYW4gb2JqZWN0LCBzdHJpbmcgYXMgdGhlIG5hbWUgcGFyYW1ldGVyIik7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9wYXJ0cy5xdWVyeSA9IFVSSS5idWlsZFF1ZXJ5KGRhdGEsIHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycywgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7CiAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIGJ1aWxkID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmJ1aWxkKCFidWlsZCk7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIHAuYWRkUXVlcnkgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgYnVpbGQpIHsKICAgICAgICAgIHZhciBkYXRhID0gVVJJLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpOwogICAgICAgICAgVVJJLmFkZFF1ZXJ5KGRhdGEsIG5hbWUsIHZhbHVlID09PSB2b2lkIDAgPyBudWxsIDogdmFsdWUpOwogICAgICAgICAgdGhpcy5fcGFydHMucXVlcnkgPSBVUkkuYnVpbGRRdWVyeShkYXRhLCB0aGlzLl9wYXJ0cy5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpOwogICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAic3RyaW5nIikgewogICAgICAgICAgICBidWlsZCA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5idWlsZCghYnVpbGQpOwogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBwLnJlbW92ZVF1ZXJ5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIGJ1aWxkKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IFVSSS5wYXJzZVF1ZXJ5KHRoaXMuX3BhcnRzLnF1ZXJ5LCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTsKICAgICAgICAgIFVSSS5yZW1vdmVRdWVyeShkYXRhLCBuYW1lLCB2YWx1ZSk7CiAgICAgICAgICB0aGlzLl9wYXJ0cy5xdWVyeSA9IFVSSS5idWlsZFF1ZXJ5KGRhdGEsIHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycywgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7CiAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIGJ1aWxkID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmJ1aWxkKCFidWlsZCk7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIHAuaGFzUXVlcnkgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgd2l0aGluQXJyYXkpIHsKICAgICAgICAgIHZhciBkYXRhID0gVVJJLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpOwogICAgICAgICAgcmV0dXJuIFVSSS5oYXNRdWVyeShkYXRhLCBuYW1lLCB2YWx1ZSwgd2l0aGluQXJyYXkpOwogICAgICAgIH07CiAgICAgICAgcC5zZXRTZWFyY2ggPSBwLnNldFF1ZXJ5OwogICAgICAgIHAuYWRkU2VhcmNoID0gcC5hZGRRdWVyeTsKICAgICAgICBwLnJlbW92ZVNlYXJjaCA9IHAucmVtb3ZlUXVlcnk7CiAgICAgICAgcC5oYXNTZWFyY2ggPSBwLmhhc1F1ZXJ5OwogICAgICAgIHAubm9ybWFsaXplID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAodGhpcy5fcGFydHMudXJuKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZVByb3RvY29sKGZhbHNlKS5ub3JtYWxpemVQYXRoKGZhbHNlKS5ub3JtYWxpemVRdWVyeShmYWxzZSkubm9ybWFsaXplRnJhZ21lbnQoZmFsc2UpLmJ1aWxkKCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVQcm90b2NvbChmYWxzZSkubm9ybWFsaXplSG9zdG5hbWUoZmFsc2UpLm5vcm1hbGl6ZVBvcnQoZmFsc2UpLm5vcm1hbGl6ZVBhdGgoZmFsc2UpLm5vcm1hbGl6ZVF1ZXJ5KGZhbHNlKS5ub3JtYWxpemVGcmFnbWVudChmYWxzZSkuYnVpbGQoKTsKICAgICAgICB9OwogICAgICAgIHAubm9ybWFsaXplUHJvdG9jb2wgPSBmdW5jdGlvbihidWlsZCkgewogICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9wYXJ0cy5wcm90b2NvbCA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgdGhpcy5fcGFydHMucHJvdG9jb2wgPSB0aGlzLl9wYXJ0cy5wcm90b2NvbC50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICB0aGlzLmJ1aWxkKCFidWlsZCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIHAubm9ybWFsaXplSG9zdG5hbWUgPSBmdW5jdGlvbihidWlsZCkgewogICAgICAgICAgaWYgKHRoaXMuX3BhcnRzLmhvc3RuYW1lKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzKCJJRE4iKSAmJiBwdW55Y29kZSkgewogICAgICAgICAgICAgIHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gcHVueWNvZGUudG9BU0NJSSh0aGlzLl9wYXJ0cy5ob3N0bmFtZSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pcygiSVB2NiIpICYmIElQdjYpIHsKICAgICAgICAgICAgICB0aGlzLl9wYXJ0cy5ob3N0bmFtZSA9IElQdjYuYmVzdCh0aGlzLl9wYXJ0cy5ob3N0bmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcGFydHMuaG9zdG5hbWUgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICB0aGlzLmJ1aWxkKCFidWlsZCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIHAubm9ybWFsaXplUG9ydCA9IGZ1bmN0aW9uKGJ1aWxkKSB7CiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3BhcnRzLnByb3RvY29sID09PSAic3RyaW5nIiAmJiB0aGlzLl9wYXJ0cy5wb3J0ID09PSBVUkkuZGVmYXVsdFBvcnRzW3RoaXMuX3BhcnRzLnByb3RvY29sXSkgewogICAgICAgICAgICB0aGlzLl9wYXJ0cy5wb3J0ID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5idWlsZCghYnVpbGQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBwLm5vcm1hbGl6ZVBhdGggPSBmdW5jdGlvbihidWlsZCkgewogICAgICAgICAgdmFyIF9wYXRoID0gdGhpcy5fcGFydHMucGF0aDsKICAgICAgICAgIGlmICghX3BhdGgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy5fcGFydHMudXJuKSB7CiAgICAgICAgICAgIHRoaXMuX3BhcnRzLnBhdGggPSBVUkkucmVjb2RlVXJuUGF0aCh0aGlzLl9wYXJ0cy5wYXRoKTsKICAgICAgICAgICAgdGhpcy5idWlsZCghYnVpbGQpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLl9wYXJ0cy5wYXRoID09PSAiLyIpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgICBfcGF0aCA9IFVSSS5yZWNvZGVQYXRoKF9wYXRoKTsKICAgICAgICAgIHZhciBfd2FzX3JlbGF0aXZlOwogICAgICAgICAgdmFyIF9sZWFkaW5nUGFyZW50cyA9ICIiOwogICAgICAgICAgdmFyIF9wYXJlbnQsIF9wb3M7CiAgICAgICAgICBpZiAoX3BhdGguY2hhckF0KDApICE9PSAiLyIpIHsKICAgICAgICAgICAgX3dhc19yZWxhdGl2ZSA9IHRydWU7CiAgICAgICAgICAgIF9wYXRoID0gIi8iICsgX3BhdGg7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoX3BhdGguc2xpY2UoLTMpID09PSAiLy4uIiB8fCBfcGF0aC5zbGljZSgtMikgPT09ICIvLiIpIHsKICAgICAgICAgICAgX3BhdGggKz0gIi8iOwogICAgICAgICAgfQogICAgICAgICAgX3BhdGggPSBfcGF0aC5yZXBsYWNlKC8oXC8oXC5cLykrKXwoXC9cLiQpL2csICIvIikucmVwbGFjZSgvXC97Mix9L2csICIvIik7CiAgICAgICAgICBpZiAoX3dhc19yZWxhdGl2ZSkgewogICAgICAgICAgICBfbGVhZGluZ1BhcmVudHMgPSBfcGF0aC5zdWJzdHJpbmcoMSkubWF0Y2goL14oXC5cLlwvKSsvKSB8fCAiIjsKICAgICAgICAgICAgaWYgKF9sZWFkaW5nUGFyZW50cykgewogICAgICAgICAgICAgIF9sZWFkaW5nUGFyZW50cyA9IF9sZWFkaW5nUGFyZW50c1swXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgX3BhcmVudCA9IF9wYXRoLnNlYXJjaCgvXC9cLlwuKFwvfCQpLyk7CiAgICAgICAgICAgIGlmIChfcGFyZW50ID09PSAtMSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9IGVsc2UgaWYgKF9wYXJlbnQgPT09IDApIHsKICAgICAgICAgICAgICBfcGF0aCA9IF9wYXRoLnN1YnN0cmluZygzKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfcG9zID0gX3BhdGguc3Vic3RyaW5nKDAsIF9wYXJlbnQpLmxhc3RJbmRleE9mKCIvIik7CiAgICAgICAgICAgIGlmIChfcG9zID09PSAtMSkgewogICAgICAgICAgICAgIF9wb3MgPSBfcGFyZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9wYXRoID0gX3BhdGguc3Vic3RyaW5nKDAsIF9wb3MpICsgX3BhdGguc3Vic3RyaW5nKF9wYXJlbnQgKyAzKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChfd2FzX3JlbGF0aXZlICYmIHRoaXMuaXMoInJlbGF0aXZlIikpIHsKICAgICAgICAgICAgX3BhdGggPSBfbGVhZGluZ1BhcmVudHMgKyBfcGF0aC5zdWJzdHJpbmcoMSk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9wYXJ0cy5wYXRoID0gX3BhdGg7CiAgICAgICAgICB0aGlzLmJ1aWxkKCFidWlsZCk7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIHAubm9ybWFsaXplUGF0aG5hbWUgPSBwLm5vcm1hbGl6ZVBhdGg7CiAgICAgICAgcC5ub3JtYWxpemVRdWVyeSA9IGZ1bmN0aW9uKGJ1aWxkKSB7CiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3BhcnRzLnF1ZXJ5ID09PSAic3RyaW5nIikgewogICAgICAgICAgICBpZiAoIXRoaXMuX3BhcnRzLnF1ZXJ5Lmxlbmd0aCkgewogICAgICAgICAgICAgIHRoaXMuX3BhcnRzLnF1ZXJ5ID0gbnVsbDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLnF1ZXJ5KFVSSS5wYXJzZVF1ZXJ5KHRoaXMuX3BhcnRzLnF1ZXJ5LCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5idWlsZCghYnVpbGQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBwLm5vcm1hbGl6ZUZyYWdtZW50ID0gZnVuY3Rpb24oYnVpbGQpIHsKICAgICAgICAgIGlmICghdGhpcy5fcGFydHMuZnJhZ21lbnQpIHsKICAgICAgICAgICAgdGhpcy5fcGFydHMuZnJhZ21lbnQgPSBudWxsOwogICAgICAgICAgICB0aGlzLmJ1aWxkKCFidWlsZCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIHAubm9ybWFsaXplU2VhcmNoID0gcC5ub3JtYWxpemVRdWVyeTsKICAgICAgICBwLm5vcm1hbGl6ZUhhc2ggPSBwLm5vcm1hbGl6ZUZyYWdtZW50OwogICAgICAgIHAuaXNvODg1OSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGUgPSBVUkkuZW5jb2RlOwogICAgICAgICAgdmFyIGQgPSBVUkkuZGVjb2RlOwogICAgICAgICAgVVJJLmVuY29kZSA9IGVzY2FwZTsKICAgICAgICAgIFVSSS5kZWNvZGUgPSBkZWNvZGVVUklDb21wb25lbnQ7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZSgpOwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgVVJJLmVuY29kZSA9IGU7CiAgICAgICAgICAgIFVSSS5kZWNvZGUgPSBkOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBwLnVuaWNvZGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBlID0gVVJJLmVuY29kZTsKICAgICAgICAgIHZhciBkID0gVVJJLmRlY29kZTsKICAgICAgICAgIFVSSS5lbmNvZGUgPSBzdHJpY3RFbmNvZGVVUklDb21wb25lbnQ7CiAgICAgICAgICBVUkkuZGVjb2RlID0gdW5lc2NhcGU7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZSgpOwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgVVJJLmVuY29kZSA9IGU7CiAgICAgICAgICAgIFVSSS5kZWNvZGUgPSBkOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBwLnJlYWRhYmxlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgdXJpID0gdGhpcy5jbG9uZSgpOwogICAgICAgICAgdXJpLnVzZXJuYW1lKCIiKS5wYXNzd29yZCgiIikubm9ybWFsaXplKCk7CiAgICAgICAgICB2YXIgdCA9ICIiOwogICAgICAgICAgaWYgKHVyaS5fcGFydHMucHJvdG9jb2wpIHsKICAgICAgICAgICAgdCArPSB1cmkuX3BhcnRzLnByb3RvY29sICsgIjovLyI7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodXJpLl9wYXJ0cy5ob3N0bmFtZSkgewogICAgICAgICAgICBpZiAodXJpLmlzKCJwdW55Y29kZSIpICYmIHB1bnljb2RlKSB7CiAgICAgICAgICAgICAgdCArPSBwdW55Y29kZS50b1VuaWNvZGUodXJpLl9wYXJ0cy5ob3N0bmFtZSk7CiAgICAgICAgICAgICAgaWYgKHVyaS5fcGFydHMucG9ydCkgewogICAgICAgICAgICAgICAgdCArPSAiOiIgKyB1cmkuX3BhcnRzLnBvcnQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHQgKz0gdXJpLmhvc3QoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHVyaS5fcGFydHMuaG9zdG5hbWUgJiYgdXJpLl9wYXJ0cy5wYXRoICYmIHVyaS5fcGFydHMucGF0aC5jaGFyQXQoMCkgIT09ICIvIikgewogICAgICAgICAgICB0ICs9ICIvIjsKICAgICAgICAgIH0KICAgICAgICAgIHQgKz0gdXJpLnBhdGgodHJ1ZSk7CiAgICAgICAgICBpZiAodXJpLl9wYXJ0cy5xdWVyeSkgewogICAgICAgICAgICB2YXIgcTMgPSAiIjsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIHFwID0gdXJpLl9wYXJ0cy5xdWVyeS5zcGxpdCgiJiIpLCBsID0gcXAubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgdmFyIGt2ID0gKHFwW2ldIHx8ICIiKS5zcGxpdCgiPSIpOwogICAgICAgICAgICAgIHEzICs9ICImIiArIFVSSS5kZWNvZGVRdWVyeShrdlswXSwgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSkucmVwbGFjZSgvJi9nLCAiJTI2Iik7CiAgICAgICAgICAgICAgaWYgKGt2WzFdICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgICAgIHEzICs9ICI9IiArIFVSSS5kZWNvZGVRdWVyeShrdlsxXSwgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSkucmVwbGFjZSgvJi9nLCAiJTI2Iik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHQgKz0gIj8iICsgcTMuc3Vic3RyaW5nKDEpOwogICAgICAgICAgfQogICAgICAgICAgdCArPSBVUkkuZGVjb2RlUXVlcnkodXJpLmhhc2goKSwgdHJ1ZSk7CiAgICAgICAgICByZXR1cm4gdDsKICAgICAgICB9OwogICAgICAgIHAuYWJzb2x1dGVUbyA9IGZ1bmN0aW9uKGJhc2UpIHsKICAgICAgICAgIHZhciByZXNvbHZlZCA9IHRoaXMuY2xvbmUoKTsKICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gWyJwcm90b2NvbCIsICJ1c2VybmFtZSIsICJwYXNzd29yZCIsICJob3N0bmFtZSIsICJwb3J0Il07CiAgICAgICAgICB2YXIgYmFzZWRpciwgaSwgcDI7CiAgICAgICAgICBpZiAodGhpcy5fcGFydHMudXJuKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVVJOcyBkbyBub3QgaGF2ZSBhbnkgZ2VuZXJhbGx5IGRlZmluZWQgaGllcmFyY2hpY2FsIGNvbXBvbmVudHMiKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghKGJhc2UgaW5zdGFuY2VvZiBVUkkpKSB7CiAgICAgICAgICAgIGJhc2UgPSBuZXcgVVJJKGJhc2UpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHJlc29sdmVkLl9wYXJ0cy5wcm90b2NvbCkgewogICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXNvbHZlZC5fcGFydHMucHJvdG9jb2wgPSBiYXNlLl9wYXJ0cy5wcm90b2NvbDsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLl9wYXJ0cy5ob3N0bmFtZSkgewogICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGkgPSAwOyBwMiA9IHByb3BlcnRpZXNbaV07IGkrKykgewogICAgICAgICAgICByZXNvbHZlZC5fcGFydHNbcDJdID0gYmFzZS5fcGFydHNbcDJdOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFyZXNvbHZlZC5fcGFydHMucGF0aCkgewogICAgICAgICAgICByZXNvbHZlZC5fcGFydHMucGF0aCA9IGJhc2UuX3BhcnRzLnBhdGg7CiAgICAgICAgICAgIGlmICghcmVzb2x2ZWQuX3BhcnRzLnF1ZXJ5KSB7CiAgICAgICAgICAgICAgcmVzb2x2ZWQuX3BhcnRzLnF1ZXJ5ID0gYmFzZS5fcGFydHMucXVlcnk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChyZXNvbHZlZC5fcGFydHMucGF0aC5zdWJzdHJpbmcoLTIpID09PSAiLi4iKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZWQuX3BhcnRzLnBhdGggKz0gIi8iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZXNvbHZlZC5wYXRoKCkuY2hhckF0KDApICE9PSAiLyIpIHsKICAgICAgICAgICAgICBiYXNlZGlyID0gYmFzZS5kaXJlY3RvcnkoKTsKICAgICAgICAgICAgICBiYXNlZGlyID0gYmFzZWRpciA/IGJhc2VkaXIgOiBiYXNlLnBhdGgoKS5pbmRleE9mKCIvIikgPT09IDAgPyAiLyIgOiAiIjsKICAgICAgICAgICAgICByZXNvbHZlZC5fcGFydHMucGF0aCA9IChiYXNlZGlyID8gYmFzZWRpciArICIvIiA6ICIiKSArIHJlc29sdmVkLl9wYXJ0cy5wYXRoOwogICAgICAgICAgICAgIHJlc29sdmVkLm5vcm1hbGl6ZVBhdGgoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmVzb2x2ZWQuYnVpbGQoKTsKICAgICAgICAgIHJldHVybiByZXNvbHZlZDsKICAgICAgICB9OwogICAgICAgIHAucmVsYXRpdmVUbyA9IGZ1bmN0aW9uKGJhc2UpIHsKICAgICAgICAgIHZhciByZWxhdGl2ZSA9IHRoaXMuY2xvbmUoKS5ub3JtYWxpemUoKTsKICAgICAgICAgIHZhciByZWxhdGl2ZVBhcnRzLCBiYXNlUGFydHMsIGNvbW1vbiwgcmVsYXRpdmVQYXRoLCBiYXNlUGF0aDsKICAgICAgICAgIGlmIChyZWxhdGl2ZS5fcGFydHMudXJuKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVVJOcyBkbyBub3QgaGF2ZSBhbnkgZ2VuZXJhbGx5IGRlZmluZWQgaGllcmFyY2hpY2FsIGNvbXBvbmVudHMiKTsKICAgICAgICAgIH0KICAgICAgICAgIGJhc2UgPSBuZXcgVVJJKGJhc2UpLm5vcm1hbGl6ZSgpOwogICAgICAgICAgcmVsYXRpdmVQYXJ0cyA9IHJlbGF0aXZlLl9wYXJ0czsKICAgICAgICAgIGJhc2VQYXJ0cyA9IGJhc2UuX3BhcnRzOwogICAgICAgICAgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUucGF0aCgpOwogICAgICAgICAgYmFzZVBhdGggPSBiYXNlLnBhdGgoKTsKICAgICAgICAgIGlmIChyZWxhdGl2ZVBhdGguY2hhckF0KDApICE9PSAiLyIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVUkkgaXMgYWxyZWFkeSByZWxhdGl2ZSIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGJhc2VQYXRoLmNoYXJBdCgwKSAhPT0gIi8iKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNhbGN1bGF0ZSBhIFVSSSByZWxhdGl2ZSB0byBhbm90aGVyIHJlbGF0aXZlIFVSSSIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHJlbGF0aXZlUGFydHMucHJvdG9jb2wgPT09IGJhc2VQYXJ0cy5wcm90b2NvbCkgewogICAgICAgICAgICByZWxhdGl2ZVBhcnRzLnByb3RvY29sID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChyZWxhdGl2ZVBhcnRzLnVzZXJuYW1lICE9PSBiYXNlUGFydHMudXNlcm5hbWUgfHwgcmVsYXRpdmVQYXJ0cy5wYXNzd29yZCAhPT0gYmFzZVBhcnRzLnBhc3N3b3JkKSB7CiAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZS5idWlsZCgpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHJlbGF0aXZlUGFydHMucHJvdG9jb2wgIT09IG51bGwgfHwgcmVsYXRpdmVQYXJ0cy51c2VybmFtZSAhPT0gbnVsbCB8fCByZWxhdGl2ZVBhcnRzLnBhc3N3b3JkICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZS5idWlsZCgpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHJlbGF0aXZlUGFydHMuaG9zdG5hbWUgPT09IGJhc2VQYXJ0cy5ob3N0bmFtZSAmJiByZWxhdGl2ZVBhcnRzLnBvcnQgPT09IGJhc2VQYXJ0cy5wb3J0KSB7CiAgICAgICAgICAgIHJlbGF0aXZlUGFydHMuaG9zdG5hbWUgPSBudWxsOwogICAgICAgICAgICByZWxhdGl2ZVBhcnRzLnBvcnQgPSBudWxsOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHJlbGF0aXZlLmJ1aWxkKCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocmVsYXRpdmVQYXRoID09PSBiYXNlUGF0aCkgewogICAgICAgICAgICByZWxhdGl2ZVBhcnRzLnBhdGggPSAiIjsKICAgICAgICAgICAgcmV0dXJuIHJlbGF0aXZlLmJ1aWxkKCk7CiAgICAgICAgICB9CiAgICAgICAgICBjb21tb24gPSBVUkkuY29tbW9uUGF0aChyZWxhdGl2ZVBhdGgsIGJhc2VQYXRoKTsKICAgICAgICAgIGlmICghY29tbW9uKSB7CiAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZS5idWlsZCgpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHBhcmVudHMgPSBiYXNlUGFydHMucGF0aC5zdWJzdHJpbmcoY29tbW9uLmxlbmd0aCkucmVwbGFjZSgvW15cL10qJC8sICIiKS5yZXBsYWNlKC8uKj9cLy9nLCAiLi4vIik7CiAgICAgICAgICByZWxhdGl2ZVBhcnRzLnBhdGggPSBwYXJlbnRzICsgcmVsYXRpdmVQYXJ0cy5wYXRoLnN1YnN0cmluZyhjb21tb24ubGVuZ3RoKSB8fCAiLi8iOwogICAgICAgICAgcmV0dXJuIHJlbGF0aXZlLmJ1aWxkKCk7CiAgICAgICAgfTsKICAgICAgICBwLmVxdWFscyA9IGZ1bmN0aW9uKHVyaSkgewogICAgICAgICAgdmFyIG9uZSA9IHRoaXMuY2xvbmUoKTsKICAgICAgICAgIHZhciB0d28gPSBuZXcgVVJJKHVyaSk7CiAgICAgICAgICB2YXIgb25lX21hcCA9IHt9OwogICAgICAgICAgdmFyIHR3b19tYXAgPSB7fTsKICAgICAgICAgIHZhciBjaGVja2VkID0ge307CiAgICAgICAgICB2YXIgb25lX3F1ZXJ5LCB0d29fcXVlcnksIGtleTsKICAgICAgICAgIG9uZS5ub3JtYWxpemUoKTsKICAgICAgICAgIHR3by5ub3JtYWxpemUoKTsKICAgICAgICAgIGlmIChvbmUudG9TdHJpbmcoKSA9PT0gdHdvLnRvU3RyaW5nKCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBvbmVfcXVlcnkgPSBvbmUucXVlcnkoKTsKICAgICAgICAgIHR3b19xdWVyeSA9IHR3by5xdWVyeSgpOwogICAgICAgICAgb25lLnF1ZXJ5KCIiKTsKICAgICAgICAgIHR3by5xdWVyeSgiIik7CiAgICAgICAgICBpZiAob25lLnRvU3RyaW5nKCkgIT09IHR3by50b1N0cmluZygpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChvbmVfcXVlcnkubGVuZ3RoICE9PSB0d29fcXVlcnkubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIG9uZV9tYXAgPSBVUkkucGFyc2VRdWVyeShvbmVfcXVlcnksIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpOwogICAgICAgICAgdHdvX21hcCA9IFVSSS5wYXJzZVF1ZXJ5KHR3b19xdWVyeSwgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7CiAgICAgICAgICBmb3IgKGtleSBpbiBvbmVfbWFwKSB7CiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChvbmVfbWFwLCBrZXkpKSB7CiAgICAgICAgICAgICAgaWYgKCFpc0FycmF5KG9uZV9tYXBba2V5XSkpIHsKICAgICAgICAgICAgICAgIGlmIChvbmVfbWFwW2tleV0gIT09IHR3b19tYXBba2V5XSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIGlmICghYXJyYXlzRXF1YWwob25lX21hcFtrZXldLCB0d29fbWFwW2tleV0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNoZWNrZWRba2V5XSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZvciAoa2V5IGluIHR3b19tYXApIHsKICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKHR3b19tYXAsIGtleSkpIHsKICAgICAgICAgICAgICBpZiAoIWNoZWNrZWRba2V5XSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfTsKICAgICAgICBwLnByZXZlbnRJbnZhbGlkSG9zdG5hbWUgPSBmdW5jdGlvbih2MykgewogICAgICAgICAgdGhpcy5fcGFydHMucHJldmVudEludmFsaWRIb3N0bmFtZSA9ICEhdjM7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIHAuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzID0gZnVuY3Rpb24odjMpIHsKICAgICAgICAgIHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyA9ICEhdjM7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIHAuZXNjYXBlUXVlcnlTcGFjZSA9IGZ1bmN0aW9uKHYzKSB7CiAgICAgICAgICB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlID0gISF2MzsKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIFVSSTsKICAgICAgfSk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9hcHBlbmRGb3J3YXJkU2xhc2guanMKICBmdW5jdGlvbiBhcHBlbmRGb3J3YXJkU2xhc2godXJsKSB7CiAgICBpZiAodXJsLmxlbmd0aCA9PT0gMCB8fCB1cmxbdXJsLmxlbmd0aCAtIDFdICE9PSAiLyIpIHsKICAgICAgdXJsID0gYCR7dXJsfS9gOwogICAgfQogICAgcmV0dXJuIHVybDsKICB9CiAgdmFyIGFwcGVuZEZvcndhcmRTbGFzaF9kZWZhdWx0OwogIHZhciBpbml0X2FwcGVuZEZvcndhcmRTbGFzaCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvYXBwZW5kRm9yd2FyZFNsYXNoLmpzIigpIHsKICAgICAgYXBwZW5kRm9yd2FyZFNsYXNoX2RlZmF1bHQgPSBhcHBlbmRGb3J3YXJkU2xhc2g7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9jbG9uZS5qcwogIGZ1bmN0aW9uIGNsb25lKG9iamVjdCwgZGVlcCkgewogICAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqZWN0ICE9PSAib2JqZWN0IikgewogICAgICByZXR1cm4gb2JqZWN0OwogICAgfQogICAgZGVlcCA9IGRlZXAgPz8gZmFsc2U7CiAgICBjb25zdCByZXN1bHQgPSBuZXcgb2JqZWN0LmNvbnN0cnVjdG9yKCk7CiAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBpbiBvYmplY3QpIHsKICAgICAgaWYgKG9iamVjdC5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSB7CiAgICAgICAgbGV0IHZhbHVlID0gb2JqZWN0W3Byb3BlcnR5TmFtZV07CiAgICAgICAgaWYgKGRlZXApIHsKICAgICAgICAgIHZhbHVlID0gY2xvbmUodmFsdWUsIGRlZXApOwogICAgICAgIH0KICAgICAgICByZXN1bHRbcHJvcGVydHlOYW1lXSA9IHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICB2YXIgY2xvbmVfZGVmYXVsdDsKICB2YXIgaW5pdF9jbG9uZSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvY2xvbmUuanMiKCkgewogICAgICBjbG9uZV9kZWZhdWx0ID0gY2xvbmU7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9jb21iaW5lLmpzCiAgZnVuY3Rpb24gY29tYmluZShvYmplY3QxLCBvYmplY3QyLCBkZWVwKSB7CiAgICBkZWVwID0gZGVlcCA/PyBmYWxzZTsKICAgIGNvbnN0IHJlc3VsdCA9IHt9OwogICAgY29uc3Qgb2JqZWN0MURlZmluZWQgPSBkZWZpbmVkX2RlZmF1bHQob2JqZWN0MSk7CiAgICBjb25zdCBvYmplY3QyRGVmaW5lZCA9IGRlZmluZWRfZGVmYXVsdChvYmplY3QyKTsKICAgIGxldCBwcm9wZXJ0eTsKICAgIGxldCBvYmplY3QxVmFsdWU7CiAgICBsZXQgb2JqZWN0MlZhbHVlOwogICAgaWYgKG9iamVjdDFEZWZpbmVkKSB7CiAgICAgIGZvciAocHJvcGVydHkgaW4gb2JqZWN0MSkgewogICAgICAgIGlmIChvYmplY3QxLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkgewogICAgICAgICAgb2JqZWN0MVZhbHVlID0gb2JqZWN0MVtwcm9wZXJ0eV07CiAgICAgICAgICBpZiAob2JqZWN0MkRlZmluZWQgJiYgZGVlcCAmJiB0eXBlb2Ygb2JqZWN0MVZhbHVlID09PSAib2JqZWN0IiAmJiBvYmplY3QyLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkgewogICAgICAgICAgICBvYmplY3QyVmFsdWUgPSBvYmplY3QyW3Byb3BlcnR5XTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QyVmFsdWUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgICAgcmVzdWx0W3Byb3BlcnR5XSA9IGNvbWJpbmUob2JqZWN0MVZhbHVlLCBvYmplY3QyVmFsdWUsIGRlZXApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlc3VsdFtwcm9wZXJ0eV0gPSBvYmplY3QxVmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdFtwcm9wZXJ0eV0gPSBvYmplY3QxVmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAob2JqZWN0MkRlZmluZWQpIHsKICAgICAgZm9yIChwcm9wZXJ0eSBpbiBvYmplY3QyKSB7CiAgICAgICAgaWYgKG9iamVjdDIuaGFzT3duUHJvcGVydHkocHJvcGVydHkpICYmICFyZXN1bHQuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7CiAgICAgICAgICBvYmplY3QyVmFsdWUgPSBvYmplY3QyW3Byb3BlcnR5XTsKICAgICAgICAgIHJlc3VsdFtwcm9wZXJ0eV0gPSBvYmplY3QyVmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICB2YXIgY29tYmluZV9kZWZhdWx0OwogIHZhciBpbml0X2NvbWJpbmUgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2NvbWJpbmUuanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgY29tYmluZV9kZWZhdWx0ID0gY29tYmluZTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2RlZmVyLmpzCiAgZnVuY3Rpb24gZGVmZXIoKSB7CiAgICBsZXQgcmVzb2x2ZTsKICAgIGxldCByZWplY3Q7CiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzLCByZWopIHsKICAgICAgcmVzb2x2ZSA9IHJlczsKICAgICAgcmVqZWN0ID0gcmVqOwogICAgfSk7CiAgICByZXR1cm4gewogICAgICByZXNvbHZlLAogICAgICByZWplY3QsCiAgICAgIHByb21pc2UKICAgIH07CiAgfQogIHZhciBkZWZlcl9kZWZhdWx0OwogIHZhciBpbml0X2RlZmVyID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9kZWZlci5qcyIoKSB7CiAgICAgIGRlZmVyX2RlZmF1bHQgPSBkZWZlcjsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2dldEFic29sdXRlVXJpLmpzCiAgZnVuY3Rpb24gZ2V0QWJzb2x1dGVVcmkocmVsYXRpdmUsIGJhc2UpIHsKICAgIGxldCBkb2N1bWVudE9iamVjdDsKICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50T2JqZWN0ID0gZG9jdW1lbnQ7CiAgICB9CiAgICByZXR1cm4gZ2V0QWJzb2x1dGVVcmkuX2ltcGxlbWVudGF0aW9uKHJlbGF0aXZlLCBiYXNlLCBkb2N1bWVudE9iamVjdCk7CiAgfQogIHZhciBpbXBvcnRfdXJpanMsIGdldEFic29sdXRlVXJpX2RlZmF1bHQ7CiAgdmFyIGluaXRfZ2V0QWJzb2x1dGVVcmkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2dldEFic29sdXRlVXJpLmpzIigpIHsKICAgICAgaW1wb3J0X3VyaWpzID0gX190b0VTTShyZXF1aXJlX1VSSSgpLCAxKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgZ2V0QWJzb2x1dGVVcmkuX2ltcGxlbWVudGF0aW9uID0gZnVuY3Rpb24ocmVsYXRpdmUsIGJhc2UsIGRvY3VtZW50T2JqZWN0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVsYXRpdmUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgicmVsYXRpdmUgdXJpIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChiYXNlKSkgewogICAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudE9iamVjdCA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgcmV0dXJuIHJlbGF0aXZlOwogICAgICAgICAgfQogICAgICAgICAgYmFzZSA9IGRvY3VtZW50T2JqZWN0LmJhc2VVUkkgPz8gZG9jdW1lbnRPYmplY3QubG9jYXRpb24uaHJlZjsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVsYXRpdmVVcmkgPSBuZXcgaW1wb3J0X3VyaWpzLmRlZmF1bHQocmVsYXRpdmUpOwogICAgICAgIGlmIChyZWxhdGl2ZVVyaS5zY2hlbWUoKSAhPT0gIiIpIHsKICAgICAgICAgIHJldHVybiByZWxhdGl2ZVVyaS50b1N0cmluZygpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVsYXRpdmVVcmkuYWJzb2x1dGVUbyhiYXNlKS50b1N0cmluZygpOwogICAgICB9OwogICAgICBnZXRBYnNvbHV0ZVVyaV9kZWZhdWx0ID0gZ2V0QWJzb2x1dGVVcmk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9nZXRCYXNlVXJpLmpzCiAgZnVuY3Rpb24gZ2V0QmFzZVVyaSh1cmksIGluY2x1ZGVRdWVyeSkgewogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodXJpKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgidXJpIGlzIHJlcXVpcmVkLiIpOwogICAgfQogICAgbGV0IGJhc2VQYXRoID0gIiI7CiAgICBjb25zdCBpID0gdXJpLmxhc3RJbmRleE9mKCIvIik7CiAgICBpZiAoaSAhPT0gLTEpIHsKICAgICAgYmFzZVBhdGggPSB1cmkuc3Vic3RyaW5nKDAsIGkgKyAxKTsKICAgIH0KICAgIGlmICghaW5jbHVkZVF1ZXJ5KSB7CiAgICAgIHJldHVybiBiYXNlUGF0aDsKICAgIH0KICAgIHVyaSA9IG5ldyBpbXBvcnRfdXJpanMyLmRlZmF1bHQodXJpKTsKICAgIGlmICh1cmkucXVlcnkoKS5sZW5ndGggIT09IDApIHsKICAgICAgYmFzZVBhdGggKz0gYD8ke3VyaS5xdWVyeSgpfWA7CiAgICB9CiAgICBpZiAodXJpLmZyYWdtZW50KCkubGVuZ3RoICE9PSAwKSB7CiAgICAgIGJhc2VQYXRoICs9IGAjJHt1cmkuZnJhZ21lbnQoKX1gOwogICAgfQogICAgcmV0dXJuIGJhc2VQYXRoOwogIH0KICB2YXIgaW1wb3J0X3VyaWpzMiwgZ2V0QmFzZVVyaV9kZWZhdWx0OwogIHZhciBpbml0X2dldEJhc2VVcmkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2dldEJhc2VVcmkuanMiKCkgewogICAgICBpbXBvcnRfdXJpanMyID0gX190b0VTTShyZXF1aXJlX1VSSSgpLCAxKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgZ2V0QmFzZVVyaV9kZWZhdWx0ID0gZ2V0QmFzZVVyaTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2dldEV4dGVuc2lvbkZyb21VcmkuanMKICBmdW5jdGlvbiBnZXRFeHRlbnNpb25Gcm9tVXJpKHVyaSkgewogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodXJpKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgidXJpIGlzIHJlcXVpcmVkLiIpOwogICAgfQogICAgY29uc3QgdXJpT2JqZWN0ID0gbmV3IGltcG9ydF91cmlqczMuZGVmYXVsdCh1cmkpOwogICAgdXJpT2JqZWN0Lm5vcm1hbGl6ZSgpOwogICAgbGV0IHBhdGggPSB1cmlPYmplY3QucGF0aCgpOwogICAgbGV0IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZigiLyIpOwogICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICBwYXRoID0gcGF0aC5zdWJzdHIoaW5kZXggKyAxKTsKICAgIH0KICAgIGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZigiLiIpOwogICAgaWYgKGluZGV4ID09PSAtMSkgewogICAgICBwYXRoID0gIiI7CiAgICB9IGVsc2UgewogICAgICBwYXRoID0gcGF0aC5zdWJzdHIoaW5kZXggKyAxKTsKICAgIH0KICAgIHJldHVybiBwYXRoOwogIH0KICB2YXIgaW1wb3J0X3VyaWpzMywgZ2V0RXh0ZW5zaW9uRnJvbVVyaV9kZWZhdWx0OwogIHZhciBpbml0X2dldEV4dGVuc2lvbkZyb21VcmkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2dldEV4dGVuc2lvbkZyb21VcmkuanMiKCkgewogICAgICBpbXBvcnRfdXJpanMzID0gX190b0VTTShyZXF1aXJlX1VSSSgpLCAxKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgZ2V0RXh0ZW5zaW9uRnJvbVVyaV9kZWZhdWx0ID0gZ2V0RXh0ZW5zaW9uRnJvbVVyaTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2dldEltYWdlUGl4ZWxzLmpzCiAgZnVuY3Rpb24gZ2V0SW1hZ2VQaXhlbHMoaW1hZ2UsIHdpZHRoLCBoZWlnaHQpIHsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHdpZHRoKSkgewogICAgICB3aWR0aCA9IGltYWdlLndpZHRoOwogICAgfQogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaGVpZ2h0KSkgewogICAgICBoZWlnaHQgPSBpbWFnZS5oZWlnaHQ7CiAgICB9CiAgICBsZXQgY29udGV4dDJEc0J5SGVpZ2h0ID0gY29udGV4dDJEc0J5V2lkdGhBbmRIZWlnaHRbd2lkdGhdOwogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoY29udGV4dDJEc0J5SGVpZ2h0KSkgewogICAgICBjb250ZXh0MkRzQnlIZWlnaHQgPSB7fTsKICAgICAgY29udGV4dDJEc0J5V2lkdGhBbmRIZWlnaHRbd2lkdGhdID0gY29udGV4dDJEc0J5SGVpZ2h0OwogICAgfQogICAgbGV0IGNvbnRleHQyZCA9IGNvbnRleHQyRHNCeUhlaWdodFtoZWlnaHRdOwogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoY29udGV4dDJkKSkgewogICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7CiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7CiAgICAgIGNvbnRleHQyZCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pOwogICAgICBjb250ZXh0MmQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gImNvcHkiOwogICAgICBjb250ZXh0MkRzQnlIZWlnaHRbaGVpZ2h0XSA9IGNvbnRleHQyZDsKICAgIH0KICAgIGNvbnRleHQyZC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOwogICAgcmV0dXJuIGNvbnRleHQyZC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCkuZGF0YTsKICB9CiAgdmFyIGNvbnRleHQyRHNCeVdpZHRoQW5kSGVpZ2h0LCBnZXRJbWFnZVBpeGVsc19kZWZhdWx0OwogIHZhciBpbml0X2dldEltYWdlUGl4ZWxzID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9nZXRJbWFnZVBpeGVscy5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBjb250ZXh0MkRzQnlXaWR0aEFuZEhlaWdodCA9IHt9OwogICAgICBnZXRJbWFnZVBpeGVsc19kZWZhdWx0ID0gZ2V0SW1hZ2VQaXhlbHM7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9pc0Jsb2JVcmkuanMKICBmdW5jdGlvbiBpc0Jsb2JVcmkodXJpKSB7CiAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5zdHJpbmcoInVyaSIsIHVyaSk7CiAgICByZXR1cm4gYmxvYlVyaVJlZ2V4LnRlc3QodXJpKTsKICB9CiAgdmFyIGJsb2JVcmlSZWdleCwgaXNCbG9iVXJpX2RlZmF1bHQ7CiAgdmFyIGluaXRfaXNCbG9iVXJpID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9pc0Jsb2JVcmkuanMiKCkgewogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGJsb2JVcmlSZWdleCA9IC9eYmxvYjovaTsKICAgICAgaXNCbG9iVXJpX2RlZmF1bHQgPSBpc0Jsb2JVcmk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9pc0Nyb3NzT3JpZ2luVXJsLmpzCiAgZnVuY3Rpb24gaXNDcm9zc09yaWdpblVybCh1cmwpIHsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGEpKSB7CiAgICAgIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CiAgICB9CiAgICBhLmhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKICAgIGNvbnN0IGhvc3QgPSBhLmhvc3Q7CiAgICBjb25zdCBwcm90b2NvbCA9IGEucHJvdG9jb2w7CiAgICBhLmhyZWYgPSB1cmw7CiAgICBhLmhyZWYgPSBhLmhyZWY7CiAgICByZXR1cm4gcHJvdG9jb2wgIT09IGEucHJvdG9jb2wgfHwgaG9zdCAhPT0gYS5ob3N0OwogIH0KICB2YXIgYSwgaXNDcm9zc09yaWdpblVybF9kZWZhdWx0OwogIHZhciBpbml0X2lzQ3Jvc3NPcmlnaW5VcmwgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2lzQ3Jvc3NPcmlnaW5VcmwuanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaXNDcm9zc09yaWdpblVybF9kZWZhdWx0ID0gaXNDcm9zc09yaWdpblVybDsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2lzRGF0YVVyaS5qcwogIGZ1bmN0aW9uIGlzRGF0YVVyaSh1cmkpIHsKICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLnN0cmluZygidXJpIiwgdXJpKTsKICAgIHJldHVybiBkYXRhVXJpUmVnZXgudGVzdCh1cmkpOwogIH0KICB2YXIgZGF0YVVyaVJlZ2V4LCBpc0RhdGFVcmlfZGVmYXVsdDsKICB2YXIgaW5pdF9pc0RhdGFVcmkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2lzRGF0YVVyaS5qcyIoKSB7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgZGF0YVVyaVJlZ2V4ID0gL15kYXRhOi9pOwogICAgICBpc0RhdGFVcmlfZGVmYXVsdCA9IGlzRGF0YVVyaTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2xvYWRBbmRFeGVjdXRlU2NyaXB0LmpzCiAgZnVuY3Rpb24gbG9hZEFuZEV4ZWN1dGVTY3JpcHQodXJsKSB7CiAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgIHNjcmlwdC5hc3luYyA9IHRydWU7CiAgICBzY3JpcHQuc3JjID0gdXJsOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgaWYgKHdpbmRvdy5jcm9zc09yaWdpbklzb2xhdGVkKSB7CiAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgiY3Jvc3NvcmlnaW4iLCAiYW5vbnltb3VzIik7CiAgICAgIH0KICAgICAgY29uc3QgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07CiAgICAgIHNjcmlwdC5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICAgICAgICBzY3JpcHQub25sb2FkID0gdm9pZCAwOwogICAgICAgIGhlYWQucmVtb3ZlQ2hpbGQoc2NyaXB0KTsKICAgICAgICByZXNvbHZlKCk7CiAgICAgIH07CiAgICAgIHNjcmlwdC5vbmVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgIHJlamVjdChlKTsKICAgICAgfTsKICAgICAgaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgfSk7CiAgfQogIHZhciBsb2FkQW5kRXhlY3V0ZVNjcmlwdF9kZWZhdWx0OwogIHZhciBpbml0X2xvYWRBbmRFeGVjdXRlU2NyaXB0ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9sb2FkQW5kRXhlY3V0ZVNjcmlwdC5qcyIoKSB7CiAgICAgIGxvYWRBbmRFeGVjdXRlU2NyaXB0X2RlZmF1bHQgPSBsb2FkQW5kRXhlY3V0ZVNjcmlwdDsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL29iamVjdFRvUXVlcnkuanMKICBmdW5jdGlvbiBvYmplY3RUb1F1ZXJ5KG9iaikgewogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQob2JqKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgib2JqIGlzIHJlcXVpcmVkLiIpOwogICAgfQogICAgbGV0IHJlc3VsdCA9ICIiOwogICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiBvYmopIHsKICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHsKICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtwcm9wTmFtZV07CiAgICAgICAgY29uc3QgcGFydCA9IGAke2VuY29kZVVSSUNvbXBvbmVudChwcm9wTmFtZSl9PWA7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKICAgICAgICAgICAgcmVzdWx0ICs9IGAke3BhcnQgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWVbaV0pfSZgOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQgKz0gYCR7cGFydCArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9JmA7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgLTEpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgdmFyIG9iamVjdFRvUXVlcnlfZGVmYXVsdDsKICB2YXIgaW5pdF9vYmplY3RUb1F1ZXJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9vYmplY3RUb1F1ZXJ5LmpzIigpIHsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgb2JqZWN0VG9RdWVyeV9kZWZhdWx0ID0gb2JqZWN0VG9RdWVyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL3F1ZXJ5VG9PYmplY3QuanMKICBmdW5jdGlvbiBxdWVyeVRvT2JqZWN0KHF1ZXJ5U3RyaW5nKSB7CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChxdWVyeVN0cmluZykpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInF1ZXJ5U3RyaW5nIGlzIHJlcXVpcmVkLiIpOwogICAgfQogICAgY29uc3QgcmVzdWx0ID0ge307CiAgICBpZiAocXVlcnlTdHJpbmcgPT09ICIiKSB7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBjb25zdCBwYXJ0cyA9IHF1ZXJ5U3RyaW5nLnJlcGxhY2UoL1wrL2csICIlMjAiKS5zcGxpdCgvWyY7XS8pOwogICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHBhcnRzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGNvbnN0IHN1YnBhcnRzID0gcGFydHNbaV0uc3BsaXQoIj0iKTsKICAgICAgY29uc3QgbmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChzdWJwYXJ0c1swXSk7CiAgICAgIGxldCB2YWx1ZSA9IHN1YnBhcnRzWzFdOwogICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHZhbHVlKSkgewogICAgICAgIHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWx1ZSA9ICIiOwogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdFZhbHVlID0gcmVzdWx0W25hbWVdOwogICAgICBpZiAodHlwZW9mIHJlc3VsdFZhbHVlID09PSAic3RyaW5nIikgewogICAgICAgIHJlc3VsdFtuYW1lXSA9IFtyZXN1bHRWYWx1ZSwgdmFsdWVdOwogICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0VmFsdWUpKSB7CiAgICAgICAgcmVzdWx0VmFsdWUucHVzaCh2YWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0W25hbWVdID0gdmFsdWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIHZhciBxdWVyeVRvT2JqZWN0X2RlZmF1bHQ7CiAgdmFyIGluaXRfcXVlcnlUb09iamVjdCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvcXVlcnlUb09iamVjdC5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIHF1ZXJ5VG9PYmplY3RfZGVmYXVsdCA9IHF1ZXJ5VG9PYmplY3Q7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9SZXF1ZXN0U3RhdGUuanMKICB2YXIgUmVxdWVzdFN0YXRlLCBSZXF1ZXN0U3RhdGVfZGVmYXVsdDsKICB2YXIgaW5pdF9SZXF1ZXN0U3RhdGUgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1JlcXVlc3RTdGF0ZS5qcyIoKSB7CiAgICAgIFJlcXVlc3RTdGF0ZSA9IHsKICAgICAgICAvKioKICAgICAgICAgKiBJbml0aWFsIHVuaXNzdWVkIHN0YXRlLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBVTklTU1VFRDogMCwKICAgICAgICAvKioKICAgICAgICAgKiBJc3N1ZWQgYnV0IG5vdCB5ZXQgYWN0aXZlLiBXaWxsIGJlY29tZSBhY3RpdmUgd2hlbiBvcGVuIHNsb3RzIGFyZSBhdmFpbGFibGUuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIElTU1VFRDogMSwKICAgICAgICAvKioKICAgICAgICAgKiBBY3R1YWwgaHR0cCByZXF1ZXN0IGhhcyBiZWVuIHNlbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIEFDVElWRTogMiwKICAgICAgICAvKioKICAgICAgICAgKiBSZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFJFQ0VJVkVEOiAzLAogICAgICAgIC8qKgogICAgICAgICAqIFJlcXVlc3Qgd2FzIGNhbmNlbGxlZCwgZWl0aGVyIGV4cGxpY2l0bHkgb3IgYXV0b21hdGljYWxseSBiZWNhdXNlIG9mIGxvdyBwcmlvcml0eS4KICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgQ0FOQ0VMTEVEOiA0LAogICAgICAgIC8qKgogICAgICAgICAqIFJlcXVlc3QgZmFpbGVkLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBGQUlMRUQ6IDUKICAgICAgfTsKICAgICAgUmVxdWVzdFN0YXRlX2RlZmF1bHQgPSBPYmplY3QuZnJlZXplKFJlcXVlc3RTdGF0ZSk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9SZXF1ZXN0VHlwZS5qcwogIHZhciBSZXF1ZXN0VHlwZSwgUmVxdWVzdFR5cGVfZGVmYXVsdDsKICB2YXIgaW5pdF9SZXF1ZXN0VHlwZSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUmVxdWVzdFR5cGUuanMiKCkgewogICAgICBSZXF1ZXN0VHlwZSA9IHsKICAgICAgICAvKioKICAgICAgICAgKiBUZXJyYWluIHJlcXVlc3QuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFRFUlJBSU46IDAsCiAgICAgICAgLyoqCiAgICAgICAgICogSW1hZ2VyeSByZXF1ZXN0LgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBJTUFHRVJZOiAxLAogICAgICAgIC8qKgogICAgICAgICAqIDNEIFRpbGVzIHJlcXVlc3QuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFRJTEVTM0Q6IDIsCiAgICAgICAgLyoqCiAgICAgICAgICogT3RoZXIgcmVxdWVzdC4KICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgT1RIRVI6IDMKICAgICAgfTsKICAgICAgUmVxdWVzdFR5cGVfZGVmYXVsdCA9IE9iamVjdC5mcmVlemUoUmVxdWVzdFR5cGUpOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUmVxdWVzdC5qcwogIGZ1bmN0aW9uIFJlcXVlc3QyKG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgIGNvbnN0IHRocm90dGxlQnlTZXJ2ZXIgPSBvcHRpb25zLnRocm90dGxlQnlTZXJ2ZXIgPz8gZmFsc2U7CiAgICBjb25zdCB0aHJvdHRsZSA9IG9wdGlvbnMudGhyb3R0bGUgPz8gZmFsc2U7CiAgICB0aGlzLnVybCA9IG9wdGlvbnMudXJsOwogICAgdGhpcy5yZXF1ZXN0RnVuY3Rpb24gPSBvcHRpb25zLnJlcXVlc3RGdW5jdGlvbjsKICAgIHRoaXMuY2FuY2VsRnVuY3Rpb24gPSBvcHRpb25zLmNhbmNlbEZ1bmN0aW9uOwogICAgdGhpcy5wcmlvcml0eUZ1bmN0aW9uID0gb3B0aW9ucy5wcmlvcml0eUZ1bmN0aW9uOwogICAgdGhpcy5wcmlvcml0eSA9IG9wdGlvbnMucHJpb3JpdHkgPz8gMDsKICAgIHRoaXMudGhyb3R0bGUgPSB0aHJvdHRsZTsKICAgIHRoaXMudGhyb3R0bGVCeVNlcnZlciA9IHRocm90dGxlQnlTZXJ2ZXI7CiAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGUgPz8gUmVxdWVzdFR5cGVfZGVmYXVsdC5PVEhFUjsKICAgIHRoaXMuc2VydmVyS2V5ID0gb3B0aW9ucy5zZXJ2ZXJLZXk7CiAgICB0aGlzLnN0YXRlID0gUmVxdWVzdFN0YXRlX2RlZmF1bHQuVU5JU1NVRUQ7CiAgICB0aGlzLmRlZmVycmVkID0gdm9pZCAwOwogICAgdGhpcy5jYW5jZWxsZWQgPSBmYWxzZTsKICB9CiAgdmFyIFJlcXVlc3RfZGVmYXVsdDsKICB2YXIgaW5pdF9SZXF1ZXN0ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9SZXF1ZXN0LmpzIigpIHsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfUmVxdWVzdFN0YXRlKCk7CiAgICAgIGluaXRfUmVxdWVzdFR5cGUoKTsKICAgICAgUmVxdWVzdDIucHJvdG90eXBlLmNhbmNlbCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuY2FuY2VsbGVkID0gdHJ1ZTsKICAgICAgfTsKICAgICAgUmVxdWVzdDIucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBSZXF1ZXN0Mih0aGlzKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnVybCA9IHRoaXMudXJsOwogICAgICAgIHJlc3VsdC5yZXF1ZXN0RnVuY3Rpb24gPSB0aGlzLnJlcXVlc3RGdW5jdGlvbjsKICAgICAgICByZXN1bHQuY2FuY2VsRnVuY3Rpb24gPSB0aGlzLmNhbmNlbEZ1bmN0aW9uOwogICAgICAgIHJlc3VsdC5wcmlvcml0eUZ1bmN0aW9uID0gdGhpcy5wcmlvcml0eUZ1bmN0aW9uOwogICAgICAgIHJlc3VsdC5wcmlvcml0eSA9IHRoaXMucHJpb3JpdHk7CiAgICAgICAgcmVzdWx0LnRocm90dGxlID0gdGhpcy50aHJvdHRsZTsKICAgICAgICByZXN1bHQudGhyb3R0bGVCeVNlcnZlciA9IHRoaXMudGhyb3R0bGVCeVNlcnZlcjsKICAgICAgICByZXN1bHQudHlwZSA9IHRoaXMudHlwZTsKICAgICAgICByZXN1bHQuc2VydmVyS2V5ID0gdGhpcy5zZXJ2ZXJLZXk7CiAgICAgICAgcmVzdWx0LnN0YXRlID0gUmVxdWVzdFN0YXRlX2RlZmF1bHQuVU5JU1NVRUQ7CiAgICAgICAgcmVzdWx0LmRlZmVycmVkID0gdm9pZCAwOwogICAgICAgIHJlc3VsdC5jYW5jZWxsZWQgPSBmYWxzZTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBSZXF1ZXN0X2RlZmF1bHQgPSBSZXF1ZXN0MjsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL3BhcnNlUmVzcG9uc2VIZWFkZXJzLmpzCiAgZnVuY3Rpb24gcGFyc2VSZXNwb25zZUhlYWRlcnMoaGVhZGVyU3RyaW5nKSB7CiAgICBjb25zdCBoZWFkZXJzID0ge307CiAgICBpZiAoIWhlYWRlclN0cmluZykgewogICAgICByZXR1cm4gaGVhZGVyczsKICAgIH0KICAgIGNvbnN0IGhlYWRlclBhaXJzID0gaGVhZGVyU3RyaW5nLnNwbGl0KCJcclxuIik7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlclBhaXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIGNvbnN0IGhlYWRlclBhaXIgPSBoZWFkZXJQYWlyc1tpXTsKICAgICAgY29uc3QgaW5kZXggPSBoZWFkZXJQYWlyLmluZGV4T2YoIjogIik7CiAgICAgIGlmIChpbmRleCA+IDApIHsKICAgICAgICBjb25zdCBrZXkgPSBoZWFkZXJQYWlyLnN1YnN0cmluZygwLCBpbmRleCk7CiAgICAgICAgY29uc3QgdmFsID0gaGVhZGVyUGFpci5zdWJzdHJpbmcoaW5kZXggKyAyKTsKICAgICAgICBoZWFkZXJzW2tleV0gPSB2YWw7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBoZWFkZXJzOwogIH0KICB2YXIgcGFyc2VSZXNwb25zZUhlYWRlcnNfZGVmYXVsdDsKICB2YXIgaW5pdF9wYXJzZVJlc3BvbnNlSGVhZGVycyA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvcGFyc2VSZXNwb25zZUhlYWRlcnMuanMiKCkgewogICAgICBwYXJzZVJlc3BvbnNlSGVhZGVyc19kZWZhdWx0ID0gcGFyc2VSZXNwb25zZUhlYWRlcnM7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9SZXF1ZXN0RXJyb3JFdmVudC5qcwogIGZ1bmN0aW9uIFJlcXVlc3RFcnJvckV2ZW50KHN0YXR1c0NvZGUsIHJlc3BvbnNlLCByZXNwb25zZUhlYWRlcnMpIHsKICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7CiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CiAgICB0aGlzLnJlc3BvbnNlSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVyczsKICAgIGlmICh0eXBlb2YgdGhpcy5yZXNwb25zZUhlYWRlcnMgPT09ICJzdHJpbmciKSB7CiAgICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzID0gcGFyc2VSZXNwb25zZUhlYWRlcnNfZGVmYXVsdCh0aGlzLnJlc3BvbnNlSGVhZGVycyk7CiAgICB9CiAgfQogIHZhciBSZXF1ZXN0RXJyb3JFdmVudF9kZWZhdWx0OwogIHZhciBpbml0X1JlcXVlc3RFcnJvckV2ZW50ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9SZXF1ZXN0RXJyb3JFdmVudC5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X3BhcnNlUmVzcG9uc2VIZWFkZXJzKCk7CiAgICAgIFJlcXVlc3RFcnJvckV2ZW50LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGxldCBzdHIgPSAiUmVxdWVzdCBoYXMgZmFpbGVkLiI7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdCh0aGlzLnN0YXR1c0NvZGUpKSB7CiAgICAgICAgICBzdHIgKz0gYCBTdGF0dXMgQ29kZTogJHt0aGlzLnN0YXR1c0NvZGV9YDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgfTsKICAgICAgUmVxdWVzdEVycm9yRXZlbnRfZGVmYXVsdCA9IFJlcXVlc3RFcnJvckV2ZW50OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvRXZlbnQuanMKICBmdW5jdGlvbiBFdmVudCgpIHsKICAgIHRoaXMuX2xpc3RlbmVycyA9IFtdOwogICAgdGhpcy5fc2NvcGVzID0gW107CiAgICB0aGlzLl90b1JlbW92ZSA9IFtdOwogICAgdGhpcy5faW5zaWRlUmFpc2VFdmVudCA9IGZhbHNlOwogIH0KICBmdW5jdGlvbiBjb21wYXJlTnVtYmVyKGEzLCBiKSB7CiAgICByZXR1cm4gYiAtIGEzOwogIH0KICB2YXIgRXZlbnRfZGVmYXVsdDsKICB2YXIgaW5pdF9FdmVudCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvRXZlbnQuanMiKCkgewogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhFdmVudC5wcm90b3R5cGUsIHsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIGxpc3RlbmVycyBjdXJyZW50bHkgc3Vic2NyaWJlZCB0byB0aGUgZXZlbnQuCiAgICAgICAgICogQG1lbWJlcm9mIEV2ZW50LnByb3RvdHlwZQogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICovCiAgICAgICAgbnVtYmVyT2ZMaXN0ZW5lcnM6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoIC0gdGhpcy5fdG9SZW1vdmUubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIEV2ZW50LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24obGlzdGVuZXIsIHNjb3BlKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YuZnVuYygibGlzdGVuZXIiLCBsaXN0ZW5lcik7CiAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpOwogICAgICAgIHRoaXMuX3Njb3Blcy5wdXNoKHNjb3BlKTsKICAgICAgICBjb25zdCBldmVudCA9IHRoaXM7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgZXZlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihsaXN0ZW5lciwgc2NvcGUpOwogICAgICAgIH07CiAgICAgIH07CiAgICAgIEV2ZW50LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24obGlzdGVuZXIsIHNjb3BlKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YuZnVuYygibGlzdGVuZXIiLCBsaXN0ZW5lcik7CiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzOwogICAgICAgIGNvbnN0IHNjb3BlcyA9IHRoaXMuX3Njb3BlczsKICAgICAgICBsZXQgaW5kZXggPSAtMTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXSA9PT0gbGlzdGVuZXIgJiYgc2NvcGVzW2ldID09PSBzY29wZSkgewogICAgICAgICAgICBpbmRleCA9IGk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7CiAgICAgICAgICBpZiAodGhpcy5faW5zaWRlUmFpc2VFdmVudCkgewogICAgICAgICAgICB0aGlzLl90b1JlbW92ZS5wdXNoKGluZGV4KTsKICAgICAgICAgICAgbGlzdGVuZXJzW2luZGV4XSA9IHZvaWQgMDsKICAgICAgICAgICAgc2NvcGVzW2luZGV4XSA9IHZvaWQgMDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgICBzY29wZXMuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH07CiAgICAgIEV2ZW50LnByb3RvdHlwZS5yYWlzZUV2ZW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5faW5zaWRlUmFpc2VFdmVudCA9IHRydWU7CiAgICAgICAgbGV0IGk7CiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzOwogICAgICAgIGNvbnN0IHNjb3BlcyA9IHRoaXMuX3Njb3BlczsKICAgICAgICBsZXQgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldOwogICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChsaXN0ZW5lcikpIHsKICAgICAgICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KHNjb3Blc1tpXSwgYXJndW1lbnRzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgdG9SZW1vdmUgPSB0aGlzLl90b1JlbW92ZTsKICAgICAgICBsZW5ndGggPSB0b1JlbW92ZS5sZW5ndGg7CiAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgICAgIHRvUmVtb3ZlLnNvcnQoY29tcGFyZU51bWJlcik7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0b1JlbW92ZVtpXTsKICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIHNjb3Blcy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgfQogICAgICAgICAgdG9SZW1vdmUubGVuZ3RoID0gMDsKICAgICAgICB9CiAgICAgICAgdGhpcy5faW5zaWRlUmFpc2VFdmVudCA9IGZhbHNlOwogICAgICB9OwogICAgICBFdmVudF9kZWZhdWx0ID0gRXZlbnQ7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9IZWFwLmpzCiAgZnVuY3Rpb24gSGVhcChvcHRpb25zKSB7CiAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm9wdGlvbnMiLCBvcHRpb25zKTsKICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgib3B0aW9ucy5jb21wYXJhdG9yIiwgb3B0aW9ucy5jb21wYXJhdG9yKTsKICAgIHRoaXMuX2NvbXBhcmF0b3IgPSBvcHRpb25zLmNvbXBhcmF0b3I7CiAgICB0aGlzLl9hcnJheSA9IFtdOwogICAgdGhpcy5fbGVuZ3RoID0gMDsKICAgIHRoaXMuX21heGltdW1MZW5ndGggPSB2b2lkIDA7CiAgfQogIGZ1bmN0aW9uIHN3YXAoYXJyYXksIGEzLCBiKSB7CiAgICBjb25zdCB0ZW1wID0gYXJyYXlbYTNdOwogICAgYXJyYXlbYTNdID0gYXJyYXlbYl07CiAgICBhcnJheVtiXSA9IHRlbXA7CiAgfQogIHZhciBIZWFwX2RlZmF1bHQ7CiAgdmFyIGluaXRfSGVhcCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvSGVhcC5qcyIoKSB7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEhlYXAucHJvdG90eXBlLCB7CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBoZWFwLgogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEhlYXAucHJvdG90eXBlCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqLwogICAgICAgIGxlbmd0aDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xlbmd0aDsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGludGVybmFsIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEhlYXAucHJvdG90eXBlCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7QXJyYXl9CiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICovCiAgICAgICAgaW50ZXJuYWxBcnJheTogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FycmF5OwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBhbmQgc2V0cyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIGhlYXAuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgSGVhcC5wcm90b3R5cGUKICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgbWF4aW11bUxlbmd0aDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21heGltdW1MZW5ndGg7CiAgICAgICAgICB9LAogICAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygibWF4aW11bUxlbmd0aCIsIHZhbHVlLCAwKTsKICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxMZW5ndGggPSB0aGlzLl9sZW5ndGg7CiAgICAgICAgICAgIGlmICh2YWx1ZSA8IG9yaWdpbmFsTGVuZ3RoKSB7CiAgICAgICAgICAgICAgY29uc3QgYXJyYXkgPSB0aGlzLl9hcnJheTsKICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdmFsdWU7IGkgPCBvcmlnaW5hbExlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IHZvaWQgMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGhpcy5fbGVuZ3RoID0gdmFsdWU7CiAgICAgICAgICAgICAgYXJyYXkubGVuZ3RoID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fbWF4aW11bUxlbmd0aCA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGNvbXBhcmF0b3IgdG8gdXNlIGZvciB0aGUgaGVhcC4gSWYgY29tcGFyYXRvcihhLCBiKSBpcyBsZXNzIHRoYW4gMCwgc29ydCBhIHRvIGEgbG93ZXIgaW5kZXggdGhhbiBiLCBvdGhlcndpc2Ugc29ydCB0byBhIGhpZ2hlciBpbmRleC4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBIZWFwLnByb3RvdHlwZQogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge0hlYXAuQ29tcGFyYXRvckNhbGxiYWNrfQogICAgICAgICAqLwogICAgICAgIGNvbXBhcmF0b3I6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb21wYXJhdG9yOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIEhlYXAucHJvdG90eXBlLnJlc2VydmUgPSBmdW5jdGlvbihsZW5ndGgpIHsKICAgICAgICBsZW5ndGggPSBsZW5ndGggPz8gdGhpcy5fbGVuZ3RoOwogICAgICAgIHRoaXMuX2FycmF5Lmxlbmd0aCA9IGxlbmd0aDsKICAgICAgfTsKICAgICAgSGVhcC5wcm90b3R5cGUuaGVhcGlmeSA9IGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgaW5kZXggPSBpbmRleCA/PyAwOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuX2xlbmd0aDsKICAgICAgICBjb25zdCBjb21wYXJhdG9yID0gdGhpcy5fY29tcGFyYXRvcjsKICAgICAgICBjb25zdCBhcnJheSA9IHRoaXMuX2FycmF5OwogICAgICAgIGxldCBjYW5kaWRhdGUgPSAtMTsKICAgICAgICBsZXQgaW5zZXJ0aW5nID0gdHJ1ZTsKICAgICAgICB3aGlsZSAoaW5zZXJ0aW5nKSB7CiAgICAgICAgICBjb25zdCByaWdodCA9IDIgKiAoaW5kZXggKyAxKTsKICAgICAgICAgIGNvbnN0IGxlZnQgPSByaWdodCAtIDE7CiAgICAgICAgICBpZiAobGVmdCA8IGxlbmd0aCAmJiBjb21wYXJhdG9yKGFycmF5W2xlZnRdLCBhcnJheVtpbmRleF0pIDwgMCkgewogICAgICAgICAgICBjYW5kaWRhdGUgPSBsZWZ0OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY2FuZGlkYXRlID0gaW5kZXg7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocmlnaHQgPCBsZW5ndGggJiYgY29tcGFyYXRvcihhcnJheVtyaWdodF0sIGFycmF5W2NhbmRpZGF0ZV0pIDwgMCkgewogICAgICAgICAgICBjYW5kaWRhdGUgPSByaWdodDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjYW5kaWRhdGUgIT09IGluZGV4KSB7CiAgICAgICAgICAgIHN3YXAoYXJyYXksIGNhbmRpZGF0ZSwgaW5kZXgpOwogICAgICAgICAgICBpbmRleCA9IGNhbmRpZGF0ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluc2VydGluZyA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgSGVhcC5wcm90b3R5cGUucmVzb3J0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5fbGVuZ3RoOwogICAgICAgIGZvciAobGV0IGkgPSBNYXRoLmNlaWwobGVuZ3RoIC8gMik7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICB0aGlzLmhlYXBpZnkoaSk7CiAgICAgICAgfQogICAgICB9OwogICAgICBIZWFwLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbihlbGVtZW50KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJlbGVtZW50IiwgZWxlbWVudCk7CiAgICAgICAgY29uc3QgYXJyYXkgPSB0aGlzLl9hcnJheTsKICAgICAgICBjb25zdCBjb21wYXJhdG9yID0gdGhpcy5fY29tcGFyYXRvcjsKICAgICAgICBjb25zdCBtYXhpbXVtTGVuZ3RoID0gdGhpcy5fbWF4aW11bUxlbmd0aDsKICAgICAgICBsZXQgaW5kZXggPSB0aGlzLl9sZW5ndGgrKzsKICAgICAgICBpZiAoaW5kZXggPCBhcnJheS5sZW5ndGgpIHsKICAgICAgICAgIGFycmF5W2luZGV4XSA9IGVsZW1lbnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFycmF5LnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChpbmRleCAhPT0gMCkgewogICAgICAgICAgY29uc3QgcGFyZW50ID0gTWF0aC5mbG9vcigoaW5kZXggLSAxKSAvIDIpOwogICAgICAgICAgaWYgKGNvbXBhcmF0b3IoYXJyYXlbaW5kZXhdLCBhcnJheVtwYXJlbnRdKSA8IDApIHsKICAgICAgICAgICAgc3dhcChhcnJheSwgaW5kZXgsIHBhcmVudCk7CiAgICAgICAgICAgIGluZGV4ID0gcGFyZW50OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCByZW1vdmVkRWxlbWVudDsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG1heGltdW1MZW5ndGgpICYmIHRoaXMuX2xlbmd0aCA+IG1heGltdW1MZW5ndGgpIHsKICAgICAgICAgIHJlbW92ZWRFbGVtZW50ID0gYXJyYXlbbWF4aW11bUxlbmd0aF07CiAgICAgICAgICB0aGlzLl9sZW5ndGggPSBtYXhpbXVtTGVuZ3RoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVtb3ZlZEVsZW1lbnQ7CiAgICAgIH07CiAgICAgIEhlYXAucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgaW5kZXggPSBpbmRleCA/PyAwOwogICAgICAgIGlmICh0aGlzLl9sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbigiaW5kZXgiLCBpbmRleCwgdGhpcy5fbGVuZ3RoKTsKICAgICAgICBjb25zdCBhcnJheSA9IHRoaXMuX2FycmF5OwogICAgICAgIGNvbnN0IHJvb3QgPSBhcnJheVtpbmRleF07CiAgICAgICAgc3dhcChhcnJheSwgaW5kZXgsIC0tdGhpcy5fbGVuZ3RoKTsKICAgICAgICB0aGlzLmhlYXBpZnkoaW5kZXgpOwogICAgICAgIGFycmF5W3RoaXMuX2xlbmd0aF0gPSB2b2lkIDA7CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgIH07CiAgICAgIEhlYXBfZGVmYXVsdCA9IEhlYXA7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9SZXF1ZXN0U2NoZWR1bGVyLmpzCiAgZnVuY3Rpb24gc29ydFJlcXVlc3RzKGEzLCBiKSB7CiAgICByZXR1cm4gYTMucHJpb3JpdHkgLSBiLnByaW9yaXR5OwogIH0KICBmdW5jdGlvbiBSZXF1ZXN0U2NoZWR1bGVyKCkgewogIH0KICBmdW5jdGlvbiB1cGRhdGVQcmlvcml0eShyZXF1ZXN0KSB7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHJlcXVlc3QucHJpb3JpdHlGdW5jdGlvbikpIHsKICAgICAgcmVxdWVzdC5wcmlvcml0eSA9IHJlcXVlc3QucHJpb3JpdHlGdW5jdGlvbigpOwogICAgfQogIH0KICBmdW5jdGlvbiBpc3N1ZVJlcXVlc3QocmVxdWVzdCkgewogICAgaWYgKHJlcXVlc3Quc3RhdGUgPT09IFJlcXVlc3RTdGF0ZV9kZWZhdWx0LlVOSVNTVUVEKSB7CiAgICAgIHJlcXVlc3Quc3RhdGUgPSBSZXF1ZXN0U3RhdGVfZGVmYXVsdC5JU1NVRUQ7CiAgICAgIHJlcXVlc3QuZGVmZXJyZWQgPSBkZWZlcl9kZWZhdWx0KCk7CiAgICB9CiAgICByZXR1cm4gcmVxdWVzdC5kZWZlcnJlZC5wcm9taXNlOwogIH0KICBmdW5jdGlvbiBnZXRSZXF1ZXN0UmVjZWl2ZWRGdW5jdGlvbihyZXF1ZXN0KSB7CiAgICByZXR1cm4gZnVuY3Rpb24ocmVzdWx0cykgewogICAgICBpZiAocmVxdWVzdC5zdGF0ZSA9PT0gUmVxdWVzdFN0YXRlX2RlZmF1bHQuQ0FOQ0VMTEVEKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGRlZmVycmVkID0gcmVxdWVzdC5kZWZlcnJlZDsKICAgICAgLS1zdGF0aXN0aWNzLm51bWJlck9mQWN0aXZlUmVxdWVzdHM7CiAgICAgIC0tbnVtYmVyT2ZBY3RpdmVSZXF1ZXN0c0J5U2VydmVyW3JlcXVlc3Quc2VydmVyS2V5XTsKICAgICAgcmVxdWVzdENvbXBsZXRlZEV2ZW50LnJhaXNlRXZlbnQoKTsKICAgICAgcmVxdWVzdC5zdGF0ZSA9IFJlcXVlc3RTdGF0ZV9kZWZhdWx0LlJFQ0VJVkVEOwogICAgICByZXF1ZXN0LmRlZmVycmVkID0gdm9pZCAwOwogICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3VsdHMpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZ2V0UmVxdWVzdEZhaWxlZEZ1bmN0aW9uKHJlcXVlc3QpIHsKICAgIHJldHVybiBmdW5jdGlvbihlcnJvcikgewogICAgICBpZiAocmVxdWVzdC5zdGF0ZSA9PT0gUmVxdWVzdFN0YXRlX2RlZmF1bHQuQ0FOQ0VMTEVEKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgICsrc3RhdGlzdGljcy5udW1iZXJPZkZhaWxlZFJlcXVlc3RzOwogICAgICAtLXN0YXRpc3RpY3MubnVtYmVyT2ZBY3RpdmVSZXF1ZXN0czsKICAgICAgLS1udW1iZXJPZkFjdGl2ZVJlcXVlc3RzQnlTZXJ2ZXJbcmVxdWVzdC5zZXJ2ZXJLZXldOwogICAgICByZXF1ZXN0Q29tcGxldGVkRXZlbnQucmFpc2VFdmVudChlcnJvcik7CiAgICAgIHJlcXVlc3Quc3RhdGUgPSBSZXF1ZXN0U3RhdGVfZGVmYXVsdC5GQUlMRUQ7CiAgICAgIHJlcXVlc3QuZGVmZXJyZWQucmVqZWN0KGVycm9yKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHN0YXJ0UmVxdWVzdChyZXF1ZXN0KSB7CiAgICBjb25zdCBwcm9taXNlID0gaXNzdWVSZXF1ZXN0KHJlcXVlc3QpOwogICAgcmVxdWVzdC5zdGF0ZSA9IFJlcXVlc3RTdGF0ZV9kZWZhdWx0LkFDVElWRTsKICAgIGFjdGl2ZVJlcXVlc3RzLnB1c2gocmVxdWVzdCk7CiAgICArK3N0YXRpc3RpY3MubnVtYmVyT2ZBY3RpdmVSZXF1ZXN0czsKICAgICsrc3RhdGlzdGljcy5udW1iZXJPZkFjdGl2ZVJlcXVlc3RzRXZlcjsKICAgICsrbnVtYmVyT2ZBY3RpdmVSZXF1ZXN0c0J5U2VydmVyW3JlcXVlc3Quc2VydmVyS2V5XTsKICAgIHJlcXVlc3QucmVxdWVzdEZ1bmN0aW9uKCkudGhlbihnZXRSZXF1ZXN0UmVjZWl2ZWRGdW5jdGlvbihyZXF1ZXN0KSkuY2F0Y2goZ2V0UmVxdWVzdEZhaWxlZEZ1bmN0aW9uKHJlcXVlc3QpKTsKICAgIHJldHVybiBwcm9taXNlOwogIH0KICBmdW5jdGlvbiBjYW5jZWxSZXF1ZXN0KHJlcXVlc3QpIHsKICAgIGNvbnN0IGFjdGl2ZSA9IHJlcXVlc3Quc3RhdGUgPT09IFJlcXVlc3RTdGF0ZV9kZWZhdWx0LkFDVElWRTsKICAgIHJlcXVlc3Quc3RhdGUgPSBSZXF1ZXN0U3RhdGVfZGVmYXVsdC5DQU5DRUxMRUQ7CiAgICArK3N0YXRpc3RpY3MubnVtYmVyT2ZDYW5jZWxsZWRSZXF1ZXN0czsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQocmVxdWVzdC5kZWZlcnJlZCkpIHsKICAgICAgY29uc3QgZGVmZXJyZWQgPSByZXF1ZXN0LmRlZmVycmVkOwogICAgICByZXF1ZXN0LmRlZmVycmVkID0gdm9pZCAwOwogICAgICBkZWZlcnJlZC5yZWplY3QoKTsKICAgIH0KICAgIGlmIChhY3RpdmUpIHsKICAgICAgLS1zdGF0aXN0aWNzLm51bWJlck9mQWN0aXZlUmVxdWVzdHM7CiAgICAgIC0tbnVtYmVyT2ZBY3RpdmVSZXF1ZXN0c0J5U2VydmVyW3JlcXVlc3Quc2VydmVyS2V5XTsKICAgICAgKytzdGF0aXN0aWNzLm51bWJlck9mQ2FuY2VsbGVkQWN0aXZlUmVxdWVzdHM7CiAgICB9CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHJlcXVlc3QuY2FuY2VsRnVuY3Rpb24pKSB7CiAgICAgIHJlcXVlc3QuY2FuY2VsRnVuY3Rpb24oKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gdXBkYXRlU3RhdGlzdGljcygpIHsKICAgIGlmICghUmVxdWVzdFNjaGVkdWxlci5kZWJ1Z1Nob3dTdGF0aXN0aWNzKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChzdGF0aXN0aWNzLm51bWJlck9mQWN0aXZlUmVxdWVzdHMgPT09IDAgJiYgc3RhdGlzdGljcy5sYXN0TnVtYmVyT2ZBY3RpdmVSZXF1ZXN0cyA+IDApIHsKICAgICAgaWYgKHN0YXRpc3RpY3MubnVtYmVyT2ZBdHRlbXB0ZWRSZXF1ZXN0cyA+IDApIHsKICAgICAgICBjb25zb2xlLmxvZygKICAgICAgICAgIGBOdW1iZXIgb2YgYXR0ZW1wdGVkIHJlcXVlc3RzOiAke3N0YXRpc3RpY3MubnVtYmVyT2ZBdHRlbXB0ZWRSZXF1ZXN0c31gCiAgICAgICAgKTsKICAgICAgICBzdGF0aXN0aWNzLm51bWJlck9mQXR0ZW1wdGVkUmVxdWVzdHMgPSAwOwogICAgICB9CiAgICAgIGlmIChzdGF0aXN0aWNzLm51bWJlck9mQ2FuY2VsbGVkUmVxdWVzdHMgPiAwKSB7CiAgICAgICAgY29uc29sZS5sb2coCiAgICAgICAgICBgTnVtYmVyIG9mIGNhbmNlbGxlZCByZXF1ZXN0czogJHtzdGF0aXN0aWNzLm51bWJlck9mQ2FuY2VsbGVkUmVxdWVzdHN9YAogICAgICAgICk7CiAgICAgICAgc3RhdGlzdGljcy5udW1iZXJPZkNhbmNlbGxlZFJlcXVlc3RzID0gMDsKICAgICAgfQogICAgICBpZiAoc3RhdGlzdGljcy5udW1iZXJPZkNhbmNlbGxlZEFjdGl2ZVJlcXVlc3RzID4gMCkgewogICAgICAgIGNvbnNvbGUubG9nKAogICAgICAgICAgYE51bWJlciBvZiBjYW5jZWxsZWQgYWN0aXZlIHJlcXVlc3RzOiAke3N0YXRpc3RpY3MubnVtYmVyT2ZDYW5jZWxsZWRBY3RpdmVSZXF1ZXN0c31gCiAgICAgICAgKTsKICAgICAgICBzdGF0aXN0aWNzLm51bWJlck9mQ2FuY2VsbGVkQWN0aXZlUmVxdWVzdHMgPSAwOwogICAgICB9CiAgICAgIGlmIChzdGF0aXN0aWNzLm51bWJlck9mRmFpbGVkUmVxdWVzdHMgPiAwKSB7CiAgICAgICAgY29uc29sZS5sb2coCiAgICAgICAgICBgTnVtYmVyIG9mIGZhaWxlZCByZXF1ZXN0czogJHtzdGF0aXN0aWNzLm51bWJlck9mRmFpbGVkUmVxdWVzdHN9YAogICAgICAgICk7CiAgICAgICAgc3RhdGlzdGljcy5udW1iZXJPZkZhaWxlZFJlcXVlc3RzID0gMDsKICAgICAgfQogICAgfQogICAgc3RhdGlzdGljcy5sYXN0TnVtYmVyT2ZBY3RpdmVSZXF1ZXN0cyA9IHN0YXRpc3RpY3MubnVtYmVyT2ZBY3RpdmVSZXF1ZXN0czsKICB9CiAgdmFyIGltcG9ydF91cmlqczQsIHN0YXRpc3RpY3MsIHByaW9yaXR5SGVhcExlbmd0aCwgcmVxdWVzdEhlYXAsIGFjdGl2ZVJlcXVlc3RzLCBudW1iZXJPZkFjdGl2ZVJlcXVlc3RzQnlTZXJ2ZXIsIHBhZ2VVcmksIHJlcXVlc3RDb21wbGV0ZWRFdmVudCwgUmVxdWVzdFNjaGVkdWxlcl9kZWZhdWx0OwogIHZhciBpbml0X1JlcXVlc3RTY2hlZHVsZXIgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1JlcXVlc3RTY2hlZHVsZXIuanMiKCkgewogICAgICBpbXBvcnRfdXJpanM0ID0gX190b0VTTShyZXF1aXJlX1VSSSgpLCAxKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X2RlZmVyKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0V2ZW50KCk7CiAgICAgIGluaXRfSGVhcCgpOwogICAgICBpbml0X2lzQmxvYlVyaSgpOwogICAgICBpbml0X2lzRGF0YVVyaSgpOwogICAgICBpbml0X1JlcXVlc3RTdGF0ZSgpOwogICAgICBzdGF0aXN0aWNzID0gewogICAgICAgIG51bWJlck9mQXR0ZW1wdGVkUmVxdWVzdHM6IDAsCiAgICAgICAgbnVtYmVyT2ZBY3RpdmVSZXF1ZXN0czogMCwKICAgICAgICBudW1iZXJPZkNhbmNlbGxlZFJlcXVlc3RzOiAwLAogICAgICAgIG51bWJlck9mQ2FuY2VsbGVkQWN0aXZlUmVxdWVzdHM6IDAsCiAgICAgICAgbnVtYmVyT2ZGYWlsZWRSZXF1ZXN0czogMCwKICAgICAgICBudW1iZXJPZkFjdGl2ZVJlcXVlc3RzRXZlcjogMCwKICAgICAgICBsYXN0TnVtYmVyT2ZBY3RpdmVSZXF1ZXN0czogMAogICAgICB9OwogICAgICBwcmlvcml0eUhlYXBMZW5ndGggPSAyMDsKICAgICAgcmVxdWVzdEhlYXAgPSBuZXcgSGVhcF9kZWZhdWx0KHsKICAgICAgICBjb21wYXJhdG9yOiBzb3J0UmVxdWVzdHMKICAgICAgfSk7CiAgICAgIHJlcXVlc3RIZWFwLm1heGltdW1MZW5ndGggPSBwcmlvcml0eUhlYXBMZW5ndGg7CiAgICAgIHJlcXVlc3RIZWFwLnJlc2VydmUocHJpb3JpdHlIZWFwTGVuZ3RoKTsKICAgICAgYWN0aXZlUmVxdWVzdHMgPSBbXTsKICAgICAgbnVtYmVyT2ZBY3RpdmVSZXF1ZXN0c0J5U2VydmVyID0ge307CiAgICAgIHBhZ2VVcmkgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiID8gbmV3IGltcG9ydF91cmlqczQuZGVmYXVsdChkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSA6IG5ldyBpbXBvcnRfdXJpanM0LmRlZmF1bHQoKTsKICAgICAgcmVxdWVzdENvbXBsZXRlZEV2ZW50ID0gbmV3IEV2ZW50X2RlZmF1bHQoKTsKICAgICAgUmVxdWVzdFNjaGVkdWxlci5tYXhpbXVtUmVxdWVzdHMgPSA1MDsKICAgICAgUmVxdWVzdFNjaGVkdWxlci5tYXhpbXVtUmVxdWVzdHNQZXJTZXJ2ZXIgPSAxODsKICAgICAgUmVxdWVzdFNjaGVkdWxlci5yZXF1ZXN0c0J5U2VydmVyID0ge307CiAgICAgIFJlcXVlc3RTY2hlZHVsZXIudGhyb3R0bGVSZXF1ZXN0cyA9IHRydWU7CiAgICAgIFJlcXVlc3RTY2hlZHVsZXIuZGVidWdTaG93U3RhdGlzdGljcyA9IGZhbHNlOwogICAgICBSZXF1ZXN0U2NoZWR1bGVyLnJlcXVlc3RDb21wbGV0ZWRFdmVudCA9IHJlcXVlc3RDb21wbGV0ZWRFdmVudDsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVxdWVzdFNjaGVkdWxlciwgewogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHN0YXRpc3RpY3MgdXNlZCBieSB0aGUgcmVxdWVzdCBzY2hlZHVsZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgUmVxdWVzdFNjaGVkdWxlcgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge29iamVjdH0KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIHN0YXRpc3RpY3M6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBzdGF0aXN0aWNzOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgcHJpb3JpdHkgaGVhcC4gVGhpcyBsaW1pdHMgdGhlIG51bWJlciBvZiByZXF1ZXN0cyB0aGF0IGFyZSBzb3J0ZWQgYnkgcHJpb3JpdHkuIE9ubHkgYXBwbGllcyB0byByZXF1ZXN0cyB0aGF0IGFyZSBub3QgeWV0IGFjdGl2ZS4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBSZXF1ZXN0U2NoZWR1bGVyCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBkZWZhdWx0IDIwCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBwcmlvcml0eUhlYXBMZW5ndGg6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBwcmlvcml0eUhlYXBMZW5ndGg7CiAgICAgICAgICB9LAogICAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICBpZiAodmFsdWUgPCBwcmlvcml0eUhlYXBMZW5ndGgpIHsKICAgICAgICAgICAgICB3aGlsZSAocmVxdWVzdEhlYXAubGVuZ3RoID4gdmFsdWUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSByZXF1ZXN0SGVhcC5wb3AoKTsKICAgICAgICAgICAgICAgIGNhbmNlbFJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHByaW9yaXR5SGVhcExlbmd0aCA9IHZhbHVlOwogICAgICAgICAgICByZXF1ZXN0SGVhcC5tYXhpbXVtTGVuZ3RoID0gdmFsdWU7CiAgICAgICAgICAgIHJlcXVlc3RIZWFwLnJlc2VydmUodmFsdWUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIFJlcXVlc3RTY2hlZHVsZXIuc2VydmVySGFzT3BlblNsb3RzID0gZnVuY3Rpb24oc2VydmVyS2V5LCBkZXNpcmVkUmVxdWVzdHMpIHsKICAgICAgICBkZXNpcmVkUmVxdWVzdHMgPSBkZXNpcmVkUmVxdWVzdHMgPz8gMTsKICAgICAgICBjb25zdCBtYXhSZXF1ZXN0cyA9IFJlcXVlc3RTY2hlZHVsZXIucmVxdWVzdHNCeVNlcnZlcltzZXJ2ZXJLZXldID8/IFJlcXVlc3RTY2hlZHVsZXIubWF4aW11bVJlcXVlc3RzUGVyU2VydmVyOwogICAgICAgIGNvbnN0IGhhc09wZW5TbG90c1NlcnZlciA9IG51bWJlck9mQWN0aXZlUmVxdWVzdHNCeVNlcnZlcltzZXJ2ZXJLZXldICsgZGVzaXJlZFJlcXVlc3RzIDw9IG1heFJlcXVlc3RzOwogICAgICAgIHJldHVybiBoYXNPcGVuU2xvdHNTZXJ2ZXI7CiAgICAgIH07CiAgICAgIFJlcXVlc3RTY2hlZHVsZXIuaGVhcEhhc09wZW5TbG90cyA9IGZ1bmN0aW9uKGRlc2lyZWRSZXF1ZXN0cykgewogICAgICAgIGNvbnN0IGhhc09wZW5TbG90c0hlYXAgPSByZXF1ZXN0SGVhcC5sZW5ndGggKyBkZXNpcmVkUmVxdWVzdHMgPD0gcHJpb3JpdHlIZWFwTGVuZ3RoOwogICAgICAgIHJldHVybiBoYXNPcGVuU2xvdHNIZWFwOwogICAgICB9OwogICAgICBSZXF1ZXN0U2NoZWR1bGVyLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGxldCBpOwogICAgICAgIGxldCByZXF1ZXN0OwogICAgICAgIGxldCByZW1vdmVDb3VudCA9IDA7CiAgICAgICAgY29uc3QgYWN0aXZlTGVuZ3RoID0gYWN0aXZlUmVxdWVzdHMubGVuZ3RoOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhY3RpdmVMZW5ndGg7ICsraSkgewogICAgICAgICAgcmVxdWVzdCA9IGFjdGl2ZVJlcXVlc3RzW2ldOwogICAgICAgICAgaWYgKHJlcXVlc3QuY2FuY2VsbGVkKSB7CiAgICAgICAgICAgIGNhbmNlbFJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocmVxdWVzdC5zdGF0ZSAhPT0gUmVxdWVzdFN0YXRlX2RlZmF1bHQuQUNUSVZFKSB7CiAgICAgICAgICAgICsrcmVtb3ZlQ291bnQ7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHJlbW92ZUNvdW50ID4gMCkgewogICAgICAgICAgICBhY3RpdmVSZXF1ZXN0c1tpIC0gcmVtb3ZlQ291bnRdID0gcmVxdWVzdDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYWN0aXZlUmVxdWVzdHMubGVuZ3RoIC09IHJlbW92ZUNvdW50OwogICAgICAgIGNvbnN0IGlzc3VlZFJlcXVlc3RzID0gcmVxdWVzdEhlYXAuaW50ZXJuYWxBcnJheTsKICAgICAgICBjb25zdCBpc3N1ZWRMZW5ndGggPSByZXF1ZXN0SGVhcC5sZW5ndGg7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGlzc3VlZExlbmd0aDsgKytpKSB7CiAgICAgICAgICB1cGRhdGVQcmlvcml0eShpc3N1ZWRSZXF1ZXN0c1tpXSk7CiAgICAgICAgfQogICAgICAgIHJlcXVlc3RIZWFwLnJlc29ydCgpOwogICAgICAgIGNvbnN0IG9wZW5TbG90cyA9IE1hdGgubWF4KAogICAgICAgICAgUmVxdWVzdFNjaGVkdWxlci5tYXhpbXVtUmVxdWVzdHMgLSBhY3RpdmVSZXF1ZXN0cy5sZW5ndGgsCiAgICAgICAgICAwCiAgICAgICAgKTsKICAgICAgICBsZXQgZmlsbGVkU2xvdHMgPSAwOwogICAgICAgIHdoaWxlIChmaWxsZWRTbG90cyA8IG9wZW5TbG90cyAmJiByZXF1ZXN0SGVhcC5sZW5ndGggPiAwKSB7CiAgICAgICAgICByZXF1ZXN0ID0gcmVxdWVzdEhlYXAucG9wKCk7CiAgICAgICAgICBpZiAocmVxdWVzdC5jYW5jZWxsZWQpIHsKICAgICAgICAgICAgY2FuY2VsUmVxdWVzdChyZXF1ZXN0KTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocmVxdWVzdC50aHJvdHRsZUJ5U2VydmVyICYmICFSZXF1ZXN0U2NoZWR1bGVyLnNlcnZlckhhc09wZW5TbG90cyhyZXF1ZXN0LnNlcnZlcktleSkpIHsKICAgICAgICAgICAgY2FuY2VsUmVxdWVzdChyZXF1ZXN0KTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBzdGFydFJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgICArK2ZpbGxlZFNsb3RzOwogICAgICAgIH0KICAgICAgICB1cGRhdGVTdGF0aXN0aWNzKCk7CiAgICAgIH07CiAgICAgIFJlcXVlc3RTY2hlZHVsZXIuZ2V0U2VydmVyS2V5ID0gZnVuY3Rpb24odXJsKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yuc3RyaW5nKCJ1cmwiLCB1cmwpOwogICAgICAgIGxldCB1cmkgPSBuZXcgaW1wb3J0X3VyaWpzNC5kZWZhdWx0KHVybCk7CiAgICAgICAgaWYgKHVyaS5zY2hlbWUoKSA9PT0gIiIpIHsKICAgICAgICAgIHVyaSA9IHVyaS5hYnNvbHV0ZVRvKHBhZ2VVcmkpOwogICAgICAgICAgdXJpLm5vcm1hbGl6ZSgpOwogICAgICAgIH0KICAgICAgICBsZXQgc2VydmVyS2V5ID0gdXJpLmF1dGhvcml0eSgpOwogICAgICAgIGlmICghLzovLnRlc3Qoc2VydmVyS2V5KSkgewogICAgICAgICAgc2VydmVyS2V5ID0gYCR7c2VydmVyS2V5fToke3VyaS5zY2hlbWUoKSA9PT0gImh0dHBzIiA/ICI0NDMiIDogIjgwIn1gOwogICAgICAgIH0KICAgICAgICBjb25zdCBsZW5ndGggPSBudW1iZXJPZkFjdGl2ZVJlcXVlc3RzQnlTZXJ2ZXJbc2VydmVyS2V5XTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChsZW5ndGgpKSB7CiAgICAgICAgICBudW1iZXJPZkFjdGl2ZVJlcXVlc3RzQnlTZXJ2ZXJbc2VydmVyS2V5XSA9IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzZXJ2ZXJLZXk7CiAgICAgIH07CiAgICAgIFJlcXVlc3RTY2hlZHVsZXIucmVxdWVzdCA9IGZ1bmN0aW9uKHJlcXVlc3QpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlcXVlc3QiLCByZXF1ZXN0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5zdHJpbmcoInJlcXVlc3QudXJsIiwgcmVxdWVzdC51cmwpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLmZ1bmMoInJlcXVlc3QucmVxdWVzdEZ1bmN0aW9uIiwgcmVxdWVzdC5yZXF1ZXN0RnVuY3Rpb24pOwogICAgICAgIGlmIChpc0RhdGFVcmlfZGVmYXVsdChyZXF1ZXN0LnVybCkgfHwgaXNCbG9iVXJpX2RlZmF1bHQocmVxdWVzdC51cmwpKSB7CiAgICAgICAgICByZXF1ZXN0Q29tcGxldGVkRXZlbnQucmFpc2VFdmVudCgpOwogICAgICAgICAgcmVxdWVzdC5zdGF0ZSA9IFJlcXVlc3RTdGF0ZV9kZWZhdWx0LlJFQ0VJVkVEOwogICAgICAgICAgcmV0dXJuIHJlcXVlc3QucmVxdWVzdEZ1bmN0aW9uKCk7CiAgICAgICAgfQogICAgICAgICsrc3RhdGlzdGljcy5udW1iZXJPZkF0dGVtcHRlZFJlcXVlc3RzOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlcXVlc3Quc2VydmVyS2V5KSkgewogICAgICAgICAgcmVxdWVzdC5zZXJ2ZXJLZXkgPSBSZXF1ZXN0U2NoZWR1bGVyLmdldFNlcnZlcktleShyZXF1ZXN0LnVybCk7CiAgICAgICAgfQogICAgICAgIGlmIChSZXF1ZXN0U2NoZWR1bGVyLnRocm90dGxlUmVxdWVzdHMgJiYgcmVxdWVzdC50aHJvdHRsZUJ5U2VydmVyICYmICFSZXF1ZXN0U2NoZWR1bGVyLnNlcnZlckhhc09wZW5TbG90cyhyZXF1ZXN0LnNlcnZlcktleSkpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGlmICghUmVxdWVzdFNjaGVkdWxlci50aHJvdHRsZVJlcXVlc3RzIHx8ICFyZXF1ZXN0LnRocm90dGxlKSB7CiAgICAgICAgICByZXR1cm4gc3RhcnRSZXF1ZXN0KHJlcXVlc3QpOwogICAgICAgIH0KICAgICAgICBpZiAoYWN0aXZlUmVxdWVzdHMubGVuZ3RoID49IFJlcXVlc3RTY2hlZHVsZXIubWF4aW11bVJlcXVlc3RzKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICB1cGRhdGVQcmlvcml0eShyZXF1ZXN0KTsKICAgICAgICBjb25zdCByZW1vdmVkUmVxdWVzdCA9IHJlcXVlc3RIZWFwLmluc2VydChyZXF1ZXN0KTsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHJlbW92ZWRSZXF1ZXN0KSkgewogICAgICAgICAgaWYgKHJlbW92ZWRSZXF1ZXN0ID09PSByZXF1ZXN0KSB7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgICB9CiAgICAgICAgICBjYW5jZWxSZXF1ZXN0KHJlbW92ZWRSZXF1ZXN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlzc3VlUmVxdWVzdChyZXF1ZXN0KTsKICAgICAgfTsKICAgICAgUmVxdWVzdFNjaGVkdWxlci5jbGVhckZvclNwZWNzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgd2hpbGUgKHJlcXVlc3RIZWFwLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSByZXF1ZXN0SGVhcC5wb3AoKTsKICAgICAgICAgIGNhbmNlbFJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxlbmd0aCA9IGFjdGl2ZVJlcXVlc3RzLmxlbmd0aDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgICBjYW5jZWxSZXF1ZXN0KGFjdGl2ZVJlcXVlc3RzW2ldKTsKICAgICAgICB9CiAgICAgICAgYWN0aXZlUmVxdWVzdHMubGVuZ3RoID0gMDsKICAgICAgICBudW1iZXJPZkFjdGl2ZVJlcXVlc3RzQnlTZXJ2ZXIgPSB7fTsKICAgICAgICBzdGF0aXN0aWNzLm51bWJlck9mQXR0ZW1wdGVkUmVxdWVzdHMgPSAwOwogICAgICAgIHN0YXRpc3RpY3MubnVtYmVyT2ZBY3RpdmVSZXF1ZXN0cyA9IDA7CiAgICAgICAgc3RhdGlzdGljcy5udW1iZXJPZkNhbmNlbGxlZFJlcXVlc3RzID0gMDsKICAgICAgICBzdGF0aXN0aWNzLm51bWJlck9mQ2FuY2VsbGVkQWN0aXZlUmVxdWVzdHMgPSAwOwogICAgICAgIHN0YXRpc3RpY3MubnVtYmVyT2ZGYWlsZWRSZXF1ZXN0cyA9IDA7CiAgICAgICAgc3RhdGlzdGljcy5udW1iZXJPZkFjdGl2ZVJlcXVlc3RzRXZlciA9IDA7CiAgICAgICAgc3RhdGlzdGljcy5sYXN0TnVtYmVyT2ZBY3RpdmVSZXF1ZXN0cyA9IDA7CiAgICAgIH07CiAgICAgIFJlcXVlc3RTY2hlZHVsZXIubnVtYmVyT2ZBY3RpdmVSZXF1ZXN0c0J5U2VydmVyID0gZnVuY3Rpb24oc2VydmVyS2V5KSB7CiAgICAgICAgcmV0dXJuIG51bWJlck9mQWN0aXZlUmVxdWVzdHNCeVNlcnZlcltzZXJ2ZXJLZXldOwogICAgICB9OwogICAgICBSZXF1ZXN0U2NoZWR1bGVyLnJlcXVlc3RIZWFwID0gcmVxdWVzdEhlYXA7CiAgICAgIFJlcXVlc3RTY2hlZHVsZXJfZGVmYXVsdCA9IFJlcXVlc3RTY2hlZHVsZXI7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9UcnVzdGVkU2VydmVycy5qcwogIGZ1bmN0aW9uIGdldEF1dGhvcml0eSh1cmwpIHsKICAgIGNvbnN0IHVyaSA9IG5ldyBpbXBvcnRfdXJpanM1LmRlZmF1bHQodXJsKTsKICAgIHVyaS5ub3JtYWxpemUoKTsKICAgIGxldCBhdXRob3JpdHkgPSB1cmkuYXV0aG9yaXR5KCk7CiAgICBpZiAoYXV0aG9yaXR5Lmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gdm9pZCAwOwogICAgfQogICAgdXJpLmF1dGhvcml0eShhdXRob3JpdHkpOwogICAgaWYgKGF1dGhvcml0eS5pbmRleE9mKCJAIikgIT09IC0xKSB7CiAgICAgIGNvbnN0IHBhcnRzID0gYXV0aG9yaXR5LnNwbGl0KCJAIik7CiAgICAgIGF1dGhvcml0eSA9IHBhcnRzWzFdOwogICAgfQogICAgaWYgKGF1dGhvcml0eS5pbmRleE9mKCI6IikgPT09IC0xKSB7CiAgICAgIGxldCBzY2hlbWUgPSB1cmkuc2NoZW1lKCk7CiAgICAgIGlmIChzY2hlbWUubGVuZ3RoID09PSAwKSB7CiAgICAgICAgc2NoZW1lID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sOwogICAgICAgIHNjaGVtZSA9IHNjaGVtZS5zdWJzdHJpbmcoMCwgc2NoZW1lLmxlbmd0aCAtIDEpOwogICAgICB9CiAgICAgIGlmIChzY2hlbWUgPT09ICJodHRwIikgewogICAgICAgIGF1dGhvcml0eSArPSAiOjgwIjsKICAgICAgfSBlbHNlIGlmIChzY2hlbWUgPT09ICJodHRwcyIpIHsKICAgICAgICBhdXRob3JpdHkgKz0gIjo0NDMiOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBhdXRob3JpdHk7CiAgfQogIHZhciBpbXBvcnRfdXJpanM1LCBUcnVzdGVkU2VydmVycywgX3NlcnZlcnMsIFRydXN0ZWRTZXJ2ZXJzX2RlZmF1bHQ7CiAgdmFyIGluaXRfVHJ1c3RlZFNlcnZlcnMgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1RydXN0ZWRTZXJ2ZXJzLmpzIigpIHsKICAgICAgaW1wb3J0X3VyaWpzNSA9IF9fdG9FU00ocmVxdWlyZV9VUkkoKSwgMSk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIFRydXN0ZWRTZXJ2ZXJzID0ge307CiAgICAgIF9zZXJ2ZXJzID0ge307CiAgICAgIFRydXN0ZWRTZXJ2ZXJzLmFkZCA9IGZ1bmN0aW9uKGhvc3QsIHBvcnQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChob3N0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImhvc3QgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHBvcnQpIHx8IHBvcnQgPD0gMCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInBvcnQgaXMgcmVxdWlyZWQgdG8gYmUgZ3JlYXRlciB0aGFuIDAuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGF1dGhvcml0eSA9IGAke2hvc3QudG9Mb3dlckNhc2UoKX06JHtwb3J0fWA7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoX3NlcnZlcnNbYXV0aG9yaXR5XSkpIHsKICAgICAgICAgIF9zZXJ2ZXJzW2F1dGhvcml0eV0gPSB0cnVlOwogICAgICAgIH0KICAgICAgfTsKICAgICAgVHJ1c3RlZFNlcnZlcnMucmVtb3ZlID0gZnVuY3Rpb24oaG9zdCwgcG9ydCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGhvc3QpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiaG9zdCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocG9ydCkgfHwgcG9ydCA8PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgicG9ydCBpcyByZXF1aXJlZCB0byBiZSBncmVhdGVyIHRoYW4gMC4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYXV0aG9yaXR5ID0gYCR7aG9zdC50b0xvd2VyQ2FzZSgpfToke3BvcnR9YDsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KF9zZXJ2ZXJzW2F1dGhvcml0eV0pKSB7CiAgICAgICAgICBkZWxldGUgX3NlcnZlcnNbYXV0aG9yaXR5XTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFRydXN0ZWRTZXJ2ZXJzLmNvbnRhaW5zID0gZnVuY3Rpb24odXJsKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodXJsKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInVybCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYXV0aG9yaXR5ID0gZ2V0QXV0aG9yaXR5KHVybCk7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChhdXRob3JpdHkpICYmIGRlZmluZWRfZGVmYXVsdChfc2VydmVyc1thdXRob3JpdHldKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfTsKICAgICAgVHJ1c3RlZFNlcnZlcnMuY2xlYXIgPSBmdW5jdGlvbigpIHsKICAgICAgICBfc2VydmVycyA9IHt9OwogICAgICB9OwogICAgICBUcnVzdGVkU2VydmVyc19kZWZhdWx0ID0gVHJ1c3RlZFNlcnZlcnM7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9SZXNvdXJjZS5qcwogIGZ1bmN0aW9uIFJlc291cmNlKG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIpIHsKICAgICAgb3B0aW9ucyA9IHsKICAgICAgICB1cmw6IG9wdGlvbnMKICAgICAgfTsKICAgIH0KICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLnN0cmluZygib3B0aW9ucy51cmwiLCBvcHRpb25zLnVybCk7CiAgICB0aGlzLl91cmwgPSB2b2lkIDA7CiAgICB0aGlzLl90ZW1wbGF0ZVZhbHVlcyA9IGRlZmF1bHRDbG9uZShvcHRpb25zLnRlbXBsYXRlVmFsdWVzLCB7fSk7CiAgICB0aGlzLl9xdWVyeVBhcmFtZXRlcnMgPSBkZWZhdWx0Q2xvbmUob3B0aW9ucy5xdWVyeVBhcmFtZXRlcnMsIHt9KTsKICAgIHRoaXMuaGVhZGVycyA9IGRlZmF1bHRDbG9uZShvcHRpb25zLmhlYWRlcnMsIHt9KTsKICAgIHRoaXMucmVxdWVzdCA9IG9wdGlvbnMucmVxdWVzdCA/PyBuZXcgUmVxdWVzdF9kZWZhdWx0KCk7CiAgICB0aGlzLnByb3h5ID0gb3B0aW9ucy5wcm94eTsKICAgIHRoaXMucmV0cnlDYWxsYmFjayA9IG9wdGlvbnMucmV0cnlDYWxsYmFjazsKICAgIHRoaXMucmV0cnlBdHRlbXB0cyA9IG9wdGlvbnMucmV0cnlBdHRlbXB0cyA/PyAwOwogICAgdGhpcy5fcmV0cnlDb3VudCA9IDA7CiAgICBjb25zdCBwYXJzZVVybCA9IG9wdGlvbnMucGFyc2VVcmwgPz8gdHJ1ZTsKICAgIGlmIChwYXJzZVVybCkgewogICAgICB0aGlzLnBhcnNlVXJsKG9wdGlvbnMudXJsLCB0cnVlLCB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuX3VybCA9IG9wdGlvbnMudXJsOwogICAgfQogICAgdGhpcy5fY3JlZGl0cyA9IG9wdGlvbnMuY3JlZGl0czsKICB9CiAgZnVuY3Rpb24gZGVmYXVsdENsb25lKHZhbHVlLCBkZWZhdWx0VmFsdWUpIHsKICAgIHJldHVybiBkZWZpbmVkX2RlZmF1bHQodmFsdWUpID8gY2xvbmVfZGVmYXVsdCh2YWx1ZSkgOiBkZWZhdWx0VmFsdWU7CiAgfQogIGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmcocXVlcnlTdHJpbmcpIHsKICAgIGlmIChxdWVyeVN0cmluZy5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIHt9OwogICAgfQogICAgaWYgKHF1ZXJ5U3RyaW5nLmluZGV4T2YoIj0iKSA9PT0gLTEpIHsKICAgICAgcmV0dXJuIHsgW3F1ZXJ5U3RyaW5nXTogdm9pZCAwIH07CiAgICB9CiAgICByZXR1cm4gcXVlcnlUb09iamVjdF9kZWZhdWx0KHF1ZXJ5U3RyaW5nKTsKICB9CiAgZnVuY3Rpb24gY29tYmluZVF1ZXJ5UGFyYW1ldGVycyhxMTIsIHEyMiwgcHJlc2VydmVRdWVyeVBhcmFtZXRlcnMpIHsKICAgIGlmICghcHJlc2VydmVRdWVyeVBhcmFtZXRlcnMpIHsKICAgICAgcmV0dXJuIGNvbWJpbmVfZGVmYXVsdChxMTIsIHEyMik7CiAgICB9CiAgICBjb25zdCByZXN1bHQgPSBjbG9uZV9kZWZhdWx0KHExMiwgdHJ1ZSk7CiAgICBmb3IgKGNvbnN0IHBhcmFtIGluIHEyMikgewogICAgICBpZiAocTIyLmhhc093blByb3BlcnR5KHBhcmFtKSkgewogICAgICAgIGxldCB2YWx1ZSA9IHJlc3VsdFtwYXJhbV07CiAgICAgICAgY29uc3QgcTJWYWx1ZSA9IHEyMltwYXJhbV07CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdCh2YWx1ZSkpIHsKICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgICAgdmFsdWUgPSByZXN1bHRbcGFyYW1dID0gW3ZhbHVlXTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdFtwYXJhbV0gPSB2YWx1ZS5jb25jYXQocTJWYWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdFtwYXJhbV0gPSBBcnJheS5pc0FycmF5KHEyVmFsdWUpID8gcTJWYWx1ZS5zbGljZSgpIDogcTJWYWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIHN0cmluZ2lmeVF1ZXJ5KHF1ZXJ5T2JqZWN0KSB7CiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocXVlcnlPYmplY3QpOwogICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSAmJiAhZGVmaW5lZF9kZWZhdWx0KHF1ZXJ5T2JqZWN0W2tleXNbMF1dKSkgewogICAgICByZXR1cm4gYD8ke2tleXNbMF19YDsKICAgIH0KICAgIHJldHVybiBgPyR7b2JqZWN0VG9RdWVyeV9kZWZhdWx0KHF1ZXJ5T2JqZWN0KX1gOwogIH0KICBmdW5jdGlvbiBmZXRjaEltYWdlKG9wdGlvbnMpIHsKICAgIGNvbnN0IHJlc291cmNlID0gb3B0aW9ucy5yZXNvdXJjZTsKICAgIGNvbnN0IGZsaXBZID0gb3B0aW9ucy5mbGlwWTsKICAgIGNvbnN0IHNraXBDb2xvclNwYWNlQ29udmVyc2lvbiA9IG9wdGlvbnMuc2tpcENvbG9yU3BhY2VDb252ZXJzaW9uOwogICAgY29uc3QgcHJlZmVySW1hZ2VCaXRtYXAgPSBvcHRpb25zLnByZWZlckltYWdlQml0bWFwOwogICAgY29uc3QgcmVxdWVzdCA9IHJlc291cmNlLnJlcXVlc3Q7CiAgICByZXF1ZXN0LnVybCA9IHJlc291cmNlLnVybDsKICAgIHJlcXVlc3QucmVxdWVzdEZ1bmN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgIGxldCBjcm9zc09yaWdpbiA9IGZhbHNlOwogICAgICBpZiAoIXJlc291cmNlLmlzRGF0YVVyaSAmJiAhcmVzb3VyY2UuaXNCbG9iVXJpKSB7CiAgICAgICAgY3Jvc3NPcmlnaW4gPSByZXNvdXJjZS5pc0Nyb3NzT3JpZ2luVXJsOwogICAgICB9CiAgICAgIGNvbnN0IGRlZmVycmVkID0gZGVmZXJfZGVmYXVsdCgpOwogICAgICBSZXNvdXJjZS5fSW1wbGVtZW50YXRpb25zLmNyZWF0ZUltYWdlKAogICAgICAgIHJlcXVlc3QsCiAgICAgICAgY3Jvc3NPcmlnaW4sCiAgICAgICAgZGVmZXJyZWQsCiAgICAgICAgZmxpcFksCiAgICAgICAgc2tpcENvbG9yU3BhY2VDb252ZXJzaW9uLAogICAgICAgIHByZWZlckltYWdlQml0bWFwCiAgICAgICk7CiAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOwogICAgfTsKICAgIGNvbnN0IHByb21pc2UgPSBSZXF1ZXN0U2NoZWR1bGVyX2RlZmF1bHQucmVxdWVzdChyZXF1ZXN0KTsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHByb21pc2UpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHJldHVybiBwcm9taXNlLmNhdGNoKGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKHJlcXVlc3Quc3RhdGUgIT09IFJlcXVlc3RTdGF0ZV9kZWZhdWx0LkZBSUxFRCkgewogICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzb3VyY2UucmV0cnlPbkVycm9yKGUpLnRoZW4oZnVuY3Rpb24ocmV0cnkpIHsKICAgICAgICBpZiAocmV0cnkpIHsKICAgICAgICAgIHJlcXVlc3Quc3RhdGUgPSBSZXF1ZXN0U3RhdGVfZGVmYXVsdC5VTklTU1VFRDsKICAgICAgICAgIHJlcXVlc3QuZGVmZXJyZWQgPSB2b2lkIDA7CiAgICAgICAgICByZXR1cm4gZmV0Y2hJbWFnZSh7CiAgICAgICAgICAgIHJlc291cmNlLAogICAgICAgICAgICBmbGlwWSwKICAgICAgICAgICAgc2tpcENvbG9yU3BhY2VDb252ZXJzaW9uLAogICAgICAgICAgICBwcmVmZXJJbWFnZUJpdG1hcAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTsKICAgICAgfSk7CiAgICB9KTsKICB9CiAgZnVuY3Rpb24gZmV0Y2hKc29ucChyZXNvdXJjZSwgY2FsbGJhY2tQYXJhbWV0ZXJOYW1lLCBmdW5jdGlvbk5hbWUpIHsKICAgIGNvbnN0IGNhbGxiYWNrUXVlcnkgPSB7fTsKICAgIGNhbGxiYWNrUXVlcnlbY2FsbGJhY2tQYXJhbWV0ZXJOYW1lXSA9IGZ1bmN0aW9uTmFtZTsKICAgIHJlc291cmNlLnNldFF1ZXJ5UGFyYW1ldGVycyhjYWxsYmFja1F1ZXJ5KTsKICAgIGNvbnN0IHJlcXVlc3QgPSByZXNvdXJjZS5yZXF1ZXN0OwogICAgY29uc3QgdXJsID0gcmVzb3VyY2UudXJsOwogICAgcmVxdWVzdC51cmwgPSB1cmw7CiAgICByZXF1ZXN0LnJlcXVlc3RGdW5jdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICBjb25zdCBkZWZlcnJlZCA9IGRlZmVyX2RlZmF1bHQoKTsKICAgICAgd2luZG93W2Z1bmN0aW9uTmFtZV0gPSBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShkYXRhKTsKICAgICAgICB0cnkgewogICAgICAgICAgZGVsZXRlIHdpbmRvd1tmdW5jdGlvbk5hbWVdOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHdpbmRvd1tmdW5jdGlvbk5hbWVdID0gdm9pZCAwOwogICAgICAgIH0KICAgICAgfTsKICAgICAgUmVzb3VyY2UuX0ltcGxlbWVudGF0aW9ucy5sb2FkQW5kRXhlY3V0ZVNjcmlwdCh1cmwsIGZ1bmN0aW9uTmFtZSwgZGVmZXJyZWQpOwogICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKICAgIH07CiAgICBjb25zdCBwcm9taXNlID0gUmVxdWVzdFNjaGVkdWxlcl9kZWZhdWx0LnJlcXVlc3QocmVxdWVzdCk7CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwcm9taXNlKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICByZXR1cm4gcHJvbWlzZS5jYXRjaChmdW5jdGlvbihlKSB7CiAgICAgIGlmIChyZXF1ZXN0LnN0YXRlICE9PSBSZXF1ZXN0U3RhdGVfZGVmYXVsdC5GQUlMRUQpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc291cmNlLnJldHJ5T25FcnJvcihlKS50aGVuKGZ1bmN0aW9uKHJldHJ5KSB7CiAgICAgICAgaWYgKHJldHJ5KSB7CiAgICAgICAgICByZXF1ZXN0LnN0YXRlID0gUmVxdWVzdFN0YXRlX2RlZmF1bHQuVU5JU1NVRUQ7CiAgICAgICAgICByZXF1ZXN0LmRlZmVycmVkID0gdm9pZCAwOwogICAgICAgICAgcmV0dXJuIGZldGNoSnNvbnAocmVzb3VyY2UsIGNhbGxiYWNrUGFyYW1ldGVyTmFtZSwgZnVuY3Rpb25OYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOwogICAgICB9KTsKICAgIH0pOwogIH0KICBmdW5jdGlvbiBjaGVja0FuZFJlc2V0UmVxdWVzdChyZXF1ZXN0KSB7CiAgICBpZiAocmVxdWVzdC5zdGF0ZSA9PT0gUmVxdWVzdFN0YXRlX2RlZmF1bHQuSVNTVUVEIHx8IHJlcXVlc3Quc3RhdGUgPT09IFJlcXVlc3RTdGF0ZV9kZWZhdWx0LkFDVElWRSkgewogICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yX2RlZmF1bHQoIlRoZSBSZXNvdXJjZSBpcyBhbHJlYWR5IGJlaW5nIGZldGNoZWQuIik7CiAgICB9CiAgICByZXF1ZXN0LnN0YXRlID0gUmVxdWVzdFN0YXRlX2RlZmF1bHQuVU5JU1NVRUQ7CiAgICByZXF1ZXN0LmRlZmVycmVkID0gdm9pZCAwOwogIH0KICBmdW5jdGlvbiBkZWNvZGVEYXRhVXJpVGV4dChpc0Jhc2U2NCwgZGF0YSkgewogICAgY29uc3QgcmVzdWx0ID0gZGVjb2RlVVJJQ29tcG9uZW50KGRhdGEpOwogICAgaWYgKGlzQmFzZTY0KSB7CiAgICAgIHJldHVybiBhdG9iKHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBmdW5jdGlvbiBkZWNvZGVEYXRhVXJpQXJyYXlCdWZmZXIoaXNCYXNlNjQsIGRhdGEpIHsKICAgIGNvbnN0IGJ5dGVTdHJpbmcgPSBkZWNvZGVEYXRhVXJpVGV4dChpc0Jhc2U2NCwgZGF0YSk7CiAgICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZVN0cmluZy5sZW5ndGgpOwogICAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVTdHJpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgdmlld1tpXSA9IGJ5dGVTdHJpbmcuY2hhckNvZGVBdChpKTsKICAgIH0KICAgIHJldHVybiBidWZmZXI7CiAgfQogIGZ1bmN0aW9uIGRlY29kZURhdGFVcmkoZGF0YVVyaVJlZ2V4UmVzdWx0LCByZXNwb25zZVR5cGUpIHsKICAgIHJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZSA/PyAiIjsKICAgIGNvbnN0IG1pbWVUeXBlID0gZGF0YVVyaVJlZ2V4UmVzdWx0WzFdOwogICAgY29uc3QgaXNCYXNlNjQgPSAhIWRhdGFVcmlSZWdleFJlc3VsdFsyXTsKICAgIGNvbnN0IGRhdGEgPSBkYXRhVXJpUmVnZXhSZXN1bHRbM107CiAgICBsZXQgYnVmZmVyOwogICAgbGV0IHBhcnNlcjsKICAgIHN3aXRjaCAocmVzcG9uc2VUeXBlKSB7CiAgICAgIGNhc2UgIiI6CiAgICAgIGNhc2UgInRleHQiOgogICAgICAgIHJldHVybiBkZWNvZGVEYXRhVXJpVGV4dChpc0Jhc2U2NCwgZGF0YSk7CiAgICAgIGNhc2UgImFycmF5YnVmZmVyIjoKICAgICAgICByZXR1cm4gZGVjb2RlRGF0YVVyaUFycmF5QnVmZmVyKGlzQmFzZTY0LCBkYXRhKTsKICAgICAgY2FzZSAiYmxvYiI6CiAgICAgICAgYnVmZmVyID0gZGVjb2RlRGF0YVVyaUFycmF5QnVmZmVyKGlzQmFzZTY0LCBkYXRhKTsKICAgICAgICByZXR1cm4gbmV3IEJsb2IoW2J1ZmZlcl0sIHsKICAgICAgICAgIHR5cGU6IG1pbWVUeXBlCiAgICAgICAgfSk7CiAgICAgIGNhc2UgImRvY3VtZW50IjoKICAgICAgICBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7CiAgICAgICAgcmV0dXJuIHBhcnNlci5wYXJzZUZyb21TdHJpbmcoCiAgICAgICAgICBkZWNvZGVEYXRhVXJpVGV4dChpc0Jhc2U2NCwgZGF0YSksCiAgICAgICAgICBtaW1lVHlwZQogICAgICAgICk7CiAgICAgIGNhc2UgImpzb24iOgogICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZURhdGFVcmlUZXh0KGlzQmFzZTY0LCBkYXRhKSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoYFVuaGFuZGxlZCByZXNwb25zZVR5cGU6ICR7cmVzcG9uc2VUeXBlfWApOwogICAgfQogIH0KICBmdW5jdGlvbiBsb2FkV2l0aEh0dHBSZXF1ZXN0KHVybCwgcmVzcG9uc2VUeXBlLCBtZXRob2QsIGRhdGEsIGhlYWRlcnMsIGRlZmVycmVkLCBvdmVycmlkZU1pbWVUeXBlKSB7CiAgICBmZXRjaCh1cmwsIHsKICAgICAgbWV0aG9kLAogICAgICBoZWFkZXJzCiAgICB9KS50aGVuKGFzeW5jIChyZXNwb25zZSkgPT4gewogICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0ge307CiAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7CiAgICAgICAgICByZXNwb25zZUhlYWRlcnNba2V5XSA9IHZhbHVlOwogICAgICAgIH0pOwogICAgICAgIGRlZmVycmVkLnJlamVjdCgKICAgICAgICAgIG5ldyBSZXF1ZXN0RXJyb3JFdmVudF9kZWZhdWx0KHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UsIHJlc3BvbnNlSGVhZGVycykKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkgewogICAgICAgIGNhc2UgInRleHQiOgogICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZS50ZXh0KCkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAianNvbiI6CiAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlLmpzb24oKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShuZXcgVWludDhBcnJheShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKS5idWZmZXIpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0pLmNhdGNoKCgpID0+IHsKICAgICAgZGVmZXJyZWQucmVqZWN0KG5ldyBSZXF1ZXN0RXJyb3JFdmVudF9kZWZhdWx0KCkpOwogICAgfSk7CiAgfQogIHZhciBpbXBvcnRfdXJpanM2LCB4aHJCbG9iU3VwcG9ydGVkLCBzdXBwb3J0c0ltYWdlQml0bWFwT3B0aW9uc1Byb21pc2UsIGRhdGFVcmlSZWdleDIsIG5vWE1MSHR0cFJlcXVlc3QsIFJlc291cmNlX2RlZmF1bHQ7CiAgdmFyIGluaXRfUmVzb3VyY2UgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1Jlc291cmNlLmpzIigpIHsKICAgICAgaW1wb3J0X3VyaWpzNiA9IF9fdG9FU00ocmVxdWlyZV9VUkkoKSwgMSk7CiAgICAgIGluaXRfYXBwZW5kRm9yd2FyZFNsYXNoKCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9jbG9uZSgpOwogICAgICBpbml0X2NvbWJpbmUoKTsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZlcigpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X2dldEFic29sdXRlVXJpKCk7CiAgICAgIGluaXRfZ2V0QmFzZVVyaSgpOwogICAgICBpbml0X2dldEV4dGVuc2lvbkZyb21VcmkoKTsKICAgICAgaW5pdF9nZXRJbWFnZVBpeGVscygpOwogICAgICBpbml0X2lzQmxvYlVyaSgpOwogICAgICBpbml0X2lzQ3Jvc3NPcmlnaW5VcmwoKTsKICAgICAgaW5pdF9pc0RhdGFVcmkoKTsKICAgICAgaW5pdF9sb2FkQW5kRXhlY3V0ZVNjcmlwdCgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9vYmplY3RUb1F1ZXJ5KCk7CiAgICAgIGluaXRfcXVlcnlUb09iamVjdCgpOwogICAgICBpbml0X1JlcXVlc3QoKTsKICAgICAgaW5pdF9SZXF1ZXN0RXJyb3JFdmVudCgpOwogICAgICBpbml0X1JlcXVlc3RTY2hlZHVsZXIoKTsKICAgICAgaW5pdF9SZXF1ZXN0U3RhdGUoKTsKICAgICAgaW5pdF9SdW50aW1lRXJyb3IoKTsKICAgICAgaW5pdF9UcnVzdGVkU2VydmVycygpOwogICAgICB4aHJCbG9iU3VwcG9ydGVkID0gKGZ1bmN0aW9uKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCAiIyIsIHRydWUpOwogICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJibG9iIjsKICAgICAgICAgIHJldHVybiB4aHIucmVzcG9uc2VUeXBlID09PSAiYmxvYiI7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSkoKTsKICAgICAgUmVzb3VyY2UuY3JlYXRlSWZOZWVkZWQgPSBmdW5jdGlvbihyZXNvdXJjZSkgewogICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIFJlc291cmNlKSB7CiAgICAgICAgICByZXR1cm4gcmVzb3VyY2UuZ2V0RGVyaXZlZFJlc291cmNlKHsKICAgICAgICAgICAgcmVxdWVzdDogcmVzb3VyY2UucmVxdWVzdAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgcmVzb3VyY2UgIT09ICJzdHJpbmciKSB7CiAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2UoewogICAgICAgICAgdXJsOiByZXNvdXJjZQogICAgICAgIH0pOwogICAgICB9OwogICAgICBSZXNvdXJjZS5zdXBwb3J0c0ltYWdlQml0bWFwT3B0aW9ucyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoc3VwcG9ydHNJbWFnZUJpdG1hcE9wdGlvbnNQcm9taXNlKSkgewogICAgICAgICAgcmV0dXJuIHN1cHBvcnRzSW1hZ2VCaXRtYXBPcHRpb25zUHJvbWlzZTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgc3VwcG9ydHNJbWFnZUJpdG1hcE9wdGlvbnNQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTsKICAgICAgICAgIHJldHVybiBzdXBwb3J0c0ltYWdlQml0bWFwT3B0aW9uc1Byb21pc2U7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGltYWdlRGF0YVVyaSA9ICJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFFQUFBQUJDQUlBQUFDUWQxUGVBQUFBQkdkQlRVRUFBRTRnM3JFaURnQUFBQ0JqU0ZKTkFBQjZKZ0FBZ0lRQUFQb0FBQUNBNkFBQWRUQUFBT3BnQUFBNm1BQUFGM0NjdWxFOEFBQUFERWxFUVZRSTEyTmc2R0FBQUFFVUFJbmdFM1ppQUFBQUFFbEZUa1N1UW1DQyI7CiAgICAgICAgc3VwcG9ydHNJbWFnZUJpdG1hcE9wdGlvbnNQcm9taXNlID0gUmVzb3VyY2UuZmV0Y2hCbG9iKHsKICAgICAgICAgIHVybDogaW1hZ2VEYXRhVXJpCiAgICAgICAgfSkudGhlbihmdW5jdGlvbihibG9iKSB7CiAgICAgICAgICBjb25zdCBpbWFnZUJpdG1hcE9wdGlvbnMgPSB7CiAgICAgICAgICAgIGltYWdlT3JpZW50YXRpb246ICJmbGlwWSIsCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaXMgImZyb20taW1hZ2UiCiAgICAgICAgICAgIHByZW11bHRpcGx5QWxwaGE6ICJub25lIiwKICAgICAgICAgICAgLy8gZGVmYXVsdCBpcyAiZGVmYXVsdCIKICAgICAgICAgICAgY29sb3JTcGFjZUNvbnZlcnNpb246ICJub25lIgogICAgICAgICAgICAvLyBkZWZhdWx0IGlzICJkZWZhdWx0IgogICAgICAgICAgfTsKICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbCiAgICAgICAgICAgIGNyZWF0ZUltYWdlQml0bWFwKGJsb2IsIGltYWdlQml0bWFwT3B0aW9ucyksCiAgICAgICAgICAgIGNyZWF0ZUltYWdlQml0bWFwKGJsb2IpCiAgICAgICAgICBdKTsKICAgICAgICB9KS50aGVuKGZ1bmN0aW9uKGltYWdlQml0bWFwcykgewogICAgICAgICAgY29uc3QgY29sb3JXaXRoT3B0aW9ucyA9IGdldEltYWdlUGl4ZWxzX2RlZmF1bHQoaW1hZ2VCaXRtYXBzWzBdKTsKICAgICAgICAgIGNvbnN0IGNvbG9yV2l0aERlZmF1bHRzID0gZ2V0SW1hZ2VQaXhlbHNfZGVmYXVsdChpbWFnZUJpdG1hcHNbMV0pOwogICAgICAgICAgcmV0dXJuIGNvbG9yV2l0aE9wdGlvbnNbMV0gIT09IGNvbG9yV2l0aERlZmF1bHRzWzFdOwogICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBzdXBwb3J0c0ltYWdlQml0bWFwT3B0aW9uc1Byb21pc2U7CiAgICAgIH07CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlc291cmNlLCB7CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIGJsb2JzIGFyZSBzdXBwb3J0ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgUmVzb3VyY2UKICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0KICAgICAgICAgKgogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqLwogICAgICAgIGlzQmxvYlN1cHBvcnRlZDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHhockJsb2JTdXBwb3J0ZWQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVzb3VyY2UucHJvdG90eXBlLCB7CiAgICAgICAgLyoqCiAgICAgICAgICogUXVlcnkgcGFyYW1ldGVycyBhcHBlbmRlZCB0byB0aGUgdXJsLgogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIFJlc291cmNlLnByb3RvdHlwZQogICAgICAgICAqIEB0eXBlIHtvYmplY3R9CiAgICAgICAgICoKICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKi8KICAgICAgICBxdWVyeVBhcmFtZXRlcnM6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9xdWVyeVBhcmFtZXRlcnM7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBUaGUga2V5L3ZhbHVlIHBhaXJzIHVzZWQgdG8gcmVwbGFjZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGluIHRoZSB1cmwuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgUmVzb3VyY2UucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge29iamVjdH0KICAgICAgICAgKgogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqLwogICAgICAgIHRlbXBsYXRlVmFsdWVzOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVWYWx1ZXM7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgdXJsIHRvIHRoZSByZXNvdXJjZSB3aXRoIHRlbXBsYXRlIHZhbHVlcyByZXBsYWNlZCwgcXVlcnkgc3RyaW5nIGFwcGVuZGVkIGFuZCBlbmNvZGVkIGJ5IHByb3h5IGlmIG9uZSB3YXMgc2V0LgogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIFJlc291cmNlLnByb3RvdHlwZQogICAgICAgICAqIEB0eXBlIHtzdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgdXJsOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRVcmxDb21wb25lbnQodHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICB9LAogICAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICB0aGlzLnBhcnNlVXJsKHZhbHVlLCBmYWxzZSwgZmFsc2UpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGZpbGUgZXh0ZW5zaW9uIG9mIHRoZSByZXNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBSZXNvdXJjZS5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfQogICAgICAgICAqCiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICovCiAgICAgICAgZXh0ZW5zaW9uOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gZ2V0RXh0ZW5zaW9uRnJvbVVyaV9kZWZhdWx0KHRoaXMuX3VybCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBUcnVlIGlmIHRoZSBSZXNvdXJjZSByZWZlcnMgdG8gYSBkYXRhIFVSSS4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBSZXNvdXJjZS5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0KICAgICAgICAgKi8KICAgICAgICBpc0RhdGFVcmk6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBpc0RhdGFVcmlfZGVmYXVsdCh0aGlzLl91cmwpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogVHJ1ZSBpZiB0aGUgUmVzb3VyY2UgcmVmZXJzIHRvIGEgYmxvYiBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgUmVzb3VyY2UucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59CiAgICAgICAgICovCiAgICAgICAgaXNCbG9iVXJpOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gaXNCbG9iVXJpX2RlZmF1bHQodGhpcy5fdXJsKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIFRydWUgaWYgdGhlIFJlc291cmNlIHJlZmVycyB0byBhIGNyb3NzIG9yaWdpbiBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgUmVzb3VyY2UucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59CiAgICAgICAgICovCiAgICAgICAgaXNDcm9zc09yaWdpblVybDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGlzQ3Jvc3NPcmlnaW5VcmxfZGVmYXVsdCh0aGlzLl91cmwpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogVHJ1ZSBpZiB0aGUgUmVzb3VyY2UgaGFzIHJlcXVlc3QgaGVhZGVycy4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNoZWNraW5nIGlmIHRoZSBoZWFkZXJzIHByb3BlcnR5IGhhcyBhbnkga2V5cy4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBSZXNvdXJjZS5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0KICAgICAgICAgKi8KICAgICAgICBoYXNIZWFkZXJzOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5oZWFkZXJzKS5sZW5ndGggPiAwOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgY3JlZGl0cyByZXF1aXJlZCBmb3IgYXR0cmlidXRpb24gb2YgYW4gYXNzZXQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBjcmVkaXRzOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY3JlZGl0czsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBSZXNvdXJjZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRVcmxDb21wb25lbnQodHJ1ZSwgdHJ1ZSk7CiAgICAgIH07CiAgICAgIFJlc291cmNlLnByb3RvdHlwZS5wYXJzZVVybCA9IGZ1bmN0aW9uKHVybCwgbWVyZ2UsIHByZXNlcnZlUXVlcnksIGJhc2VVcmwpIHsKICAgICAgICBsZXQgdXJpID0gbmV3IGltcG9ydF91cmlqczYuZGVmYXVsdCh1cmwpOwogICAgICAgIGNvbnN0IHF1ZXJ5ID0gcGFyc2VRdWVyeVN0cmluZyh1cmkucXVlcnkoKSk7CiAgICAgICAgdGhpcy5fcXVlcnlQYXJhbWV0ZXJzID0gbWVyZ2UgPyBjb21iaW5lUXVlcnlQYXJhbWV0ZXJzKHF1ZXJ5LCB0aGlzLnF1ZXJ5UGFyYW1ldGVycywgcHJlc2VydmVRdWVyeSkgOiBxdWVyeTsKICAgICAgICB1cmkuc2VhcmNoKCIiKTsKICAgICAgICB1cmkuZnJhZ21lbnQoIiIpOwogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoYmFzZVVybCkgJiYgdXJpLnNjaGVtZSgpID09PSAiIikgewogICAgICAgICAgdXJpID0gdXJpLmFic29sdXRlVG8oZ2V0QWJzb2x1dGVVcmlfZGVmYXVsdChiYXNlVXJsKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3VybCA9IHVyaS50b1N0cmluZygpOwogICAgICB9OwogICAgICBSZXNvdXJjZS5wcm90b3R5cGUuZ2V0VXJsQ29tcG9uZW50ID0gZnVuY3Rpb24ocXVlcnksIHByb3h5KSB7CiAgICAgICAgaWYgKHRoaXMuaXNEYXRhVXJpKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fdXJsOwogICAgICAgIH0KICAgICAgICBsZXQgdXJsID0gdGhpcy5fdXJsOwogICAgICAgIGlmIChxdWVyeSkgewogICAgICAgICAgdXJsID0gYCR7dXJsfSR7c3RyaW5naWZ5UXVlcnkodGhpcy5xdWVyeVBhcmFtZXRlcnMpfWA7CiAgICAgICAgfQogICAgICAgIHVybCA9IHVybC5yZXBsYWNlKC8lN0IvZywgInsiKS5yZXBsYWNlKC8lN0QvZywgIn0iKTsKICAgICAgICBjb25zdCB0ZW1wbGF0ZVZhbHVlcyA9IHRoaXMuX3RlbXBsYXRlVmFsdWVzOwogICAgICAgIGlmIChPYmplY3Qua2V5cyh0ZW1wbGF0ZVZhbHVlcykubGVuZ3RoID4gMCkgewogICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoL3soLio/KX0vZywgZnVuY3Rpb24obWF0Y2gsIGtleSkgewogICAgICAgICAgICBjb25zdCByZXBsYWNlbWVudCA9IHRlbXBsYXRlVmFsdWVzW2tleV07CiAgICAgICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQocmVwbGFjZW1lbnQpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChyZXBsYWNlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmIChwcm94eSAmJiBkZWZpbmVkX2RlZmF1bHQodGhpcy5wcm94eSkpIHsKICAgICAgICAgIHVybCA9IHRoaXMucHJveHkuZ2V0VVJMKHVybCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1cmw7CiAgICAgIH07CiAgICAgIFJlc291cmNlLnByb3RvdHlwZS5zZXRRdWVyeVBhcmFtZXRlcnMgPSBmdW5jdGlvbihwYXJhbXMsIHVzZUFzRGVmYXVsdCkgewogICAgICAgIGlmICh1c2VBc0RlZmF1bHQpIHsKICAgICAgICAgIHRoaXMuX3F1ZXJ5UGFyYW1ldGVycyA9IGNvbWJpbmVRdWVyeVBhcmFtZXRlcnMoCiAgICAgICAgICAgIHRoaXMuX3F1ZXJ5UGFyYW1ldGVycywKICAgICAgICAgICAgcGFyYW1zLAogICAgICAgICAgICBmYWxzZQogICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5fcXVlcnlQYXJhbWV0ZXJzID0gY29tYmluZVF1ZXJ5UGFyYW1ldGVycygKICAgICAgICAgICAgcGFyYW1zLAogICAgICAgICAgICB0aGlzLl9xdWVyeVBhcmFtZXRlcnMsCiAgICAgICAgICAgIGZhbHNlCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgUmVzb3VyY2UucHJvdG90eXBlLmFwcGVuZFF1ZXJ5UGFyYW1ldGVycyA9IGZ1bmN0aW9uKHBhcmFtcykgewogICAgICAgIHRoaXMuX3F1ZXJ5UGFyYW1ldGVycyA9IGNvbWJpbmVRdWVyeVBhcmFtZXRlcnMoCiAgICAgICAgICBwYXJhbXMsCiAgICAgICAgICB0aGlzLl9xdWVyeVBhcmFtZXRlcnMsCiAgICAgICAgICB0cnVlCiAgICAgICAgKTsKICAgICAgfTsKICAgICAgUmVzb3VyY2UucHJvdG90eXBlLnNldFRlbXBsYXRlVmFsdWVzID0gZnVuY3Rpb24odGVtcGxhdGUsIHVzZUFzRGVmYXVsdCkgewogICAgICAgIGlmICh1c2VBc0RlZmF1bHQpIHsKICAgICAgICAgIHRoaXMuX3RlbXBsYXRlVmFsdWVzID0gY29tYmluZV9kZWZhdWx0KHRoaXMuX3RlbXBsYXRlVmFsdWVzLCB0ZW1wbGF0ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX3RlbXBsYXRlVmFsdWVzID0gY29tYmluZV9kZWZhdWx0KHRlbXBsYXRlLCB0aGlzLl90ZW1wbGF0ZVZhbHVlcyk7CiAgICAgICAgfQogICAgICB9OwogICAgICBSZXNvdXJjZS5wcm90b3R5cGUuZ2V0RGVyaXZlZFJlc291cmNlID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5jbG9uZSgpOwogICAgICAgIHJlc291cmNlLl9yZXRyeUNvdW50ID0gMDsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG9wdGlvbnMudXJsKSkgewogICAgICAgICAgY29uc3QgcHJlc2VydmVRdWVyeSA9IG9wdGlvbnMucHJlc2VydmVRdWVyeVBhcmFtZXRlcnMgPz8gZmFsc2U7CiAgICAgICAgICByZXNvdXJjZS5wYXJzZVVybChvcHRpb25zLnVybCwgdHJ1ZSwgcHJlc2VydmVRdWVyeSwgdGhpcy5fdXJsKTsKICAgICAgICB9CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChvcHRpb25zLnF1ZXJ5UGFyYW1ldGVycykpIHsKICAgICAgICAgIHJlc291cmNlLl9xdWVyeVBhcmFtZXRlcnMgPSBjb21iaW5lX2RlZmF1bHQoCiAgICAgICAgICAgIG9wdGlvbnMucXVlcnlQYXJhbWV0ZXJzLAogICAgICAgICAgICByZXNvdXJjZS5xdWVyeVBhcmFtZXRlcnMKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQob3B0aW9ucy50ZW1wbGF0ZVZhbHVlcykpIHsKICAgICAgICAgIHJlc291cmNlLl90ZW1wbGF0ZVZhbHVlcyA9IGNvbWJpbmVfZGVmYXVsdCgKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZVZhbHVlcywKICAgICAgICAgICAgcmVzb3VyY2UudGVtcGxhdGVWYWx1ZXMKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQob3B0aW9ucy5oZWFkZXJzKSkgewogICAgICAgICAgcmVzb3VyY2UuaGVhZGVycyA9IGNvbWJpbmVfZGVmYXVsdChvcHRpb25zLmhlYWRlcnMsIHJlc291cmNlLmhlYWRlcnMpOwogICAgICAgIH0KICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG9wdGlvbnMucHJveHkpKSB7CiAgICAgICAgICByZXNvdXJjZS5wcm94eSA9IG9wdGlvbnMucHJveHk7CiAgICAgICAgfQogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQob3B0aW9ucy5yZXF1ZXN0KSkgewogICAgICAgICAgcmVzb3VyY2UucmVxdWVzdCA9IG9wdGlvbnMucmVxdWVzdDsKICAgICAgICB9CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChvcHRpb25zLnJldHJ5Q2FsbGJhY2spKSB7CiAgICAgICAgICByZXNvdXJjZS5yZXRyeUNhbGxiYWNrID0gb3B0aW9ucy5yZXRyeUNhbGxiYWNrOwogICAgICAgIH0KICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG9wdGlvbnMucmV0cnlBdHRlbXB0cykpIHsKICAgICAgICAgIHJlc291cmNlLnJldHJ5QXR0ZW1wdHMgPSBvcHRpb25zLnJldHJ5QXR0ZW1wdHM7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXNvdXJjZTsKICAgICAgfTsKICAgICAgUmVzb3VyY2UucHJvdG90eXBlLnJldHJ5T25FcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7CiAgICAgICAgY29uc3QgcmV0cnlDYWxsYmFjayA9IHRoaXMucmV0cnlDYWxsYmFjazsKICAgICAgICBpZiAodHlwZW9mIHJldHJ5Q2FsbGJhY2sgIT09ICJmdW5jdGlvbiIgfHwgdGhpcy5fcmV0cnlDb3VudCA+PSB0aGlzLnJldHJ5QXR0ZW1wdHMpIHsKICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwogICAgICAgIH0KICAgICAgICBjb25zdCB0aGF0ID0gdGhpczsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldHJ5Q2FsbGJhY2sodGhpcywgZXJyb3IpKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgICAgKyt0aGF0Ll9yZXRyeUNvdW50OwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgUmVzb3VyY2UucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZSh7CiAgICAgICAgICAgIHVybDogdGhpcy5fdXJsLAogICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnM6IHRoaXMucXVlcnlQYXJhbWV0ZXJzLAogICAgICAgICAgICB0ZW1wbGF0ZVZhbHVlczogdGhpcy50ZW1wbGF0ZVZhbHVlcywKICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLAogICAgICAgICAgICBwcm94eTogdGhpcy5wcm94eSwKICAgICAgICAgICAgcmV0cnlDYWxsYmFjazogdGhpcy5yZXRyeUNhbGxiYWNrLAogICAgICAgICAgICByZXRyeUF0dGVtcHRzOiB0aGlzLnJldHJ5QXR0ZW1wdHMsCiAgICAgICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdC5jbG9uZSgpLAogICAgICAgICAgICBwYXJzZVVybDogZmFsc2UsCiAgICAgICAgICAgIGNyZWRpdHM6IGRlZmluZWRfZGVmYXVsdCh0aGlzLmNyZWRpdHMpID8gdGhpcy5jcmVkaXRzLnNsaWNlKCkgOiB2b2lkIDAKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXN1bHQuX3VybCA9IHRoaXMuX3VybDsKICAgICAgICByZXN1bHQuX3F1ZXJ5UGFyYW1ldGVycyA9IGNsb25lX2RlZmF1bHQodGhpcy5fcXVlcnlQYXJhbWV0ZXJzKTsKICAgICAgICByZXN1bHQuX3RlbXBsYXRlVmFsdWVzID0gY2xvbmVfZGVmYXVsdCh0aGlzLl90ZW1wbGF0ZVZhbHVlcyk7CiAgICAgICAgcmVzdWx0LmhlYWRlcnMgPSBjbG9uZV9kZWZhdWx0KHRoaXMuaGVhZGVycyk7CiAgICAgICAgcmVzdWx0LnByb3h5ID0gdGhpcy5wcm94eTsKICAgICAgICByZXN1bHQucmV0cnlDYWxsYmFjayA9IHRoaXMucmV0cnlDYWxsYmFjazsKICAgICAgICByZXN1bHQucmV0cnlBdHRlbXB0cyA9IHRoaXMucmV0cnlBdHRlbXB0czsKICAgICAgICByZXN1bHQuX3JldHJ5Q291bnQgPSAwOwogICAgICAgIHJlc3VsdC5yZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0LmNsb25lKCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgUmVzb3VyY2UucHJvdG90eXBlLmdldEJhc2VVcmkgPSBmdW5jdGlvbihpbmNsdWRlUXVlcnkpIHsKICAgICAgICByZXR1cm4gZ2V0QmFzZVVyaV9kZWZhdWx0KHRoaXMuZ2V0VXJsQ29tcG9uZW50KGluY2x1ZGVRdWVyeSksIGluY2x1ZGVRdWVyeSk7CiAgICAgIH07CiAgICAgIFJlc291cmNlLnByb3RvdHlwZS5hcHBlbmRGb3J3YXJkU2xhc2ggPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl91cmwgPSBhcHBlbmRGb3J3YXJkU2xhc2hfZGVmYXVsdCh0aGlzLl91cmwpOwogICAgICB9OwogICAgICBSZXNvdXJjZS5wcm90b3R5cGUuZmV0Y2hBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmZldGNoKHsKICAgICAgICAgIHJlc3BvbnNlVHlwZTogImFycmF5YnVmZmVyIgogICAgICAgIH0pOwogICAgICB9OwogICAgICBSZXNvdXJjZS5mZXRjaEFycmF5QnVmZmVyID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIGNvbnN0IHJlc291cmNlID0gbmV3IFJlc291cmNlKG9wdGlvbnMpOwogICAgICAgIHJldHVybiByZXNvdXJjZS5mZXRjaEFycmF5QnVmZmVyKCk7CiAgICAgIH07CiAgICAgIFJlc291cmNlLnByb3RvdHlwZS5mZXRjaEJsb2IgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5mZXRjaCh7CiAgICAgICAgICByZXNwb25zZVR5cGU6ICJibG9iIgogICAgICAgIH0pOwogICAgICB9OwogICAgICBSZXNvdXJjZS5mZXRjaEJsb2IgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2Uob3B0aW9ucyk7CiAgICAgICAgcmV0dXJuIHJlc291cmNlLmZldGNoQmxvYigpOwogICAgICB9OwogICAgICBSZXNvdXJjZS5wcm90b3R5cGUuZmV0Y2hJbWFnZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICAgICAgY29uc3QgcHJlZmVySW1hZ2VCaXRtYXAgPSBvcHRpb25zLnByZWZlckltYWdlQml0bWFwID8/IGZhbHNlOwogICAgICAgIGNvbnN0IHByZWZlckJsb2IgPSBvcHRpb25zLnByZWZlckJsb2IgPz8gZmFsc2U7CiAgICAgICAgY29uc3QgZmxpcFkgPSBvcHRpb25zLmZsaXBZID8/IGZhbHNlOwogICAgICAgIGNvbnN0IHNraXBDb2xvclNwYWNlQ29udmVyc2lvbiA9IG9wdGlvbnMuc2tpcENvbG9yU3BhY2VDb252ZXJzaW9uID8/IGZhbHNlOwogICAgICAgIGNoZWNrQW5kUmVzZXRSZXF1ZXN0KHRoaXMucmVxdWVzdCk7CiAgICAgICAgaWYgKCF4aHJCbG9iU3VwcG9ydGVkIHx8IHRoaXMuaXNEYXRhVXJpIHx8IHRoaXMuaXNCbG9iVXJpIHx8ICF0aGlzLmhhc0hlYWRlcnMgJiYgIXByZWZlckJsb2IpIHsKICAgICAgICAgIHJldHVybiBmZXRjaEltYWdlKHsKICAgICAgICAgICAgcmVzb3VyY2U6IHRoaXMsCiAgICAgICAgICAgIGZsaXBZLAogICAgICAgICAgICBza2lwQ29sb3JTcGFjZUNvbnZlcnNpb24sCiAgICAgICAgICAgIHByZWZlckltYWdlQml0bWFwCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYmxvYlByb21pc2UgPSB0aGlzLmZldGNoQmxvYigpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGJsb2JQcm9taXNlKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsZXQgc3VwcG9ydHNJbWFnZUJpdG1hcDsKICAgICAgICBsZXQgdXNlSW1hZ2VCaXRtYXA7CiAgICAgICAgbGV0IGdlbmVyYXRlZEJsb2JSZXNvdXJjZTsKICAgICAgICBsZXQgZ2VuZXJhdGVkQmxvYjsKICAgICAgICByZXR1cm4gUmVzb3VyY2Uuc3VwcG9ydHNJbWFnZUJpdG1hcE9wdGlvbnMoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgICAgc3VwcG9ydHNJbWFnZUJpdG1hcCA9IHJlc3VsdDsKICAgICAgICAgIHVzZUltYWdlQml0bWFwID0gc3VwcG9ydHNJbWFnZUJpdG1hcCAmJiBwcmVmZXJJbWFnZUJpdG1hcDsKICAgICAgICAgIHJldHVybiBibG9iUHJvbWlzZTsKICAgICAgICB9KS50aGVuKGZ1bmN0aW9uKGJsb2IpIHsKICAgICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGJsb2IpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGdlbmVyYXRlZEJsb2IgPSBibG9iOwogICAgICAgICAgaWYgKHVzZUltYWdlQml0bWFwKSB7CiAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZS5jcmVhdGVJbWFnZUJpdG1hcEZyb21CbG9iKGJsb2IsIHsKICAgICAgICAgICAgICBmbGlwWSwKICAgICAgICAgICAgICBwcmVtdWx0aXBseUFscGhhOiBmYWxzZSwKICAgICAgICAgICAgICBza2lwQ29sb3JTcGFjZUNvbnZlcnNpb24KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBibG9iVXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CiAgICAgICAgICBnZW5lcmF0ZWRCbG9iUmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UoewogICAgICAgICAgICB1cmw6IGJsb2JVcmwKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIGZldGNoSW1hZ2UoewogICAgICAgICAgICByZXNvdXJjZTogZ2VuZXJhdGVkQmxvYlJlc291cmNlLAogICAgICAgICAgICBmbGlwWSwKICAgICAgICAgICAgc2tpcENvbG9yU3BhY2VDb252ZXJzaW9uLAogICAgICAgICAgICBwcmVmZXJJbWFnZUJpdG1hcDogZmFsc2UKICAgICAgICAgIH0pOwogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oaW1hZ2UpIHsKICAgICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGltYWdlKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBpbWFnZS5ibG9iID0gZ2VuZXJhdGVkQmxvYjsKICAgICAgICAgIGlmICh1c2VJbWFnZUJpdG1hcCkgewogICAgICAgICAgICByZXR1cm4gaW1hZ2U7CiAgICAgICAgICB9CiAgICAgICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTChnZW5lcmF0ZWRCbG9iUmVzb3VyY2UudXJsKTsKICAgICAgICAgIHJldHVybiBpbWFnZTsKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnJvcikgewogICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChnZW5lcmF0ZWRCbG9iUmVzb3VyY2UpKSB7CiAgICAgICAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKGdlbmVyYXRlZEJsb2JSZXNvdXJjZS51cmwpOwogICAgICAgICAgfQogICAgICAgICAgZXJyb3IuYmxvYiA9IGdlbmVyYXRlZEJsb2I7CiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBSZXNvdXJjZS5mZXRjaEltYWdlID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIGNvbnN0IHJlc291cmNlID0gbmV3IFJlc291cmNlKG9wdGlvbnMpOwogICAgICAgIHJldHVybiByZXNvdXJjZS5mZXRjaEltYWdlKHsKICAgICAgICAgIGZsaXBZOiBvcHRpb25zLmZsaXBZLAogICAgICAgICAgc2tpcENvbG9yU3BhY2VDb252ZXJzaW9uOiBvcHRpb25zLnNraXBDb2xvclNwYWNlQ29udmVyc2lvbiwKICAgICAgICAgIHByZWZlckJsb2I6IG9wdGlvbnMucHJlZmVyQmxvYiwKICAgICAgICAgIHByZWZlckltYWdlQml0bWFwOiBvcHRpb25zLnByZWZlckltYWdlQml0bWFwCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIFJlc291cmNlLnByb3RvdHlwZS5mZXRjaFRleHQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5mZXRjaCh7CiAgICAgICAgICByZXNwb25zZVR5cGU6ICJ0ZXh0IgogICAgICAgIH0pOwogICAgICB9OwogICAgICBSZXNvdXJjZS5mZXRjaFRleHQgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2Uob3B0aW9ucyk7CiAgICAgICAgcmV0dXJuIHJlc291cmNlLmZldGNoVGV4dCgpOwogICAgICB9OwogICAgICBSZXNvdXJjZS5wcm90b3R5cGUuZmV0Y2hKc29uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuZmV0Y2goewogICAgICAgICAgcmVzcG9uc2VUeXBlOiAidGV4dCIsCiAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgIEFjY2VwdDogImFwcGxpY2F0aW9uL2pzb24sKi8qO3E9MC4wMSIKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwcm9taXNlKSkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbihmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTsKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgUmVzb3VyY2UuZmV0Y2hKc29uID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIGNvbnN0IHJlc291cmNlID0gbmV3IFJlc291cmNlKG9wdGlvbnMpOwogICAgICAgIHJldHVybiByZXNvdXJjZS5mZXRjaEpzb24oKTsKICAgICAgfTsKICAgICAgUmVzb3VyY2UucHJvdG90eXBlLmZldGNoWE1MID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2goewogICAgICAgICAgcmVzcG9uc2VUeXBlOiAiZG9jdW1lbnQiLAogICAgICAgICAgb3ZlcnJpZGVNaW1lVHlwZTogInRleHQveG1sIgogICAgICAgIH0pOwogICAgICB9OwogICAgICBSZXNvdXJjZS5mZXRjaFhNTCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICBjb25zdCByZXNvdXJjZSA9IG5ldyBSZXNvdXJjZShvcHRpb25zKTsKICAgICAgICByZXR1cm4gcmVzb3VyY2UuZmV0Y2hYTUwoKTsKICAgICAgfTsKICAgICAgUmVzb3VyY2UucHJvdG90eXBlLmZldGNoSnNvbnAgPSBmdW5jdGlvbihjYWxsYmFja1BhcmFtZXRlck5hbWUpIHsKICAgICAgICBjYWxsYmFja1BhcmFtZXRlck5hbWUgPSBjYWxsYmFja1BhcmFtZXRlck5hbWUgPz8gImNhbGxiYWNrIjsKICAgICAgICBjaGVja0FuZFJlc2V0UmVxdWVzdCh0aGlzLnJlcXVlc3QpOwogICAgICAgIGxldCBmdW5jdGlvbk5hbWU7CiAgICAgICAgZG8gewogICAgICAgICAgZnVuY3Rpb25OYW1lID0gYGxvYWRKc29ucCR7TWF0aF9kZWZhdWx0Lm5leHRSYW5kb21OdW1iZXIoKS50b1N0cmluZygpLnN1YnN0cmluZygyLCA4KX1gOwogICAgICAgIH0gd2hpbGUgKGRlZmluZWRfZGVmYXVsdCh3aW5kb3dbZnVuY3Rpb25OYW1lXSkpOwogICAgICAgIHJldHVybiBmZXRjaEpzb25wKHRoaXMsIGNhbGxiYWNrUGFyYW1ldGVyTmFtZSwgZnVuY3Rpb25OYW1lKTsKICAgICAgfTsKICAgICAgUmVzb3VyY2UuZmV0Y2hKc29ucCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICBjb25zdCByZXNvdXJjZSA9IG5ldyBSZXNvdXJjZShvcHRpb25zKTsKICAgICAgICByZXR1cm4gcmVzb3VyY2UuZmV0Y2hKc29ucChvcHRpb25zLmNhbGxiYWNrUGFyYW1ldGVyTmFtZSk7CiAgICAgIH07CiAgICAgIFJlc291cmNlLnByb3RvdHlwZS5fbWFrZVJlcXVlc3QgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzOwogICAgICAgIGNoZWNrQW5kUmVzZXRSZXF1ZXN0KHJlc291cmNlLnJlcXVlc3QpOwogICAgICAgIGNvbnN0IHJlcXVlc3QgPSByZXNvdXJjZS5yZXF1ZXN0OwogICAgICAgIGNvbnN0IHVybCA9IHJlc291cmNlLnVybDsKICAgICAgICByZXF1ZXN0LnVybCA9IHVybDsKICAgICAgICByZXF1ZXN0LnJlcXVlc3RGdW5jdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gb3B0aW9ucy5yZXNwb25zZVR5cGU7CiAgICAgICAgICBjb25zdCBoZWFkZXJzID0gY29tYmluZV9kZWZhdWx0KG9wdGlvbnMuaGVhZGVycywgcmVzb3VyY2UuaGVhZGVycyk7CiAgICAgICAgICBjb25zdCBvdmVycmlkZU1pbWVUeXBlID0gb3B0aW9ucy5vdmVycmlkZU1pbWVUeXBlOwogICAgICAgICAgY29uc3QgbWV0aG9kID0gb3B0aW9ucy5tZXRob2Q7CiAgICAgICAgICBjb25zdCBkYXRhID0gb3B0aW9ucy5kYXRhOwogICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSBkZWZlcl9kZWZhdWx0KCk7CiAgICAgICAgICBjb25zdCB4aHIgPSBSZXNvdXJjZS5fSW1wbGVtZW50YXRpb25zLmxvYWRXaXRoWGhyKAogICAgICAgICAgICB1cmwsCiAgICAgICAgICAgIHJlc3BvbnNlVHlwZSwKICAgICAgICAgICAgbWV0aG9kLAogICAgICAgICAgICBkYXRhLAogICAgICAgICAgICBoZWFkZXJzLAogICAgICAgICAgICBkZWZlcnJlZCwKICAgICAgICAgICAgb3ZlcnJpZGVNaW1lVHlwZQogICAgICAgICAgKTsKICAgICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoeGhyKSAmJiBkZWZpbmVkX2RlZmF1bHQoeGhyLmFib3J0KSkgewogICAgICAgICAgICByZXF1ZXN0LmNhbmNlbEZ1bmN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgeGhyLmFib3J0KCk7CiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKICAgICAgICB9OwogICAgICAgIGNvbnN0IHByb21pc2UgPSBSZXF1ZXN0U2NoZWR1bGVyX2RlZmF1bHQucmVxdWVzdChyZXF1ZXN0KTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwcm9taXNlKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgIHJlcXVlc3QuY2FuY2VsRnVuY3Rpb24gPSB2b2lkIDA7CiAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlKSB7CiAgICAgICAgICByZXF1ZXN0LmNhbmNlbEZ1bmN0aW9uID0gdm9pZCAwOwogICAgICAgICAgaWYgKHJlcXVlc3Quc3RhdGUgIT09IFJlcXVlc3RTdGF0ZV9kZWZhdWx0LkZBSUxFRCkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzb3VyY2UucmV0cnlPbkVycm9yKGUpLnRoZW4oZnVuY3Rpb24ocmV0cnkpIHsKICAgICAgICAgICAgaWYgKHJldHJ5KSB7CiAgICAgICAgICAgICAgcmVxdWVzdC5zdGF0ZSA9IFJlcXVlc3RTdGF0ZV9kZWZhdWx0LlVOSVNTVUVEOwogICAgICAgICAgICAgIHJlcXVlc3QuZGVmZXJyZWQgPSB2b2lkIDA7CiAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlLmZldGNoKG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBkYXRhVXJpUmVnZXgyID0gL15kYXRhOiguKj8pKDtiYXNlNjQpPywoLiopJC87CiAgICAgIFJlc291cmNlLnByb3RvdHlwZS5mZXRjaCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICBvcHRpb25zID0gZGVmYXVsdENsb25lKG9wdGlvbnMsIHt9KTsKICAgICAgICBvcHRpb25zLm1ldGhvZCA9ICJHRVQiOwogICAgICAgIHJldHVybiB0aGlzLl9tYWtlUmVxdWVzdChvcHRpb25zKTsKICAgICAgfTsKICAgICAgUmVzb3VyY2UuZmV0Y2ggPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2Uob3B0aW9ucyk7CiAgICAgICAgcmV0dXJuIHJlc291cmNlLmZldGNoKHsKICAgICAgICAgIC8vIE1ha2UgY29weSBvZiBqdXN0IHRoZSBuZWVkZWQgZmllbGRzIGJlY2F1c2UgaGVhZGVycyBjYW4gYmUgcGFzc2VkIHRvIGJvdGggdGhlIGNvbnN0cnVjdG9yIGFuZCB0byBmZXRjaAogICAgICAgICAgcmVzcG9uc2VUeXBlOiBvcHRpb25zLnJlc3BvbnNlVHlwZSwKICAgICAgICAgIG92ZXJyaWRlTWltZVR5cGU6IG9wdGlvbnMub3ZlcnJpZGVNaW1lVHlwZQogICAgICAgIH0pOwogICAgICB9OwogICAgICBSZXNvdXJjZS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIG9wdGlvbnMgPSBkZWZhdWx0Q2xvbmUob3B0aW9ucywge30pOwogICAgICAgIG9wdGlvbnMubWV0aG9kID0gIkRFTEVURSI7CiAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VSZXF1ZXN0KG9wdGlvbnMpOwogICAgICB9OwogICAgICBSZXNvdXJjZS5kZWxldGUgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2Uob3B0aW9ucyk7CiAgICAgICAgcmV0dXJuIHJlc291cmNlLmRlbGV0ZSh7CiAgICAgICAgICAvLyBNYWtlIGNvcHkgb2YganVzdCB0aGUgbmVlZGVkIGZpZWxkcyBiZWNhdXNlIGhlYWRlcnMgY2FuIGJlIHBhc3NlZCB0byBib3RoIHRoZSBjb25zdHJ1Y3RvciBhbmQgdG8gZmV0Y2gKICAgICAgICAgIHJlc3BvbnNlVHlwZTogb3B0aW9ucy5yZXNwb25zZVR5cGUsCiAgICAgICAgICBvdmVycmlkZU1pbWVUeXBlOiBvcHRpb25zLm92ZXJyaWRlTWltZVR5cGUsCiAgICAgICAgICBkYXRhOiBvcHRpb25zLmRhdGEKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgUmVzb3VyY2UucHJvdG90eXBlLmhlYWQgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgb3B0aW9ucyA9IGRlZmF1bHRDbG9uZShvcHRpb25zLCB7fSk7CiAgICAgICAgb3B0aW9ucy5tZXRob2QgPSAiSEVBRCI7CiAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VSZXF1ZXN0KG9wdGlvbnMpOwogICAgICB9OwogICAgICBSZXNvdXJjZS5oZWFkID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIGNvbnN0IHJlc291cmNlID0gbmV3IFJlc291cmNlKG9wdGlvbnMpOwogICAgICAgIHJldHVybiByZXNvdXJjZS5oZWFkKHsKICAgICAgICAgIC8vIE1ha2UgY29weSBvZiBqdXN0IHRoZSBuZWVkZWQgZmllbGRzIGJlY2F1c2UgaGVhZGVycyBjYW4gYmUgcGFzc2VkIHRvIGJvdGggdGhlIGNvbnN0cnVjdG9yIGFuZCB0byBmZXRjaAogICAgICAgICAgcmVzcG9uc2VUeXBlOiBvcHRpb25zLnJlc3BvbnNlVHlwZSwKICAgICAgICAgIG92ZXJyaWRlTWltZVR5cGU6IG9wdGlvbnMub3ZlcnJpZGVNaW1lVHlwZQogICAgICAgIH0pOwogICAgICB9OwogICAgICBSZXNvdXJjZS5wcm90b3R5cGUub3B0aW9ucyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICBvcHRpb25zID0gZGVmYXVsdENsb25lKG9wdGlvbnMsIHt9KTsKICAgICAgICBvcHRpb25zLm1ldGhvZCA9ICJPUFRJT05TIjsKICAgICAgICByZXR1cm4gdGhpcy5fbWFrZVJlcXVlc3Qob3B0aW9ucyk7CiAgICAgIH07CiAgICAgIFJlc291cmNlLm9wdGlvbnMgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2Uob3B0aW9ucyk7CiAgICAgICAgcmV0dXJuIHJlc291cmNlLm9wdGlvbnMoewogICAgICAgICAgLy8gTWFrZSBjb3B5IG9mIGp1c3QgdGhlIG5lZWRlZCBmaWVsZHMgYmVjYXVzZSBoZWFkZXJzIGNhbiBiZSBwYXNzZWQgdG8gYm90aCB0aGUgY29uc3RydWN0b3IgYW5kIHRvIGZldGNoCiAgICAgICAgICByZXNwb25zZVR5cGU6IG9wdGlvbnMucmVzcG9uc2VUeXBlLAogICAgICAgICAgb3ZlcnJpZGVNaW1lVHlwZTogb3B0aW9ucy5vdmVycmlkZU1pbWVUeXBlCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIFJlc291cmNlLnByb3RvdHlwZS5wb3N0ID0gZnVuY3Rpb24oZGF0YSwgb3B0aW9ucykgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiZGF0YSIsIGRhdGEpOwogICAgICAgIG9wdGlvbnMgPSBkZWZhdWx0Q2xvbmUob3B0aW9ucywge30pOwogICAgICAgIG9wdGlvbnMubWV0aG9kID0gIlBPU1QiOwogICAgICAgIG9wdGlvbnMuZGF0YSA9IGRhdGE7CiAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VSZXF1ZXN0KG9wdGlvbnMpOwogICAgICB9OwogICAgICBSZXNvdXJjZS5wb3N0ID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIGNvbnN0IHJlc291cmNlID0gbmV3IFJlc291cmNlKG9wdGlvbnMpOwogICAgICAgIHJldHVybiByZXNvdXJjZS5wb3N0KG9wdGlvbnMuZGF0YSwgewogICAgICAgICAgLy8gTWFrZSBjb3B5IG9mIGp1c3QgdGhlIG5lZWRlZCBmaWVsZHMgYmVjYXVzZSBoZWFkZXJzIGNhbiBiZSBwYXNzZWQgdG8gYm90aCB0aGUgY29uc3RydWN0b3IgYW5kIHRvIHBvc3QKICAgICAgICAgIHJlc3BvbnNlVHlwZTogb3B0aW9ucy5yZXNwb25zZVR5cGUsCiAgICAgICAgICBvdmVycmlkZU1pbWVUeXBlOiBvcHRpb25zLm92ZXJyaWRlTWltZVR5cGUKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgUmVzb3VyY2UucHJvdG90eXBlLnB1dCA9IGZ1bmN0aW9uKGRhdGEsIG9wdGlvbnMpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImRhdGEiLCBkYXRhKTsKICAgICAgICBvcHRpb25zID0gZGVmYXVsdENsb25lKG9wdGlvbnMsIHt9KTsKICAgICAgICBvcHRpb25zLm1ldGhvZCA9ICJQVVQiOwogICAgICAgIG9wdGlvbnMuZGF0YSA9IGRhdGE7CiAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VSZXF1ZXN0KG9wdGlvbnMpOwogICAgICB9OwogICAgICBSZXNvdXJjZS5wdXQgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2Uob3B0aW9ucyk7CiAgICAgICAgcmV0dXJuIHJlc291cmNlLnB1dChvcHRpb25zLmRhdGEsIHsKICAgICAgICAgIC8vIE1ha2UgY29weSBvZiBqdXN0IHRoZSBuZWVkZWQgZmllbGRzIGJlY2F1c2UgaGVhZGVycyBjYW4gYmUgcGFzc2VkIHRvIGJvdGggdGhlIGNvbnN0cnVjdG9yIGFuZCB0byBwb3N0CiAgICAgICAgICByZXNwb25zZVR5cGU6IG9wdGlvbnMucmVzcG9uc2VUeXBlLAogICAgICAgICAgb3ZlcnJpZGVNaW1lVHlwZTogb3B0aW9ucy5vdmVycmlkZU1pbWVUeXBlCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIFJlc291cmNlLnByb3RvdHlwZS5wYXRjaCA9IGZ1bmN0aW9uKGRhdGEsIG9wdGlvbnMpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImRhdGEiLCBkYXRhKTsKICAgICAgICBvcHRpb25zID0gZGVmYXVsdENsb25lKG9wdGlvbnMsIHt9KTsKICAgICAgICBvcHRpb25zLm1ldGhvZCA9ICJQQVRDSCI7CiAgICAgICAgb3B0aW9ucy5kYXRhID0gZGF0YTsKICAgICAgICByZXR1cm4gdGhpcy5fbWFrZVJlcXVlc3Qob3B0aW9ucyk7CiAgICAgIH07CiAgICAgIFJlc291cmNlLnBhdGNoID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIGNvbnN0IHJlc291cmNlID0gbmV3IFJlc291cmNlKG9wdGlvbnMpOwogICAgICAgIHJldHVybiByZXNvdXJjZS5wYXRjaChvcHRpb25zLmRhdGEsIHsKICAgICAgICAgIC8vIE1ha2UgY29weSBvZiBqdXN0IHRoZSBuZWVkZWQgZmllbGRzIGJlY2F1c2UgaGVhZGVycyBjYW4gYmUgcGFzc2VkIHRvIGJvdGggdGhlIGNvbnN0cnVjdG9yIGFuZCB0byBwb3N0CiAgICAgICAgICByZXNwb25zZVR5cGU6IG9wdGlvbnMucmVzcG9uc2VUeXBlLAogICAgICAgICAgb3ZlcnJpZGVNaW1lVHlwZTogb3B0aW9ucy5vdmVycmlkZU1pbWVUeXBlCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIFJlc291cmNlLl9JbXBsZW1lbnRhdGlvbnMgPSB7fTsKICAgICAgUmVzb3VyY2UuX0ltcGxlbWVudGF0aW9ucy5sb2FkSW1hZ2VFbGVtZW50ID0gZnVuY3Rpb24odXJsLCBjcm9zc09yaWdpbiwgZGVmZXJyZWQpIHsKICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpOwogICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKGltYWdlLm5hdHVyYWxXaWR0aCA9PT0gMCAmJiBpbWFnZS5uYXR1cmFsSGVpZ2h0ID09PSAwICYmIGltYWdlLndpZHRoID09PSAwICYmIGltYWdlLmhlaWdodCA9PT0gMCkgewogICAgICAgICAgICBpbWFnZS53aWR0aCA9IDMwMDsKICAgICAgICAgICAgaW1hZ2UuaGVpZ2h0ID0gMTUwOwogICAgICAgICAgfQogICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShpbWFnZSk7CiAgICAgICAgfTsKICAgICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGUpOwogICAgICAgIH07CiAgICAgICAgaWYgKGNyb3NzT3JpZ2luKSB7CiAgICAgICAgICBpZiAoVHJ1c3RlZFNlcnZlcnNfZGVmYXVsdC5jb250YWlucyh1cmwpKSB7CiAgICAgICAgICAgIGltYWdlLmNyb3NzT3JpZ2luID0gInVzZS1jcmVkZW50aWFscyI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbWFnZS5jcm9zc09yaWdpbiA9ICIiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpbWFnZS5zcmMgPSB1cmw7CiAgICAgIH07CiAgICAgIFJlc291cmNlLl9JbXBsZW1lbnRhdGlvbnMuY3JlYXRlSW1hZ2UgPSBmdW5jdGlvbihyZXF1ZXN0LCBjcm9zc09yaWdpbiwgZGVmZXJyZWQsIGZsaXBZLCBza2lwQ29sb3JTcGFjZUNvbnZlcnNpb24sIHByZWZlckltYWdlQml0bWFwKSB7CiAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7CiAgICAgICAgUmVzb3VyY2Uuc3VwcG9ydHNJbWFnZUJpdG1hcE9wdGlvbnMoKS50aGVuKGZ1bmN0aW9uKHN1cHBvcnRzSW1hZ2VCaXRtYXApIHsKICAgICAgICAgIGlmICghKHN1cHBvcnRzSW1hZ2VCaXRtYXAgJiYgcHJlZmVySW1hZ2VCaXRtYXApKSB7CiAgICAgICAgICAgIFJlc291cmNlLl9JbXBsZW1lbnRhdGlvbnMubG9hZEltYWdlRWxlbWVudCh1cmwsIGNyb3NzT3JpZ2luLCBkZWZlcnJlZCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHJlc3BvbnNlVHlwZSA9ICJibG9iIjsKICAgICAgICAgIGNvbnN0IG1ldGhvZCA9ICJHRVQiOwogICAgICAgICAgY29uc3QgeGhyRGVmZXJyZWQgPSBkZWZlcl9kZWZhdWx0KCk7CiAgICAgICAgICBjb25zdCB4aHIgPSBSZXNvdXJjZS5fSW1wbGVtZW50YXRpb25zLmxvYWRXaXRoWGhyKAogICAgICAgICAgICB1cmwsCiAgICAgICAgICAgIHJlc3BvbnNlVHlwZSwKICAgICAgICAgICAgbWV0aG9kLAogICAgICAgICAgICB2b2lkIDAsCiAgICAgICAgICAgIHZvaWQgMCwKICAgICAgICAgICAgeGhyRGVmZXJyZWQsCiAgICAgICAgICAgIHZvaWQgMCwKICAgICAgICAgICAgdm9pZCAwLAogICAgICAgICAgICB2b2lkIDAKICAgICAgICAgICk7CiAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHhocikgJiYgZGVmaW5lZF9kZWZhdWx0KHhoci5hYm9ydCkpIHsKICAgICAgICAgICAgcmVxdWVzdC5jYW5jZWxGdW5jdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHhoci5hYm9ydCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHhockRlZmVycmVkLnByb21pc2UudGhlbihmdW5jdGlvbihibG9iKSB7CiAgICAgICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGJsb2IpKSB7CiAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KAogICAgICAgICAgICAgICAgbmV3IFJ1bnRpbWVFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAgICAgICBgU3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCAke3VybH0gYnV0IGl0IGNvbnRhaW5lZCBubyBjb250ZW50LmAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gUmVzb3VyY2UuY3JlYXRlSW1hZ2VCaXRtYXBGcm9tQmxvYihibG9iLCB7CiAgICAgICAgICAgICAgZmxpcFksCiAgICAgICAgICAgICAgcHJlbXVsdGlwbHlBbHBoYTogZmFsc2UsCiAgICAgICAgICAgICAgc2tpcENvbG9yU3BhY2VDb252ZXJzaW9uCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSkudGhlbihmdW5jdGlvbihpbWFnZSkgewogICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGltYWdlKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlKTsKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgUmVzb3VyY2UuY3JlYXRlSW1hZ2VCaXRtYXBGcm9tQmxvYiA9IGZ1bmN0aW9uKGJsb2IsIG9wdGlvbnMpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoIm9wdGlvbnMiLCBvcHRpb25zKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5ib29sKCJvcHRpb25zLmZsaXBZIiwgb3B0aW9ucy5mbGlwWSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YuYm9vbCgib3B0aW9ucy5wcmVtdWx0aXBseUFscGhhIiwgb3B0aW9ucy5wcmVtdWx0aXBseUFscGhhKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5ib29sKAogICAgICAgICAgIm9wdGlvbnMuc2tpcENvbG9yU3BhY2VDb252ZXJzaW9uIiwKICAgICAgICAgIG9wdGlvbnMuc2tpcENvbG9yU3BhY2VDb252ZXJzaW9uCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoYmxvYiwgewogICAgICAgICAgaW1hZ2VPcmllbnRhdGlvbjogb3B0aW9ucy5mbGlwWSA/ICJmbGlwWSIgOiAiZnJvbS1pbWFnZSIsCiAgICAgICAgICBwcmVtdWx0aXBseUFscGhhOiBvcHRpb25zLnByZW11bHRpcGx5QWxwaGEgPyAicHJlbXVsdGlwbHkiIDogIm5vbmUiLAogICAgICAgICAgY29sb3JTcGFjZUNvbnZlcnNpb246IG9wdGlvbnMuc2tpcENvbG9yU3BhY2VDb252ZXJzaW9uID8gIm5vbmUiIDogImRlZmF1bHQiCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIG5vWE1MSHR0cFJlcXVlc3QgPSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgPT09ICJ1bmRlZmluZWQiOwogICAgICBSZXNvdXJjZS5fSW1wbGVtZW50YXRpb25zLmxvYWRXaXRoWGhyID0gZnVuY3Rpb24odXJsLCByZXNwb25zZVR5cGUsIG1ldGhvZCwgZGF0YSwgaGVhZGVycywgZGVmZXJyZWQsIG92ZXJyaWRlTWltZVR5cGUpIHsKICAgICAgICBjb25zdCBkYXRhVXJpUmVnZXhSZXN1bHQgPSBkYXRhVXJpUmVnZXgyLmV4ZWModXJsKTsKICAgICAgICBpZiAoZGF0YVVyaVJlZ2V4UmVzdWx0ICE9PSBudWxsKSB7CiAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGRlY29kZURhdGFVcmkoZGF0YVVyaVJlZ2V4UmVzdWx0LCByZXNwb25zZVR5cGUpKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKG5vWE1MSHR0cFJlcXVlc3QpIHsKICAgICAgICAgIGxvYWRXaXRoSHR0cFJlcXVlc3QoCiAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgcmVzcG9uc2VUeXBlLAogICAgICAgICAgICBtZXRob2QsCiAgICAgICAgICAgIGRhdGEsCiAgICAgICAgICAgIGhlYWRlcnMsCiAgICAgICAgICAgIGRlZmVycmVkLAogICAgICAgICAgICBvdmVycmlkZU1pbWVUeXBlCiAgICAgICAgICApOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICBpZiAoVHJ1c3RlZFNlcnZlcnNfZGVmYXVsdC5jb250YWlucyh1cmwpKSB7CiAgICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgeGhyLm9wZW4obWV0aG9kLCB1cmwsIHRydWUpOwogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQob3ZlcnJpZGVNaW1lVHlwZSkgJiYgZGVmaW5lZF9kZWZhdWx0KHhoci5vdmVycmlkZU1pbWVUeXBlKSkgewogICAgICAgICAgeGhyLm92ZXJyaWRlTWltZVR5cGUob3ZlcnJpZGVNaW1lVHlwZSk7CiAgICAgICAgfQogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoaGVhZGVycykpIHsKICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGhlYWRlcnMpIHsKICAgICAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHJlc3BvbnNlVHlwZSkpIHsKICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGU7CiAgICAgICAgfQogICAgICAgIGxldCBsb2NhbEZpbGUgPSBmYWxzZTsKICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIGxvY2FsRmlsZSA9IHVybC5pbmRleE9mKCJmaWxlOi8vIikgPT09IDAgfHwgdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgJiYgd2luZG93LmxvY2F0aW9uLm9yaWdpbiA9PT0gImZpbGU6Ly8iOwogICAgICAgIH0KICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoKHhoci5zdGF0dXMgPCAyMDAgfHwgeGhyLnN0YXR1cyA+PSAzMDApICYmICEobG9jYWxGaWxlICYmIHhoci5zdGF0dXMgPT09IDApKSB7CiAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdCgKICAgICAgICAgICAgICBuZXcgUmVxdWVzdEVycm9yRXZlbnRfZGVmYXVsdCgKICAgICAgICAgICAgICAgIHhoci5zdGF0dXMsCiAgICAgICAgICAgICAgICB4aHIucmVzcG9uc2UsCiAgICAgICAgICAgICAgICB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkKICAgICAgICAgICAgICApCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geGhyLnJlc3BvbnNlOwogICAgICAgICAgY29uc3QgYnJvd3NlclJlc3BvbnNlVHlwZSA9IHhoci5yZXNwb25zZVR5cGU7CiAgICAgICAgICBpZiAobWV0aG9kID09PSAiSEVBRCIgfHwgbWV0aG9kID09PSAiT1BUSU9OUyIpIHsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VIZWFkZXJTdHJpbmcgPSB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CiAgICAgICAgICAgIGNvbnN0IHNwbGl0SGVhZGVycyA9IHJlc3BvbnNlSGVhZGVyU3RyaW5nLnRyaW0oKS5zcGxpdCgvW1xyXG5dKy8pOwogICAgICAgICAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSB7fTsKICAgICAgICAgICAgc3BsaXRIZWFkZXJzLmZvckVhY2goZnVuY3Rpb24obGluZSkgewogICAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gbGluZS5zcGxpdCgiOiAiKTsKICAgICAgICAgICAgICBjb25zdCBoZWFkZXIgPSBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1toZWFkZXJdID0gcGFydHMuam9pbigiOiAiKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzcG9uc2VIZWFkZXJzKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwNCkgewogICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHZvaWQgMCk7CiAgICAgICAgICB9IGVsc2UgaWYgKGRlZmluZWRfZGVmYXVsdChyZXNwb25zZSkgJiYgKCFkZWZpbmVkX2RlZmF1bHQocmVzcG9uc2VUeXBlKSB8fCBicm93c2VyUmVzcG9uc2VUeXBlID09PSByZXNwb25zZVR5cGUpKSB7CiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzcG9uc2UpOwogICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZVR5cGUgPT09ICJqc29uIiAmJiB0eXBlb2YgcmVzcG9uc2UgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShKU09OLnBhcnNlKHJlc3BvbnNlKSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoKGJyb3dzZXJSZXNwb25zZVR5cGUgPT09ICIiIHx8IGJyb3dzZXJSZXNwb25zZVR5cGUgPT09ICJkb2N1bWVudCIpICYmIGRlZmluZWRfZGVmYXVsdCh4aHIucmVzcG9uc2VYTUwpICYmIHhoci5yZXNwb25zZVhNTC5oYXNDaGlsZE5vZGVzKCkpIHsKICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh4aHIucmVzcG9uc2VYTUwpOwogICAgICAgICAgfSBlbHNlIGlmICgoYnJvd3NlclJlc3BvbnNlVHlwZSA9PT0gIiIgfHwgYnJvd3NlclJlc3BvbnNlVHlwZSA9PT0gInRleHQiKSAmJiBkZWZpbmVkX2RlZmF1bHQoeGhyLnJlc3BvbnNlVGV4dCkpIHsKICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh4aHIucmVzcG9uc2VUZXh0KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdCgKICAgICAgICAgICAgICBuZXcgUnVudGltZUVycm9yX2RlZmF1bHQoIkludmFsaWQgWE1MSHR0cFJlcXVlc3QgcmVzcG9uc2UgdHlwZS4iKQogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICBkZWZlcnJlZC5yZWplY3QobmV3IFJlcXVlc3RFcnJvckV2ZW50X2RlZmF1bHQoKSk7CiAgICAgICAgfTsKICAgICAgICB4aHIuc2VuZChkYXRhKTsKICAgICAgICByZXR1cm4geGhyOwogICAgICB9OwogICAgICBSZXNvdXJjZS5fSW1wbGVtZW50YXRpb25zLmxvYWRBbmRFeGVjdXRlU2NyaXB0ID0gZnVuY3Rpb24odXJsLCBmdW5jdGlvbk5hbWUsIGRlZmVycmVkKSB7CiAgICAgICAgcmV0dXJuIGxvYWRBbmRFeGVjdXRlU2NyaXB0X2RlZmF1bHQodXJsLCBmdW5jdGlvbk5hbWUpLmNhdGNoKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlKTsKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgUmVzb3VyY2UuX0RlZmF1bHRJbXBsZW1lbnRhdGlvbnMgPSB7fTsKICAgICAgUmVzb3VyY2UuX0RlZmF1bHRJbXBsZW1lbnRhdGlvbnMuY3JlYXRlSW1hZ2UgPSBSZXNvdXJjZS5fSW1wbGVtZW50YXRpb25zLmNyZWF0ZUltYWdlOwogICAgICBSZXNvdXJjZS5fRGVmYXVsdEltcGxlbWVudGF0aW9ucy5sb2FkV2l0aFhociA9IFJlc291cmNlLl9JbXBsZW1lbnRhdGlvbnMubG9hZFdpdGhYaHI7CiAgICAgIFJlc291cmNlLl9EZWZhdWx0SW1wbGVtZW50YXRpb25zLmxvYWRBbmRFeGVjdXRlU2NyaXB0ID0gUmVzb3VyY2UuX0ltcGxlbWVudGF0aW9ucy5sb2FkQW5kRXhlY3V0ZVNjcmlwdDsKICAgICAgUmVzb3VyY2UuREVGQVVMVCA9IE9iamVjdC5mcmVlemUoCiAgICAgICAgbmV3IFJlc291cmNlKHsKICAgICAgICAgIHVybDogdHlwZW9mIGRvY3VtZW50ID09PSAidW5kZWZpbmVkIiA/ICIiIDogZG9jdW1lbnQubG9jYXRpb24uaHJlZi5zcGxpdCgiPyIpWzBdCiAgICAgICAgfSkKICAgICAgKTsKICAgICAgUmVzb3VyY2VfZGVmYXVsdCA9IFJlc291cmNlOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvRWFydGhPcmllbnRhdGlvblBhcmFtZXRlcnMuanMKICBmdW5jdGlvbiBFYXJ0aE9yaWVudGF0aW9uUGFyYW1ldGVycyhvcHRpb25zKSB7CiAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICB0aGlzLl9kYXRlcyA9IHZvaWQgMDsKICAgIHRoaXMuX3NhbXBsZXMgPSB2b2lkIDA7CiAgICB0aGlzLl9kYXRlQ29sdW1uID0gLTE7CiAgICB0aGlzLl94UG9sZVdhbmRlclJhZGlhbnNDb2x1bW4gPSAtMTsKICAgIHRoaXMuX3lQb2xlV2FuZGVyUmFkaWFuc0NvbHVtbiA9IC0xOwogICAgdGhpcy5fdXQxTWludXNVdGNTZWNvbmRzQ29sdW1uID0gLTE7CiAgICB0aGlzLl94Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnNDb2x1bW4gPSAtMTsKICAgIHRoaXMuX3lDZWxlc3RpYWxQb2xlT2Zmc2V0UmFkaWFuc0NvbHVtbiA9IC0xOwogICAgdGhpcy5fdGFpTWludXNVdGNTZWNvbmRzQ29sdW1uID0gLTE7CiAgICB0aGlzLl9jb2x1bW5Db3VudCA9IDA7CiAgICB0aGlzLl9sYXN0SW5kZXggPSAtMTsKICAgIHRoaXMuX2FkZE5ld0xlYXBTZWNvbmRzID0gb3B0aW9ucy5hZGROZXdMZWFwU2Vjb25kcyA/PyB0cnVlOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvcHRpb25zLmRhdGEpKSB7CiAgICAgIG9uRGF0YVJlYWR5KHRoaXMsIG9wdGlvbnMuZGF0YSk7CiAgICB9IGVsc2UgewogICAgICBvbkRhdGFSZWFkeSh0aGlzLCB7CiAgICAgICAgY29sdW1uTmFtZXM6IFsKICAgICAgICAgICJkYXRlSXNvODYwMSIsCiAgICAgICAgICAibW9kaWZpZWRKdWxpYW5EYXRlVXRjIiwKICAgICAgICAgICJ4UG9sZVdhbmRlclJhZGlhbnMiLAogICAgICAgICAgInlQb2xlV2FuZGVyUmFkaWFucyIsCiAgICAgICAgICAidXQxTWludXNVdGNTZWNvbmRzIiwKICAgICAgICAgICJsZW5ndGhPZkRheUNvcnJlY3Rpb25TZWNvbmRzIiwKICAgICAgICAgICJ4Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnMiLAogICAgICAgICAgInlDZWxlc3RpYWxQb2xlT2Zmc2V0UmFkaWFucyIsCiAgICAgICAgICAidGFpTWludXNVdGNTZWNvbmRzIgogICAgICAgIF0sCiAgICAgICAgc2FtcGxlczogW10KICAgICAgfSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGNvbXBhcmVMZWFwU2Vjb25kRGF0ZXMyKGxlYXBTZWNvbmQsIGRhdGVUb0ZpbmQpIHsKICAgIHJldHVybiBKdWxpYW5EYXRlX2RlZmF1bHQuY29tcGFyZShsZWFwU2Vjb25kLmp1bGlhbkRhdGUsIGRhdGVUb0ZpbmQpOwogIH0KICBmdW5jdGlvbiBvbkRhdGFSZWFkeShlb3AsIGVvcERhdGEpIHsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGVvcERhdGEuY29sdW1uTmFtZXMpKSB7CiAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3JfZGVmYXVsdCgKICAgICAgICAiRXJyb3IgaW4gbG9hZGVkIEVPUCBkYXRhOiBUaGUgY29sdW1uTmFtZXMgcHJvcGVydHkgaXMgcmVxdWlyZWQuIgogICAgICApOwogICAgfQogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZW9wRGF0YS5zYW1wbGVzKSkgewogICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yX2RlZmF1bHQoCiAgICAgICAgIkVycm9yIGluIGxvYWRlZCBFT1AgZGF0YTogVGhlIHNhbXBsZXMgcHJvcGVydHkgaXMgcmVxdWlyZWQuIgogICAgICApOwogICAgfQogICAgY29uc3QgZGF0ZUNvbHVtbiA9IGVvcERhdGEuY29sdW1uTmFtZXMuaW5kZXhPZigibW9kaWZpZWRKdWxpYW5EYXRlVXRjIik7CiAgICBjb25zdCB4UG9sZVdhbmRlclJhZGlhbnNDb2x1bW4gPSBlb3BEYXRhLmNvbHVtbk5hbWVzLmluZGV4T2YoInhQb2xlV2FuZGVyUmFkaWFucyIpOwogICAgY29uc3QgeVBvbGVXYW5kZXJSYWRpYW5zQ29sdW1uID0gZW9wRGF0YS5jb2x1bW5OYW1lcy5pbmRleE9mKCJ5UG9sZVdhbmRlclJhZGlhbnMiKTsKICAgIGNvbnN0IHV0MU1pbnVzVXRjU2Vjb25kc0NvbHVtbiA9IGVvcERhdGEuY29sdW1uTmFtZXMuaW5kZXhPZigidXQxTWludXNVdGNTZWNvbmRzIik7CiAgICBjb25zdCB4Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnNDb2x1bW4gPSBlb3BEYXRhLmNvbHVtbk5hbWVzLmluZGV4T2YoCiAgICAgICJ4Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnMiCiAgICApOwogICAgY29uc3QgeUNlbGVzdGlhbFBvbGVPZmZzZXRSYWRpYW5zQ29sdW1uID0gZW9wRGF0YS5jb2x1bW5OYW1lcy5pbmRleE9mKAogICAgICAieUNlbGVzdGlhbFBvbGVPZmZzZXRSYWRpYW5zIgogICAgKTsKICAgIGNvbnN0IHRhaU1pbnVzVXRjU2Vjb25kc0NvbHVtbiA9IGVvcERhdGEuY29sdW1uTmFtZXMuaW5kZXhPZigidGFpTWludXNVdGNTZWNvbmRzIik7CiAgICBpZiAoZGF0ZUNvbHVtbiA8IDAgfHwgeFBvbGVXYW5kZXJSYWRpYW5zQ29sdW1uIDwgMCB8fCB5UG9sZVdhbmRlclJhZGlhbnNDb2x1bW4gPCAwIHx8IHV0MU1pbnVzVXRjU2Vjb25kc0NvbHVtbiA8IDAgfHwgeENlbGVzdGlhbFBvbGVPZmZzZXRSYWRpYW5zQ29sdW1uIDwgMCB8fCB5Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnNDb2x1bW4gPCAwIHx8IHRhaU1pbnVzVXRjU2Vjb25kc0NvbHVtbiA8IDApIHsKICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcl9kZWZhdWx0KAogICAgICAgICJFcnJvciBpbiBsb2FkZWQgRU9QIGRhdGE6IFRoZSBjb2x1bW5OYW1lcyBwcm9wZXJ0eSBtdXN0IGluY2x1ZGUgbW9kaWZpZWRKdWxpYW5EYXRlVXRjLCB4UG9sZVdhbmRlclJhZGlhbnMsIHlQb2xlV2FuZGVyUmFkaWFucywgdXQxTWludXNVdGNTZWNvbmRzLCB4Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnMsIHlDZWxlc3RpYWxQb2xlT2Zmc2V0UmFkaWFucywgYW5kIHRhaU1pbnVzVXRjU2Vjb25kcyBjb2x1bW5zIgogICAgICApOwogICAgfQogICAgY29uc3Qgc2FtcGxlcyA9IGVvcC5fc2FtcGxlcyA9IGVvcERhdGEuc2FtcGxlczsKICAgIGNvbnN0IGRhdGVzID0gZW9wLl9kYXRlcyA9IFtdOwogICAgZW9wLl9kYXRlQ29sdW1uID0gZGF0ZUNvbHVtbjsKICAgIGVvcC5feFBvbGVXYW5kZXJSYWRpYW5zQ29sdW1uID0geFBvbGVXYW5kZXJSYWRpYW5zQ29sdW1uOwogICAgZW9wLl95UG9sZVdhbmRlclJhZGlhbnNDb2x1bW4gPSB5UG9sZVdhbmRlclJhZGlhbnNDb2x1bW47CiAgICBlb3AuX3V0MU1pbnVzVXRjU2Vjb25kc0NvbHVtbiA9IHV0MU1pbnVzVXRjU2Vjb25kc0NvbHVtbjsKICAgIGVvcC5feENlbGVzdGlhbFBvbGVPZmZzZXRSYWRpYW5zQ29sdW1uID0geENlbGVzdGlhbFBvbGVPZmZzZXRSYWRpYW5zQ29sdW1uOwogICAgZW9wLl95Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnNDb2x1bW4gPSB5Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnNDb2x1bW47CiAgICBlb3AuX3RhaU1pbnVzVXRjU2Vjb25kc0NvbHVtbiA9IHRhaU1pbnVzVXRjU2Vjb25kc0NvbHVtbjsKICAgIGVvcC5fY29sdW1uQ291bnQgPSBlb3BEYXRhLmNvbHVtbk5hbWVzLmxlbmd0aDsKICAgIGVvcC5fbGFzdEluZGV4ID0gdm9pZCAwOwogICAgbGV0IGxhc3RUYWlNaW51c1V0YzsKICAgIGNvbnN0IGFkZE5ld0xlYXBTZWNvbmRzID0gZW9wLl9hZGROZXdMZWFwU2Vjb25kczsKICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzYW1wbGVzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSBlb3AuX2NvbHVtbkNvdW50KSB7CiAgICAgIGNvbnN0IG1qZCA9IHNhbXBsZXNbaSArIGRhdGVDb2x1bW5dOwogICAgICBjb25zdCB0YWlNaW51c1V0YyA9IHNhbXBsZXNbaSArIHRhaU1pbnVzVXRjU2Vjb25kc0NvbHVtbl07CiAgICAgIGNvbnN0IGRheSA9IG1qZCArIFRpbWVDb25zdGFudHNfZGVmYXVsdC5NT0RJRklFRF9KVUxJQU5fREFURV9ESUZGRVJFTkNFOwogICAgICBjb25zdCBkYXRlID0gbmV3IEp1bGlhbkRhdGVfZGVmYXVsdChkYXksIHRhaU1pbnVzVXRjLCBUaW1lU3RhbmRhcmRfZGVmYXVsdC5UQUkpOwogICAgICBkYXRlcy5wdXNoKGRhdGUpOwogICAgICBpZiAoYWRkTmV3TGVhcFNlY29uZHMpIHsKICAgICAgICBpZiAodGFpTWludXNVdGMgIT09IGxhc3RUYWlNaW51c1V0YyAmJiBkZWZpbmVkX2RlZmF1bHQobGFzdFRhaU1pbnVzVXRjKSkgewogICAgICAgICAgY29uc3QgbGVhcFNlY29uZHMgPSBKdWxpYW5EYXRlX2RlZmF1bHQubGVhcFNlY29uZHM7CiAgICAgICAgICBjb25zdCBsZWFwU2Vjb25kSW5kZXggPSBiaW5hcnlTZWFyY2hfZGVmYXVsdCgKICAgICAgICAgICAgbGVhcFNlY29uZHMsCiAgICAgICAgICAgIGRhdGUsCiAgICAgICAgICAgIGNvbXBhcmVMZWFwU2Vjb25kRGF0ZXMyCiAgICAgICAgICApOwogICAgICAgICAgaWYgKGxlYXBTZWNvbmRJbmRleCA8IDApIHsKICAgICAgICAgICAgY29uc3QgbGVhcFNlY29uZCA9IG5ldyBMZWFwU2Vjb25kX2RlZmF1bHQoZGF0ZSwgdGFpTWludXNVdGMpOwogICAgICAgICAgICBsZWFwU2Vjb25kcy5zcGxpY2UofmxlYXBTZWNvbmRJbmRleCwgMCwgbGVhcFNlY29uZCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxhc3RUYWlNaW51c1V0YyA9IHRhaU1pbnVzVXRjOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGZpbGxSZXN1bHRGcm9tSW5kZXgoZW9wLCBzYW1wbGVzLCBpbmRleCwgY29sdW1uQ291bnQsIHJlc3VsdCkgewogICAgY29uc3Qgc3RhcnQgPSBpbmRleCAqIGNvbHVtbkNvdW50OwogICAgcmVzdWx0LnhQb2xlV2FuZGVyID0gc2FtcGxlc1tzdGFydCArIGVvcC5feFBvbGVXYW5kZXJSYWRpYW5zQ29sdW1uXTsKICAgIHJlc3VsdC55UG9sZVdhbmRlciA9IHNhbXBsZXNbc3RhcnQgKyBlb3AuX3lQb2xlV2FuZGVyUmFkaWFuc0NvbHVtbl07CiAgICByZXN1bHQueFBvbGVPZmZzZXQgPSBzYW1wbGVzW3N0YXJ0ICsgZW9wLl94Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnNDb2x1bW5dOwogICAgcmVzdWx0LnlQb2xlT2Zmc2V0ID0gc2FtcGxlc1tzdGFydCArIGVvcC5feUNlbGVzdGlhbFBvbGVPZmZzZXRSYWRpYW5zQ29sdW1uXTsKICAgIHJlc3VsdC51dDFNaW51c1V0YyA9IHNhbXBsZXNbc3RhcnQgKyBlb3AuX3V0MU1pbnVzVXRjU2Vjb25kc0NvbHVtbl07CiAgfQogIGZ1bmN0aW9uIGxpbmVhckludGVycChkeCwgeTEsIHkyKSB7CiAgICByZXR1cm4geTEgKyBkeCAqICh5MiAtIHkxKTsKICB9CiAgZnVuY3Rpb24gaW50ZXJwb2xhdGUoZW9wLCBkYXRlcywgc2FtcGxlcywgZGF0ZSwgYmVmb3JlLCBhZnRlciwgcmVzdWx0KSB7CiAgICBjb25zdCBjb2x1bW5Db3VudCA9IGVvcC5fY29sdW1uQ291bnQ7CiAgICBpZiAoYWZ0ZXIgPiBkYXRlcy5sZW5ndGggLSAxKSB7CiAgICAgIHJlc3VsdC54UG9sZVdhbmRlciA9IDA7CiAgICAgIHJlc3VsdC55UG9sZVdhbmRlciA9IDA7CiAgICAgIHJlc3VsdC54UG9sZU9mZnNldCA9IDA7CiAgICAgIHJlc3VsdC55UG9sZU9mZnNldCA9IDA7CiAgICAgIHJlc3VsdC51dDFNaW51c1V0YyA9IDA7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBjb25zdCBiZWZvcmVEYXRlID0gZGF0ZXNbYmVmb3JlXTsKICAgIGNvbnN0IGFmdGVyRGF0ZSA9IGRhdGVzW2FmdGVyXTsKICAgIGlmIChiZWZvcmVEYXRlLmVxdWFscyhhZnRlckRhdGUpIHx8IGRhdGUuZXF1YWxzKGJlZm9yZURhdGUpKSB7CiAgICAgIGZpbGxSZXN1bHRGcm9tSW5kZXgoZW9wLCBzYW1wbGVzLCBiZWZvcmUsIGNvbHVtbkNvdW50LCByZXN1bHQpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfSBlbHNlIGlmIChkYXRlLmVxdWFscyhhZnRlckRhdGUpKSB7CiAgICAgIGZpbGxSZXN1bHRGcm9tSW5kZXgoZW9wLCBzYW1wbGVzLCBhZnRlciwgY29sdW1uQ291bnQsIHJlc3VsdCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBjb25zdCBmYWN0b3IgPSBKdWxpYW5EYXRlX2RlZmF1bHQuc2Vjb25kc0RpZmZlcmVuY2UoZGF0ZSwgYmVmb3JlRGF0ZSkgLyBKdWxpYW5EYXRlX2RlZmF1bHQuc2Vjb25kc0RpZmZlcmVuY2UoYWZ0ZXJEYXRlLCBiZWZvcmVEYXRlKTsKICAgIGNvbnN0IHN0YXJ0QmVmb3JlID0gYmVmb3JlICogY29sdW1uQ291bnQ7CiAgICBjb25zdCBzdGFydEFmdGVyID0gYWZ0ZXIgKiBjb2x1bW5Db3VudDsKICAgIGxldCBiZWZvcmVVdDFNaW51c1V0YyA9IHNhbXBsZXNbc3RhcnRCZWZvcmUgKyBlb3AuX3V0MU1pbnVzVXRjU2Vjb25kc0NvbHVtbl07CiAgICBsZXQgYWZ0ZXJVdDFNaW51c1V0YyA9IHNhbXBsZXNbc3RhcnRBZnRlciArIGVvcC5fdXQxTWludXNVdGNTZWNvbmRzQ29sdW1uXTsKICAgIGNvbnN0IG9mZnNldERpZmZlcmVuY2UgPSBhZnRlclV0MU1pbnVzVXRjIC0gYmVmb3JlVXQxTWludXNVdGM7CiAgICBpZiAob2Zmc2V0RGlmZmVyZW5jZSA+IDAuNSB8fCBvZmZzZXREaWZmZXJlbmNlIDwgLTAuNSkgewogICAgICBjb25zdCBiZWZvcmVUYWlNaW51c1V0YyA9IHNhbXBsZXNbc3RhcnRCZWZvcmUgKyBlb3AuX3RhaU1pbnVzVXRjU2Vjb25kc0NvbHVtbl07CiAgICAgIGNvbnN0IGFmdGVyVGFpTWludXNVdGMgPSBzYW1wbGVzW3N0YXJ0QWZ0ZXIgKyBlb3AuX3RhaU1pbnVzVXRjU2Vjb25kc0NvbHVtbl07CiAgICAgIGlmIChiZWZvcmVUYWlNaW51c1V0YyAhPT0gYWZ0ZXJUYWlNaW51c1V0YykgewogICAgICAgIGlmIChhZnRlckRhdGUuZXF1YWxzKGRhdGUpKSB7CiAgICAgICAgICBiZWZvcmVVdDFNaW51c1V0YyA9IGFmdGVyVXQxTWludXNVdGM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFmdGVyVXQxTWludXNVdGMgLT0gYWZ0ZXJUYWlNaW51c1V0YyAtIGJlZm9yZVRhaU1pbnVzVXRjOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmVzdWx0LnhQb2xlV2FuZGVyID0gbGluZWFySW50ZXJwKAogICAgICBmYWN0b3IsCiAgICAgIHNhbXBsZXNbc3RhcnRCZWZvcmUgKyBlb3AuX3hQb2xlV2FuZGVyUmFkaWFuc0NvbHVtbl0sCiAgICAgIHNhbXBsZXNbc3RhcnRBZnRlciArIGVvcC5feFBvbGVXYW5kZXJSYWRpYW5zQ29sdW1uXQogICAgKTsKICAgIHJlc3VsdC55UG9sZVdhbmRlciA9IGxpbmVhckludGVycCgKICAgICAgZmFjdG9yLAogICAgICBzYW1wbGVzW3N0YXJ0QmVmb3JlICsgZW9wLl95UG9sZVdhbmRlclJhZGlhbnNDb2x1bW5dLAogICAgICBzYW1wbGVzW3N0YXJ0QWZ0ZXIgKyBlb3AuX3lQb2xlV2FuZGVyUmFkaWFuc0NvbHVtbl0KICAgICk7CiAgICByZXN1bHQueFBvbGVPZmZzZXQgPSBsaW5lYXJJbnRlcnAoCiAgICAgIGZhY3RvciwKICAgICAgc2FtcGxlc1tzdGFydEJlZm9yZSArIGVvcC5feENlbGVzdGlhbFBvbGVPZmZzZXRSYWRpYW5zQ29sdW1uXSwKICAgICAgc2FtcGxlc1tzdGFydEFmdGVyICsgZW9wLl94Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnNDb2x1bW5dCiAgICApOwogICAgcmVzdWx0LnlQb2xlT2Zmc2V0ID0gbGluZWFySW50ZXJwKAogICAgICBmYWN0b3IsCiAgICAgIHNhbXBsZXNbc3RhcnRCZWZvcmUgKyBlb3AuX3lDZWxlc3RpYWxQb2xlT2Zmc2V0UmFkaWFuc0NvbHVtbl0sCiAgICAgIHNhbXBsZXNbc3RhcnRBZnRlciArIGVvcC5feUNlbGVzdGlhbFBvbGVPZmZzZXRSYWRpYW5zQ29sdW1uXQogICAgKTsKICAgIHJlc3VsdC51dDFNaW51c1V0YyA9IGxpbmVhckludGVycCgKICAgICAgZmFjdG9yLAogICAgICBiZWZvcmVVdDFNaW51c1V0YywKICAgICAgYWZ0ZXJVdDFNaW51c1V0YwogICAgKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIHZhciBFYXJ0aE9yaWVudGF0aW9uUGFyYW1ldGVyc19kZWZhdWx0OwogIHZhciBpbml0X0VhcnRoT3JpZW50YXRpb25QYXJhbWV0ZXJzID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9FYXJ0aE9yaWVudGF0aW9uUGFyYW1ldGVycy5qcyIoKSB7CiAgICAgIGluaXRfYmluYXJ5U2VhcmNoKCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRWFydGhPcmllbnRhdGlvblBhcmFtZXRlcnNTYW1wbGUoKTsKICAgICAgaW5pdF9KdWxpYW5EYXRlKCk7CiAgICAgIGluaXRfTGVhcFNlY29uZCgpOwogICAgICBpbml0X1Jlc291cmNlKCk7CiAgICAgIGluaXRfUnVudGltZUVycm9yKCk7CiAgICAgIGluaXRfVGltZUNvbnN0YW50cygpOwogICAgICBpbml0X1RpbWVTdGFuZGFyZCgpOwogICAgICBFYXJ0aE9yaWVudGF0aW9uUGFyYW1ldGVycy5mcm9tVXJsID0gYXN5bmMgZnVuY3Rpb24odXJsLCBvcHRpb25zKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJ1cmwiLCB1cmwpOwogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgICAgICBjb25zdCByZXNvdXJjZSA9IFJlc291cmNlX2RlZmF1bHQuY3JlYXRlSWZOZWVkZWQodXJsKTsKICAgICAgICBsZXQgZW9wRGF0YTsKICAgICAgICB0cnkgewogICAgICAgICAgZW9wRGF0YSA9IGF3YWl0IHJlc291cmNlLmZldGNoSnNvbigpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgYEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJldHJpZXZpbmcgdGhlIEVPUCBkYXRhIGZyb20gdGhlIFVSTCAke3Jlc291cmNlLnVybH0uYAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBFYXJ0aE9yaWVudGF0aW9uUGFyYW1ldGVycyh7CiAgICAgICAgICBhZGROZXdMZWFwU2Vjb25kczogb3B0aW9ucy5hZGROZXdMZWFwU2Vjb25kcywKICAgICAgICAgIGRhdGE6IGVvcERhdGEKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgRWFydGhPcmllbnRhdGlvblBhcmFtZXRlcnMuTk9ORSA9IE9iamVjdC5mcmVlemUoewogICAgICAgIGNvbXB1dGU6IGZ1bmN0aW9uKGRhdGUsIHJlc3VsdCkgewogICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgICByZXN1bHQgPSBuZXcgRWFydGhPcmllbnRhdGlvblBhcmFtZXRlcnNTYW1wbGVfZGVmYXVsdCgwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdC54UG9sZVdhbmRlciA9IDA7CiAgICAgICAgICAgIHJlc3VsdC55UG9sZVdhbmRlciA9IDA7CiAgICAgICAgICAgIHJlc3VsdC54UG9sZU9mZnNldCA9IDA7CiAgICAgICAgICAgIHJlc3VsdC55UG9sZU9mZnNldCA9IDA7CiAgICAgICAgICAgIHJlc3VsdC51dDFNaW51c1V0YyA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIEVhcnRoT3JpZW50YXRpb25QYXJhbWV0ZXJzLnByb3RvdHlwZS5jb21wdXRlID0gZnVuY3Rpb24oZGF0ZSwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodGhpcy5fc2FtcGxlcykpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBFYXJ0aE9yaWVudGF0aW9uUGFyYW1ldGVyc1NhbXBsZV9kZWZhdWx0KDAsIDAsIDAsIDAsIDApOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fc2FtcGxlcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJlc3VsdC54UG9sZVdhbmRlciA9IDA7CiAgICAgICAgICByZXN1bHQueVBvbGVXYW5kZXIgPSAwOwogICAgICAgICAgcmVzdWx0LnhQb2xlT2Zmc2V0ID0gMDsKICAgICAgICAgIHJlc3VsdC55UG9sZU9mZnNldCA9IDA7CiAgICAgICAgICByZXN1bHQudXQxTWludXNVdGMgPSAwOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLl9kYXRlczsKICAgICAgICBjb25zdCBsYXN0SW5kZXggPSB0aGlzLl9sYXN0SW5kZXg7CiAgICAgICAgbGV0IGJlZm9yZSA9IDA7CiAgICAgICAgbGV0IGFmdGVyID0gMDsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGxhc3RJbmRleCkpIHsKICAgICAgICAgIGNvbnN0IHByZXZpb3VzSW5kZXhEYXRlID0gZGF0ZXNbbGFzdEluZGV4XTsKICAgICAgICAgIGNvbnN0IG5leHRJbmRleERhdGUgPSBkYXRlc1tsYXN0SW5kZXggKyAxXTsKICAgICAgICAgIGNvbnN0IGlzQWZ0ZXJQcmV2aW91cyA9IEp1bGlhbkRhdGVfZGVmYXVsdC5sZXNzVGhhbk9yRXF1YWxzKAogICAgICAgICAgICBwcmV2aW91c0luZGV4RGF0ZSwKICAgICAgICAgICAgZGF0ZQogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IGlzQWZ0ZXJMYXN0U2FtcGxlID0gIWRlZmluZWRfZGVmYXVsdChuZXh0SW5kZXhEYXRlKTsKICAgICAgICAgIGNvbnN0IGlzQmVmb3JlTmV4dCA9IGlzQWZ0ZXJMYXN0U2FtcGxlIHx8IEp1bGlhbkRhdGVfZGVmYXVsdC5ncmVhdGVyVGhhbk9yRXF1YWxzKG5leHRJbmRleERhdGUsIGRhdGUpOwogICAgICAgICAgaWYgKGlzQWZ0ZXJQcmV2aW91cyAmJiBpc0JlZm9yZU5leHQpIHsKICAgICAgICAgICAgYmVmb3JlID0gbGFzdEluZGV4OwogICAgICAgICAgICBpZiAoIWlzQWZ0ZXJMYXN0U2FtcGxlICYmIG5leHRJbmRleERhdGUuZXF1YWxzKGRhdGUpKSB7CiAgICAgICAgICAgICAgKytiZWZvcmU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWZ0ZXIgPSBiZWZvcmUgKyAxOwogICAgICAgICAgICBpbnRlcnBvbGF0ZSh0aGlzLCBkYXRlcywgdGhpcy5fc2FtcGxlcywgZGF0ZSwgYmVmb3JlLCBhZnRlciwgcmVzdWx0KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IGluZGV4ID0gYmluYXJ5U2VhcmNoX2RlZmF1bHQoZGF0ZXMsIGRhdGUsIEp1bGlhbkRhdGVfZGVmYXVsdC5jb21wYXJlLCB0aGlzLl9kYXRlQ29sdW1uKTsKICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgaWYgKGluZGV4IDwgZGF0ZXMubGVuZ3RoIC0gMSAmJiBkYXRlc1tpbmRleCArIDFdLmVxdWFscyhkYXRlKSkgewogICAgICAgICAgICArK2luZGV4OwogICAgICAgICAgfQogICAgICAgICAgYmVmb3JlID0gaW5kZXg7CiAgICAgICAgICBhZnRlciA9IGluZGV4OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhZnRlciA9IH5pbmRleDsKICAgICAgICAgIGJlZm9yZSA9IGFmdGVyIC0gMTsKICAgICAgICAgIGlmIChiZWZvcmUgPCAwKSB7CiAgICAgICAgICAgIGJlZm9yZSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX2xhc3RJbmRleCA9IGJlZm9yZTsKICAgICAgICBpbnRlcnBvbGF0ZSh0aGlzLCBkYXRlcywgdGhpcy5fc2FtcGxlcywgZGF0ZSwgYmVmb3JlLCBhZnRlciwgcmVzdWx0KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBFYXJ0aE9yaWVudGF0aW9uUGFyYW1ldGVyc19kZWZhdWx0ID0gRWFydGhPcmllbnRhdGlvblBhcmFtZXRlcnM7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9IZWFkaW5nUGl0Y2hSb2xsLmpzCiAgZnVuY3Rpb24gSGVhZGluZ1BpdGNoUm9sbChoZWFkaW5nLCBwaXRjaCwgcm9sbCkgewogICAgdGhpcy5oZWFkaW5nID0gaGVhZGluZyA/PyAwOwogICAgdGhpcy5waXRjaCA9IHBpdGNoID8/IDA7CiAgICB0aGlzLnJvbGwgPSByb2xsID8/IDA7CiAgfQogIHZhciBIZWFkaW5nUGl0Y2hSb2xsX2RlZmF1bHQ7CiAgdmFyIGluaXRfSGVhZGluZ1BpdGNoUm9sbCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvSGVhZGluZ1BpdGNoUm9sbC5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBIZWFkaW5nUGl0Y2hSb2xsLmZyb21RdWF0ZXJuaW9uID0gZnVuY3Rpb24ocXVhdGVybmlvbiwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocXVhdGVybmlvbikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJxdWF0ZXJuaW9uIGlzIHJlcXVpcmVkIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBIZWFkaW5nUGl0Y2hSb2xsKCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHRlc3QgPSAyICogKHF1YXRlcm5pb24udyAqIHF1YXRlcm5pb24ueSAtIHF1YXRlcm5pb24ueiAqIHF1YXRlcm5pb24ueCk7CiAgICAgICAgY29uc3QgZGVub21pbmF0b3JSb2xsID0gMSAtIDIgKiAocXVhdGVybmlvbi54ICogcXVhdGVybmlvbi54ICsgcXVhdGVybmlvbi55ICogcXVhdGVybmlvbi55KTsKICAgICAgICBjb25zdCBudW1lcmF0b3JSb2xsID0gMiAqIChxdWF0ZXJuaW9uLncgKiBxdWF0ZXJuaW9uLnggKyBxdWF0ZXJuaW9uLnkgKiBxdWF0ZXJuaW9uLnopOwogICAgICAgIGNvbnN0IGRlbm9taW5hdG9ySGVhZGluZyA9IDEgLSAyICogKHF1YXRlcm5pb24ueSAqIHF1YXRlcm5pb24ueSArIHF1YXRlcm5pb24ueiAqIHF1YXRlcm5pb24ueik7CiAgICAgICAgY29uc3QgbnVtZXJhdG9ySGVhZGluZyA9IDIgKiAocXVhdGVybmlvbi53ICogcXVhdGVybmlvbi56ICsgcXVhdGVybmlvbi54ICogcXVhdGVybmlvbi55KTsKICAgICAgICByZXN1bHQuaGVhZGluZyA9IC1NYXRoLmF0YW4yKG51bWVyYXRvckhlYWRpbmcsIGRlbm9taW5hdG9ySGVhZGluZyk7CiAgICAgICAgcmVzdWx0LnJvbGwgPSBNYXRoLmF0YW4yKG51bWVyYXRvclJvbGwsIGRlbm9taW5hdG9yUm9sbCk7CiAgICAgICAgcmVzdWx0LnBpdGNoID0gLU1hdGhfZGVmYXVsdC5hc2luQ2xhbXBlZCh0ZXN0KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBIZWFkaW5nUGl0Y2hSb2xsLmZyb21EZWdyZWVzID0gZnVuY3Rpb24oaGVhZGluZywgcGl0Y2gsIHJvbGwsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGhlYWRpbmcpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiaGVhZGluZyBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwaXRjaCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJwaXRjaCBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyb2xsKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInJvbGwgaXMgcmVxdWlyZWQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IEhlYWRpbmdQaXRjaFJvbGwoKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LmhlYWRpbmcgPSBoZWFkaW5nICogTWF0aF9kZWZhdWx0LlJBRElBTlNfUEVSX0RFR1JFRTsKICAgICAgICByZXN1bHQucGl0Y2ggPSBwaXRjaCAqIE1hdGhfZGVmYXVsdC5SQURJQU5TX1BFUl9ERUdSRUU7CiAgICAgICAgcmVzdWx0LnJvbGwgPSByb2xsICogTWF0aF9kZWZhdWx0LlJBRElBTlNfUEVSX0RFR1JFRTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBIZWFkaW5nUGl0Y2hSb2xsLmNsb25lID0gZnVuY3Rpb24oaGVhZGluZ1BpdGNoUm9sbCwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaGVhZGluZ1BpdGNoUm9sbCkpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgSGVhZGluZ1BpdGNoUm9sbCgKICAgICAgICAgICAgaGVhZGluZ1BpdGNoUm9sbC5oZWFkaW5nLAogICAgICAgICAgICBoZWFkaW5nUGl0Y2hSb2xsLnBpdGNoLAogICAgICAgICAgICBoZWFkaW5nUGl0Y2hSb2xsLnJvbGwKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5oZWFkaW5nID0gaGVhZGluZ1BpdGNoUm9sbC5oZWFkaW5nOwogICAgICAgIHJlc3VsdC5waXRjaCA9IGhlYWRpbmdQaXRjaFJvbGwucGl0Y2g7CiAgICAgICAgcmVzdWx0LnJvbGwgPSBoZWFkaW5nUGl0Y2hSb2xsLnJvbGw7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgSGVhZGluZ1BpdGNoUm9sbC5lcXVhbHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkgewogICAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodCB8fCBkZWZpbmVkX2RlZmF1bHQobGVmdCkgJiYgZGVmaW5lZF9kZWZhdWx0KHJpZ2h0KSAmJiBsZWZ0LmhlYWRpbmcgPT09IHJpZ2h0LmhlYWRpbmcgJiYgbGVmdC5waXRjaCA9PT0gcmlnaHQucGl0Y2ggJiYgbGVmdC5yb2xsID09PSByaWdodC5yb2xsOwogICAgICB9OwogICAgICBIZWFkaW5nUGl0Y2hSb2xsLmVxdWFsc0Vwc2lsb24gPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVsYXRpdmVFcHNpbG9uLCBhYnNvbHV0ZUVwc2lsb24pIHsKICAgICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgZGVmaW5lZF9kZWZhdWx0KGxlZnQpICYmIGRlZmluZWRfZGVmYXVsdChyaWdodCkgJiYgTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oCiAgICAgICAgICBsZWZ0LmhlYWRpbmcsCiAgICAgICAgICByaWdodC5oZWFkaW5nLAogICAgICAgICAgcmVsYXRpdmVFcHNpbG9uLAogICAgICAgICAgYWJzb2x1dGVFcHNpbG9uCiAgICAgICAgKSAmJiBNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgIGxlZnQucGl0Y2gsCiAgICAgICAgICByaWdodC5waXRjaCwKICAgICAgICAgIHJlbGF0aXZlRXBzaWxvbiwKICAgICAgICAgIGFic29sdXRlRXBzaWxvbgogICAgICAgICkgJiYgTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oCiAgICAgICAgICBsZWZ0LnJvbGwsCiAgICAgICAgICByaWdodC5yb2xsLAogICAgICAgICAgcmVsYXRpdmVFcHNpbG9uLAogICAgICAgICAgYWJzb2x1dGVFcHNpbG9uCiAgICAgICAgKTsKICAgICAgfTsKICAgICAgSGVhZGluZ1BpdGNoUm9sbC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICByZXR1cm4gSGVhZGluZ1BpdGNoUm9sbC5jbG9uZSh0aGlzLCByZXN1bHQpOwogICAgICB9OwogICAgICBIZWFkaW5nUGl0Y2hSb2xsLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbihyaWdodCkgewogICAgICAgIHJldHVybiBIZWFkaW5nUGl0Y2hSb2xsLmVxdWFscyh0aGlzLCByaWdodCk7CiAgICAgIH07CiAgICAgIEhlYWRpbmdQaXRjaFJvbGwucHJvdG90eXBlLmVxdWFsc0Vwc2lsb24gPSBmdW5jdGlvbihyaWdodCwgcmVsYXRpdmVFcHNpbG9uLCBhYnNvbHV0ZUVwc2lsb24pIHsKICAgICAgICByZXR1cm4gSGVhZGluZ1BpdGNoUm9sbC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgdGhpcywKICAgICAgICAgIHJpZ2h0LAogICAgICAgICAgcmVsYXRpdmVFcHNpbG9uLAogICAgICAgICAgYWJzb2x1dGVFcHNpbG9uCiAgICAgICAgKTsKICAgICAgfTsKICAgICAgSGVhZGluZ1BpdGNoUm9sbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYCgke3RoaXMuaGVhZGluZ30sICR7dGhpcy5waXRjaH0sICR7dGhpcy5yb2xsfSlgOwogICAgICB9OwogICAgICBIZWFkaW5nUGl0Y2hSb2xsX2RlZmF1bHQgPSBIZWFkaW5nUGl0Y2hSb2xsOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvYnVpbGRNb2R1bGVVcmwuanMKICBmdW5jdGlvbiBnZXRCYXNlVXJsRnJvbUNlc2l1bVNjcmlwdCgpIHsKICAgIGNvbnN0IHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7CiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc2NyaXB0cy5sZW5ndGg7IGkgPCBsZW47ICsraSkgewogICAgICBjb25zdCBzcmMgPSBzY3JpcHRzW2ldLmdldEF0dHJpYnV0ZSgic3JjIik7CiAgICAgIGNvbnN0IHJlc3VsdCA9IGNlc2l1bVNjcmlwdFJlZ2V4LmV4ZWMoc3JjKTsKICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2b2lkIDA7CiAgfQogIGZ1bmN0aW9uIHRyeU1ha2VBYnNvbHV0ZSh1cmwpIHsKICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIHJldHVybiB1cmw7CiAgICB9CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhMikpIHsKICAgICAgYTIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CiAgICB9CiAgICBhMi5ocmVmID0gdXJsOwogICAgcmV0dXJuIGEyLmhyZWY7CiAgfQogIGZ1bmN0aW9uIGdldENlc2l1bUJhc2VVcmwoKSB7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGJhc2VSZXNvdXJjZSkpIHsKICAgICAgcmV0dXJuIGJhc2VSZXNvdXJjZTsKICAgIH0KICAgIGxldCBiYXNlVXJsU3RyaW5nOwogICAgaWYgKHR5cGVvZiBDRVNJVU1fQkFTRV9VUkwgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGJhc2VVcmxTdHJpbmcgPSBDRVNJVU1fQkFTRV9VUkw7CiAgICB9IGVsc2UgaWYgKGRlZmluZWRfZGVmYXVsdChpbXBvcnRfbWV0YT8udXJsKSkgewogICAgICBiYXNlVXJsU3RyaW5nID0gZ2V0QWJzb2x1dGVVcmlfZGVmYXVsdCgiLiIsIGltcG9ydF9tZXRhLnVybCk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICJvYmplY3QiICYmIGRlZmluZWRfZGVmYXVsdChkZWZpbmUuYW1kKSAmJiAhZGVmaW5lLmFtZC50b1VybFVuZGVmaW5lZCAmJiBkZWZpbmVkX2RlZmF1bHQoX19yZXF1aXJlLnRvVXJsKSkgewogICAgICBiYXNlVXJsU3RyaW5nID0gZ2V0QWJzb2x1dGVVcmlfZGVmYXVsdCgKICAgICAgICAiLi4iLAogICAgICAgIGJ1aWxkTW9kdWxlVXJsKCJDb3JlL2J1aWxkTW9kdWxlVXJsLmpzIikKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGJhc2VVcmxTdHJpbmcgPSBnZXRCYXNlVXJsRnJvbUNlc2l1bVNjcmlwdCgpOwogICAgfQogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYmFzZVVybFN0cmluZykpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgIlVuYWJsZSB0byBkZXRlcm1pbmUgQ2VzaXVtIGJhc2UgVVJMIGF1dG9tYXRpY2FsbHksIHRyeSBkZWZpbmluZyBhIGdsb2JhbCB2YXJpYWJsZSBjYWxsZWQgQ0VTSVVNX0JBU0VfVVJMLiIKICAgICAgKTsKICAgIH0KICAgIGJhc2VSZXNvdXJjZSA9IG5ldyBSZXNvdXJjZV9kZWZhdWx0KHsKICAgICAgdXJsOiB0cnlNYWtlQWJzb2x1dGUoYmFzZVVybFN0cmluZykKICAgIH0pOwogICAgYmFzZVJlc291cmNlLmFwcGVuZEZvcndhcmRTbGFzaCgpOwogICAgcmV0dXJuIGJhc2VSZXNvdXJjZTsKICB9CiAgZnVuY3Rpb24gYnVpbGRNb2R1bGVVcmxGcm9tUmVxdWlyZVRvVXJsKG1vZHVsZUlEKSB7CiAgICByZXR1cm4gdHJ5TWFrZUFic29sdXRlKF9fcmVxdWlyZS50b1VybChgLi4vJHttb2R1bGVJRH1gKSk7CiAgfQogIGZ1bmN0aW9uIGJ1aWxkTW9kdWxlVXJsRnJvbUJhc2VVcmwobW9kdWxlSUQpIHsKICAgIGNvbnN0IHJlc291cmNlID0gZ2V0Q2VzaXVtQmFzZVVybCgpLmdldERlcml2ZWRSZXNvdXJjZSh7CiAgICAgIHVybDogbW9kdWxlSUQKICAgIH0pOwogICAgcmV0dXJuIHJlc291cmNlLnVybDsKICB9CiAgZnVuY3Rpb24gYnVpbGRNb2R1bGVVcmwocmVsYXRpdmVVcmwpIHsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGltcGxlbWVudGF0aW9uKSkgewogICAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gIm9iamVjdCIgJiYgZGVmaW5lZF9kZWZhdWx0KGRlZmluZS5hbWQpICYmICFkZWZpbmUuYW1kLnRvVXJsVW5kZWZpbmVkICYmIGRlZmluZWRfZGVmYXVsdChfX3JlcXVpcmUudG9VcmwpKSB7CiAgICAgICAgaW1wbGVtZW50YXRpb24gPSBidWlsZE1vZHVsZVVybEZyb21SZXF1aXJlVG9Vcmw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW1wbGVtZW50YXRpb24gPSBidWlsZE1vZHVsZVVybEZyb21CYXNlVXJsOwogICAgICB9CiAgICB9CiAgICBjb25zdCB1cmwgPSBpbXBsZW1lbnRhdGlvbihyZWxhdGl2ZVVybCk7CiAgICByZXR1cm4gdXJsOwogIH0KICB2YXIgaW1wb3J0X21ldGEsIGNlc2l1bVNjcmlwdFJlZ2V4LCBhMiwgYmFzZVJlc291cmNlLCBpbXBsZW1lbnRhdGlvbiwgYnVpbGRNb2R1bGVVcmxfZGVmYXVsdDsKICB2YXIgaW5pdF9idWlsZE1vZHVsZVVybCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvYnVpbGRNb2R1bGVVcmwuanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X2dldEFic29sdXRlVXJpKCk7CiAgICAgIGluaXRfUmVzb3VyY2UoKTsKICAgICAgaW1wb3J0X21ldGEgPSB7fTsKICAgICAgY2VzaXVtU2NyaXB0UmVnZXggPSAvKCg/Oi4qXC8pfF4pQ2VzaXVtXC5qcyg/Olw/fFwjfCQpLzsKICAgICAgYnVpbGRNb2R1bGVVcmwuX2Nlc2l1bVNjcmlwdFJlZ2V4ID0gY2VzaXVtU2NyaXB0UmVnZXg7CiAgICAgIGJ1aWxkTW9kdWxlVXJsLl9idWlsZE1vZHVsZVVybEZyb21CYXNlVXJsID0gYnVpbGRNb2R1bGVVcmxGcm9tQmFzZVVybDsKICAgICAgYnVpbGRNb2R1bGVVcmwuX2NsZWFyQmFzZVJlc291cmNlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgYmFzZVJlc291cmNlID0gdm9pZCAwOwogICAgICB9OwogICAgICBidWlsZE1vZHVsZVVybC5zZXRCYXNlVXJsID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICBiYXNlUmVzb3VyY2UgPSBSZXNvdXJjZV9kZWZhdWx0LkRFRkFVTFQuZ2V0RGVyaXZlZFJlc291cmNlKHsKICAgICAgICAgIHVybDogdmFsdWUKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgYnVpbGRNb2R1bGVVcmwuZ2V0Q2VzaXVtQmFzZVVybCA9IGdldENlc2l1bUJhc2VVcmw7CiAgICAgIGJ1aWxkTW9kdWxlVXJsX2RlZmF1bHQgPSBidWlsZE1vZHVsZVVybDsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0lhdTIwMDZYeXNTYW1wbGUuanMKICBmdW5jdGlvbiBJYXUyMDA2WHlzU2FtcGxlKHgsIHksIHMpIHsKICAgIHRoaXMueCA9IHg7CiAgICB0aGlzLnkgPSB5OwogICAgdGhpcy5zID0gczsKICB9CiAgdmFyIElhdTIwMDZYeXNTYW1wbGVfZGVmYXVsdDsKICB2YXIgaW5pdF9JYXUyMDA2WHlzU2FtcGxlID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9JYXUyMDA2WHlzU2FtcGxlLmpzIigpIHsKICAgICAgSWF1MjAwNlh5c1NhbXBsZV9kZWZhdWx0ID0gSWF1MjAwNlh5c1NhbXBsZTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0lhdTIwMDZYeXNEYXRhLmpzCiAgZnVuY3Rpb24gSWF1MjAwNlh5c0RhdGEob3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgPz8gRnJvemVuX2RlZmF1bHQuRU1QVFlfT0JKRUNUOwogICAgdGhpcy5feHlzRmlsZVVybFRlbXBsYXRlID0gUmVzb3VyY2VfZGVmYXVsdC5jcmVhdGVJZk5lZWRlZCgKICAgICAgb3B0aW9ucy54eXNGaWxlVXJsVGVtcGxhdGUKICAgICk7CiAgICB0aGlzLl9pbnRlcnBvbGF0aW9uT3JkZXIgPSBvcHRpb25zLmludGVycG9sYXRpb25PcmRlciA/PyA5OwogICAgdGhpcy5fc2FtcGxlWmVyb0p1bGlhbkVwaGVtZXJpc0RhdGUgPSBvcHRpb25zLnNhbXBsZVplcm9KdWxpYW5FcGhlbWVyaXNEYXRlID8/IDI0NDIzOTY1ZS0xOwogICAgdGhpcy5fc2FtcGxlWmVyb0RhdGVUVCA9IG5ldyBKdWxpYW5EYXRlX2RlZmF1bHQoCiAgICAgIHRoaXMuX3NhbXBsZVplcm9KdWxpYW5FcGhlbWVyaXNEYXRlLAogICAgICAwLAogICAgICBUaW1lU3RhbmRhcmRfZGVmYXVsdC5UQUkKICAgICk7CiAgICB0aGlzLl9zdGVwU2l6ZURheXMgPSBvcHRpb25zLnN0ZXBTaXplRGF5cyA/PyAxOwogICAgdGhpcy5fc2FtcGxlc1Blclh5c0ZpbGUgPSBvcHRpb25zLnNhbXBsZXNQZXJYeXNGaWxlID8/IDFlMzsKICAgIHRoaXMuX3RvdGFsU2FtcGxlcyA9IG9wdGlvbnMudG90YWxTYW1wbGVzID8/IDI3NDI2OwogICAgdGhpcy5fc2FtcGxlcyA9IG5ldyBBcnJheSh0aGlzLl90b3RhbFNhbXBsZXMgKiAzKTsKICAgIHRoaXMuX2NodW5rRG93bmxvYWRzSW5Qcm9ncmVzcyA9IFtdOwogICAgY29uc3Qgb3JkZXIgPSB0aGlzLl9pbnRlcnBvbGF0aW9uT3JkZXI7CiAgICBjb25zdCBkZW5vbSA9IHRoaXMuX2Rlbm9taW5hdG9ycyA9IG5ldyBBcnJheShvcmRlciArIDEpOwogICAgY29uc3QgeFRhYmxlID0gdGhpcy5feFRhYmxlID0gbmV3IEFycmF5KG9yZGVyICsgMSk7CiAgICBjb25zdCBzdGVwTiA9IE1hdGgucG93KHRoaXMuX3N0ZXBTaXplRGF5cywgb3JkZXIpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gb3JkZXI7ICsraSkgewogICAgICBkZW5vbVtpXSA9IHN0ZXBOOwogICAgICB4VGFibGVbaV0gPSBpICogdGhpcy5fc3RlcFNpemVEYXlzOwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8PSBvcmRlcjsgKytqKSB7CiAgICAgICAgaWYgKGogIT09IGkpIHsKICAgICAgICAgIGRlbm9tW2ldICo9IGkgLSBqOwogICAgICAgIH0KICAgICAgfQogICAgICBkZW5vbVtpXSA9IDEgLyBkZW5vbVtpXTsKICAgIH0KICAgIHRoaXMuX3dvcmsgPSBuZXcgQXJyYXkob3JkZXIgKyAxKTsKICAgIHRoaXMuX2NvZWYgPSBuZXcgQXJyYXkob3JkZXIgKyAxKTsKICB9CiAgZnVuY3Rpb24gZ2V0RGF5c1NpbmNlRXBvY2goeHlzLCBkYXlUVCwgc2Vjb25kVFQpIHsKICAgIGNvbnN0IGRhdGVUVCA9IGp1bGlhbkRhdGVTY3JhdGNoOwogICAgZGF0ZVRULmRheU51bWJlciA9IGRheVRUOwogICAgZGF0ZVRULnNlY29uZHNPZkRheSA9IHNlY29uZFRUOwogICAgcmV0dXJuIEp1bGlhbkRhdGVfZGVmYXVsdC5kYXlzRGlmZmVyZW5jZShkYXRlVFQsIHh5cy5fc2FtcGxlWmVyb0RhdGVUVCk7CiAgfQogIGZ1bmN0aW9uIHJlcXVlc3RYeXNDaHVuayh4eXNEYXRhLCBjaHVua0luZGV4KSB7CiAgICBpZiAoeHlzRGF0YS5fY2h1bmtEb3dubG9hZHNJblByb2dyZXNzW2NodW5rSW5kZXhdKSB7CiAgICAgIHJldHVybiB4eXNEYXRhLl9jaHVua0Rvd25sb2Fkc0luUHJvZ3Jlc3NbY2h1bmtJbmRleF07CiAgICB9CiAgICBsZXQgY2h1bmtVcmw7CiAgICBjb25zdCB4eXNGaWxlVXJsVGVtcGxhdGUgPSB4eXNEYXRhLl94eXNGaWxlVXJsVGVtcGxhdGU7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHh5c0ZpbGVVcmxUZW1wbGF0ZSkpIHsKICAgICAgY2h1bmtVcmwgPSB4eXNGaWxlVXJsVGVtcGxhdGUuZ2V0RGVyaXZlZFJlc291cmNlKHsKICAgICAgICB0ZW1wbGF0ZVZhbHVlczogewogICAgICAgICAgMDogY2h1bmtJbmRleAogICAgICAgIH0KICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBjaHVua1VybCA9IG5ldyBSZXNvdXJjZV9kZWZhdWx0KHsKICAgICAgICB1cmw6IGJ1aWxkTW9kdWxlVXJsX2RlZmF1bHQoYEFzc2V0cy9JQVUyMDA2X1hZUy9JQVUyMDA2X1hZU18ke2NodW5rSW5kZXh9Lmpzb25gKQogICAgICB9KTsKICAgIH0KICAgIGNvbnN0IHByb21pc2UgPSBjaHVua1VybC5mZXRjaEpzb24oKS50aGVuKGZ1bmN0aW9uKGNodW5rKSB7CiAgICAgIHh5c0RhdGEuX2NodW5rRG93bmxvYWRzSW5Qcm9ncmVzc1tjaHVua0luZGV4XSA9IGZhbHNlOwogICAgICBjb25zdCBzYW1wbGVzID0geHlzRGF0YS5fc2FtcGxlczsKICAgICAgY29uc3QgbmV3U2FtcGxlcyA9IGNodW5rLnNhbXBsZXM7CiAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBjaHVua0luZGV4ICogeHlzRGF0YS5fc2FtcGxlc1Blclh5c0ZpbGUgKiAzOwogICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gbmV3U2FtcGxlcy5sZW5ndGg7IGkgPCBsZW47ICsraSkgewogICAgICAgIHNhbXBsZXNbc3RhcnRJbmRleCArIGldID0gbmV3U2FtcGxlc1tpXTsKICAgICAgfQogICAgfSk7CiAgICB4eXNEYXRhLl9jaHVua0Rvd25sb2Fkc0luUHJvZ3Jlc3NbY2h1bmtJbmRleF0gPSBwcm9taXNlOwogICAgcmV0dXJuIHByb21pc2U7CiAgfQogIHZhciBqdWxpYW5EYXRlU2NyYXRjaCwgSWF1MjAwNlh5c0RhdGFfZGVmYXVsdDsKICB2YXIgaW5pdF9JYXUyMDA2WHlzRGF0YSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvSWF1MjAwNlh5c0RhdGEuanMiKCkgewogICAgICBpbml0X2J1aWxkTW9kdWxlVXJsKCk7CiAgICAgIGluaXRfRnJvemVuKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0lhdTIwMDZYeXNTYW1wbGUoKTsKICAgICAgaW5pdF9KdWxpYW5EYXRlKCk7CiAgICAgIGluaXRfUmVzb3VyY2UoKTsKICAgICAgaW5pdF9UaW1lU3RhbmRhcmQoKTsKICAgICAganVsaWFuRGF0ZVNjcmF0Y2ggPSBuZXcgSnVsaWFuRGF0ZV9kZWZhdWx0KDAsIDAsIFRpbWVTdGFuZGFyZF9kZWZhdWx0LlRBSSk7CiAgICAgIElhdTIwMDZYeXNEYXRhLnByb3RvdHlwZS5wcmVsb2FkID0gZnVuY3Rpb24oc3RhcnREYXlUVCwgc3RhcnRTZWNvbmRUVCwgc3RvcERheVRULCBzdG9wU2Vjb25kVFQpIHsKICAgICAgICBjb25zdCBzdGFydERheXNTaW5jZUVwb2NoID0gZ2V0RGF5c1NpbmNlRXBvY2goCiAgICAgICAgICB0aGlzLAogICAgICAgICAgc3RhcnREYXlUVCwKICAgICAgICAgIHN0YXJ0U2Vjb25kVFQKICAgICAgICApOwogICAgICAgIGNvbnN0IHN0b3BEYXlzU2luY2VFcG9jaCA9IGdldERheXNTaW5jZUVwb2NoKHRoaXMsIHN0b3BEYXlUVCwgc3RvcFNlY29uZFRUKTsKICAgICAgICBsZXQgc3RhcnRJbmRleCA9IHN0YXJ0RGF5c1NpbmNlRXBvY2ggLyB0aGlzLl9zdGVwU2l6ZURheXMgLSB0aGlzLl9pbnRlcnBvbGF0aW9uT3JkZXIgLyAyIHwgMDsKICAgICAgICBpZiAoc3RhcnRJbmRleCA8IDApIHsKICAgICAgICAgIHN0YXJ0SW5kZXggPSAwOwogICAgICAgIH0KICAgICAgICBsZXQgc3RvcEluZGV4ID0gc3RvcERheXNTaW5jZUVwb2NoIC8gdGhpcy5fc3RlcFNpemVEYXlzIC0gdGhpcy5faW50ZXJwb2xhdGlvbk9yZGVyIC8gMiB8IDAgKyB0aGlzLl9pbnRlcnBvbGF0aW9uT3JkZXI7CiAgICAgICAgaWYgKHN0b3BJbmRleCA+PSB0aGlzLl90b3RhbFNhbXBsZXMpIHsKICAgICAgICAgIHN0b3BJbmRleCA9IHRoaXMuX3RvdGFsU2FtcGxlcyAtIDE7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN0YXJ0Q2h1bmsgPSBzdGFydEluZGV4IC8gdGhpcy5fc2FtcGxlc1Blclh5c0ZpbGUgfCAwOwogICAgICAgIGNvbnN0IHN0b3BDaHVuayA9IHN0b3BJbmRleCAvIHRoaXMuX3NhbXBsZXNQZXJYeXNGaWxlIHwgMDsKICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSBzdGFydENodW5rOyBpIDw9IHN0b3BDaHVuazsgKytpKSB7CiAgICAgICAgICBwcm9taXNlcy5wdXNoKHJlcXVlc3RYeXNDaHVuayh0aGlzLCBpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgICAgIH07CiAgICAgIElhdTIwMDZYeXNEYXRhLnByb3RvdHlwZS5jb21wdXRlWHlzUmFkaWFucyA9IGZ1bmN0aW9uKGRheVRULCBzZWNvbmRUVCwgcmVzdWx0KSB7CiAgICAgICAgY29uc3QgZGF5c1NpbmNlRXBvY2ggPSBnZXREYXlzU2luY2VFcG9jaCh0aGlzLCBkYXlUVCwgc2Vjb25kVFQpOwogICAgICAgIGlmIChkYXlzU2luY2VFcG9jaCA8IDApIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNlbnRlckluZGV4ID0gZGF5c1NpbmNlRXBvY2ggLyB0aGlzLl9zdGVwU2l6ZURheXMgfCAwOwogICAgICAgIGlmIChjZW50ZXJJbmRleCA+PSB0aGlzLl90b3RhbFNhbXBsZXMpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGRlZ3JlZSA9IHRoaXMuX2ludGVycG9sYXRpb25PcmRlcjsKICAgICAgICBsZXQgZmlyc3RJbmRleCA9IGNlbnRlckluZGV4IC0gKGRlZ3JlZSAvIDIgfCAwKTsKICAgICAgICBpZiAoZmlyc3RJbmRleCA8IDApIHsKICAgICAgICAgIGZpcnN0SW5kZXggPSAwOwogICAgICAgIH0KICAgICAgICBsZXQgbGFzdEluZGV4ID0gZmlyc3RJbmRleCArIGRlZ3JlZTsKICAgICAgICBpZiAobGFzdEluZGV4ID49IHRoaXMuX3RvdGFsU2FtcGxlcykgewogICAgICAgICAgbGFzdEluZGV4ID0gdGhpcy5fdG90YWxTYW1wbGVzIC0gMTsKICAgICAgICAgIGZpcnN0SW5kZXggPSBsYXN0SW5kZXggLSBkZWdyZWU7CiAgICAgICAgICBpZiAoZmlyc3RJbmRleCA8IDApIHsKICAgICAgICAgICAgZmlyc3RJbmRleCA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBpc0RhdGFNaXNzaW5nID0gZmFsc2U7CiAgICAgICAgY29uc3Qgc2FtcGxlcyA9IHRoaXMuX3NhbXBsZXM7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoc2FtcGxlc1tmaXJzdEluZGV4ICogM10pKSB7CiAgICAgICAgICByZXF1ZXN0WHlzQ2h1bmsodGhpcywgZmlyc3RJbmRleCAvIHRoaXMuX3NhbXBsZXNQZXJYeXNGaWxlIHwgMCk7CiAgICAgICAgICBpc0RhdGFNaXNzaW5nID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoc2FtcGxlc1tsYXN0SW5kZXggKiAzXSkpIHsKICAgICAgICAgIHJlcXVlc3RYeXNDaHVuayh0aGlzLCBsYXN0SW5kZXggLyB0aGlzLl9zYW1wbGVzUGVyWHlzRmlsZSB8IDApOwogICAgICAgICAgaXNEYXRhTWlzc2luZyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChpc0RhdGFNaXNzaW5nKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgSWF1MjAwNlh5c1NhbXBsZV9kZWZhdWx0KDAsIDAsIDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQueCA9IDA7CiAgICAgICAgICByZXN1bHQueSA9IDA7CiAgICAgICAgICByZXN1bHQucyA9IDA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHggPSBkYXlzU2luY2VFcG9jaCAtIGZpcnN0SW5kZXggKiB0aGlzLl9zdGVwU2l6ZURheXM7CiAgICAgICAgY29uc3Qgd29yayA9IHRoaXMuX3dvcms7CiAgICAgICAgY29uc3QgZGVub20gPSB0aGlzLl9kZW5vbWluYXRvcnM7CiAgICAgICAgY29uc3QgY29lZiA9IHRoaXMuX2NvZWY7CiAgICAgICAgY29uc3QgeFRhYmxlID0gdGhpcy5feFRhYmxlOwogICAgICAgIGxldCBpLCBqOwogICAgICAgIGZvciAoaSA9IDA7IGkgPD0gZGVncmVlOyArK2kpIHsKICAgICAgICAgIHdvcmtbaV0gPSB4IC0geFRhYmxlW2ldOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGRlZ3JlZTsgKytpKSB7CiAgICAgICAgICBjb2VmW2ldID0gMTsKICAgICAgICAgIGZvciAoaiA9IDA7IGogPD0gZGVncmVlOyArK2opIHsKICAgICAgICAgICAgaWYgKGogIT09IGkpIHsKICAgICAgICAgICAgICBjb2VmW2ldICo9IHdvcmtbal07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGNvZWZbaV0gKj0gZGVub21baV07CiAgICAgICAgICBsZXQgc2FtcGxlSW5kZXggPSAoZmlyc3RJbmRleCArIGkpICogMzsKICAgICAgICAgIHJlc3VsdC54ICs9IGNvZWZbaV0gKiBzYW1wbGVzW3NhbXBsZUluZGV4KytdOwogICAgICAgICAgcmVzdWx0LnkgKz0gY29lZltpXSAqIHNhbXBsZXNbc2FtcGxlSW5kZXgrK107CiAgICAgICAgICByZXN1bHQucyArPSBjb2VmW2ldICogc2FtcGxlc1tzYW1wbGVJbmRleF07CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIElhdTIwMDZYeXNEYXRhX2RlZmF1bHQgPSBJYXUyMDA2WHlzRGF0YTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0Z1bGxzY3JlZW4uanMKICB2YXIgX3N1cHBvcnRzRnVsbHNjcmVlbiwgX25hbWVzLCBGdWxsc2NyZWVuLCBGdWxsc2NyZWVuX2RlZmF1bHQ7CiAgdmFyIGluaXRfRnVsbHNjcmVlbiA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvRnVsbHNjcmVlbi5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBfbmFtZXMgPSB7CiAgICAgICAgcmVxdWVzdEZ1bGxzY3JlZW46IHZvaWQgMCwKICAgICAgICBleGl0RnVsbHNjcmVlbjogdm9pZCAwLAogICAgICAgIGZ1bGxzY3JlZW5FbmFibGVkOiB2b2lkIDAsCiAgICAgICAgZnVsbHNjcmVlbkVsZW1lbnQ6IHZvaWQgMCwKICAgICAgICBmdWxsc2NyZWVuY2hhbmdlOiB2b2lkIDAsCiAgICAgICAgZnVsbHNjcmVlbmVycm9yOiB2b2lkIDAKICAgICAgfTsKICAgICAgRnVsbHNjcmVlbiA9IHt9OwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGdWxsc2NyZWVuLCB7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGVsZW1lbnQgdGhhdCBpcyBjdXJyZW50bHkgZnVsbHNjcmVlbiwgaWYgYW55LiAgVG8gc2ltcGx5IGNoZWNrIGlmIHRoZQogICAgICAgICAqIGJyb3dzZXIgaXMgaW4gZnVsbHNjcmVlbiBtb2RlIG9yIG5vdCwgdXNlIHtAbGluayBGdWxsc2NyZWVuI2Z1bGxzY3JlZW59LgogICAgICAgICAqIEBtZW1iZXJvZiBGdWxsc2NyZWVuCiAgICAgICAgICogQHR5cGUge29iamVjdH0KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKi8KICAgICAgICBlbGVtZW50OiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIUZ1bGxzY3JlZW4uc3VwcG9ydHNGdWxsc2NyZWVuKCkpIHsKICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudFtfbmFtZXMuZnVsbHNjcmVlbkVsZW1lbnRdOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGV2ZW50IG9uIHRoZSBkb2N1bWVudCB0aGF0IGlzIGZpcmVkIHdoZW4gZnVsbHNjcmVlbiBpcwogICAgICAgICAqIGVudGVyZWQgb3IgZXhpdGVkLiAgVGhpcyBldmVudCBuYW1lIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBhZGRFdmVudExpc3RlbmVyLgogICAgICAgICAqIEluIHlvdXIgZXZlbnQgaGFuZGxlciwgdG8gZGV0ZXJtaW5lIGlmIHRoZSBicm93c2VyIGlzIGluIGZ1bGxzY3JlZW4gbW9kZSBvciBub3QsCiAgICAgICAgICogdXNlIHtAbGluayBGdWxsc2NyZWVuI2Z1bGxzY3JlZW59LgogICAgICAgICAqIEBtZW1iZXJvZiBGdWxsc2NyZWVuCiAgICAgICAgICogQHR5cGUge3N0cmluZ30KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKi8KICAgICAgICBjaGFuZ2VFdmVudE5hbWU6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghRnVsbHNjcmVlbi5zdXBwb3J0c0Z1bGxzY3JlZW4oKSkgewogICAgICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIF9uYW1lcy5mdWxsc2NyZWVuY2hhbmdlOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRoYXQgaXMgZmlyZWQgd2hlbiBhIGZ1bGxzY3JlZW4gZXJyb3IKICAgICAgICAgKiBvY2N1cnMuICBUaGlzIGV2ZW50IG5hbWUgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGFkZEV2ZW50TGlzdGVuZXIuCiAgICAgICAgICogQG1lbWJlcm9mIEZ1bGxzY3JlZW4KICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfQogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqLwogICAgICAgIGVycm9yRXZlbnROYW1lOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIUZ1bGxzY3JlZW4uc3VwcG9ydHNGdWxsc2NyZWVuKCkpIHsKICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBfbmFtZXMuZnVsbHNjcmVlbmVycm9yOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGJyb3dzZXIgd2lsbCBhbGxvdyBhbiBlbGVtZW50IHRvIGJlIG1hZGUgZnVsbHNjcmVlbiwgb3Igbm90LgogICAgICAgICAqIEZvciBleGFtcGxlLCBieSBkZWZhdWx0LCBpZnJhbWVzIGNhbm5vdCBnbyBmdWxsc2NyZWVuIHVubGVzcyB0aGUgY29udGFpbmluZyBwYWdlCiAgICAgICAgICogYWRkcyBhbiAiYWxsb3dmdWxsc2NyZWVuIiBhdHRyaWJ1dGUgKG9yIHByZWZpeGVkIGVxdWl2YWxlbnQpLgogICAgICAgICAqIEBtZW1iZXJvZiBGdWxsc2NyZWVuCiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59CiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICovCiAgICAgICAgZW5hYmxlZDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKCFGdWxsc2NyZWVuLnN1cHBvcnRzRnVsbHNjcmVlbigpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZG9jdW1lbnRbX25hbWVzLmZ1bGxzY3JlZW5FbmFibGVkXTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgaWYgdGhlIGJyb3dzZXIgaXMgY3VycmVudGx5IGluIGZ1bGxzY3JlZW4gbW9kZS4KICAgICAgICAgKiBAbWVtYmVyb2YgRnVsbHNjcmVlbgogICAgICAgICAqIEB0eXBlIHtib29sZWFufQogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqLwogICAgICAgIGZ1bGxzY3JlZW46IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghRnVsbHNjcmVlbi5zdXBwb3J0c0Z1bGxzY3JlZW4oKSkgewogICAgICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIEZ1bGxzY3JlZW4uZWxlbWVudCAhPT0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBGdWxsc2NyZWVuLnN1cHBvcnRzRnVsbHNjcmVlbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoX3N1cHBvcnRzRnVsbHNjcmVlbikpIHsKICAgICAgICAgIHJldHVybiBfc3VwcG9ydHNGdWxsc2NyZWVuOwogICAgICAgIH0KICAgICAgICBfc3VwcG9ydHNGdWxsc2NyZWVuID0gZmFsc2U7CiAgICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHk7CiAgICAgICAgaWYgKHR5cGVvZiBib2R5LnJlcXVlc3RGdWxsc2NyZWVuID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICBfbmFtZXMucmVxdWVzdEZ1bGxzY3JlZW4gPSAicmVxdWVzdEZ1bGxzY3JlZW4iOwogICAgICAgICAgX25hbWVzLmV4aXRGdWxsc2NyZWVuID0gImV4aXRGdWxsc2NyZWVuIjsKICAgICAgICAgIF9uYW1lcy5mdWxsc2NyZWVuRW5hYmxlZCA9ICJmdWxsc2NyZWVuRW5hYmxlZCI7CiAgICAgICAgICBfbmFtZXMuZnVsbHNjcmVlbkVsZW1lbnQgPSAiZnVsbHNjcmVlbkVsZW1lbnQiOwogICAgICAgICAgX25hbWVzLmZ1bGxzY3JlZW5jaGFuZ2UgPSAiZnVsbHNjcmVlbmNoYW5nZSI7CiAgICAgICAgICBfbmFtZXMuZnVsbHNjcmVlbmVycm9yID0gImZ1bGxzY3JlZW5lcnJvciI7CiAgICAgICAgICBfc3VwcG9ydHNGdWxsc2NyZWVuID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiBfc3VwcG9ydHNGdWxsc2NyZWVuOwogICAgICAgIH0KICAgICAgICBjb25zdCBwcmVmaXhlcyA9IFsid2Via2l0IiwgIm1veiIsICJvIiwgIm1zIiwgImtodG1sIl07CiAgICAgICAgbGV0IG5hbWU7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHByZWZpeGVzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7CiAgICAgICAgICBjb25zdCBwcmVmaXggPSBwcmVmaXhlc1tpXTsKICAgICAgICAgIG5hbWUgPSBgJHtwcmVmaXh9UmVxdWVzdEZ1bGxzY3JlZW5gOwogICAgICAgICAgaWYgKHR5cGVvZiBib2R5W25hbWVdID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIF9uYW1lcy5yZXF1ZXN0RnVsbHNjcmVlbiA9IG5hbWU7CiAgICAgICAgICAgIF9zdXBwb3J0c0Z1bGxzY3JlZW4gPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmFtZSA9IGAke3ByZWZpeH1SZXF1ZXN0RnVsbFNjcmVlbmA7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYm9keVtuYW1lXSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgIF9uYW1lcy5yZXF1ZXN0RnVsbHNjcmVlbiA9IG5hbWU7CiAgICAgICAgICAgICAgX3N1cHBvcnRzRnVsbHNjcmVlbiA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG5hbWUgPSBgJHtwcmVmaXh9RXhpdEZ1bGxzY3JlZW5gOwogICAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudFtuYW1lXSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBfbmFtZXMuZXhpdEZ1bGxzY3JlZW4gPSBuYW1lOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmFtZSA9IGAke3ByZWZpeH1DYW5jZWxGdWxsU2NyZWVuYDsKICAgICAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudFtuYW1lXSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgIF9uYW1lcy5leGl0RnVsbHNjcmVlbiA9IG5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG5hbWUgPSBgJHtwcmVmaXh9RnVsbHNjcmVlbkVuYWJsZWRgOwogICAgICAgICAgaWYgKGRvY3VtZW50W25hbWVdICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgX25hbWVzLmZ1bGxzY3JlZW5FbmFibGVkID0gbmFtZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5hbWUgPSBgJHtwcmVmaXh9RnVsbFNjcmVlbkVuYWJsZWRgOwogICAgICAgICAgICBpZiAoZG9jdW1lbnRbbmFtZV0gIT09IHZvaWQgMCkgewogICAgICAgICAgICAgIF9uYW1lcy5mdWxsc2NyZWVuRW5hYmxlZCA9IG5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG5hbWUgPSBgJHtwcmVmaXh9RnVsbHNjcmVlbkVsZW1lbnRgOwogICAgICAgICAgaWYgKGRvY3VtZW50W25hbWVdICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgX25hbWVzLmZ1bGxzY3JlZW5FbGVtZW50ID0gbmFtZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5hbWUgPSBgJHtwcmVmaXh9RnVsbFNjcmVlbkVsZW1lbnRgOwogICAgICAgICAgICBpZiAoZG9jdW1lbnRbbmFtZV0gIT09IHZvaWQgMCkgewogICAgICAgICAgICAgIF9uYW1lcy5mdWxsc2NyZWVuRWxlbWVudCA9IG5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG5hbWUgPSBgJHtwcmVmaXh9ZnVsbHNjcmVlbmNoYW5nZWA7CiAgICAgICAgICBpZiAoZG9jdW1lbnRbYG9uJHtuYW1lfWBdICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgaWYgKHByZWZpeCA9PT0gIm1zIikgewogICAgICAgICAgICAgIG5hbWUgPSAiTVNGdWxsc2NyZWVuQ2hhbmdlIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBfbmFtZXMuZnVsbHNjcmVlbmNoYW5nZSA9IG5hbWU7CiAgICAgICAgICB9CiAgICAgICAgICBuYW1lID0gYCR7cHJlZml4fWZ1bGxzY3JlZW5lcnJvcmA7CiAgICAgICAgICBpZiAoZG9jdW1lbnRbYG9uJHtuYW1lfWBdICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgaWYgKHByZWZpeCA9PT0gIm1zIikgewogICAgICAgICAgICAgIG5hbWUgPSAiTVNGdWxsc2NyZWVuRXJyb3IiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9uYW1lcy5mdWxsc2NyZWVuZXJyb3IgPSBuYW1lOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gX3N1cHBvcnRzRnVsbHNjcmVlbjsKICAgICAgfTsKICAgICAgRnVsbHNjcmVlbi5yZXF1ZXN0RnVsbHNjcmVlbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIHZyRGV2aWNlKSB7CiAgICAgICAgaWYgKCFGdWxsc2NyZWVuLnN1cHBvcnRzRnVsbHNjcmVlbigpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsZW1lbnRbX25hbWVzLnJlcXVlc3RGdWxsc2NyZWVuXSh7IHZyRGlzcGxheTogdnJEZXZpY2UgfSk7CiAgICAgIH07CiAgICAgIEZ1bGxzY3JlZW4uZXhpdEZ1bGxzY3JlZW4gPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIUZ1bGxzY3JlZW4uc3VwcG9ydHNGdWxsc2NyZWVuKCkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZG9jdW1lbnRbX25hbWVzLmV4aXRGdWxsc2NyZWVuXSgpOwogICAgICB9OwogICAgICBGdWxsc2NyZWVuLl9uYW1lcyA9IF9uYW1lczsKICAgICAgRnVsbHNjcmVlbl9kZWZhdWx0ID0gRnVsbHNjcmVlbjsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0ZlYXR1cmVEZXRlY3Rpb24uanMKICBmdW5jdGlvbiBleHRyYWN0VmVyc2lvbih2ZXJzaW9uU3RyaW5nKSB7CiAgICBjb25zdCBwYXJ0cyA9IHZlcnNpb25TdHJpbmcuc3BsaXQoIi4iKTsKICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBwYXJ0cy5sZW5ndGg7IGkgPCBsZW47ICsraSkgewogICAgICBwYXJ0c1tpXSA9IHBhcnNlSW50KHBhcnRzW2ldLCAxMCk7CiAgICB9CiAgICByZXR1cm4gcGFydHM7CiAgfQogIGZ1bmN0aW9uIGlzQ2hyb21lKCkgewogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaXNDaHJvbWVSZXN1bHQpKSB7CiAgICAgIGlzQ2hyb21lUmVzdWx0ID0gZmFsc2U7CiAgICAgIGlmICghaXNFZGdlKCkpIHsKICAgICAgICBjb25zdCBmaWVsZHMgPSAvIENocm9tZVwvKFtcLjAtOV0rKS8uZXhlYyh0aGVOYXZpZ2F0b3IudXNlckFnZW50KTsKICAgICAgICBpZiAoZmllbGRzICE9PSBudWxsKSB7CiAgICAgICAgICBpc0Nocm9tZVJlc3VsdCA9IHRydWU7CiAgICAgICAgICBjaHJvbWVWZXJzaW9uUmVzdWx0ID0gZXh0cmFjdFZlcnNpb24oZmllbGRzWzFdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpc0Nocm9tZVJlc3VsdDsKICB9CiAgZnVuY3Rpb24gY2hyb21lVmVyc2lvbigpIHsKICAgIHJldHVybiBpc0Nocm9tZSgpICYmIGNocm9tZVZlcnNpb25SZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIGlzU2FmYXJpKCkgewogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaXNTYWZhcmlSZXN1bHQpKSB7CiAgICAgIGlzU2FmYXJpUmVzdWx0ID0gZmFsc2U7CiAgICAgIGlmICghaXNDaHJvbWUoKSAmJiAhaXNFZGdlKCkgJiYgLyBTYWZhcmlcL1tcLjAtOV0rLy50ZXN0KHRoZU5hdmlnYXRvci51c2VyQWdlbnQpKSB7CiAgICAgICAgY29uc3QgZmllbGRzID0gLyBWZXJzaW9uXC8oW1wuMC05XSspLy5leGVjKHRoZU5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgICAgIGlmIChmaWVsZHMgIT09IG51bGwpIHsKICAgICAgICAgIGlzU2FmYXJpUmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgIHNhZmFyaVZlcnNpb25SZXN1bHQgPSBleHRyYWN0VmVyc2lvbihmaWVsZHNbMV0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGlzU2FmYXJpUmVzdWx0OwogIH0KICBmdW5jdGlvbiBzYWZhcmlWZXJzaW9uKCkgewogICAgcmV0dXJuIGlzU2FmYXJpKCkgJiYgc2FmYXJpVmVyc2lvblJlc3VsdDsKICB9CiAgZnVuY3Rpb24gaXNXZWJraXQoKSB7CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChpc1dlYmtpdFJlc3VsdCkpIHsKICAgICAgaXNXZWJraXRSZXN1bHQgPSBmYWxzZTsKICAgICAgY29uc3QgZmllbGRzID0gLyBBcHBsZVdlYktpdFwvKFtcLjAtOV0rKShcKz8pLy5leGVjKHRoZU5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgICBpZiAoZmllbGRzICE9PSBudWxsKSB7CiAgICAgICAgaXNXZWJraXRSZXN1bHQgPSB0cnVlOwogICAgICAgIHdlYmtpdFZlcnNpb25SZXN1bHQgPSBleHRyYWN0VmVyc2lvbihmaWVsZHNbMV0pOwogICAgICAgIHdlYmtpdFZlcnNpb25SZXN1bHQuaXNOaWdodGx5ID0gISFmaWVsZHNbMl07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpc1dlYmtpdFJlc3VsdDsKICB9CiAgZnVuY3Rpb24gd2Via2l0VmVyc2lvbigpIHsKICAgIHJldHVybiBpc1dlYmtpdCgpICYmIHdlYmtpdFZlcnNpb25SZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIGlzSW50ZXJuZXRFeHBsb3JlcigpIHsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGlzSW50ZXJuZXRFeHBsb3JlclJlc3VsdCkpIHsKICAgICAgaXNJbnRlcm5ldEV4cGxvcmVyUmVzdWx0ID0gZmFsc2U7CiAgICAgIGxldCBmaWVsZHM7CiAgICAgIGlmICh0aGVOYXZpZ2F0b3IuYXBwTmFtZSA9PT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpIHsKICAgICAgICBmaWVsZHMgPSAvTVNJRSAoWzAtOV17MSx9W1wuMC05XXswLH0pLy5leGVjKHRoZU5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgICAgIGlmIChmaWVsZHMgIT09IG51bGwpIHsKICAgICAgICAgIGlzSW50ZXJuZXRFeHBsb3JlclJlc3VsdCA9IHRydWU7CiAgICAgICAgICBpbnRlcm5ldEV4cGxvcmVyVmVyc2lvblJlc3VsdCA9IGV4dHJhY3RWZXJzaW9uKGZpZWxkc1sxXSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRoZU5hdmlnYXRvci5hcHBOYW1lID09PSAiTmV0c2NhcGUiKSB7CiAgICAgICAgZmllbGRzID0gL1RyaWRlbnRcLy4qcnY6KFswLTldezEsfVtcLjAtOV17MCx9KS8uZXhlYygKICAgICAgICAgIHRoZU5hdmlnYXRvci51c2VyQWdlbnQKICAgICAgICApOwogICAgICAgIGlmIChmaWVsZHMgIT09IG51bGwpIHsKICAgICAgICAgIGlzSW50ZXJuZXRFeHBsb3JlclJlc3VsdCA9IHRydWU7CiAgICAgICAgICBpbnRlcm5ldEV4cGxvcmVyVmVyc2lvblJlc3VsdCA9IGV4dHJhY3RWZXJzaW9uKGZpZWxkc1sxXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gaXNJbnRlcm5ldEV4cGxvcmVyUmVzdWx0OwogIH0KICBmdW5jdGlvbiBpbnRlcm5ldEV4cGxvcmVyVmVyc2lvbigpIHsKICAgIHJldHVybiBpc0ludGVybmV0RXhwbG9yZXIoKSAmJiBpbnRlcm5ldEV4cGxvcmVyVmVyc2lvblJlc3VsdDsKICB9CiAgZnVuY3Rpb24gaXNFZGdlKCkgewogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaXNFZGdlUmVzdWx0KSkgewogICAgICBpc0VkZ2VSZXN1bHQgPSBmYWxzZTsKICAgICAgY29uc3QgZmllbGRzID0gLyBFZGdcLyhbXC4wLTldKykvLmV4ZWModGhlTmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgIGlmIChmaWVsZHMgIT09IG51bGwpIHsKICAgICAgICBpc0VkZ2VSZXN1bHQgPSB0cnVlOwogICAgICAgIGVkZ2VWZXJzaW9uUmVzdWx0ID0gZXh0cmFjdFZlcnNpb24oZmllbGRzWzFdKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGlzRWRnZVJlc3VsdDsKICB9CiAgZnVuY3Rpb24gZWRnZVZlcnNpb24oKSB7CiAgICByZXR1cm4gaXNFZGdlKCkgJiYgZWRnZVZlcnNpb25SZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIGlzRmlyZWZveCgpIHsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGlzRmlyZWZveFJlc3VsdCkpIHsKICAgICAgaXNGaXJlZm94UmVzdWx0ID0gZmFsc2U7CiAgICAgIGNvbnN0IGZpZWxkcyA9IC9GaXJlZm94XC8oW1wuMC05XSspLy5leGVjKHRoZU5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgICBpZiAoZmllbGRzICE9PSBudWxsKSB7CiAgICAgICAgaXNGaXJlZm94UmVzdWx0ID0gdHJ1ZTsKICAgICAgICBmaXJlZm94VmVyc2lvblJlc3VsdCA9IGV4dHJhY3RWZXJzaW9uKGZpZWxkc1sxXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpc0ZpcmVmb3hSZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIGlzV2luZG93cygpIHsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGlzV2luZG93c1Jlc3VsdCkpIHsKICAgICAgaXNXaW5kb3dzUmVzdWx0ID0gL1dpbmRvd3MvaS50ZXN0KHRoZU5hdmlnYXRvci5hcHBWZXJzaW9uKTsKICAgIH0KICAgIHJldHVybiBpc1dpbmRvd3NSZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIGlzSVBhZE9ySU9TKCkgewogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaXNJUGFkT3JJT1NSZXN1bHQpKSB7CiAgICAgIGlzSVBhZE9ySU9TUmVzdWx0ID0gbmF2aWdhdG9yLnBsYXRmb3JtID09PSAiaVBob25lIiB8fCBuYXZpZ2F0b3IucGxhdGZvcm0gPT09ICJpUG9kIiB8fCBuYXZpZ2F0b3IucGxhdGZvcm0gPT09ICJpUGFkIjsKICAgIH0KICAgIHJldHVybiBpc0lQYWRPcklPU1Jlc3VsdDsKICB9CiAgZnVuY3Rpb24gZmlyZWZveFZlcnNpb24oKSB7CiAgICByZXR1cm4gaXNGaXJlZm94KCkgJiYgZmlyZWZveFZlcnNpb25SZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIHN1cHBvcnRzUG9pbnRlckV2ZW50cygpIHsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGhhc1BvaW50ZXJFdmVudHMpKSB7CiAgICAgIGhhc1BvaW50ZXJFdmVudHMgPSAhaXNGaXJlZm94KCkgJiYgdHlwZW9mIFBvaW50ZXJFdmVudCAhPT0gInVuZGVmaW5lZCIgJiYgKCFkZWZpbmVkX2RlZmF1bHQodGhlTmF2aWdhdG9yLnBvaW50ZXJFbmFibGVkKSB8fCB0aGVOYXZpZ2F0b3IucG9pbnRlckVuYWJsZWQpOwogICAgfQogICAgcmV0dXJuIGhhc1BvaW50ZXJFdmVudHM7CiAgfQogIGZ1bmN0aW9uIHN1cHBvcnRzSW1hZ2VSZW5kZXJpbmdQaXhlbGF0ZWQoKSB7CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChzdXBwb3J0c0ltYWdlUmVuZGVyaW5nUGl4ZWxhdGVkUmVzdWx0KSkgewogICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgKICAgICAgICAic3R5bGUiLAogICAgICAgICJpbWFnZS1yZW5kZXJpbmc6IC1tb3otY3Jpc3AtZWRnZXM7aW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7IgogICAgICApOwogICAgICBjb25zdCB0bXAyID0gY2FudmFzLnN0eWxlLmltYWdlUmVuZGVyaW5nOwogICAgICBzdXBwb3J0c0ltYWdlUmVuZGVyaW5nUGl4ZWxhdGVkUmVzdWx0ID0gZGVmaW5lZF9kZWZhdWx0KHRtcDIpICYmIHRtcDIgIT09ICIiOwogICAgICBpZiAoc3VwcG9ydHNJbWFnZVJlbmRlcmluZ1BpeGVsYXRlZFJlc3VsdCkgewogICAgICAgIGltYWdlUmVuZGVyaW5nVmFsdWVSZXN1bHQgPSB0bXAyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3VwcG9ydHNJbWFnZVJlbmRlcmluZ1BpeGVsYXRlZFJlc3VsdDsKICB9CiAgZnVuY3Rpb24gaW1hZ2VSZW5kZXJpbmdWYWx1ZSgpIHsKICAgIHJldHVybiBzdXBwb3J0c0ltYWdlUmVuZGVyaW5nUGl4ZWxhdGVkKCkgPyBpbWFnZVJlbmRlcmluZ1ZhbHVlUmVzdWx0IDogdm9pZCAwOwogIH0KICBmdW5jdGlvbiBzdXBwb3J0c1dlYlAoKSB7CiAgICBpZiAoIXN1cHBvcnRzV2ViUC5pbml0aWFsaXplZCkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAiWW91IG11c3QgY2FsbCBGZWF0dXJlRGV0ZWN0aW9uLnN1cHBvcnRzV2ViUC5pbml0aWFsaXplIGFuZCB3YWl0IGZvciB0aGUgcHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBjYWxsaW5nIEZlYXR1cmVEZXRlY3Rpb24uc3VwcG9ydHNXZWJQIgogICAgICApOwogICAgfQogICAgcmV0dXJuIHN1cHBvcnRzV2ViUC5fcmVzdWx0OwogIH0KICB2YXIgdGhlTmF2aWdhdG9yLCBpc0Nocm9tZVJlc3VsdCwgY2hyb21lVmVyc2lvblJlc3VsdCwgaXNTYWZhcmlSZXN1bHQsIHNhZmFyaVZlcnNpb25SZXN1bHQsIGlzV2Via2l0UmVzdWx0LCB3ZWJraXRWZXJzaW9uUmVzdWx0LCBpc0ludGVybmV0RXhwbG9yZXJSZXN1bHQsIGludGVybmV0RXhwbG9yZXJWZXJzaW9uUmVzdWx0LCBpc0VkZ2VSZXN1bHQsIGVkZ2VWZXJzaW9uUmVzdWx0LCBpc0ZpcmVmb3hSZXN1bHQsIGZpcmVmb3hWZXJzaW9uUmVzdWx0LCBpc1dpbmRvd3NSZXN1bHQsIGlzSVBhZE9ySU9TUmVzdWx0LCBoYXNQb2ludGVyRXZlbnRzLCBpbWFnZVJlbmRlcmluZ1ZhbHVlUmVzdWx0LCBzdXBwb3J0c0ltYWdlUmVuZGVyaW5nUGl4ZWxhdGVkUmVzdWx0LCB0eXBlZEFycmF5VHlwZXMsIEZlYXR1cmVEZXRlY3Rpb24sIEZlYXR1cmVEZXRlY3Rpb25fZGVmYXVsdDsKICB2YXIgaW5pdF9GZWF0dXJlRGV0ZWN0aW9uID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9GZWF0dXJlRGV0ZWN0aW9uLmpzIigpIHsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X0Z1bGxzY3JlZW4oKTsKICAgICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdGhlTmF2aWdhdG9yID0gbmF2aWdhdG9yOwogICAgICB9IGVsc2UgewogICAgICAgIHRoZU5hdmlnYXRvciA9IHt9OwogICAgICB9CiAgICAgIHN1cHBvcnRzV2ViUC5fcHJvbWlzZSA9IHZvaWQgMDsKICAgICAgc3VwcG9ydHNXZWJQLl9yZXN1bHQgPSB2b2lkIDA7CiAgICAgIHN1cHBvcnRzV2ViUC5pbml0aWFsaXplID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChzdXBwb3J0c1dlYlAuX3Byb21pc2UpKSB7CiAgICAgICAgICByZXR1cm4gc3VwcG9ydHNXZWJQLl9wcm9taXNlOwogICAgICAgIH0KICAgICAgICBzdXBwb3J0c1dlYlAuX3Byb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTsKICAgICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBzdXBwb3J0c1dlYlAuX3Jlc3VsdCA9IGltYWdlLndpZHRoID4gMCAmJiBpbWFnZS5oZWlnaHQgPiAwOwogICAgICAgICAgICByZXNvbHZlKHN1cHBvcnRzV2ViUC5fcmVzdWx0KTsKICAgICAgICAgIH07CiAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHN1cHBvcnRzV2ViUC5fcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgICAgIHJlc29sdmUoc3VwcG9ydHNXZWJQLl9yZXN1bHQpOwogICAgICAgICAgfTsKICAgICAgICAgIGltYWdlLnNyYyA9ICJkYXRhOmltYWdlL3dlYnA7YmFzZTY0LFVrbEdSaUlBQUFCWFJVSlFWbEE0SUJZQUFBQXdBUUNkQVNvQkFBRUFEc0QrSmFRQUEzQUFBQUFBIjsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gc3VwcG9ydHNXZWJQLl9wcm9taXNlOwogICAgICB9OwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzdXBwb3J0c1dlYlAsIHsKICAgICAgICBpbml0aWFsaXplZDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGRlZmluZWRfZGVmYXVsdChzdXBwb3J0c1dlYlAuX3Jlc3VsdCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdHlwZWRBcnJheVR5cGVzID0gW107CiAgICAgIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdHlwZWRBcnJheVR5cGVzLnB1c2goCiAgICAgICAgICBJbnQ4QXJyYXksCiAgICAgICAgICBVaW50OEFycmF5LAogICAgICAgICAgSW50MTZBcnJheSwKICAgICAgICAgIFVpbnQxNkFycmF5LAogICAgICAgICAgSW50MzJBcnJheSwKICAgICAgICAgIFVpbnQzMkFycmF5LAogICAgICAgICAgRmxvYXQzMkFycmF5LAogICAgICAgICAgRmxvYXQ2NEFycmF5CiAgICAgICAgKTsKICAgICAgICBpZiAodHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgdHlwZWRBcnJheVR5cGVzLnB1c2goVWludDhDbGFtcGVkQXJyYXkpOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgdHlwZWRBcnJheVR5cGVzLnB1c2goVWludDhDbGFtcGVkQXJyYXkpOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIEJpZ0ludDY0QXJyYXkgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICB0eXBlZEFycmF5VHlwZXMucHVzaChCaWdJbnQ2NEFycmF5KTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBCaWdVaW50NjRBcnJheSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgIHR5cGVkQXJyYXlUeXBlcy5wdXNoKEJpZ1VpbnQ2NEFycmF5KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgRmVhdHVyZURldGVjdGlvbiA9IHsKICAgICAgICBpc0Nocm9tZSwKICAgICAgICBjaHJvbWVWZXJzaW9uLAogICAgICAgIGlzU2FmYXJpLAogICAgICAgIHNhZmFyaVZlcnNpb24sCiAgICAgICAgaXNXZWJraXQsCiAgICAgICAgd2Via2l0VmVyc2lvbiwKICAgICAgICBpc0ludGVybmV0RXhwbG9yZXIsCiAgICAgICAgaW50ZXJuZXRFeHBsb3JlclZlcnNpb24sCiAgICAgICAgaXNFZGdlLAogICAgICAgIGVkZ2VWZXJzaW9uLAogICAgICAgIGlzRmlyZWZveCwKICAgICAgICBmaXJlZm94VmVyc2lvbiwKICAgICAgICBpc1dpbmRvd3MsCiAgICAgICAgaXNJUGFkT3JJT1MsCiAgICAgICAgaGFyZHdhcmVDb25jdXJyZW5jeTogdGhlTmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kgPz8gMywKICAgICAgICBzdXBwb3J0c1BvaW50ZXJFdmVudHMsCiAgICAgICAgc3VwcG9ydHNJbWFnZVJlbmRlcmluZ1BpeGVsYXRlZCwKICAgICAgICBzdXBwb3J0c1dlYlAsCiAgICAgICAgaW1hZ2VSZW5kZXJpbmdWYWx1ZSwKICAgICAgICB0eXBlZEFycmF5VHlwZXMKICAgICAgfTsKICAgICAgRmVhdHVyZURldGVjdGlvbi5zdXBwb3J0c0Jhc2lzID0gZnVuY3Rpb24oc2NlbmUpIHsKICAgICAgICByZXR1cm4gRmVhdHVyZURldGVjdGlvbi5zdXBwb3J0c1dlYkFzc2VtYmx5KCkgJiYgc2NlbmUuY29udGV4dC5zdXBwb3J0c0Jhc2lzOwogICAgICB9OwogICAgICBGZWF0dXJlRGV0ZWN0aW9uLnN1cHBvcnRzRnVsbHNjcmVlbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBGdWxsc2NyZWVuX2RlZmF1bHQuc3VwcG9ydHNGdWxsc2NyZWVuKCk7CiAgICAgIH07CiAgICAgIEZlYXR1cmVEZXRlY3Rpb24uc3VwcG9ydHNUeXBlZEFycmF5cyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICJ1bmRlZmluZWQiOwogICAgICB9OwogICAgICBGZWF0dXJlRGV0ZWN0aW9uLnN1cHBvcnRzQmlnSW50NjRBcnJheSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0eXBlb2YgQmlnSW50NjRBcnJheSAhPT0gInVuZGVmaW5lZCI7CiAgICAgIH07CiAgICAgIEZlYXR1cmVEZXRlY3Rpb24uc3VwcG9ydHNCaWdVaW50NjRBcnJheSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0eXBlb2YgQmlnVWludDY0QXJyYXkgIT09ICJ1bmRlZmluZWQiOwogICAgICB9OwogICAgICBGZWF0dXJlRGV0ZWN0aW9uLnN1cHBvcnRzQmlnSW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBCaWdJbnQgIT09ICJ1bmRlZmluZWQiOwogICAgICB9OwogICAgICBGZWF0dXJlRGV0ZWN0aW9uLnN1cHBvcnRzV2ViV29ya2VycyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0eXBlb2YgV29ya2VyICE9PSAidW5kZWZpbmVkIjsKICAgICAgfTsKICAgICAgRmVhdHVyZURldGVjdGlvbi5zdXBwb3J0c1dlYkFzc2VtYmx5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBXZWJBc3NlbWJseSAhPT0gInVuZGVmaW5lZCI7CiAgICAgIH07CiAgICAgIEZlYXR1cmVEZXRlY3Rpb24uc3VwcG9ydHNXZWJnbDIgPSBmdW5jdGlvbihzY2VuZSkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgic2NlbmUiLCBzY2VuZSk7CiAgICAgICAgcmV0dXJuIHNjZW5lLmNvbnRleHQud2ViZ2wyOwogICAgICB9OwogICAgICBGZWF0dXJlRGV0ZWN0aW9uLnN1cHBvcnRzRXNtV2ViV29ya2VycyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAhaXNGaXJlZm94KCkgfHwgcGFyc2VJbnQoZmlyZWZveFZlcnNpb25SZXN1bHQpID49IDExNDsKICAgICAgfTsKICAgICAgRmVhdHVyZURldGVjdGlvbl9kZWZhdWx0ID0gRmVhdHVyZURldGVjdGlvbjsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1F1YXRlcm5pb24uanMKICBmdW5jdGlvbiBRdWF0ZXJuaW9uKHgsIHksIHosIHcpIHsKICAgIHRoaXMueCA9IHggPz8gMDsKICAgIHRoaXMueSA9IHkgPz8gMDsKICAgIHRoaXMueiA9IHogPz8gMDsKICAgIHRoaXMudyA9IHcgPz8gMDsKICB9CiAgdmFyIGZyb21BeGlzQW5nbGVTY3JhdGNoLCBmcm9tUm90YXRpb25NYXRyaXhOZXh0LCBmcm9tUm90YXRpb25NYXRyaXhRdWF0LCBzY3JhdGNoSFBSUXVhdGVybmlvbiwgc2NyYXRjaEhlYWRpbmdRdWF0ZXJuaW9uLCBzY3JhdGNoUGl0Y2hRdWF0ZXJuaW9uLCBzY3JhdGNoUm9sbFF1YXRlcm5pb24sIHNhbXBsZWRRdWF0ZXJuaW9uQXhpcywgc2FtcGxlZFF1YXRlcm5pb25Sb3RhdGlvbiwgc2FtcGxlZFF1YXRlcm5pb25UZW1wUXVhdGVybmlvbiwgc2FtcGxlZFF1YXRlcm5pb25RdWF0ZXJuaW9uMCwgc2FtcGxlZFF1YXRlcm5pb25RdWF0ZXJuaW9uMENvbmp1Z2F0ZSwgbGVycFNjcmF0Y2g0LCBzbGVycEVuZE5lZ2F0ZWQsIHNsZXJwU2NhbGVkUCwgc2xlcnBTY2FsZWRSLCBzcXVhZFNjcmF0Y2hDYXJ0ZXNpYW4wLCBzcXVhZFNjcmF0Y2hDYXJ0ZXNpYW4xLCBzcXVhZFNjcmF0Y2hRdWF0ZXJuaW9uMCwgc3F1YWRTY3JhdGNoUXVhdGVybmlvbjEsIGZhc3RTbGVycFNjcmF0Y2hRdWF0ZXJuaW9uLCBvcG11LCB1LCB2LCBiVCwgYkQsIFF1YXRlcm5pb25fZGVmYXVsdDsKICB2YXIgaW5pdF9RdWF0ZXJuaW9uID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9RdWF0ZXJuaW9uLmpzIigpIHsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRmVhdHVyZURldGVjdGlvbigpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9NYXRyaXgzKCk7CiAgICAgIGZyb21BeGlzQW5nbGVTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBRdWF0ZXJuaW9uLmZyb21BeGlzQW5nbGUgPSBmdW5jdGlvbihheGlzLCBhbmdsZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJheGlzIiwgYXhpcyk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJhbmdsZSIsIGFuZ2xlKTsKICAgICAgICBjb25zdCBoYWxmQW5nbGUgPSBhbmdsZSAvIDI7CiAgICAgICAgY29uc3QgcyA9IE1hdGguc2luKGhhbGZBbmdsZSk7CiAgICAgICAgZnJvbUF4aXNBbmdsZVNjcmF0Y2ggPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKGF4aXMsIGZyb21BeGlzQW5nbGVTY3JhdGNoKTsKICAgICAgICBjb25zdCB4ID0gZnJvbUF4aXNBbmdsZVNjcmF0Y2gueCAqIHM7CiAgICAgICAgY29uc3QgeSA9IGZyb21BeGlzQW5nbGVTY3JhdGNoLnkgKiBzOwogICAgICAgIGNvbnN0IHogPSBmcm9tQXhpc0FuZ2xlU2NyYXRjaC56ICogczsKICAgICAgICBjb25zdCB3ID0gTWF0aC5jb3MoaGFsZkFuZ2xlKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFF1YXRlcm5pb24oeCwgeSwgeiwgdyk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC54ID0geDsKICAgICAgICByZXN1bHQueSA9IHk7CiAgICAgICAgcmVzdWx0LnogPSB6OwogICAgICAgIHJlc3VsdC53ID0gdzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBmcm9tUm90YXRpb25NYXRyaXhOZXh0ID0gWzEsIDIsIDBdOwogICAgICBmcm9tUm90YXRpb25NYXRyaXhRdWF0ID0gbmV3IEFycmF5KDMpOwogICAgICBRdWF0ZXJuaW9uLmZyb21Sb3RhdGlvbk1hdHJpeCA9IGZ1bmN0aW9uKG1hdHJpeCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIGxldCByb290OwogICAgICAgIGxldCB4OwogICAgICAgIGxldCB5OwogICAgICAgIGxldCB6OwogICAgICAgIGxldCB3OwogICAgICAgIGNvbnN0IG0wMCA9IG1hdHJpeFtNYXRyaXgzX2RlZmF1bHQuQ09MVU1OMFJPVzBdOwogICAgICAgIGNvbnN0IG0xMSA9IG1hdHJpeFtNYXRyaXgzX2RlZmF1bHQuQ09MVU1OMVJPVzFdOwogICAgICAgIGNvbnN0IG0yMiA9IG1hdHJpeFtNYXRyaXgzX2RlZmF1bHQuQ09MVU1OMlJPVzJdOwogICAgICAgIGNvbnN0IHRyYWNlID0gbTAwICsgbTExICsgbTIyOwogICAgICAgIGlmICh0cmFjZSA+IDApIHsKICAgICAgICAgIHJvb3QgPSBNYXRoLnNxcnQodHJhY2UgKyAxKTsKICAgICAgICAgIHcgPSAwLjUgKiByb290OwogICAgICAgICAgcm9vdCA9IDAuNSAvIHJvb3Q7CiAgICAgICAgICB4ID0gKG1hdHJpeFtNYXRyaXgzX2RlZmF1bHQuQ09MVU1OMVJPVzJdIC0gbWF0cml4W01hdHJpeDNfZGVmYXVsdC5DT0xVTU4yUk9XMV0pICogcm9vdDsKICAgICAgICAgIHkgPSAobWF0cml4W01hdHJpeDNfZGVmYXVsdC5DT0xVTU4yUk9XMF0gLSBtYXRyaXhbTWF0cml4M19kZWZhdWx0LkNPTFVNTjBST1cyXSkgKiByb290OwogICAgICAgICAgeiA9IChtYXRyaXhbTWF0cml4M19kZWZhdWx0LkNPTFVNTjBST1cxXSAtIG1hdHJpeFtNYXRyaXgzX2RlZmF1bHQuQ09MVU1OMVJPVzBdKSAqIHJvb3Q7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IG5leHQgPSBmcm9tUm90YXRpb25NYXRyaXhOZXh0OwogICAgICAgICAgbGV0IGkgPSAwOwogICAgICAgICAgaWYgKG0xMSA+IG0wMCkgewogICAgICAgICAgICBpID0gMTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtMjIgPiBtMDAgJiYgbTIyID4gbTExKSB7CiAgICAgICAgICAgIGkgPSAyOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgaiA9IG5leHRbaV07CiAgICAgICAgICBjb25zdCBrID0gbmV4dFtqXTsKICAgICAgICAgIHJvb3QgPSBNYXRoLnNxcnQoCiAgICAgICAgICAgIG1hdHJpeFtNYXRyaXgzX2RlZmF1bHQuZ2V0RWxlbWVudEluZGV4KGksIGkpXSAtIG1hdHJpeFtNYXRyaXgzX2RlZmF1bHQuZ2V0RWxlbWVudEluZGV4KGosIGopXSAtIG1hdHJpeFtNYXRyaXgzX2RlZmF1bHQuZ2V0RWxlbWVudEluZGV4KGssIGspXSArIDEKICAgICAgICAgICk7CiAgICAgICAgICBjb25zdCBxdWF0ID0gZnJvbVJvdGF0aW9uTWF0cml4UXVhdDsKICAgICAgICAgIHF1YXRbaV0gPSAwLjUgKiByb290OwogICAgICAgICAgcm9vdCA9IDAuNSAvIHJvb3Q7CiAgICAgICAgICB3ID0gKG1hdHJpeFtNYXRyaXgzX2RlZmF1bHQuZ2V0RWxlbWVudEluZGV4KGssIGopXSAtIG1hdHJpeFtNYXRyaXgzX2RlZmF1bHQuZ2V0RWxlbWVudEluZGV4KGosIGspXSkgKiByb290OwogICAgICAgICAgcXVhdFtqXSA9IChtYXRyaXhbTWF0cml4M19kZWZhdWx0LmdldEVsZW1lbnRJbmRleChqLCBpKV0gKyBtYXRyaXhbTWF0cml4M19kZWZhdWx0LmdldEVsZW1lbnRJbmRleChpLCBqKV0pICogcm9vdDsKICAgICAgICAgIHF1YXRba10gPSAobWF0cml4W01hdHJpeDNfZGVmYXVsdC5nZXRFbGVtZW50SW5kZXgoaywgaSldICsgbWF0cml4W01hdHJpeDNfZGVmYXVsdC5nZXRFbGVtZW50SW5kZXgoaSwgayldKSAqIHJvb3Q7CiAgICAgICAgICB4ID0gLXF1YXRbMF07CiAgICAgICAgICB5ID0gLXF1YXRbMV07CiAgICAgICAgICB6ID0gLXF1YXRbMl07CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgUXVhdGVybmlvbih4LCB5LCB6LCB3KTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnggPSB4OwogICAgICAgIHJlc3VsdC55ID0geTsKICAgICAgICByZXN1bHQueiA9IHo7CiAgICAgICAgcmVzdWx0LncgPSB3OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hIUFJRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTsKICAgICAgc2NyYXRjaEhlYWRpbmdRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTsKICAgICAgc2NyYXRjaFBpdGNoUXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7CiAgICAgIHNjcmF0Y2hSb2xsUXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7CiAgICAgIFF1YXRlcm5pb24uZnJvbUhlYWRpbmdQaXRjaFJvbGwgPSBmdW5jdGlvbihoZWFkaW5nUGl0Y2hSb2xsLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImhlYWRpbmdQaXRjaFJvbGwiLCBoZWFkaW5nUGl0Y2hSb2xsKTsKICAgICAgICBzY3JhdGNoUm9sbFF1YXRlcm5pb24gPSBRdWF0ZXJuaW9uLmZyb21BeGlzQW5nbGUoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9YLAogICAgICAgICAgaGVhZGluZ1BpdGNoUm9sbC5yb2xsLAogICAgICAgICAgc2NyYXRjaEhQUlF1YXRlcm5pb24KICAgICAgICApOwogICAgICAgIHNjcmF0Y2hQaXRjaFF1YXRlcm5pb24gPSBRdWF0ZXJuaW9uLmZyb21BeGlzQW5nbGUoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9ZLAogICAgICAgICAgLWhlYWRpbmdQaXRjaFJvbGwucGl0Y2gsCiAgICAgICAgICByZXN1bHQKICAgICAgICApOwogICAgICAgIHJlc3VsdCA9IFF1YXRlcm5pb24ubXVsdGlwbHkoCiAgICAgICAgICBzY3JhdGNoUGl0Y2hRdWF0ZXJuaW9uLAogICAgICAgICAgc2NyYXRjaFJvbGxRdWF0ZXJuaW9uLAogICAgICAgICAgc2NyYXRjaFBpdGNoUXVhdGVybmlvbgogICAgICAgICk7CiAgICAgICAgc2NyYXRjaEhlYWRpbmdRdWF0ZXJuaW9uID0gUXVhdGVybmlvbi5mcm9tQXhpc0FuZ2xlKAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LlVOSVRfWiwKICAgICAgICAgIC1oZWFkaW5nUGl0Y2hSb2xsLmhlYWRpbmcsCiAgICAgICAgICBzY3JhdGNoSFBSUXVhdGVybmlvbgogICAgICAgICk7CiAgICAgICAgcmV0dXJuIFF1YXRlcm5pb24ubXVsdGlwbHkoc2NyYXRjaEhlYWRpbmdRdWF0ZXJuaW9uLCByZXN1bHQsIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIHNhbXBsZWRRdWF0ZXJuaW9uQXhpcyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2FtcGxlZFF1YXRlcm5pb25Sb3RhdGlvbiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2FtcGxlZFF1YXRlcm5pb25UZW1wUXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7CiAgICAgIHNhbXBsZWRRdWF0ZXJuaW9uUXVhdGVybmlvbjAgPSBuZXcgUXVhdGVybmlvbigpOwogICAgICBzYW1wbGVkUXVhdGVybmlvblF1YXRlcm5pb24wQ29uanVnYXRlID0gbmV3IFF1YXRlcm5pb24oKTsKICAgICAgUXVhdGVybmlvbi5wYWNrZWRMZW5ndGggPSA0OwogICAgICBRdWF0ZXJuaW9uLnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUueDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUueTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuejsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4XSA9IHZhbHVlLnc7CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9OwogICAgICBRdWF0ZXJuaW9uLnVucGFjayA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydGluZ0luZGV4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IFF1YXRlcm5pb24oKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnggPSBhcnJheVtzdGFydGluZ0luZGV4XTsKICAgICAgICByZXN1bHQueSA9IGFycmF5W3N0YXJ0aW5nSW5kZXggKyAxXTsKICAgICAgICByZXN1bHQueiA9IGFycmF5W3N0YXJ0aW5nSW5kZXggKyAyXTsKICAgICAgICByZXN1bHQudyA9IGFycmF5W3N0YXJ0aW5nSW5kZXggKyAzXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBRdWF0ZXJuaW9uLnBhY2tlZEludGVycG9sYXRpb25MZW5ndGggPSAzOwogICAgICBRdWF0ZXJuaW9uLmNvbnZlcnRQYWNrZWRBcnJheUZvckludGVycG9sYXRpb24gPSBmdW5jdGlvbihwYWNrZWRBcnJheSwgc3RhcnRpbmdJbmRleCwgbGFzdEluZGV4LCByZXN1bHQpIHsKICAgICAgICBRdWF0ZXJuaW9uLnVucGFjaygKICAgICAgICAgIHBhY2tlZEFycmF5LAogICAgICAgICAgbGFzdEluZGV4ICogNCwKICAgICAgICAgIHNhbXBsZWRRdWF0ZXJuaW9uUXVhdGVybmlvbjBDb25qdWdhdGUKICAgICAgICApOwogICAgICAgIFF1YXRlcm5pb24uY29uanVnYXRlKAogICAgICAgICAgc2FtcGxlZFF1YXRlcm5pb25RdWF0ZXJuaW9uMENvbmp1Z2F0ZSwKICAgICAgICAgIHNhbXBsZWRRdWF0ZXJuaW9uUXVhdGVybmlvbjBDb25qdWdhdGUKICAgICAgICApOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBsYXN0SW5kZXggLSBzdGFydGluZ0luZGV4ICsgMTsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICBjb25zdCBvZmZzZXQgPSBpICogMzsKICAgICAgICAgIFF1YXRlcm5pb24udW5wYWNrKAogICAgICAgICAgICBwYWNrZWRBcnJheSwKICAgICAgICAgICAgKHN0YXJ0aW5nSW5kZXggKyBpKSAqIDQsCiAgICAgICAgICAgIHNhbXBsZWRRdWF0ZXJuaW9uVGVtcFF1YXRlcm5pb24KICAgICAgICAgICk7CiAgICAgICAgICBRdWF0ZXJuaW9uLm11bHRpcGx5KAogICAgICAgICAgICBzYW1wbGVkUXVhdGVybmlvblRlbXBRdWF0ZXJuaW9uLAogICAgICAgICAgICBzYW1wbGVkUXVhdGVybmlvblF1YXRlcm5pb24wQ29uanVnYXRlLAogICAgICAgICAgICBzYW1wbGVkUXVhdGVybmlvblRlbXBRdWF0ZXJuaW9uCiAgICAgICAgICApOwogICAgICAgICAgaWYgKHNhbXBsZWRRdWF0ZXJuaW9uVGVtcFF1YXRlcm5pb24udyA8IDApIHsKICAgICAgICAgICAgUXVhdGVybmlvbi5uZWdhdGUoCiAgICAgICAgICAgICAgc2FtcGxlZFF1YXRlcm5pb25UZW1wUXVhdGVybmlvbiwKICAgICAgICAgICAgICBzYW1wbGVkUXVhdGVybmlvblRlbXBRdWF0ZXJuaW9uCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgICBRdWF0ZXJuaW9uLmNvbXB1dGVBeGlzKAogICAgICAgICAgICBzYW1wbGVkUXVhdGVybmlvblRlbXBRdWF0ZXJuaW9uLAogICAgICAgICAgICBzYW1wbGVkUXVhdGVybmlvbkF4aXMKICAgICAgICAgICk7CiAgICAgICAgICBjb25zdCBhbmdsZSA9IFF1YXRlcm5pb24uY29tcHV0ZUFuZ2xlKHNhbXBsZWRRdWF0ZXJuaW9uVGVtcFF1YXRlcm5pb24pOwogICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgICByZXN1bHQgPSBbXTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdFtvZmZzZXRdID0gc2FtcGxlZFF1YXRlcm5pb25BeGlzLnggKiBhbmdsZTsKICAgICAgICAgIHJlc3VsdFtvZmZzZXQgKyAxXSA9IHNhbXBsZWRRdWF0ZXJuaW9uQXhpcy55ICogYW5nbGU7CiAgICAgICAgICByZXN1bHRbb2Zmc2V0ICsgMl0gPSBzYW1wbGVkUXVhdGVybmlvbkF4aXMueiAqIGFuZ2xlOwogICAgICAgIH0KICAgICAgfTsKICAgICAgUXVhdGVybmlvbi51bnBhY2tJbnRlcnBvbGF0aW9uUmVzdWx0ID0gZnVuY3Rpb24oYXJyYXksIHNvdXJjZUFycmF5LCBmaXJzdEluZGV4LCBsYXN0SW5kZXgsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBRdWF0ZXJuaW9uKCk7CiAgICAgICAgfQogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoYXJyYXksIDAsIHNhbXBsZWRRdWF0ZXJuaW9uUm90YXRpb24pOwogICAgICAgIGNvbnN0IG1hZ25pdHVkZSA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUoc2FtcGxlZFF1YXRlcm5pb25Sb3RhdGlvbik7CiAgICAgICAgUXVhdGVybmlvbi51bnBhY2soc291cmNlQXJyYXksIGxhc3RJbmRleCAqIDQsIHNhbXBsZWRRdWF0ZXJuaW9uUXVhdGVybmlvbjApOwogICAgICAgIGlmIChtYWduaXR1ZGUgPT09IDApIHsKICAgICAgICAgIFF1YXRlcm5pb24uY2xvbmUoUXVhdGVybmlvbi5JREVOVElUWSwgc2FtcGxlZFF1YXRlcm5pb25UZW1wUXVhdGVybmlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIFF1YXRlcm5pb24uZnJvbUF4aXNBbmdsZSgKICAgICAgICAgICAgc2FtcGxlZFF1YXRlcm5pb25Sb3RhdGlvbiwKICAgICAgICAgICAgbWFnbml0dWRlLAogICAgICAgICAgICBzYW1wbGVkUXVhdGVybmlvblRlbXBRdWF0ZXJuaW9uCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gUXVhdGVybmlvbi5tdWx0aXBseSgKICAgICAgICAgIHNhbXBsZWRRdWF0ZXJuaW9uVGVtcFF1YXRlcm5pb24sCiAgICAgICAgICBzYW1wbGVkUXVhdGVybmlvblF1YXRlcm5pb24wLAogICAgICAgICAgcmVzdWx0CiAgICAgICAgKTsKICAgICAgfTsKICAgICAgUXVhdGVybmlvbi5jbG9uZSA9IGZ1bmN0aW9uKHF1YXRlcm5pb24sIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHF1YXRlcm5pb24pKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFF1YXRlcm5pb24oCiAgICAgICAgICAgIHF1YXRlcm5pb24ueCwKICAgICAgICAgICAgcXVhdGVybmlvbi55LAogICAgICAgICAgICBxdWF0ZXJuaW9uLnosCiAgICAgICAgICAgIHF1YXRlcm5pb24udwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnggPSBxdWF0ZXJuaW9uLng7CiAgICAgICAgcmVzdWx0LnkgPSBxdWF0ZXJuaW9uLnk7CiAgICAgICAgcmVzdWx0LnogPSBxdWF0ZXJuaW9uLno7CiAgICAgICAgcmVzdWx0LncgPSBxdWF0ZXJuaW9uLnc7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgUXVhdGVybmlvbi5jb25qdWdhdGUgPSBmdW5jdGlvbihxdWF0ZXJuaW9uLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInF1YXRlcm5pb24iLCBxdWF0ZXJuaW9uKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSAtcXVhdGVybmlvbi54OwogICAgICAgIHJlc3VsdC55ID0gLXF1YXRlcm5pb24ueTsKICAgICAgICByZXN1bHQueiA9IC1xdWF0ZXJuaW9uLno7CiAgICAgICAgcmVzdWx0LncgPSBxdWF0ZXJuaW9uLnc7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgUXVhdGVybmlvbi5tYWduaXR1ZGVTcXVhcmVkID0gZnVuY3Rpb24ocXVhdGVybmlvbikgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicXVhdGVybmlvbiIsIHF1YXRlcm5pb24pOwogICAgICAgIHJldHVybiBxdWF0ZXJuaW9uLnggKiBxdWF0ZXJuaW9uLnggKyBxdWF0ZXJuaW9uLnkgKiBxdWF0ZXJuaW9uLnkgKyBxdWF0ZXJuaW9uLnogKiBxdWF0ZXJuaW9uLnogKyBxdWF0ZXJuaW9uLncgKiBxdWF0ZXJuaW9uLnc7CiAgICAgIH07CiAgICAgIFF1YXRlcm5pb24ubWFnbml0dWRlID0gZnVuY3Rpb24ocXVhdGVybmlvbikgewogICAgICAgIHJldHVybiBNYXRoLnNxcnQoUXVhdGVybmlvbi5tYWduaXR1ZGVTcXVhcmVkKHF1YXRlcm5pb24pKTsKICAgICAgfTsKICAgICAgUXVhdGVybmlvbi5ub3JtYWxpemUgPSBmdW5jdGlvbihxdWF0ZXJuaW9uLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3QgaW52ZXJzZU1hZ25pdHVkZSA9IDEgLyBRdWF0ZXJuaW9uLm1hZ25pdHVkZShxdWF0ZXJuaW9uKTsKICAgICAgICBjb25zdCB4ID0gcXVhdGVybmlvbi54ICogaW52ZXJzZU1hZ25pdHVkZTsKICAgICAgICBjb25zdCB5ID0gcXVhdGVybmlvbi55ICogaW52ZXJzZU1hZ25pdHVkZTsKICAgICAgICBjb25zdCB6ID0gcXVhdGVybmlvbi56ICogaW52ZXJzZU1hZ25pdHVkZTsKICAgICAgICBjb25zdCB3ID0gcXVhdGVybmlvbi53ICogaW52ZXJzZU1hZ25pdHVkZTsKICAgICAgICByZXN1bHQueCA9IHg7CiAgICAgICAgcmVzdWx0LnkgPSB5OwogICAgICAgIHJlc3VsdC56ID0gejsKICAgICAgICByZXN1bHQudyA9IHc7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgUXVhdGVybmlvbi5pbnZlcnNlID0gZnVuY3Rpb24ocXVhdGVybmlvbiwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IG1hZ25pdHVkZVNxdWFyZWQgPSBRdWF0ZXJuaW9uLm1hZ25pdHVkZVNxdWFyZWQocXVhdGVybmlvbik7CiAgICAgICAgcmVzdWx0ID0gUXVhdGVybmlvbi5jb25qdWdhdGUocXVhdGVybmlvbiwgcmVzdWx0KTsKICAgICAgICByZXR1cm4gUXVhdGVybmlvbi5tdWx0aXBseUJ5U2NhbGFyKHJlc3VsdCwgMSAvIG1hZ25pdHVkZVNxdWFyZWQsIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIFF1YXRlcm5pb24uYWRkID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC54ID0gbGVmdC54ICsgcmlnaHQueDsKICAgICAgICByZXN1bHQueSA9IGxlZnQueSArIHJpZ2h0Lnk7CiAgICAgICAgcmVzdWx0LnogPSBsZWZ0LnogKyByaWdodC56OwogICAgICAgIHJlc3VsdC53ID0gbGVmdC53ICsgcmlnaHQudzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBRdWF0ZXJuaW9uLnN1YnRyYWN0ID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC54ID0gbGVmdC54IC0gcmlnaHQueDsKICAgICAgICByZXN1bHQueSA9IGxlZnQueSAtIHJpZ2h0Lnk7CiAgICAgICAgcmVzdWx0LnogPSBsZWZ0LnogLSByaWdodC56OwogICAgICAgIHJlc3VsdC53ID0gbGVmdC53IC0gcmlnaHQudzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBRdWF0ZXJuaW9uLm5lZ2F0ZSA9IGZ1bmN0aW9uKHF1YXRlcm5pb24sIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicXVhdGVybmlvbiIsIHF1YXRlcm5pb24pOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IC1xdWF0ZXJuaW9uLng7CiAgICAgICAgcmVzdWx0LnkgPSAtcXVhdGVybmlvbi55OwogICAgICAgIHJlc3VsdC56ID0gLXF1YXRlcm5pb24uejsKICAgICAgICByZXN1bHQudyA9IC1xdWF0ZXJuaW9uLnc7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgUXVhdGVybmlvbi5kb3QgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgcmV0dXJuIGxlZnQueCAqIHJpZ2h0LnggKyBsZWZ0LnkgKiByaWdodC55ICsgbGVmdC56ICogcmlnaHQueiArIGxlZnQudyAqIHJpZ2h0Lnc7CiAgICAgIH07CiAgICAgIFF1YXRlcm5pb24ubXVsdGlwbHkgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3QgbGVmdFggPSBsZWZ0Lng7CiAgICAgICAgY29uc3QgbGVmdFkgPSBsZWZ0Lnk7CiAgICAgICAgY29uc3QgbGVmdFogPSBsZWZ0Lno7CiAgICAgICAgY29uc3QgbGVmdFcgPSBsZWZ0Lnc7CiAgICAgICAgY29uc3QgcmlnaHRYID0gcmlnaHQueDsKICAgICAgICBjb25zdCByaWdodFkgPSByaWdodC55OwogICAgICAgIGNvbnN0IHJpZ2h0WiA9IHJpZ2h0Lno7CiAgICAgICAgY29uc3QgcmlnaHRXID0gcmlnaHQudzsKICAgICAgICBjb25zdCB4ID0gbGVmdFcgKiByaWdodFggKyBsZWZ0WCAqIHJpZ2h0VyArIGxlZnRZICogcmlnaHRaIC0gbGVmdFogKiByaWdodFk7CiAgICAgICAgY29uc3QgeSA9IGxlZnRXICogcmlnaHRZIC0gbGVmdFggKiByaWdodFogKyBsZWZ0WSAqIHJpZ2h0VyArIGxlZnRaICogcmlnaHRYOwogICAgICAgIGNvbnN0IHogPSBsZWZ0VyAqIHJpZ2h0WiArIGxlZnRYICogcmlnaHRZIC0gbGVmdFkgKiByaWdodFggKyBsZWZ0WiAqIHJpZ2h0VzsKICAgICAgICBjb25zdCB3ID0gbGVmdFcgKiByaWdodFcgLSBsZWZ0WCAqIHJpZ2h0WCAtIGxlZnRZICogcmlnaHRZIC0gbGVmdFogKiByaWdodFo7CiAgICAgICAgcmVzdWx0LnggPSB4OwogICAgICAgIHJlc3VsdC55ID0geTsKICAgICAgICByZXN1bHQueiA9IHo7CiAgICAgICAgcmVzdWx0LncgPSB3OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFF1YXRlcm5pb24ubXVsdGlwbHlCeVNjYWxhciA9IGZ1bmN0aW9uKHF1YXRlcm5pb24sIHNjYWxhciwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJxdWF0ZXJuaW9uIiwgcXVhdGVybmlvbik7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJzY2FsYXIiLCBzY2FsYXIpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IHF1YXRlcm5pb24ueCAqIHNjYWxhcjsKICAgICAgICByZXN1bHQueSA9IHF1YXRlcm5pb24ueSAqIHNjYWxhcjsKICAgICAgICByZXN1bHQueiA9IHF1YXRlcm5pb24ueiAqIHNjYWxhcjsKICAgICAgICByZXN1bHQudyA9IHF1YXRlcm5pb24udyAqIHNjYWxhcjsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBRdWF0ZXJuaW9uLmRpdmlkZUJ5U2NhbGFyID0gZnVuY3Rpb24ocXVhdGVybmlvbiwgc2NhbGFyLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInF1YXRlcm5pb24iLCBxdWF0ZXJuaW9uKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoInNjYWxhciIsIHNjYWxhcik7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC54ID0gcXVhdGVybmlvbi54IC8gc2NhbGFyOwogICAgICAgIHJlc3VsdC55ID0gcXVhdGVybmlvbi55IC8gc2NhbGFyOwogICAgICAgIHJlc3VsdC56ID0gcXVhdGVybmlvbi56IC8gc2NhbGFyOwogICAgICAgIHJlc3VsdC53ID0gcXVhdGVybmlvbi53IC8gc2NhbGFyOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFF1YXRlcm5pb24uY29tcHV0ZUF4aXMgPSBmdW5jdGlvbihxdWF0ZXJuaW9uLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInF1YXRlcm5pb24iLCBxdWF0ZXJuaW9uKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3QgdyA9IHF1YXRlcm5pb24udzsKICAgICAgICBpZiAoTWF0aC5hYnModyAtIDEpIDwgTWF0aF9kZWZhdWx0LkVQU0lMT042IHx8IE1hdGguYWJzKHcgKyAxKSA8IE1hdGhfZGVmYXVsdC5FUFNJTE9ONikgewogICAgICAgICAgcmVzdWx0LnggPSAxOwogICAgICAgICAgcmVzdWx0LnkgPSByZXN1bHQueiA9IDA7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICBjb25zdCBzY2FsYXIgPSAxIC8gTWF0aC5zcXJ0KDEgLSB3ICogdyk7CiAgICAgICAgcmVzdWx0LnggPSBxdWF0ZXJuaW9uLnggKiBzY2FsYXI7CiAgICAgICAgcmVzdWx0LnkgPSBxdWF0ZXJuaW9uLnkgKiBzY2FsYXI7CiAgICAgICAgcmVzdWx0LnogPSBxdWF0ZXJuaW9uLnogKiBzY2FsYXI7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgUXVhdGVybmlvbi5jb21wdXRlQW5nbGUgPSBmdW5jdGlvbihxdWF0ZXJuaW9uKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJxdWF0ZXJuaW9uIiwgcXVhdGVybmlvbik7CiAgICAgICAgaWYgKE1hdGguYWJzKHF1YXRlcm5pb24udyAtIDEpIDwgTWF0aF9kZWZhdWx0LkVQU0lMT042KSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDIgKiBNYXRoLmFjb3MocXVhdGVybmlvbi53KTsKICAgICAgfTsKICAgICAgbGVycFNjcmF0Y2g0ID0gbmV3IFF1YXRlcm5pb24oKTsKICAgICAgUXVhdGVybmlvbi5sZXJwID0gZnVuY3Rpb24oc3RhcnQsIGVuZCwgdCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJzdGFydCIsIHN0YXJ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImVuZCIsIGVuZCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJ0IiwgdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGxlcnBTY3JhdGNoNCA9IFF1YXRlcm5pb24ubXVsdGlwbHlCeVNjYWxhcihlbmQsIHQsIGxlcnBTY3JhdGNoNCk7CiAgICAgICAgcmVzdWx0ID0gUXVhdGVybmlvbi5tdWx0aXBseUJ5U2NhbGFyKHN0YXJ0LCAxIC0gdCwgcmVzdWx0KTsKICAgICAgICByZXR1cm4gUXVhdGVybmlvbi5hZGQobGVycFNjcmF0Y2g0LCByZXN1bHQsIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIHNsZXJwRW5kTmVnYXRlZCA9IG5ldyBRdWF0ZXJuaW9uKCk7CiAgICAgIHNsZXJwU2NhbGVkUCA9IG5ldyBRdWF0ZXJuaW9uKCk7CiAgICAgIHNsZXJwU2NhbGVkUiA9IG5ldyBRdWF0ZXJuaW9uKCk7CiAgICAgIFF1YXRlcm5pb24uc2xlcnAgPSBmdW5jdGlvbihzdGFydCwgZW5kLCB0LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInN0YXJ0Iiwgc3RhcnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiZW5kIiwgZW5kKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoInQiLCB0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgbGV0IGRvdCA9IFF1YXRlcm5pb24uZG90KHN0YXJ0LCBlbmQpOwogICAgICAgIGxldCByID0gZW5kOwogICAgICAgIGlmIChkb3QgPCAwKSB7CiAgICAgICAgICBkb3QgPSAtZG90OwogICAgICAgICAgciA9IHNsZXJwRW5kTmVnYXRlZCA9IFF1YXRlcm5pb24ubmVnYXRlKGVuZCwgc2xlcnBFbmROZWdhdGVkKTsKICAgICAgICB9CiAgICAgICAgaWYgKDEgLSBkb3QgPCBNYXRoX2RlZmF1bHQuRVBTSUxPTjYpIHsKICAgICAgICAgIHJldHVybiBRdWF0ZXJuaW9uLmxlcnAoc3RhcnQsIHIsIHQsIHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHRoZXRhID0gTWF0aC5hY29zKGRvdCk7CiAgICAgICAgc2xlcnBTY2FsZWRQID0gUXVhdGVybmlvbi5tdWx0aXBseUJ5U2NhbGFyKAogICAgICAgICAgc3RhcnQsCiAgICAgICAgICBNYXRoLnNpbigoMSAtIHQpICogdGhldGEpLAogICAgICAgICAgc2xlcnBTY2FsZWRQCiAgICAgICAgKTsKICAgICAgICBzbGVycFNjYWxlZFIgPSBRdWF0ZXJuaW9uLm11bHRpcGx5QnlTY2FsYXIoCiAgICAgICAgICByLAogICAgICAgICAgTWF0aC5zaW4odCAqIHRoZXRhKSwKICAgICAgICAgIHNsZXJwU2NhbGVkUgogICAgICAgICk7CiAgICAgICAgcmVzdWx0ID0gUXVhdGVybmlvbi5hZGQoc2xlcnBTY2FsZWRQLCBzbGVycFNjYWxlZFIsIHJlc3VsdCk7CiAgICAgICAgcmV0dXJuIFF1YXRlcm5pb24ubXVsdGlwbHlCeVNjYWxhcihyZXN1bHQsIDEgLyBNYXRoLnNpbih0aGV0YSksIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIFF1YXRlcm5pb24ubG9nID0gZnVuY3Rpb24ocXVhdGVybmlvbiwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJxdWF0ZXJuaW9uIiwgcXVhdGVybmlvbik7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IHRoZXRhID0gTWF0aF9kZWZhdWx0LmFjb3NDbGFtcGVkKHF1YXRlcm5pb24udyk7CiAgICAgICAgbGV0IHRoZXRhT3ZlclNpblRoZXRhID0gMDsKICAgICAgICBpZiAodGhldGEgIT09IDApIHsKICAgICAgICAgIHRoZXRhT3ZlclNpblRoZXRhID0gdGhldGEgLyBNYXRoLnNpbih0aGV0YSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihxdWF0ZXJuaW9uLCB0aGV0YU92ZXJTaW5UaGV0YSwgcmVzdWx0KTsKICAgICAgfTsKICAgICAgUXVhdGVybmlvbi5leHAgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IHRoZXRhID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZShjYXJ0ZXNpYW4xMSk7CiAgICAgICAgbGV0IHNpblRoZXRhT3ZlclRoZXRhID0gMDsKICAgICAgICBpZiAodGhldGEgIT09IDApIHsKICAgICAgICAgIHNpblRoZXRhT3ZlclRoZXRhID0gTWF0aC5zaW4odGhldGEpIC8gdGhldGE7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC54ID0gY2FydGVzaWFuMTEueCAqIHNpblRoZXRhT3ZlclRoZXRhOwogICAgICAgIHJlc3VsdC55ID0gY2FydGVzaWFuMTEueSAqIHNpblRoZXRhT3ZlclRoZXRhOwogICAgICAgIHJlc3VsdC56ID0gY2FydGVzaWFuMTEueiAqIHNpblRoZXRhT3ZlclRoZXRhOwogICAgICAgIHJlc3VsdC53ID0gTWF0aC5jb3ModGhldGEpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHNxdWFkU2NyYXRjaENhcnRlc2lhbjAgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNxdWFkU2NyYXRjaENhcnRlc2lhbjEgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNxdWFkU2NyYXRjaFF1YXRlcm5pb24wID0gbmV3IFF1YXRlcm5pb24oKTsKICAgICAgc3F1YWRTY3JhdGNoUXVhdGVybmlvbjEgPSBuZXcgUXVhdGVybmlvbigpOwogICAgICBRdWF0ZXJuaW9uLmNvbXB1dGVJbm5lclF1YWRyYW5nbGUgPSBmdW5jdGlvbihxMCwgcTEyLCBxMjIsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicTAiLCBxMCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJxMSIsIHExMik7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJxMiIsIHEyMik7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IHFJbnYgPSBRdWF0ZXJuaW9uLmNvbmp1Z2F0ZShxMTIsIHNxdWFkU2NyYXRjaFF1YXRlcm5pb24wKTsKICAgICAgICBRdWF0ZXJuaW9uLm11bHRpcGx5KHFJbnYsIHEyMiwgc3F1YWRTY3JhdGNoUXVhdGVybmlvbjEpOwogICAgICAgIGNvbnN0IGNhcnQwID0gUXVhdGVybmlvbi5sb2coc3F1YWRTY3JhdGNoUXVhdGVybmlvbjEsIHNxdWFkU2NyYXRjaENhcnRlc2lhbjApOwogICAgICAgIFF1YXRlcm5pb24ubXVsdGlwbHkocUludiwgcTAsIHNxdWFkU2NyYXRjaFF1YXRlcm5pb24xKTsKICAgICAgICBjb25zdCBjYXJ0MSA9IFF1YXRlcm5pb24ubG9nKHNxdWFkU2NyYXRjaFF1YXRlcm5pb24xLCBzcXVhZFNjcmF0Y2hDYXJ0ZXNpYW4xKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGNhcnQwLCBjYXJ0MSwgY2FydDApOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKGNhcnQwLCAwLjI1LCBjYXJ0MCk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZShjYXJ0MCwgY2FydDApOwogICAgICAgIFF1YXRlcm5pb24uZXhwKGNhcnQwLCBzcXVhZFNjcmF0Y2hRdWF0ZXJuaW9uMCk7CiAgICAgICAgcmV0dXJuIFF1YXRlcm5pb24ubXVsdGlwbHkocTEyLCBzcXVhZFNjcmF0Y2hRdWF0ZXJuaW9uMCwgcmVzdWx0KTsKICAgICAgfTsKICAgICAgUXVhdGVybmlvbi5zcXVhZCA9IGZ1bmN0aW9uKHEwLCBxMTIsIHMwLCBzMSwgdCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJxMCIsIHEwKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInExIiwgcTEyKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInMwIiwgczApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiczEiLCBzMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJ0IiwgdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IHNsZXJwMCA9IFF1YXRlcm5pb24uc2xlcnAocTAsIHExMiwgdCwgc3F1YWRTY3JhdGNoUXVhdGVybmlvbjApOwogICAgICAgIGNvbnN0IHNsZXJwMSA9IFF1YXRlcm5pb24uc2xlcnAoczAsIHMxLCB0LCBzcXVhZFNjcmF0Y2hRdWF0ZXJuaW9uMSk7CiAgICAgICAgcmV0dXJuIFF1YXRlcm5pb24uc2xlcnAoc2xlcnAwLCBzbGVycDEsIDIgKiB0ICogKDEgLSB0KSwgcmVzdWx0KTsKICAgICAgfTsKICAgICAgZmFzdFNsZXJwU2NyYXRjaFF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpOwogICAgICBvcG11ID0gMS45MDExMDc0NTM1MTczMDAzOwogICAgICB1ID0gRmVhdHVyZURldGVjdGlvbl9kZWZhdWx0LnN1cHBvcnRzVHlwZWRBcnJheXMoKSA/IG5ldyBGbG9hdDMyQXJyYXkoOCkgOiBbXTsKICAgICAgdiA9IEZlYXR1cmVEZXRlY3Rpb25fZGVmYXVsdC5zdXBwb3J0c1R5cGVkQXJyYXlzKCkgPyBuZXcgRmxvYXQzMkFycmF5KDgpIDogW107CiAgICAgIGJUID0gRmVhdHVyZURldGVjdGlvbl9kZWZhdWx0LnN1cHBvcnRzVHlwZWRBcnJheXMoKSA/IG5ldyBGbG9hdDMyQXJyYXkoOCkgOiBbXTsKICAgICAgYkQgPSBGZWF0dXJlRGV0ZWN0aW9uX2RlZmF1bHQuc3VwcG9ydHNUeXBlZEFycmF5cygpID8gbmV3IEZsb2F0MzJBcnJheSg4KSA6IFtdOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDc7ICsraSkgewogICAgICAgIGNvbnN0IHMgPSBpICsgMTsKICAgICAgICBjb25zdCB0ID0gMiAqIHMgKyAxOwogICAgICAgIHVbaV0gPSAxIC8gKHMgKiB0KTsKICAgICAgICB2W2ldID0gcyAvIHQ7CiAgICAgIH0KICAgICAgdVs3XSA9IG9wbXUgLyAoOCAqIDE3KTsKICAgICAgdls3XSA9IG9wbXUgKiA4IC8gMTc7CiAgICAgIFF1YXRlcm5pb24uZmFzdFNsZXJwID0gZnVuY3Rpb24oc3RhcnQsIGVuZCwgdCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJzdGFydCIsIHN0YXJ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImVuZCIsIGVuZCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJ0IiwgdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGxldCB4ID0gUXVhdGVybmlvbi5kb3Qoc3RhcnQsIGVuZCk7CiAgICAgICAgbGV0IHNpZ24zOwogICAgICAgIGlmICh4ID49IDApIHsKICAgICAgICAgIHNpZ24zID0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2lnbjMgPSAtMTsKICAgICAgICAgIHggPSAteDsKICAgICAgICB9CiAgICAgICAgY29uc3QgeG0xID0geCAtIDE7CiAgICAgICAgY29uc3QgZCA9IDEgLSB0OwogICAgICAgIGNvbnN0IHNxclQgPSB0ICogdDsKICAgICAgICBjb25zdCBzcXJEID0gZCAqIGQ7CiAgICAgICAgZm9yIChsZXQgaSA9IDc7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICBiVFtpXSA9ICh1W2ldICogc3FyVCAtIHZbaV0pICogeG0xOwogICAgICAgICAgYkRbaV0gPSAodVtpXSAqIHNxckQgLSB2W2ldKSAqIHhtMTsKICAgICAgICB9CiAgICAgICAgY29uc3QgY1QgPSBzaWduMyAqIHQgKiAoMSArIGJUWzBdICogKDEgKyBiVFsxXSAqICgxICsgYlRbMl0gKiAoMSArIGJUWzNdICogKDEgKyBiVFs0XSAqICgxICsgYlRbNV0gKiAoMSArIGJUWzZdICogKDEgKyBiVFs3XSkpKSkpKSkpOwogICAgICAgIGNvbnN0IGNEID0gZCAqICgxICsgYkRbMF0gKiAoMSArIGJEWzFdICogKDEgKyBiRFsyXSAqICgxICsgYkRbM10gKiAoMSArIGJEWzRdICogKDEgKyBiRFs1XSAqICgxICsgYkRbNl0gKiAoMSArIGJEWzddKSkpKSkpKSk7CiAgICAgICAgY29uc3QgdGVtcCA9IFF1YXRlcm5pb24ubXVsdGlwbHlCeVNjYWxhcigKICAgICAgICAgIHN0YXJ0LAogICAgICAgICAgY0QsCiAgICAgICAgICBmYXN0U2xlcnBTY3JhdGNoUXVhdGVybmlvbgogICAgICAgICk7CiAgICAgICAgUXVhdGVybmlvbi5tdWx0aXBseUJ5U2NhbGFyKGVuZCwgY1QsIHJlc3VsdCk7CiAgICAgICAgcmV0dXJuIFF1YXRlcm5pb24uYWRkKHRlbXAsIHJlc3VsdCwgcmVzdWx0KTsKICAgICAgfTsKICAgICAgUXVhdGVybmlvbi5mYXN0U3F1YWQgPSBmdW5jdGlvbihxMCwgcTEyLCBzMCwgczEsIHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicTAiLCBxMCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJxMSIsIHExMik7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJzMCIsIHMwKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInMxIiwgczEpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigidCIsIHQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBjb25zdCBzbGVycDAgPSBRdWF0ZXJuaW9uLmZhc3RTbGVycChxMCwgcTEyLCB0LCBzcXVhZFNjcmF0Y2hRdWF0ZXJuaW9uMCk7CiAgICAgICAgY29uc3Qgc2xlcnAxID0gUXVhdGVybmlvbi5mYXN0U2xlcnAoczAsIHMxLCB0LCBzcXVhZFNjcmF0Y2hRdWF0ZXJuaW9uMSk7CiAgICAgICAgcmV0dXJuIFF1YXRlcm5pb24uZmFzdFNsZXJwKHNsZXJwMCwgc2xlcnAxLCAyICogdCAqICgxIC0gdCksIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIFF1YXRlcm5pb24uZXF1YWxzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQpIHsKICAgICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgZGVmaW5lZF9kZWZhdWx0KGxlZnQpICYmIGRlZmluZWRfZGVmYXVsdChyaWdodCkgJiYgbGVmdC54ID09PSByaWdodC54ICYmIGxlZnQueSA9PT0gcmlnaHQueSAmJiBsZWZ0LnogPT09IHJpZ2h0LnogJiYgbGVmdC53ID09PSByaWdodC53OwogICAgICB9OwogICAgICBRdWF0ZXJuaW9uLmVxdWFsc0Vwc2lsb24gPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgZXBzaWxvbikgewogICAgICAgIGVwc2lsb24gPSBlcHNpbG9uID8/IDA7CiAgICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8IGRlZmluZWRfZGVmYXVsdChsZWZ0KSAmJiBkZWZpbmVkX2RlZmF1bHQocmlnaHQpICYmIE1hdGguYWJzKGxlZnQueCAtIHJpZ2h0LngpIDw9IGVwc2lsb24gJiYgTWF0aC5hYnMobGVmdC55IC0gcmlnaHQueSkgPD0gZXBzaWxvbiAmJiBNYXRoLmFicyhsZWZ0LnogLSByaWdodC56KSA8PSBlcHNpbG9uICYmIE1hdGguYWJzKGxlZnQudyAtIHJpZ2h0LncpIDw9IGVwc2lsb247CiAgICAgIH07CiAgICAgIFF1YXRlcm5pb24uWkVSTyA9IE9iamVjdC5mcmVlemUobmV3IFF1YXRlcm5pb24oMCwgMCwgMCwgMCkpOwogICAgICBRdWF0ZXJuaW9uLklERU5USVRZID0gT2JqZWN0LmZyZWV6ZShuZXcgUXVhdGVybmlvbigwLCAwLCAwLCAxKSk7CiAgICAgIFF1YXRlcm5pb24ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIFF1YXRlcm5pb24uY2xvbmUodGhpcywgcmVzdWx0KTsKICAgICAgfTsKICAgICAgUXVhdGVybmlvbi5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24ocmlnaHQpIHsKICAgICAgICByZXR1cm4gUXVhdGVybmlvbi5lcXVhbHModGhpcywgcmlnaHQpOwogICAgICB9OwogICAgICBRdWF0ZXJuaW9uLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uID0gZnVuY3Rpb24ocmlnaHQsIGVwc2lsb24pIHsKICAgICAgICByZXR1cm4gUXVhdGVybmlvbi5lcXVhbHNFcHNpbG9uKHRoaXMsIHJpZ2h0LCBlcHNpbG9uKTsKICAgICAgfTsKICAgICAgUXVhdGVybmlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYCgke3RoaXMueH0sICR7dGhpcy55fSwgJHt0aGlzLnp9LCAke3RoaXMud30pYDsKICAgICAgfTsKICAgICAgUXVhdGVybmlvbl9kZWZhdWx0ID0gUXVhdGVybmlvbjsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1RyYW5zZm9ybXMuanMKICB2YXIgVHJhbnNmb3JtcywgdmVjdG9yUHJvZHVjdExvY2FsRnJhbWUsIGRlZ2VuZXJhdGVQb3NpdGlvbkxvY2FsRnJhbWUsIGxvY2FsRnJhbWVUb0ZpeGVkRnJhbWVDYWNoZSwgc2NyYXRjaENhbGN1bGF0ZUNhcnRlc2lhbiwgc2NyYXRjaEZpcnN0Q2FydGVzaWFuLCBzY3JhdGNoU2Vjb25kQ2FydGVzaWFuLCBzY3JhdGNoVGhpcmRDYXJ0ZXNpYW4sIHNjcmF0Y2hIUFJRdWF0ZXJuaW9uMiwgc2NyYXRjaFNjYWxlLCBzY3JhdGNoSFBSTWF0cml4NCwgc2NyYXRjaEVOVU1hdHJpeDQsIHNjcmF0Y2hIUFJNYXRyaXgzLCBub1NjYWxlLCBocHJDZW50ZXJTY3JhdGNoLCBmZlNjcmF0Y2gsIGhwclRyYW5zZm9ybVNjcmF0Y2gsIGhwclJvdGF0aW9uU2NyYXRjaCwgaHByUXVhdGVybmlvblNjcmF0Y2gsIGdtc3RDb25zdGFudDAsIGdtc3RDb25zdGFudDEsIGdtc3RDb25zdGFudDIsIGdtc3RDb25zdGFudDMsIHJhdGVDb2VmLCB3Z3M4NFdSUHJlY2Vzc2luZywgdHdvUGlPdmVyU2Vjb25kc0luRGF5LCBkYXRlSW5VdGMsIHR0TWludXNUYWksIGoyMDAwdHREYXlzLCBUZHRNaW51c1RhaSwgSjIwMDBkLCBzY3JhdGNoSHByLCBzY3JhdGNoUm90YXRpb25NYXRyaXgsIGRhdGVTY3JhdGNoLCB4eXNTY3JhdGNoLCBlb3BTY3JhdGNoLCByb3RhdGlvbjFTY3JhdGNoLCByb3RhdGlvbjJTY3JhdGNoLCBwb2ludFRvV2luZG93Q29vcmRpbmF0ZXNUZW1wLCBub3JtYWxTY3JhdGNoLCByaWdodFNjcmF0Y2gsIHVwU2NyYXRjaCwgc3dpenpsZU1hdHJpeCwgc2NyYXRjaENhcnRvZ3JhcGhpYywgc2NyYXRjaENhcnRlc2lhbjNQcm9qZWN0aW9uLCBzY3JhdGNoQ2VudGVyLCBzY3JhdGNoUm90YXRpb24sIHNjcmF0Y2hGcm9tRU5VLCBzY3JhdGNoVG9FTlUsIFRyYW5zZm9ybXNfZGVmYXVsdDsKICB2YXIgaW5pdF9UcmFuc2Zvcm1zID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9UcmFuc2Zvcm1zLmpzIigpIHsKICAgICAgaW5pdF9DYXJ0ZXNpYW4yKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRlc2lhbjQoKTsKICAgICAgaW5pdF9DYXJ0b2dyYXBoaWMoKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X0VhcnRoT3JpZW50YXRpb25QYXJhbWV0ZXJzKCk7CiAgICAgIGluaXRfRWFydGhPcmllbnRhdGlvblBhcmFtZXRlcnNTYW1wbGUoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9IZWFkaW5nUGl0Y2hSb2xsKCk7CiAgICAgIGluaXRfSWF1MjAwNlh5c0RhdGEoKTsKICAgICAgaW5pdF9JYXUyMDA2WHlzU2FtcGxlKCk7CiAgICAgIGluaXRfSnVsaWFuRGF0ZSgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9NYXRyaXgzKCk7CiAgICAgIGluaXRfTWF0cml4NCgpOwogICAgICBpbml0X1F1YXRlcm5pb24oKTsKICAgICAgaW5pdF9UaW1lQ29uc3RhbnRzKCk7CiAgICAgIFRyYW5zZm9ybXMgPSB7fTsKICAgICAgdmVjdG9yUHJvZHVjdExvY2FsRnJhbWUgPSB7CiAgICAgICAgdXA6IHsKICAgICAgICAgIHNvdXRoOiAiZWFzdCIsCiAgICAgICAgICBub3J0aDogIndlc3QiLAogICAgICAgICAgd2VzdDogInNvdXRoIiwKICAgICAgICAgIGVhc3Q6ICJub3J0aCIKICAgICAgICB9LAogICAgICAgIGRvd246IHsKICAgICAgICAgIHNvdXRoOiAid2VzdCIsCiAgICAgICAgICBub3J0aDogImVhc3QiLAogICAgICAgICAgd2VzdDogIm5vcnRoIiwKICAgICAgICAgIGVhc3Q6ICJzb3V0aCIKICAgICAgICB9LAogICAgICAgIHNvdXRoOiB7CiAgICAgICAgICB1cDogIndlc3QiLAogICAgICAgICAgZG93bjogImVhc3QiLAogICAgICAgICAgd2VzdDogImRvd24iLAogICAgICAgICAgZWFzdDogInVwIgogICAgICAgIH0sCiAgICAgICAgbm9ydGg6IHsKICAgICAgICAgIHVwOiAiZWFzdCIsCiAgICAgICAgICBkb3duOiAid2VzdCIsCiAgICAgICAgICB3ZXN0OiAidXAiLAogICAgICAgICAgZWFzdDogImRvd24iCiAgICAgICAgfSwKICAgICAgICB3ZXN0OiB7CiAgICAgICAgICB1cDogIm5vcnRoIiwKICAgICAgICAgIGRvd246ICJzb3V0aCIsCiAgICAgICAgICBub3J0aDogImRvd24iLAogICAgICAgICAgc291dGg6ICJ1cCIKICAgICAgICB9LAogICAgICAgIGVhc3Q6IHsKICAgICAgICAgIHVwOiAic291dGgiLAogICAgICAgICAgZG93bjogIm5vcnRoIiwKICAgICAgICAgIG5vcnRoOiAidXAiLAogICAgICAgICAgc291dGg6ICJkb3duIgogICAgICAgIH0KICAgICAgfTsKICAgICAgZGVnZW5lcmF0ZVBvc2l0aW9uTG9jYWxGcmFtZSA9IHsKICAgICAgICBub3J0aDogWy0xLCAwLCAwXSwKICAgICAgICBlYXN0OiBbMCwgMSwgMF0sCiAgICAgICAgdXA6IFswLCAwLCAxXSwKICAgICAgICBzb3V0aDogWzEsIDAsIDBdLAogICAgICAgIHdlc3Q6IFswLCAtMSwgMF0sCiAgICAgICAgZG93bjogWzAsIDAsIC0xXQogICAgICB9OwogICAgICBsb2NhbEZyYW1lVG9GaXhlZEZyYW1lQ2FjaGUgPSB7fTsKICAgICAgc2NyYXRjaENhbGN1bGF0ZUNhcnRlc2lhbiA9IHsKICAgICAgICBlYXN0OiBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCksCiAgICAgICAgbm9ydGg6IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKSwKICAgICAgICB1cDogbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpLAogICAgICAgIHdlc3Q6IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKSwKICAgICAgICBzb3V0aDogbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpLAogICAgICAgIGRvd246IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKQogICAgICB9OwogICAgICBzY3JhdGNoRmlyc3RDYXJ0ZXNpYW4gPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hTZWNvbmRDYXJ0ZXNpYW4gPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hUaGlyZENhcnRlc2lhbiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgVHJhbnNmb3Jtcy5sb2NhbEZyYW1lVG9GaXhlZEZyYW1lR2VuZXJhdG9yID0gZnVuY3Rpb24oZmlyc3RBeGlzLCBzZWNvbmRBeGlzKSB7CiAgICAgICAgaWYgKCF2ZWN0b3JQcm9kdWN0TG9jYWxGcmFtZS5oYXNPd25Qcm9wZXJ0eShmaXJzdEF4aXMpIHx8ICF2ZWN0b3JQcm9kdWN0TG9jYWxGcmFtZVtmaXJzdEF4aXNdLmhhc093blByb3BlcnR5KHNlY29uZEF4aXMpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgImZpcnN0QXhpcyBhbmQgc2Vjb25kQXhpcyBtdXN0IGJlIGVhc3QsIG5vcnRoLCB1cCwgd2VzdCwgc291dGggb3IgZG93bi4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCB0aGlyZEF4aXMgPSB2ZWN0b3JQcm9kdWN0TG9jYWxGcmFtZVtmaXJzdEF4aXNdW3NlY29uZEF4aXNdOwogICAgICAgIGxldCByZXN1bHRhdDsKICAgICAgICBjb25zdCBoYXNoQXhpcyA9IGZpcnN0QXhpcyArIHNlY29uZEF4aXM7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChsb2NhbEZyYW1lVG9GaXhlZEZyYW1lQ2FjaGVbaGFzaEF4aXNdKSkgewogICAgICAgICAgcmVzdWx0YXQgPSBsb2NhbEZyYW1lVG9GaXhlZEZyYW1lQ2FjaGVbaGFzaEF4aXNdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHRhdCA9IGZ1bmN0aW9uKG9yaWdpbiwgZWxsaXBzb2lkLCByZXN1bHQpIHsKICAgICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQob3JpZ2luKSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJvcmlnaW4gaXMgcmVxdWlyZWQuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzTmFOKG9yaWdpbi54KSB8fCBpc05hTihvcmlnaW4ueSkgfHwgaXNOYU4ob3JpZ2luLnopKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm9yaWdpbiBoYXMgYSBOYU4gY29tcG9uZW50Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBNYXRyaXg0X2RlZmF1bHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24ob3JpZ2luLCBDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTywgTWF0aF9kZWZhdWx0LkVQU0lMT04xNCkpIHsKICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKAogICAgICAgICAgICAgICAgZGVnZW5lcmF0ZVBvc2l0aW9uTG9jYWxGcmFtZVtmaXJzdEF4aXNdLAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIHNjcmF0Y2hGaXJzdENhcnRlc2lhbgogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjaygKICAgICAgICAgICAgICAgIGRlZ2VuZXJhdGVQb3NpdGlvbkxvY2FsRnJhbWVbc2Vjb25kQXhpc10sCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgc2NyYXRjaFNlY29uZENhcnRlc2lhbgogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjaygKICAgICAgICAgICAgICAgIGRlZ2VuZXJhdGVQb3NpdGlvbkxvY2FsRnJhbWVbdGhpcmRBeGlzXSwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICBzY3JhdGNoVGhpcmRDYXJ0ZXNpYW4KICAgICAgICAgICAgICApOwogICAgICAgICAgICB9IGVsc2UgaWYgKE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKG9yaWdpbi54LCAwLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjE0KSAmJiBNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbihvcmlnaW4ueSwgMCwgTWF0aF9kZWZhdWx0LkVQU0lMT04xNCkpIHsKICAgICAgICAgICAgICBjb25zdCBzaWduMyA9IE1hdGhfZGVmYXVsdC5zaWduKG9yaWdpbi56KTsKICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKAogICAgICAgICAgICAgICAgZGVnZW5lcmF0ZVBvc2l0aW9uTG9jYWxGcmFtZVtmaXJzdEF4aXNdLAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIHNjcmF0Y2hGaXJzdENhcnRlc2lhbgogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgaWYgKGZpcnN0QXhpcyAhPT0gImVhc3QiICYmIGZpcnN0QXhpcyAhPT0gIndlc3QiKSB7CiAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcigKICAgICAgICAgICAgICAgICAgc2NyYXRjaEZpcnN0Q2FydGVzaWFuLAogICAgICAgICAgICAgICAgICBzaWduMywKICAgICAgICAgICAgICAgICAgc2NyYXRjaEZpcnN0Q2FydGVzaWFuCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKAogICAgICAgICAgICAgICAgZGVnZW5lcmF0ZVBvc2l0aW9uTG9jYWxGcmFtZVtzZWNvbmRBeGlzXSwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICBzY3JhdGNoU2Vjb25kQ2FydGVzaWFuCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICBpZiAoc2Vjb25kQXhpcyAhPT0gImVhc3QiICYmIHNlY29uZEF4aXMgIT09ICJ3ZXN0IikgewogICAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoCiAgICAgICAgICAgICAgICAgIHNjcmF0Y2hTZWNvbmRDYXJ0ZXNpYW4sCiAgICAgICAgICAgICAgICAgIHNpZ24zLAogICAgICAgICAgICAgICAgICBzY3JhdGNoU2Vjb25kQ2FydGVzaWFuCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKAogICAgICAgICAgICAgICAgZGVnZW5lcmF0ZVBvc2l0aW9uTG9jYWxGcmFtZVt0aGlyZEF4aXNdLAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIHNjcmF0Y2hUaGlyZENhcnRlc2lhbgogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgaWYgKHRoaXJkQXhpcyAhPT0gImVhc3QiICYmIHRoaXJkQXhpcyAhPT0gIndlc3QiKSB7CiAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcigKICAgICAgICAgICAgICAgICAgc2NyYXRjaFRoaXJkQ2FydGVzaWFuLAogICAgICAgICAgICAgICAgICBzaWduMywKICAgICAgICAgICAgICAgICAgc2NyYXRjaFRoaXJkQ2FydGVzaWFuCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBlbGxpcHNvaWQgPSBlbGxpcHNvaWQgPz8gRWxsaXBzb2lkX2RlZmF1bHQuZGVmYXVsdDsKICAgICAgICAgICAgICBlbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKG9yaWdpbiwgc2NyYXRjaENhbGN1bGF0ZUNhcnRlc2lhbi51cCk7CiAgICAgICAgICAgICAgY29uc3QgdXAgPSBzY3JhdGNoQ2FsY3VsYXRlQ2FydGVzaWFuLnVwOwogICAgICAgICAgICAgIGNvbnN0IGVhc3QgPSBzY3JhdGNoQ2FsY3VsYXRlQ2FydGVzaWFuLmVhc3Q7CiAgICAgICAgICAgICAgZWFzdC54ID0gLW9yaWdpbi55OwogICAgICAgICAgICAgIGVhc3QueSA9IG9yaWdpbi54OwogICAgICAgICAgICAgIGVhc3QueiA9IDA7CiAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShlYXN0LCBzY3JhdGNoQ2FsY3VsYXRlQ2FydGVzaWFuLmVhc3QpOwogICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyh1cCwgZWFzdCwgc2NyYXRjaENhbGN1bGF0ZUNhcnRlc2lhbi5ub3J0aCk7CiAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoCiAgICAgICAgICAgICAgICBzY3JhdGNoQ2FsY3VsYXRlQ2FydGVzaWFuLnVwLAogICAgICAgICAgICAgICAgLTEsCiAgICAgICAgICAgICAgICBzY3JhdGNoQ2FsY3VsYXRlQ2FydGVzaWFuLmRvd24KICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKAogICAgICAgICAgICAgICAgc2NyYXRjaENhbGN1bGF0ZUNhcnRlc2lhbi5lYXN0LAogICAgICAgICAgICAgICAgLTEsCiAgICAgICAgICAgICAgICBzY3JhdGNoQ2FsY3VsYXRlQ2FydGVzaWFuLndlc3QKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKAogICAgICAgICAgICAgICAgc2NyYXRjaENhbGN1bGF0ZUNhcnRlc2lhbi5ub3J0aCwKICAgICAgICAgICAgICAgIC0xLAogICAgICAgICAgICAgICAgc2NyYXRjaENhbGN1bGF0ZUNhcnRlc2lhbi5zb3V0aAogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgc2NyYXRjaEZpcnN0Q2FydGVzaWFuID0gc2NyYXRjaENhbGN1bGF0ZUNhcnRlc2lhbltmaXJzdEF4aXNdOwogICAgICAgICAgICAgIHNjcmF0Y2hTZWNvbmRDYXJ0ZXNpYW4gPSBzY3JhdGNoQ2FsY3VsYXRlQ2FydGVzaWFuW3NlY29uZEF4aXNdOwogICAgICAgICAgICAgIHNjcmF0Y2hUaGlyZENhcnRlc2lhbiA9IHNjcmF0Y2hDYWxjdWxhdGVDYXJ0ZXNpYW5bdGhpcmRBeGlzXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHRbMF0gPSBzY3JhdGNoRmlyc3RDYXJ0ZXNpYW4ueDsKICAgICAgICAgICAgcmVzdWx0WzFdID0gc2NyYXRjaEZpcnN0Q2FydGVzaWFuLnk7CiAgICAgICAgICAgIHJlc3VsdFsyXSA9IHNjcmF0Y2hGaXJzdENhcnRlc2lhbi56OwogICAgICAgICAgICByZXN1bHRbM10gPSAwOwogICAgICAgICAgICByZXN1bHRbNF0gPSBzY3JhdGNoU2Vjb25kQ2FydGVzaWFuLng7CiAgICAgICAgICAgIHJlc3VsdFs1XSA9IHNjcmF0Y2hTZWNvbmRDYXJ0ZXNpYW4ueTsKICAgICAgICAgICAgcmVzdWx0WzZdID0gc2NyYXRjaFNlY29uZENhcnRlc2lhbi56OwogICAgICAgICAgICByZXN1bHRbN10gPSAwOwogICAgICAgICAgICByZXN1bHRbOF0gPSBzY3JhdGNoVGhpcmRDYXJ0ZXNpYW4ueDsKICAgICAgICAgICAgcmVzdWx0WzldID0gc2NyYXRjaFRoaXJkQ2FydGVzaWFuLnk7CiAgICAgICAgICAgIHJlc3VsdFsxMF0gPSBzY3JhdGNoVGhpcmRDYXJ0ZXNpYW4uejsKICAgICAgICAgICAgcmVzdWx0WzExXSA9IDA7CiAgICAgICAgICAgIHJlc3VsdFsxMl0gPSBvcmlnaW4ueDsKICAgICAgICAgICAgcmVzdWx0WzEzXSA9IG9yaWdpbi55OwogICAgICAgICAgICByZXN1bHRbMTRdID0gb3JpZ2luLno7CiAgICAgICAgICAgIHJlc3VsdFsxNV0gPSAxOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgfTsKICAgICAgICAgIGxvY2FsRnJhbWVUb0ZpeGVkRnJhbWVDYWNoZVtoYXNoQXhpc10gPSByZXN1bHRhdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdGF0OwogICAgICB9OwogICAgICBUcmFuc2Zvcm1zLmVhc3ROb3J0aFVwVG9GaXhlZEZyYW1lID0gVHJhbnNmb3Jtcy5sb2NhbEZyYW1lVG9GaXhlZEZyYW1lR2VuZXJhdG9yKAogICAgICAgICJlYXN0IiwKICAgICAgICAibm9ydGgiCiAgICAgICk7CiAgICAgIFRyYW5zZm9ybXMubm9ydGhFYXN0RG93blRvRml4ZWRGcmFtZSA9IFRyYW5zZm9ybXMubG9jYWxGcmFtZVRvRml4ZWRGcmFtZUdlbmVyYXRvcigibm9ydGgiLCAiZWFzdCIpOwogICAgICBUcmFuc2Zvcm1zLm5vcnRoVXBFYXN0VG9GaXhlZEZyYW1lID0gVHJhbnNmb3Jtcy5sb2NhbEZyYW1lVG9GaXhlZEZyYW1lR2VuZXJhdG9yKAogICAgICAgICJub3J0aCIsCiAgICAgICAgInVwIgogICAgICApOwogICAgICBUcmFuc2Zvcm1zLm5vcnRoV2VzdFVwVG9GaXhlZEZyYW1lID0gVHJhbnNmb3Jtcy5sb2NhbEZyYW1lVG9GaXhlZEZyYW1lR2VuZXJhdG9yKAogICAgICAgICJub3J0aCIsCiAgICAgICAgIndlc3QiCiAgICAgICk7CiAgICAgIHNjcmF0Y2hIUFJRdWF0ZXJuaW9uMiA9IG5ldyBRdWF0ZXJuaW9uX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFNjYWxlID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgxLCAxLCAxKTsKICAgICAgc2NyYXRjaEhQUk1hdHJpeDQgPSBuZXcgTWF0cml4NF9kZWZhdWx0KCk7CiAgICAgIFRyYW5zZm9ybXMuaGVhZGluZ1BpdGNoUm9sbFRvRml4ZWRGcmFtZSA9IGZ1bmN0aW9uKG9yaWdpbiwgaGVhZGluZ1BpdGNoUm9sbCwgZWxsaXBzb2lkLCBmaXhlZEZyYW1lVHJhbnNmb3JtLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIkhlYWRpbmdQaXRjaFJvbGwiLCBoZWFkaW5nUGl0Y2hSb2xsKTsKICAgICAgICBmaXhlZEZyYW1lVHJhbnNmb3JtID0gZml4ZWRGcmFtZVRyYW5zZm9ybSA/PyBUcmFuc2Zvcm1zLmVhc3ROb3J0aFVwVG9GaXhlZEZyYW1lOwogICAgICAgIGNvbnN0IGhwclF1YXRlcm5pb24gPSBRdWF0ZXJuaW9uX2RlZmF1bHQuZnJvbUhlYWRpbmdQaXRjaFJvbGwoCiAgICAgICAgICBoZWFkaW5nUGl0Y2hSb2xsLAogICAgICAgICAgc2NyYXRjaEhQUlF1YXRlcm5pb24yCiAgICAgICAgKTsKICAgICAgICBjb25zdCBocHJNYXRyaXggPSBNYXRyaXg0X2RlZmF1bHQuZnJvbVRyYW5zbGF0aW9uUXVhdGVybmlvblJvdGF0aW9uU2NhbGUoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTywKICAgICAgICAgIGhwclF1YXRlcm5pb24sCiAgICAgICAgICBzY3JhdGNoU2NhbGUsCiAgICAgICAgICBzY3JhdGNoSFBSTWF0cml4NAogICAgICAgICk7CiAgICAgICAgcmVzdWx0ID0gZml4ZWRGcmFtZVRyYW5zZm9ybShvcmlnaW4sIGVsbGlwc29pZCwgcmVzdWx0KTsKICAgICAgICByZXR1cm4gTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5KHJlc3VsdCwgaHByTWF0cml4LCByZXN1bHQpOwogICAgICB9OwogICAgICBzY3JhdGNoRU5VTWF0cml4NCA9IG5ldyBNYXRyaXg0X2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaEhQUk1hdHJpeDMgPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgIFRyYW5zZm9ybXMuaGVhZGluZ1BpdGNoUm9sbFF1YXRlcm5pb24gPSBmdW5jdGlvbihvcmlnaW4sIGhlYWRpbmdQaXRjaFJvbGwsIGVsbGlwc29pZCwgZml4ZWRGcmFtZVRyYW5zZm9ybSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJIZWFkaW5nUGl0Y2hSb2xsIiwgaGVhZGluZ1BpdGNoUm9sbCk7CiAgICAgICAgY29uc3QgdHJhbnNmb3JtMiA9IFRyYW5zZm9ybXMuaGVhZGluZ1BpdGNoUm9sbFRvRml4ZWRGcmFtZSgKICAgICAgICAgIG9yaWdpbiwKICAgICAgICAgIGhlYWRpbmdQaXRjaFJvbGwsCiAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICBmaXhlZEZyYW1lVHJhbnNmb3JtLAogICAgICAgICAgc2NyYXRjaEVOVU1hdHJpeDQKICAgICAgICApOwogICAgICAgIGNvbnN0IHJvdGF0aW9uID0gTWF0cml4NF9kZWZhdWx0LmdldE1hdHJpeDModHJhbnNmb3JtMiwgc2NyYXRjaEhQUk1hdHJpeDMpOwogICAgICAgIHJldHVybiBRdWF0ZXJuaW9uX2RlZmF1bHQuZnJvbVJvdGF0aW9uTWF0cml4KHJvdGF0aW9uLCByZXN1bHQpOwogICAgICB9OwogICAgICBub1NjYWxlID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgxLCAxLCAxKTsKICAgICAgaHByQ2VudGVyU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgZmZTY3JhdGNoID0gbmV3IE1hdHJpeDRfZGVmYXVsdCgpOwogICAgICBocHJUcmFuc2Zvcm1TY3JhdGNoID0gbmV3IE1hdHJpeDRfZGVmYXVsdCgpOwogICAgICBocHJSb3RhdGlvblNjcmF0Y2ggPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgIGhwclF1YXRlcm5pb25TY3JhdGNoID0gbmV3IFF1YXRlcm5pb25fZGVmYXVsdCgpOwogICAgICBUcmFuc2Zvcm1zLmZpeGVkRnJhbWVUb0hlYWRpbmdQaXRjaFJvbGwgPSBmdW5jdGlvbih0cmFuc2Zvcm0yLCBlbGxpcHNvaWQsIGZpeGVkRnJhbWVUcmFuc2Zvcm0sIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgidHJhbnNmb3JtIiwgdHJhbnNmb3JtMik7CiAgICAgICAgZWxsaXBzb2lkID0gZWxsaXBzb2lkID8/IEVsbGlwc29pZF9kZWZhdWx0LmRlZmF1bHQ7CiAgICAgICAgZml4ZWRGcmFtZVRyYW5zZm9ybSA9IGZpeGVkRnJhbWVUcmFuc2Zvcm0gPz8gVHJhbnNmb3Jtcy5lYXN0Tm9ydGhVcFRvRml4ZWRGcmFtZTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgSGVhZGluZ1BpdGNoUm9sbF9kZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNlbnRlciA9IE1hdHJpeDRfZGVmYXVsdC5nZXRUcmFuc2xhdGlvbih0cmFuc2Zvcm0yLCBocHJDZW50ZXJTY3JhdGNoKTsKICAgICAgICBpZiAoQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFscyhjZW50ZXIsIENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPKSkgewogICAgICAgICAgcmVzdWx0LmhlYWRpbmcgPSAwOwogICAgICAgICAgcmVzdWx0LnBpdGNoID0gMDsKICAgICAgICAgIHJlc3VsdC5yb2xsID0gMDsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGxldCB0b0ZpeGVkRnJhbWUgPSBNYXRyaXg0X2RlZmF1bHQuaW52ZXJzZVRyYW5zZm9ybWF0aW9uKAogICAgICAgICAgZml4ZWRGcmFtZVRyYW5zZm9ybShjZW50ZXIsIGVsbGlwc29pZCwgZmZTY3JhdGNoKSwKICAgICAgICAgIGZmU2NyYXRjaAogICAgICAgICk7CiAgICAgICAgbGV0IHRyYW5zZm9ybUNvcHkgPSBNYXRyaXg0X2RlZmF1bHQuc2V0U2NhbGUodHJhbnNmb3JtMiwgbm9TY2FsZSwgaHByVHJhbnNmb3JtU2NyYXRjaCk7CiAgICAgICAgdHJhbnNmb3JtQ29weSA9IE1hdHJpeDRfZGVmYXVsdC5zZXRUcmFuc2xhdGlvbigKICAgICAgICAgIHRyYW5zZm9ybUNvcHksCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTywKICAgICAgICAgIHRyYW5zZm9ybUNvcHkKICAgICAgICApOwogICAgICAgIHRvRml4ZWRGcmFtZSA9IE1hdHJpeDRfZGVmYXVsdC5tdWx0aXBseSh0b0ZpeGVkRnJhbWUsIHRyYW5zZm9ybUNvcHksIHRvRml4ZWRGcmFtZSk7CiAgICAgICAgbGV0IHF1YXRlcm5pb25Sb3RhdGlvbiA9IFF1YXRlcm5pb25fZGVmYXVsdC5mcm9tUm90YXRpb25NYXRyaXgoCiAgICAgICAgICBNYXRyaXg0X2RlZmF1bHQuZ2V0TWF0cml4Myh0b0ZpeGVkRnJhbWUsIGhwclJvdGF0aW9uU2NyYXRjaCksCiAgICAgICAgICBocHJRdWF0ZXJuaW9uU2NyYXRjaAogICAgICAgICk7CiAgICAgICAgcXVhdGVybmlvblJvdGF0aW9uID0gUXVhdGVybmlvbl9kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgICAgIHF1YXRlcm5pb25Sb3RhdGlvbiwKICAgICAgICAgIHF1YXRlcm5pb25Sb3RhdGlvbgogICAgICAgICk7CiAgICAgICAgcmV0dXJuIEhlYWRpbmdQaXRjaFJvbGxfZGVmYXVsdC5mcm9tUXVhdGVybmlvbihxdWF0ZXJuaW9uUm90YXRpb24sIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIGdtc3RDb25zdGFudDAgPSA2ICogMzYwMCArIDQxICogNjAgKyA1MC41NDg0MTsKICAgICAgZ21zdENvbnN0YW50MSA9IDg2NDAxODQ4MTI4NjZlLTY7CiAgICAgIGdtc3RDb25zdGFudDIgPSAwLjA5MzEwNDsKICAgICAgZ21zdENvbnN0YW50MyA9IC02MmUtNzsKICAgICAgcmF0ZUNvZWYgPSAxMTc3Mjc1ODM4NDY2OGUtMzI7CiAgICAgIHdnczg0V1JQcmVjZXNzaW5nID0gNzI5MjExNTg1NTNlLTE1OwogICAgICB0d29QaU92ZXJTZWNvbmRzSW5EYXkgPSBNYXRoX2RlZmF1bHQuVFdPX1BJIC8gODY0MDA7CiAgICAgIGRhdGVJblV0YyA9IG5ldyBKdWxpYW5EYXRlX2RlZmF1bHQoKTsKICAgICAgVHJhbnNmb3Jtcy5jb21wdXRlSWNyZlRvQ2VudHJhbEJvZHlGaXhlZE1hdHJpeCA9IGZ1bmN0aW9uKGRhdGUsIHJlc3VsdCkgewogICAgICAgIGxldCB0cmFuc2Zvcm1NYXRyaXggPSBUcmFuc2Zvcm1zLmNvbXB1dGVJY3JmVG9GaXhlZE1hdHJpeChkYXRlLCByZXN1bHQpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHRyYW5zZm9ybU1hdHJpeCkpIHsKICAgICAgICAgIHRyYW5zZm9ybU1hdHJpeCA9IFRyYW5zZm9ybXMuY29tcHV0ZVRlbWVUb1BzZXVkb0ZpeGVkTWF0cml4KGRhdGUsIHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cmFuc2Zvcm1NYXRyaXg7CiAgICAgIH07CiAgICAgIFRyYW5zZm9ybXMuY29tcHV0ZVRlbWVUb1BzZXVkb0ZpeGVkTWF0cml4ID0gZnVuY3Rpb24oZGF0ZSwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZGF0ZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJkYXRlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBkYXRlSW5VdGMgPSBKdWxpYW5EYXRlX2RlZmF1bHQuYWRkU2Vjb25kcygKICAgICAgICAgIGRhdGUsCiAgICAgICAgICAtSnVsaWFuRGF0ZV9kZWZhdWx0LmNvbXB1dGVUYWlNaW51c1V0YyhkYXRlKSwKICAgICAgICAgIGRhdGVJblV0YwogICAgICAgICk7CiAgICAgICAgY29uc3QgdXRjRGF5TnVtYmVyID0gZGF0ZUluVXRjLmRheU51bWJlcjsKICAgICAgICBjb25zdCB1dGNTZWNvbmRzSW50b0RheSA9IGRhdGVJblV0Yy5zZWNvbmRzT2ZEYXk7CiAgICAgICAgbGV0IHQ7CiAgICAgICAgY29uc3QgZGlmZkRheXMgPSB1dGNEYXlOdW1iZXIgLSAyNDUxNTQ1OwogICAgICAgIGlmICh1dGNTZWNvbmRzSW50b0RheSA+PSA0MzIwMCkgewogICAgICAgICAgdCA9IChkaWZmRGF5cyArIDAuNSkgLyBUaW1lQ29uc3RhbnRzX2RlZmF1bHQuREFZU19QRVJfSlVMSUFOX0NFTlRVUlk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHQgPSAoZGlmZkRheXMgLSAwLjUpIC8gVGltZUNvbnN0YW50c19kZWZhdWx0LkRBWVNfUEVSX0pVTElBTl9DRU5UVVJZOwogICAgICAgIH0KICAgICAgICBjb25zdCBnbXN0MCA9IGdtc3RDb25zdGFudDAgKyB0ICogKGdtc3RDb25zdGFudDEgKyB0ICogKGdtc3RDb25zdGFudDIgKyB0ICogZ21zdENvbnN0YW50MykpOwogICAgICAgIGNvbnN0IGFuZ2xlID0gZ21zdDAgKiB0d29QaU92ZXJTZWNvbmRzSW5EYXkgJSBNYXRoX2RlZmF1bHQuVFdPX1BJOwogICAgICAgIGNvbnN0IHJhdGlvID0gd2dzODRXUlByZWNlc3NpbmcgKyByYXRlQ29lZiAqICh1dGNEYXlOdW1iZXIgLSAyNDUxNTQ1NWUtMSk7CiAgICAgICAgY29uc3Qgc2Vjb25kc1NpbmNlTWlkbmlnaHQgPSAodXRjU2Vjb25kc0ludG9EYXkgKyBUaW1lQ29uc3RhbnRzX2RlZmF1bHQuU0VDT05EU19QRVJfREFZICogMC41KSAlIFRpbWVDb25zdGFudHNfZGVmYXVsdC5TRUNPTkRTX1BFUl9EQVk7CiAgICAgICAgY29uc3QgZ2hhID0gYW5nbGUgKyByYXRpbyAqIHNlY29uZHNTaW5jZU1pZG5pZ2h0OwogICAgICAgIGNvbnN0IGNvc0doYSA9IE1hdGguY29zKGdoYSk7CiAgICAgICAgY29uc3Qgc2luR2hhID0gTWF0aC5zaW4oZ2hhKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IE1hdHJpeDNfZGVmYXVsdCgKICAgICAgICAgICAgY29zR2hhLAogICAgICAgICAgICBzaW5HaGEsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIC1zaW5HaGEsCiAgICAgICAgICAgIGNvc0doYSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0WzBdID0gY29zR2hhOwogICAgICAgIHJlc3VsdFsxXSA9IC1zaW5HaGE7CiAgICAgICAgcmVzdWx0WzJdID0gMDsKICAgICAgICByZXN1bHRbM10gPSBzaW5HaGE7CiAgICAgICAgcmVzdWx0WzRdID0gY29zR2hhOwogICAgICAgIHJlc3VsdFs1XSA9IDA7CiAgICAgICAgcmVzdWx0WzZdID0gMDsKICAgICAgICByZXN1bHRbN10gPSAwOwogICAgICAgIHJlc3VsdFs4XSA9IDE7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgVHJhbnNmb3Jtcy5pYXUyMDA2WHlzRGF0YSA9IG5ldyBJYXUyMDA2WHlzRGF0YV9kZWZhdWx0KCk7CiAgICAgIFRyYW5zZm9ybXMuZWFydGhPcmllbnRhdGlvblBhcmFtZXRlcnMgPSBFYXJ0aE9yaWVudGF0aW9uUGFyYW1ldGVyc19kZWZhdWx0Lk5PTkU7CiAgICAgIHR0TWludXNUYWkgPSAzMi4xODQ7CiAgICAgIGoyMDAwdHREYXlzID0gMjQ1MTU0NTsKICAgICAgVHJhbnNmb3Jtcy5wcmVsb2FkSWNyZkZpeGVkID0gZnVuY3Rpb24odGltZUludGVydmFsKSB7CiAgICAgICAgY29uc3Qgc3RhcnREYXlUVCA9IHRpbWVJbnRlcnZhbC5zdGFydC5kYXlOdW1iZXI7CiAgICAgICAgY29uc3Qgc3RhcnRTZWNvbmRUVCA9IHRpbWVJbnRlcnZhbC5zdGFydC5zZWNvbmRzT2ZEYXkgKyB0dE1pbnVzVGFpOwogICAgICAgIGNvbnN0IHN0b3BEYXlUVCA9IHRpbWVJbnRlcnZhbC5zdG9wLmRheU51bWJlcjsKICAgICAgICBjb25zdCBzdG9wU2Vjb25kVFQgPSB0aW1lSW50ZXJ2YWwuc3RvcC5zZWNvbmRzT2ZEYXkgKyB0dE1pbnVzVGFpOwogICAgICAgIHJldHVybiBUcmFuc2Zvcm1zLmlhdTIwMDZYeXNEYXRhLnByZWxvYWQoCiAgICAgICAgICBzdGFydERheVRULAogICAgICAgICAgc3RhcnRTZWNvbmRUVCwKICAgICAgICAgIHN0b3BEYXlUVCwKICAgICAgICAgIHN0b3BTZWNvbmRUVAogICAgICAgICk7CiAgICAgIH07CiAgICAgIFRyYW5zZm9ybXMuY29tcHV0ZUljcmZUb0ZpeGVkTWF0cml4ID0gZnVuY3Rpb24oZGF0ZSwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZGF0ZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJkYXRlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGZpeGVkVG9JY3JmTXR4ID0gVHJhbnNmb3Jtcy5jb21wdXRlRml4ZWRUb0ljcmZNYXRyaXgoZGF0ZSwgcmVzdWx0KTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChmaXhlZFRvSWNyZk10eCkpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBNYXRyaXgzX2RlZmF1bHQudHJhbnNwb3NlKGZpeGVkVG9JY3JmTXR4LCByZXN1bHQpOwogICAgICB9OwogICAgICBUZHRNaW51c1RhaSA9IDMyLjE4NDsKICAgICAgSjIwMDBkID0gMjQ1MTU0NTsKICAgICAgc2NyYXRjaEhwciA9IG5ldyBIZWFkaW5nUGl0Y2hSb2xsX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFJvdGF0aW9uTWF0cml4ID0gbmV3IE1hdHJpeDNfZGVmYXVsdCgpOwogICAgICBkYXRlU2NyYXRjaCA9IG5ldyBKdWxpYW5EYXRlX2RlZmF1bHQoKTsKICAgICAgVHJhbnNmb3Jtcy5jb21wdXRlTW9vbkZpeGVkVG9JY3JmTWF0cml4ID0gZnVuY3Rpb24oZGF0ZSwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZGF0ZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJkYXRlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHNlY29uZHNUVCA9IEp1bGlhbkRhdGVfZGVmYXVsdC5hZGRTZWNvbmRzKGRhdGUsIFRkdE1pbnVzVGFpLCBkYXRlU2NyYXRjaCk7CiAgICAgICAgY29uc3QgZCA9IEp1bGlhbkRhdGVfZGVmYXVsdC50b3RhbERheXMoc2Vjb25kc1RUKSAtIEoyMDAwZDsKICAgICAgICBjb25zdCBlMSA9IE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoMTIuMTEyKSAtIE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoMC4wNTI5OTIpICogZDsKICAgICAgICBjb25zdCBlMiA9IE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoMjQuMjI0KSAtIE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoMC4xMDU5ODQpICogZDsKICAgICAgICBjb25zdCBlMyA9IE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoMjI3LjY0NSkgKyBNYXRoX2RlZmF1bHQudG9SYWRpYW5zKDEzLjAxMikgKiBkOwogICAgICAgIGNvbnN0IGU0ID0gTWF0aF9kZWZhdWx0LnRvUmFkaWFucygyNjEuMTA1KSArIE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoMTMuMzQwNzE2KSAqIGQ7CiAgICAgICAgY29uc3QgZTUgPSBNYXRoX2RlZmF1bHQudG9SYWRpYW5zKDM1OCkgKyBNYXRoX2RlZmF1bHQudG9SYWRpYW5zKDAuOTg1NikgKiBkOwogICAgICAgIHNjcmF0Y2hIcHIucGl0Y2ggPSBNYXRoX2RlZmF1bHQudG9SYWRpYW5zKDI3MCAtIDkwKSAtIE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoMy44NzgpICogTWF0aC5zaW4oZTEpIC0gTWF0aF9kZWZhdWx0LnRvUmFkaWFucygwLjEyKSAqIE1hdGguc2luKGUyKSArIE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoMC4wNykgKiBNYXRoLnNpbihlMykgLSBNYXRoX2RlZmF1bHQudG9SYWRpYW5zKDAuMDE3KSAqIE1hdGguc2luKGU0KTsKICAgICAgICBzY3JhdGNoSHByLnJvbGwgPSBNYXRoX2RlZmF1bHQudG9SYWRpYW5zKDY2LjUzIC0gOTApICsgTWF0aF9kZWZhdWx0LnRvUmFkaWFucygxLjU0MykgKiBNYXRoLmNvcyhlMSkgKyBNYXRoX2RlZmF1bHQudG9SYWRpYW5zKDAuMjQpICogTWF0aC5jb3MoZTIpIC0gTWF0aF9kZWZhdWx0LnRvUmFkaWFucygwLjAyOCkgKiBNYXRoLmNvcyhlMykgKyBNYXRoX2RlZmF1bHQudG9SYWRpYW5zKDdlLTMpICogTWF0aC5jb3MoZTQpOwogICAgICAgIHNjcmF0Y2hIcHIuaGVhZGluZyA9IE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoMjQ0LjM3NSAtIDkwKSArIE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoMTMuMTc2MzU4MzEpICogZCArIE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoMy41NTgpICogTWF0aC5zaW4oZTEpICsgTWF0aF9kZWZhdWx0LnRvUmFkaWFucygwLjEyMSkgKiBNYXRoLnNpbihlMikgLSBNYXRoX2RlZmF1bHQudG9SYWRpYW5zKDAuMDY0KSAqIE1hdGguc2luKGUzKSArIE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoMC4wMTYpICogTWF0aC5zaW4oZTQpICsgTWF0aF9kZWZhdWx0LnRvUmFkaWFucygwLjAyNSkgKiBNYXRoLnNpbihlNSk7CiAgICAgICAgcmV0dXJuIE1hdHJpeDNfZGVmYXVsdC5mcm9tSGVhZGluZ1BpdGNoUm9sbChzY3JhdGNoSHByLCBzY3JhdGNoUm90YXRpb25NYXRyaXgpOwogICAgICB9OwogICAgICBUcmFuc2Zvcm1zLmNvbXB1dGVJY3JmVG9Nb29uRml4ZWRNYXRyaXggPSBmdW5jdGlvbihkYXRlLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChkYXRlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImRhdGUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBNYXRyaXgzX2RlZmF1bHQoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZml4ZWRUb0ljcmZNdHggPSBUcmFuc2Zvcm1zLmNvbXB1dGVNb29uRml4ZWRUb0ljcmZNYXRyaXgoZGF0ZSwgcmVzdWx0KTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChmaXhlZFRvSWNyZk10eCkpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBNYXRyaXgzX2RlZmF1bHQudHJhbnNwb3NlKGZpeGVkVG9JY3JmTXR4LCByZXN1bHQpOwogICAgICB9OwogICAgICB4eXNTY3JhdGNoID0gbmV3IElhdTIwMDZYeXNTYW1wbGVfZGVmYXVsdCgwLCAwLCAwKTsKICAgICAgZW9wU2NyYXRjaCA9IG5ldyBFYXJ0aE9yaWVudGF0aW9uUGFyYW1ldGVyc1NhbXBsZV9kZWZhdWx0KAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwCiAgICAgICk7CiAgICAgIHJvdGF0aW9uMVNjcmF0Y2ggPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgIHJvdGF0aW9uMlNjcmF0Y2ggPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgIFRyYW5zZm9ybXMuY29tcHV0ZUZpeGVkVG9JY3JmTWF0cml4ID0gZnVuY3Rpb24oZGF0ZSwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZGF0ZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJkYXRlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVvcCA9IFRyYW5zZm9ybXMuZWFydGhPcmllbnRhdGlvblBhcmFtZXRlcnMuY29tcHV0ZShkYXRlLCBlb3BTY3JhdGNoKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChlb3ApKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBjb25zdCBkYXlUVCA9IGRhdGUuZGF5TnVtYmVyOwogICAgICAgIGNvbnN0IHNlY29uZFRUID0gZGF0ZS5zZWNvbmRzT2ZEYXkgKyB0dE1pbnVzVGFpOwogICAgICAgIGNvbnN0IHh5cyA9IFRyYW5zZm9ybXMuaWF1MjAwNlh5c0RhdGEuY29tcHV0ZVh5c1JhZGlhbnMoCiAgICAgICAgICBkYXlUVCwKICAgICAgICAgIHNlY29uZFRULAogICAgICAgICAgeHlzU2NyYXRjaAogICAgICAgICk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoeHlzKSkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgY29uc3QgeCA9IHh5cy54ICsgZW9wLnhQb2xlT2Zmc2V0OwogICAgICAgIGNvbnN0IHkgPSB4eXMueSArIGVvcC55UG9sZU9mZnNldDsKICAgICAgICBjb25zdCBhMyA9IDEgLyAoMSArIE1hdGguc3FydCgxIC0geCAqIHggLSB5ICogeSkpOwogICAgICAgIGNvbnN0IHJvdGF0aW9uMSA9IHJvdGF0aW9uMVNjcmF0Y2g7CiAgICAgICAgcm90YXRpb24xWzBdID0gMSAtIGEzICogeCAqIHg7CiAgICAgICAgcm90YXRpb24xWzNdID0gLWEzICogeCAqIHk7CiAgICAgICAgcm90YXRpb24xWzZdID0geDsKICAgICAgICByb3RhdGlvbjFbMV0gPSAtYTMgKiB4ICogeTsKICAgICAgICByb3RhdGlvbjFbNF0gPSAxIC0gYTMgKiB5ICogeTsKICAgICAgICByb3RhdGlvbjFbN10gPSB5OwogICAgICAgIHJvdGF0aW9uMVsyXSA9IC14OwogICAgICAgIHJvdGF0aW9uMVs1XSA9IC15OwogICAgICAgIHJvdGF0aW9uMVs4XSA9IDEgLSBhMyAqICh4ICogeCArIHkgKiB5KTsKICAgICAgICBjb25zdCByb3RhdGlvbjIgPSBNYXRyaXgzX2RlZmF1bHQuZnJvbVJvdGF0aW9uWigteHlzLnMsIHJvdGF0aW9uMlNjcmF0Y2gpOwogICAgICAgIGNvbnN0IG1hdHJpeFEgPSBNYXRyaXgzX2RlZmF1bHQubXVsdGlwbHkocm90YXRpb24xLCByb3RhdGlvbjIsIHJvdGF0aW9uMVNjcmF0Y2gpOwogICAgICAgIGNvbnN0IGRhdGVVdDFkYXkgPSBkYXRlLmRheU51bWJlcjsKICAgICAgICBjb25zdCBkYXRlVXQxc2VjID0gZGF0ZS5zZWNvbmRzT2ZEYXkgLSBKdWxpYW5EYXRlX2RlZmF1bHQuY29tcHV0ZVRhaU1pbnVzVXRjKGRhdGUpICsgZW9wLnV0MU1pbnVzVXRjOwogICAgICAgIGNvbnN0IGRheXNTaW5jZUoyMDAwID0gZGF0ZVV0MWRheSAtIDI0NTE1NDU7CiAgICAgICAgY29uc3QgZnJhY3Rpb25PZkRheSA9IGRhdGVVdDFzZWMgLyBUaW1lQ29uc3RhbnRzX2RlZmF1bHQuU0VDT05EU19QRVJfREFZOwogICAgICAgIGxldCBlcmEgPSAwLjc3OTA1NzI3MzI2NCArIGZyYWN0aW9uT2ZEYXkgKyAwLjAwMjczNzgxMTkxMTM1NDQ4ICogKGRheXNTaW5jZUoyMDAwICsgZnJhY3Rpb25PZkRheSk7CiAgICAgICAgZXJhID0gZXJhICUgMSAqIE1hdGhfZGVmYXVsdC5UV09fUEk7CiAgICAgICAgY29uc3QgZWFydGhSb3RhdGlvbiA9IE1hdHJpeDNfZGVmYXVsdC5mcm9tUm90YXRpb25aKGVyYSwgcm90YXRpb24yU2NyYXRjaCk7CiAgICAgICAgY29uc3QgcGZUb0ljcmYgPSBNYXRyaXgzX2RlZmF1bHQubXVsdGlwbHkobWF0cml4USwgZWFydGhSb3RhdGlvbiwgcm90YXRpb24xU2NyYXRjaCk7CiAgICAgICAgY29uc3QgY29zeHAgPSBNYXRoLmNvcyhlb3AueFBvbGVXYW5kZXIpOwogICAgICAgIGNvbnN0IGNvc3lwID0gTWF0aC5jb3MoZW9wLnlQb2xlV2FuZGVyKTsKICAgICAgICBjb25zdCBzaW54cCA9IE1hdGguc2luKGVvcC54UG9sZVdhbmRlcik7CiAgICAgICAgY29uc3Qgc2lueXAgPSBNYXRoLnNpbihlb3AueVBvbGVXYW5kZXIpOwogICAgICAgIGxldCB0dHQgPSBkYXlUVCAtIGoyMDAwdHREYXlzICsgc2Vjb25kVFQgLyBUaW1lQ29uc3RhbnRzX2RlZmF1bHQuU0VDT05EU19QRVJfREFZOwogICAgICAgIHR0dCAvPSAzNjUyNTsKICAgICAgICBjb25zdCBzcCA9IC00N2UtNiAqIHR0dCAqIE1hdGhfZGVmYXVsdC5SQURJQU5TX1BFUl9ERUdSRUUgLyAzNjAwOwogICAgICAgIGNvbnN0IGNvc3NwID0gTWF0aC5jb3Moc3ApOwogICAgICAgIGNvbnN0IHNpbnNwID0gTWF0aC5zaW4oc3ApOwogICAgICAgIGNvbnN0IGZUb1BmTXR4ID0gcm90YXRpb24yU2NyYXRjaDsKICAgICAgICBmVG9QZk10eFswXSA9IGNvc3hwICogY29zc3A7CiAgICAgICAgZlRvUGZNdHhbMV0gPSBjb3N4cCAqIHNpbnNwOwogICAgICAgIGZUb1BmTXR4WzJdID0gc2lueHA7CiAgICAgICAgZlRvUGZNdHhbM10gPSAtY29zeXAgKiBzaW5zcCArIHNpbnlwICogc2lueHAgKiBjb3NzcDsKICAgICAgICBmVG9QZk10eFs0XSA9IGNvc3lwICogY29zc3AgKyBzaW55cCAqIHNpbnhwICogc2luc3A7CiAgICAgICAgZlRvUGZNdHhbNV0gPSAtc2lueXAgKiBjb3N4cDsKICAgICAgICBmVG9QZk10eFs2XSA9IC1zaW55cCAqIHNpbnNwIC0gY29zeXAgKiBzaW54cCAqIGNvc3NwOwogICAgICAgIGZUb1BmTXR4WzddID0gc2lueXAgKiBjb3NzcCAtIGNvc3lwICogc2lueHAgKiBzaW5zcDsKICAgICAgICBmVG9QZk10eFs4XSA9IGNvc3lwICogY29zeHA7CiAgICAgICAgcmV0dXJuIE1hdHJpeDNfZGVmYXVsdC5tdWx0aXBseShwZlRvSWNyZiwgZlRvUGZNdHgsIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIHBvaW50VG9XaW5kb3dDb29yZGluYXRlc1RlbXAgPSBuZXcgQ2FydGVzaWFuNF9kZWZhdWx0KCk7CiAgICAgIFRyYW5zZm9ybXMucG9pbnRUb1dpbmRvd0Nvb3JkaW5hdGVzID0gZnVuY3Rpb24obW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCwgdmlld3BvcnRUcmFuc2Zvcm1hdGlvbiwgcG9pbnQsIHJlc3VsdCkgewogICAgICAgIHJlc3VsdCA9IFRyYW5zZm9ybXMucG9pbnRUb0dMV2luZG93Q29vcmRpbmF0ZXMoCiAgICAgICAgICBtb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4LAogICAgICAgICAgdmlld3BvcnRUcmFuc2Zvcm1hdGlvbiwKICAgICAgICAgIHBvaW50LAogICAgICAgICAgcmVzdWx0CiAgICAgICAgKTsKICAgICAgICByZXN1bHQueSA9IDIgKiB2aWV3cG9ydFRyYW5zZm9ybWF0aW9uWzVdIC0gcmVzdWx0Lnk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgVHJhbnNmb3Jtcy5wb2ludFRvR0xXaW5kb3dDb29yZGluYXRlcyA9IGZ1bmN0aW9uKG1vZGVsVmlld1Byb2plY3Rpb25NYXRyaXgsIHZpZXdwb3J0VHJhbnNmb3JtYXRpb24sIHBvaW50LCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChtb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm1vZGVsVmlld1Byb2plY3Rpb25NYXRyaXggaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHZpZXdwb3J0VHJhbnNmb3JtYXRpb24pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgidmlld3BvcnRUcmFuc2Zvcm1hdGlvbiBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocG9pbnQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgicG9pbnQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdG1wMiA9IHBvaW50VG9XaW5kb3dDb29yZGluYXRlc1RlbXA7CiAgICAgICAgTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5QnlWZWN0b3IoCiAgICAgICAgICBtb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4LAogICAgICAgICAgQ2FydGVzaWFuNF9kZWZhdWx0LmZyb21FbGVtZW50cyhwb2ludC54LCBwb2ludC55LCBwb2ludC56LCAxLCB0bXAyKSwKICAgICAgICAgIHRtcDIKICAgICAgICApOwogICAgICAgIENhcnRlc2lhbjRfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKHRtcDIsIDEgLyB0bXAyLncsIHRtcDIpOwogICAgICAgIE1hdHJpeDRfZGVmYXVsdC5tdWx0aXBseUJ5VmVjdG9yKHZpZXdwb3J0VHJhbnNmb3JtYXRpb24sIHRtcDIsIHRtcDIpOwogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4yX2RlZmF1bHQuZnJvbUNhcnRlc2lhbjQodG1wMiwgcmVzdWx0KTsKICAgICAgfTsKICAgICAgbm9ybWFsU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgcmlnaHRTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICB1cFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIFRyYW5zZm9ybXMucm90YXRpb25NYXRyaXhGcm9tUG9zaXRpb25WZWxvY2l0eSA9IGZ1bmN0aW9uKHBvc2l0aW9uLCB2ZWxvY2l0eSwgZWxsaXBzb2lkLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwb3NpdGlvbikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJwb3NpdGlvbiBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodmVsb2NpdHkpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgidmVsb2NpdHkgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG5vcm1hbDIgPSAoZWxsaXBzb2lkID8/IEVsbGlwc29pZF9kZWZhdWx0LmRlZmF1bHQpLmdlb2RldGljU3VyZmFjZU5vcm1hbCgKICAgICAgICAgIHBvc2l0aW9uLAogICAgICAgICAgbm9ybWFsU2NyYXRjaAogICAgICAgICk7CiAgICAgICAgbGV0IHJpZ2h0ID0gQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKHZlbG9jaXR5LCBub3JtYWwyLCByaWdodFNjcmF0Y2gpOwogICAgICAgIGlmIChDYXJ0ZXNpYW4zX2RlZmF1bHQuZXF1YWxzRXBzaWxvbihyaWdodCwgQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8sIE1hdGhfZGVmYXVsdC5FUFNJTE9ONikpIHsKICAgICAgICAgIHJpZ2h0ID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKENhcnRlc2lhbjNfZGVmYXVsdC5VTklUX1gsIHJpZ2h0KTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdXAgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3MocmlnaHQsIHZlbG9jaXR5LCB1cFNjcmF0Y2gpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUodXAsIHVwKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3ModmVsb2NpdHksIHVwLCByaWdodCk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZShyaWdodCwgcmlnaHQpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUocmlnaHQsIHJpZ2h0KTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdFswXSA9IHZlbG9jaXR5Lng7CiAgICAgICAgcmVzdWx0WzFdID0gdmVsb2NpdHkueTsKICAgICAgICByZXN1bHRbMl0gPSB2ZWxvY2l0eS56OwogICAgICAgIHJlc3VsdFszXSA9IHJpZ2h0Lng7CiAgICAgICAgcmVzdWx0WzRdID0gcmlnaHQueTsKICAgICAgICByZXN1bHRbNV0gPSByaWdodC56OwogICAgICAgIHJlc3VsdFs2XSA9IHVwLng7CiAgICAgICAgcmVzdWx0WzddID0gdXAueTsKICAgICAgICByZXN1bHRbOF0gPSB1cC56OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHN3aXp6bGVNYXRyaXggPSBuZXcgTWF0cml4NF9kZWZhdWx0KAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAxLAogICAgICAgIDAsCiAgICAgICAgMSwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDEsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDEKICAgICAgKTsKICAgICAgc2NyYXRjaENhcnRvZ3JhcGhpYyA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydGVzaWFuM1Byb2plY3Rpb24gPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDZW50ZXIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hSb3RhdGlvbiA9IG5ldyBNYXRyaXgzX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaEZyb21FTlUgPSBuZXcgTWF0cml4NF9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hUb0VOVSA9IG5ldyBNYXRyaXg0X2RlZmF1bHQoKTsKICAgICAgVHJhbnNmb3Jtcy5iYXNpc1RvMkQgPSBmdW5jdGlvbihwcm9qZWN0aW9uLCBtYXRyaXgsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHByb2plY3Rpb24pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgicHJvamVjdGlvbiBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobWF0cml4KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm1hdHJpeCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInJlc3VsdCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcnRjQ2VudGVyID0gTWF0cml4NF9kZWZhdWx0LmdldFRyYW5zbGF0aW9uKG1hdHJpeCwgc2NyYXRjaENlbnRlcik7CiAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gcHJvamVjdGlvbi5lbGxpcHNvaWQ7CiAgICAgICAgbGV0IHByb2plY3RlZFBvc2l0aW9uOwogICAgICAgIGlmIChDYXJ0ZXNpYW4zX2RlZmF1bHQuZXF1YWxzKHJ0Y0NlbnRlciwgQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8pKSB7CiAgICAgICAgICBwcm9qZWN0ZWRQb3NpdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZSgKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8sCiAgICAgICAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zUHJvamVjdGlvbgogICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgY2FydG9ncmFwaGljMiA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYygKICAgICAgICAgICAgcnRjQ2VudGVyLAogICAgICAgICAgICBzY3JhdGNoQ2FydG9ncmFwaGljCiAgICAgICAgICApOwogICAgICAgICAgcHJvamVjdGVkUG9zaXRpb24gPSBwcm9qZWN0aW9uLnByb2plY3QoCiAgICAgICAgICAgIGNhcnRvZ3JhcGhpYzIsCiAgICAgICAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zUHJvamVjdGlvbgogICAgICAgICAgKTsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tRWxlbWVudHMoCiAgICAgICAgICAgIHByb2plY3RlZFBvc2l0aW9uLnosCiAgICAgICAgICAgIHByb2plY3RlZFBvc2l0aW9uLngsCiAgICAgICAgICAgIHByb2plY3RlZFBvc2l0aW9uLnksCiAgICAgICAgICAgIHByb2plY3RlZFBvc2l0aW9uCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCBmcm9tRU5VID0gVHJhbnNmb3Jtcy5lYXN0Tm9ydGhVcFRvRml4ZWRGcmFtZSgKICAgICAgICAgIHJ0Y0NlbnRlciwKICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgIHNjcmF0Y2hGcm9tRU5VCiAgICAgICAgKTsKICAgICAgICBjb25zdCB0b0VOVSA9IE1hdHJpeDRfZGVmYXVsdC5pbnZlcnNlVHJhbnNmb3JtYXRpb24oZnJvbUVOVSwgc2NyYXRjaFRvRU5VKTsKICAgICAgICBjb25zdCByb3RhdGlvbiA9IE1hdHJpeDRfZGVmYXVsdC5nZXRNYXRyaXgzKG1hdHJpeCwgc2NyYXRjaFJvdGF0aW9uKTsKICAgICAgICBjb25zdCBsb2NhbCA9IE1hdHJpeDRfZGVmYXVsdC5tdWx0aXBseUJ5TWF0cml4Myh0b0VOVSwgcm90YXRpb24sIHJlc3VsdCk7CiAgICAgICAgTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5KHN3aXp6bGVNYXRyaXgsIGxvY2FsLCByZXN1bHQpOwogICAgICAgIE1hdHJpeDRfZGVmYXVsdC5zZXRUcmFuc2xhdGlvbihyZXN1bHQsIHByb2plY3RlZFBvc2l0aW9uLCByZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFRyYW5zZm9ybXMuZWxsaXBzb2lkVG8yRE1vZGVsTWF0cml4ID0gZnVuY3Rpb24ocHJvamVjdGlvbiwgY2VudGVyLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwcm9qZWN0aW9uKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInByb2plY3Rpb24gaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGNlbnRlcikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJjZW50ZXIgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJyZXN1bHQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVsbGlwc29pZCA9IHByb2plY3Rpb24uZWxsaXBzb2lkOwogICAgICAgIGNvbnN0IGZyb21FTlUgPSBUcmFuc2Zvcm1zLmVhc3ROb3J0aFVwVG9GaXhlZEZyYW1lKAogICAgICAgICAgY2VudGVyLAogICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgc2NyYXRjaEZyb21FTlUKICAgICAgICApOwogICAgICAgIGNvbnN0IHRvRU5VID0gTWF0cml4NF9kZWZhdWx0LmludmVyc2VUcmFuc2Zvcm1hdGlvbihmcm9tRU5VLCBzY3JhdGNoVG9FTlUpOwogICAgICAgIGNvbnN0IGNhcnRvZ3JhcGhpYzIgPSBlbGxpcHNvaWQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoCiAgICAgICAgICBjZW50ZXIsCiAgICAgICAgICBzY3JhdGNoQ2FydG9ncmFwaGljCiAgICAgICAgKTsKICAgICAgICBjb25zdCBwcm9qZWN0ZWRQb3NpdGlvbiA9IHByb2plY3Rpb24ucHJvamVjdCgKICAgICAgICAgIGNhcnRvZ3JhcGhpYzIsCiAgICAgICAgICBzY3JhdGNoQ2FydGVzaWFuM1Byb2plY3Rpb24KICAgICAgICApOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tRWxlbWVudHMoCiAgICAgICAgICBwcm9qZWN0ZWRQb3NpdGlvbi56LAogICAgICAgICAgcHJvamVjdGVkUG9zaXRpb24ueCwKICAgICAgICAgIHByb2plY3RlZFBvc2l0aW9uLnksCiAgICAgICAgICBwcm9qZWN0ZWRQb3NpdGlvbgogICAgICAgICk7CiAgICAgICAgY29uc3QgdHJhbnNsYXRpb24yID0gTWF0cml4NF9kZWZhdWx0LmZyb21UcmFuc2xhdGlvbigKICAgICAgICAgIHByb2plY3RlZFBvc2l0aW9uLAogICAgICAgICAgc2NyYXRjaEZyb21FTlUKICAgICAgICApOwogICAgICAgIE1hdHJpeDRfZGVmYXVsdC5tdWx0aXBseShzd2l6emxlTWF0cml4LCB0b0VOVSwgcmVzdWx0KTsKICAgICAgICBNYXRyaXg0X2RlZmF1bHQubXVsdGlwbHkodHJhbnNsYXRpb24yLCByZXN1bHQsIHJlc3VsdCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgVHJhbnNmb3Jtc19kZWZhdWx0ID0gVHJhbnNmb3JtczsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1JlY3RhbmdsZS5qcwogIGZ1bmN0aW9uIFJlY3RhbmdsZSh3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGgpIHsKICAgIHRoaXMud2VzdCA9IHdlc3QgPz8gMDsKICAgIHRoaXMuc291dGggPSBzb3V0aCA/PyAwOwogICAgdGhpcy5lYXN0ID0gZWFzdCA/PyAwOwogICAgdGhpcy5ub3J0aCA9IG5vcnRoID8/IDA7CiAgfQogIHZhciBmcm9tQm91bmRpbmdTcGhlcmVNYXRyaXhTY3JhdGNoLCBmcm9tQm91bmRpbmdTcGhlcmVFYXN0U2NyYXRjaCwgZnJvbUJvdW5kaW5nU3BoZXJlTm9ydGhTY3JhdGNoLCBmcm9tQm91bmRpbmdTcGhlcmVXZXN0U2NyYXRjaCwgZnJvbUJvdW5kaW5nU3BoZXJlU291dGhTY3JhdGNoLCBmcm9tQm91bmRpbmdTcGhlcmVQb3NpdGlvbnNTY3JhdGNoLCBzdWJzYW1wbGVMbGFTY3JhdGNoLCBSZWN0YW5nbGVfZGVmYXVsdDsKICB2YXIgaW5pdF9SZWN0YW5nbGUgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1JlY3RhbmdsZS5qcyIoKSB7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRvZ3JhcGhpYygpOwogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9UcmFuc2Zvcm1zKCk7CiAgICAgIGluaXRfTWF0cml4NCgpOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZWN0YW5nbGUucHJvdG90eXBlLCB7CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSBpbiByYWRpYW5zLgogICAgICAgICAqIEBtZW1iZXJvZiBSZWN0YW5nbGUucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKi8KICAgICAgICB3aWR0aDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIFJlY3RhbmdsZS5jb21wdXRlV2lkdGgodGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBpbiByYWRpYW5zLgogICAgICAgICAqIEBtZW1iZXJvZiBSZWN0YW5nbGUucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKi8KICAgICAgICBoZWlnaHQ6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBSZWN0YW5nbGUuY29tcHV0ZUhlaWdodCh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBSZWN0YW5nbGUucGFja2VkTGVuZ3RoID0gNDsKICAgICAgUmVjdGFuZ2xlLnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUud2VzdDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuc291dGg7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLmVhc3Q7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleF0gPSB2YWx1ZS5ub3J0aDsKICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH07CiAgICAgIFJlY3RhbmdsZS51bnBhY2sgPSBmdW5jdGlvbihhcnJheSwgc3RhcnRpbmdJbmRleCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBSZWN0YW5nbGUoKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0Lndlc3QgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdC5zb3V0aCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0LmVhc3QgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdC5ub3J0aCA9IGFycmF5W3N0YXJ0aW5nSW5kZXhdOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFJlY3RhbmdsZS5jb21wdXRlV2lkdGggPSBmdW5jdGlvbihyZWN0YW5nbGUpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsIHJlY3RhbmdsZSk7CiAgICAgICAgbGV0IGVhc3QgPSByZWN0YW5nbGUuZWFzdDsKICAgICAgICBjb25zdCB3ZXN0ID0gcmVjdGFuZ2xlLndlc3Q7CiAgICAgICAgaWYgKGVhc3QgPCB3ZXN0KSB7CiAgICAgICAgICBlYXN0ICs9IE1hdGhfZGVmYXVsdC5UV09fUEk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlYXN0IC0gd2VzdDsKICAgICAgfTsKICAgICAgUmVjdGFuZ2xlLmNvbXB1dGVIZWlnaHQgPSBmdW5jdGlvbihyZWN0YW5nbGUpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsIHJlY3RhbmdsZSk7CiAgICAgICAgcmV0dXJuIHJlY3RhbmdsZS5ub3J0aCAtIHJlY3RhbmdsZS5zb3V0aDsKICAgICAgfTsKICAgICAgUmVjdGFuZ2xlLmZyb21EZWdyZWVzID0gZnVuY3Rpb24od2VzdCwgc291dGgsIGVhc3QsIG5vcnRoLCByZXN1bHQpIHsKICAgICAgICB3ZXN0ID0gTWF0aF9kZWZhdWx0LnRvUmFkaWFucyh3ZXN0ID8/IDApOwogICAgICAgIHNvdXRoID0gTWF0aF9kZWZhdWx0LnRvUmFkaWFucyhzb3V0aCA/PyAwKTsKICAgICAgICBlYXN0ID0gTWF0aF9kZWZhdWx0LnRvUmFkaWFucyhlYXN0ID8/IDApOwogICAgICAgIG5vcnRoID0gTWF0aF9kZWZhdWx0LnRvUmFkaWFucyhub3J0aCA/PyAwKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSh3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQud2VzdCA9IHdlc3Q7CiAgICAgICAgcmVzdWx0LnNvdXRoID0gc291dGg7CiAgICAgICAgcmVzdWx0LmVhc3QgPSBlYXN0OwogICAgICAgIHJlc3VsdC5ub3J0aCA9IG5vcnRoOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFJlY3RhbmdsZS5mcm9tUmFkaWFucyA9IGZ1bmN0aW9uKHdlc3QsIHNvdXRoLCBlYXN0LCBub3J0aCwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUod2VzdCwgc291dGgsIGVhc3QsIG5vcnRoKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0Lndlc3QgPSB3ZXN0ID8/IDA7CiAgICAgICAgcmVzdWx0LnNvdXRoID0gc291dGggPz8gMDsKICAgICAgICByZXN1bHQuZWFzdCA9IGVhc3QgPz8gMDsKICAgICAgICByZXN1bHQubm9ydGggPSBub3J0aCA/PyAwOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFJlY3RhbmdsZS5mcm9tQ2FydG9ncmFwaGljQXJyYXkgPSBmdW5jdGlvbihjYXJ0b2dyYXBoaWNzLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImNhcnRvZ3JhcGhpY3MiLCBjYXJ0b2dyYXBoaWNzKTsKICAgICAgICBsZXQgd2VzdCA9IE51bWJlci5NQVhfVkFMVUU7CiAgICAgICAgbGV0IGVhc3QgPSAtTnVtYmVyLk1BWF9WQUxVRTsKICAgICAgICBsZXQgd2VzdE92ZXJJREwgPSBOdW1iZXIuTUFYX1ZBTFVFOwogICAgICAgIGxldCBlYXN0T3ZlcklETCA9IC1OdW1iZXIuTUFYX1ZBTFVFOwogICAgICAgIGxldCBzb3V0aCA9IE51bWJlci5NQVhfVkFMVUU7CiAgICAgICAgbGV0IG5vcnRoID0gLU51bWJlci5NQVhfVkFMVUU7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhcnRvZ3JhcGhpY3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gY2FydG9ncmFwaGljc1tpXTsKICAgICAgICAgIHdlc3QgPSBNYXRoLm1pbih3ZXN0LCBwb3NpdGlvbi5sb25naXR1ZGUpOwogICAgICAgICAgZWFzdCA9IE1hdGgubWF4KGVhc3QsIHBvc2l0aW9uLmxvbmdpdHVkZSk7CiAgICAgICAgICBzb3V0aCA9IE1hdGgubWluKHNvdXRoLCBwb3NpdGlvbi5sYXRpdHVkZSk7CiAgICAgICAgICBub3J0aCA9IE1hdGgubWF4KG5vcnRoLCBwb3NpdGlvbi5sYXRpdHVkZSk7CiAgICAgICAgICBjb25zdCBsb25BZGp1c3RlZCA9IHBvc2l0aW9uLmxvbmdpdHVkZSA+PSAwID8gcG9zaXRpb24ubG9uZ2l0dWRlIDogcG9zaXRpb24ubG9uZ2l0dWRlICsgTWF0aF9kZWZhdWx0LlRXT19QSTsKICAgICAgICAgIHdlc3RPdmVySURMID0gTWF0aC5taW4od2VzdE92ZXJJREwsIGxvbkFkanVzdGVkKTsKICAgICAgICAgIGVhc3RPdmVySURMID0gTWF0aC5tYXgoZWFzdE92ZXJJREwsIGxvbkFkanVzdGVkKTsKICAgICAgICB9CiAgICAgICAgaWYgKGVhc3QgLSB3ZXN0ID4gZWFzdE92ZXJJREwgLSB3ZXN0T3ZlcklETCkgewogICAgICAgICAgd2VzdCA9IHdlc3RPdmVySURMOwogICAgICAgICAgZWFzdCA9IGVhc3RPdmVySURMOwogICAgICAgICAgaWYgKGVhc3QgPiBNYXRoX2RlZmF1bHQuUEkpIHsKICAgICAgICAgICAgZWFzdCA9IGVhc3QgLSBNYXRoX2RlZmF1bHQuVFdPX1BJOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHdlc3QgPiBNYXRoX2RlZmF1bHQuUEkpIHsKICAgICAgICAgICAgd2VzdCA9IHdlc3QgLSBNYXRoX2RlZmF1bHQuVFdPX1BJOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSh3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQud2VzdCA9IHdlc3Q7CiAgICAgICAgcmVzdWx0LnNvdXRoID0gc291dGg7CiAgICAgICAgcmVzdWx0LmVhc3QgPSBlYXN0OwogICAgICAgIHJlc3VsdC5ub3J0aCA9IG5vcnRoOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFJlY3RhbmdsZS5mcm9tQ2FydGVzaWFuQXJyYXkgPSBmdW5jdGlvbihjYXJ0ZXNpYW5zLCBlbGxpcHNvaWQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiY2FydGVzaWFucyIsIGNhcnRlc2lhbnMpOwogICAgICAgIGVsbGlwc29pZCA9IGVsbGlwc29pZCA/PyBFbGxpcHNvaWRfZGVmYXVsdC5kZWZhdWx0OwogICAgICAgIGxldCB3ZXN0ID0gTnVtYmVyLk1BWF9WQUxVRTsKICAgICAgICBsZXQgZWFzdCA9IC1OdW1iZXIuTUFYX1ZBTFVFOwogICAgICAgIGxldCB3ZXN0T3ZlcklETCA9IE51bWJlci5NQVhfVkFMVUU7CiAgICAgICAgbGV0IGVhc3RPdmVySURMID0gLU51bWJlci5NQVhfVkFMVUU7CiAgICAgICAgbGV0IHNvdXRoID0gTnVtYmVyLk1BWF9WQUxVRTsKICAgICAgICBsZXQgbm9ydGggPSAtTnVtYmVyLk1BWF9WQUxVRTsKICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY2FydGVzaWFucy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBlbGxpcHNvaWQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoY2FydGVzaWFuc1tpXSk7CiAgICAgICAgICB3ZXN0ID0gTWF0aC5taW4od2VzdCwgcG9zaXRpb24ubG9uZ2l0dWRlKTsKICAgICAgICAgIGVhc3QgPSBNYXRoLm1heChlYXN0LCBwb3NpdGlvbi5sb25naXR1ZGUpOwogICAgICAgICAgc291dGggPSBNYXRoLm1pbihzb3V0aCwgcG9zaXRpb24ubGF0aXR1ZGUpOwogICAgICAgICAgbm9ydGggPSBNYXRoLm1heChub3J0aCwgcG9zaXRpb24ubGF0aXR1ZGUpOwogICAgICAgICAgY29uc3QgbG9uQWRqdXN0ZWQgPSBwb3NpdGlvbi5sb25naXR1ZGUgPj0gMCA/IHBvc2l0aW9uLmxvbmdpdHVkZSA6IHBvc2l0aW9uLmxvbmdpdHVkZSArIE1hdGhfZGVmYXVsdC5UV09fUEk7CiAgICAgICAgICB3ZXN0T3ZlcklETCA9IE1hdGgubWluKHdlc3RPdmVySURMLCBsb25BZGp1c3RlZCk7CiAgICAgICAgICBlYXN0T3ZlcklETCA9IE1hdGgubWF4KGVhc3RPdmVySURMLCBsb25BZGp1c3RlZCk7CiAgICAgICAgfQogICAgICAgIGlmIChlYXN0IC0gd2VzdCA+IGVhc3RPdmVySURMIC0gd2VzdE92ZXJJREwpIHsKICAgICAgICAgIHdlc3QgPSB3ZXN0T3ZlcklETDsKICAgICAgICAgIGVhc3QgPSBlYXN0T3ZlcklETDsKICAgICAgICAgIGlmIChlYXN0ID4gTWF0aF9kZWZhdWx0LlBJKSB7CiAgICAgICAgICAgIGVhc3QgPSBlYXN0IC0gTWF0aF9kZWZhdWx0LlRXT19QSTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh3ZXN0ID4gTWF0aF9kZWZhdWx0LlBJKSB7CiAgICAgICAgICAgIHdlc3QgPSB3ZXN0IC0gTWF0aF9kZWZhdWx0LlRXT19QSTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUod2VzdCwgc291dGgsIGVhc3QsIG5vcnRoKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0Lndlc3QgPSB3ZXN0OwogICAgICAgIHJlc3VsdC5zb3V0aCA9IHNvdXRoOwogICAgICAgIHJlc3VsdC5lYXN0ID0gZWFzdDsKICAgICAgICByZXN1bHQubm9ydGggPSBub3J0aDsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBmcm9tQm91bmRpbmdTcGhlcmVNYXRyaXhTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBmcm9tQm91bmRpbmdTcGhlcmVFYXN0U2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgZnJvbUJvdW5kaW5nU3BoZXJlTm9ydGhTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBmcm9tQm91bmRpbmdTcGhlcmVXZXN0U2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgZnJvbUJvdW5kaW5nU3BoZXJlU291dGhTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBmcm9tQm91bmRpbmdTcGhlcmVQb3NpdGlvbnNTY3JhdGNoID0gbmV3IEFycmF5KDUpOwogICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGZyb21Cb3VuZGluZ1NwaGVyZVBvc2l0aW9uc1NjcmF0Y2gubGVuZ3RoOyArK24pIHsKICAgICAgICBmcm9tQm91bmRpbmdTcGhlcmVQb3NpdGlvbnNTY3JhdGNoW25dID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICB9CiAgICAgIFJlY3RhbmdsZS5mcm9tQm91bmRpbmdTcGhlcmUgPSBmdW5jdGlvbihib3VuZGluZ1NwaGVyZSwgZWxsaXBzb2lkLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImJvdW5kaW5nU3BoZXJlIiwgYm91bmRpbmdTcGhlcmUpOwogICAgICAgIGNvbnN0IGNlbnRlciA9IGJvdW5kaW5nU3BoZXJlLmNlbnRlcjsKICAgICAgICBjb25zdCByYWRpdXMgPSBib3VuZGluZ1NwaGVyZS5yYWRpdXM7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZWxsaXBzb2lkKSkgewogICAgICAgICAgZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuZGVmYXVsdDsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IFJlY3RhbmdsZSgpOwogICAgICAgIH0KICAgICAgICBpZiAoQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFscyhjZW50ZXIsIENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPKSkgewogICAgICAgICAgUmVjdGFuZ2xlLmNsb25lKFJlY3RhbmdsZS5NQVhfVkFMVUUsIHJlc3VsdCk7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICBjb25zdCBmcm9tRU5VID0gVHJhbnNmb3Jtc19kZWZhdWx0LmVhc3ROb3J0aFVwVG9GaXhlZEZyYW1lKAogICAgICAgICAgY2VudGVyLAogICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgZnJvbUJvdW5kaW5nU3BoZXJlTWF0cml4U2NyYXRjaAogICAgICAgICk7CiAgICAgICAgY29uc3QgZWFzdCA9IE1hdHJpeDRfZGVmYXVsdC5tdWx0aXBseUJ5UG9pbnRBc1ZlY3RvcigKICAgICAgICAgIGZyb21FTlUsCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9YLAogICAgICAgICAgZnJvbUJvdW5kaW5nU3BoZXJlRWFzdFNjcmF0Y2gKICAgICAgICApOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoZWFzdCwgZWFzdCk7CiAgICAgICAgY29uc3Qgbm9ydGggPSBNYXRyaXg0X2RlZmF1bHQubXVsdGlwbHlCeVBvaW50QXNWZWN0b3IoCiAgICAgICAgICBmcm9tRU5VLAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LlVOSVRfWSwKICAgICAgICAgIGZyb21Cb3VuZGluZ1NwaGVyZU5vcnRoU2NyYXRjaAogICAgICAgICk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShub3J0aCwgbm9ydGgpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKG5vcnRoLCByYWRpdXMsIG5vcnRoKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihlYXN0LCByYWRpdXMsIGVhc3QpOwogICAgICAgIGNvbnN0IHNvdXRoID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZShub3J0aCwgZnJvbUJvdW5kaW5nU3BoZXJlU291dGhTY3JhdGNoKTsKICAgICAgICBjb25zdCB3ZXN0ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZShlYXN0LCBmcm9tQm91bmRpbmdTcGhlcmVXZXN0U2NyYXRjaCk7CiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gZnJvbUJvdW5kaW5nU3BoZXJlUG9zaXRpb25zU2NyYXRjaDsKICAgICAgICBsZXQgY29ybmVyID0gcG9zaXRpb25zWzBdOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoY2VudGVyLCBub3J0aCwgY29ybmVyKTsKICAgICAgICBjb3JuZXIgPSBwb3NpdGlvbnNbMV07CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChjZW50ZXIsIHdlc3QsIGNvcm5lcik7CiAgICAgICAgY29ybmVyID0gcG9zaXRpb25zWzJdOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoY2VudGVyLCBzb3V0aCwgY29ybmVyKTsKICAgICAgICBjb3JuZXIgPSBwb3NpdGlvbnNbM107CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChjZW50ZXIsIGVhc3QsIGNvcm5lcik7CiAgICAgICAgcG9zaXRpb25zWzRdID0gY2VudGVyOwogICAgICAgIHJldHVybiBSZWN0YW5nbGUuZnJvbUNhcnRlc2lhbkFycmF5KHBvc2l0aW9ucywgZWxsaXBzb2lkLCByZXN1bHQpOwogICAgICB9OwogICAgICBSZWN0YW5nbGUuY2xvbmUgPSBmdW5jdGlvbihyZWN0YW5nbGUsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlY3RhbmdsZSkpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlKAogICAgICAgICAgICByZWN0YW5nbGUud2VzdCwKICAgICAgICAgICAgcmVjdGFuZ2xlLnNvdXRoLAogICAgICAgICAgICByZWN0YW5nbGUuZWFzdCwKICAgICAgICAgICAgcmVjdGFuZ2xlLm5vcnRoCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXN1bHQud2VzdCA9IHJlY3RhbmdsZS53ZXN0OwogICAgICAgIHJlc3VsdC5zb3V0aCA9IHJlY3RhbmdsZS5zb3V0aDsKICAgICAgICByZXN1bHQuZWFzdCA9IHJlY3RhbmdsZS5lYXN0OwogICAgICAgIHJlc3VsdC5ub3J0aCA9IHJlY3RhbmdsZS5ub3J0aDsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBSZWN0YW5nbGUuZXF1YWxzRXBzaWxvbiA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBhYnNvbHV0ZUVwc2lsb24pIHsKICAgICAgICBhYnNvbHV0ZUVwc2lsb24gPSBhYnNvbHV0ZUVwc2lsb24gPz8gMDsKICAgICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgZGVmaW5lZF9kZWZhdWx0KGxlZnQpICYmIGRlZmluZWRfZGVmYXVsdChyaWdodCkgJiYgTWF0aC5hYnMobGVmdC53ZXN0IC0gcmlnaHQud2VzdCkgPD0gYWJzb2x1dGVFcHNpbG9uICYmIE1hdGguYWJzKGxlZnQuc291dGggLSByaWdodC5zb3V0aCkgPD0gYWJzb2x1dGVFcHNpbG9uICYmIE1hdGguYWJzKGxlZnQuZWFzdCAtIHJpZ2h0LmVhc3QpIDw9IGFic29sdXRlRXBzaWxvbiAmJiBNYXRoLmFicyhsZWZ0Lm5vcnRoIC0gcmlnaHQubm9ydGgpIDw9IGFic29sdXRlRXBzaWxvbjsKICAgICAgfTsKICAgICAgUmVjdGFuZ2xlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJldHVybiBSZWN0YW5nbGUuY2xvbmUodGhpcywgcmVzdWx0KTsKICAgICAgfTsKICAgICAgUmVjdGFuZ2xlLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbihvdGhlcikgewogICAgICAgIHJldHVybiBSZWN0YW5nbGUuZXF1YWxzKHRoaXMsIG90aGVyKTsKICAgICAgfTsKICAgICAgUmVjdGFuZ2xlLmVxdWFscyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8IGRlZmluZWRfZGVmYXVsdChsZWZ0KSAmJiBkZWZpbmVkX2RlZmF1bHQocmlnaHQpICYmIGxlZnQud2VzdCA9PT0gcmlnaHQud2VzdCAmJiBsZWZ0LnNvdXRoID09PSByaWdodC5zb3V0aCAmJiBsZWZ0LmVhc3QgPT09IHJpZ2h0LmVhc3QgJiYgbGVmdC5ub3J0aCA9PT0gcmlnaHQubm9ydGg7CiAgICAgIH07CiAgICAgIFJlY3RhbmdsZS5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbiA9IGZ1bmN0aW9uKG90aGVyLCBlcHNpbG9uKSB7CiAgICAgICAgcmV0dXJuIFJlY3RhbmdsZS5lcXVhbHNFcHNpbG9uKHRoaXMsIG90aGVyLCBlcHNpbG9uKTsKICAgICAgfTsKICAgICAgUmVjdGFuZ2xlLl92YWxpZGF0ZSA9IGZ1bmN0aW9uKHJlY3RhbmdsZSkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIiwgcmVjdGFuZ2xlKTsKICAgICAgICBjb25zdCBub3J0aCA9IHJlY3RhbmdsZS5ub3J0aDsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygKICAgICAgICAgICJub3J0aCIsCiAgICAgICAgICBub3J0aCwKICAgICAgICAgIC1NYXRoX2RlZmF1bHQuUElfT1ZFUl9UV08KICAgICAgICApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJub3J0aCIsIG5vcnRoLCBNYXRoX2RlZmF1bHQuUElfT1ZFUl9UV08pOwogICAgICAgIGNvbnN0IHNvdXRoID0gcmVjdGFuZ2xlLnNvdXRoOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKAogICAgICAgICAgInNvdXRoIiwKICAgICAgICAgIHNvdXRoLAogICAgICAgICAgLU1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTwogICAgICAgICk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoInNvdXRoIiwgc291dGgsIE1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTyk7CiAgICAgICAgY29uc3Qgd2VzdCA9IHJlY3RhbmdsZS53ZXN0OwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJ3ZXN0Iiwgd2VzdCwgLU1hdGguUEkpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJ3ZXN0Iiwgd2VzdCwgTWF0aC5QSSk7CiAgICAgICAgY29uc3QgZWFzdCA9IHJlY3RhbmdsZS5lYXN0OwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJlYXN0IiwgZWFzdCwgLU1hdGguUEkpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJlYXN0IiwgZWFzdCwgTWF0aC5QSSk7CiAgICAgIH07CiAgICAgIFJlY3RhbmdsZS5zb3V0aHdlc3QgPSBmdW5jdGlvbihyZWN0YW5nbGUsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIiwgcmVjdGFuZ2xlKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KHJlY3RhbmdsZS53ZXN0LCByZWN0YW5nbGUuc291dGgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQubG9uZ2l0dWRlID0gcmVjdGFuZ2xlLndlc3Q7CiAgICAgICAgcmVzdWx0LmxhdGl0dWRlID0gcmVjdGFuZ2xlLnNvdXRoOwogICAgICAgIHJlc3VsdC5oZWlnaHQgPSAwOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFJlY3RhbmdsZS5ub3J0aHdlc3QgPSBmdW5jdGlvbihyZWN0YW5nbGUsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIiwgcmVjdGFuZ2xlKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KHJlY3RhbmdsZS53ZXN0LCByZWN0YW5nbGUubm9ydGgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQubG9uZ2l0dWRlID0gcmVjdGFuZ2xlLndlc3Q7CiAgICAgICAgcmVzdWx0LmxhdGl0dWRlID0gcmVjdGFuZ2xlLm5vcnRoOwogICAgICAgIHJlc3VsdC5oZWlnaHQgPSAwOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFJlY3RhbmdsZS5ub3J0aGVhc3QgPSBmdW5jdGlvbihyZWN0YW5nbGUsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIiwgcmVjdGFuZ2xlKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KHJlY3RhbmdsZS5lYXN0LCByZWN0YW5nbGUubm9ydGgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQubG9uZ2l0dWRlID0gcmVjdGFuZ2xlLmVhc3Q7CiAgICAgICAgcmVzdWx0LmxhdGl0dWRlID0gcmVjdGFuZ2xlLm5vcnRoOwogICAgICAgIHJlc3VsdC5oZWlnaHQgPSAwOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFJlY3RhbmdsZS5zb3V0aGVhc3QgPSBmdW5jdGlvbihyZWN0YW5nbGUsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIiwgcmVjdGFuZ2xlKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KHJlY3RhbmdsZS5lYXN0LCByZWN0YW5nbGUuc291dGgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQubG9uZ2l0dWRlID0gcmVjdGFuZ2xlLmVhc3Q7CiAgICAgICAgcmVzdWx0LmxhdGl0dWRlID0gcmVjdGFuZ2xlLnNvdXRoOwogICAgICAgIHJlc3VsdC5oZWlnaHQgPSAwOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFJlY3RhbmdsZS5jZW50ZXIgPSBmdW5jdGlvbihyZWN0YW5nbGUsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIiwgcmVjdGFuZ2xlKTsKICAgICAgICBsZXQgZWFzdCA9IHJlY3RhbmdsZS5lYXN0OwogICAgICAgIGNvbnN0IHdlc3QgPSByZWN0YW5nbGUud2VzdDsKICAgICAgICBpZiAoZWFzdCA8IHdlc3QpIHsKICAgICAgICAgIGVhc3QgKz0gTWF0aF9kZWZhdWx0LlRXT19QSTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbG9uZ2l0dWRlID0gTWF0aF9kZWZhdWx0Lm5lZ2F0aXZlUGlUb1BpKCh3ZXN0ICsgZWFzdCkgKiAwLjUpOwogICAgICAgIGNvbnN0IGxhdGl0dWRlID0gKHJlY3RhbmdsZS5zb3V0aCArIHJlY3RhbmdsZS5ub3J0aCkgKiAwLjU7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdChsb25naXR1ZGUsIGxhdGl0dWRlKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LmxvbmdpdHVkZSA9IGxvbmdpdHVkZTsKICAgICAgICByZXN1bHQubGF0aXR1ZGUgPSBsYXRpdHVkZTsKICAgICAgICByZXN1bHQuaGVpZ2h0ID0gMDsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBSZWN0YW5nbGUuaW50ZXJzZWN0aW9uID0gZnVuY3Rpb24ocmVjdGFuZ2xlLCBvdGhlclJlY3RhbmdsZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLCByZWN0YW5nbGUpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgib3RoZXJSZWN0YW5nbGUiLCBvdGhlclJlY3RhbmdsZSk7CiAgICAgICAgbGV0IHJlY3RhbmdsZUVhc3QgPSByZWN0YW5nbGUuZWFzdDsKICAgICAgICBsZXQgcmVjdGFuZ2xlV2VzdCA9IHJlY3RhbmdsZS53ZXN0OwogICAgICAgIGxldCBvdGhlclJlY3RhbmdsZUVhc3QgPSBvdGhlclJlY3RhbmdsZS5lYXN0OwogICAgICAgIGxldCBvdGhlclJlY3RhbmdsZVdlc3QgPSBvdGhlclJlY3RhbmdsZS53ZXN0OwogICAgICAgIGlmIChyZWN0YW5nbGVFYXN0IDwgcmVjdGFuZ2xlV2VzdCAmJiBvdGhlclJlY3RhbmdsZUVhc3QgPiAwKSB7CiAgICAgICAgICByZWN0YW5nbGVFYXN0ICs9IE1hdGhfZGVmYXVsdC5UV09fUEk7CiAgICAgICAgfSBlbHNlIGlmIChvdGhlclJlY3RhbmdsZUVhc3QgPCBvdGhlclJlY3RhbmdsZVdlc3QgJiYgcmVjdGFuZ2xlRWFzdCA+IDApIHsKICAgICAgICAgIG90aGVyUmVjdGFuZ2xlRWFzdCArPSBNYXRoX2RlZmF1bHQuVFdPX1BJOwogICAgICAgIH0KICAgICAgICBpZiAocmVjdGFuZ2xlRWFzdCA8IHJlY3RhbmdsZVdlc3QgJiYgb3RoZXJSZWN0YW5nbGVXZXN0IDwgMCkgewogICAgICAgICAgb3RoZXJSZWN0YW5nbGVXZXN0ICs9IE1hdGhfZGVmYXVsdC5UV09fUEk7CiAgICAgICAgfSBlbHNlIGlmIChvdGhlclJlY3RhbmdsZUVhc3QgPCBvdGhlclJlY3RhbmdsZVdlc3QgJiYgcmVjdGFuZ2xlV2VzdCA8IDApIHsKICAgICAgICAgIHJlY3RhbmdsZVdlc3QgKz0gTWF0aF9kZWZhdWx0LlRXT19QSTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgd2VzdCA9IE1hdGhfZGVmYXVsdC5uZWdhdGl2ZVBpVG9QaSgKICAgICAgICAgIE1hdGgubWF4KHJlY3RhbmdsZVdlc3QsIG90aGVyUmVjdGFuZ2xlV2VzdCkKICAgICAgICApOwogICAgICAgIGNvbnN0IGVhc3QgPSBNYXRoX2RlZmF1bHQubmVnYXRpdmVQaVRvUGkoCiAgICAgICAgICBNYXRoLm1pbihyZWN0YW5nbGVFYXN0LCBvdGhlclJlY3RhbmdsZUVhc3QpCiAgICAgICAgKTsKICAgICAgICBpZiAoKHJlY3RhbmdsZS53ZXN0IDwgcmVjdGFuZ2xlLmVhc3QgfHwgb3RoZXJSZWN0YW5nbGUud2VzdCA8IG90aGVyUmVjdGFuZ2xlLmVhc3QpICYmIGVhc3QgPD0gd2VzdCkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc291dGggPSBNYXRoLm1heChyZWN0YW5nbGUuc291dGgsIG90aGVyUmVjdGFuZ2xlLnNvdXRoKTsKICAgICAgICBjb25zdCBub3J0aCA9IE1hdGgubWluKHJlY3RhbmdsZS5ub3J0aCwgb3RoZXJSZWN0YW5nbGUubm9ydGgpOwogICAgICAgIGlmIChzb3V0aCA+PSBub3J0aCkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUod2VzdCwgc291dGgsIGVhc3QsIG5vcnRoKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0Lndlc3QgPSB3ZXN0OwogICAgICAgIHJlc3VsdC5zb3V0aCA9IHNvdXRoOwogICAgICAgIHJlc3VsdC5lYXN0ID0gZWFzdDsKICAgICAgICByZXN1bHQubm9ydGggPSBub3J0aDsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBSZWN0YW5nbGUuc2ltcGxlSW50ZXJzZWN0aW9uID0gZnVuY3Rpb24ocmVjdGFuZ2xlLCBvdGhlclJlY3RhbmdsZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLCByZWN0YW5nbGUpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgib3RoZXJSZWN0YW5nbGUiLCBvdGhlclJlY3RhbmdsZSk7CiAgICAgICAgY29uc3Qgd2VzdCA9IE1hdGgubWF4KHJlY3RhbmdsZS53ZXN0LCBvdGhlclJlY3RhbmdsZS53ZXN0KTsKICAgICAgICBjb25zdCBzb3V0aCA9IE1hdGgubWF4KHJlY3RhbmdsZS5zb3V0aCwgb3RoZXJSZWN0YW5nbGUuc291dGgpOwogICAgICAgIGNvbnN0IGVhc3QgPSBNYXRoLm1pbihyZWN0YW5nbGUuZWFzdCwgb3RoZXJSZWN0YW5nbGUuZWFzdCk7CiAgICAgICAgY29uc3Qgbm9ydGggPSBNYXRoLm1pbihyZWN0YW5nbGUubm9ydGgsIG90aGVyUmVjdGFuZ2xlLm5vcnRoKTsKICAgICAgICBpZiAoc291dGggPj0gbm9ydGggfHwgd2VzdCA+PSBlYXN0KSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSh3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQud2VzdCA9IHdlc3Q7CiAgICAgICAgcmVzdWx0LnNvdXRoID0gc291dGg7CiAgICAgICAgcmVzdWx0LmVhc3QgPSBlYXN0OwogICAgICAgIHJlc3VsdC5ub3J0aCA9IG5vcnRoOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFJlY3RhbmdsZS51bmlvbiA9IGZ1bmN0aW9uKHJlY3RhbmdsZSwgb3RoZXJSZWN0YW5nbGUsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIiwgcmVjdGFuZ2xlKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm90aGVyUmVjdGFuZ2xlIiwgb3RoZXJSZWN0YW5nbGUpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBSZWN0YW5nbGUoKTsKICAgICAgICB9CiAgICAgICAgbGV0IHJlY3RhbmdsZUVhc3QgPSByZWN0YW5nbGUuZWFzdDsKICAgICAgICBsZXQgcmVjdGFuZ2xlV2VzdCA9IHJlY3RhbmdsZS53ZXN0OwogICAgICAgIGxldCBvdGhlclJlY3RhbmdsZUVhc3QgPSBvdGhlclJlY3RhbmdsZS5lYXN0OwogICAgICAgIGxldCBvdGhlclJlY3RhbmdsZVdlc3QgPSBvdGhlclJlY3RhbmdsZS53ZXN0OwogICAgICAgIGlmIChyZWN0YW5nbGVFYXN0IDwgcmVjdGFuZ2xlV2VzdCAmJiBvdGhlclJlY3RhbmdsZUVhc3QgPiAwKSB7CiAgICAgICAgICByZWN0YW5nbGVFYXN0ICs9IE1hdGhfZGVmYXVsdC5UV09fUEk7CiAgICAgICAgfSBlbHNlIGlmIChvdGhlclJlY3RhbmdsZUVhc3QgPCBvdGhlclJlY3RhbmdsZVdlc3QgJiYgcmVjdGFuZ2xlRWFzdCA+IDApIHsKICAgICAgICAgIG90aGVyUmVjdGFuZ2xlRWFzdCArPSBNYXRoX2RlZmF1bHQuVFdPX1BJOwogICAgICAgIH0KICAgICAgICBpZiAocmVjdGFuZ2xlRWFzdCA8IHJlY3RhbmdsZVdlc3QgJiYgb3RoZXJSZWN0YW5nbGVXZXN0IDwgMCkgewogICAgICAgICAgb3RoZXJSZWN0YW5nbGVXZXN0ICs9IE1hdGhfZGVmYXVsdC5UV09fUEk7CiAgICAgICAgfSBlbHNlIGlmIChvdGhlclJlY3RhbmdsZUVhc3QgPCBvdGhlclJlY3RhbmdsZVdlc3QgJiYgcmVjdGFuZ2xlV2VzdCA8IDApIHsKICAgICAgICAgIHJlY3RhbmdsZVdlc3QgKz0gTWF0aF9kZWZhdWx0LlRXT19QSTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgd2VzdCA9IE1hdGhfZGVmYXVsdC5uZWdhdGl2ZVBpVG9QaSgKICAgICAgICAgIE1hdGgubWluKHJlY3RhbmdsZVdlc3QsIG90aGVyUmVjdGFuZ2xlV2VzdCkKICAgICAgICApOwogICAgICAgIGNvbnN0IGVhc3QgPSBNYXRoX2RlZmF1bHQubmVnYXRpdmVQaVRvUGkoCiAgICAgICAgICBNYXRoLm1heChyZWN0YW5nbGVFYXN0LCBvdGhlclJlY3RhbmdsZUVhc3QpCiAgICAgICAgKTsKICAgICAgICByZXN1bHQud2VzdCA9IHdlc3Q7CiAgICAgICAgcmVzdWx0LnNvdXRoID0gTWF0aC5taW4ocmVjdGFuZ2xlLnNvdXRoLCBvdGhlclJlY3RhbmdsZS5zb3V0aCk7CiAgICAgICAgcmVzdWx0LmVhc3QgPSBlYXN0OwogICAgICAgIHJlc3VsdC5ub3J0aCA9IE1hdGgubWF4KHJlY3RhbmdsZS5ub3J0aCwgb3RoZXJSZWN0YW5nbGUubm9ydGgpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFJlY3RhbmdsZS5leHBhbmQgPSBmdW5jdGlvbihyZWN0YW5nbGUsIGNhcnRvZ3JhcGhpYzIsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIiwgcmVjdGFuZ2xlKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNhcnRvZ3JhcGhpYyIsIGNhcnRvZ3JhcGhpYzIpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBSZWN0YW5nbGUoKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0Lndlc3QgPSBNYXRoLm1pbihyZWN0YW5nbGUud2VzdCwgY2FydG9ncmFwaGljMi5sb25naXR1ZGUpOwogICAgICAgIHJlc3VsdC5zb3V0aCA9IE1hdGgubWluKHJlY3RhbmdsZS5zb3V0aCwgY2FydG9ncmFwaGljMi5sYXRpdHVkZSk7CiAgICAgICAgcmVzdWx0LmVhc3QgPSBNYXRoLm1heChyZWN0YW5nbGUuZWFzdCwgY2FydG9ncmFwaGljMi5sb25naXR1ZGUpOwogICAgICAgIHJlc3VsdC5ub3J0aCA9IE1hdGgubWF4KHJlY3RhbmdsZS5ub3J0aCwgY2FydG9ncmFwaGljMi5sYXRpdHVkZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgUmVjdGFuZ2xlLmNvbnRhaW5zID0gZnVuY3Rpb24ocmVjdGFuZ2xlLCBjYXJ0b2dyYXBoaWMyKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLCByZWN0YW5nbGUpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydG9ncmFwaGljIiwgY2FydG9ncmFwaGljMik7CiAgICAgICAgbGV0IGxvbmdpdHVkZSA9IGNhcnRvZ3JhcGhpYzIubG9uZ2l0dWRlOwogICAgICAgIGNvbnN0IGxhdGl0dWRlID0gY2FydG9ncmFwaGljMi5sYXRpdHVkZTsKICAgICAgICBjb25zdCB3ZXN0ID0gcmVjdGFuZ2xlLndlc3Q7CiAgICAgICAgbGV0IGVhc3QgPSByZWN0YW5nbGUuZWFzdDsKICAgICAgICBpZiAoZWFzdCA8IHdlc3QpIHsKICAgICAgICAgIGVhc3QgKz0gTWF0aF9kZWZhdWx0LlRXT19QSTsKICAgICAgICAgIGlmIChsb25naXR1ZGUgPCAwKSB7CiAgICAgICAgICAgIGxvbmdpdHVkZSArPSBNYXRoX2RlZmF1bHQuVFdPX1BJOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gKGxvbmdpdHVkZSA+IHdlc3QgfHwgTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24obG9uZ2l0dWRlLCB3ZXN0LCBNYXRoX2RlZmF1bHQuRVBTSUxPTjE0KSkgJiYgKGxvbmdpdHVkZSA8IGVhc3QgfHwgTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24obG9uZ2l0dWRlLCBlYXN0LCBNYXRoX2RlZmF1bHQuRVBTSUxPTjE0KSkgJiYgbGF0aXR1ZGUgPj0gcmVjdGFuZ2xlLnNvdXRoICYmIGxhdGl0dWRlIDw9IHJlY3RhbmdsZS5ub3J0aDsKICAgICAgfTsKICAgICAgc3Vic2FtcGxlTGxhU2NyYXRjaCA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBSZWN0YW5nbGUuc3Vic2FtcGxlID0gZnVuY3Rpb24ocmVjdGFuZ2xlLCBlbGxpcHNvaWQsIHN1cmZhY2VIZWlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIiwgcmVjdGFuZ2xlKTsKICAgICAgICBlbGxpcHNvaWQgPSBlbGxpcHNvaWQgPz8gRWxsaXBzb2lkX2RlZmF1bHQuZGVmYXVsdDsKICAgICAgICBzdXJmYWNlSGVpZ2h0ID0gc3VyZmFjZUhlaWdodCA/PyAwOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IFtdOwogICAgICAgIH0KICAgICAgICBsZXQgbGVuZ3RoID0gMDsKICAgICAgICBjb25zdCBub3J0aCA9IHJlY3RhbmdsZS5ub3J0aDsKICAgICAgICBjb25zdCBzb3V0aCA9IHJlY3RhbmdsZS5zb3V0aDsKICAgICAgICBjb25zdCBlYXN0ID0gcmVjdGFuZ2xlLmVhc3Q7CiAgICAgICAgY29uc3Qgd2VzdCA9IHJlY3RhbmdsZS53ZXN0OwogICAgICAgIGNvbnN0IGxsYSA9IHN1YnNhbXBsZUxsYVNjcmF0Y2g7CiAgICAgICAgbGxhLmhlaWdodCA9IHN1cmZhY2VIZWlnaHQ7CiAgICAgICAgbGxhLmxvbmdpdHVkZSA9IHdlc3Q7CiAgICAgICAgbGxhLmxhdGl0dWRlID0gbm9ydGg7CiAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSBlbGxpcHNvaWQuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obGxhLCByZXN1bHRbbGVuZ3RoXSk7CiAgICAgICAgbGVuZ3RoKys7CiAgICAgICAgbGxhLmxvbmdpdHVkZSA9IGVhc3Q7CiAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSBlbGxpcHNvaWQuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obGxhLCByZXN1bHRbbGVuZ3RoXSk7CiAgICAgICAgbGVuZ3RoKys7CiAgICAgICAgbGxhLmxhdGl0dWRlID0gc291dGg7CiAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSBlbGxpcHNvaWQuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obGxhLCByZXN1bHRbbGVuZ3RoXSk7CiAgICAgICAgbGVuZ3RoKys7CiAgICAgICAgbGxhLmxvbmdpdHVkZSA9IHdlc3Q7CiAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSBlbGxpcHNvaWQuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obGxhLCByZXN1bHRbbGVuZ3RoXSk7CiAgICAgICAgbGVuZ3RoKys7CiAgICAgICAgaWYgKG5vcnRoIDwgMCkgewogICAgICAgICAgbGxhLmxhdGl0dWRlID0gbm9ydGg7CiAgICAgICAgfSBlbHNlIGlmIChzb3V0aCA+IDApIHsKICAgICAgICAgIGxsYS5sYXRpdHVkZSA9IHNvdXRoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsbGEubGF0aXR1ZGUgPSAwOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IDg7ICsraSkgewogICAgICAgICAgbGxhLmxvbmdpdHVkZSA9IC1NYXRoLlBJICsgaSAqIE1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTzsKICAgICAgICAgIGlmIChSZWN0YW5nbGUuY29udGFpbnMocmVjdGFuZ2xlLCBsbGEpKSB7CiAgICAgICAgICAgIHJlc3VsdFtsZW5ndGhdID0gZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGxsYSwgcmVzdWx0W2xlbmd0aF0pOwogICAgICAgICAgICBsZW5ndGgrKzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGxsYS5sYXRpdHVkZSA9PT0gMCkgewogICAgICAgICAgbGxhLmxvbmdpdHVkZSA9IHdlc3Q7CiAgICAgICAgICByZXN1bHRbbGVuZ3RoXSA9IGVsbGlwc29pZC5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsbGEsIHJlc3VsdFtsZW5ndGhdKTsKICAgICAgICAgIGxlbmd0aCsrOwogICAgICAgICAgbGxhLmxvbmdpdHVkZSA9IGVhc3Q7CiAgICAgICAgICByZXN1bHRbbGVuZ3RoXSA9IGVsbGlwc29pZC5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsbGEsIHJlc3VsdFtsZW5ndGhdKTsKICAgICAgICAgIGxlbmd0aCsrOwogICAgICAgIH0KICAgICAgICByZXN1bHQubGVuZ3RoID0gbGVuZ3RoOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFJlY3RhbmdsZS5zdWJzZWN0aW9uID0gZnVuY3Rpb24ocmVjdGFuZ2xlLCB3ZXN0TGVycCwgc291dGhMZXJwLCBlYXN0TGVycCwgbm9ydGhMZXJwLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsIHJlY3RhbmdsZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIndlc3RMZXJwIiwgd2VzdExlcnAsIDApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJ3ZXN0TGVycCIsIHdlc3RMZXJwLCAxKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygic291dGhMZXJwIiwgc291dGhMZXJwLCAwKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygic291dGhMZXJwIiwgc291dGhMZXJwLCAxKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiZWFzdExlcnAiLCBlYXN0TGVycCwgMCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImVhc3RMZXJwIiwgZWFzdExlcnAsIDEpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJub3J0aExlcnAiLCBub3J0aExlcnAsIDApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJub3J0aExlcnAiLCBub3J0aExlcnAsIDEpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJ3ZXN0TGVycCIsIHdlc3RMZXJwLCBlYXN0TGVycCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoInNvdXRoTGVycCIsIHNvdXRoTGVycCwgbm9ydGhMZXJwKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgUmVjdGFuZ2xlKCk7CiAgICAgICAgfQogICAgICAgIGlmIChyZWN0YW5nbGUud2VzdCA8PSByZWN0YW5nbGUuZWFzdCkgewogICAgICAgICAgY29uc3Qgd2lkdGggPSByZWN0YW5nbGUuZWFzdCAtIHJlY3RhbmdsZS53ZXN0OwogICAgICAgICAgcmVzdWx0Lndlc3QgPSByZWN0YW5nbGUud2VzdCArIHdlc3RMZXJwICogd2lkdGg7CiAgICAgICAgICByZXN1bHQuZWFzdCA9IHJlY3RhbmdsZS53ZXN0ICsgZWFzdExlcnAgKiB3aWR0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3Qgd2lkdGggPSBNYXRoX2RlZmF1bHQuVFdPX1BJICsgcmVjdGFuZ2xlLmVhc3QgLSByZWN0YW5nbGUud2VzdDsKICAgICAgICAgIHJlc3VsdC53ZXN0ID0gTWF0aF9kZWZhdWx0Lm5lZ2F0aXZlUGlUb1BpKHJlY3RhbmdsZS53ZXN0ICsgd2VzdExlcnAgKiB3aWR0aCk7CiAgICAgICAgICByZXN1bHQuZWFzdCA9IE1hdGhfZGVmYXVsdC5uZWdhdGl2ZVBpVG9QaShyZWN0YW5nbGUud2VzdCArIGVhc3RMZXJwICogd2lkdGgpOwogICAgICAgIH0KICAgICAgICBjb25zdCBoZWlnaHQgPSByZWN0YW5nbGUubm9ydGggLSByZWN0YW5nbGUuc291dGg7CiAgICAgICAgcmVzdWx0LnNvdXRoID0gcmVjdGFuZ2xlLnNvdXRoICsgc291dGhMZXJwICogaGVpZ2h0OwogICAgICAgIHJlc3VsdC5ub3J0aCA9IHJlY3RhbmdsZS5zb3V0aCArIG5vcnRoTGVycCAqIGhlaWdodDsKICAgICAgICBpZiAod2VzdExlcnAgPT09IDEpIHsKICAgICAgICAgIHJlc3VsdC53ZXN0ID0gcmVjdGFuZ2xlLmVhc3Q7CiAgICAgICAgfQogICAgICAgIGlmIChlYXN0TGVycCA9PT0gMSkgewogICAgICAgICAgcmVzdWx0LmVhc3QgPSByZWN0YW5nbGUuZWFzdDsKICAgICAgICB9CiAgICAgICAgaWYgKHNvdXRoTGVycCA9PT0gMSkgewogICAgICAgICAgcmVzdWx0LnNvdXRoID0gcmVjdGFuZ2xlLm5vcnRoOwogICAgICAgIH0KICAgICAgICBpZiAobm9ydGhMZXJwID09PSAxKSB7CiAgICAgICAgICByZXN1bHQubm9ydGggPSByZWN0YW5nbGUubm9ydGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFJlY3RhbmdsZS5NQVhfVkFMVUUgPSBPYmplY3QuZnJlZXplKAogICAgICAgIG5ldyBSZWN0YW5nbGUoCiAgICAgICAgICAtTWF0aC5QSSwKICAgICAgICAgIC1NYXRoX2RlZmF1bHQuUElfT1ZFUl9UV08sCiAgICAgICAgICBNYXRoLlBJLAogICAgICAgICAgTWF0aF9kZWZhdWx0LlBJX09WRVJfVFdPCiAgICAgICAgKQogICAgICApOwogICAgICBSZWN0YW5nbGVfZGVmYXVsdCA9IFJlY3RhbmdsZTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0JvdW5kaW5nU3BoZXJlLmpzCiAgZnVuY3Rpb24gQm91bmRpbmdTcGhlcmUoY2VudGVyLCByYWRpdXMpIHsKICAgIHRoaXMuY2VudGVyID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGNlbnRlciA/PyBDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTyk7CiAgICB0aGlzLnJhZGl1cyA9IHJhZGl1cyA/PyAwOwogIH0KICB2YXIgZnJvbVBvaW50c1hNaW4sIGZyb21Qb2ludHNZTWluLCBmcm9tUG9pbnRzWk1pbiwgZnJvbVBvaW50c1hNYXgsIGZyb21Qb2ludHNZTWF4LCBmcm9tUG9pbnRzWk1heCwgZnJvbVBvaW50c0N1cnJlbnRQb3MsIGZyb21Qb2ludHNTY3JhdGNoLCBmcm9tUG9pbnRzUml0dGVyQ2VudGVyLCBmcm9tUG9pbnRzTWluQm94UHQsIGZyb21Qb2ludHNNYXhCb3hQdCwgZnJvbVBvaW50c05haXZlQ2VudGVyU2NyYXRjaCwgdm9sdW1lQ29uc3RhbnQsIGRlZmF1bHRQcm9qZWN0aW9uLCBmcm9tUmVjdGFuZ2xlMkRMb3dlckxlZnQsIGZyb21SZWN0YW5nbGUyRFVwcGVyUmlnaHQsIGZyb21SZWN0YW5nbGUyRFNvdXRod2VzdCwgZnJvbVJlY3RhbmdsZTJETm9ydGhlYXN0LCBmcm9tUmVjdGFuZ2xlM0RTY3JhdGNoLCBmcm9tQm91bmRpbmdTcGhlcmVzU2NyYXRjaCwgZnJvbU9yaWVudGVkQm91bmRpbmdCb3hTY3JhdGNoVSwgZnJvbU9yaWVudGVkQm91bmRpbmdCb3hTY3JhdGNoViwgZnJvbU9yaWVudGVkQm91bmRpbmdCb3hTY3JhdGNoVywgc2NyYXRjaEZyb21UcmFuc2Zvcm1hdGlvbkNlbnRlciwgc2NyYXRjaEZyb21UcmFuc2Zvcm1hdGlvblNjYWxlLCB1bmlvblNjcmF0Y2gsIHVuaW9uU2NyYXRjaENlbnRlciwgZXhwYW5kU2NyYXRjaCwgZGlzdGFuY2VTcXVhcmVkVG9TY3JhdGNoLCBzY3JhdGNoQ2FydGVzaWFuMywgcHJvamVjdFRvMkROb3JtYWxTY3JhdGNoLCBwcm9qZWN0VG8yREVhc3RTY3JhdGNoLCBwcm9qZWN0VG8yRE5vcnRoU2NyYXRjaCwgcHJvamVjdFRvMkRXZXN0U2NyYXRjaCwgcHJvamVjdFRvMkRTb3V0aFNjcmF0Y2gsIHByb2plY3RUbzJEQ2FydG9ncmFwaGljU2NyYXRjaCwgcHJvamVjdFRvMkRQb3NpdGlvbnNTY3JhdGNoLCBwcm9qZWN0VG8yRFByb2plY3Rpb24sIEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQ7CiAgdmFyIGluaXRfQm91bmRpbmdTcGhlcmUgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0JvdW5kaW5nU3BoZXJlLmpzIigpIHsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2FydG9ncmFwaGljKCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfR2VvZ3JhcGhpY1Byb2plY3Rpb24oKTsKICAgICAgaW5pdF9JbnRlcnNlY3QoKTsKICAgICAgaW5pdF9JbnRlcnZhbCgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9NYXRyaXgzKCk7CiAgICAgIGluaXRfTWF0cml4NCgpOwogICAgICBpbml0X1JlY3RhbmdsZSgpOwogICAgICBmcm9tUG9pbnRzWE1pbiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgZnJvbVBvaW50c1lNaW4gPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGZyb21Qb2ludHNaTWluID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBmcm9tUG9pbnRzWE1heCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgZnJvbVBvaW50c1lNYXggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGZyb21Qb2ludHNaTWF4ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBmcm9tUG9pbnRzQ3VycmVudFBvcyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgZnJvbVBvaW50c1NjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGZyb21Qb2ludHNSaXR0ZXJDZW50ZXIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGZyb21Qb2ludHNNaW5Cb3hQdCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgZnJvbVBvaW50c01heEJveFB0ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBmcm9tUG9pbnRzTmFpdmVDZW50ZXJTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICB2b2x1bWVDb25zdGFudCA9IDQgLyAzICogTWF0aF9kZWZhdWx0LlBJOwogICAgICBCb3VuZGluZ1NwaGVyZS5mcm9tUG9pbnRzID0gZnVuY3Rpb24ocG9zaXRpb25zLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQm91bmRpbmdTcGhlcmUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocG9zaXRpb25zKSB8fCBwb3NpdGlvbnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXN1bHQuY2VudGVyID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPLCByZXN1bHQuY2VudGVyKTsKICAgICAgICAgIHJlc3VsdC5yYWRpdXMgPSAwOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgY29uc3QgY3VycmVudFBvcyA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShwb3NpdGlvbnNbMF0sIGZyb21Qb2ludHNDdXJyZW50UG9zKTsKICAgICAgICBjb25zdCB4TWluID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGN1cnJlbnRQb3MsIGZyb21Qb2ludHNYTWluKTsKICAgICAgICBjb25zdCB5TWluID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGN1cnJlbnRQb3MsIGZyb21Qb2ludHNZTWluKTsKICAgICAgICBjb25zdCB6TWluID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGN1cnJlbnRQb3MsIGZyb21Qb2ludHNaTWluKTsKICAgICAgICBjb25zdCB4TWF4ID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGN1cnJlbnRQb3MsIGZyb21Qb2ludHNYTWF4KTsKICAgICAgICBjb25zdCB5TWF4ID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGN1cnJlbnRQb3MsIGZyb21Qb2ludHNZTWF4KTsKICAgICAgICBjb25zdCB6TWF4ID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGN1cnJlbnRQb3MsIGZyb21Qb2ludHNaTWF4KTsKICAgICAgICBjb25zdCBudW1Qb3NpdGlvbnMgPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGxldCBpOwogICAgICAgIGZvciAoaSA9IDE7IGkgPCBudW1Qb3NpdGlvbnM7IGkrKykgewogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKHBvc2l0aW9uc1tpXSwgY3VycmVudFBvcyk7CiAgICAgICAgICBjb25zdCB4ID0gY3VycmVudFBvcy54OwogICAgICAgICAgY29uc3QgeSA9IGN1cnJlbnRQb3MueTsKICAgICAgICAgIGNvbnN0IHogPSBjdXJyZW50UG9zLno7CiAgICAgICAgICBpZiAoeCA8IHhNaW4ueCkgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgeE1pbik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoeCA+IHhNYXgueCkgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgeE1heCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoeSA8IHlNaW4ueSkgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgeU1pbik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoeSA+IHlNYXgueSkgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgeU1heCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoeiA8IHpNaW4ueikgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgek1pbik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoeiA+IHpNYXgueikgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgek1heCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHhTcGFuID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZVNxdWFyZWQoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoeE1heCwgeE1pbiwgZnJvbVBvaW50c1NjcmF0Y2gpCiAgICAgICAgKTsKICAgICAgICBjb25zdCB5U3BhbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGVTcXVhcmVkKAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KHlNYXgsIHlNaW4sIGZyb21Qb2ludHNTY3JhdGNoKQogICAgICAgICk7CiAgICAgICAgY29uc3QgelNwYW4gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlU3F1YXJlZCgKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdCh6TWF4LCB6TWluLCBmcm9tUG9pbnRzU2NyYXRjaCkKICAgICAgICApOwogICAgICAgIGxldCBkaWFtZXRlcjEgPSB4TWluOwogICAgICAgIGxldCBkaWFtZXRlcjIgPSB4TWF4OwogICAgICAgIGxldCBtYXhTcGFuID0geFNwYW47CiAgICAgICAgaWYgKHlTcGFuID4gbWF4U3BhbikgewogICAgICAgICAgbWF4U3BhbiA9IHlTcGFuOwogICAgICAgICAgZGlhbWV0ZXIxID0geU1pbjsKICAgICAgICAgIGRpYW1ldGVyMiA9IHlNYXg7CiAgICAgICAgfQogICAgICAgIGlmICh6U3BhbiA+IG1heFNwYW4pIHsKICAgICAgICAgIG1heFNwYW4gPSB6U3BhbjsKICAgICAgICAgIGRpYW1ldGVyMSA9IHpNaW47CiAgICAgICAgICBkaWFtZXRlcjIgPSB6TWF4OwogICAgICAgIH0KICAgICAgICBjb25zdCByaXR0ZXJDZW50ZXIgPSBmcm9tUG9pbnRzUml0dGVyQ2VudGVyOwogICAgICAgIHJpdHRlckNlbnRlci54ID0gKGRpYW1ldGVyMS54ICsgZGlhbWV0ZXIyLngpICogMC41OwogICAgICAgIHJpdHRlckNlbnRlci55ID0gKGRpYW1ldGVyMS55ICsgZGlhbWV0ZXIyLnkpICogMC41OwogICAgICAgIHJpdHRlckNlbnRlci56ID0gKGRpYW1ldGVyMS56ICsgZGlhbWV0ZXIyLnopICogMC41OwogICAgICAgIGxldCByYWRpdXNTcXVhcmVkID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZVNxdWFyZWQoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoZGlhbWV0ZXIyLCByaXR0ZXJDZW50ZXIsIGZyb21Qb2ludHNTY3JhdGNoKQogICAgICAgICk7CiAgICAgICAgbGV0IHJpdHRlclJhZGl1cyA9IE1hdGguc3FydChyYWRpdXNTcXVhcmVkKTsKICAgICAgICBjb25zdCBtaW5Cb3hQdCA9IGZyb21Qb2ludHNNaW5Cb3hQdDsKICAgICAgICBtaW5Cb3hQdC54ID0geE1pbi54OwogICAgICAgIG1pbkJveFB0LnkgPSB5TWluLnk7CiAgICAgICAgbWluQm94UHQueiA9IHpNaW4uejsKICAgICAgICBjb25zdCBtYXhCb3hQdCA9IGZyb21Qb2ludHNNYXhCb3hQdDsKICAgICAgICBtYXhCb3hQdC54ID0geE1heC54OwogICAgICAgIG1heEJveFB0LnkgPSB5TWF4Lnk7CiAgICAgICAgbWF4Qm94UHQueiA9IHpNYXguejsKICAgICAgICBjb25zdCBuYWl2ZUNlbnRlciA9IENhcnRlc2lhbjNfZGVmYXVsdC5taWRwb2ludCgKICAgICAgICAgIG1pbkJveFB0LAogICAgICAgICAgbWF4Qm94UHQsCiAgICAgICAgICBmcm9tUG9pbnRzTmFpdmVDZW50ZXJTY3JhdGNoCiAgICAgICAgKTsKICAgICAgICBsZXQgbmFpdmVSYWRpdXMgPSAwOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qb3NpdGlvbnM7IGkrKykgewogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKHBvc2l0aW9uc1tpXSwgY3VycmVudFBvcyk7CiAgICAgICAgICBjb25zdCByID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZSgKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KGN1cnJlbnRQb3MsIG5haXZlQ2VudGVyLCBmcm9tUG9pbnRzU2NyYXRjaCkKICAgICAgICAgICk7CiAgICAgICAgICBpZiAociA+IG5haXZlUmFkaXVzKSB7CiAgICAgICAgICAgIG5haXZlUmFkaXVzID0gcjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IG9sZENlbnRlclRvUG9pbnRTcXVhcmVkID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZVNxdWFyZWQoCiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChjdXJyZW50UG9zLCByaXR0ZXJDZW50ZXIsIGZyb21Qb2ludHNTY3JhdGNoKQogICAgICAgICAgKTsKICAgICAgICAgIGlmIChvbGRDZW50ZXJUb1BvaW50U3F1YXJlZCA+IHJhZGl1c1NxdWFyZWQpIHsKICAgICAgICAgICAgY29uc3Qgb2xkQ2VudGVyVG9Qb2ludCA9IE1hdGguc3FydChvbGRDZW50ZXJUb1BvaW50U3F1YXJlZCk7CiAgICAgICAgICAgIHJpdHRlclJhZGl1cyA9IChyaXR0ZXJSYWRpdXMgKyBvbGRDZW50ZXJUb1BvaW50KSAqIDAuNTsKICAgICAgICAgICAgcmFkaXVzU3F1YXJlZCA9IHJpdHRlclJhZGl1cyAqIHJpdHRlclJhZGl1czsKICAgICAgICAgICAgY29uc3Qgb2xkVG9OZXcgPSBvbGRDZW50ZXJUb1BvaW50IC0gcml0dGVyUmFkaXVzOwogICAgICAgICAgICByaXR0ZXJDZW50ZXIueCA9IChyaXR0ZXJSYWRpdXMgKiByaXR0ZXJDZW50ZXIueCArIG9sZFRvTmV3ICogY3VycmVudFBvcy54KSAvIG9sZENlbnRlclRvUG9pbnQ7CiAgICAgICAgICAgIHJpdHRlckNlbnRlci55ID0gKHJpdHRlclJhZGl1cyAqIHJpdHRlckNlbnRlci55ICsgb2xkVG9OZXcgKiBjdXJyZW50UG9zLnkpIC8gb2xkQ2VudGVyVG9Qb2ludDsKICAgICAgICAgICAgcml0dGVyQ2VudGVyLnogPSAocml0dGVyUmFkaXVzICogcml0dGVyQ2VudGVyLnogKyBvbGRUb05ldyAqIGN1cnJlbnRQb3MueikgLyBvbGRDZW50ZXJUb1BvaW50OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocml0dGVyUmFkaXVzIDwgbmFpdmVSYWRpdXMpIHsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShyaXR0ZXJDZW50ZXIsIHJlc3VsdC5jZW50ZXIpOwogICAgICAgICAgcmVzdWx0LnJhZGl1cyA9IHJpdHRlclJhZGl1czsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKG5haXZlQ2VudGVyLCByZXN1bHQuY2VudGVyKTsKICAgICAgICAgIHJlc3VsdC5yYWRpdXMgPSBuYWl2ZVJhZGl1czsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgZGVmYXVsdFByb2plY3Rpb24gPSBuZXcgR2VvZ3JhcGhpY1Byb2plY3Rpb25fZGVmYXVsdCgpOwogICAgICBmcm9tUmVjdGFuZ2xlMkRMb3dlckxlZnQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGZyb21SZWN0YW5nbGUyRFVwcGVyUmlnaHQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGZyb21SZWN0YW5nbGUyRFNvdXRod2VzdCA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBmcm9tUmVjdGFuZ2xlMkROb3J0aGVhc3QgPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgQm91bmRpbmdTcGhlcmUuZnJvbVJlY3RhbmdsZTJEID0gZnVuY3Rpb24ocmVjdGFuZ2xlLCBwcm9qZWN0aW9uLCByZXN1bHQpIHsKICAgICAgICByZXR1cm4gQm91bmRpbmdTcGhlcmUuZnJvbVJlY3RhbmdsZVdpdGhIZWlnaHRzMkQoCiAgICAgICAgICByZWN0YW5nbGUsCiAgICAgICAgICBwcm9qZWN0aW9uLAogICAgICAgICAgMCwKICAgICAgICAgIDAsCiAgICAgICAgICByZXN1bHQKICAgICAgICApOwogICAgICB9OwogICAgICBCb3VuZGluZ1NwaGVyZS5mcm9tUmVjdGFuZ2xlV2l0aEhlaWdodHMyRCA9IGZ1bmN0aW9uKHJlY3RhbmdsZSwgcHJvamVjdGlvbiwgbWluaW11bUhlaWdodCwgbWF4aW11bUhlaWdodCwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IEJvdW5kaW5nU3BoZXJlKCk7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlY3RhbmdsZSkpIHsKICAgICAgICAgIHJlc3VsdC5jZW50ZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8sIHJlc3VsdC5jZW50ZXIpOwogICAgICAgICAgcmVzdWx0LnJhZGl1cyA9IDA7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICBkZWZhdWx0UHJvamVjdGlvbi5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuZGVmYXVsdDsKICAgICAgICBwcm9qZWN0aW9uID0gcHJvamVjdGlvbiA/PyBkZWZhdWx0UHJvamVjdGlvbjsKICAgICAgICBSZWN0YW5nbGVfZGVmYXVsdC5zb3V0aHdlc3QocmVjdGFuZ2xlLCBmcm9tUmVjdGFuZ2xlMkRTb3V0aHdlc3QpOwogICAgICAgIGZyb21SZWN0YW5nbGUyRFNvdXRod2VzdC5oZWlnaHQgPSBtaW5pbXVtSGVpZ2h0OwogICAgICAgIFJlY3RhbmdsZV9kZWZhdWx0Lm5vcnRoZWFzdChyZWN0YW5nbGUsIGZyb21SZWN0YW5nbGUyRE5vcnRoZWFzdCk7CiAgICAgICAgZnJvbVJlY3RhbmdsZTJETm9ydGhlYXN0LmhlaWdodCA9IG1heGltdW1IZWlnaHQ7CiAgICAgICAgY29uc3QgbG93ZXJMZWZ0ID0gcHJvamVjdGlvbi5wcm9qZWN0KAogICAgICAgICAgZnJvbVJlY3RhbmdsZTJEU291dGh3ZXN0LAogICAgICAgICAgZnJvbVJlY3RhbmdsZTJETG93ZXJMZWZ0CiAgICAgICAgKTsKICAgICAgICBjb25zdCB1cHBlclJpZ2h0ID0gcHJvamVjdGlvbi5wcm9qZWN0KAogICAgICAgICAgZnJvbVJlY3RhbmdsZTJETm9ydGhlYXN0LAogICAgICAgICAgZnJvbVJlY3RhbmdsZTJEVXBwZXJSaWdodAogICAgICAgICk7CiAgICAgICAgY29uc3Qgd2lkdGggPSB1cHBlclJpZ2h0LnggLSBsb3dlckxlZnQueDsKICAgICAgICBjb25zdCBoZWlnaHQgPSB1cHBlclJpZ2h0LnkgLSBsb3dlckxlZnQueTsKICAgICAgICBjb25zdCBlbGV2YXRpb24gPSB1cHBlclJpZ2h0LnogLSBsb3dlckxlZnQuejsKICAgICAgICByZXN1bHQucmFkaXVzID0gTWF0aC5zcXJ0KHdpZHRoICogd2lkdGggKyBoZWlnaHQgKiBoZWlnaHQgKyBlbGV2YXRpb24gKiBlbGV2YXRpb24pICogMC41OwogICAgICAgIGNvbnN0IGNlbnRlciA9IHJlc3VsdC5jZW50ZXI7CiAgICAgICAgY2VudGVyLnggPSBsb3dlckxlZnQueCArIHdpZHRoICogMC41OwogICAgICAgIGNlbnRlci55ID0gbG93ZXJMZWZ0LnkgKyBoZWlnaHQgKiAwLjU7CiAgICAgICAgY2VudGVyLnogPSBsb3dlckxlZnQueiArIGVsZXZhdGlvbiAqIDAuNTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBmcm9tUmVjdGFuZ2xlM0RTY3JhdGNoID0gW107CiAgICAgIEJvdW5kaW5nU3BoZXJlLmZyb21SZWN0YW5nbGUzRCA9IGZ1bmN0aW9uKHJlY3RhbmdsZSwgZWxsaXBzb2lkLCBzdXJmYWNlSGVpZ2h0LCByZXN1bHQpIHsKICAgICAgICBlbGxpcHNvaWQgPSBlbGxpcHNvaWQgPz8gRWxsaXBzb2lkX2RlZmF1bHQuZGVmYXVsdDsKICAgICAgICBzdXJmYWNlSGVpZ2h0ID0gc3VyZmFjZUhlaWdodCA/PyAwOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBCb3VuZGluZ1NwaGVyZSgpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZWN0YW5nbGUpKSB7CiAgICAgICAgICByZXN1bHQuY2VudGVyID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPLCByZXN1bHQuY2VudGVyKTsKICAgICAgICAgIHJlc3VsdC5yYWRpdXMgPSAwOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gUmVjdGFuZ2xlX2RlZmF1bHQuc3Vic2FtcGxlKAogICAgICAgICAgcmVjdGFuZ2xlLAogICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgc3VyZmFjZUhlaWdodCwKICAgICAgICAgIGZyb21SZWN0YW5nbGUzRFNjcmF0Y2gKICAgICAgICApOwogICAgICAgIHJldHVybiBCb3VuZGluZ1NwaGVyZS5mcm9tUG9pbnRzKHBvc2l0aW9ucywgcmVzdWx0KTsKICAgICAgfTsKICAgICAgQm91bmRpbmdTcGhlcmUuZnJvbVZlcnRpY2VzID0gZnVuY3Rpb24ocG9zaXRpb25zLCBjZW50ZXIsIHN0cmlkZSwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IEJvdW5kaW5nU3BoZXJlKCk7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHBvc2l0aW9ucykgfHwgcG9zaXRpb25zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgcmVzdWx0LmNlbnRlciA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTywgcmVzdWx0LmNlbnRlcik7CiAgICAgICAgICByZXN1bHQucmFkaXVzID0gMDsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGNlbnRlciA9IGNlbnRlciA/PyBDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTzsKICAgICAgICBzdHJpZGUgPSBzdHJpZGUgPz8gMzsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygic3RyaWRlIiwgc3RyaWRlLCAzKTsKICAgICAgICBjb25zdCBjdXJyZW50UG9zID0gZnJvbVBvaW50c0N1cnJlbnRQb3M7CiAgICAgICAgY3VycmVudFBvcy54ID0gcG9zaXRpb25zWzBdICsgY2VudGVyLng7CiAgICAgICAgY3VycmVudFBvcy55ID0gcG9zaXRpb25zWzFdICsgY2VudGVyLnk7CiAgICAgICAgY3VycmVudFBvcy56ID0gcG9zaXRpb25zWzJdICsgY2VudGVyLno7CiAgICAgICAgY29uc3QgeE1pbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShjdXJyZW50UG9zLCBmcm9tUG9pbnRzWE1pbik7CiAgICAgICAgY29uc3QgeU1pbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShjdXJyZW50UG9zLCBmcm9tUG9pbnRzWU1pbik7CiAgICAgICAgY29uc3Qgek1pbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShjdXJyZW50UG9zLCBmcm9tUG9pbnRzWk1pbik7CiAgICAgICAgY29uc3QgeE1heCA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShjdXJyZW50UG9zLCBmcm9tUG9pbnRzWE1heCk7CiAgICAgICAgY29uc3QgeU1heCA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShjdXJyZW50UG9zLCBmcm9tUG9pbnRzWU1heCk7CiAgICAgICAgY29uc3Qgek1heCA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShjdXJyZW50UG9zLCBmcm9tUG9pbnRzWk1heCk7CiAgICAgICAgY29uc3QgbnVtRWxlbWVudHMgPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGxldCBpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1FbGVtZW50czsgaSArPSBzdHJpZGUpIHsKICAgICAgICAgIGNvbnN0IHggPSBwb3NpdGlvbnNbaV0gKyBjZW50ZXIueDsKICAgICAgICAgIGNvbnN0IHkgPSBwb3NpdGlvbnNbaSArIDFdICsgY2VudGVyLnk7CiAgICAgICAgICBjb25zdCB6ID0gcG9zaXRpb25zW2kgKyAyXSArIGNlbnRlci56OwogICAgICAgICAgY3VycmVudFBvcy54ID0geDsKICAgICAgICAgIGN1cnJlbnRQb3MueSA9IHk7CiAgICAgICAgICBjdXJyZW50UG9zLnogPSB6OwogICAgICAgICAgaWYgKHggPCB4TWluLngpIHsKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGN1cnJlbnRQb3MsIHhNaW4pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHggPiB4TWF4LngpIHsKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGN1cnJlbnRQb3MsIHhNYXgpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHkgPCB5TWluLnkpIHsKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGN1cnJlbnRQb3MsIHlNaW4pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHkgPiB5TWF4LnkpIHsKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGN1cnJlbnRQb3MsIHlNYXgpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHogPCB6TWluLnopIHsKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGN1cnJlbnRQb3MsIHpNaW4pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHogPiB6TWF4LnopIHsKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGN1cnJlbnRQb3MsIHpNYXgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCB4U3BhbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGVTcXVhcmVkKAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KHhNYXgsIHhNaW4sIGZyb21Qb2ludHNTY3JhdGNoKQogICAgICAgICk7CiAgICAgICAgY29uc3QgeVNwYW4gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlU3F1YXJlZCgKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdCh5TWF4LCB5TWluLCBmcm9tUG9pbnRzU2NyYXRjaCkKICAgICAgICApOwogICAgICAgIGNvbnN0IHpTcGFuID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZVNxdWFyZWQoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3Qoek1heCwgek1pbiwgZnJvbVBvaW50c1NjcmF0Y2gpCiAgICAgICAgKTsKICAgICAgICBsZXQgZGlhbWV0ZXIxID0geE1pbjsKICAgICAgICBsZXQgZGlhbWV0ZXIyID0geE1heDsKICAgICAgICBsZXQgbWF4U3BhbiA9IHhTcGFuOwogICAgICAgIGlmICh5U3BhbiA+IG1heFNwYW4pIHsKICAgICAgICAgIG1heFNwYW4gPSB5U3BhbjsKICAgICAgICAgIGRpYW1ldGVyMSA9IHlNaW47CiAgICAgICAgICBkaWFtZXRlcjIgPSB5TWF4OwogICAgICAgIH0KICAgICAgICBpZiAoelNwYW4gPiBtYXhTcGFuKSB7CiAgICAgICAgICBtYXhTcGFuID0gelNwYW47CiAgICAgICAgICBkaWFtZXRlcjEgPSB6TWluOwogICAgICAgICAgZGlhbWV0ZXIyID0gek1heDsKICAgICAgICB9CiAgICAgICAgY29uc3Qgcml0dGVyQ2VudGVyID0gZnJvbVBvaW50c1JpdHRlckNlbnRlcjsKICAgICAgICByaXR0ZXJDZW50ZXIueCA9IChkaWFtZXRlcjEueCArIGRpYW1ldGVyMi54KSAqIDAuNTsKICAgICAgICByaXR0ZXJDZW50ZXIueSA9IChkaWFtZXRlcjEueSArIGRpYW1ldGVyMi55KSAqIDAuNTsKICAgICAgICByaXR0ZXJDZW50ZXIueiA9IChkaWFtZXRlcjEueiArIGRpYW1ldGVyMi56KSAqIDAuNTsKICAgICAgICBsZXQgcmFkaXVzU3F1YXJlZCA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGVTcXVhcmVkKAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KGRpYW1ldGVyMiwgcml0dGVyQ2VudGVyLCBmcm9tUG9pbnRzU2NyYXRjaCkKICAgICAgICApOwogICAgICAgIGxldCByaXR0ZXJSYWRpdXMgPSBNYXRoLnNxcnQocmFkaXVzU3F1YXJlZCk7CiAgICAgICAgY29uc3QgbWluQm94UHQgPSBmcm9tUG9pbnRzTWluQm94UHQ7CiAgICAgICAgbWluQm94UHQueCA9IHhNaW4ueDsKICAgICAgICBtaW5Cb3hQdC55ID0geU1pbi55OwogICAgICAgIG1pbkJveFB0LnogPSB6TWluLno7CiAgICAgICAgY29uc3QgbWF4Qm94UHQgPSBmcm9tUG9pbnRzTWF4Qm94UHQ7CiAgICAgICAgbWF4Qm94UHQueCA9IHhNYXgueDsKICAgICAgICBtYXhCb3hQdC55ID0geU1heC55OwogICAgICAgIG1heEJveFB0LnogPSB6TWF4Lno7CiAgICAgICAgY29uc3QgbmFpdmVDZW50ZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWlkcG9pbnQoCiAgICAgICAgICBtaW5Cb3hQdCwKICAgICAgICAgIG1heEJveFB0LAogICAgICAgICAgZnJvbVBvaW50c05haXZlQ2VudGVyU2NyYXRjaAogICAgICAgICk7CiAgICAgICAgbGV0IG5haXZlUmFkaXVzID0gMDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtRWxlbWVudHM7IGkgKz0gc3RyaWRlKSB7CiAgICAgICAgICBjdXJyZW50UG9zLnggPSBwb3NpdGlvbnNbaV0gKyBjZW50ZXIueDsKICAgICAgICAgIGN1cnJlbnRQb3MueSA9IHBvc2l0aW9uc1tpICsgMV0gKyBjZW50ZXIueTsKICAgICAgICAgIGN1cnJlbnRQb3MueiA9IHBvc2l0aW9uc1tpICsgMl0gKyBjZW50ZXIuejsKICAgICAgICAgIGNvbnN0IHIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlKAogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoY3VycmVudFBvcywgbmFpdmVDZW50ZXIsIGZyb21Qb2ludHNTY3JhdGNoKQogICAgICAgICAgKTsKICAgICAgICAgIGlmIChyID4gbmFpdmVSYWRpdXMpIHsKICAgICAgICAgICAgbmFpdmVSYWRpdXMgPSByOwogICAgICAgICAgfQogICAgICAgICAgY29uc3Qgb2xkQ2VudGVyVG9Qb2ludFNxdWFyZWQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlU3F1YXJlZCgKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KGN1cnJlbnRQb3MsIHJpdHRlckNlbnRlciwgZnJvbVBvaW50c1NjcmF0Y2gpCiAgICAgICAgICApOwogICAgICAgICAgaWYgKG9sZENlbnRlclRvUG9pbnRTcXVhcmVkID4gcmFkaXVzU3F1YXJlZCkgewogICAgICAgICAgICBjb25zdCBvbGRDZW50ZXJUb1BvaW50ID0gTWF0aC5zcXJ0KG9sZENlbnRlclRvUG9pbnRTcXVhcmVkKTsKICAgICAgICAgICAgcml0dGVyUmFkaXVzID0gKHJpdHRlclJhZGl1cyArIG9sZENlbnRlclRvUG9pbnQpICogMC41OwogICAgICAgICAgICByYWRpdXNTcXVhcmVkID0gcml0dGVyUmFkaXVzICogcml0dGVyUmFkaXVzOwogICAgICAgICAgICBjb25zdCBvbGRUb05ldyA9IG9sZENlbnRlclRvUG9pbnQgLSByaXR0ZXJSYWRpdXM7CiAgICAgICAgICAgIHJpdHRlckNlbnRlci54ID0gKHJpdHRlclJhZGl1cyAqIHJpdHRlckNlbnRlci54ICsgb2xkVG9OZXcgKiBjdXJyZW50UG9zLngpIC8gb2xkQ2VudGVyVG9Qb2ludDsKICAgICAgICAgICAgcml0dGVyQ2VudGVyLnkgPSAocml0dGVyUmFkaXVzICogcml0dGVyQ2VudGVyLnkgKyBvbGRUb05ldyAqIGN1cnJlbnRQb3MueSkgLyBvbGRDZW50ZXJUb1BvaW50OwogICAgICAgICAgICByaXR0ZXJDZW50ZXIueiA9IChyaXR0ZXJSYWRpdXMgKiByaXR0ZXJDZW50ZXIueiArIG9sZFRvTmV3ICogY3VycmVudFBvcy56KSAvIG9sZENlbnRlclRvUG9pbnQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChyaXR0ZXJSYWRpdXMgPCBuYWl2ZVJhZGl1cykgewogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKHJpdHRlckNlbnRlciwgcmVzdWx0LmNlbnRlcik7CiAgICAgICAgICByZXN1bHQucmFkaXVzID0gcml0dGVyUmFkaXVzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUobmFpdmVDZW50ZXIsIHJlc3VsdC5jZW50ZXIpOwogICAgICAgICAgcmVzdWx0LnJhZGl1cyA9IG5haXZlUmFkaXVzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBCb3VuZGluZ1NwaGVyZS5mcm9tRW5jb2RlZENhcnRlc2lhblZlcnRpY2VzID0gZnVuY3Rpb24ocG9zaXRpb25zSGlnaCwgcG9zaXRpb25zTG93LCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQm91bmRpbmdTcGhlcmUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocG9zaXRpb25zSGlnaCkgfHwgIWRlZmluZWRfZGVmYXVsdChwb3NpdGlvbnNMb3cpIHx8IHBvc2l0aW9uc0hpZ2gubGVuZ3RoICE9PSBwb3NpdGlvbnNMb3cubGVuZ3RoIHx8IHBvc2l0aW9uc0hpZ2gubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXN1bHQuY2VudGVyID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPLCByZXN1bHQuY2VudGVyKTsKICAgICAgICAgIHJlc3VsdC5yYWRpdXMgPSAwOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgY29uc3QgY3VycmVudFBvcyA9IGZyb21Qb2ludHNDdXJyZW50UG9zOwogICAgICAgIGN1cnJlbnRQb3MueCA9IHBvc2l0aW9uc0hpZ2hbMF0gKyBwb3NpdGlvbnNMb3dbMF07CiAgICAgICAgY3VycmVudFBvcy55ID0gcG9zaXRpb25zSGlnaFsxXSArIHBvc2l0aW9uc0xvd1sxXTsKICAgICAgICBjdXJyZW50UG9zLnogPSBwb3NpdGlvbnNIaWdoWzJdICsgcG9zaXRpb25zTG93WzJdOwogICAgICAgIGNvbnN0IHhNaW4gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgZnJvbVBvaW50c1hNaW4pOwogICAgICAgIGNvbnN0IHlNaW4gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgZnJvbVBvaW50c1lNaW4pOwogICAgICAgIGNvbnN0IHpNaW4gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgZnJvbVBvaW50c1pNaW4pOwogICAgICAgIGNvbnN0IHhNYXggPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgZnJvbVBvaW50c1hNYXgpOwogICAgICAgIGNvbnN0IHlNYXggPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgZnJvbVBvaW50c1lNYXgpOwogICAgICAgIGNvbnN0IHpNYXggPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgZnJvbVBvaW50c1pNYXgpOwogICAgICAgIGNvbnN0IG51bUVsZW1lbnRzID0gcG9zaXRpb25zSGlnaC5sZW5ndGg7CiAgICAgICAgbGV0IGk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUVsZW1lbnRzOyBpICs9IDMpIHsKICAgICAgICAgIGNvbnN0IHggPSBwb3NpdGlvbnNIaWdoW2ldICsgcG9zaXRpb25zTG93W2ldOwogICAgICAgICAgY29uc3QgeSA9IHBvc2l0aW9uc0hpZ2hbaSArIDFdICsgcG9zaXRpb25zTG93W2kgKyAxXTsKICAgICAgICAgIGNvbnN0IHogPSBwb3NpdGlvbnNIaWdoW2kgKyAyXSArIHBvc2l0aW9uc0xvd1tpICsgMl07CiAgICAgICAgICBjdXJyZW50UG9zLnggPSB4OwogICAgICAgICAgY3VycmVudFBvcy55ID0geTsKICAgICAgICAgIGN1cnJlbnRQb3MueiA9IHo7CiAgICAgICAgICBpZiAoeCA8IHhNaW4ueCkgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgeE1pbik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoeCA+IHhNYXgueCkgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgeE1heCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoeSA8IHlNaW4ueSkgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgeU1pbik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoeSA+IHlNYXgueSkgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgeU1heCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoeiA8IHpNaW4ueikgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgek1pbik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoeiA+IHpNYXgueikgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY3VycmVudFBvcywgek1heCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHhTcGFuID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZVNxdWFyZWQoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoeE1heCwgeE1pbiwgZnJvbVBvaW50c1NjcmF0Y2gpCiAgICAgICAgKTsKICAgICAgICBjb25zdCB5U3BhbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGVTcXVhcmVkKAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KHlNYXgsIHlNaW4sIGZyb21Qb2ludHNTY3JhdGNoKQogICAgICAgICk7CiAgICAgICAgY29uc3QgelNwYW4gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlU3F1YXJlZCgKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdCh6TWF4LCB6TWluLCBmcm9tUG9pbnRzU2NyYXRjaCkKICAgICAgICApOwogICAgICAgIGxldCBkaWFtZXRlcjEgPSB4TWluOwogICAgICAgIGxldCBkaWFtZXRlcjIgPSB4TWF4OwogICAgICAgIGxldCBtYXhTcGFuID0geFNwYW47CiAgICAgICAgaWYgKHlTcGFuID4gbWF4U3BhbikgewogICAgICAgICAgbWF4U3BhbiA9IHlTcGFuOwogICAgICAgICAgZGlhbWV0ZXIxID0geU1pbjsKICAgICAgICAgIGRpYW1ldGVyMiA9IHlNYXg7CiAgICAgICAgfQogICAgICAgIGlmICh6U3BhbiA+IG1heFNwYW4pIHsKICAgICAgICAgIG1heFNwYW4gPSB6U3BhbjsKICAgICAgICAgIGRpYW1ldGVyMSA9IHpNaW47CiAgICAgICAgICBkaWFtZXRlcjIgPSB6TWF4OwogICAgICAgIH0KICAgICAgICBjb25zdCByaXR0ZXJDZW50ZXIgPSBmcm9tUG9pbnRzUml0dGVyQ2VudGVyOwogICAgICAgIHJpdHRlckNlbnRlci54ID0gKGRpYW1ldGVyMS54ICsgZGlhbWV0ZXIyLngpICogMC41OwogICAgICAgIHJpdHRlckNlbnRlci55ID0gKGRpYW1ldGVyMS55ICsgZGlhbWV0ZXIyLnkpICogMC41OwogICAgICAgIHJpdHRlckNlbnRlci56ID0gKGRpYW1ldGVyMS56ICsgZGlhbWV0ZXIyLnopICogMC41OwogICAgICAgIGxldCByYWRpdXNTcXVhcmVkID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZVNxdWFyZWQoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoZGlhbWV0ZXIyLCByaXR0ZXJDZW50ZXIsIGZyb21Qb2ludHNTY3JhdGNoKQogICAgICAgICk7CiAgICAgICAgbGV0IHJpdHRlclJhZGl1cyA9IE1hdGguc3FydChyYWRpdXNTcXVhcmVkKTsKICAgICAgICBjb25zdCBtaW5Cb3hQdCA9IGZyb21Qb2ludHNNaW5Cb3hQdDsKICAgICAgICBtaW5Cb3hQdC54ID0geE1pbi54OwogICAgICAgIG1pbkJveFB0LnkgPSB5TWluLnk7CiAgICAgICAgbWluQm94UHQueiA9IHpNaW4uejsKICAgICAgICBjb25zdCBtYXhCb3hQdCA9IGZyb21Qb2ludHNNYXhCb3hQdDsKICAgICAgICBtYXhCb3hQdC54ID0geE1heC54OwogICAgICAgIG1heEJveFB0LnkgPSB5TWF4Lnk7CiAgICAgICAgbWF4Qm94UHQueiA9IHpNYXguejsKICAgICAgICBjb25zdCBuYWl2ZUNlbnRlciA9IENhcnRlc2lhbjNfZGVmYXVsdC5taWRwb2ludCgKICAgICAgICAgIG1pbkJveFB0LAogICAgICAgICAgbWF4Qm94UHQsCiAgICAgICAgICBmcm9tUG9pbnRzTmFpdmVDZW50ZXJTY3JhdGNoCiAgICAgICAgKTsKICAgICAgICBsZXQgbmFpdmVSYWRpdXMgPSAwOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1FbGVtZW50czsgaSArPSAzKSB7CiAgICAgICAgICBjdXJyZW50UG9zLnggPSBwb3NpdGlvbnNIaWdoW2ldICsgcG9zaXRpb25zTG93W2ldOwogICAgICAgICAgY3VycmVudFBvcy55ID0gcG9zaXRpb25zSGlnaFtpICsgMV0gKyBwb3NpdGlvbnNMb3dbaSArIDFdOwogICAgICAgICAgY3VycmVudFBvcy56ID0gcG9zaXRpb25zSGlnaFtpICsgMl0gKyBwb3NpdGlvbnNMb3dbaSArIDJdOwogICAgICAgICAgY29uc3QgciA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUoCiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChjdXJyZW50UG9zLCBuYWl2ZUNlbnRlciwgZnJvbVBvaW50c1NjcmF0Y2gpCiAgICAgICAgICApOwogICAgICAgICAgaWYgKHIgPiBuYWl2ZVJhZGl1cykgewogICAgICAgICAgICBuYWl2ZVJhZGl1cyA9IHI7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBvbGRDZW50ZXJUb1BvaW50U3F1YXJlZCA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGVTcXVhcmVkKAogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoY3VycmVudFBvcywgcml0dGVyQ2VudGVyLCBmcm9tUG9pbnRzU2NyYXRjaCkKICAgICAgICAgICk7CiAgICAgICAgICBpZiAob2xkQ2VudGVyVG9Qb2ludFNxdWFyZWQgPiByYWRpdXNTcXVhcmVkKSB7CiAgICAgICAgICAgIGNvbnN0IG9sZENlbnRlclRvUG9pbnQgPSBNYXRoLnNxcnQob2xkQ2VudGVyVG9Qb2ludFNxdWFyZWQpOwogICAgICAgICAgICByaXR0ZXJSYWRpdXMgPSAocml0dGVyUmFkaXVzICsgb2xkQ2VudGVyVG9Qb2ludCkgKiAwLjU7CiAgICAgICAgICAgIHJhZGl1c1NxdWFyZWQgPSByaXR0ZXJSYWRpdXMgKiByaXR0ZXJSYWRpdXM7CiAgICAgICAgICAgIGNvbnN0IG9sZFRvTmV3ID0gb2xkQ2VudGVyVG9Qb2ludCAtIHJpdHRlclJhZGl1czsKICAgICAgICAgICAgcml0dGVyQ2VudGVyLnggPSAocml0dGVyUmFkaXVzICogcml0dGVyQ2VudGVyLnggKyBvbGRUb05ldyAqIGN1cnJlbnRQb3MueCkgLyBvbGRDZW50ZXJUb1BvaW50OwogICAgICAgICAgICByaXR0ZXJDZW50ZXIueSA9IChyaXR0ZXJSYWRpdXMgKiByaXR0ZXJDZW50ZXIueSArIG9sZFRvTmV3ICogY3VycmVudFBvcy55KSAvIG9sZENlbnRlclRvUG9pbnQ7CiAgICAgICAgICAgIHJpdHRlckNlbnRlci56ID0gKHJpdHRlclJhZGl1cyAqIHJpdHRlckNlbnRlci56ICsgb2xkVG9OZXcgKiBjdXJyZW50UG9zLnopIC8gb2xkQ2VudGVyVG9Qb2ludDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHJpdHRlclJhZGl1cyA8IG5haXZlUmFkaXVzKSB7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUocml0dGVyQ2VudGVyLCByZXN1bHQuY2VudGVyKTsKICAgICAgICAgIHJlc3VsdC5yYWRpdXMgPSByaXR0ZXJSYWRpdXM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShuYWl2ZUNlbnRlciwgcmVzdWx0LmNlbnRlcik7CiAgICAgICAgICByZXN1bHQucmFkaXVzID0gbmFpdmVSYWRpdXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEJvdW5kaW5nU3BoZXJlLmZyb21Db3JuZXJQb2ludHMgPSBmdW5jdGlvbihjb3JuZXIsIG9wcG9zaXRlQ29ybmVyLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNvcm5lciIsIGNvcm5lcik7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJvcHBvc2l0ZUNvcm5lciIsIG9wcG9zaXRlQ29ybmVyKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQm91bmRpbmdTcGhlcmUoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgY2VudGVyID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1pZHBvaW50KGNvcm5lciwgb3Bwb3NpdGVDb3JuZXIsIHJlc3VsdC5jZW50ZXIpOwogICAgICAgIHJlc3VsdC5yYWRpdXMgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZGlzdGFuY2UoY2VudGVyLCBvcHBvc2l0ZUNvcm5lcik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQm91bmRpbmdTcGhlcmUuZnJvbUVsbGlwc29pZCA9IGZ1bmN0aW9uKGVsbGlwc29pZCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJlbGxpcHNvaWQiLCBlbGxpcHNvaWQpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBCb3VuZGluZ1NwaGVyZSgpOwogICAgICAgIH0KICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8sIHJlc3VsdC5jZW50ZXIpOwogICAgICAgIHJlc3VsdC5yYWRpdXMgPSBlbGxpcHNvaWQubWF4aW11bVJhZGl1czsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBmcm9tQm91bmRpbmdTcGhlcmVzU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgQm91bmRpbmdTcGhlcmUuZnJvbUJvdW5kaW5nU3BoZXJlcyA9IGZ1bmN0aW9uKGJvdW5kaW5nU3BoZXJlcywgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IEJvdW5kaW5nU3BoZXJlKCk7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGJvdW5kaW5nU3BoZXJlcykgfHwgYm91bmRpbmdTcGhlcmVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgcmVzdWx0LmNlbnRlciA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTywgcmVzdWx0LmNlbnRlcik7CiAgICAgICAgICByZXN1bHQucmFkaXVzID0gMDsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxlbmd0aCA9IGJvdW5kaW5nU3BoZXJlcy5sZW5ndGg7CiAgICAgICAgaWYgKGxlbmd0aCA9PT0gMSkgewogICAgICAgICAgcmV0dXJuIEJvdW5kaW5nU3BoZXJlLmNsb25lKGJvdW5kaW5nU3BoZXJlc1swXSwgcmVzdWx0KTsKICAgICAgICB9CiAgICAgICAgaWYgKGxlbmd0aCA9PT0gMikgewogICAgICAgICAgcmV0dXJuIEJvdW5kaW5nU3BoZXJlLnVuaW9uKGJvdW5kaW5nU3BoZXJlc1swXSwgYm91bmRpbmdTcGhlcmVzWzFdLCByZXN1bHQpOwogICAgICAgIH0KICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBbXTsKICAgICAgICBsZXQgaTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKGJvdW5kaW5nU3BoZXJlc1tpXS5jZW50ZXIpOwogICAgICAgIH0KICAgICAgICByZXN1bHQgPSBCb3VuZGluZ1NwaGVyZS5mcm9tUG9pbnRzKHBvc2l0aW9ucywgcmVzdWx0KTsKICAgICAgICBjb25zdCBjZW50ZXIgPSByZXN1bHQuY2VudGVyOwogICAgICAgIGxldCByYWRpdXMgPSByZXN1bHQucmFkaXVzOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgdG1wMiA9IGJvdW5kaW5nU3BoZXJlc1tpXTsKICAgICAgICAgIHJhZGl1cyA9IE1hdGgubWF4KAogICAgICAgICAgICByYWRpdXMsCiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5kaXN0YW5jZShjZW50ZXIsIHRtcDIuY2VudGVyLCBmcm9tQm91bmRpbmdTcGhlcmVzU2NyYXRjaCkgKyB0bXAyLnJhZGl1cwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnJhZGl1cyA9IHJhZGl1czsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBmcm9tT3JpZW50ZWRCb3VuZGluZ0JveFNjcmF0Y2hVID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBmcm9tT3JpZW50ZWRCb3VuZGluZ0JveFNjcmF0Y2hWID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBmcm9tT3JpZW50ZWRCb3VuZGluZ0JveFNjcmF0Y2hXID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBCb3VuZGluZ1NwaGVyZS5mcm9tT3JpZW50ZWRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uKG9yaWVudGVkQm91bmRpbmdCb3gsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgib3JpZW50ZWRCb3VuZGluZ0JveCIsIG9yaWVudGVkQm91bmRpbmdCb3gpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBCb3VuZGluZ1NwaGVyZSgpOwogICAgICAgIH0KICAgICAgICBjb25zdCBoYWxmQXhlcyA9IG9yaWVudGVkQm91bmRpbmdCb3guaGFsZkF4ZXM7CiAgICAgICAgY29uc3QgdTMgPSBNYXRyaXgzX2RlZmF1bHQuZ2V0Q29sdW1uKGhhbGZBeGVzLCAwLCBmcm9tT3JpZW50ZWRCb3VuZGluZ0JveFNjcmF0Y2hVKTsKICAgICAgICBjb25zdCB2MyA9IE1hdHJpeDNfZGVmYXVsdC5nZXRDb2x1bW4oaGFsZkF4ZXMsIDEsIGZyb21PcmllbnRlZEJvdW5kaW5nQm94U2NyYXRjaFYpOwogICAgICAgIGNvbnN0IHcgPSBNYXRyaXgzX2RlZmF1bHQuZ2V0Q29sdW1uKGhhbGZBeGVzLCAyLCBmcm9tT3JpZW50ZWRCb3VuZGluZ0JveFNjcmF0Y2hXKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHUzLCB2MywgdTMpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQodTMsIHcsIHUzKTsKICAgICAgICByZXN1bHQuY2VudGVyID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKG9yaWVudGVkQm91bmRpbmdCb3guY2VudGVyLCByZXN1bHQuY2VudGVyKTsKICAgICAgICByZXN1bHQucmFkaXVzID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZSh1Myk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgc2NyYXRjaEZyb21UcmFuc2Zvcm1hdGlvbkNlbnRlciA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaEZyb21UcmFuc2Zvcm1hdGlvblNjYWxlID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBCb3VuZGluZ1NwaGVyZS5mcm9tVHJhbnNmb3JtYXRpb24gPSBmdW5jdGlvbih0cmFuc2Zvcm1hdGlvbiwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ0cmFuc2Zvcm1hdGlvbiIsIHRyYW5zZm9ybWF0aW9uKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQm91bmRpbmdTcGhlcmUoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgY2VudGVyID0gTWF0cml4NF9kZWZhdWx0LmdldFRyYW5zbGF0aW9uKAogICAgICAgICAgdHJhbnNmb3JtYXRpb24sCiAgICAgICAgICBzY3JhdGNoRnJvbVRyYW5zZm9ybWF0aW9uQ2VudGVyCiAgICAgICAgKTsKICAgICAgICBjb25zdCBzY2FsZSA9IE1hdHJpeDRfZGVmYXVsdC5nZXRTY2FsZSgKICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLAogICAgICAgICAgc2NyYXRjaEZyb21UcmFuc2Zvcm1hdGlvblNjYWxlCiAgICAgICAgKTsKICAgICAgICBjb25zdCByYWRpdXMgPSAwLjUgKiBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlKHNjYWxlKTsKICAgICAgICByZXN1bHQuY2VudGVyID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGNlbnRlciwgcmVzdWx0LmNlbnRlcik7CiAgICAgICAgcmVzdWx0LnJhZGl1cyA9IHJhZGl1czsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBCb3VuZGluZ1NwaGVyZS5jbG9uZSA9IGZ1bmN0aW9uKHNwaGVyZSwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoc3BoZXJlKSkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBCb3VuZGluZ1NwaGVyZShzcGhlcmUuY2VudGVyLCBzcGhlcmUucmFkaXVzKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LmNlbnRlciA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShzcGhlcmUuY2VudGVyLCByZXN1bHQuY2VudGVyKTsKICAgICAgICByZXN1bHQucmFkaXVzID0gc3BoZXJlLnJhZGl1czsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBCb3VuZGluZ1NwaGVyZS5wYWNrZWRMZW5ndGggPSA0OwogICAgICBCb3VuZGluZ1NwaGVyZS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgY29uc3QgY2VudGVyID0gdmFsdWUuY2VudGVyOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSBjZW50ZXIueDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gY2VudGVyLnk7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IGNlbnRlci56OwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXhdID0gdmFsdWUucmFkaXVzOwogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfTsKICAgICAgQm91bmRpbmdTcGhlcmUudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQm91bmRpbmdTcGhlcmUoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgY2VudGVyID0gcmVzdWx0LmNlbnRlcjsKICAgICAgICBjZW50ZXIueCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY2VudGVyLnkgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNlbnRlci56ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICByZXN1bHQucmFkaXVzID0gYXJyYXlbc3RhcnRpbmdJbmRleF07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgdW5pb25TY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICB1bmlvblNjcmF0Y2hDZW50ZXIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIEJvdW5kaW5nU3BoZXJlLnVuaW9uID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IEJvdW5kaW5nU3BoZXJlKCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxlZnRDZW50ZXIgPSBsZWZ0LmNlbnRlcjsKICAgICAgICBjb25zdCBsZWZ0UmFkaXVzID0gbGVmdC5yYWRpdXM7CiAgICAgICAgY29uc3QgcmlnaHRDZW50ZXIgPSByaWdodC5jZW50ZXI7CiAgICAgICAgY29uc3QgcmlnaHRSYWRpdXMgPSByaWdodC5yYWRpdXM7CiAgICAgICAgY29uc3QgdG9SaWdodENlbnRlciA9IENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdCgKICAgICAgICAgIHJpZ2h0Q2VudGVyLAogICAgICAgICAgbGVmdENlbnRlciwKICAgICAgICAgIHVuaW9uU2NyYXRjaAogICAgICAgICk7CiAgICAgICAgY29uc3QgY2VudGVyU2VwYXJhdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUodG9SaWdodENlbnRlcik7CiAgICAgICAgaWYgKGxlZnRSYWRpdXMgPj0gY2VudGVyU2VwYXJhdGlvbiArIHJpZ2h0UmFkaXVzKSB7CiAgICAgICAgICBsZWZ0LmNsb25lKHJlc3VsdCk7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICBpZiAocmlnaHRSYWRpdXMgPj0gY2VudGVyU2VwYXJhdGlvbiArIGxlZnRSYWRpdXMpIHsKICAgICAgICAgIHJpZ2h0LmNsb25lKHJlc3VsdCk7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICBjb25zdCBoYWxmRGlzdGFuY2VCZXR3ZWVuVGFuZ2VudFBvaW50cyA9IChsZWZ0UmFkaXVzICsgY2VudGVyU2VwYXJhdGlvbiArIHJpZ2h0UmFkaXVzKSAqIDAuNTsKICAgICAgICBjb25zdCBjZW50ZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcigKICAgICAgICAgIHRvUmlnaHRDZW50ZXIsCiAgICAgICAgICAoLWxlZnRSYWRpdXMgKyBoYWxmRGlzdGFuY2VCZXR3ZWVuVGFuZ2VudFBvaW50cykgLyBjZW50ZXJTZXBhcmF0aW9uLAogICAgICAgICAgdW5pb25TY3JhdGNoQ2VudGVyCiAgICAgICAgKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGNlbnRlciwgbGVmdENlbnRlciwgY2VudGVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY2VudGVyLCByZXN1bHQuY2VudGVyKTsKICAgICAgICByZXN1bHQucmFkaXVzID0gaGFsZkRpc3RhbmNlQmV0d2VlblRhbmdlbnRQb2ludHM7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgZXhwYW5kU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgQm91bmRpbmdTcGhlcmUuZXhwYW5kID0gZnVuY3Rpb24oc3BoZXJlLCBwb2ludCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJzcGhlcmUiLCBzcGhlcmUpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicG9pbnQiLCBwb2ludCk7CiAgICAgICAgcmVzdWx0ID0gQm91bmRpbmdTcGhlcmUuY2xvbmUoc3BoZXJlLCByZXN1bHQpOwogICAgICAgIGNvbnN0IHJhZGl1cyA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QocG9pbnQsIHJlc3VsdC5jZW50ZXIsIGV4cGFuZFNjcmF0Y2gpCiAgICAgICAgKTsKICAgICAgICBpZiAocmFkaXVzID4gcmVzdWx0LnJhZGl1cykgewogICAgICAgICAgcmVzdWx0LnJhZGl1cyA9IHJhZGl1czsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQm91bmRpbmdTcGhlcmUuaW50ZXJzZWN0UGxhbmUgPSBmdW5jdGlvbihzcGhlcmUsIHBsYW5lKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJzcGhlcmUiLCBzcGhlcmUpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicGxhbmUiLCBwbGFuZSk7CiAgICAgICAgY29uc3QgY2VudGVyID0gc3BoZXJlLmNlbnRlcjsKICAgICAgICBjb25zdCByYWRpdXMgPSBzcGhlcmUucmFkaXVzOwogICAgICAgIGNvbnN0IG5vcm1hbDIgPSBwbGFuZS5ub3JtYWw7CiAgICAgICAgY29uc3QgZGlzdGFuY2VUb1BsYW5lID0gQ2FydGVzaWFuM19kZWZhdWx0LmRvdChub3JtYWwyLCBjZW50ZXIpICsgcGxhbmUuZGlzdGFuY2U7CiAgICAgICAgaWYgKGRpc3RhbmNlVG9QbGFuZSA8IC1yYWRpdXMpIHsKICAgICAgICAgIHJldHVybiBJbnRlcnNlY3RfZGVmYXVsdC5PVVRTSURFOwogICAgICAgIH0gZWxzZSBpZiAoZGlzdGFuY2VUb1BsYW5lIDwgcmFkaXVzKSB7CiAgICAgICAgICByZXR1cm4gSW50ZXJzZWN0X2RlZmF1bHQuSU5URVJTRUNUSU5HOwogICAgICAgIH0KICAgICAgICByZXR1cm4gSW50ZXJzZWN0X2RlZmF1bHQuSU5TSURFOwogICAgICB9OwogICAgICBCb3VuZGluZ1NwaGVyZS50cmFuc2Zvcm0gPSBmdW5jdGlvbihzcGhlcmUsIHRyYW5zZm9ybTIsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic3BoZXJlIiwgc3BoZXJlKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInRyYW5zZm9ybSIsIHRyYW5zZm9ybTIpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBCb3VuZGluZ1NwaGVyZSgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQuY2VudGVyID0gTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5QnlQb2ludCgKICAgICAgICAgIHRyYW5zZm9ybTIsCiAgICAgICAgICBzcGhlcmUuY2VudGVyLAogICAgICAgICAgcmVzdWx0LmNlbnRlcgogICAgICAgICk7CiAgICAgICAgcmVzdWx0LnJhZGl1cyA9IE1hdHJpeDRfZGVmYXVsdC5nZXRNYXhpbXVtU2NhbGUodHJhbnNmb3JtMikgKiBzcGhlcmUucmFkaXVzOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIGRpc3RhbmNlU3F1YXJlZFRvU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgQm91bmRpbmdTcGhlcmUuZGlzdGFuY2VTcXVhcmVkVG8gPSBmdW5jdGlvbihzcGhlcmUsIGNhcnRlc2lhbjExKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJzcGhlcmUiLCBzcGhlcmUpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIGNvbnN0IGRpZmYgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoCiAgICAgICAgICBzcGhlcmUuY2VudGVyLAogICAgICAgICAgY2FydGVzaWFuMTEsCiAgICAgICAgICBkaXN0YW5jZVNxdWFyZWRUb1NjcmF0Y2gKICAgICAgICApOwogICAgICAgIGNvbnN0IGRpc3RhbmNlID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZShkaWZmKSAtIHNwaGVyZS5yYWRpdXM7CiAgICAgICAgaWYgKGRpc3RhbmNlIDw9IDApIHsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGlzdGFuY2UgKiBkaXN0YW5jZTsKICAgICAgfTsKICAgICAgQm91bmRpbmdTcGhlcmUudHJhbnNmb3JtV2l0aG91dFNjYWxlID0gZnVuY3Rpb24oc3BoZXJlLCB0cmFuc2Zvcm0yLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInNwaGVyZSIsIHNwaGVyZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ0cmFuc2Zvcm0iLCB0cmFuc2Zvcm0yKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQm91bmRpbmdTcGhlcmUoKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LmNlbnRlciA9IE1hdHJpeDRfZGVmYXVsdC5tdWx0aXBseUJ5UG9pbnQoCiAgICAgICAgICB0cmFuc2Zvcm0yLAogICAgICAgICAgc3BoZXJlLmNlbnRlciwKICAgICAgICAgIHJlc3VsdC5jZW50ZXIKICAgICAgICApOwogICAgICAgIHJlc3VsdC5yYWRpdXMgPSBzcGhlcmUucmFkaXVzOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBCb3VuZGluZ1NwaGVyZS5jb21wdXRlUGxhbmVEaXN0YW5jZXMgPSBmdW5jdGlvbihzcGhlcmUsIHBvc2l0aW9uLCBkaXJlY3Rpb24yLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInNwaGVyZSIsIHNwaGVyZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJwb3NpdGlvbiIsIHBvc2l0aW9uKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImRpcmVjdGlvbiIsIGRpcmVjdGlvbjIpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBJbnRlcnZhbF9kZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHRvQ2VudGVyID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KAogICAgICAgICAgc3BoZXJlLmNlbnRlciwKICAgICAgICAgIHBvc2l0aW9uLAogICAgICAgICAgc2NyYXRjaENhcnRlc2lhbjMKICAgICAgICApOwogICAgICAgIGNvbnN0IG1hZyA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoZGlyZWN0aW9uMiwgdG9DZW50ZXIpOwogICAgICAgIHJlc3VsdC5zdGFydCA9IG1hZyAtIHNwaGVyZS5yYWRpdXM7CiAgICAgICAgcmVzdWx0LnN0b3AgPSBtYWcgKyBzcGhlcmUucmFkaXVzOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHByb2plY3RUbzJETm9ybWFsU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgcHJvamVjdFRvMkRFYXN0U2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgcHJvamVjdFRvMkROb3J0aFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHByb2plY3RUbzJEV2VzdFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHByb2plY3RUbzJEU291dGhTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBwcm9qZWN0VG8yRENhcnRvZ3JhcGhpY1NjcmF0Y2ggPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgcHJvamVjdFRvMkRQb3NpdGlvbnNTY3JhdGNoID0gbmV3IEFycmF5KDgpOwogICAgICBmb3IgKGxldCBuID0gMDsgbiA8IDg7ICsrbikgewogICAgICAgIHByb2plY3RUbzJEUG9zaXRpb25zU2NyYXRjaFtuXSA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgfQogICAgICBwcm9qZWN0VG8yRFByb2plY3Rpb24gPSBuZXcgR2VvZ3JhcGhpY1Byb2plY3Rpb25fZGVmYXVsdCgpOwogICAgICBCb3VuZGluZ1NwaGVyZS5wcm9qZWN0VG8yRCA9IGZ1bmN0aW9uKHNwaGVyZSwgcHJvamVjdGlvbiwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJzcGhlcmUiLCBzcGhlcmUpOwogICAgICAgIHByb2plY3RUbzJEUHJvamVjdGlvbi5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuZGVmYXVsdDsKICAgICAgICBwcm9qZWN0aW9uID0gcHJvamVjdGlvbiA/PyBwcm9qZWN0VG8yRFByb2plY3Rpb247CiAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gcHJvamVjdGlvbi5lbGxpcHNvaWQ7CiAgICAgICAgbGV0IGNlbnRlciA9IHNwaGVyZS5jZW50ZXI7CiAgICAgICAgY29uc3QgcmFkaXVzID0gc3BoZXJlLnJhZGl1czsKICAgICAgICBsZXQgbm9ybWFsMjsKICAgICAgICBpZiAoQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFscyhjZW50ZXIsIENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPKSkgewogICAgICAgICAgbm9ybWFsMiA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9YLCBwcm9qZWN0VG8yRE5vcm1hbFNjcmF0Y2gpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub3JtYWwyID0gZWxsaXBzb2lkLmdlb2RldGljU3VyZmFjZU5vcm1hbChjZW50ZXIsIHByb2plY3RUbzJETm9ybWFsU2NyYXRjaCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVhc3QgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3MoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9aLAogICAgICAgICAgbm9ybWFsMiwKICAgICAgICAgIHByb2plY3RUbzJERWFzdFNjcmF0Y2gKICAgICAgICApOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoZWFzdCwgZWFzdCk7CiAgICAgICAgY29uc3Qgbm9ydGggPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3Mobm9ybWFsMiwgZWFzdCwgcHJvamVjdFRvMkROb3J0aFNjcmF0Y2gpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUobm9ydGgsIG5vcnRoKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihub3JtYWwyLCByYWRpdXMsIG5vcm1hbDIpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKG5vcnRoLCByYWRpdXMsIG5vcnRoKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihlYXN0LCByYWRpdXMsIGVhc3QpOwogICAgICAgIGNvbnN0IHNvdXRoID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZShub3J0aCwgcHJvamVjdFRvMkRTb3V0aFNjcmF0Y2gpOwogICAgICAgIGNvbnN0IHdlc3QgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKGVhc3QsIHByb2plY3RUbzJEV2VzdFNjcmF0Y2gpOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHByb2plY3RUbzJEUG9zaXRpb25zU2NyYXRjaDsKICAgICAgICBsZXQgY29ybmVyID0gcG9zaXRpb25zWzBdOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQobm9ybWFsMiwgbm9ydGgsIGNvcm5lcik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChjb3JuZXIsIGVhc3QsIGNvcm5lcik7CiAgICAgICAgY29ybmVyID0gcG9zaXRpb25zWzFdOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQobm9ybWFsMiwgbm9ydGgsIGNvcm5lcik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChjb3JuZXIsIHdlc3QsIGNvcm5lcik7CiAgICAgICAgY29ybmVyID0gcG9zaXRpb25zWzJdOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQobm9ybWFsMiwgc291dGgsIGNvcm5lcik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChjb3JuZXIsIHdlc3QsIGNvcm5lcik7CiAgICAgICAgY29ybmVyID0gcG9zaXRpb25zWzNdOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQobm9ybWFsMiwgc291dGgsIGNvcm5lcik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChjb3JuZXIsIGVhc3QsIGNvcm5lcik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZShub3JtYWwyLCBub3JtYWwyKTsKICAgICAgICBjb3JuZXIgPSBwb3NpdGlvbnNbNF07CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChub3JtYWwyLCBub3J0aCwgY29ybmVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGNvcm5lciwgZWFzdCwgY29ybmVyKTsKICAgICAgICBjb3JuZXIgPSBwb3NpdGlvbnNbNV07CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChub3JtYWwyLCBub3J0aCwgY29ybmVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGNvcm5lciwgd2VzdCwgY29ybmVyKTsKICAgICAgICBjb3JuZXIgPSBwb3NpdGlvbnNbNl07CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChub3JtYWwyLCBzb3V0aCwgY29ybmVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGNvcm5lciwgd2VzdCwgY29ybmVyKTsKICAgICAgICBjb3JuZXIgPSBwb3NpdGlvbnNbN107CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChub3JtYWwyLCBzb3V0aCwgY29ybmVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGNvcm5lciwgZWFzdCwgY29ybmVyKTsKICAgICAgICBjb25zdCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcG9zaXRpb25zW2ldOwogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChjZW50ZXIsIHBvc2l0aW9uLCBwb3NpdGlvbik7CiAgICAgICAgICBjb25zdCBjYXJ0b2dyYXBoaWMyID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKAogICAgICAgICAgICBwb3NpdGlvbiwKICAgICAgICAgICAgcHJvamVjdFRvMkRDYXJ0b2dyYXBoaWNTY3JhdGNoCiAgICAgICAgICApOwogICAgICAgICAgcHJvamVjdGlvbi5wcm9qZWN0KGNhcnRvZ3JhcGhpYzIsIHBvc2l0aW9uKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gQm91bmRpbmdTcGhlcmUuZnJvbVBvaW50cyhwb3NpdGlvbnMsIHJlc3VsdCk7CiAgICAgICAgY2VudGVyID0gcmVzdWx0LmNlbnRlcjsKICAgICAgICBjb25zdCB4ID0gY2VudGVyLng7CiAgICAgICAgY29uc3QgeSA9IGNlbnRlci55OwogICAgICAgIGNvbnN0IHogPSBjZW50ZXIuejsKICAgICAgICBjZW50ZXIueCA9IHo7CiAgICAgICAgY2VudGVyLnkgPSB4OwogICAgICAgIGNlbnRlci56ID0geTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBCb3VuZGluZ1NwaGVyZS5pc09jY2x1ZGVkID0gZnVuY3Rpb24oc3BoZXJlLCBvY2NsdWRlcikgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic3BoZXJlIiwgc3BoZXJlKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm9jY2x1ZGVyIiwgb2NjbHVkZXIpOwogICAgICAgIHJldHVybiAhb2NjbHVkZXIuaXNCb3VuZGluZ1NwaGVyZVZpc2libGUoc3BoZXJlKTsKICAgICAgfTsKICAgICAgQm91bmRpbmdTcGhlcmUuZXF1YWxzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQpIHsKICAgICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgZGVmaW5lZF9kZWZhdWx0KGxlZnQpICYmIGRlZmluZWRfZGVmYXVsdChyaWdodCkgJiYgQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFscyhsZWZ0LmNlbnRlciwgcmlnaHQuY2VudGVyKSAmJiBsZWZ0LnJhZGl1cyA9PT0gcmlnaHQucmFkaXVzOwogICAgICB9OwogICAgICBCb3VuZGluZ1NwaGVyZS5wcm90b3R5cGUuaW50ZXJzZWN0UGxhbmUgPSBmdW5jdGlvbihwbGFuZSkgewogICAgICAgIHJldHVybiBCb3VuZGluZ1NwaGVyZS5pbnRlcnNlY3RQbGFuZSh0aGlzLCBwbGFuZSk7CiAgICAgIH07CiAgICAgIEJvdW5kaW5nU3BoZXJlLnByb3RvdHlwZS5kaXN0YW5jZVNxdWFyZWRUbyA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExKSB7CiAgICAgICAgcmV0dXJuIEJvdW5kaW5nU3BoZXJlLmRpc3RhbmNlU3F1YXJlZFRvKHRoaXMsIGNhcnRlc2lhbjExKTsKICAgICAgfTsKICAgICAgQm91bmRpbmdTcGhlcmUucHJvdG90eXBlLmNvbXB1dGVQbGFuZURpc3RhbmNlcyA9IGZ1bmN0aW9uKHBvc2l0aW9uLCBkaXJlY3Rpb24yLCByZXN1bHQpIHsKICAgICAgICByZXR1cm4gQm91bmRpbmdTcGhlcmUuY29tcHV0ZVBsYW5lRGlzdGFuY2VzKAogICAgICAgICAgdGhpcywKICAgICAgICAgIHBvc2l0aW9uLAogICAgICAgICAgZGlyZWN0aW9uMiwKICAgICAgICAgIHJlc3VsdAogICAgICAgICk7CiAgICAgIH07CiAgICAgIEJvdW5kaW5nU3BoZXJlLnByb3RvdHlwZS5pc09jY2x1ZGVkID0gZnVuY3Rpb24ob2NjbHVkZXIpIHsKICAgICAgICByZXR1cm4gQm91bmRpbmdTcGhlcmUuaXNPY2NsdWRlZCh0aGlzLCBvY2NsdWRlcik7CiAgICAgIH07CiAgICAgIEJvdW5kaW5nU3BoZXJlLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbihyaWdodCkgewogICAgICAgIHJldHVybiBCb3VuZGluZ1NwaGVyZS5lcXVhbHModGhpcywgcmlnaHQpOwogICAgICB9OwogICAgICBCb3VuZGluZ1NwaGVyZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICByZXR1cm4gQm91bmRpbmdTcGhlcmUuY2xvbmUodGhpcywgcmVzdWx0KTsKICAgICAgfTsKICAgICAgQm91bmRpbmdTcGhlcmUucHJvdG90eXBlLnZvbHVtZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMucmFkaXVzOwogICAgICAgIHJldHVybiB2b2x1bWVDb25zdGFudCAqIHJhZGl1cyAqIHJhZGl1cyAqIHJhZGl1czsKICAgICAgfTsKICAgICAgQm91bmRpbmdTcGhlcmVfZGVmYXVsdCA9IEJvdW5kaW5nU3BoZXJlOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvV2ViR0xDb25zdGFudHMuanMKICB2YXIgV2ViR0xDb25zdGFudHMsIFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQ7CiAgdmFyIGluaXRfV2ViR0xDb25zdGFudHMgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1dlYkdMQ29uc3RhbnRzLmpzIigpIHsKICAgICAgV2ViR0xDb25zdGFudHMgPSB7CiAgICAgICAgREVQVEhfQlVGRkVSX0JJVDogMjU2LAogICAgICAgIFNURU5DSUxfQlVGRkVSX0JJVDogMTAyNCwKICAgICAgICBDT0xPUl9CVUZGRVJfQklUOiAxNjM4NCwKICAgICAgICBQT0lOVFM6IDAsCiAgICAgICAgTElORVM6IDEsCiAgICAgICAgTElORV9MT09QOiAyLAogICAgICAgIExJTkVfU1RSSVA6IDMsCiAgICAgICAgVFJJQU5HTEVTOiA0LAogICAgICAgIFRSSUFOR0xFX1NUUklQOiA1LAogICAgICAgIFRSSUFOR0xFX0ZBTjogNiwKICAgICAgICBaRVJPOiAwLAogICAgICAgIE9ORTogMSwKICAgICAgICBTUkNfQ09MT1I6IDc2OCwKICAgICAgICBPTkVfTUlOVVNfU1JDX0NPTE9SOiA3NjksCiAgICAgICAgU1JDX0FMUEhBOiA3NzAsCiAgICAgICAgT05FX01JTlVTX1NSQ19BTFBIQTogNzcxLAogICAgICAgIERTVF9BTFBIQTogNzcyLAogICAgICAgIE9ORV9NSU5VU19EU1RfQUxQSEE6IDc3MywKICAgICAgICBEU1RfQ09MT1I6IDc3NCwKICAgICAgICBPTkVfTUlOVVNfRFNUX0NPTE9SOiA3NzUsCiAgICAgICAgU1JDX0FMUEhBX1NBVFVSQVRFOiA3NzYsCiAgICAgICAgRlVOQ19BREQ6IDMyNzc0LAogICAgICAgIEJMRU5EX0VRVUFUSU9OOiAzMjc3NywKICAgICAgICBCTEVORF9FUVVBVElPTl9SR0I6IDMyNzc3LAogICAgICAgIC8vIHNhbWUgYXMgQkxFTkRfRVFVQVRJT04KICAgICAgICBCTEVORF9FUVVBVElPTl9BTFBIQTogMzQ4NzcsCiAgICAgICAgRlVOQ19TVUJUUkFDVDogMzI3NzgsCiAgICAgICAgRlVOQ19SRVZFUlNFX1NVQlRSQUNUOiAzMjc3OSwKICAgICAgICBCTEVORF9EU1RfUkdCOiAzMjk2OCwKICAgICAgICBCTEVORF9TUkNfUkdCOiAzMjk2OSwKICAgICAgICBCTEVORF9EU1RfQUxQSEE6IDMyOTcwLAogICAgICAgIEJMRU5EX1NSQ19BTFBIQTogMzI5NzEsCiAgICAgICAgQ09OU1RBTlRfQ09MT1I6IDMyNzY5LAogICAgICAgIE9ORV9NSU5VU19DT05TVEFOVF9DT0xPUjogMzI3NzAsCiAgICAgICAgQ09OU1RBTlRfQUxQSEE6IDMyNzcxLAogICAgICAgIE9ORV9NSU5VU19DT05TVEFOVF9BTFBIQTogMzI3NzIsCiAgICAgICAgQkxFTkRfQ09MT1I6IDMyNzczLAogICAgICAgIEFSUkFZX0JVRkZFUjogMzQ5NjIsCiAgICAgICAgRUxFTUVOVF9BUlJBWV9CVUZGRVI6IDM0OTYzLAogICAgICAgIEFSUkFZX0JVRkZFUl9CSU5ESU5HOiAzNDk2NCwKICAgICAgICBFTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HOiAzNDk2NSwKICAgICAgICBTVFJFQU1fRFJBVzogMzUwNDAsCiAgICAgICAgU1RBVElDX0RSQVc6IDM1MDQ0LAogICAgICAgIERZTkFNSUNfRFJBVzogMzUwNDgsCiAgICAgICAgQlVGRkVSX1NJWkU6IDM0NjYwLAogICAgICAgIEJVRkZFUl9VU0FHRTogMzQ2NjEsCiAgICAgICAgQ1VSUkVOVF9WRVJURVhfQVRUUklCOiAzNDM0MiwKICAgICAgICBGUk9OVDogMTAyOCwKICAgICAgICBCQUNLOiAxMDI5LAogICAgICAgIEZST05UX0FORF9CQUNLOiAxMDMyLAogICAgICAgIENVTExfRkFDRTogMjg4NCwKICAgICAgICBCTEVORDogMzA0MiwKICAgICAgICBESVRIRVI6IDMwMjQsCiAgICAgICAgU1RFTkNJTF9URVNUOiAyOTYwLAogICAgICAgIERFUFRIX1RFU1Q6IDI5MjksCiAgICAgICAgU0NJU1NPUl9URVNUOiAzMDg5LAogICAgICAgIFBPTFlHT05fT0ZGU0VUX0ZJTEw6IDMyODIzLAogICAgICAgIFNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRTogMzI5MjYsCiAgICAgICAgU0FNUExFX0NPVkVSQUdFOiAzMjkyOCwKICAgICAgICBOT19FUlJPUjogMCwKICAgICAgICBJTlZBTElEX0VOVU06IDEyODAsCiAgICAgICAgSU5WQUxJRF9WQUxVRTogMTI4MSwKICAgICAgICBJTlZBTElEX09QRVJBVElPTjogMTI4MiwKICAgICAgICBPVVRfT0ZfTUVNT1JZOiAxMjg1LAogICAgICAgIENXOiAyMzA0LAogICAgICAgIENDVzogMjMwNSwKICAgICAgICBMSU5FX1dJRFRIOiAyODQ5LAogICAgICAgIEFMSUFTRURfUE9JTlRfU0laRV9SQU5HRTogMzM5MDEsCiAgICAgICAgQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFOiAzMzkwMiwKICAgICAgICBDVUxMX0ZBQ0VfTU9ERTogMjg4NSwKICAgICAgICBGUk9OVF9GQUNFOiAyODg2LAogICAgICAgIERFUFRIX1JBTkdFOiAyOTI4LAogICAgICAgIERFUFRIX1dSSVRFTUFTSzogMjkzMCwKICAgICAgICBERVBUSF9DTEVBUl9WQUxVRTogMjkzMSwKICAgICAgICBERVBUSF9GVU5DOiAyOTMyLAogICAgICAgIFNURU5DSUxfQ0xFQVJfVkFMVUU6IDI5NjEsCiAgICAgICAgU1RFTkNJTF9GVU5DOiAyOTYyLAogICAgICAgIFNURU5DSUxfRkFJTDogMjk2NCwKICAgICAgICBTVEVOQ0lMX1BBU1NfREVQVEhfRkFJTDogMjk2NSwKICAgICAgICBTVEVOQ0lMX1BBU1NfREVQVEhfUEFTUzogMjk2NiwKICAgICAgICBTVEVOQ0lMX1JFRjogMjk2NywKICAgICAgICBTVEVOQ0lMX1ZBTFVFX01BU0s6IDI5NjMsCiAgICAgICAgU1RFTkNJTF9XUklURU1BU0s6IDI5NjgsCiAgICAgICAgU1RFTkNJTF9CQUNLX0ZVTkM6IDM0ODE2LAogICAgICAgIFNURU5DSUxfQkFDS19GQUlMOiAzNDgxNywKICAgICAgICBTVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMOiAzNDgxOCwKICAgICAgICBTVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9QQVNTOiAzNDgxOSwKICAgICAgICBTVEVOQ0lMX0JBQ0tfUkVGOiAzNjAwMywKICAgICAgICBTVEVOQ0lMX0JBQ0tfVkFMVUVfTUFTSzogMzYwMDQsCiAgICAgICAgU1RFTkNJTF9CQUNLX1dSSVRFTUFTSzogMzYwMDUsCiAgICAgICAgVklFV1BPUlQ6IDI5NzgsCiAgICAgICAgU0NJU1NPUl9CT1g6IDMwODgsCiAgICAgICAgQ09MT1JfQ0xFQVJfVkFMVUU6IDMxMDYsCiAgICAgICAgQ09MT1JfV1JJVEVNQVNLOiAzMTA3LAogICAgICAgIFVOUEFDS19BTElHTk1FTlQ6IDMzMTcsCiAgICAgICAgUEFDS19BTElHTk1FTlQ6IDMzMzMsCiAgICAgICAgTUFYX1RFWFRVUkVfU0laRTogMzM3OSwKICAgICAgICBNQVhfVklFV1BPUlRfRElNUzogMzM4NiwKICAgICAgICBTVUJQSVhFTF9CSVRTOiAzNDA4LAogICAgICAgIFJFRF9CSVRTOiAzNDEwLAogICAgICAgIEdSRUVOX0JJVFM6IDM0MTEsCiAgICAgICAgQkxVRV9CSVRTOiAzNDEyLAogICAgICAgIEFMUEhBX0JJVFM6IDM0MTMsCiAgICAgICAgREVQVEhfQklUUzogMzQxNCwKICAgICAgICBTVEVOQ0lMX0JJVFM6IDM0MTUsCiAgICAgICAgUE9MWUdPTl9PRkZTRVRfVU5JVFM6IDEwNzUyLAogICAgICAgIFBPTFlHT05fT0ZGU0VUX0ZBQ1RPUjogMzI4MjQsCiAgICAgICAgVEVYVFVSRV9CSU5ESU5HXzJEOiAzMjg3MywKICAgICAgICBTQU1QTEVfQlVGRkVSUzogMzI5MzYsCiAgICAgICAgU0FNUExFUzogMzI5MzcsCiAgICAgICAgU0FNUExFX0NPVkVSQUdFX1ZBTFVFOiAzMjkzOCwKICAgICAgICBTQU1QTEVfQ09WRVJBR0VfSU5WRVJUOiAzMjkzOSwKICAgICAgICBDT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUzogMzQ0NjcsCiAgICAgICAgRE9OVF9DQVJFOiA0MzUyLAogICAgICAgIEZBU1RFU1Q6IDQzNTMsCiAgICAgICAgTklDRVNUOiA0MzU0LAogICAgICAgIEdFTkVSQVRFX01JUE1BUF9ISU5UOiAzMzE3MCwKICAgICAgICBCWVRFOiA1MTIwLAogICAgICAgIFVOU0lHTkVEX0JZVEU6IDUxMjEsCiAgICAgICAgU0hPUlQ6IDUxMjIsCiAgICAgICAgVU5TSUdORURfU0hPUlQ6IDUxMjMsCiAgICAgICAgSU5UOiA1MTI0LAogICAgICAgIFVOU0lHTkVEX0lOVDogNTEyNSwKICAgICAgICBGTE9BVDogNTEyNiwKICAgICAgICBERVBUSF9DT01QT05FTlQ6IDY0MDIsCiAgICAgICAgQUxQSEE6IDY0MDYsCiAgICAgICAgUkdCOiA2NDA3LAogICAgICAgIFJHQkE6IDY0MDgsCiAgICAgICAgTFVNSU5BTkNFOiA2NDA5LAogICAgICAgIExVTUlOQU5DRV9BTFBIQTogNjQxMCwKICAgICAgICBVTlNJR05FRF9TSE9SVF80XzRfNF80OiAzMjgxOSwKICAgICAgICBVTlNJR05FRF9TSE9SVF81XzVfNV8xOiAzMjgyMCwKICAgICAgICBVTlNJR05FRF9TSE9SVF81XzZfNTogMzM2MzUsCiAgICAgICAgRlJBR01FTlRfU0hBREVSOiAzNTYzMiwKICAgICAgICBWRVJURVhfU0hBREVSOiAzNTYzMywKICAgICAgICBNQVhfVkVSVEVYX0FUVFJJQlM6IDM0OTIxLAogICAgICAgIE1BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTOiAzNjM0NywKICAgICAgICBNQVhfVkFSWUlOR19WRUNUT1JTOiAzNjM0OCwKICAgICAgICBNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUzogMzU2NjEsCiAgICAgICAgTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTOiAzNTY2MCwKICAgICAgICBNQVhfVEVYVFVSRV9JTUFHRV9VTklUUzogMzQ5MzAsCiAgICAgICAgTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUzogMzYzNDksCiAgICAgICAgU0hBREVSX1RZUEU6IDM1NjYzLAogICAgICAgIERFTEVURV9TVEFUVVM6IDM1NzEyLAogICAgICAgIExJTktfU1RBVFVTOiAzNTcxNCwKICAgICAgICBWQUxJREFURV9TVEFUVVM6IDM1NzE1LAogICAgICAgIEFUVEFDSEVEX1NIQURFUlM6IDM1NzE3LAogICAgICAgIEFDVElWRV9VTklGT1JNUzogMzU3MTgsCiAgICAgICAgQUNUSVZFX0FUVFJJQlVURVM6IDM1NzIxLAogICAgICAgIFNIQURJTkdfTEFOR1VBR0VfVkVSU0lPTjogMzU3MjQsCiAgICAgICAgQ1VSUkVOVF9QUk9HUkFNOiAzNTcyNSwKICAgICAgICBORVZFUjogNTEyLAogICAgICAgIExFU1M6IDUxMywKICAgICAgICBFUVVBTDogNTE0LAogICAgICAgIExFUVVBTDogNTE1LAogICAgICAgIEdSRUFURVI6IDUxNiwKICAgICAgICBOT1RFUVVBTDogNTE3LAogICAgICAgIEdFUVVBTDogNTE4LAogICAgICAgIEFMV0FZUzogNTE5LAogICAgICAgIEtFRVA6IDc2ODAsCiAgICAgICAgUkVQTEFDRTogNzY4MSwKICAgICAgICBJTkNSOiA3NjgyLAogICAgICAgIERFQ1I6IDc2ODMsCiAgICAgICAgSU5WRVJUOiA1Mzg2LAogICAgICAgIElOQ1JfV1JBUDogMzQwNTUsCiAgICAgICAgREVDUl9XUkFQOiAzNDA1NiwKICAgICAgICBWRU5ET1I6IDc5MzYsCiAgICAgICAgUkVOREVSRVI6IDc5MzcsCiAgICAgICAgVkVSU0lPTjogNzkzOCwKICAgICAgICBORUFSRVNUOiA5NzI4LAogICAgICAgIExJTkVBUjogOTcyOSwKICAgICAgICBORUFSRVNUX01JUE1BUF9ORUFSRVNUOiA5OTg0LAogICAgICAgIExJTkVBUl9NSVBNQVBfTkVBUkVTVDogOTk4NSwKICAgICAgICBORUFSRVNUX01JUE1BUF9MSU5FQVI6IDk5ODYsCiAgICAgICAgTElORUFSX01JUE1BUF9MSU5FQVI6IDk5ODcsCiAgICAgICAgVEVYVFVSRV9NQUdfRklMVEVSOiAxMDI0MCwKICAgICAgICBURVhUVVJFX01JTl9GSUxURVI6IDEwMjQxLAogICAgICAgIFRFWFRVUkVfV1JBUF9TOiAxMDI0MiwKICAgICAgICBURVhUVVJFX1dSQVBfVDogMTAyNDMsCiAgICAgICAgVEVYVFVSRV8yRDogMzU1MywKICAgICAgICBURVhUVVJFOiA1ODkwLAogICAgICAgIFRFWFRVUkVfQ1VCRV9NQVA6IDM0MDY3LAogICAgICAgIFRFWFRVUkVfQklORElOR19DVUJFX01BUDogMzQwNjgsCiAgICAgICAgVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YOiAzNDA2OSwKICAgICAgICBURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1g6IDM0MDcwLAogICAgICAgIFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWTogMzQwNzEsCiAgICAgICAgVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZOiAzNDA3MiwKICAgICAgICBURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1o6IDM0MDczLAogICAgICAgIFRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWjogMzQwNzQsCiAgICAgICAgTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRTogMzQwNzYsCiAgICAgICAgVEVYVFVSRTA6IDMzOTg0LAogICAgICAgIFRFWFRVUkUxOiAzMzk4NSwKICAgICAgICBURVhUVVJFMjogMzM5ODYsCiAgICAgICAgVEVYVFVSRTM6IDMzOTg3LAogICAgICAgIFRFWFRVUkU0OiAzMzk4OCwKICAgICAgICBURVhUVVJFNTogMzM5ODksCiAgICAgICAgVEVYVFVSRTY6IDMzOTkwLAogICAgICAgIFRFWFRVUkU3OiAzMzk5MSwKICAgICAgICBURVhUVVJFODogMzM5OTIsCiAgICAgICAgVEVYVFVSRTk6IDMzOTkzLAogICAgICAgIFRFWFRVUkUxMDogMzM5OTQsCiAgICAgICAgVEVYVFVSRTExOiAzMzk5NSwKICAgICAgICBURVhUVVJFMTI6IDMzOTk2LAogICAgICAgIFRFWFRVUkUxMzogMzM5OTcsCiAgICAgICAgVEVYVFVSRTE0OiAzMzk5OCwKICAgICAgICBURVhUVVJFMTU6IDMzOTk5LAogICAgICAgIFRFWFRVUkUxNjogMzRlMywKICAgICAgICBURVhUVVJFMTc6IDM0MDAxLAogICAgICAgIFRFWFRVUkUxODogMzQwMDIsCiAgICAgICAgVEVYVFVSRTE5OiAzNDAwMywKICAgICAgICBURVhUVVJFMjA6IDM0MDA0LAogICAgICAgIFRFWFRVUkUyMTogMzQwMDUsCiAgICAgICAgVEVYVFVSRTIyOiAzNDAwNiwKICAgICAgICBURVhUVVJFMjM6IDM0MDA3LAogICAgICAgIFRFWFRVUkUyNDogMzQwMDgsCiAgICAgICAgVEVYVFVSRTI1OiAzNDAwOSwKICAgICAgICBURVhUVVJFMjY6IDM0MDEwLAogICAgICAgIFRFWFRVUkUyNzogMzQwMTEsCiAgICAgICAgVEVYVFVSRTI4OiAzNDAxMiwKICAgICAgICBURVhUVVJFMjk6IDM0MDEzLAogICAgICAgIFRFWFRVUkUzMDogMzQwMTQsCiAgICAgICAgVEVYVFVSRTMxOiAzNDAxNSwKICAgICAgICBBQ1RJVkVfVEVYVFVSRTogMzQwMTYsCiAgICAgICAgUkVQRUFUOiAxMDQ5NywKICAgICAgICBDTEFNUF9UT19FREdFOiAzMzA3MSwKICAgICAgICBNSVJST1JFRF9SRVBFQVQ6IDMzNjQ4LAogICAgICAgIEZMT0FUX1ZFQzI6IDM1NjY0LAogICAgICAgIEZMT0FUX1ZFQzM6IDM1NjY1LAogICAgICAgIEZMT0FUX1ZFQzQ6IDM1NjY2LAogICAgICAgIElOVF9WRUMyOiAzNTY2NywKICAgICAgICBJTlRfVkVDMzogMzU2NjgsCiAgICAgICAgSU5UX1ZFQzQ6IDM1NjY5LAogICAgICAgIEJPT0w6IDM1NjcwLAogICAgICAgIEJPT0xfVkVDMjogMzU2NzEsCiAgICAgICAgQk9PTF9WRUMzOiAzNTY3MiwKICAgICAgICBCT09MX1ZFQzQ6IDM1NjczLAogICAgICAgIEZMT0FUX01BVDI6IDM1Njc0LAogICAgICAgIEZMT0FUX01BVDM6IDM1Njc1LAogICAgICAgIEZMT0FUX01BVDQ6IDM1Njc2LAogICAgICAgIFNBTVBMRVJfMkQ6IDM1Njc4LAogICAgICAgIFNBTVBMRVJfQ1VCRTogMzU2ODAsCiAgICAgICAgVkVSVEVYX0FUVFJJQl9BUlJBWV9FTkFCTEVEOiAzNDMzOCwKICAgICAgICBWRVJURVhfQVRUUklCX0FSUkFZX1NJWkU6IDM0MzM5LAogICAgICAgIFZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFOiAzNDM0MCwKICAgICAgICBWRVJURVhfQVRUUklCX0FSUkFZX1RZUEU6IDM0MzQxLAogICAgICAgIFZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRDogMzQ5MjIsCiAgICAgICAgVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSOiAzNDM3MywKICAgICAgICBWRVJURVhfQVRUUklCX0FSUkFZX0JVRkZFUl9CSU5ESU5HOiAzNDk3NSwKICAgICAgICBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEU6IDM1NzM4LAogICAgICAgIElNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUOiAzNTczOSwKICAgICAgICBDT01QSUxFX1NUQVRVUzogMzU3MTMsCiAgICAgICAgTE9XX0ZMT0FUOiAzNjMzNiwKICAgICAgICBNRURJVU1fRkxPQVQ6IDM2MzM3LAogICAgICAgIEhJR0hfRkxPQVQ6IDM2MzM4LAogICAgICAgIExPV19JTlQ6IDM2MzM5LAogICAgICAgIE1FRElVTV9JTlQ6IDM2MzQwLAogICAgICAgIEhJR0hfSU5UOiAzNjM0MSwKICAgICAgICBGUkFNRUJVRkZFUjogMzYxNjAsCiAgICAgICAgUkVOREVSQlVGRkVSOiAzNjE2MSwKICAgICAgICBSR0JBNDogMzI4NTQsCiAgICAgICAgUkdCNV9BMTogMzI4NTUsCiAgICAgICAgUkdCNTY1OiAzNjE5NCwKICAgICAgICBERVBUSF9DT01QT05FTlQxNjogMzMxODksCiAgICAgICAgU1RFTkNJTF9JTkRFWDogNjQwMSwKICAgICAgICBTVEVOQ0lMX0lOREVYODogMzYxNjgsCiAgICAgICAgREVQVEhfU1RFTkNJTDogMzQwNDEsCiAgICAgICAgUkVOREVSQlVGRkVSX1dJRFRIOiAzNjE2MiwKICAgICAgICBSRU5ERVJCVUZGRVJfSEVJR0hUOiAzNjE2MywKICAgICAgICBSRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUOiAzNjE2NCwKICAgICAgICBSRU5ERVJCVUZGRVJfUkVEX1NJWkU6IDM2MTc2LAogICAgICAgIFJFTkRFUkJVRkZFUl9HUkVFTl9TSVpFOiAzNjE3NywKICAgICAgICBSRU5ERVJCVUZGRVJfQkxVRV9TSVpFOiAzNjE3OCwKICAgICAgICBSRU5ERVJCVUZGRVJfQUxQSEFfU0laRTogMzYxNzksCiAgICAgICAgUkVOREVSQlVGRkVSX0RFUFRIX1NJWkU6IDM2MTgwLAogICAgICAgIFJFTkRFUkJVRkZFUl9TVEVOQ0lMX1NJWkU6IDM2MTgxLAogICAgICAgIEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEU6IDM2MDQ4LAogICAgICAgIEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUU6IDM2MDQ5LAogICAgICAgIEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MRVZFTDogMzYwNTAsCiAgICAgICAgRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0U6IDM2MDUxLAogICAgICAgIENPTE9SX0FUVEFDSE1FTlQwOiAzNjA2NCwKICAgICAgICBERVBUSF9BVFRBQ0hNRU5UOiAzNjA5NiwKICAgICAgICBTVEVOQ0lMX0FUVEFDSE1FTlQ6IDM2MTI4LAogICAgICAgIERFUFRIX1NURU5DSUxfQVRUQUNITUVOVDogMzMzMDYsCiAgICAgICAgTk9ORTogMCwKICAgICAgICBGUkFNRUJVRkZFUl9DT01QTEVURTogMzYwNTMsCiAgICAgICAgRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UOiAzNjA1NCwKICAgICAgICBGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVDogMzYwNTUsCiAgICAgICAgRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TOiAzNjA1NywKICAgICAgICBGUkFNRUJVRkZFUl9VTlNVUFBPUlRFRDogMzYwNjEsCiAgICAgICAgRlJBTUVCVUZGRVJfQklORElORzogMzYwMDYsCiAgICAgICAgUkVOREVSQlVGRkVSX0JJTkRJTkc6IDM2MDA3LAogICAgICAgIE1BWF9SRU5ERVJCVUZGRVJfU0laRTogMzQwMjQsCiAgICAgICAgSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT046IDEyODYsCiAgICAgICAgVU5QQUNLX0ZMSVBfWV9XRUJHTDogMzc0NDAsCiAgICAgICAgVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMOiAzNzQ0MSwKICAgICAgICBDT05URVhUX0xPU1RfV0VCR0w6IDM3NDQyLAogICAgICAgIFVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0w6IDM3NDQzLAogICAgICAgIEJST1dTRVJfREVGQVVMVF9XRUJHTDogMzc0NDQsCiAgICAgICAgLy8gV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMKICAgICAgICBDT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUOiAzMzc3NiwKICAgICAgICBDT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDogMzM3NzcsCiAgICAgICAgQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ6IDMzNzc4LAogICAgICAgIENPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUOiAzMzc3OSwKICAgICAgICAvLyBXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMKICAgICAgICBDT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HOiAzNTg0MCwKICAgICAgICBDT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HOiAzNTg0MSwKICAgICAgICBDT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRzogMzU4NDIsCiAgICAgICAgQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUc6IDM1ODQzLAogICAgICAgIC8vIFdFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjCiAgICAgICAgQ09NUFJFU1NFRF9SR0JBX0FTVENfNHg0X1dFQkdMOiAzNzgwOCwKICAgICAgICAvLyBXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMQogICAgICAgIENPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0w6IDM2MTk2LAogICAgICAgIC8vIEVYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2JwdGMKICAgICAgICBDT01QUkVTU0VEX1JHQkFfQlBUQ19VTk9STTogMzY0OTIsCiAgICAgICAgLy8gRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0CiAgICAgICAgSEFMRl9GTE9BVF9PRVM6IDM2MTkzLAogICAgICAgIC8vIERlc2t0b3AgT3BlbkdMCiAgICAgICAgRE9VQkxFOiA1MTMwLAogICAgICAgIC8vIFdlYkdMIDIKICAgICAgICBSRUFEX0JVRkZFUjogMzA3NCwKICAgICAgICBVTlBBQ0tfUk9XX0xFTkdUSDogMzMxNCwKICAgICAgICBVTlBBQ0tfU0tJUF9ST1dTOiAzMzE1LAogICAgICAgIFVOUEFDS19TS0lQX1BJWEVMUzogMzMxNiwKICAgICAgICBQQUNLX1JPV19MRU5HVEg6IDMzMzAsCiAgICAgICAgUEFDS19TS0lQX1JPV1M6IDMzMzEsCiAgICAgICAgUEFDS19TS0lQX1BJWEVMUzogMzMzMiwKICAgICAgICBDT0xPUjogNjE0NCwKICAgICAgICBERVBUSDogNjE0NSwKICAgICAgICBTVEVOQ0lMOiA2MTQ2LAogICAgICAgIFJFRDogNjQwMywKICAgICAgICBSR0I4OiAzMjg0OSwKICAgICAgICBSR0JBODogMzI4NTYsCiAgICAgICAgUkdCMTBfQTI6IDMyODU3LAogICAgICAgIFRFWFRVUkVfQklORElOR18zRDogMzI4NzQsCiAgICAgICAgVU5QQUNLX1NLSVBfSU1BR0VTOiAzMjg3NywKICAgICAgICBVTlBBQ0tfSU1BR0VfSEVJR0hUOiAzMjg3OCwKICAgICAgICBURVhUVVJFXzNEOiAzMjg3OSwKICAgICAgICBURVhUVVJFX1dSQVBfUjogMzI4ODIsCiAgICAgICAgTUFYXzNEX1RFWFRVUkVfU0laRTogMzI4ODMsCiAgICAgICAgVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWOiAzMzY0MCwKICAgICAgICBNQVhfRUxFTUVOVFNfVkVSVElDRVM6IDMzZTMsCiAgICAgICAgTUFYX0VMRU1FTlRTX0lORElDRVM6IDMzMDAxLAogICAgICAgIFRFWFRVUkVfTUlOX0xPRDogMzMwODIsCiAgICAgICAgVEVYVFVSRV9NQVhfTE9EOiAzMzA4MywKICAgICAgICBURVhUVVJFX0JBU0VfTEVWRUw6IDMzMDg0LAogICAgICAgIFRFWFRVUkVfTUFYX0xFVkVMOiAzMzA4NSwKICAgICAgICBNSU46IDMyNzc1LAogICAgICAgIE1BWDogMzI3NzYsCiAgICAgICAgREVQVEhfQ09NUE9ORU5UMjQ6IDMzMTkwLAogICAgICAgIE1BWF9URVhUVVJFX0xPRF9CSUFTOiAzNDA0NSwKICAgICAgICBURVhUVVJFX0NPTVBBUkVfTU9ERTogMzQ4OTIsCiAgICAgICAgVEVYVFVSRV9DT01QQVJFX0ZVTkM6IDM0ODkzLAogICAgICAgIENVUlJFTlRfUVVFUlk6IDM0OTE3LAogICAgICAgIFFVRVJZX1JFU1VMVDogMzQ5MTgsCiAgICAgICAgUVVFUllfUkVTVUxUX0FWQUlMQUJMRTogMzQ5MTksCiAgICAgICAgU1RSRUFNX1JFQUQ6IDM1MDQxLAogICAgICAgIFNUUkVBTV9DT1BZOiAzNTA0MiwKICAgICAgICBTVEFUSUNfUkVBRDogMzUwNDUsCiAgICAgICAgU1RBVElDX0NPUFk6IDM1MDQ2LAogICAgICAgIERZTkFNSUNfUkVBRDogMzUwNDksCiAgICAgICAgRFlOQU1JQ19DT1BZOiAzNTA1MCwKICAgICAgICBNQVhfRFJBV19CVUZGRVJTOiAzNDg1MiwKICAgICAgICBEUkFXX0JVRkZFUjA6IDM0ODUzLAogICAgICAgIERSQVdfQlVGRkVSMTogMzQ4NTQsCiAgICAgICAgRFJBV19CVUZGRVIyOiAzNDg1NSwKICAgICAgICBEUkFXX0JVRkZFUjM6IDM0ODU2LAogICAgICAgIERSQVdfQlVGRkVSNDogMzQ4NTcsCiAgICAgICAgRFJBV19CVUZGRVI1OiAzNDg1OCwKICAgICAgICBEUkFXX0JVRkZFUjY6IDM0ODU5LAogICAgICAgIERSQVdfQlVGRkVSNzogMzQ4NjAsCiAgICAgICAgRFJBV19CVUZGRVI4OiAzNDg2MSwKICAgICAgICBEUkFXX0JVRkZFUjk6IDM0ODYyLAogICAgICAgIERSQVdfQlVGRkVSMTA6IDM0ODYzLAogICAgICAgIERSQVdfQlVGRkVSMTE6IDM0ODY0LAogICAgICAgIERSQVdfQlVGRkVSMTI6IDM0ODY1LAogICAgICAgIERSQVdfQlVGRkVSMTM6IDM0ODY2LAogICAgICAgIERSQVdfQlVGRkVSMTQ6IDM0ODY3LAogICAgICAgIERSQVdfQlVGRkVSMTU6IDM0ODY4LAogICAgICAgIE1BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFM6IDM1NjU3LAogICAgICAgIE1BWF9WRVJURVhfVU5JRk9STV9DT01QT05FTlRTOiAzNTY1OCwKICAgICAgICBTQU1QTEVSXzNEOiAzNTY3OSwKICAgICAgICBTQU1QTEVSXzJEX1NIQURPVzogMzU2ODIsCiAgICAgICAgRlJBR01FTlRfU0hBREVSX0RFUklWQVRJVkVfSElOVDogMzU3MjMsCiAgICAgICAgUElYRUxfUEFDS19CVUZGRVI6IDM1MDUxLAogICAgICAgIFBJWEVMX1VOUEFDS19CVUZGRVI6IDM1MDUyLAogICAgICAgIFBJWEVMX1BBQ0tfQlVGRkVSX0JJTkRJTkc6IDM1MDUzLAogICAgICAgIFBJWEVMX1VOUEFDS19CVUZGRVJfQklORElORzogMzUwNTUsCiAgICAgICAgRkxPQVRfTUFUMngzOiAzNTY4NSwKICAgICAgICBGTE9BVF9NQVQyeDQ6IDM1Njg2LAogICAgICAgIEZMT0FUX01BVDN4MjogMzU2ODcsCiAgICAgICAgRkxPQVRfTUFUM3g0OiAzNTY4OCwKICAgICAgICBGTE9BVF9NQVQ0eDI6IDM1Njg5LAogICAgICAgIEZMT0FUX01BVDR4MzogMzU2OTAsCiAgICAgICAgU1JHQjogMzU5MDQsCiAgICAgICAgU1JHQjg6IDM1OTA1LAogICAgICAgIFNSR0I4X0FMUEhBODogMzU5MDcsCiAgICAgICAgQ09NUEFSRV9SRUZfVE9fVEVYVFVSRTogMzQ4OTQsCiAgICAgICAgUkdCQTMyRjogMzQ4MzYsCiAgICAgICAgUkdCMzJGOiAzNDgzNywKICAgICAgICBSR0JBMTZGOiAzNDg0MiwKICAgICAgICBSR0IxNkY6IDM0ODQzLAogICAgICAgIFZFUlRFWF9BVFRSSUJfQVJSQVlfSU5URUdFUjogMzUwNjksCiAgICAgICAgTUFYX0FSUkFZX1RFWFRVUkVfTEFZRVJTOiAzNTA3MSwKICAgICAgICBNSU5fUFJPR1JBTV9URVhFTF9PRkZTRVQ6IDM1MDc2LAogICAgICAgIE1BWF9QUk9HUkFNX1RFWEVMX09GRlNFVDogMzUwNzcsCiAgICAgICAgTUFYX1ZBUllJTkdfQ09NUE9ORU5UUzogMzU2NTksCiAgICAgICAgVEVYVFVSRV8yRF9BUlJBWTogMzU4NjYsCiAgICAgICAgVEVYVFVSRV9CSU5ESU5HXzJEX0FSUkFZOiAzNTg2OSwKICAgICAgICBSMTFGX0cxMUZfQjEwRjogMzU4OTgsCiAgICAgICAgVU5TSUdORURfSU5UXzEwRl8xMUZfMTFGX1JFVjogMzU4OTksCiAgICAgICAgUkdCOV9FNTogMzU5MDEsCiAgICAgICAgVU5TSUdORURfSU5UXzVfOV85XzlfUkVWOiAzNTkwMiwKICAgICAgICBUUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX01PREU6IDM1OTY3LAogICAgICAgIE1BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfU0VQQVJBVEVfQ09NUE9ORU5UUzogMzU5NjgsCiAgICAgICAgVFJBTlNGT1JNX0ZFRURCQUNLX1ZBUllJTkdTOiAzNTk3MSwKICAgICAgICBUUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX1NUQVJUOiAzNTk3MiwKICAgICAgICBUUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX1NJWkU6IDM1OTczLAogICAgICAgIFRSQU5TRk9STV9GRUVEQkFDS19QUklNSVRJVkVTX1dSSVRURU46IDM1OTc2LAogICAgICAgIFJBU1RFUklaRVJfRElTQ0FSRDogMzU5NzcsCiAgICAgICAgTUFYX1RSQU5TRk9STV9GRUVEQkFDS19JTlRFUkxFQVZFRF9DT01QT05FTlRTOiAzNTk3OCwKICAgICAgICBNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0FUVFJJQlM6IDM1OTc5LAogICAgICAgIElOVEVSTEVBVkVEX0FUVFJJQlM6IDM1OTgwLAogICAgICAgIFNFUEFSQVRFX0FUVFJJQlM6IDM1OTgxLAogICAgICAgIFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVI6IDM1OTgyLAogICAgICAgIFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfQklORElORzogMzU5ODMsCiAgICAgICAgUkdCQTMyVUk6IDM2MjA4LAogICAgICAgIFJHQjMyVUk6IDM2MjA5LAogICAgICAgIFJHQkExNlVJOiAzNjIxNCwKICAgICAgICBSR0IxNlVJOiAzNjIxNSwKICAgICAgICBSR0JBOFVJOiAzNjIyMCwKICAgICAgICBSR0I4VUk6IDM2MjIxLAogICAgICAgIFJHQkEzMkk6IDM2MjI2LAogICAgICAgIFJHQjMySTogMzYyMjcsCiAgICAgICAgUkdCQTE2STogMzYyMzIsCiAgICAgICAgUkdCMTZJOiAzNjIzMywKICAgICAgICBSR0JBOEk6IDM2MjM4LAogICAgICAgIFJHQjhJOiAzNjIzOSwKICAgICAgICBSRURfSU5URUdFUjogMzYyNDQsCiAgICAgICAgUkdCX0lOVEVHRVI6IDM2MjQ4LAogICAgICAgIFJHQkFfSU5URUdFUjogMzYyNDksCiAgICAgICAgU0FNUExFUl8yRF9BUlJBWTogMzYyODksCiAgICAgICAgU0FNUExFUl8yRF9BUlJBWV9TSEFET1c6IDM2MjkyLAogICAgICAgIFNBTVBMRVJfQ1VCRV9TSEFET1c6IDM2MjkzLAogICAgICAgIFVOU0lHTkVEX0lOVF9WRUMyOiAzNjI5NCwKICAgICAgICBVTlNJR05FRF9JTlRfVkVDMzogMzYyOTUsCiAgICAgICAgVU5TSUdORURfSU5UX1ZFQzQ6IDM2Mjk2LAogICAgICAgIElOVF9TQU1QTEVSXzJEOiAzNjI5OCwKICAgICAgICBJTlRfU0FNUExFUl8zRDogMzYyOTksCiAgICAgICAgSU5UX1NBTVBMRVJfQ1VCRTogMzYzMDAsCiAgICAgICAgSU5UX1NBTVBMRVJfMkRfQVJSQVk6IDM2MzAzLAogICAgICAgIFVOU0lHTkVEX0lOVF9TQU1QTEVSXzJEOiAzNjMwNiwKICAgICAgICBVTlNJR05FRF9JTlRfU0FNUExFUl8zRDogMzYzMDcsCiAgICAgICAgVU5TSUdORURfSU5UX1NBTVBMRVJfQ1VCRTogMzYzMDgsCiAgICAgICAgVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfQVJSQVk6IDM2MzExLAogICAgICAgIERFUFRIX0NPTVBPTkVOVDMyRjogMzYwMTIsCiAgICAgICAgREVQVEgzMkZfU1RFTkNJTDg6IDM2MDEzLAogICAgICAgIEZMT0FUXzMyX1VOU0lHTkVEX0lOVF8yNF84X1JFVjogMzYyNjksCiAgICAgICAgRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9DT0xPUl9FTkNPRElORzogMzMyOTYsCiAgICAgICAgRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9DT01QT05FTlRfVFlQRTogMzMyOTcsCiAgICAgICAgRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9SRURfU0laRTogMzMyOTgsCiAgICAgICAgRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9HUkVFTl9TSVpFOiAzMzI5OSwKICAgICAgICBGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0JMVUVfU0laRTogMzMzMDAsCiAgICAgICAgRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9BTFBIQV9TSVpFOiAzMzMwMSwKICAgICAgICBGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0RFUFRIX1NJWkU6IDMzMzAyLAogICAgICAgIEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfU1RFTkNJTF9TSVpFOiAzMzMwMywKICAgICAgICBGUkFNRUJVRkZFUl9ERUZBVUxUOiAzMzMwNCwKICAgICAgICBVTlNJR05FRF9JTlRfMjRfODogMzQwNDIsCiAgICAgICAgREVQVEgyNF9TVEVOQ0lMODogMzUwNTYsCiAgICAgICAgVU5TSUdORURfTk9STUFMSVpFRDogMzU4NjMsCiAgICAgICAgRFJBV19GUkFNRUJVRkZFUl9CSU5ESU5HOiAzNjAwNiwKICAgICAgICAvLyBTYW1lIGFzIEZSQU1FQlVGRkVSX0JJTkRJTkcKICAgICAgICBSRUFEX0ZSQU1FQlVGRkVSOiAzNjAwOCwKICAgICAgICBEUkFXX0ZSQU1FQlVGRkVSOiAzNjAwOSwKICAgICAgICBSRUFEX0ZSQU1FQlVGRkVSX0JJTkRJTkc6IDM2MDEwLAogICAgICAgIFJFTkRFUkJVRkZFUl9TQU1QTEVTOiAzNjAxMSwKICAgICAgICBGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEFZRVI6IDM2MDUyLAogICAgICAgIE1BWF9DT0xPUl9BVFRBQ0hNRU5UUzogMzYwNjMsCiAgICAgICAgQ09MT1JfQVRUQUNITUVOVDE6IDM2MDY1LAogICAgICAgIENPTE9SX0FUVEFDSE1FTlQyOiAzNjA2NiwKICAgICAgICBDT0xPUl9BVFRBQ0hNRU5UMzogMzYwNjcsCiAgICAgICAgQ09MT1JfQVRUQUNITUVOVDQ6IDM2MDY4LAogICAgICAgIENPTE9SX0FUVEFDSE1FTlQ1OiAzNjA2OSwKICAgICAgICBDT0xPUl9BVFRBQ0hNRU5UNjogMzYwNzAsCiAgICAgICAgQ09MT1JfQVRUQUNITUVOVDc6IDM2MDcxLAogICAgICAgIENPTE9SX0FUVEFDSE1FTlQ4OiAzNjA3MiwKICAgICAgICBDT0xPUl9BVFRBQ0hNRU5UOTogMzYwNzMsCiAgICAgICAgQ09MT1JfQVRUQUNITUVOVDEwOiAzNjA3NCwKICAgICAgICBDT0xPUl9BVFRBQ0hNRU5UMTE6IDM2MDc1LAogICAgICAgIENPTE9SX0FUVEFDSE1FTlQxMjogMzYwNzYsCiAgICAgICAgQ09MT1JfQVRUQUNITUVOVDEzOiAzNjA3NywKICAgICAgICBDT0xPUl9BVFRBQ0hNRU5UMTQ6IDM2MDc4LAogICAgICAgIENPTE9SX0FUVEFDSE1FTlQxNTogMzYwNzksCiAgICAgICAgRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NVUxUSVNBTVBMRTogMzYxODIsCiAgICAgICAgTUFYX1NBTVBMRVM6IDM2MTgzLAogICAgICAgIEhBTEZfRkxPQVQ6IDUxMzEsCiAgICAgICAgUkc6IDMzMzE5LAogICAgICAgIFJHX0lOVEVHRVI6IDMzMzIwLAogICAgICAgIFI4OiAzMzMyMSwKICAgICAgICBSRzg6IDMzMzIzLAogICAgICAgIFIxNkY6IDMzMzI1LAogICAgICAgIFIzMkY6IDMzMzI2LAogICAgICAgIFJHMTZGOiAzMzMyNywKICAgICAgICBSRzMyRjogMzMzMjgsCiAgICAgICAgUjhJOiAzMzMyOSwKICAgICAgICBSOFVJOiAzMzMzMCwKICAgICAgICBSMTZJOiAzMzMzMSwKICAgICAgICBSMTZVSTogMzMzMzIsCiAgICAgICAgUjMySTogMzMzMzMsCiAgICAgICAgUjMyVUk6IDMzMzM0LAogICAgICAgIFJHOEk6IDMzMzM1LAogICAgICAgIFJHOFVJOiAzMzMzNiwKICAgICAgICBSRzE2STogMzMzMzcsCiAgICAgICAgUkcxNlVJOiAzMzMzOCwKICAgICAgICBSRzMySTogMzMzMzksCiAgICAgICAgUkczMlVJOiAzMzM0MCwKICAgICAgICBWRVJURVhfQVJSQVlfQklORElORzogMzQyMjksCiAgICAgICAgUjhfU05PUk06IDM2NzU2LAogICAgICAgIFJHOF9TTk9STTogMzY3NTcsCiAgICAgICAgUkdCOF9TTk9STTogMzY3NTgsCiAgICAgICAgUkdCQThfU05PUk06IDM2NzU5LAogICAgICAgIFNJR05FRF9OT1JNQUxJWkVEOiAzNjc2NCwKICAgICAgICBDT1BZX1JFQURfQlVGRkVSOiAzNjY2MiwKICAgICAgICBDT1BZX1dSSVRFX0JVRkZFUjogMzY2NjMsCiAgICAgICAgQ09QWV9SRUFEX0JVRkZFUl9CSU5ESU5HOiAzNjY2MiwKICAgICAgICAvLyBTYW1lIGFzIENPUFlfUkVBRF9CVUZGRVIKICAgICAgICBDT1BZX1dSSVRFX0JVRkZFUl9CSU5ESU5HOiAzNjY2MywKICAgICAgICAvLyBTYW1lIGFzIENPUFlfV1JJVEVfQlVGRkVSCiAgICAgICAgVU5JRk9STV9CVUZGRVI6IDM1MzQ1LAogICAgICAgIFVOSUZPUk1fQlVGRkVSX0JJTkRJTkc6IDM1MzY4LAogICAgICAgIFVOSUZPUk1fQlVGRkVSX1NUQVJUOiAzNTM2OSwKICAgICAgICBVTklGT1JNX0JVRkZFUl9TSVpFOiAzNTM3MCwKICAgICAgICBNQVhfVkVSVEVYX1VOSUZPUk1fQkxPQ0tTOiAzNTM3MSwKICAgICAgICBNQVhfRlJBR01FTlRfVU5JRk9STV9CTE9DS1M6IDM1MzczLAogICAgICAgIE1BWF9DT01CSU5FRF9VTklGT1JNX0JMT0NLUzogMzUzNzQsCiAgICAgICAgTUFYX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkdTOiAzNTM3NSwKICAgICAgICBNQVhfVU5JRk9STV9CTE9DS19TSVpFOiAzNTM3NiwKICAgICAgICBNQVhfQ09NQklORURfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUzogMzUzNzcsCiAgICAgICAgTUFYX0NPTUJJTkVEX0ZSQUdNRU5UX1VOSUZPUk1fQ09NUE9ORU5UUzogMzUzNzksCiAgICAgICAgVU5JRk9STV9CVUZGRVJfT0ZGU0VUX0FMSUdOTUVOVDogMzUzODAsCiAgICAgICAgQUNUSVZFX1VOSUZPUk1fQkxPQ0tTOiAzNTM4MiwKICAgICAgICBVTklGT1JNX1RZUEU6IDM1MzgzLAogICAgICAgIFVOSUZPUk1fU0laRTogMzUzODQsCiAgICAgICAgVU5JRk9STV9CTE9DS19JTkRFWDogMzUzODYsCiAgICAgICAgVU5JRk9STV9PRkZTRVQ6IDM1Mzg3LAogICAgICAgIFVOSUZPUk1fQVJSQVlfU1RSSURFOiAzNTM4OCwKICAgICAgICBVTklGT1JNX01BVFJJWF9TVFJJREU6IDM1Mzg5LAogICAgICAgIFVOSUZPUk1fSVNfUk9XX01BSk9SOiAzNTM5MCwKICAgICAgICBVTklGT1JNX0JMT0NLX0JJTkRJTkc6IDM1MzkxLAogICAgICAgIFVOSUZPUk1fQkxPQ0tfREFUQV9TSVpFOiAzNTM5MiwKICAgICAgICBVTklGT1JNX0JMT0NLX0FDVElWRV9VTklGT1JNUzogMzUzOTQsCiAgICAgICAgVU5JRk9STV9CTE9DS19BQ1RJVkVfVU5JRk9STV9JTkRJQ0VTOiAzNTM5NSwKICAgICAgICBVTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfVkVSVEVYX1NIQURFUjogMzUzOTYsCiAgICAgICAgVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX0ZSQUdNRU5UX1NIQURFUjogMzUzOTgsCiAgICAgICAgSU5WQUxJRF9JTkRFWDogNDI5NDk2NzI5NSwKICAgICAgICBNQVhfVkVSVEVYX09VVFBVVF9DT01QT05FTlRTOiAzNzE1NCwKICAgICAgICBNQVhfRlJBR01FTlRfSU5QVVRfQ09NUE9ORU5UUzogMzcxNTcsCiAgICAgICAgTUFYX1NFUlZFUl9XQUlUX1RJTUVPVVQ6IDM3MTM3LAogICAgICAgIE9CSkVDVF9UWVBFOiAzNzEzOCwKICAgICAgICBTWU5DX0NPTkRJVElPTjogMzcxMzksCiAgICAgICAgU1lOQ19TVEFUVVM6IDM3MTQwLAogICAgICAgIFNZTkNfRkxBR1M6IDM3MTQxLAogICAgICAgIFNZTkNfRkVOQ0U6IDM3MTQyLAogICAgICAgIFNZTkNfR1BVX0NPTU1BTkRTX0NPTVBMRVRFOiAzNzE0MywKICAgICAgICBVTlNJR05BTEVEOiAzNzE0NCwKICAgICAgICBTSUdOQUxFRDogMzcxNDUsCiAgICAgICAgQUxSRUFEWV9TSUdOQUxFRDogMzcxNDYsCiAgICAgICAgVElNRU9VVF9FWFBJUkVEOiAzNzE0NywKICAgICAgICBDT05ESVRJT05fU0FUSVNGSUVEOiAzNzE0OCwKICAgICAgICBXQUlUX0ZBSUxFRDogMzcxNDksCiAgICAgICAgU1lOQ19GTFVTSF9DT01NQU5EU19CSVQ6IDEsCiAgICAgICAgVkVSVEVYX0FUVFJJQl9BUlJBWV9ESVZJU09SOiAzNTA3MCwKICAgICAgICBBTllfU0FNUExFU19QQVNTRUQ6IDM1ODg3LAogICAgICAgIEFOWV9TQU1QTEVTX1BBU1NFRF9DT05TRVJWQVRJVkU6IDM2MjAyLAogICAgICAgIFNBTVBMRVJfQklORElORzogMzUwOTcsCiAgICAgICAgUkdCMTBfQTJVSTogMzY5NzUsCiAgICAgICAgSU5UXzJfMTBfMTBfMTBfUkVWOiAzNjI1NSwKICAgICAgICBUUkFOU0ZPUk1fRkVFREJBQ0s6IDM2Mzg2LAogICAgICAgIFRSQU5TRk9STV9GRUVEQkFDS19QQVVTRUQ6IDM2Mzg3LAogICAgICAgIFRSQU5TRk9STV9GRUVEQkFDS19BQ1RJVkU6IDM2Mzg4LAogICAgICAgIFRSQU5TRk9STV9GRUVEQkFDS19CSU5ESU5HOiAzNjM4OSwKICAgICAgICBDT01QUkVTU0VEX1IxMV9FQUM6IDM3NDg4LAogICAgICAgIENPTVBSRVNTRURfU0lHTkVEX1IxMV9FQUM6IDM3NDg5LAogICAgICAgIENPTVBSRVNTRURfUkcxMV9FQUM6IDM3NDkwLAogICAgICAgIENPTVBSRVNTRURfU0lHTkVEX1JHMTFfRUFDOiAzNzQ5MSwKICAgICAgICBDT01QUkVTU0VEX1JHQjhfRVRDMjogMzc0OTIsCiAgICAgICAgQ09NUFJFU1NFRF9TUkdCOF9FVEMyOiAzNzQ5MywKICAgICAgICBDT01QUkVTU0VEX1JHQjhfUFVOQ0hUSFJPVUdIX0FMUEhBMV9FVEMyOiAzNzQ5NCwKICAgICAgICBDT01QUkVTU0VEX1NSR0I4X1BVTkNIVEhST1VHSF9BTFBIQTFfRVRDMjogMzc0OTUsCiAgICAgICAgQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQzogMzc0OTYsCiAgICAgICAgQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfRVRDMl9FQUM6IDM3NDk3LAogICAgICAgIFRFWFRVUkVfSU1NVVRBQkxFX0ZPUk1BVDogMzcxNjcsCiAgICAgICAgTUFYX0VMRU1FTlRfSU5ERVg6IDM2MjAzLAogICAgICAgIFRFWFRVUkVfSU1NVVRBQkxFX0xFVkVMUzogMzM1MDMsCiAgICAgICAgLy8gRXh0ZW5zaW9ucwogICAgICAgIE1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVDogMzQwNDcKICAgICAgfTsKICAgICAgV2ViR0xDb25zdGFudHNfZGVmYXVsdCA9IE9iamVjdC5mcmVlemUoV2ViR0xDb25zdGFudHMpOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ29tcG9uZW50RGF0YXR5cGUuanMKICB2YXIgQ29tcG9uZW50RGF0YXR5cGUsIENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQ7CiAgdmFyIGluaXRfQ29tcG9uZW50RGF0YXR5cGUgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NvbXBvbmVudERhdGF0eXBlLmpzIigpIHsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9XZWJHTENvbnN0YW50cygpOwogICAgICBDb21wb25lbnREYXRhdHlwZSA9IHsKICAgICAgICAvKioKICAgICAgICAgKiA4LWJpdCBzaWduZWQgYnl0ZSBjb3JyZXNwb25kaW5nIHRvIDxjb2RlPmdsLkJZVEU8L2NvZGU+IGFuZCB0aGUgdHlwZQogICAgICAgICAqIG9mIGFuIGVsZW1lbnQgaW4gPGNvZGU+SW50OEFycmF5PC9jb2RlPi4KICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgQllURTogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5CWVRFLAogICAgICAgIC8qKgogICAgICAgICAqIDgtYml0IHVuc2lnbmVkIGJ5dGUgY29ycmVzcG9uZGluZyB0byA8Y29kZT5VTlNJR05FRF9CWVRFPC9jb2RlPiBhbmQgdGhlIHR5cGUKICAgICAgICAgKiBvZiBhbiBlbGVtZW50IGluIDxjb2RlPlVpbnQ4QXJyYXk8L2NvZGU+LgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBVTlNJR05FRF9CWVRFOiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlVOU0lHTkVEX0JZVEUsCiAgICAgICAgLyoqCiAgICAgICAgICogMTYtYml0IHNpZ25lZCBzaG9ydCBjb3JyZXNwb25kaW5nIHRvIDxjb2RlPlNIT1JUPC9jb2RlPiBhbmQgdGhlIHR5cGUKICAgICAgICAgKiBvZiBhbiBlbGVtZW50IGluIDxjb2RlPkludDE2QXJyYXk8L2NvZGU+LgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBTSE9SVDogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5TSE9SVCwKICAgICAgICAvKioKICAgICAgICAgKiAxNi1iaXQgdW5zaWduZWQgc2hvcnQgY29ycmVzcG9uZGluZyB0byA8Y29kZT5VTlNJR05FRF9TSE9SVDwvY29kZT4gYW5kIHRoZSB0eXBlCiAgICAgICAgICogb2YgYW4gZWxlbWVudCBpbiA8Y29kZT5VaW50MTZBcnJheTwvY29kZT4uCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFVOU0lHTkVEX1NIT1JUOiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlVOU0lHTkVEX1NIT1JULAogICAgICAgIC8qKgogICAgICAgICAqIDMyLWJpdCBzaWduZWQgaW50IGNvcnJlc3BvbmRpbmcgdG8gPGNvZGU+SU5UPC9jb2RlPiBhbmQgdGhlIHR5cGUKICAgICAgICAgKiBvZiBhbiBlbGVtZW50IGluIDxjb2RlPkludDMyQXJyYXk8L2NvZGU+LgogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlck9mIENvbXBvbmVudERhdGF0eXBlCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIElOVDogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5JTlQsCiAgICAgICAgLyoqCiAgICAgICAgICogMzItYml0IHVuc2lnbmVkIGludCBjb3JyZXNwb25kaW5nIHRvIDxjb2RlPlVOU0lHTkVEX0lOVDwvY29kZT4gYW5kIHRoZSB0eXBlCiAgICAgICAgICogb2YgYW4gZWxlbWVudCBpbiA8Y29kZT5VaW50MzJBcnJheTwvY29kZT4uCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyT2YgQ29tcG9uZW50RGF0YXR5cGUKICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgVU5TSUdORURfSU5UOiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlVOU0lHTkVEX0lOVCwKICAgICAgICAvKioKICAgICAgICAgKiAzMi1iaXQgZmxvYXRpbmctcG9pbnQgY29ycmVzcG9uZGluZyB0byA8Y29kZT5GTE9BVDwvY29kZT4gYW5kIHRoZSB0eXBlCiAgICAgICAgICogb2YgYW4gZWxlbWVudCBpbiA8Y29kZT5GbG9hdDMyQXJyYXk8L2NvZGU+LgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBGTE9BVDogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5GTE9BVCwKICAgICAgICAvKioKICAgICAgICAgKiA2NC1iaXQgZmxvYXRpbmctcG9pbnQgY29ycmVzcG9uZGluZyB0byA8Y29kZT5nbC5ET1VCTEU8L2NvZGU+IChpbiBEZXNrdG9wIE9wZW5HTDsKICAgICAgICAgKiB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gV2ViR0wsIGFuZCBpcyBlbXVsYXRlZCBpbiBDZXNpdW0gdmlhIHtAbGluayBHZW9tZXRyeVBpcGVsaW5lLmVuY29kZUF0dHJpYnV0ZX0pCiAgICAgICAgICogYW5kIHRoZSB0eXBlIG9mIGFuIGVsZW1lbnQgaW4gPGNvZGU+RmxvYXQ2NEFycmF5PC9jb2RlPi4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJPZiBDb21wb25lbnREYXRhdHlwZQogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKiBAZGVmYXVsdCAweDE0MEEKICAgICAgICAgKi8KICAgICAgICBET1VCTEU6IFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuRE9VQkxFCiAgICAgIH07CiAgICAgIENvbXBvbmVudERhdGF0eXBlLmdldFNpemVJbkJ5dGVzID0gZnVuY3Rpb24oY29tcG9uZW50RGF0YXR5cGUpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChjb21wb25lbnREYXRhdHlwZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJ2YWx1ZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoIChjb21wb25lbnREYXRhdHlwZSkgewogICAgICAgICAgY2FzZSBDb21wb25lbnREYXRhdHlwZS5CWVRFOgogICAgICAgICAgICByZXR1cm4gSW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOwogICAgICAgICAgY2FzZSBDb21wb25lbnREYXRhdHlwZS5VTlNJR05FRF9CWVRFOgogICAgICAgICAgICByZXR1cm4gVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsKICAgICAgICAgIGNhc2UgQ29tcG9uZW50RGF0YXR5cGUuU0hPUlQ6CiAgICAgICAgICAgIHJldHVybiBJbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOwogICAgICAgICAgY2FzZSBDb21wb25lbnREYXRhdHlwZS5VTlNJR05FRF9TSE9SVDoKICAgICAgICAgICAgcmV0dXJuIFVpbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOwogICAgICAgICAgY2FzZSBDb21wb25lbnREYXRhdHlwZS5JTlQ6CiAgICAgICAgICAgIHJldHVybiBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOwogICAgICAgICAgY2FzZSBDb21wb25lbnREYXRhdHlwZS5VTlNJR05FRF9JTlQ6CiAgICAgICAgICAgIHJldHVybiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsKICAgICAgICAgIGNhc2UgQ29tcG9uZW50RGF0YXR5cGUuRkxPQVQ6CiAgICAgICAgICAgIHJldHVybiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7CiAgICAgICAgICBjYXNlIENvbXBvbmVudERhdGF0eXBlLkRPVUJMRToKICAgICAgICAgICAgcmV0dXJuIEZsb2F0NjRBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsKICAgICAgICAgIC8vPj5pbmNsdWRlU3RhcnQoJ2RlYnVnJywgcHJhZ21hcy5kZWJ1Zyk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiY29tcG9uZW50RGF0YXR5cGUgaXMgbm90IGEgdmFsaWQgdmFsdWUuIik7CiAgICAgICAgfQogICAgICB9OwogICAgICBDb21wb25lbnREYXRhdHlwZS5mcm9tVHlwZWRBcnJheSA9IGZ1bmN0aW9uKGFycmF5KSB7CiAgICAgICAgaWYgKGFycmF5IGluc3RhbmNlb2YgSW50OEFycmF5KSB7CiAgICAgICAgICByZXR1cm4gQ29tcG9uZW50RGF0YXR5cGUuQllURTsKICAgICAgICB9CiAgICAgICAgaWYgKGFycmF5IGluc3RhbmNlb2YgVWludDhBcnJheSkgewogICAgICAgICAgcmV0dXJuIENvbXBvbmVudERhdGF0eXBlLlVOU0lHTkVEX0JZVEU7CiAgICAgICAgfQogICAgICAgIGlmIChhcnJheSBpbnN0YW5jZW9mIEludDE2QXJyYXkpIHsKICAgICAgICAgIHJldHVybiBDb21wb25lbnREYXRhdHlwZS5TSE9SVDsKICAgICAgICB9CiAgICAgICAgaWYgKGFycmF5IGluc3RhbmNlb2YgVWludDE2QXJyYXkpIHsKICAgICAgICAgIHJldHVybiBDb21wb25lbnREYXRhdHlwZS5VTlNJR05FRF9TSE9SVDsKICAgICAgICB9CiAgICAgICAgaWYgKGFycmF5IGluc3RhbmNlb2YgSW50MzJBcnJheSkgewogICAgICAgICAgcmV0dXJuIENvbXBvbmVudERhdGF0eXBlLklOVDsKICAgICAgICB9CiAgICAgICAgaWYgKGFycmF5IGluc3RhbmNlb2YgVWludDMyQXJyYXkpIHsKICAgICAgICAgIHJldHVybiBDb21wb25lbnREYXRhdHlwZS5VTlNJR05FRF9JTlQ7CiAgICAgICAgfQogICAgICAgIGlmIChhcnJheSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkgewogICAgICAgICAgcmV0dXJuIENvbXBvbmVudERhdGF0eXBlLkZMT0FUOwogICAgICAgIH0KICAgICAgICBpZiAoYXJyYXkgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkpIHsKICAgICAgICAgIHJldHVybiBDb21wb25lbnREYXRhdHlwZS5ET1VCTEU7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgImFycmF5IG11c3QgYmUgYW4gSW50OEFycmF5LCBVaW50OEFycmF5LCBJbnQxNkFycmF5LCBVaW50MTZBcnJheSwgSW50MzJBcnJheSwgVWludDMyQXJyYXksIEZsb2F0MzJBcnJheSwgb3IgRmxvYXQ2NEFycmF5LiIKICAgICAgICApOwogICAgICB9OwogICAgICBDb21wb25lbnREYXRhdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKGNvbXBvbmVudERhdGF0eXBlKSB7CiAgICAgICAgcmV0dXJuIGRlZmluZWRfZGVmYXVsdChjb21wb25lbnREYXRhdHlwZSkgJiYgKGNvbXBvbmVudERhdGF0eXBlID09PSBDb21wb25lbnREYXRhdHlwZS5CWVRFIHx8IGNvbXBvbmVudERhdGF0eXBlID09PSBDb21wb25lbnREYXRhdHlwZS5VTlNJR05FRF9CWVRFIHx8IGNvbXBvbmVudERhdGF0eXBlID09PSBDb21wb25lbnREYXRhdHlwZS5TSE9SVCB8fCBjb21wb25lbnREYXRhdHlwZSA9PT0gQ29tcG9uZW50RGF0YXR5cGUuVU5TSUdORURfU0hPUlQgfHwgY29tcG9uZW50RGF0YXR5cGUgPT09IENvbXBvbmVudERhdGF0eXBlLklOVCB8fCBjb21wb25lbnREYXRhdHlwZSA9PT0gQ29tcG9uZW50RGF0YXR5cGUuVU5TSUdORURfSU5UIHx8IGNvbXBvbmVudERhdGF0eXBlID09PSBDb21wb25lbnREYXRhdHlwZS5GTE9BVCB8fCBjb21wb25lbnREYXRhdHlwZSA9PT0gQ29tcG9uZW50RGF0YXR5cGUuRE9VQkxFKTsKICAgICAgfTsKICAgICAgQ29tcG9uZW50RGF0YXR5cGUuY3JlYXRlVHlwZWRBcnJheSA9IGZ1bmN0aW9uKGNvbXBvbmVudERhdGF0eXBlLCB2YWx1ZXNPckxlbmd0aCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGNvbXBvbmVudERhdGF0eXBlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImNvbXBvbmVudERhdGF0eXBlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh2YWx1ZXNPckxlbmd0aCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJ2YWx1ZXNPckxlbmd0aCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoIChjb21wb25lbnREYXRhdHlwZSkgewogICAgICAgICAgY2FzZSBDb21wb25lbnREYXRhdHlwZS5CWVRFOgogICAgICAgICAgICByZXR1cm4gbmV3IEludDhBcnJheSh2YWx1ZXNPckxlbmd0aCk7CiAgICAgICAgICBjYXNlIENvbXBvbmVudERhdGF0eXBlLlVOU0lHTkVEX0JZVEU6CiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh2YWx1ZXNPckxlbmd0aCk7CiAgICAgICAgICBjYXNlIENvbXBvbmVudERhdGF0eXBlLlNIT1JUOgogICAgICAgICAgICByZXR1cm4gbmV3IEludDE2QXJyYXkodmFsdWVzT3JMZW5ndGgpOwogICAgICAgICAgY2FzZSBDb21wb25lbnREYXRhdHlwZS5VTlNJR05FRF9TSE9SVDoKICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50MTZBcnJheSh2YWx1ZXNPckxlbmd0aCk7CiAgICAgICAgICBjYXNlIENvbXBvbmVudERhdGF0eXBlLklOVDoKICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KHZhbHVlc09yTGVuZ3RoKTsKICAgICAgICAgIGNhc2UgQ29tcG9uZW50RGF0YXR5cGUuVU5TSUdORURfSU5UOgogICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KHZhbHVlc09yTGVuZ3RoKTsKICAgICAgICAgIGNhc2UgQ29tcG9uZW50RGF0YXR5cGUuRkxPQVQ6CiAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KHZhbHVlc09yTGVuZ3RoKTsKICAgICAgICAgIGNhc2UgQ29tcG9uZW50RGF0YXR5cGUuRE9VQkxFOgogICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0NjRBcnJheSh2YWx1ZXNPckxlbmd0aCk7CiAgICAgICAgICAvLz4+aW5jbHVkZVN0YXJ0KCdkZWJ1ZycsIHByYWdtYXMuZGVidWcpOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImNvbXBvbmVudERhdGF0eXBlIGlzIG5vdCBhIHZhbGlkIHZhbHVlLiIpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ29tcG9uZW50RGF0YXR5cGUuY3JlYXRlQXJyYXlCdWZmZXJWaWV3ID0gZnVuY3Rpb24oY29tcG9uZW50RGF0YXR5cGUsIGJ1ZmZlciwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoY29tcG9uZW50RGF0YXR5cGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiY29tcG9uZW50RGF0YXR5cGUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGJ1ZmZlcikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJidWZmZXIgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGJ5dGVPZmZzZXQgPSBieXRlT2Zmc2V0ID8/IDA7CiAgICAgICAgbGVuZ3RoID0gbGVuZ3RoID8/IChidWZmZXIuYnl0ZUxlbmd0aCAtIGJ5dGVPZmZzZXQpIC8gQ29tcG9uZW50RGF0YXR5cGUuZ2V0U2l6ZUluQnl0ZXMoY29tcG9uZW50RGF0YXR5cGUpOwogICAgICAgIHN3aXRjaCAoY29tcG9uZW50RGF0YXR5cGUpIHsKICAgICAgICAgIGNhc2UgQ29tcG9uZW50RGF0YXR5cGUuQllURToKICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnQ4QXJyYXkoYnVmZmVyLCBieXRlT2Zmc2V0LCBsZW5ndGgpOwogICAgICAgICAgY2FzZSBDb21wb25lbnREYXRhdHlwZS5VTlNJR05FRF9CWVRFOgogICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLCBieXRlT2Zmc2V0LCBsZW5ndGgpOwogICAgICAgICAgY2FzZSBDb21wb25lbnREYXRhdHlwZS5TSE9SVDoKICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnQxNkFycmF5KGJ1ZmZlciwgYnl0ZU9mZnNldCwgbGVuZ3RoKTsKICAgICAgICAgIGNhc2UgQ29tcG9uZW50RGF0YXR5cGUuVU5TSUdORURfU0hPUlQ6CiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDE2QXJyYXkoYnVmZmVyLCBieXRlT2Zmc2V0LCBsZW5ndGgpOwogICAgICAgICAgY2FzZSBDb21wb25lbnREYXRhdHlwZS5JTlQ6CiAgICAgICAgICAgIHJldHVybiBuZXcgSW50MzJBcnJheShidWZmZXIsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7CiAgICAgICAgICBjYXNlIENvbXBvbmVudERhdGF0eXBlLlVOU0lHTkVEX0lOVDoKICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50MzJBcnJheShidWZmZXIsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7CiAgICAgICAgICBjYXNlIENvbXBvbmVudERhdGF0eXBlLkZMT0FUOgogICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShidWZmZXIsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7CiAgICAgICAgICBjYXNlIENvbXBvbmVudERhdGF0eXBlLkRPVUJMRToKICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdDY0QXJyYXkoYnVmZmVyLCBieXRlT2Zmc2V0LCBsZW5ndGgpOwogICAgICAgICAgLy8+PmluY2x1ZGVTdGFydCgnZGVidWcnLCBwcmFnbWFzLmRlYnVnKTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJjb21wb25lbnREYXRhdHlwZSBpcyBub3QgYSB2YWxpZCB2YWx1ZS4iKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENvbXBvbmVudERhdGF0eXBlLmZyb21OYW1lID0gZnVuY3Rpb24obmFtZSkgewogICAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICAgICAgY2FzZSAiQllURSI6CiAgICAgICAgICAgIHJldHVybiBDb21wb25lbnREYXRhdHlwZS5CWVRFOwogICAgICAgICAgY2FzZSAiVU5TSUdORURfQllURSI6CiAgICAgICAgICAgIHJldHVybiBDb21wb25lbnREYXRhdHlwZS5VTlNJR05FRF9CWVRFOwogICAgICAgICAgY2FzZSAiU0hPUlQiOgogICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50RGF0YXR5cGUuU0hPUlQ7CiAgICAgICAgICBjYXNlICJVTlNJR05FRF9TSE9SVCI6CiAgICAgICAgICAgIHJldHVybiBDb21wb25lbnREYXRhdHlwZS5VTlNJR05FRF9TSE9SVDsKICAgICAgICAgIGNhc2UgIklOVCI6CiAgICAgICAgICAgIHJldHVybiBDb21wb25lbnREYXRhdHlwZS5JTlQ7CiAgICAgICAgICBjYXNlICJVTlNJR05FRF9JTlQiOgogICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50RGF0YXR5cGUuVU5TSUdORURfSU5UOwogICAgICAgICAgY2FzZSAiRkxPQVQiOgogICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50RGF0YXR5cGUuRkxPQVQ7CiAgICAgICAgICBjYXNlICJET1VCTEUiOgogICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50RGF0YXR5cGUuRE9VQkxFOwogICAgICAgICAgLy8+PmluY2x1ZGVTdGFydCgnZGVidWcnLCBwcmFnbWFzLmRlYnVnKTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJuYW1lIGlzIG5vdCBhIHZhbGlkIHZhbHVlLiIpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdCA9IE9iamVjdC5mcmVlemUoQ29tcG9uZW50RGF0YXR5cGUpOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvR2VvbWV0cnlUeXBlLmpzCiAgdmFyIEdlb21ldHJ5VHlwZSwgR2VvbWV0cnlUeXBlX2RlZmF1bHQ7CiAgdmFyIGluaXRfR2VvbWV0cnlUeXBlID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9HZW9tZXRyeVR5cGUuanMiKCkgewogICAgICBHZW9tZXRyeVR5cGUgPSB7CiAgICAgICAgTk9ORTogMCwKICAgICAgICBUUklBTkdMRVM6IDEsCiAgICAgICAgTElORVM6IDIsCiAgICAgICAgUE9MWUxJTkVTOiAzCiAgICAgIH07CiAgICAgIEdlb21ldHJ5VHlwZV9kZWZhdWx0ID0gT2JqZWN0LmZyZWV6ZShHZW9tZXRyeVR5cGUpOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvTWF0cml4Mi5qcwogIGZ1bmN0aW9uIE1hdHJpeDIoY29sdW1uMFJvdzAsIGNvbHVtbjFSb3cwLCBjb2x1bW4wUm93MSwgY29sdW1uMVJvdzEpIHsKICAgIHRoaXNbMF0gPSBjb2x1bW4wUm93MCA/PyAwOwogICAgdGhpc1sxXSA9IGNvbHVtbjBSb3cxID8/IDA7CiAgICB0aGlzWzJdID0gY29sdW1uMVJvdzAgPz8gMDsKICAgIHRoaXNbM10gPSBjb2x1bW4xUm93MSA/PyAwOwogIH0KICB2YXIgc2NhbGVTY3JhdGNoMTMsIHNjYWxlU2NyYXRjaDIzLCBzY3JhdGNoQ29sdW1uMywgc2NhbGVTY3JhdGNoMzMsIHNjYWxlU2NyYXRjaDQzLCBzY2FsZVNjcmF0Y2g1MywgTWF0cml4Ml9kZWZhdWx0OwogIHZhciBpbml0X01hdHJpeDIgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL01hdHJpeDIuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjIoKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBNYXRyaXgyLnBhY2tlZExlbmd0aCA9IDQ7CiAgICAgIE1hdHJpeDIucGFjayA9IGZ1bmN0aW9uKHZhbHVlLCBhcnJheSwgc3RhcnRpbmdJbmRleCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZVswXTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWVbMV07CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlWzJdOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZVszXTsKICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH07CiAgICAgIE1hdHJpeDIudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgTWF0cml4MigpOwogICAgICAgIH0KICAgICAgICByZXN1bHRbMF0gPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdFsxXSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0WzJdID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICByZXN1bHRbM10gPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDIucGFja0FycmF5ID0gZnVuY3Rpb24oYXJyYXksIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgICAgIGNvbnN0IHJlc3VsdExlbmd0aCA9IGxlbmd0aCAqIDQ7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KHJlc3VsdExlbmd0aCk7CiAgICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShyZXN1bHQpICYmIHJlc3VsdC5sZW5ndGggIT09IHJlc3VsdExlbmd0aCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogNCBlbGVtZW50cyIKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQubGVuZ3RoICE9PSByZXN1bHRMZW5ndGgpIHsKICAgICAgICAgIHJlc3VsdC5sZW5ndGggPSByZXN1bHRMZW5ndGg7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgIE1hdHJpeDIucGFjayhhcnJheVtpXSwgcmVzdWx0LCBpICogNCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDIudW5wYWNrQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiYXJyYXkubGVuZ3RoIiwgYXJyYXkubGVuZ3RoLCA0KTsKICAgICAgICBpZiAoYXJyYXkubGVuZ3RoICUgNCAhPT0gMCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShsZW5ndGggLyA0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0Lmxlbmd0aCA9IGxlbmd0aCAvIDQ7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKICAgICAgICAgIGNvbnN0IGluZGV4ID0gaSAvIDQ7CiAgICAgICAgICByZXN1bHRbaW5kZXhdID0gTWF0cml4Mi51bnBhY2soYXJyYXksIGksIHJlc3VsdFtpbmRleF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXgyLmNsb25lID0gZnVuY3Rpb24obWF0cml4LCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChtYXRyaXgpKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IE1hdHJpeDIobWF0cml4WzBdLCBtYXRyaXhbMl0sIG1hdHJpeFsxXSwgbWF0cml4WzNdKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0WzBdID0gbWF0cml4WzBdOwogICAgICAgIHJlc3VsdFsxXSA9IG1hdHJpeFsxXTsKICAgICAgICByZXN1bHRbMl0gPSBtYXRyaXhbMl07CiAgICAgICAgcmVzdWx0WzNdID0gbWF0cml4WzNdOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDIuZnJvbUFycmF5ID0gTWF0cml4Mi51bnBhY2s7CiAgICAgIE1hdHJpeDIuZnJvbUNvbHVtbk1ham9yQXJyYXkgPSBmdW5jdGlvbih2YWx1ZXMsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgidmFsdWVzIiwgdmFsdWVzKTsKICAgICAgICByZXR1cm4gTWF0cml4Mi5jbG9uZSh2YWx1ZXMsIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIE1hdHJpeDIuZnJvbVJvd01ham9yQXJyYXkgPSBmdW5jdGlvbih2YWx1ZXMsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgidmFsdWVzIiwgdmFsdWVzKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IE1hdHJpeDIodmFsdWVzWzBdLCB2YWx1ZXNbMV0sIHZhbHVlc1syXSwgdmFsdWVzWzNdKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0WzBdID0gdmFsdWVzWzBdOwogICAgICAgIHJlc3VsdFsxXSA9IHZhbHVlc1syXTsKICAgICAgICByZXN1bHRbMl0gPSB2YWx1ZXNbMV07CiAgICAgICAgcmVzdWx0WzNdID0gdmFsdWVzWzNdOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDIuZnJvbVNjYWxlID0gZnVuY3Rpb24oc2NhbGUsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic2NhbGUiLCBzY2FsZSk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBNYXRyaXgyKHNjYWxlLngsIDAsIDAsIHNjYWxlLnkpOwogICAgICAgIH0KICAgICAgICByZXN1bHRbMF0gPSBzY2FsZS54OwogICAgICAgIHJlc3VsdFsxXSA9IDA7CiAgICAgICAgcmVzdWx0WzJdID0gMDsKICAgICAgICByZXN1bHRbM10gPSBzY2FsZS55OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDIuZnJvbVVuaWZvcm1TY2FsZSA9IGZ1bmN0aW9uKHNjYWxlLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoInNjYWxlIiwgc2NhbGUpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgTWF0cml4MihzY2FsZSwgMCwgMCwgc2NhbGUpOwogICAgICAgIH0KICAgICAgICByZXN1bHRbMF0gPSBzY2FsZTsKICAgICAgICByZXN1bHRbMV0gPSAwOwogICAgICAgIHJlc3VsdFsyXSA9IDA7CiAgICAgICAgcmVzdWx0WzNdID0gc2NhbGU7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4Mi5mcm9tUm90YXRpb24gPSBmdW5jdGlvbihhbmdsZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJhbmdsZSIsIGFuZ2xlKTsKICAgICAgICBjb25zdCBjb3NBbmdsZSA9IE1hdGguY29zKGFuZ2xlKTsKICAgICAgICBjb25zdCBzaW5BbmdsZSA9IE1hdGguc2luKGFuZ2xlKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IE1hdHJpeDIoY29zQW5nbGUsIC1zaW5BbmdsZSwgc2luQW5nbGUsIGNvc0FuZ2xlKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0WzBdID0gY29zQW5nbGU7CiAgICAgICAgcmVzdWx0WzFdID0gc2luQW5nbGU7CiAgICAgICAgcmVzdWx0WzJdID0gLXNpbkFuZ2xlOwogICAgICAgIHJlc3VsdFszXSA9IGNvc0FuZ2xlOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDIudG9BcnJheSA9IGZ1bmN0aW9uKG1hdHJpeCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBbbWF0cml4WzBdLCBtYXRyaXhbMV0sIG1hdHJpeFsyXSwgbWF0cml4WzNdXTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0WzBdID0gbWF0cml4WzBdOwogICAgICAgIHJlc3VsdFsxXSA9IG1hdHJpeFsxXTsKICAgICAgICByZXN1bHRbMl0gPSBtYXRyaXhbMl07CiAgICAgICAgcmVzdWx0WzNdID0gbWF0cml4WzNdOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDIuZ2V0RWxlbWVudEluZGV4ID0gZnVuY3Rpb24oY29sdW1uLCByb3cpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygicm93Iiwgcm93LCAwKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygicm93Iiwgcm93LCAxKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiY29sdW1uIiwgY29sdW1uLCAwKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiY29sdW1uIiwgY29sdW1uLCAxKTsKICAgICAgICByZXR1cm4gY29sdW1uICogMiArIHJvdzsKICAgICAgfTsKICAgICAgTWF0cml4Mi5nZXRDb2x1bW4gPSBmdW5jdGlvbihtYXRyaXgsIGluZGV4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImluZGV4IiwgaW5kZXgsIDApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJpbmRleCIsIGluZGV4LCAxKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGluZGV4ICogMjsKICAgICAgICBjb25zdCB4ID0gbWF0cml4W3N0YXJ0SW5kZXhdOwogICAgICAgIGNvbnN0IHkgPSBtYXRyaXhbc3RhcnRJbmRleCArIDFdOwogICAgICAgIHJlc3VsdC54ID0geDsKICAgICAgICByZXN1bHQueSA9IHk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4Mi5zZXRDb2x1bW4gPSBmdW5jdGlvbihtYXRyaXgsIGluZGV4LCBjYXJ0ZXNpYW4xMSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJpbmRleCIsIGluZGV4LCAwKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiaW5kZXgiLCBpbmRleCwgMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdCA9IE1hdHJpeDIuY2xvbmUobWF0cml4LCByZXN1bHQpOwogICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBpbmRleCAqIDI7CiAgICAgICAgcmVzdWx0W3N0YXJ0SW5kZXhdID0gY2FydGVzaWFuMTEueDsKICAgICAgICByZXN1bHRbc3RhcnRJbmRleCArIDFdID0gY2FydGVzaWFuMTEueTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXgyLmdldFJvdyA9IGZ1bmN0aW9uKG1hdHJpeCwgaW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF0cml4IiwgbWF0cml4KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiaW5kZXgiLCBpbmRleCwgMCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImluZGV4IiwgaW5kZXgsIDEpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBjb25zdCB4ID0gbWF0cml4W2luZGV4XTsKICAgICAgICBjb25zdCB5ID0gbWF0cml4W2luZGV4ICsgMl07CiAgICAgICAgcmVzdWx0LnggPSB4OwogICAgICAgIHJlc3VsdC55ID0geTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXgyLnNldFJvdyA9IGZ1bmN0aW9uKG1hdHJpeCwgaW5kZXgsIGNhcnRlc2lhbjExLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImluZGV4IiwgaW5kZXgsIDApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJpbmRleCIsIGluZGV4LCAxKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsIGNhcnRlc2lhbjExKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0ID0gTWF0cml4Mi5jbG9uZShtYXRyaXgsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0W2luZGV4XSA9IGNhcnRlc2lhbjExLng7CiAgICAgICAgcmVzdWx0W2luZGV4ICsgMl0gPSBjYXJ0ZXNpYW4xMS55OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHNjYWxlU2NyYXRjaDEzID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICBNYXRyaXgyLnNldFNjYWxlID0gZnVuY3Rpb24obWF0cml4LCBzY2FsZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic2NhbGUiLCBzY2FsZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IGV4aXN0aW5nU2NhbGUgPSBNYXRyaXgyLmdldFNjYWxlKG1hdHJpeCwgc2NhbGVTY3JhdGNoMTMpOwogICAgICAgIGNvbnN0IHNjYWxlUmF0aW9YID0gc2NhbGUueCAvIGV4aXN0aW5nU2NhbGUueDsKICAgICAgICBjb25zdCBzY2FsZVJhdGlvWSA9IHNjYWxlLnkgLyBleGlzdGluZ1NjYWxlLnk7CiAgICAgICAgcmVzdWx0WzBdID0gbWF0cml4WzBdICogc2NhbGVSYXRpb1g7CiAgICAgICAgcmVzdWx0WzFdID0gbWF0cml4WzFdICogc2NhbGVSYXRpb1g7CiAgICAgICAgcmVzdWx0WzJdID0gbWF0cml4WzJdICogc2NhbGVSYXRpb1k7CiAgICAgICAgcmVzdWx0WzNdID0gbWF0cml4WzNdICogc2NhbGVSYXRpb1k7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgc2NhbGVTY3JhdGNoMjMgPSBuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KCk7CiAgICAgIE1hdHJpeDIuc2V0VW5pZm9ybVNjYWxlID0gZnVuY3Rpb24obWF0cml4LCBzY2FsZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigic2NhbGUiLCBzY2FsZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IGV4aXN0aW5nU2NhbGUgPSBNYXRyaXgyLmdldFNjYWxlKG1hdHJpeCwgc2NhbGVTY3JhdGNoMjMpOwogICAgICAgIGNvbnN0IHNjYWxlUmF0aW9YID0gc2NhbGUgLyBleGlzdGluZ1NjYWxlLng7CiAgICAgICAgY29uc3Qgc2NhbGVSYXRpb1kgPSBzY2FsZSAvIGV4aXN0aW5nU2NhbGUueTsKICAgICAgICByZXN1bHRbMF0gPSBtYXRyaXhbMF0gKiBzY2FsZVJhdGlvWDsKICAgICAgICByZXN1bHRbMV0gPSBtYXRyaXhbMV0gKiBzY2FsZVJhdGlvWDsKICAgICAgICByZXN1bHRbMl0gPSBtYXRyaXhbMl0gKiBzY2FsZVJhdGlvWTsKICAgICAgICByZXN1bHRbM10gPSBtYXRyaXhbM10gKiBzY2FsZVJhdGlvWTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBzY3JhdGNoQ29sdW1uMyA9IG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKTsKICAgICAgTWF0cml4Mi5nZXRTY2FsZSA9IGZ1bmN0aW9uKG1hdHJpeCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IENhcnRlc2lhbjJfZGVmYXVsdC5tYWduaXR1ZGUoCiAgICAgICAgICBDYXJ0ZXNpYW4yX2RlZmF1bHQuZnJvbUVsZW1lbnRzKG1hdHJpeFswXSwgbWF0cml4WzFdLCBzY3JhdGNoQ29sdW1uMykKICAgICAgICApOwogICAgICAgIHJlc3VsdC55ID0gQ2FydGVzaWFuMl9kZWZhdWx0Lm1hZ25pdHVkZSgKICAgICAgICAgIENhcnRlc2lhbjJfZGVmYXVsdC5mcm9tRWxlbWVudHMobWF0cml4WzJdLCBtYXRyaXhbM10sIHNjcmF0Y2hDb2x1bW4zKQogICAgICAgICk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgc2NhbGVTY3JhdGNoMzMgPSBuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KCk7CiAgICAgIE1hdHJpeDIuZ2V0TWF4aW11bVNjYWxlID0gZnVuY3Rpb24obWF0cml4KSB7CiAgICAgICAgTWF0cml4Mi5nZXRTY2FsZShtYXRyaXgsIHNjYWxlU2NyYXRjaDMzKTsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuMl9kZWZhdWx0Lm1heGltdW1Db21wb25lbnQoc2NhbGVTY3JhdGNoMzMpOwogICAgICB9OwogICAgICBzY2FsZVNjcmF0Y2g0MyA9IG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKTsKICAgICAgTWF0cml4Mi5zZXRSb3RhdGlvbiA9IGZ1bmN0aW9uKG1hdHJpeCwgcm90YXRpb24sIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF0cml4IiwgbWF0cml4KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3Qgc2NhbGUgPSBNYXRyaXgyLmdldFNjYWxlKG1hdHJpeCwgc2NhbGVTY3JhdGNoNDMpOwogICAgICAgIHJlc3VsdFswXSA9IHJvdGF0aW9uWzBdICogc2NhbGUueDsKICAgICAgICByZXN1bHRbMV0gPSByb3RhdGlvblsxXSAqIHNjYWxlLng7CiAgICAgICAgcmVzdWx0WzJdID0gcm90YXRpb25bMl0gKiBzY2FsZS55OwogICAgICAgIHJlc3VsdFszXSA9IHJvdGF0aW9uWzNdICogc2NhbGUueTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBzY2FsZVNjcmF0Y2g1MyA9IG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKTsKICAgICAgTWF0cml4Mi5nZXRSb3RhdGlvbiA9IGZ1bmN0aW9uKG1hdHJpeCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBjb25zdCBzY2FsZSA9IE1hdHJpeDIuZ2V0U2NhbGUobWF0cml4LCBzY2FsZVNjcmF0Y2g1Myk7CiAgICAgICAgcmVzdWx0WzBdID0gbWF0cml4WzBdIC8gc2NhbGUueDsKICAgICAgICByZXN1bHRbMV0gPSBtYXRyaXhbMV0gLyBzY2FsZS54OwogICAgICAgIHJlc3VsdFsyXSA9IG1hdHJpeFsyXSAvIHNjYWxlLnk7CiAgICAgICAgcmVzdWx0WzNdID0gbWF0cml4WzNdIC8gc2NhbGUueTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXgyLm11bHRpcGx5ID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IGNvbHVtbjBSb3cwID0gbGVmdFswXSAqIHJpZ2h0WzBdICsgbGVmdFsyXSAqIHJpZ2h0WzFdOwogICAgICAgIGNvbnN0IGNvbHVtbjFSb3cwID0gbGVmdFswXSAqIHJpZ2h0WzJdICsgbGVmdFsyXSAqIHJpZ2h0WzNdOwogICAgICAgIGNvbnN0IGNvbHVtbjBSb3cxID0gbGVmdFsxXSAqIHJpZ2h0WzBdICsgbGVmdFszXSAqIHJpZ2h0WzFdOwogICAgICAgIGNvbnN0IGNvbHVtbjFSb3cxID0gbGVmdFsxXSAqIHJpZ2h0WzJdICsgbGVmdFszXSAqIHJpZ2h0WzNdOwogICAgICAgIHJlc3VsdFswXSA9IGNvbHVtbjBSb3cwOwogICAgICAgIHJlc3VsdFsxXSA9IGNvbHVtbjBSb3cxOwogICAgICAgIHJlc3VsdFsyXSA9IGNvbHVtbjFSb3cwOwogICAgICAgIHJlc3VsdFszXSA9IGNvbHVtbjFSb3cxOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDIuYWRkID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdFswXSA9IGxlZnRbMF0gKyByaWdodFswXTsKICAgICAgICByZXN1bHRbMV0gPSBsZWZ0WzFdICsgcmlnaHRbMV07CiAgICAgICAgcmVzdWx0WzJdID0gbGVmdFsyXSArIHJpZ2h0WzJdOwogICAgICAgIHJlc3VsdFszXSA9IGxlZnRbM10gKyByaWdodFszXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXgyLnN1YnRyYWN0ID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdFswXSA9IGxlZnRbMF0gLSByaWdodFswXTsKICAgICAgICByZXN1bHRbMV0gPSBsZWZ0WzFdIC0gcmlnaHRbMV07CiAgICAgICAgcmVzdWx0WzJdID0gbGVmdFsyXSAtIHJpZ2h0WzJdOwogICAgICAgIHJlc3VsdFszXSA9IGxlZnRbM10gLSByaWdodFszXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXgyLm11bHRpcGx5QnlWZWN0b3IgPSBmdW5jdGlvbihtYXRyaXgsIGNhcnRlc2lhbjExLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IHggPSBtYXRyaXhbMF0gKiBjYXJ0ZXNpYW4xMS54ICsgbWF0cml4WzJdICogY2FydGVzaWFuMTEueTsKICAgICAgICBjb25zdCB5ID0gbWF0cml4WzFdICogY2FydGVzaWFuMTEueCArIG1hdHJpeFszXSAqIGNhcnRlc2lhbjExLnk7CiAgICAgICAgcmVzdWx0LnggPSB4OwogICAgICAgIHJlc3VsdC55ID0geTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXgyLm11bHRpcGx5QnlTY2FsYXIgPSBmdW5jdGlvbihtYXRyaXgsIHNjYWxhciwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigic2NhbGFyIiwgc2NhbGFyKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0WzBdID0gbWF0cml4WzBdICogc2NhbGFyOwogICAgICAgIHJlc3VsdFsxXSA9IG1hdHJpeFsxXSAqIHNjYWxhcjsKICAgICAgICByZXN1bHRbMl0gPSBtYXRyaXhbMl0gKiBzY2FsYXI7CiAgICAgICAgcmVzdWx0WzNdID0gbWF0cml4WzNdICogc2NhbGFyOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDIubXVsdGlwbHlCeVNjYWxlID0gZnVuY3Rpb24obWF0cml4LCBzY2FsZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic2NhbGUiLCBzY2FsZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdFswXSA9IG1hdHJpeFswXSAqIHNjYWxlLng7CiAgICAgICAgcmVzdWx0WzFdID0gbWF0cml4WzFdICogc2NhbGUueDsKICAgICAgICByZXN1bHRbMl0gPSBtYXRyaXhbMl0gKiBzY2FsZS55OwogICAgICAgIHJlc3VsdFszXSA9IG1hdHJpeFszXSAqIHNjYWxlLnk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4Mi5tdWx0aXBseUJ5VW5pZm9ybVNjYWxlID0gZnVuY3Rpb24obWF0cml4LCBzY2FsZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigic2NhbGUiLCBzY2FsZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdFswXSA9IG1hdHJpeFswXSAqIHNjYWxlOwogICAgICAgIHJlc3VsdFsxXSA9IG1hdHJpeFsxXSAqIHNjYWxlOwogICAgICAgIHJlc3VsdFsyXSA9IG1hdHJpeFsyXSAqIHNjYWxlOwogICAgICAgIHJlc3VsdFszXSA9IG1hdHJpeFszXSAqIHNjYWxlOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE1hdHJpeDIubmVnYXRlID0gZnVuY3Rpb24obWF0cml4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdFswXSA9IC1tYXRyaXhbMF07CiAgICAgICAgcmVzdWx0WzFdID0gLW1hdHJpeFsxXTsKICAgICAgICByZXN1bHRbMl0gPSAtbWF0cml4WzJdOwogICAgICAgIHJlc3VsdFszXSA9IC1tYXRyaXhbM107CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4Mi50cmFuc3Bvc2UgPSBmdW5jdGlvbihtYXRyaXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF0cml4IiwgbWF0cml4KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3QgY29sdW1uMFJvdzAgPSBtYXRyaXhbMF07CiAgICAgICAgY29uc3QgY29sdW1uMFJvdzEgPSBtYXRyaXhbMl07CiAgICAgICAgY29uc3QgY29sdW1uMVJvdzAgPSBtYXRyaXhbMV07CiAgICAgICAgY29uc3QgY29sdW1uMVJvdzEgPSBtYXRyaXhbM107CiAgICAgICAgcmVzdWx0WzBdID0gY29sdW1uMFJvdzA7CiAgICAgICAgcmVzdWx0WzFdID0gY29sdW1uMFJvdzE7CiAgICAgICAgcmVzdWx0WzJdID0gY29sdW1uMVJvdzA7CiAgICAgICAgcmVzdWx0WzNdID0gY29sdW1uMVJvdzE7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTWF0cml4Mi5hYnMgPSBmdW5jdGlvbihtYXRyaXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF0cml4IiwgbWF0cml4KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0WzBdID0gTWF0aC5hYnMobWF0cml4WzBdKTsKICAgICAgICByZXN1bHRbMV0gPSBNYXRoLmFicyhtYXRyaXhbMV0pOwogICAgICAgIHJlc3VsdFsyXSA9IE1hdGguYWJzKG1hdHJpeFsyXSk7CiAgICAgICAgcmVzdWx0WzNdID0gTWF0aC5hYnMobWF0cml4WzNdKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBNYXRyaXgyLmVxdWFscyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8IGRlZmluZWRfZGVmYXVsdChsZWZ0KSAmJiBkZWZpbmVkX2RlZmF1bHQocmlnaHQpICYmIGxlZnRbMF0gPT09IHJpZ2h0WzBdICYmIGxlZnRbMV0gPT09IHJpZ2h0WzFdICYmIGxlZnRbMl0gPT09IHJpZ2h0WzJdICYmIGxlZnRbM10gPT09IHJpZ2h0WzNdOwogICAgICB9OwogICAgICBNYXRyaXgyLmVxdWFsc0FycmF5ID0gZnVuY3Rpb24obWF0cml4LCBhcnJheSwgb2Zmc2V0KSB7CiAgICAgICAgcmV0dXJuIG1hdHJpeFswXSA9PT0gYXJyYXlbb2Zmc2V0XSAmJiBtYXRyaXhbMV0gPT09IGFycmF5W29mZnNldCArIDFdICYmIG1hdHJpeFsyXSA9PT0gYXJyYXlbb2Zmc2V0ICsgMl0gJiYgbWF0cml4WzNdID09PSBhcnJheVtvZmZzZXQgKyAzXTsKICAgICAgfTsKICAgICAgTWF0cml4Mi5lcXVhbHNFcHNpbG9uID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIGVwc2lsb24pIHsKICAgICAgICBlcHNpbG9uID0gZXBzaWxvbiA/PyAwOwogICAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodCB8fCBkZWZpbmVkX2RlZmF1bHQobGVmdCkgJiYgZGVmaW5lZF9kZWZhdWx0KHJpZ2h0KSAmJiBNYXRoLmFicyhsZWZ0WzBdIC0gcmlnaHRbMF0pIDw9IGVwc2lsb24gJiYgTWF0aC5hYnMobGVmdFsxXSAtIHJpZ2h0WzFdKSA8PSBlcHNpbG9uICYmIE1hdGguYWJzKGxlZnRbMl0gLSByaWdodFsyXSkgPD0gZXBzaWxvbiAmJiBNYXRoLmFicyhsZWZ0WzNdIC0gcmlnaHRbM10pIDw9IGVwc2lsb247CiAgICAgIH07CiAgICAgIE1hdHJpeDIuSURFTlRJVFkgPSBPYmplY3QuZnJlZXplKG5ldyBNYXRyaXgyKDEsIDAsIDAsIDEpKTsKICAgICAgTWF0cml4Mi5aRVJPID0gT2JqZWN0LmZyZWV6ZShuZXcgTWF0cml4MigwLCAwLCAwLCAwKSk7CiAgICAgIE1hdHJpeDIuQ09MVU1OMFJPVzAgPSAwOwogICAgICBNYXRyaXgyLkNPTFVNTjBST1cxID0gMTsKICAgICAgTWF0cml4Mi5DT0xVTU4xUk9XMCA9IDI7CiAgICAgIE1hdHJpeDIuQ09MVU1OMVJPVzEgPSAzOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhNYXRyaXgyLnByb3RvdHlwZSwgewogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgY29sbGVjdGlvbi4KICAgICAgICAgKiBAbWVtYmVyb2YgTWF0cml4Mi5wcm90b3R5cGUKICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgbGVuZ3RoOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gTWF0cml4Mi5wYWNrZWRMZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgTWF0cml4Mi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICByZXR1cm4gTWF0cml4Mi5jbG9uZSh0aGlzLCByZXN1bHQpOwogICAgICB9OwogICAgICBNYXRyaXgyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbihyaWdodCkgewogICAgICAgIHJldHVybiBNYXRyaXgyLmVxdWFscyh0aGlzLCByaWdodCk7CiAgICAgIH07CiAgICAgIE1hdHJpeDIucHJvdG90eXBlLmVxdWFsc0Vwc2lsb24gPSBmdW5jdGlvbihyaWdodCwgZXBzaWxvbikgewogICAgICAgIHJldHVybiBNYXRyaXgyLmVxdWFsc0Vwc2lsb24odGhpcywgcmlnaHQsIGVwc2lsb24pOwogICAgICB9OwogICAgICBNYXRyaXgyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBgKCR7dGhpc1swXX0sICR7dGhpc1syXX0pCigke3RoaXNbMV19LCAke3RoaXNbM119KWA7CiAgICAgIH07CiAgICAgIE1hdHJpeDJfZGVmYXVsdCA9IE1hdHJpeDI7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9QcmltaXRpdmVUeXBlLmpzCiAgdmFyIFByaW1pdGl2ZVR5cGUsIFByaW1pdGl2ZVR5cGVfZGVmYXVsdDsKICB2YXIgaW5pdF9QcmltaXRpdmVUeXBlID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9QcmltaXRpdmVUeXBlLmpzIigpIHsKICAgICAgaW5pdF9XZWJHTENvbnN0YW50cygpOwogICAgICBQcmltaXRpdmVUeXBlID0gewogICAgICAgIC8qKgogICAgICAgICAqIFBvaW50cyBwcmltaXRpdmUgd2hlcmUgZWFjaCB2ZXJ0ZXggKG9yIGluZGV4KSBpcyBhIHNlcGFyYXRlIHBvaW50LgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBQT0lOVFM6IFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuUE9JTlRTLAogICAgICAgIC8qKgogICAgICAgICAqIExpbmVzIHByaW1pdGl2ZSB3aGVyZSBlYWNoIHR3byB2ZXJ0aWNlcyAob3IgaW5kaWNlcykgaXMgYSBsaW5lIHNlZ21lbnQuICBMaW5lIHNlZ21lbnRzIGFyZSBub3QgbmVjZXNzYXJpbHkgY29ubmVjdGVkLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBMSU5FUzogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5MSU5FUywKICAgICAgICAvKioKICAgICAgICAgKiBMaW5lIGxvb3AgcHJpbWl0aXZlIHdoZXJlIGVhY2ggdmVydGV4IChvciBpbmRleCkgYWZ0ZXIgdGhlIGZpcnN0IGNvbm5lY3RzIGEgbGluZSB0bwogICAgICAgICAqIHRoZSBwcmV2aW91cyB2ZXJ0ZXgsIGFuZCB0aGUgbGFzdCB2ZXJ0ZXggaW1wbGljaXRseSBjb25uZWN0cyB0byB0aGUgZmlyc3QuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIExJTkVfTE9PUDogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5MSU5FX0xPT1AsCiAgICAgICAgLyoqCiAgICAgICAgICogTGluZSBzdHJpcCBwcmltaXRpdmUgd2hlcmUgZWFjaCB2ZXJ0ZXggKG9yIGluZGV4KSBhZnRlciB0aGUgZmlyc3QgY29ubmVjdHMgYSBsaW5lIHRvIHRoZSBwcmV2aW91cyB2ZXJ0ZXguCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIExJTkVfU1RSSVA6IFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuTElORV9TVFJJUCwKICAgICAgICAvKioKICAgICAgICAgKiBUcmlhbmdsZXMgcHJpbWl0aXZlIHdoZXJlIGVhY2ggdGhyZWUgdmVydGljZXMgKG9yIGluZGljZXMpIGlzIGEgdHJpYW5nbGUuICBUcmlhbmdsZXMgZG8gbm90IG5lY2Vzc2FyaWx5IHNoYXJlIGVkZ2VzLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBUUklBTkdMRVM6IFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuVFJJQU5HTEVTLAogICAgICAgIC8qKgogICAgICAgICAqIFRyaWFuZ2xlIHN0cmlwIHByaW1pdGl2ZSB3aGVyZSBlYWNoIHZlcnRleCAob3IgaW5kZXgpIGFmdGVyIHRoZSBmaXJzdCB0d28gY29ubmVjdCB0bwogICAgICAgICAqIHRoZSBwcmV2aW91cyB0d28gdmVydGljZXMgZm9ybWluZyBhIHRyaWFuZ2xlLiAgRm9yIGV4YW1wbGUsIHRoaXMgY2FuIGJlIHVzZWQgdG8gbW9kZWwgYSB3YWxsLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBUUklBTkdMRV9TVFJJUDogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5UUklBTkdMRV9TVFJJUCwKICAgICAgICAvKioKICAgICAgICAgKiBUcmlhbmdsZSBmYW4gcHJpbWl0aXZlIHdoZXJlIGVhY2ggdmVydGV4IChvciBpbmRleCkgYWZ0ZXIgdGhlIGZpcnN0IHR3byBjb25uZWN0IHRvCiAgICAgICAgICogdGhlIHByZXZpb3VzIHZlcnRleCBhbmQgdGhlIGZpcnN0IHZlcnRleCBmb3JtaW5nIGEgdHJpYW5nbGUuICBGb3IgZXhhbXBsZSwgdGhpcyBjYW4gYmUgdXNlZAogICAgICAgICAqIHRvIG1vZGVsIGEgY29uZSBvciBjaXJjbGUuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFRSSUFOR0xFX0ZBTjogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5UUklBTkdMRV9GQU4KICAgICAgfTsKICAgICAgUHJpbWl0aXZlVHlwZS5pc0xpbmVzID0gZnVuY3Rpb24ocHJpbWl0aXZlVHlwZSkgewogICAgICAgIHJldHVybiBwcmltaXRpdmVUeXBlID09PSBQcmltaXRpdmVUeXBlLkxJTkVTIHx8IHByaW1pdGl2ZVR5cGUgPT09IFByaW1pdGl2ZVR5cGUuTElORV9MT09QIHx8IHByaW1pdGl2ZVR5cGUgPT09IFByaW1pdGl2ZVR5cGUuTElORV9TVFJJUDsKICAgICAgfTsKICAgICAgUHJpbWl0aXZlVHlwZS5pc1RyaWFuZ2xlcyA9IGZ1bmN0aW9uKHByaW1pdGl2ZVR5cGUpIHsKICAgICAgICByZXR1cm4gcHJpbWl0aXZlVHlwZSA9PT0gUHJpbWl0aXZlVHlwZS5UUklBTkdMRVMgfHwgcHJpbWl0aXZlVHlwZSA9PT0gUHJpbWl0aXZlVHlwZS5UUklBTkdMRV9TVFJJUCB8fCBwcmltaXRpdmVUeXBlID09PSBQcmltaXRpdmVUeXBlLlRSSUFOR0xFX0ZBTjsKICAgICAgfTsKICAgICAgUHJpbWl0aXZlVHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKHByaW1pdGl2ZVR5cGUpIHsKICAgICAgICByZXR1cm4gcHJpbWl0aXZlVHlwZSA9PT0gUHJpbWl0aXZlVHlwZS5QT0lOVFMgfHwgcHJpbWl0aXZlVHlwZSA9PT0gUHJpbWl0aXZlVHlwZS5MSU5FUyB8fCBwcmltaXRpdmVUeXBlID09PSBQcmltaXRpdmVUeXBlLkxJTkVfTE9PUCB8fCBwcmltaXRpdmVUeXBlID09PSBQcmltaXRpdmVUeXBlLkxJTkVfU1RSSVAgfHwgcHJpbWl0aXZlVHlwZSA9PT0gUHJpbWl0aXZlVHlwZS5UUklBTkdMRVMgfHwgcHJpbWl0aXZlVHlwZSA9PT0gUHJpbWl0aXZlVHlwZS5UUklBTkdMRV9TVFJJUCB8fCBwcmltaXRpdmVUeXBlID09PSBQcmltaXRpdmVUeXBlLlRSSUFOR0xFX0ZBTjsKICAgICAgfTsKICAgICAgUHJpbWl0aXZlVHlwZV9kZWZhdWx0ID0gT2JqZWN0LmZyZWV6ZShQcmltaXRpdmVUeXBlKTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0dlb21ldHJ5LmpzCiAgZnVuY3Rpb24gR2VvbWV0cnkob3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgPz8gRnJvemVuX2RlZmF1bHQuRU1QVFlfT0JKRUNUOwogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJvcHRpb25zLmF0dHJpYnV0ZXMiLCBvcHRpb25zLmF0dHJpYnV0ZXMpOwogICAgdGhpcy5hdHRyaWJ1dGVzID0gb3B0aW9ucy5hdHRyaWJ1dGVzOwogICAgdGhpcy5pbmRpY2VzID0gb3B0aW9ucy5pbmRpY2VzOwogICAgdGhpcy5wcmltaXRpdmVUeXBlID0gb3B0aW9ucy5wcmltaXRpdmVUeXBlID8/IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5UUklBTkdMRVM7CiAgICB0aGlzLmJvdW5kaW5nU3BoZXJlID0gb3B0aW9ucy5ib3VuZGluZ1NwaGVyZTsKICAgIHRoaXMuZ2VvbWV0cnlUeXBlID0gb3B0aW9ucy5nZW9tZXRyeVR5cGUgPz8gR2VvbWV0cnlUeXBlX2RlZmF1bHQuTk9ORTsKICAgIHRoaXMuYm91bmRpbmdTcGhlcmVDViA9IG9wdGlvbnMuYm91bmRpbmdTcGhlcmVDVjsKICAgIHRoaXMub2Zmc2V0QXR0cmlidXRlID0gb3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGU7CiAgfQogIHZhciByZWN0YW5nbGVDZW50ZXJTY3JhdGNoLCBlbnVDZW50ZXJTY3JhdGNoLCBmaXhlZEZyYW1lVG9FbnVTY3JhdGNoLCBib3VuZGluZ1JlY3RhbmdsZVBvaW50c0NhcnRvZ3JhcGhpY1NjcmF0Y2gsIGJvdW5kaW5nUmVjdGFuZ2xlUG9pbnRzRW51U2NyYXRjaCwgcG9pbnRzMkRTY3JhdGNoLCBwb2ludEVudVNjcmF0Y2gsIGVudVJvdGF0aW9uU2NyYXRjaCwgZW51Um90YXRpb25NYXRyaXhTY3JhdGNoLCByb3RhdGlvbjJEU2NyYXRjaCwgR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9HZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjIoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2FydG9ncmFwaGljKCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9HZW9tZXRyeVR5cGUoKTsKICAgICAgaW5pdF9NYXRyaXgyKCk7CiAgICAgIGluaXRfTWF0cml4MygpOwogICAgICBpbml0X01hdHJpeDQoKTsKICAgICAgaW5pdF9QcmltaXRpdmVUeXBlKCk7CiAgICAgIGluaXRfUXVhdGVybmlvbigpOwogICAgICBpbml0X1JlY3RhbmdsZSgpOwogICAgICBpbml0X1RyYW5zZm9ybXMoKTsKICAgICAgR2VvbWV0cnkuY29tcHV0ZU51bWJlck9mVmVydGljZXMgPSBmdW5jdGlvbihnZW9tZXRyeSkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiZ2VvbWV0cnkiLCBnZW9tZXRyeSk7CiAgICAgICAgbGV0IG51bWJlck9mVmVydGljZXMgPSAtMTsKICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGdlb21ldHJ5LmF0dHJpYnV0ZXMpIHsKICAgICAgICAgIGlmIChnZW9tZXRyeS5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSAmJiBkZWZpbmVkX2RlZmF1bHQoZ2VvbWV0cnkuYXR0cmlidXRlc1twcm9wZXJ0eV0pICYmIGRlZmluZWRfZGVmYXVsdChnZW9tZXRyeS5hdHRyaWJ1dGVzW3Byb3BlcnR5XS52YWx1ZXMpKSB7CiAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXNbcHJvcGVydHldOwogICAgICAgICAgICBjb25zdCBudW0gPSBhdHRyaWJ1dGUudmFsdWVzLmxlbmd0aCAvIGF0dHJpYnV0ZS5jb21wb25lbnRzUGVyQXR0cmlidXRlOwogICAgICAgICAgICBpZiAobnVtYmVyT2ZWZXJ0aWNlcyAhPT0gbnVtICYmIG51bWJlck9mVmVydGljZXMgIT09IC0xKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICAgICAiQWxsIGF0dHJpYnV0ZSBsaXN0cyBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMuIgogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbnVtYmVyT2ZWZXJ0aWNlcyA9IG51bTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bWJlck9mVmVydGljZXM7CiAgICAgIH07CiAgICAgIHJlY3RhbmdsZUNlbnRlclNjcmF0Y2ggPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgZW51Q2VudGVyU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgZml4ZWRGcmFtZVRvRW51U2NyYXRjaCA9IG5ldyBNYXRyaXg0X2RlZmF1bHQoKTsKICAgICAgYm91bmRpbmdSZWN0YW5nbGVQb2ludHNDYXJ0b2dyYXBoaWNTY3JhdGNoID0gWwogICAgICAgIG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpLAogICAgICAgIG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpLAogICAgICAgIG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpCiAgICAgIF07CiAgICAgIGJvdW5kaW5nUmVjdGFuZ2xlUG9pbnRzRW51U2NyYXRjaCA9IFsKICAgICAgICBuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KCksCiAgICAgICAgbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpLAogICAgICAgIG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKQogICAgICBdOwogICAgICBwb2ludHMyRFNjcmF0Y2ggPSBbbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpLCBuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KCksIG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKV07CiAgICAgIHBvaW50RW51U2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgZW51Um90YXRpb25TY3JhdGNoID0gbmV3IFF1YXRlcm5pb25fZGVmYXVsdCgpOwogICAgICBlbnVSb3RhdGlvbk1hdHJpeFNjcmF0Y2ggPSBuZXcgTWF0cml4NF9kZWZhdWx0KCk7CiAgICAgIHJvdGF0aW9uMkRTY3JhdGNoID0gbmV3IE1hdHJpeDJfZGVmYXVsdCgpOwogICAgICBHZW9tZXRyeS5fdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50cyA9IGZ1bmN0aW9uKHBvc2l0aW9ucywgc3RSb3RhdGlvbiwgZWxsaXBzb2lkLCBib3VuZGluZ1JlY3RhbmdsZSkgewogICAgICAgIGxldCBpOwogICAgICAgIGNvbnN0IHJlY3RhbmdsZUNlbnRlciA9IFJlY3RhbmdsZV9kZWZhdWx0LmNlbnRlcigKICAgICAgICAgIGJvdW5kaW5nUmVjdGFuZ2xlLAogICAgICAgICAgcmVjdGFuZ2xlQ2VudGVyU2NyYXRjaAogICAgICAgICk7CiAgICAgICAgY29uc3QgZW51Q2VudGVyID0gQ2FydG9ncmFwaGljX2RlZmF1bHQudG9DYXJ0ZXNpYW4oCiAgICAgICAgICByZWN0YW5nbGVDZW50ZXIsCiAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICBlbnVDZW50ZXJTY3JhdGNoCiAgICAgICAgKTsKICAgICAgICBjb25zdCBlbnVUb0ZpeGVkRnJhbWUgPSBUcmFuc2Zvcm1zX2RlZmF1bHQuZWFzdE5vcnRoVXBUb0ZpeGVkRnJhbWUoCiAgICAgICAgICBlbnVDZW50ZXIsCiAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICBmaXhlZEZyYW1lVG9FbnVTY3JhdGNoCiAgICAgICAgKTsKICAgICAgICBjb25zdCBmaXhlZEZyYW1lVG9FbnUgPSBNYXRyaXg0X2RlZmF1bHQuaW52ZXJzZSgKICAgICAgICAgIGVudVRvRml4ZWRGcmFtZSwKICAgICAgICAgIGZpeGVkRnJhbWVUb0VudVNjcmF0Y2gKICAgICAgICApOwogICAgICAgIGNvbnN0IGJvdW5kaW5nUG9pbnRzRW51ID0gYm91bmRpbmdSZWN0YW5nbGVQb2ludHNFbnVTY3JhdGNoOwogICAgICAgIGNvbnN0IGJvdW5kaW5nUG9pbnRzQ2FydG8gPSBib3VuZGluZ1JlY3RhbmdsZVBvaW50c0NhcnRvZ3JhcGhpY1NjcmF0Y2g7CiAgICAgICAgYm91bmRpbmdQb2ludHNDYXJ0b1swXS5sb25naXR1ZGUgPSBib3VuZGluZ1JlY3RhbmdsZS53ZXN0OwogICAgICAgIGJvdW5kaW5nUG9pbnRzQ2FydG9bMF0ubGF0aXR1ZGUgPSBib3VuZGluZ1JlY3RhbmdsZS5zb3V0aDsKICAgICAgICBib3VuZGluZ1BvaW50c0NhcnRvWzFdLmxvbmdpdHVkZSA9IGJvdW5kaW5nUmVjdGFuZ2xlLndlc3Q7CiAgICAgICAgYm91bmRpbmdQb2ludHNDYXJ0b1sxXS5sYXRpdHVkZSA9IGJvdW5kaW5nUmVjdGFuZ2xlLm5vcnRoOwogICAgICAgIGJvdW5kaW5nUG9pbnRzQ2FydG9bMl0ubG9uZ2l0dWRlID0gYm91bmRpbmdSZWN0YW5nbGUuZWFzdDsKICAgICAgICBib3VuZGluZ1BvaW50c0NhcnRvWzJdLmxhdGl0dWRlID0gYm91bmRpbmdSZWN0YW5nbGUuc291dGg7CiAgICAgICAgbGV0IHBvc0VudSA9IHBvaW50RW51U2NyYXRjaDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgICBDYXJ0b2dyYXBoaWNfZGVmYXVsdC50b0NhcnRlc2lhbihib3VuZGluZ1BvaW50c0NhcnRvW2ldLCBlbGxpcHNvaWQsIHBvc0VudSk7CiAgICAgICAgICBwb3NFbnUgPSBNYXRyaXg0X2RlZmF1bHQubXVsdGlwbHlCeVBvaW50QXNWZWN0b3IoZml4ZWRGcmFtZVRvRW51LCBwb3NFbnUsIHBvc0VudSk7CiAgICAgICAgICBib3VuZGluZ1BvaW50c0VudVtpXS54ID0gcG9zRW51Lng7CiAgICAgICAgICBib3VuZGluZ1BvaW50c0VudVtpXS55ID0gcG9zRW51Lnk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJvdGF0aW9uID0gUXVhdGVybmlvbl9kZWZhdWx0LmZyb21BeGlzQW5nbGUoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9aLAogICAgICAgICAgLXN0Um90YXRpb24sCiAgICAgICAgICBlbnVSb3RhdGlvblNjcmF0Y2gKICAgICAgICApOwogICAgICAgIGNvbnN0IHRleHR1cmVNYXRyaXggPSBNYXRyaXgzX2RlZmF1bHQuZnJvbVF1YXRlcm5pb24oCiAgICAgICAgICByb3RhdGlvbiwKICAgICAgICAgIGVudVJvdGF0aW9uTWF0cml4U2NyYXRjaAogICAgICAgICk7CiAgICAgICAgY29uc3QgcG9zaXRpb25zTGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aDsKICAgICAgICBsZXQgZW51TWluWCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgICBsZXQgZW51TWluWSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgICBsZXQgZW51TWF4WCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTsKICAgICAgICBsZXQgZW51TWF4WSA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcG9zaXRpb25zTGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHBvc0VudSA9IE1hdHJpeDRfZGVmYXVsdC5tdWx0aXBseUJ5UG9pbnRBc1ZlY3RvcigKICAgICAgICAgICAgZml4ZWRGcmFtZVRvRW51LAogICAgICAgICAgICBwb3NpdGlvbnNbaV0sCiAgICAgICAgICAgIHBvc0VudQogICAgICAgICAgKTsKICAgICAgICAgIHBvc0VudSA9IE1hdHJpeDNfZGVmYXVsdC5tdWx0aXBseUJ5VmVjdG9yKHRleHR1cmVNYXRyaXgsIHBvc0VudSwgcG9zRW51KTsKICAgICAgICAgIGVudU1pblggPSBNYXRoLm1pbihlbnVNaW5YLCBwb3NFbnUueCk7CiAgICAgICAgICBlbnVNaW5ZID0gTWF0aC5taW4oZW51TWluWSwgcG9zRW51LnkpOwogICAgICAgICAgZW51TWF4WCA9IE1hdGgubWF4KGVudU1heFgsIHBvc0VudS54KTsKICAgICAgICAgIGVudU1heFkgPSBNYXRoLm1heChlbnVNYXhZLCBwb3NFbnUueSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHRvRGVzaXJlZEluQ29tcHV0ZWQgPSBNYXRyaXgyX2RlZmF1bHQuZnJvbVJvdGF0aW9uKAogICAgICAgICAgc3RSb3RhdGlvbiwKICAgICAgICAgIHJvdGF0aW9uMkRTY3JhdGNoCiAgICAgICAgKTsKICAgICAgICBjb25zdCBwb2ludHMyRCA9IHBvaW50czJEU2NyYXRjaDsKICAgICAgICBwb2ludHMyRFswXS54ID0gZW51TWluWDsKICAgICAgICBwb2ludHMyRFswXS55ID0gZW51TWluWTsKICAgICAgICBwb2ludHMyRFsxXS54ID0gZW51TWluWDsKICAgICAgICBwb2ludHMyRFsxXS55ID0gZW51TWF4WTsKICAgICAgICBwb2ludHMyRFsyXS54ID0gZW51TWF4WDsKICAgICAgICBwb2ludHMyRFsyXS55ID0gZW51TWluWTsKICAgICAgICBjb25zdCBib3VuZGluZ0VudU1pbiA9IGJvdW5kaW5nUG9pbnRzRW51WzBdOwogICAgICAgIGNvbnN0IGJvdW5kaW5nUG9pbnRzV2lkdGggPSBib3VuZGluZ1BvaW50c0VudVsyXS54IC0gYm91bmRpbmdFbnVNaW4ueDsKICAgICAgICBjb25zdCBib3VuZGluZ1BvaW50c0hlaWdodCA9IGJvdW5kaW5nUG9pbnRzRW51WzFdLnkgLSBib3VuZGluZ0VudU1pbi55OwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHBvaW50MkQgPSBwb2ludHMyRFtpXTsKICAgICAgICAgIE1hdHJpeDJfZGVmYXVsdC5tdWx0aXBseUJ5VmVjdG9yKHRvRGVzaXJlZEluQ29tcHV0ZWQsIHBvaW50MkQsIHBvaW50MkQpOwogICAgICAgICAgcG9pbnQyRC54ID0gKHBvaW50MkQueCAtIGJvdW5kaW5nRW51TWluLngpIC8gYm91bmRpbmdQb2ludHNXaWR0aDsKICAgICAgICAgIHBvaW50MkQueSA9IChwb2ludDJELnkgLSBib3VuZGluZ0VudU1pbi55KSAvIGJvdW5kaW5nUG9pbnRzSGVpZ2h0OwogICAgICAgIH0KICAgICAgICBjb25zdCBtaW5YWUNvcm5lciA9IHBvaW50czJEWzBdOwogICAgICAgIGNvbnN0IG1heFlDb3JuZXIgPSBwb2ludHMyRFsxXTsKICAgICAgICBjb25zdCBtYXhYQ29ybmVyID0gcG9pbnRzMkRbMl07CiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KDYpOwogICAgICAgIENhcnRlc2lhbjJfZGVmYXVsdC5wYWNrKG1pblhZQ29ybmVyLCByZXN1bHQpOwogICAgICAgIENhcnRlc2lhbjJfZGVmYXVsdC5wYWNrKG1heFlDb3JuZXIsIHJlc3VsdCwgMik7CiAgICAgICAgQ2FydGVzaWFuMl9kZWZhdWx0LnBhY2sobWF4WENvcm5lciwgcmVzdWx0LCA0KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBHZW9tZXRyeV9kZWZhdWx0ID0gR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9HZW9tZXRyeUF0dHJpYnV0ZS5qcwogIGZ1bmN0aW9uIEdlb21ldHJ5QXR0cmlidXRlKG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KG9wdGlvbnMuY29tcG9uZW50RGF0YXR5cGUpKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJvcHRpb25zLmNvbXBvbmVudERhdGF0eXBlIGlzIHJlcXVpcmVkLiIpOwogICAgfQogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQob3B0aW9ucy5jb21wb25lbnRzUGVyQXR0cmlidXRlKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgib3B0aW9ucy5jb21wb25lbnRzUGVyQXR0cmlidXRlIGlzIHJlcXVpcmVkLiIpOwogICAgfQogICAgaWYgKG9wdGlvbnMuY29tcG9uZW50c1BlckF0dHJpYnV0ZSA8IDEgfHwgb3B0aW9ucy5jb21wb25lbnRzUGVyQXR0cmlidXRlID4gNCkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAib3B0aW9ucy5jb21wb25lbnRzUGVyQXR0cmlidXRlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA0LiIKICAgICAgKTsKICAgIH0KICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KG9wdGlvbnMudmFsdWVzKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgib3B0aW9ucy52YWx1ZXMgaXMgcmVxdWlyZWQuIik7CiAgICB9CiAgICB0aGlzLmNvbXBvbmVudERhdGF0eXBlID0gb3B0aW9ucy5jb21wb25lbnREYXRhdHlwZTsKICAgIHRoaXMuY29tcG9uZW50c1BlckF0dHJpYnV0ZSA9IG9wdGlvbnMuY29tcG9uZW50c1BlckF0dHJpYnV0ZTsKICAgIHRoaXMubm9ybWFsaXplID0gb3B0aW9ucy5ub3JtYWxpemUgPz8gZmFsc2U7CiAgICB0aGlzLnZhbHVlcyA9IG9wdGlvbnMudmFsdWVzOwogIH0KICB2YXIgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdDsKICB2YXIgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvR2VvbWV0cnlBdHRyaWJ1dGUuanMiKCkgewogICAgICBpbml0X0Zyb3plbigpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0ID0gR2VvbWV0cnlBdHRyaWJ1dGU7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9HZW9tZXRyeUF0dHJpYnV0ZXMuanMKICBmdW5jdGlvbiBHZW9tZXRyeUF0dHJpYnV0ZXMob3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgPz8gRnJvemVuX2RlZmF1bHQuRU1QVFlfT0JKRUNUOwogICAgdGhpcy5wb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb247CiAgICB0aGlzLm5vcm1hbCA9IG9wdGlvbnMubm9ybWFsOwogICAgdGhpcy5zdCA9IG9wdGlvbnMuc3Q7CiAgICB0aGlzLmJpdGFuZ2VudCA9IG9wdGlvbnMuYml0YW5nZW50OwogICAgdGhpcy50YW5nZW50ID0gb3B0aW9ucy50YW5nZW50OwogICAgdGhpcy5jb2xvciA9IG9wdGlvbnMuY29sb3I7CiAgfQogIHZhciBHZW9tZXRyeUF0dHJpYnV0ZXNfZGVmYXVsdDsKICB2YXIgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZXMgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0dlb21ldHJ5QXR0cmlidXRlcy5qcyIoKSB7CiAgICAgIGluaXRfRnJvemVuKCk7CiAgICAgIEdlb21ldHJ5QXR0cmlidXRlc19kZWZhdWx0ID0gR2VvbWV0cnlBdHRyaWJ1dGVzOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL1NjZW5lL0F0dHJpYnV0ZVR5cGUuanMKICB2YXIgQXR0cmlidXRlVHlwZSwgQXR0cmlidXRlVHlwZV9kZWZhdWx0OwogIHZhciBpbml0X0F0dHJpYnV0ZVR5cGUgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9TY2VuZS9BdHRyaWJ1dGVUeXBlLmpzIigpIHsKICAgICAgaW5pdF9DYXJ0ZXNpYW4yKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRlc2lhbjQoKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfTWF0cml4MigpOwogICAgICBpbml0X01hdHJpeDMoKTsKICAgICAgaW5pdF9NYXRyaXg0KCk7CiAgICAgIEF0dHJpYnV0ZVR5cGUgPSB7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGF0dHJpYnV0ZSBpcyBhIHNpbmdsZSBjb21wb25lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFNDQUxBUjogIlNDQUxBUiIsCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGF0dHJpYnV0ZSBpcyBhIHR3by1jb21wb25lbnQgdmVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge3N0cmluZ30KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBWRUMyOiAiVkVDMiIsCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGF0dHJpYnV0ZSBpcyBhIHRocmVlLWNvbXBvbmVudCB2ZWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFZFQzM6ICJWRUMzIiwKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYXR0cmlidXRlIGlzIGEgZm91ci1jb21wb25lbnQgdmVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge3N0cmluZ30KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBWRUM0OiAiVkVDNCIsCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGF0dHJpYnV0ZSBpcyBhIDJ4MiBtYXRyaXguCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIE1BVDI6ICJNQVQyIiwKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYXR0cmlidXRlIGlzIGEgM3gzIG1hdHJpeC4KICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtzdHJpbmd9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgTUFUMzogIk1BVDMiLAogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBhdHRyaWJ1dGUgaXMgYSA0eDQgbWF0cml4LgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge3N0cmluZ30KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBNQVQ0OiAiTUFUNCIKICAgICAgfTsKICAgICAgQXR0cmlidXRlVHlwZS5nZXRNYXRoVHlwZSA9IGZ1bmN0aW9uKGF0dHJpYnV0ZVR5cGUpIHsKICAgICAgICBzd2l0Y2ggKGF0dHJpYnV0ZVR5cGUpIHsKICAgICAgICAgIGNhc2UgQXR0cmlidXRlVHlwZS5TQ0FMQVI6CiAgICAgICAgICAgIHJldHVybiBOdW1iZXI7CiAgICAgICAgICBjYXNlIEF0dHJpYnV0ZVR5cGUuVkVDMjoKICAgICAgICAgICAgcmV0dXJuIENhcnRlc2lhbjJfZGVmYXVsdDsKICAgICAgICAgIGNhc2UgQXR0cmlidXRlVHlwZS5WRUMzOgogICAgICAgICAgICByZXR1cm4gQ2FydGVzaWFuM19kZWZhdWx0OwogICAgICAgICAgY2FzZSBBdHRyaWJ1dGVUeXBlLlZFQzQ6CiAgICAgICAgICAgIHJldHVybiBDYXJ0ZXNpYW40X2RlZmF1bHQ7CiAgICAgICAgICBjYXNlIEF0dHJpYnV0ZVR5cGUuTUFUMjoKICAgICAgICAgICAgcmV0dXJuIE1hdHJpeDJfZGVmYXVsdDsKICAgICAgICAgIGNhc2UgQXR0cmlidXRlVHlwZS5NQVQzOgogICAgICAgICAgICByZXR1cm4gTWF0cml4M19kZWZhdWx0OwogICAgICAgICAgY2FzZSBBdHRyaWJ1dGVUeXBlLk1BVDQ6CiAgICAgICAgICAgIHJldHVybiBNYXRyaXg0X2RlZmF1bHQ7CiAgICAgICAgICAvLz4+aW5jbHVkZVN0YXJ0KCdkZWJ1ZycsIHByYWdtYXMuZGVidWcpOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImF0dHJpYnV0ZVR5cGUgaXMgbm90IGEgdmFsaWQgdmFsdWUuIik7CiAgICAgICAgfQogICAgICB9OwogICAgICBBdHRyaWJ1dGVUeXBlLmdldE51bWJlck9mQ29tcG9uZW50cyA9IGZ1bmN0aW9uKGF0dHJpYnV0ZVR5cGUpIHsKICAgICAgICBzd2l0Y2ggKGF0dHJpYnV0ZVR5cGUpIHsKICAgICAgICAgIGNhc2UgQXR0cmlidXRlVHlwZS5TQ0FMQVI6CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgY2FzZSBBdHRyaWJ1dGVUeXBlLlZFQzI6CiAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICAgY2FzZSBBdHRyaWJ1dGVUeXBlLlZFQzM6CiAgICAgICAgICAgIHJldHVybiAzOwogICAgICAgICAgY2FzZSBBdHRyaWJ1dGVUeXBlLlZFQzQ6CiAgICAgICAgICBjYXNlIEF0dHJpYnV0ZVR5cGUuTUFUMjoKICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgICBjYXNlIEF0dHJpYnV0ZVR5cGUuTUFUMzoKICAgICAgICAgICAgcmV0dXJuIDk7CiAgICAgICAgICBjYXNlIEF0dHJpYnV0ZVR5cGUuTUFUNDoKICAgICAgICAgICAgcmV0dXJuIDE2OwogICAgICAgICAgLy8+PmluY2x1ZGVTdGFydCgnZGVidWcnLCBwcmFnbWFzLmRlYnVnKTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhdHRyaWJ1dGVUeXBlIGlzIG5vdCBhIHZhbGlkIHZhbHVlLiIpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQXR0cmlidXRlVHlwZS5nZXRBdHRyaWJ1dGVMb2NhdGlvbkNvdW50ID0gZnVuY3Rpb24oYXR0cmlidXRlVHlwZSkgewogICAgICAgIHN3aXRjaCAoYXR0cmlidXRlVHlwZSkgewogICAgICAgICAgY2FzZSBBdHRyaWJ1dGVUeXBlLlNDQUxBUjoKICAgICAgICAgIGNhc2UgQXR0cmlidXRlVHlwZS5WRUMyOgogICAgICAgICAgY2FzZSBBdHRyaWJ1dGVUeXBlLlZFQzM6CiAgICAgICAgICBjYXNlIEF0dHJpYnV0ZVR5cGUuVkVDNDoKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICBjYXNlIEF0dHJpYnV0ZVR5cGUuTUFUMjoKICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICBjYXNlIEF0dHJpYnV0ZVR5cGUuTUFUMzoKICAgICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgICBjYXNlIEF0dHJpYnV0ZVR5cGUuTUFUNDoKICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgICAvLz4+aW5jbHVkZVN0YXJ0KCdkZWJ1ZycsIHByYWdtYXMuZGVidWcpOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImF0dHJpYnV0ZVR5cGUgaXMgbm90IGEgdmFsaWQgdmFsdWUuIik7CiAgICAgICAgfQogICAgICB9OwogICAgICBBdHRyaWJ1dGVUeXBlLmdldEdsc2xUeXBlID0gZnVuY3Rpb24oYXR0cmlidXRlVHlwZSkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLnN0cmluZygiYXR0cmlidXRlVHlwZSIsIGF0dHJpYnV0ZVR5cGUpOwogICAgICAgIHN3aXRjaCAoYXR0cmlidXRlVHlwZSkgewogICAgICAgICAgY2FzZSBBdHRyaWJ1dGVUeXBlLlNDQUxBUjoKICAgICAgICAgICAgcmV0dXJuICJmbG9hdCI7CiAgICAgICAgICBjYXNlIEF0dHJpYnV0ZVR5cGUuVkVDMjoKICAgICAgICAgICAgcmV0dXJuICJ2ZWMyIjsKICAgICAgICAgIGNhc2UgQXR0cmlidXRlVHlwZS5WRUMzOgogICAgICAgICAgICByZXR1cm4gInZlYzMiOwogICAgICAgICAgY2FzZSBBdHRyaWJ1dGVUeXBlLlZFQzQ6CiAgICAgICAgICAgIHJldHVybiAidmVjNCI7CiAgICAgICAgICBjYXNlIEF0dHJpYnV0ZVR5cGUuTUFUMjoKICAgICAgICAgICAgcmV0dXJuICJtYXQyIjsKICAgICAgICAgIGNhc2UgQXR0cmlidXRlVHlwZS5NQVQzOgogICAgICAgICAgICByZXR1cm4gIm1hdDMiOwogICAgICAgICAgY2FzZSBBdHRyaWJ1dGVUeXBlLk1BVDQ6CiAgICAgICAgICAgIHJldHVybiAibWF0NCI7CiAgICAgICAgICAvLz4+aW5jbHVkZVN0YXJ0KCdkZWJ1ZycsIHByYWdtYXMuZGVidWcpOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImF0dHJpYnV0ZVR5cGUgaXMgbm90IGEgdmFsaWQgdmFsdWUuIik7CiAgICAgICAgfQogICAgICB9OwogICAgICBBdHRyaWJ1dGVUeXBlX2RlZmF1bHQgPSBPYmplY3QuZnJlZXplKEF0dHJpYnV0ZVR5cGUpOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQXR0cmlidXRlQ29tcHJlc3Npb24uanMKICBmdW5jdGlvbiBmb3JjZVVpbnQ4KHZhbHVlKSB7CiAgICB1aW50OEZvcmNlQXJyYXlbMF0gPSB2YWx1ZTsKICAgIHJldHVybiB1aW50OEZvcmNlQXJyYXlbMF07CiAgfQogIGZ1bmN0aW9uIHppZ1phZ0RlY29kZSh2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlID4+IDEgXiAtKHZhbHVlICYgMSk7CiAgfQogIHZhciBSSUdIVF9TSElGVCwgTEVGVF9TSElGVCwgQXR0cmlidXRlQ29tcHJlc3Npb24sIG9jdEVuY29kZVNjcmF0Y2gsIHVpbnQ4Rm9yY2VBcnJheSwgc2NyYXRjaEVuY29kZUNhcnQyLCBBdHRyaWJ1dGVDb21wcmVzc2lvbl9kZWZhdWx0OwogIHZhciBpbml0X0F0dHJpYnV0ZUNvbXByZXNzaW9uID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9BdHRyaWJ1dGVDb21wcmVzc2lvbi5qcyIoKSB7CiAgICAgIGluaXRfQ2FydGVzaWFuMigpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9Db21wb25lbnREYXRhdHlwZSgpOwogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBpbml0X0F0dHJpYnV0ZVR5cGUoKTsKICAgICAgUklHSFRfU0hJRlQgPSAxIC8gMjU2OwogICAgICBMRUZUX1NISUZUID0gMjU2OwogICAgICBBdHRyaWJ1dGVDb21wcmVzc2lvbiA9IHt9OwogICAgICBBdHRyaWJ1dGVDb21wcmVzc2lvbi5vY3RFbmNvZGVJblJhbmdlID0gZnVuY3Rpb24odmVjdG9yLCByYW5nZU1heCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJ2ZWN0b3IiLCB2ZWN0b3IpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBjb25zdCBtYWdTcXVhcmVkID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZVNxdWFyZWQodmVjdG9yKTsKICAgICAgICBpZiAoTWF0aC5hYnMobWFnU3F1YXJlZCAtIDEpID4gTWF0aF9kZWZhdWx0LkVQU0lMT042KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgidmVjdG9yIG11c3QgYmUgbm9ybWFsaXplZC4iKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnggPSB2ZWN0b3IueCAvIChNYXRoLmFicyh2ZWN0b3IueCkgKyBNYXRoLmFicyh2ZWN0b3IueSkgKyBNYXRoLmFicyh2ZWN0b3IueikpOwogICAgICAgIHJlc3VsdC55ID0gdmVjdG9yLnkgLyAoTWF0aC5hYnModmVjdG9yLngpICsgTWF0aC5hYnModmVjdG9yLnkpICsgTWF0aC5hYnModmVjdG9yLnopKTsKICAgICAgICBpZiAodmVjdG9yLnogPCAwKSB7CiAgICAgICAgICBjb25zdCB4ID0gcmVzdWx0Lng7CiAgICAgICAgICBjb25zdCB5ID0gcmVzdWx0Lnk7CiAgICAgICAgICByZXN1bHQueCA9ICgxIC0gTWF0aC5hYnMoeSkpICogTWF0aF9kZWZhdWx0LnNpZ25Ob3RaZXJvKHgpOwogICAgICAgICAgcmVzdWx0LnkgPSAoMSAtIE1hdGguYWJzKHgpKSAqIE1hdGhfZGVmYXVsdC5zaWduTm90WmVybyh5KTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnggPSBNYXRoX2RlZmF1bHQudG9TTm9ybShyZXN1bHQueCwgcmFuZ2VNYXgpOwogICAgICAgIHJlc3VsdC55ID0gTWF0aF9kZWZhdWx0LnRvU05vcm0ocmVzdWx0LnksIHJhbmdlTWF4KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBBdHRyaWJ1dGVDb21wcmVzc2lvbi5vY3RFbmNvZGUgPSBmdW5jdGlvbih2ZWN0b3IsIHJlc3VsdCkgewogICAgICAgIHJldHVybiBBdHRyaWJ1dGVDb21wcmVzc2lvbi5vY3RFbmNvZGVJblJhbmdlKHZlY3RvciwgMjU1LCByZXN1bHQpOwogICAgICB9OwogICAgICBvY3RFbmNvZGVTY3JhdGNoID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICB1aW50OEZvcmNlQXJyYXkgPSBuZXcgVWludDhBcnJheSgxKTsKICAgICAgQXR0cmlidXRlQ29tcHJlc3Npb24ub2N0RW5jb2RlVG9DYXJ0ZXNpYW40ID0gZnVuY3Rpb24odmVjdG9yLCByZXN1bHQpIHsKICAgICAgICBBdHRyaWJ1dGVDb21wcmVzc2lvbi5vY3RFbmNvZGVJblJhbmdlKHZlY3RvciwgNjU1MzUsIG9jdEVuY29kZVNjcmF0Y2gpOwogICAgICAgIHJlc3VsdC54ID0gZm9yY2VVaW50OChvY3RFbmNvZGVTY3JhdGNoLnggKiBSSUdIVF9TSElGVCk7CiAgICAgICAgcmVzdWx0LnkgPSBmb3JjZVVpbnQ4KG9jdEVuY29kZVNjcmF0Y2gueCk7CiAgICAgICAgcmVzdWx0LnogPSBmb3JjZVVpbnQ4KG9jdEVuY29kZVNjcmF0Y2gueSAqIFJJR0hUX1NISUZUKTsKICAgICAgICByZXN1bHQudyA9IGZvcmNlVWludDgob2N0RW5jb2RlU2NyYXRjaC55KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBBdHRyaWJ1dGVDb21wcmVzc2lvbi5vY3REZWNvZGVJblJhbmdlID0gZnVuY3Rpb24oeCwgeSwgcmFuZ2VNYXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBpZiAoeCA8IDAgfHwgeCA+IHJhbmdlTWF4IHx8IHkgPCAwIHx8IHkgPiByYW5nZU1heCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGB4IGFuZCB5IG11c3QgYmUgdW5zaWduZWQgbm9ybWFsaXplZCBpbnRlZ2VycyBiZXR3ZWVuIDAgYW5kICR7cmFuZ2VNYXh9YAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnggPSBNYXRoX2RlZmF1bHQuZnJvbVNOb3JtKHgsIHJhbmdlTWF4KTsKICAgICAgICByZXN1bHQueSA9IE1hdGhfZGVmYXVsdC5mcm9tU05vcm0oeSwgcmFuZ2VNYXgpOwogICAgICAgIHJlc3VsdC56ID0gMSAtIChNYXRoLmFicyhyZXN1bHQueCkgKyBNYXRoLmFicyhyZXN1bHQueSkpOwogICAgICAgIGlmIChyZXN1bHQueiA8IDApIHsKICAgICAgICAgIGNvbnN0IG9sZFZYID0gcmVzdWx0Lng7CiAgICAgICAgICByZXN1bHQueCA9ICgxIC0gTWF0aC5hYnMocmVzdWx0LnkpKSAqIE1hdGhfZGVmYXVsdC5zaWduTm90WmVybyhvbGRWWCk7CiAgICAgICAgICByZXN1bHQueSA9ICgxIC0gTWF0aC5hYnMob2xkVlgpKSAqIE1hdGhfZGVmYXVsdC5zaWduTm90WmVybyhyZXN1bHQueSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKHJlc3VsdCwgcmVzdWx0KTsKICAgICAgfTsKICAgICAgQXR0cmlidXRlQ29tcHJlc3Npb24ub2N0RGVjb2RlID0gZnVuY3Rpb24oeCwgeSwgcmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUNvbXByZXNzaW9uLm9jdERlY29kZUluUmFuZ2UoeCwgeSwgMjU1LCByZXN1bHQpOwogICAgICB9OwogICAgICBBdHRyaWJ1dGVDb21wcmVzc2lvbi5vY3REZWNvZGVGcm9tQ2FydGVzaWFuNCA9IGZ1bmN0aW9uKGVuY29kZWQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiZW5jb2RlZCIsIGVuY29kZWQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBjb25zdCB4ID0gZW5jb2RlZC54OwogICAgICAgIGNvbnN0IHkgPSBlbmNvZGVkLnk7CiAgICAgICAgY29uc3QgeiA9IGVuY29kZWQuejsKICAgICAgICBjb25zdCB3ID0gZW5jb2RlZC53OwogICAgICAgIGlmICh4IDwgMCB8fCB4ID4gMjU1IHx8IHkgPCAwIHx8IHkgPiAyNTUgfHwgeiA8IDAgfHwgeiA+IDI1NSB8fCB3IDwgMCB8fCB3ID4gMjU1KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgIngsIHksIHosIGFuZCB3IG11c3QgYmUgdW5zaWduZWQgbm9ybWFsaXplZCBpbnRlZ2VycyBiZXR3ZWVuIDAgYW5kIDI1NSIKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHhPY3QxNiA9IHggKiBMRUZUX1NISUZUICsgeTsKICAgICAgICBjb25zdCB5T2N0MTYgPSB6ICogTEVGVF9TSElGVCArIHc7CiAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUNvbXByZXNzaW9uLm9jdERlY29kZUluUmFuZ2UoeE9jdDE2LCB5T2N0MTYsIDY1NTM1LCByZXN1bHQpOwogICAgICB9OwogICAgICBBdHRyaWJ1dGVDb21wcmVzc2lvbi5vY3RQYWNrRmxvYXQgPSBmdW5jdGlvbihlbmNvZGVkKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJlbmNvZGVkIiwgZW5jb2RlZCk7CiAgICAgICAgcmV0dXJuIDI1NiAqIGVuY29kZWQueCArIGVuY29kZWQueTsKICAgICAgfTsKICAgICAgc2NyYXRjaEVuY29kZUNhcnQyID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICBBdHRyaWJ1dGVDb21wcmVzc2lvbi5vY3RFbmNvZGVGbG9hdCA9IGZ1bmN0aW9uKHZlY3RvcikgewogICAgICAgIEF0dHJpYnV0ZUNvbXByZXNzaW9uLm9jdEVuY29kZSh2ZWN0b3IsIHNjcmF0Y2hFbmNvZGVDYXJ0Mik7CiAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUNvbXByZXNzaW9uLm9jdFBhY2tGbG9hdChzY3JhdGNoRW5jb2RlQ2FydDIpOwogICAgICB9OwogICAgICBBdHRyaWJ1dGVDb21wcmVzc2lvbi5vY3REZWNvZGVGbG9hdCA9IGZ1bmN0aW9uKHZhbHVlLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIGNvbnN0IHRlbXAgPSB2YWx1ZSAvIDI1NjsKICAgICAgICBjb25zdCB4ID0gTWF0aC5mbG9vcih0ZW1wKTsKICAgICAgICBjb25zdCB5ID0gKHRlbXAgLSB4KSAqIDI1NjsKICAgICAgICByZXR1cm4gQXR0cmlidXRlQ29tcHJlc3Npb24ub2N0RGVjb2RlKHgsIHksIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIEF0dHJpYnV0ZUNvbXByZXNzaW9uLm9jdFBhY2sgPSBmdW5jdGlvbih2MTIsIHYyMiwgdjMsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgidjEiLCB2MTIpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgidjIiLCB2MjIpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgidjMiLCB2Myk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IGVuY29kZWQxID0gQXR0cmlidXRlQ29tcHJlc3Npb24ub2N0RW5jb2RlRmxvYXQodjEyKTsKICAgICAgICBjb25zdCBlbmNvZGVkMiA9IEF0dHJpYnV0ZUNvbXByZXNzaW9uLm9jdEVuY29kZUZsb2F0KHYyMik7CiAgICAgICAgY29uc3QgZW5jb2RlZDMgPSBBdHRyaWJ1dGVDb21wcmVzc2lvbi5vY3RFbmNvZGUodjMsIHNjcmF0Y2hFbmNvZGVDYXJ0Mik7CiAgICAgICAgcmVzdWx0LnggPSA2NTUzNiAqIGVuY29kZWQzLnggKyBlbmNvZGVkMTsKICAgICAgICByZXN1bHQueSA9IDY1NTM2ICogZW5jb2RlZDMueSArIGVuY29kZWQyOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEF0dHJpYnV0ZUNvbXByZXNzaW9uLm9jdFVucGFjayA9IGZ1bmN0aW9uKHBhY2tlZCwgdjEyLCB2MjIsIHYzKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJwYWNrZWQiLCBwYWNrZWQpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgidjEiLCB2MTIpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgidjIiLCB2MjIpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgidjMiLCB2Myk7CiAgICAgICAgbGV0IHRlbXAgPSBwYWNrZWQueCAvIDY1NTM2OwogICAgICAgIGNvbnN0IHggPSBNYXRoLmZsb29yKHRlbXApOwogICAgICAgIGNvbnN0IGVuY29kZWRGbG9hdDEgPSAodGVtcCAtIHgpICogNjU1MzY7CiAgICAgICAgdGVtcCA9IHBhY2tlZC55IC8gNjU1MzY7CiAgICAgICAgY29uc3QgeSA9IE1hdGguZmxvb3IodGVtcCk7CiAgICAgICAgY29uc3QgZW5jb2RlZEZsb2F0MiA9ICh0ZW1wIC0geSkgKiA2NTUzNjsKICAgICAgICBBdHRyaWJ1dGVDb21wcmVzc2lvbi5vY3REZWNvZGVGbG9hdChlbmNvZGVkRmxvYXQxLCB2MTIpOwogICAgICAgIEF0dHJpYnV0ZUNvbXByZXNzaW9uLm9jdERlY29kZUZsb2F0KGVuY29kZWRGbG9hdDIsIHYyMik7CiAgICAgICAgQXR0cmlidXRlQ29tcHJlc3Npb24ub2N0RGVjb2RlKHgsIHksIHYzKTsKICAgICAgfTsKICAgICAgQXR0cmlidXRlQ29tcHJlc3Npb24uY29tcHJlc3NUZXh0dXJlQ29vcmRpbmF0ZXMgPSBmdW5jdGlvbih0ZXh0dXJlQ29vcmRpbmF0ZXMpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoInRleHR1cmVDb29yZGluYXRlcyIsIHRleHR1cmVDb29yZGluYXRlcyk7CiAgICAgICAgY29uc3QgeCA9IHRleHR1cmVDb29yZGluYXRlcy54ICogNDA5NSB8IDA7CiAgICAgICAgY29uc3QgeSA9IHRleHR1cmVDb29yZGluYXRlcy55ICogNDA5NSB8IDA7CiAgICAgICAgcmV0dXJuIDQwOTYgKiB4ICsgeTsKICAgICAgfTsKICAgICAgQXR0cmlidXRlQ29tcHJlc3Npb24uZGVjb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyA9IGZ1bmN0aW9uKGNvbXByZXNzZWQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiY29tcHJlc3NlZCIsIGNvbXByZXNzZWQpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBjb25zdCB0ZW1wID0gY29tcHJlc3NlZCAvIDQwOTY7CiAgICAgICAgY29uc3QgeFplcm9UbzQwOTUgPSBNYXRoLmZsb29yKHRlbXApOwogICAgICAgIHJlc3VsdC54ID0geFplcm9UbzQwOTUgLyA0MDk1OwogICAgICAgIHJlc3VsdC55ID0gKGNvbXByZXNzZWQgLSB4WmVyb1RvNDA5NSAqIDQwOTYpIC8gNDA5NTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBBdHRyaWJ1dGVDb21wcmVzc2lvbi56aWdaYWdEZWx0YURlY29kZSA9IGZ1bmN0aW9uKHVCdWZmZXIsIHZCdWZmZXIsIGhlaWdodEJ1ZmZlcikgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgidUJ1ZmZlciIsIHVCdWZmZXIpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgidkJ1ZmZlciIsIHZCdWZmZXIpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5lcXVhbHMoCiAgICAgICAgICAidUJ1ZmZlci5sZW5ndGgiLAogICAgICAgICAgInZCdWZmZXIubGVuZ3RoIiwKICAgICAgICAgIHVCdWZmZXIubGVuZ3RoLAogICAgICAgICAgdkJ1ZmZlci5sZW5ndGgKICAgICAgICApOwogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoaGVpZ2h0QnVmZmVyKSkgewogICAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmVxdWFscygKICAgICAgICAgICAgInVCdWZmZXIubGVuZ3RoIiwKICAgICAgICAgICAgImhlaWdodEJ1ZmZlci5sZW5ndGgiLAogICAgICAgICAgICB1QnVmZmVyLmxlbmd0aCwKICAgICAgICAgICAgaGVpZ2h0QnVmZmVyLmxlbmd0aAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgY291bnQgPSB1QnVmZmVyLmxlbmd0aDsKICAgICAgICBsZXQgdTMgPSAwOwogICAgICAgIGxldCB2MyA9IDA7CiAgICAgICAgbGV0IGhlaWdodCA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgICAgICB1MyArPSB6aWdaYWdEZWNvZGUodUJ1ZmZlcltpXSk7CiAgICAgICAgICB2MyArPSB6aWdaYWdEZWNvZGUodkJ1ZmZlcltpXSk7CiAgICAgICAgICB1QnVmZmVyW2ldID0gdTM7CiAgICAgICAgICB2QnVmZmVyW2ldID0gdjM7CiAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGhlaWdodEJ1ZmZlcikpIHsKICAgICAgICAgICAgaGVpZ2h0ICs9IHppZ1phZ0RlY29kZShoZWlnaHRCdWZmZXJbaV0pOwogICAgICAgICAgICBoZWlnaHRCdWZmZXJbaV0gPSBoZWlnaHQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICBBdHRyaWJ1dGVDb21wcmVzc2lvbi5kZXF1YW50aXplID0gZnVuY3Rpb24odHlwZWRBcnJheSwgY29tcG9uZW50RGF0YXR5cGUsIHR5cGUsIGNvdW50KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJ0eXBlZEFycmF5IiwgdHlwZWRBcnJheSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJjb21wb25lbnREYXRhdHlwZSIsIGNvbXBvbmVudERhdGF0eXBlKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoInR5cGUiLCB0eXBlKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImNvdW50IiwgY291bnQpOwogICAgICAgIGNvbnN0IGNvbXBvbmVudHNQZXJBdHRyaWJ1dGUgPSBBdHRyaWJ1dGVUeXBlX2RlZmF1bHQuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKHR5cGUpOwogICAgICAgIGxldCBkaXZpc29yOwogICAgICAgIHN3aXRjaCAoY29tcG9uZW50RGF0YXR5cGUpIHsKICAgICAgICAgIGNhc2UgQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5CWVRFOgogICAgICAgICAgICBkaXZpc29yID0gMTI3OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5VTlNJR05FRF9CWVRFOgogICAgICAgICAgICBkaXZpc29yID0gMjU1OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5TSE9SVDoKICAgICAgICAgICAgZGl2aXNvciA9IDMyNzY3OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5VTlNJR05FRF9TSE9SVDoKICAgICAgICAgICAgZGl2aXNvciA9IDY1NTM1OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5JTlQ6CiAgICAgICAgICAgIGRpdmlzb3IgPSAyMTQ3NDgzNjQ3OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5VTlNJR05FRF9JTlQ6CiAgICAgICAgICAgIGRpdmlzb3IgPSA0Mjk0OTY3Mjk1OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIC8vPj5pbmNsdWRlU3RhcnQoJ2RlYnVnJywgcHJhZ21hcy5kZWJ1Zyk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgICBgQ2Fubm90IGRlcXVhbnRpemUgY29tcG9uZW50IGRhdGF0eXBlOiAke2NvbXBvbmVudERhdGF0eXBlfWAKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZGVxdWFudGl6ZWRUeXBlZEFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSgKICAgICAgICAgIGNvdW50ICogY29tcG9uZW50c1BlckF0dHJpYnV0ZQogICAgICAgICk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU7IGorKykgewogICAgICAgICAgICBjb25zdCBpbmRleCA9IGkgKiBjb21wb25lbnRzUGVyQXR0cmlidXRlICsgajsKICAgICAgICAgICAgZGVxdWFudGl6ZWRUeXBlZEFycmF5W2luZGV4XSA9IE1hdGgubWF4KAogICAgICAgICAgICAgIHR5cGVkQXJyYXlbaW5kZXhdIC8gZGl2aXNvciwKICAgICAgICAgICAgICAtMQogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZGVxdWFudGl6ZWRUeXBlZEFycmF5OwogICAgICB9OwogICAgICBBdHRyaWJ1dGVDb21wcmVzc2lvbi5kZWNvZGVSR0I1NjUgPSBmdW5jdGlvbih0eXBlZEFycmF5LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoInR5cGVkQXJyYXkiLCB0eXBlZEFycmF5KTsKICAgICAgICBjb25zdCBleHBlY3RlZExlbmd0aCA9IHR5cGVkQXJyYXkubGVuZ3RoICogMzsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5lcXVhbHMoCiAgICAgICAgICAgICJyZXN1bHQubGVuZ3RoIiwKICAgICAgICAgICAgInR5cGVkQXJyYXkubGVuZ3RoICogMyIsCiAgICAgICAgICAgIHJlc3VsdC5sZW5ndGgsCiAgICAgICAgICAgIGV4cGVjdGVkTGVuZ3RoCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCBjb3VudCA9IHR5cGVkQXJyYXkubGVuZ3RoOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAzKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWFzazUgPSAoMSA8PCA1KSAtIDE7CiAgICAgICAgY29uc3QgbWFzazYgPSAoMSA8PCA2KSAtIDE7CiAgICAgICAgY29uc3Qgbm9ybWFsaXplNSA9IDEgLyAzMTsKICAgICAgICBjb25zdCBub3JtYWxpemU2ID0gMSAvIDYzOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgY29uc3QgdmFsdWUgPSB0eXBlZEFycmF5W2ldOwogICAgICAgICAgY29uc3QgcmVkID0gdmFsdWUgPj4gMTE7CiAgICAgICAgICBjb25zdCBncmVlbiA9IHZhbHVlID4+IDUgJiBtYXNrNjsKICAgICAgICAgIGNvbnN0IGJsdWUgPSB2YWx1ZSAmIG1hc2s1OwogICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gMyAqIGk7CiAgICAgICAgICByZXN1bHRbb2Zmc2V0XSA9IHJlZCAqIG5vcm1hbGl6ZTU7CiAgICAgICAgICByZXN1bHRbb2Zmc2V0ICsgMV0gPSBncmVlbiAqIG5vcm1hbGl6ZTY7CiAgICAgICAgICByZXN1bHRbb2Zmc2V0ICsgMl0gPSBibHVlICogbm9ybWFsaXplNTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQXR0cmlidXRlQ29tcHJlc3Npb25fZGVmYXVsdCA9IEF0dHJpYnV0ZUNvbXByZXNzaW9uOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvYmFyeWNlbnRyaWNDb29yZGluYXRlcy5qcwogIGZ1bmN0aW9uIGJhcnljZW50cmljQ29vcmRpbmF0ZXMocG9pbnQsIHAwLCBwMSwgcDIsIHJlc3VsdCkgewogICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJwb2ludCIsIHBvaW50KTsKICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgicDAiLCBwMCk7CiAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoInAxIiwgcDEpOwogICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJwMiIsIHAyKTsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgcmVzdWx0ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgfQogICAgbGV0IHYwMjsKICAgIGxldCB2MTI7CiAgICBsZXQgdjIyOwogICAgbGV0IGRvdDAwOwogICAgbGV0IGRvdDAxOwogICAgbGV0IGRvdDAyOwogICAgbGV0IGRvdDExOwogICAgbGV0IGRvdDEyOwogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocDAueikpIHsKICAgICAgaWYgKENhcnRlc2lhbjJfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKHBvaW50LCBwMCwgTWF0aF9kZWZhdWx0LkVQU0lMT04xNCkpIHsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKENhcnRlc2lhbjNfZGVmYXVsdC5VTklUX1gsIHJlc3VsdCk7CiAgICAgIH0KICAgICAgaWYgKENhcnRlc2lhbjJfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKHBvaW50LCBwMSwgTWF0aF9kZWZhdWx0LkVQU0lMT04xNCkpIHsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKENhcnRlc2lhbjNfZGVmYXVsdC5VTklUX1ksIHJlc3VsdCk7CiAgICAgIH0KICAgICAgaWYgKENhcnRlc2lhbjJfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKHBvaW50LCBwMiwgTWF0aF9kZWZhdWx0LkVQU0lMT04xNCkpIHsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKENhcnRlc2lhbjNfZGVmYXVsdC5VTklUX1osIHJlc3VsdCk7CiAgICAgIH0KICAgICAgdjAyID0gQ2FydGVzaWFuMl9kZWZhdWx0LnN1YnRyYWN0KHAxLCBwMCwgc2NyYXRjaENhcnRlc2lhbjEpOwogICAgICB2MTIgPSBDYXJ0ZXNpYW4yX2RlZmF1bHQuc3VidHJhY3QocDIsIHAwLCBzY3JhdGNoQ2FydGVzaWFuMik7CiAgICAgIHYyMiA9IENhcnRlc2lhbjJfZGVmYXVsdC5zdWJ0cmFjdChwb2ludCwgcDAsIHNjcmF0Y2hDYXJ0ZXNpYW4zMik7CiAgICAgIGRvdDAwID0gQ2FydGVzaWFuMl9kZWZhdWx0LmRvdCh2MDIsIHYwMik7CiAgICAgIGRvdDAxID0gQ2FydGVzaWFuMl9kZWZhdWx0LmRvdCh2MDIsIHYxMik7CiAgICAgIGRvdDAyID0gQ2FydGVzaWFuMl9kZWZhdWx0LmRvdCh2MDIsIHYyMik7CiAgICAgIGRvdDExID0gQ2FydGVzaWFuMl9kZWZhdWx0LmRvdCh2MTIsIHYxMik7CiAgICAgIGRvdDEyID0gQ2FydGVzaWFuMl9kZWZhdWx0LmRvdCh2MTIsIHYyMik7CiAgICB9IGVsc2UgewogICAgICBpZiAoQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24ocG9pbnQsIHAwLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjE0KSkgewogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoQ2FydGVzaWFuM19kZWZhdWx0LlVOSVRfWCwgcmVzdWx0KTsKICAgICAgfQogICAgICBpZiAoQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24ocG9pbnQsIHAxLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjE0KSkgewogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoQ2FydGVzaWFuM19kZWZhdWx0LlVOSVRfWSwgcmVzdWx0KTsKICAgICAgfQogICAgICBpZiAoQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24ocG9pbnQsIHAyLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjE0KSkgewogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoQ2FydGVzaWFuM19kZWZhdWx0LlVOSVRfWiwgcmVzdWx0KTsKICAgICAgfQogICAgICB2MDIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QocDEsIHAwLCBzY3JhdGNoQ2FydGVzaWFuMSk7CiAgICAgIHYxMiA9IENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChwMiwgcDAsIHNjcmF0Y2hDYXJ0ZXNpYW4yKTsKICAgICAgdjIyID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KHBvaW50LCBwMCwgc2NyYXRjaENhcnRlc2lhbjMyKTsKICAgICAgZG90MDAgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KHYwMiwgdjAyKTsKICAgICAgZG90MDEgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KHYwMiwgdjEyKTsKICAgICAgZG90MDIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KHYwMiwgdjIyKTsKICAgICAgZG90MTEgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KHYxMiwgdjEyKTsKICAgICAgZG90MTIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KHYxMiwgdjIyKTsKICAgIH0KICAgIHJlc3VsdC55ID0gZG90MTEgKiBkb3QwMiAtIGRvdDAxICogZG90MTI7CiAgICByZXN1bHQueiA9IGRvdDAwICogZG90MTIgLSBkb3QwMSAqIGRvdDAyOwogICAgY29uc3QgcSA9IGRvdDAwICogZG90MTEgLSBkb3QwMSAqIGRvdDAxOwogICAgaWYgKHEgPT09IDApIHsKICAgICAgcmV0dXJuIHZvaWQgMDsKICAgIH0KICAgIHJlc3VsdC55IC89IHE7CiAgICByZXN1bHQueiAvPSBxOwogICAgcmVzdWx0LnggPSAxIC0gcmVzdWx0LnkgLSByZXN1bHQuejsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIHZhciBzY3JhdGNoQ2FydGVzaWFuMSwgc2NyYXRjaENhcnRlc2lhbjIsIHNjcmF0Y2hDYXJ0ZXNpYW4zMiwgYmFyeWNlbnRyaWNDb29yZGluYXRlc19kZWZhdWx0OwogIHZhciBpbml0X2JhcnljZW50cmljQ29vcmRpbmF0ZXMgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2JhcnljZW50cmljQ29vcmRpbmF0ZXMuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjIoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBzY3JhdGNoQ2FydGVzaWFuMSA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaENhcnRlc2lhbjIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgYmFyeWNlbnRyaWNDb29yZGluYXRlc19kZWZhdWx0ID0gYmFyeWNlbnRyaWNDb29yZGluYXRlczsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0VuY29kZWRDYXJ0ZXNpYW4zLmpzCiAgZnVuY3Rpb24gRW5jb2RlZENhcnRlc2lhbjMoKSB7CiAgICB0aGlzLmhpZ2ggPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8pOwogICAgdGhpcy5sb3cgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8pOwogIH0KICB2YXIgc2NyYXRjaEVuY29kZSwgZW5jb2RlZFAsIEVuY29kZWRDYXJ0ZXNpYW4zX2RlZmF1bHQ7CiAgdmFyIGluaXRfRW5jb2RlZENhcnRlc2lhbjMgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0VuY29kZWRDYXJ0ZXNpYW4zLmpzIigpIHsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIEVuY29kZWRDYXJ0ZXNpYW4zLmVuY29kZSA9IGZ1bmN0aW9uKHZhbHVlLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IHsKICAgICAgICAgICAgaGlnaDogMCwKICAgICAgICAgICAgbG93OiAwCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBsZXQgZG91YmxlSGlnaDsKICAgICAgICBpZiAodmFsdWUgPj0gMCkgewogICAgICAgICAgZG91YmxlSGlnaCA9IE1hdGguZmxvb3IodmFsdWUgLyA2NTUzNikgKiA2NTUzNjsKICAgICAgICAgIHJlc3VsdC5oaWdoID0gZG91YmxlSGlnaDsKICAgICAgICAgIHJlc3VsdC5sb3cgPSB2YWx1ZSAtIGRvdWJsZUhpZ2g7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRvdWJsZUhpZ2ggPSBNYXRoLmZsb29yKC12YWx1ZSAvIDY1NTM2KSAqIDY1NTM2OwogICAgICAgICAgcmVzdWx0LmhpZ2ggPSAtZG91YmxlSGlnaDsKICAgICAgICAgIHJlc3VsdC5sb3cgPSB2YWx1ZSArIGRvdWJsZUhpZ2g7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hFbmNvZGUgPSB7CiAgICAgICAgaGlnaDogMCwKICAgICAgICBsb3c6IDAKICAgICAgfTsKICAgICAgRW5jb2RlZENhcnRlc2lhbjMuZnJvbUNhcnRlc2lhbiA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsIGNhcnRlc2lhbjExKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgRW5jb2RlZENhcnRlc2lhbjMoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaGlnaCA9IHJlc3VsdC5oaWdoOwogICAgICAgIGNvbnN0IGxvdyA9IHJlc3VsdC5sb3c7CiAgICAgICAgRW5jb2RlZENhcnRlc2lhbjMuZW5jb2RlKGNhcnRlc2lhbjExLngsIHNjcmF0Y2hFbmNvZGUpOwogICAgICAgIGhpZ2gueCA9IHNjcmF0Y2hFbmNvZGUuaGlnaDsKICAgICAgICBsb3cueCA9IHNjcmF0Y2hFbmNvZGUubG93OwogICAgICAgIEVuY29kZWRDYXJ0ZXNpYW4zLmVuY29kZShjYXJ0ZXNpYW4xMS55LCBzY3JhdGNoRW5jb2RlKTsKICAgICAgICBoaWdoLnkgPSBzY3JhdGNoRW5jb2RlLmhpZ2g7CiAgICAgICAgbG93LnkgPSBzY3JhdGNoRW5jb2RlLmxvdzsKICAgICAgICBFbmNvZGVkQ2FydGVzaWFuMy5lbmNvZGUoY2FydGVzaWFuMTEueiwgc2NyYXRjaEVuY29kZSk7CiAgICAgICAgaGlnaC56ID0gc2NyYXRjaEVuY29kZS5oaWdoOwogICAgICAgIGxvdy56ID0gc2NyYXRjaEVuY29kZS5sb3c7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgZW5jb2RlZFAgPSBuZXcgRW5jb2RlZENhcnRlc2lhbjMoKTsKICAgICAgRW5jb2RlZENhcnRlc2lhbjMud3JpdGVFbGVtZW50cyA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExLCBjYXJ0ZXNpYW5BcnJheSwgaW5kZXgpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImNhcnRlc2lhbkFycmF5IiwgY2FydGVzaWFuQXJyYXkpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigiaW5kZXgiLCBpbmRleCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImluZGV4IiwgaW5kZXgsIDApOwogICAgICAgIEVuY29kZWRDYXJ0ZXNpYW4zLmZyb21DYXJ0ZXNpYW4oY2FydGVzaWFuMTEsIGVuY29kZWRQKTsKICAgICAgICBjb25zdCBoaWdoID0gZW5jb2RlZFAuaGlnaDsKICAgICAgICBjb25zdCBsb3cgPSBlbmNvZGVkUC5sb3c7CiAgICAgICAgY2FydGVzaWFuQXJyYXlbaW5kZXhdID0gaGlnaC54OwogICAgICAgIGNhcnRlc2lhbkFycmF5W2luZGV4ICsgMV0gPSBoaWdoLnk7CiAgICAgICAgY2FydGVzaWFuQXJyYXlbaW5kZXggKyAyXSA9IGhpZ2guejsKICAgICAgICBjYXJ0ZXNpYW5BcnJheVtpbmRleCArIDNdID0gbG93Lng7CiAgICAgICAgY2FydGVzaWFuQXJyYXlbaW5kZXggKyA0XSA9IGxvdy55OwogICAgICAgIGNhcnRlc2lhbkFycmF5W2luZGV4ICsgNV0gPSBsb3cuejsKICAgICAgfTsKICAgICAgRW5jb2RlZENhcnRlc2lhbjNfZGVmYXVsdCA9IEVuY29kZWRDYXJ0ZXNpYW4zOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvSW5kZXhEYXRhdHlwZS5qcwogIHZhciBJbmRleERhdGF0eXBlLCBJbmRleERhdGF0eXBlX2RlZmF1bHQ7CiAgdmFyIGluaXRfSW5kZXhEYXRhdHlwZSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvSW5kZXhEYXRhdHlwZS5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBpbml0X1dlYkdMQ29uc3RhbnRzKCk7CiAgICAgIEluZGV4RGF0YXR5cGUgPSB7CiAgICAgICAgLyoqCiAgICAgICAgICogOC1iaXQgdW5zaWduZWQgYnl0ZSBjb3JyZXNwb25kaW5nIHRvIDxjb2RlPlVOU0lHTkVEX0JZVEU8L2NvZGU+IGFuZCB0aGUgdHlwZQogICAgICAgICAqIG9mIGFuIGVsZW1lbnQgaW4gPGNvZGU+VWludDhBcnJheTwvY29kZT4uCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFVOU0lHTkVEX0JZVEU6IFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuVU5TSUdORURfQllURSwKICAgICAgICAvKioKICAgICAgICAgKiAxNi1iaXQgdW5zaWduZWQgc2hvcnQgY29ycmVzcG9uZGluZyB0byA8Y29kZT5VTlNJR05FRF9TSE9SVDwvY29kZT4gYW5kIHRoZSB0eXBlCiAgICAgICAgICogb2YgYW4gZWxlbWVudCBpbiA8Y29kZT5VaW50MTZBcnJheTwvY29kZT4uCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFVOU0lHTkVEX1NIT1JUOiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlVOU0lHTkVEX1NIT1JULAogICAgICAgIC8qKgogICAgICAgICAqIDMyLWJpdCB1bnNpZ25lZCBpbnQgY29ycmVzcG9uZGluZyB0byA8Y29kZT5VTlNJR05FRF9JTlQ8L2NvZGU+IGFuZCB0aGUgdHlwZQogICAgICAgICAqIG9mIGFuIGVsZW1lbnQgaW4gPGNvZGU+VWludDMyQXJyYXk8L2NvZGU+LgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBVTlNJR05FRF9JTlQ6IFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuVU5TSUdORURfSU5UCiAgICAgIH07CiAgICAgIEluZGV4RGF0YXR5cGUuZ2V0U2l6ZUluQnl0ZXMgPSBmdW5jdGlvbihpbmRleERhdGF0eXBlKSB7CiAgICAgICAgc3dpdGNoIChpbmRleERhdGF0eXBlKSB7CiAgICAgICAgICBjYXNlIEluZGV4RGF0YXR5cGUuVU5TSUdORURfQllURToKICAgICAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7CiAgICAgICAgICBjYXNlIEluZGV4RGF0YXR5cGUuVU5TSUdORURfU0hPUlQ6CiAgICAgICAgICAgIHJldHVybiBVaW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsKICAgICAgICAgIGNhc2UgSW5kZXhEYXRhdHlwZS5VTlNJR05FRF9JTlQ6CiAgICAgICAgICAgIHJldHVybiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAiaW5kZXhEYXRhdHlwZSBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhIHZhbGlkIEluZGV4RGF0YXR5cGUgY29uc3RhbnQuIgogICAgICAgICk7CiAgICAgIH07CiAgICAgIEluZGV4RGF0YXR5cGUuZnJvbVNpemVJbkJ5dGVzID0gZnVuY3Rpb24oc2l6ZUluQnl0ZXMpIHsKICAgICAgICBzd2l0Y2ggKHNpemVJbkJ5dGVzKSB7CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIHJldHVybiBJbmRleERhdGF0eXBlLlVOU0lHTkVEX1NIT1JUOwogICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICByZXR1cm4gSW5kZXhEYXRhdHlwZS5VTlNJR05FRF9JTlQ7CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIHJldHVybiBJbmRleERhdGF0eXBlLlVOU0lHTkVEX0JZVEU7CiAgICAgICAgICAvLz4+aW5jbHVkZVN0YXJ0KCdkZWJ1ZycsIHByYWdtYXMuZGVidWcpOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICAgIlNpemUgaW4gYnl0ZXMgY2Fubm90IGJlIG1hcHBlZCB0byBhbiBJbmRleERhdGF0eXBlIgogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgSW5kZXhEYXRhdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKGluZGV4RGF0YXR5cGUpIHsKICAgICAgICByZXR1cm4gZGVmaW5lZF9kZWZhdWx0KGluZGV4RGF0YXR5cGUpICYmIChpbmRleERhdGF0eXBlID09PSBJbmRleERhdGF0eXBlLlVOU0lHTkVEX0JZVEUgfHwgaW5kZXhEYXRhdHlwZSA9PT0gSW5kZXhEYXRhdHlwZS5VTlNJR05FRF9TSE9SVCB8fCBpbmRleERhdGF0eXBlID09PSBJbmRleERhdGF0eXBlLlVOU0lHTkVEX0lOVCk7CiAgICAgIH07CiAgICAgIEluZGV4RGF0YXR5cGUuY3JlYXRlVHlwZWRBcnJheSA9IGZ1bmN0aW9uKG51bWJlck9mVmVydGljZXMsIGluZGljZXNMZW5ndGhPckFycmF5KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobnVtYmVyT2ZWZXJ0aWNlcykpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJudW1iZXJPZlZlcnRpY2VzIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAobnVtYmVyT2ZWZXJ0aWNlcyA+PSBNYXRoX2RlZmF1bHQuU0lYVFlfRk9VUl9LSUxPQllURVMpIHsKICAgICAgICAgIHJldHVybiBuZXcgVWludDMyQXJyYXkoaW5kaWNlc0xlbmd0aE9yQXJyYXkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFVpbnQxNkFycmF5KGluZGljZXNMZW5ndGhPckFycmF5KTsKICAgICAgfTsKICAgICAgSW5kZXhEYXRhdHlwZS5jcmVhdGVUeXBlZEFycmF5RnJvbUFycmF5QnVmZmVyID0gZnVuY3Rpb24obnVtYmVyT2ZWZXJ0aWNlcywgc291cmNlQXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KG51bWJlck9mVmVydGljZXMpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgibnVtYmVyT2ZWZXJ0aWNlcyBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoc291cmNlQXJyYXkpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgic291cmNlQXJyYXkgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGJ5dGVPZmZzZXQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYnl0ZU9mZnNldCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKG51bWJlck9mVmVydGljZXMgPj0gTWF0aF9kZWZhdWx0LlNJWFRZX0ZPVVJfS0lMT0JZVEVTKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KHNvdXJjZUFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFVpbnQxNkFycmF5KHNvdXJjZUFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpOwogICAgICB9OwogICAgICBJbmRleERhdGF0eXBlLmZyb21UeXBlZEFycmF5ID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgICAgICBpZiAoYXJyYXkgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7CiAgICAgICAgICByZXR1cm4gSW5kZXhEYXRhdHlwZS5VTlNJR05FRF9CWVRFOwogICAgICAgIH0KICAgICAgICBpZiAoYXJyYXkgaW5zdGFuY2VvZiBVaW50MTZBcnJheSkgewogICAgICAgICAgcmV0dXJuIEluZGV4RGF0YXR5cGUuVU5TSUdORURfU0hPUlQ7CiAgICAgICAgfQogICAgICAgIGlmIChhcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KSB7CiAgICAgICAgICByZXR1cm4gSW5kZXhEYXRhdHlwZS5VTlNJR05FRF9JTlQ7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgImFycmF5IG11c3QgYmUgYSBVaW50OEFycmF5LCBVaW50MTZBcnJheSwgb3IgVWludDMyQXJyYXkuIgogICAgICAgICk7CiAgICAgIH07CiAgICAgIEluZGV4RGF0YXR5cGVfZGVmYXVsdCA9IE9iamVjdC5mcmVlemUoSW5kZXhEYXRhdHlwZSk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9RdWFkcmF0aWNSZWFsUG9seW5vbWlhbC5qcwogIGZ1bmN0aW9uIGFkZFdpdGhDYW5jZWxsYXRpb25DaGVjayhsZWZ0LCByaWdodCwgdG9sZXJhbmNlKSB7CiAgICBjb25zdCBkaWZmZXJlbmNlID0gbGVmdCArIHJpZ2h0OwogICAgaWYgKE1hdGhfZGVmYXVsdC5zaWduKGxlZnQpICE9PSBNYXRoX2RlZmF1bHQuc2lnbihyaWdodCkgJiYgTWF0aC5hYnMoZGlmZmVyZW5jZSAvIE1hdGgubWF4KE1hdGguYWJzKGxlZnQpLCBNYXRoLmFicyhyaWdodCkpKSA8IHRvbGVyYW5jZSkgewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiBkaWZmZXJlbmNlOwogIH0KICB2YXIgUXVhZHJhdGljUmVhbFBvbHlub21pYWwsIFF1YWRyYXRpY1JlYWxQb2x5bm9taWFsX2RlZmF1bHQ7CiAgdmFyIGluaXRfUXVhZHJhdGljUmVhbFBvbHlub21pYWwgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1F1YWRyYXRpY1JlYWxQb2x5bm9taWFsLmpzIigpIHsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgUXVhZHJhdGljUmVhbFBvbHlub21pYWwgPSB7fTsKICAgICAgUXVhZHJhdGljUmVhbFBvbHlub21pYWwuY29tcHV0ZURpc2NyaW1pbmFudCA9IGZ1bmN0aW9uKGEzLCBiLCBjKSB7CiAgICAgICAgaWYgKHR5cGVvZiBhMyAhPT0gIm51bWJlciIpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIGIgIT09ICJudW1iZXIiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYiBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBjICE9PSAibnVtYmVyIikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImMgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGRpc2NyaW1pbmFudCA9IGIgKiBiIC0gNCAqIGEzICogYzsKICAgICAgICByZXR1cm4gZGlzY3JpbWluYW50OwogICAgICB9OwogICAgICBRdWFkcmF0aWNSZWFsUG9seW5vbWlhbC5jb21wdXRlUmVhbFJvb3RzID0gZnVuY3Rpb24oYTMsIGIsIGMpIHsKICAgICAgICBpZiAodHlwZW9mIGEzICE9PSAibnVtYmVyIikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImEgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgYiAhPT0gIm51bWJlciIpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJiIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIGMgIT09ICJudW1iZXIiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYyBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTsKICAgICAgICB9CiAgICAgICAgbGV0IHJhdGlvOwogICAgICAgIGlmIChhMyA9PT0gMCkgewogICAgICAgICAgaWYgKGIgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIFstYyAvIGJdOwogICAgICAgIH0gZWxzZSBpZiAoYiA9PT0gMCkgewogICAgICAgICAgaWYgKGMgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIFswLCAwXTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGNNYWduaXR1ZGUgPSBNYXRoLmFicyhjKTsKICAgICAgICAgIGNvbnN0IGFNYWduaXR1ZGUgPSBNYXRoLmFicyhhMyk7CiAgICAgICAgICBpZiAoY01hZ25pdHVkZSA8IGFNYWduaXR1ZGUgJiYgY01hZ25pdHVkZSAvIGFNYWduaXR1ZGUgPCBNYXRoX2RlZmF1bHQuRVBTSUxPTjE0KSB7CiAgICAgICAgICAgIHJldHVybiBbMCwgMF07CiAgICAgICAgICB9IGVsc2UgaWYgKGNNYWduaXR1ZGUgPiBhTWFnbml0dWRlICYmIGFNYWduaXR1ZGUgLyBjTWFnbml0dWRlIDwgTWF0aF9kZWZhdWx0LkVQU0lMT04xNCkgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICB9CiAgICAgICAgICByYXRpbyA9IC1jIC8gYTM7CiAgICAgICAgICBpZiAocmF0aW8gPCAwKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHJvb3QgPSBNYXRoLnNxcnQocmF0aW8pOwogICAgICAgICAgcmV0dXJuIFstcm9vdCwgcm9vdF07CiAgICAgICAgfSBlbHNlIGlmIChjID09PSAwKSB7CiAgICAgICAgICByYXRpbyA9IC1iIC8gYTM7CiAgICAgICAgICBpZiAocmF0aW8gPCAwKSB7CiAgICAgICAgICAgIHJldHVybiBbcmF0aW8sIDBdOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIFswLCByYXRpb107CiAgICAgICAgfQogICAgICAgIGNvbnN0IGIyID0gYiAqIGI7CiAgICAgICAgY29uc3QgZm91cl9hYyA9IDQgKiBhMyAqIGM7CiAgICAgICAgY29uc3QgcmFkaWNhbmQgPSBhZGRXaXRoQ2FuY2VsbGF0aW9uQ2hlY2soYjIsIC1mb3VyX2FjLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjE0KTsKICAgICAgICBpZiAocmFkaWNhbmQgPCAwKSB7CiAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQogICAgICAgIGNvbnN0IHEgPSAtMC41ICogYWRkV2l0aENhbmNlbGxhdGlvbkNoZWNrKAogICAgICAgICAgYiwKICAgICAgICAgIE1hdGhfZGVmYXVsdC5zaWduKGIpICogTWF0aC5zcXJ0KHJhZGljYW5kKSwKICAgICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9OMTQKICAgICAgICApOwogICAgICAgIGlmIChiID4gMCkgewogICAgICAgICAgcmV0dXJuIFtxIC8gYTMsIGMgLyBxXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtjIC8gcSwgcSAvIGEzXTsKICAgICAgfTsKICAgICAgUXVhZHJhdGljUmVhbFBvbHlub21pYWxfZGVmYXVsdCA9IFF1YWRyYXRpY1JlYWxQb2x5bm9taWFsOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ3ViaWNSZWFsUG9seW5vbWlhbC5qcwogIGZ1bmN0aW9uIGNvbXB1dGVSZWFsUm9vdHMoYTMsIGIsIGMsIGQpIHsKICAgIGNvbnN0IEEgPSBhMzsKICAgIGNvbnN0IEIgPSBiIC8gMzsKICAgIGNvbnN0IEMgPSBjIC8gMzsKICAgIGNvbnN0IEQgPSBkOwogICAgY29uc3QgQUMgPSBBICogQzsKICAgIGNvbnN0IEJEID0gQiAqIEQ7CiAgICBjb25zdCBCMiA9IEIgKiBCOwogICAgY29uc3QgQzIgPSBDICogQzsKICAgIGNvbnN0IGRlbHRhMSA9IEEgKiBDIC0gQjI7CiAgICBjb25zdCBkZWx0YTIgPSBBICogRCAtIEIgKiBDOwogICAgY29uc3QgZGVsdGEzID0gQiAqIEQgLSBDMjsKICAgIGNvbnN0IGRpc2NyaW1pbmFudCA9IDQgKiBkZWx0YTEgKiBkZWx0YTMgLSBkZWx0YTIgKiBkZWx0YTI7CiAgICBsZXQgdGVtcDsKICAgIGxldCB0ZW1wMTsKICAgIGlmIChkaXNjcmltaW5hbnQgPCAwKSB7CiAgICAgIGxldCBBQmFyOwogICAgICBsZXQgQ0JhcjsKICAgICAgbGV0IERCYXI7CiAgICAgIGlmIChCMiAqIEJEID49IEFDICogQzIpIHsKICAgICAgICBBQmFyID0gQTsKICAgICAgICBDQmFyID0gZGVsdGExOwogICAgICAgIERCYXIgPSAtMiAqIEIgKiBkZWx0YTEgKyBBICogZGVsdGEyOwogICAgICB9IGVsc2UgewogICAgICAgIEFCYXIgPSBEOwogICAgICAgIENCYXIgPSBkZWx0YTM7CiAgICAgICAgREJhciA9IC1EICogZGVsdGEyICsgMiAqIEMgKiBkZWx0YTM7CiAgICAgIH0KICAgICAgY29uc3QgcyA9IERCYXIgPCAwID8gLTEgOiAxOwogICAgICBjb25zdCB0ZW1wMCA9IC1zICogTWF0aC5hYnMoQUJhcikgKiBNYXRoLnNxcnQoLWRpc2NyaW1pbmFudCk7CiAgICAgIHRlbXAxID0gLURCYXIgKyB0ZW1wMDsKICAgICAgY29uc3QgeCA9IHRlbXAxIC8gMjsKICAgICAgY29uc3QgcCA9IHggPCAwID8gLU1hdGgucG93KC14LCAxIC8gMykgOiBNYXRoLnBvdyh4LCAxIC8gMyk7CiAgICAgIGNvbnN0IHEgPSB0ZW1wMSA9PT0gdGVtcDAgPyAtcCA6IC1DQmFyIC8gcDsKICAgICAgdGVtcCA9IENCYXIgPD0gMCA/IHAgKyBxIDogLURCYXIgLyAocCAqIHAgKyBxICogcSArIENCYXIpOwogICAgICBpZiAoQjIgKiBCRCA+PSBBQyAqIEMyKSB7CiAgICAgICAgcmV0dXJuIFsodGVtcCAtIEIpIC8gQV07CiAgICAgIH0KICAgICAgcmV0dXJuIFstRCAvICh0ZW1wICsgQyldOwogICAgfQogICAgY29uc3QgQ0JhckEgPSBkZWx0YTE7CiAgICBjb25zdCBEQmFyQSA9IC0yICogQiAqIGRlbHRhMSArIEEgKiBkZWx0YTI7CiAgICBjb25zdCBDQmFyRCA9IGRlbHRhMzsKICAgIGNvbnN0IERCYXJEID0gLUQgKiBkZWx0YTIgKyAyICogQyAqIGRlbHRhMzsKICAgIGNvbnN0IHNxdWFyZVJvb3RPZkRpc2NyaW1pbmFudCA9IE1hdGguc3FydChkaXNjcmltaW5hbnQpOwogICAgY29uc3QgaGFsZlNxdWFyZVJvb3RPZjMgPSBNYXRoLnNxcnQoMykgLyAyOwogICAgbGV0IHRoZXRhID0gTWF0aC5hYnMoTWF0aC5hdGFuMihBICogc3F1YXJlUm9vdE9mRGlzY3JpbWluYW50LCAtREJhckEpIC8gMyk7CiAgICB0ZW1wID0gMiAqIE1hdGguc3FydCgtQ0JhckEpOwogICAgbGV0IGNvc2luZSA9IE1hdGguY29zKHRoZXRhKTsKICAgIHRlbXAxID0gdGVtcCAqIGNvc2luZTsKICAgIGxldCB0ZW1wMyA9IHRlbXAgKiAoLWNvc2luZSAvIDIgLSBoYWxmU3F1YXJlUm9vdE9mMyAqIE1hdGguc2luKHRoZXRhKSk7CiAgICBjb25zdCBudW1lcmF0b3JMYXJnZSA9IHRlbXAxICsgdGVtcDMgPiAyICogQiA/IHRlbXAxIC0gQiA6IHRlbXAzIC0gQjsKICAgIGNvbnN0IGRlbm9taW5hdG9yTGFyZ2UgPSBBOwogICAgY29uc3Qgcm9vdDEgPSBudW1lcmF0b3JMYXJnZSAvIGRlbm9taW5hdG9yTGFyZ2U7CiAgICB0aGV0YSA9IE1hdGguYWJzKE1hdGguYXRhbjIoRCAqIHNxdWFyZVJvb3RPZkRpc2NyaW1pbmFudCwgLURCYXJEKSAvIDMpOwogICAgdGVtcCA9IDIgKiBNYXRoLnNxcnQoLUNCYXJEKTsKICAgIGNvc2luZSA9IE1hdGguY29zKHRoZXRhKTsKICAgIHRlbXAxID0gdGVtcCAqIGNvc2luZTsKICAgIHRlbXAzID0gdGVtcCAqICgtY29zaW5lIC8gMiAtIGhhbGZTcXVhcmVSb290T2YzICogTWF0aC5zaW4odGhldGEpKTsKICAgIGNvbnN0IG51bWVyYXRvclNtYWxsID0gLUQ7CiAgICBjb25zdCBkZW5vbWluYXRvclNtYWxsID0gdGVtcDEgKyB0ZW1wMyA8IDIgKiBDID8gdGVtcDEgKyBDIDogdGVtcDMgKyBDOwogICAgY29uc3Qgcm9vdDMgPSBudW1lcmF0b3JTbWFsbCAvIGRlbm9taW5hdG9yU21hbGw7CiAgICBjb25zdCBFID0gZGVub21pbmF0b3JMYXJnZSAqIGRlbm9taW5hdG9yU21hbGw7CiAgICBjb25zdCBGID0gLW51bWVyYXRvckxhcmdlICogZGVub21pbmF0b3JTbWFsbCAtIGRlbm9taW5hdG9yTGFyZ2UgKiBudW1lcmF0b3JTbWFsbDsKICAgIGNvbnN0IEcgPSBudW1lcmF0b3JMYXJnZSAqIG51bWVyYXRvclNtYWxsOwogICAgY29uc3Qgcm9vdDIgPSAoQyAqIEYgLSBCICogRykgLyAoLUIgKiBGICsgQyAqIEUpOwogICAgaWYgKHJvb3QxIDw9IHJvb3QyKSB7CiAgICAgIGlmIChyb290MSA8PSByb290MykgewogICAgICAgIGlmIChyb290MiA8PSByb290MykgewogICAgICAgICAgcmV0dXJuIFtyb290MSwgcm9vdDIsIHJvb3QzXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtyb290MSwgcm9vdDMsIHJvb3QyXTsKICAgICAgfQogICAgICByZXR1cm4gW3Jvb3QzLCByb290MSwgcm9vdDJdOwogICAgfQogICAgaWYgKHJvb3QxIDw9IHJvb3QzKSB7CiAgICAgIHJldHVybiBbcm9vdDIsIHJvb3QxLCByb290M107CiAgICB9CiAgICBpZiAocm9vdDIgPD0gcm9vdDMpIHsKICAgICAgcmV0dXJuIFtyb290Miwgcm9vdDMsIHJvb3QxXTsKICAgIH0KICAgIHJldHVybiBbcm9vdDMsIHJvb3QyLCByb290MV07CiAgfQogIHZhciBDdWJpY1JlYWxQb2x5bm9taWFsLCBDdWJpY1JlYWxQb2x5bm9taWFsX2RlZmF1bHQ7CiAgdmFyIGluaXRfQ3ViaWNSZWFsUG9seW5vbWlhbCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ3ViaWNSZWFsUG9seW5vbWlhbC5qcyIoKSB7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9RdWFkcmF0aWNSZWFsUG9seW5vbWlhbCgpOwogICAgICBDdWJpY1JlYWxQb2x5bm9taWFsID0ge307CiAgICAgIEN1YmljUmVhbFBvbHlub21pYWwuY29tcHV0ZURpc2NyaW1pbmFudCA9IGZ1bmN0aW9uKGEzLCBiLCBjLCBkKSB7CiAgICAgICAgaWYgKHR5cGVvZiBhMyAhPT0gIm51bWJlciIpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIGIgIT09ICJudW1iZXIiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYiBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBjICE9PSAibnVtYmVyIikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImMgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgZCAhPT0gIm51bWJlciIpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJkIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBhMjIgPSBhMyAqIGEzOwogICAgICAgIGNvbnN0IGIyID0gYiAqIGI7CiAgICAgICAgY29uc3QgYzIgPSBjICogYzsKICAgICAgICBjb25zdCBkMiA9IGQgKiBkOwogICAgICAgIGNvbnN0IGRpc2NyaW1pbmFudCA9IDE4ICogYTMgKiBiICogYyAqIGQgKyBiMiAqIGMyIC0gMjcgKiBhMjIgKiBkMiAtIDQgKiAoYTMgKiBjMiAqIGMgKyBiMiAqIGIgKiBkKTsKICAgICAgICByZXR1cm4gZGlzY3JpbWluYW50OwogICAgICB9OwogICAgICBDdWJpY1JlYWxQb2x5bm9taWFsLmNvbXB1dGVSZWFsUm9vdHMgPSBmdW5jdGlvbihhMywgYiwgYywgZCkgewogICAgICAgIGlmICh0eXBlb2YgYTMgIT09ICJudW1iZXIiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYSBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSAibnVtYmVyIikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImIgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgYyAhPT0gIm51bWJlciIpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJjIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIGQgIT09ICJudW1iZXIiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZCBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTsKICAgICAgICB9CiAgICAgICAgbGV0IHJvb3RzOwogICAgICAgIGxldCByYXRpbzsKICAgICAgICBpZiAoYTMgPT09IDApIHsKICAgICAgICAgIHJldHVybiBRdWFkcmF0aWNSZWFsUG9seW5vbWlhbF9kZWZhdWx0LmNvbXB1dGVSZWFsUm9vdHMoYiwgYywgZCk7CiAgICAgICAgfSBlbHNlIGlmIChiID09PSAwKSB7CiAgICAgICAgICBpZiAoYyA9PT0gMCkgewogICAgICAgICAgICBpZiAoZCA9PT0gMCkgewogICAgICAgICAgICAgIHJldHVybiBbMCwgMCwgMF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmF0aW8gPSAtZCAvIGEzOwogICAgICAgICAgICBjb25zdCByb290ID0gcmF0aW8gPCAwID8gLU1hdGgucG93KC1yYXRpbywgMSAvIDMpIDogTWF0aC5wb3cocmF0aW8sIDEgLyAzKTsKICAgICAgICAgICAgcmV0dXJuIFtyb290LCByb290LCByb290XTsKICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PT0gMCkgewogICAgICAgICAgICByb290cyA9IFF1YWRyYXRpY1JlYWxQb2x5bm9taWFsX2RlZmF1bHQuY29tcHV0ZVJlYWxSb290cyhhMywgMCwgYyk7CiAgICAgICAgICAgIGlmIChyb290cy5MZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICByZXR1cm4gWzBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBbcm9vdHNbMF0sIDAsIHJvb3RzWzFdXTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjb21wdXRlUmVhbFJvb3RzKGEzLCAwLCBjLCBkKTsKICAgICAgICB9IGVsc2UgaWYgKGMgPT09IDApIHsKICAgICAgICAgIGlmIChkID09PSAwKSB7CiAgICAgICAgICAgIHJhdGlvID0gLWIgLyBhMzsKICAgICAgICAgICAgaWYgKHJhdGlvIDwgMCkgewogICAgICAgICAgICAgIHJldHVybiBbcmF0aW8sIDAsIDBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBbMCwgMCwgcmF0aW9dOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGNvbXB1dGVSZWFsUm9vdHMoYTMsIGIsIDAsIGQpOwogICAgICAgIH0gZWxzZSBpZiAoZCA9PT0gMCkgewogICAgICAgICAgcm9vdHMgPSBRdWFkcmF0aWNSZWFsUG9seW5vbWlhbF9kZWZhdWx0LmNvbXB1dGVSZWFsUm9vdHMoYTMsIGIsIGMpOwogICAgICAgICAgaWYgKHJvb3RzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gWzBdOwogICAgICAgICAgfSBlbHNlIGlmIChyb290c1sxXSA8PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBbcm9vdHNbMF0sIHJvb3RzWzFdLCAwXTsKICAgICAgICAgIH0gZWxzZSBpZiAocm9vdHNbMF0gPj0gMCkgewogICAgICAgICAgICByZXR1cm4gWzAsIHJvb3RzWzBdLCByb290c1sxXV07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gW3Jvb3RzWzBdLCAwLCByb290c1sxXV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb21wdXRlUmVhbFJvb3RzKGEzLCBiLCBjLCBkKTsKICAgICAgfTsKICAgICAgQ3ViaWNSZWFsUG9seW5vbWlhbF9kZWZhdWx0ID0gQ3ViaWNSZWFsUG9seW5vbWlhbDsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1F1YXJ0aWNSZWFsUG9seW5vbWlhbC5qcwogIGZ1bmN0aW9uIG9yaWdpbmFsKGEzLCBhMjIsIGExLCBhMCkgewogICAgY29uc3QgYTNTcXVhcmVkID0gYTMgKiBhMzsKICAgIGNvbnN0IHAgPSBhMjIgLSAzICogYTNTcXVhcmVkIC8gODsKICAgIGNvbnN0IHEgPSBhMSAtIGEyMiAqIGEzIC8gMiArIGEzU3F1YXJlZCAqIGEzIC8gODsKICAgIGNvbnN0IHIgPSBhMCAtIGExICogYTMgLyA0ICsgYTIyICogYTNTcXVhcmVkIC8gMTYgLSAzICogYTNTcXVhcmVkICogYTNTcXVhcmVkIC8gMjU2OwogICAgY29uc3QgY3ViaWNSb290cyA9IEN1YmljUmVhbFBvbHlub21pYWxfZGVmYXVsdC5jb21wdXRlUmVhbFJvb3RzKAogICAgICAxLAogICAgICAyICogcCwKICAgICAgcCAqIHAgLSA0ICogciwKICAgICAgLXEgKiBxCiAgICApOwogICAgaWYgKGN1YmljUm9vdHMubGVuZ3RoID4gMCkgewogICAgICBjb25zdCB0ZW1wID0gLWEzIC8gNDsKICAgICAgY29uc3QgaFNxdWFyZWQgPSBjdWJpY1Jvb3RzW2N1YmljUm9vdHMubGVuZ3RoIC0gMV07CiAgICAgIGlmIChNYXRoLmFicyhoU3F1YXJlZCkgPCBNYXRoX2RlZmF1bHQuRVBTSUxPTjE0KSB7CiAgICAgICAgY29uc3Qgcm9vdHMgPSBRdWFkcmF0aWNSZWFsUG9seW5vbWlhbF9kZWZhdWx0LmNvbXB1dGVSZWFsUm9vdHMoMSwgcCwgcik7CiAgICAgICAgaWYgKHJvb3RzLmxlbmd0aCA9PT0gMikgewogICAgICAgICAgY29uc3Qgcm9vdDAgPSByb290c1swXTsKICAgICAgICAgIGNvbnN0IHJvb3QxID0gcm9vdHNbMV07CiAgICAgICAgICBsZXQgeTsKICAgICAgICAgIGlmIChyb290MCA+PSAwICYmIHJvb3QxID49IDApIHsKICAgICAgICAgICAgY29uc3QgeTAgPSBNYXRoLnNxcnQocm9vdDApOwogICAgICAgICAgICBjb25zdCB5MSA9IE1hdGguc3FydChyb290MSk7CiAgICAgICAgICAgIHJldHVybiBbdGVtcCAtIHkxLCB0ZW1wIC0geTAsIHRlbXAgKyB5MCwgdGVtcCArIHkxXTsKICAgICAgICAgIH0gZWxzZSBpZiAocm9vdDAgPj0gMCAmJiByb290MSA8IDApIHsKICAgICAgICAgICAgeSA9IE1hdGguc3FydChyb290MCk7CiAgICAgICAgICAgIHJldHVybiBbdGVtcCAtIHksIHRlbXAgKyB5XTsKICAgICAgICAgIH0gZWxzZSBpZiAocm9vdDAgPCAwICYmIHJvb3QxID49IDApIHsKICAgICAgICAgICAgeSA9IE1hdGguc3FydChyb290MSk7CiAgICAgICAgICAgIHJldHVybiBbdGVtcCAtIHksIHRlbXAgKyB5XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9IGVsc2UgaWYgKGhTcXVhcmVkID4gMCkgewogICAgICAgIGNvbnN0IGggPSBNYXRoLnNxcnQoaFNxdWFyZWQpOwogICAgICAgIGNvbnN0IG0gPSAocCArIGhTcXVhcmVkIC0gcSAvIGgpIC8gMjsKICAgICAgICBjb25zdCBuID0gKHAgKyBoU3F1YXJlZCArIHEgLyBoKSAvIDI7CiAgICAgICAgY29uc3Qgcm9vdHMxID0gUXVhZHJhdGljUmVhbFBvbHlub21pYWxfZGVmYXVsdC5jb21wdXRlUmVhbFJvb3RzKDEsIGgsIG0pOwogICAgICAgIGNvbnN0IHJvb3RzMiA9IFF1YWRyYXRpY1JlYWxQb2x5bm9taWFsX2RlZmF1bHQuY29tcHV0ZVJlYWxSb290cygxLCAtaCwgbik7CiAgICAgICAgaWYgKHJvb3RzMS5sZW5ndGggIT09IDApIHsKICAgICAgICAgIHJvb3RzMVswXSArPSB0ZW1wOwogICAgICAgICAgcm9vdHMxWzFdICs9IHRlbXA7CiAgICAgICAgICBpZiAocm9vdHMyLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgICByb290czJbMF0gKz0gdGVtcDsKICAgICAgICAgICAgcm9vdHMyWzFdICs9IHRlbXA7CiAgICAgICAgICAgIGlmIChyb290czFbMV0gPD0gcm9vdHMyWzBdKSB7CiAgICAgICAgICAgICAgcmV0dXJuIFtyb290czFbMF0sIHJvb3RzMVsxXSwgcm9vdHMyWzBdLCByb290czJbMV1dOwogICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3RzMlsxXSA8PSByb290czFbMF0pIHsKICAgICAgICAgICAgICByZXR1cm4gW3Jvb3RzMlswXSwgcm9vdHMyWzFdLCByb290czFbMF0sIHJvb3RzMVsxXV07CiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdHMxWzBdID49IHJvb3RzMlswXSAmJiByb290czFbMV0gPD0gcm9vdHMyWzFdKSB7CiAgICAgICAgICAgICAgcmV0dXJuIFtyb290czJbMF0sIHJvb3RzMVswXSwgcm9vdHMxWzFdLCByb290czJbMV1dOwogICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3RzMlswXSA+PSByb290czFbMF0gJiYgcm9vdHMyWzFdIDw9IHJvb3RzMVsxXSkgewogICAgICAgICAgICAgIHJldHVybiBbcm9vdHMxWzBdLCByb290czJbMF0sIHJvb3RzMlsxXSwgcm9vdHMxWzFdXTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyb290czFbMF0gPiByb290czJbMF0gJiYgcm9vdHMxWzBdIDwgcm9vdHMyWzFdKSB7CiAgICAgICAgICAgICAgcmV0dXJuIFtyb290czJbMF0sIHJvb3RzMVswXSwgcm9vdHMyWzFdLCByb290czFbMV1dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBbcm9vdHMxWzBdLCByb290czJbMF0sIHJvb3RzMVsxXSwgcm9vdHMyWzFdXTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByb290czE7CiAgICAgICAgfQogICAgICAgIGlmIChyb290czIubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICByb290czJbMF0gKz0gdGVtcDsKICAgICAgICAgIHJvb3RzMlsxXSArPSB0ZW1wOwogICAgICAgICAgcmV0dXJuIHJvb3RzMjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gW107CiAgfQogIGZ1bmN0aW9uIG5ldW1hcmsoYTMsIGEyMiwgYTEsIGEwKSB7CiAgICBjb25zdCBhMVNxdWFyZWQgPSBhMSAqIGExOwogICAgY29uc3QgYTJTcXVhcmVkID0gYTIyICogYTIyOwogICAgY29uc3QgYTNTcXVhcmVkID0gYTMgKiBhMzsKICAgIGNvbnN0IHAgPSAtMiAqIGEyMjsKICAgIGNvbnN0IHEgPSBhMSAqIGEzICsgYTJTcXVhcmVkIC0gNCAqIGEwOwogICAgY29uc3QgciA9IGEzU3F1YXJlZCAqIGEwIC0gYTEgKiBhMjIgKiBhMyArIGExU3F1YXJlZDsKICAgIGNvbnN0IGN1YmljUm9vdHMgPSBDdWJpY1JlYWxQb2x5bm9taWFsX2RlZmF1bHQuY29tcHV0ZVJlYWxSb290cygxLCBwLCBxLCByKTsKICAgIGlmIChjdWJpY1Jvb3RzLmxlbmd0aCA+IDApIHsKICAgICAgY29uc3QgeSA9IGN1YmljUm9vdHNbMF07CiAgICAgIGNvbnN0IHRlbXAgPSBhMjIgLSB5OwogICAgICBjb25zdCB0ZW1wU3F1YXJlZCA9IHRlbXAgKiB0ZW1wOwogICAgICBjb25zdCBnMSA9IGEzIC8gMjsKICAgICAgY29uc3QgaDEgPSB0ZW1wIC8gMjsKICAgICAgY29uc3QgbSA9IHRlbXBTcXVhcmVkIC0gNCAqIGEwOwogICAgICBjb25zdCBtRXJyb3IgPSB0ZW1wU3F1YXJlZCArIDQgKiBNYXRoLmFicyhhMCk7CiAgICAgIGNvbnN0IG4gPSBhM1NxdWFyZWQgLSA0ICogeTsKICAgICAgY29uc3QgbkVycm9yID0gYTNTcXVhcmVkICsgNCAqIE1hdGguYWJzKHkpOwogICAgICBsZXQgZzI7CiAgICAgIGxldCBoMjsKICAgICAgaWYgKHkgPCAwIHx8IG0gKiBuRXJyb3IgPCBuICogbUVycm9yKSB7CiAgICAgICAgY29uc3Qgc3F1YXJlUm9vdE9mTiA9IE1hdGguc3FydChuKTsKICAgICAgICBnMiA9IHNxdWFyZVJvb3RPZk4gLyAyOwogICAgICAgIGgyID0gc3F1YXJlUm9vdE9mTiA9PT0gMCA/IDAgOiAoYTMgKiBoMSAtIGExKSAvIHNxdWFyZVJvb3RPZk47CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3Qgc3F1YXJlUm9vdE9mTSA9IE1hdGguc3FydChtKTsKICAgICAgICBnMiA9IHNxdWFyZVJvb3RPZk0gPT09IDAgPyAwIDogKGEzICogaDEgLSBhMSkgLyBzcXVhcmVSb290T2ZNOwogICAgICAgIGgyID0gc3F1YXJlUm9vdE9mTSAvIDI7CiAgICAgIH0KICAgICAgbGV0IEc7CiAgICAgIGxldCBnOwogICAgICBpZiAoZzEgPT09IDAgJiYgZzIgPT09IDApIHsKICAgICAgICBHID0gMDsKICAgICAgICBnID0gMDsKICAgICAgfSBlbHNlIGlmIChNYXRoX2RlZmF1bHQuc2lnbihnMSkgPT09IE1hdGhfZGVmYXVsdC5zaWduKGcyKSkgewogICAgICAgIEcgPSBnMSArIGcyOwogICAgICAgIGcgPSB5IC8gRzsKICAgICAgfSBlbHNlIHsKICAgICAgICBnID0gZzEgLSBnMjsKICAgICAgICBHID0geSAvIGc7CiAgICAgIH0KICAgICAgbGV0IEg7CiAgICAgIGxldCBoOwogICAgICBpZiAoaDEgPT09IDAgJiYgaDIgPT09IDApIHsKICAgICAgICBIID0gMDsKICAgICAgICBoID0gMDsKICAgICAgfSBlbHNlIGlmIChNYXRoX2RlZmF1bHQuc2lnbihoMSkgPT09IE1hdGhfZGVmYXVsdC5zaWduKGgyKSkgewogICAgICAgIEggPSBoMSArIGgyOwogICAgICAgIGggPSBhMCAvIEg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaCA9IGgxIC0gaDI7CiAgICAgICAgSCA9IGEwIC8gaDsKICAgICAgfQogICAgICBjb25zdCByb290czEgPSBRdWFkcmF0aWNSZWFsUG9seW5vbWlhbF9kZWZhdWx0LmNvbXB1dGVSZWFsUm9vdHMoMSwgRywgSCk7CiAgICAgIGNvbnN0IHJvb3RzMiA9IFF1YWRyYXRpY1JlYWxQb2x5bm9taWFsX2RlZmF1bHQuY29tcHV0ZVJlYWxSb290cygxLCBnLCBoKTsKICAgICAgaWYgKHJvb3RzMS5sZW5ndGggIT09IDApIHsKICAgICAgICBpZiAocm9vdHMyLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgaWYgKHJvb3RzMVsxXSA8PSByb290czJbMF0pIHsKICAgICAgICAgICAgcmV0dXJuIFtyb290czFbMF0sIHJvb3RzMVsxXSwgcm9vdHMyWzBdLCByb290czJbMV1dOwogICAgICAgICAgfSBlbHNlIGlmIChyb290czJbMV0gPD0gcm9vdHMxWzBdKSB7CiAgICAgICAgICAgIHJldHVybiBbcm9vdHMyWzBdLCByb290czJbMV0sIHJvb3RzMVswXSwgcm9vdHMxWzFdXTsKICAgICAgICAgIH0gZWxzZSBpZiAocm9vdHMxWzBdID49IHJvb3RzMlswXSAmJiByb290czFbMV0gPD0gcm9vdHMyWzFdKSB7CiAgICAgICAgICAgIHJldHVybiBbcm9vdHMyWzBdLCByb290czFbMF0sIHJvb3RzMVsxXSwgcm9vdHMyWzFdXTsKICAgICAgICAgIH0gZWxzZSBpZiAocm9vdHMyWzBdID49IHJvb3RzMVswXSAmJiByb290czJbMV0gPD0gcm9vdHMxWzFdKSB7CiAgICAgICAgICAgIHJldHVybiBbcm9vdHMxWzBdLCByb290czJbMF0sIHJvb3RzMlsxXSwgcm9vdHMxWzFdXTsKICAgICAgICAgIH0gZWxzZSBpZiAocm9vdHMxWzBdID4gcm9vdHMyWzBdICYmIHJvb3RzMVswXSA8IHJvb3RzMlsxXSkgewogICAgICAgICAgICByZXR1cm4gW3Jvb3RzMlswXSwgcm9vdHMxWzBdLCByb290czJbMV0sIHJvb3RzMVsxXV07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gW3Jvb3RzMVswXSwgcm9vdHMyWzBdLCByb290czFbMV0sIHJvb3RzMlsxXV07CiAgICAgICAgfQogICAgICAgIHJldHVybiByb290czE7CiAgICAgIH0KICAgICAgaWYgKHJvb3RzMi5sZW5ndGggIT09IDApIHsKICAgICAgICByZXR1cm4gcm9vdHMyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gW107CiAgfQogIHZhciBRdWFydGljUmVhbFBvbHlub21pYWwsIFF1YXJ0aWNSZWFsUG9seW5vbWlhbF9kZWZhdWx0OwogIHZhciBpbml0X1F1YXJ0aWNSZWFsUG9seW5vbWlhbCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUXVhcnRpY1JlYWxQb2x5bm9taWFsLmpzIigpIHsKICAgICAgaW5pdF9DdWJpY1JlYWxQb2x5bm9taWFsKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGluaXRfUXVhZHJhdGljUmVhbFBvbHlub21pYWwoKTsKICAgICAgUXVhcnRpY1JlYWxQb2x5bm9taWFsID0ge307CiAgICAgIFF1YXJ0aWNSZWFsUG9seW5vbWlhbC5jb21wdXRlRGlzY3JpbWluYW50ID0gZnVuY3Rpb24oYTMsIGIsIGMsIGQsIGUpIHsKICAgICAgICBpZiAodHlwZW9mIGEzICE9PSAibnVtYmVyIikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImEgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgYiAhPT0gIm51bWJlciIpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJiIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIGMgIT09ICJudW1iZXIiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYyBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBkICE9PSAibnVtYmVyIikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImQgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgZSAhPT0gIm51bWJlciIpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJlIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBhMjIgPSBhMyAqIGEzOwogICAgICAgIGNvbnN0IGEzMiA9IGEyMiAqIGEzOwogICAgICAgIGNvbnN0IGIyID0gYiAqIGI7CiAgICAgICAgY29uc3QgYjMgPSBiMiAqIGI7CiAgICAgICAgY29uc3QgYzIgPSBjICogYzsKICAgICAgICBjb25zdCBjMzIgPSBjMiAqIGM7CiAgICAgICAgY29uc3QgZDIgPSBkICogZDsKICAgICAgICBjb25zdCBkMyA9IGQyICogZDsKICAgICAgICBjb25zdCBlMiA9IGUgKiBlOwogICAgICAgIGNvbnN0IGUzID0gZTIgKiBlOwogICAgICAgIGNvbnN0IGRpc2NyaW1pbmFudCA9IGIyICogYzIgKiBkMiAtIDQgKiBiMyAqIGQzIC0gNCAqIGEzICogYzMyICogZDIgKyAxOCAqIGEzICogYiAqIGMgKiBkMyAtIDI3ICogYTIyICogZDIgKiBkMiArIDI1NiAqIGEzMiAqIGUzICsgZSAqICgxOCAqIGIzICogYyAqIGQgLSA0ICogYjIgKiBjMzIgKyAxNiAqIGEzICogYzIgKiBjMiAtIDgwICogYTMgKiBiICogYzIgKiBkIC0gNiAqIGEzICogYjIgKiBkMiArIDE0NCAqIGEyMiAqIGMgKiBkMikgKyBlMiAqICgxNDQgKiBhMyAqIGIyICogYyAtIDI3ICogYjIgKiBiMiAtIDEyOCAqIGEyMiAqIGMyIC0gMTkyICogYTIyICogYiAqIGQpOwogICAgICAgIHJldHVybiBkaXNjcmltaW5hbnQ7CiAgICAgIH07CiAgICAgIFF1YXJ0aWNSZWFsUG9seW5vbWlhbC5jb21wdXRlUmVhbFJvb3RzID0gZnVuY3Rpb24oYTMsIGIsIGMsIGQsIGUpIHsKICAgICAgICBpZiAodHlwZW9mIGEzICE9PSAibnVtYmVyIikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImEgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgYiAhPT0gIm51bWJlciIpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJiIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIGMgIT09ICJudW1iZXIiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYyBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBkICE9PSAibnVtYmVyIikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImQgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgZSAhPT0gIm51bWJlciIpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJlIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoTWF0aC5hYnMoYTMpIDwgTWF0aF9kZWZhdWx0LkVQU0lMT04xNSkgewogICAgICAgICAgcmV0dXJuIEN1YmljUmVhbFBvbHlub21pYWxfZGVmYXVsdC5jb21wdXRlUmVhbFJvb3RzKGIsIGMsIGQsIGUpOwogICAgICAgIH0KICAgICAgICBjb25zdCBhMzIgPSBiIC8gYTM7CiAgICAgICAgY29uc3QgYTIyID0gYyAvIGEzOwogICAgICAgIGNvbnN0IGExID0gZCAvIGEzOwogICAgICAgIGNvbnN0IGEwID0gZSAvIGEzOwogICAgICAgIGxldCBrID0gYTMyIDwgMCA/IDEgOiAwOwogICAgICAgIGsgKz0gYTIyIDwgMCA/IGsgKyAxIDogazsKICAgICAgICBrICs9IGExIDwgMCA/IGsgKyAxIDogazsKICAgICAgICBrICs9IGEwIDwgMCA/IGsgKyAxIDogazsKICAgICAgICBzd2l0Y2ggKGspIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsKGEzMiwgYTIyLCBhMSwgYTApOwogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICByZXR1cm4gbmV1bWFyayhhMzIsIGEyMiwgYTEsIGEwKTsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgcmV0dXJuIG5ldW1hcmsoYTMyLCBhMjIsIGExLCBhMCk7CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbChhMzIsIGEyMiwgYTEsIGEwKTsKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsKGEzMiwgYTIyLCBhMSwgYTApOwogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICByZXR1cm4gbmV1bWFyayhhMzIsIGEyMiwgYTEsIGEwKTsKICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsKGEzMiwgYTIyLCBhMSwgYTApOwogICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwoYTMyLCBhMjIsIGExLCBhMCk7CiAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgIHJldHVybiBuZXVtYXJrKGEzMiwgYTIyLCBhMSwgYTApOwogICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwoYTMyLCBhMjIsIGExLCBhMCk7CiAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwoYTMyLCBhMjIsIGExLCBhMCk7CiAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICByZXR1cm4gbmV1bWFyayhhMzIsIGEyMiwgYTEsIGEwKTsKICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbChhMzIsIGEyMiwgYTEsIGEwKTsKICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbChhMzIsIGEyMiwgYTEsIGEwKTsKICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbChhMzIsIGEyMiwgYTEsIGEwKTsKICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbChhMzIsIGEyMiwgYTEsIGEwKTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICB9OwogICAgICBRdWFydGljUmVhbFBvbHlub21pYWxfZGVmYXVsdCA9IFF1YXJ0aWNSZWFsUG9seW5vbWlhbDsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1JheS5qcwogIGZ1bmN0aW9uIFJheShvcmlnaW4sIGRpcmVjdGlvbjIpIHsKICAgIGRpcmVjdGlvbjIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoZGlyZWN0aW9uMiA/PyBDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTyk7CiAgICBpZiAoIUNhcnRlc2lhbjNfZGVmYXVsdC5lcXVhbHMoZGlyZWN0aW9uMiwgQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8pKSB7CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoZGlyZWN0aW9uMiwgZGlyZWN0aW9uMik7CiAgICB9CiAgICB0aGlzLm9yaWdpbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShvcmlnaW4gPz8gQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8pOwogICAgdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb24yOwogIH0KICB2YXIgUmF5X2RlZmF1bHQ7CiAgdmFyIGluaXRfUmF5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9SYXkuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgUmF5LmNsb25lID0gZnVuY3Rpb24ocmF5LCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyYXkpKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFJheShyYXkub3JpZ2luLCByYXkuZGlyZWN0aW9uKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0Lm9yaWdpbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShyYXkub3JpZ2luKTsKICAgICAgICByZXN1bHQuZGlyZWN0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKHJheS5kaXJlY3Rpb24pOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFJheS5nZXRQb2ludCA9IGZ1bmN0aW9uKHJheSwgdCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyYXkiLCByYXkpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigidCIsIHQpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIocmF5LmRpcmVjdGlvbiwgdCwgcmVzdWx0KTsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuM19kZWZhdWx0LmFkZChyYXkub3JpZ2luLCByZXN1bHQsIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIFJheV9kZWZhdWx0ID0gUmF5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvSW50ZXJzZWN0aW9uVGVzdHMuanMKICBmdW5jdGlvbiBzb2x2ZVF1YWRyYXRpYyhhMywgYiwgYywgcmVzdWx0KSB7CiAgICBjb25zdCBkZXQgPSBiICogYiAtIDQgKiBhMyAqIGM7CiAgICBpZiAoZGV0IDwgMCkgewogICAgICByZXR1cm4gdm9pZCAwOwogICAgfSBlbHNlIGlmIChkZXQgPiAwKSB7CiAgICAgIGNvbnN0IGRlbm9tID0gMSAvICgyICogYTMpOwogICAgICBjb25zdCBkaXNjID0gTWF0aC5zcXJ0KGRldCk7CiAgICAgIGNvbnN0IHJvb3QwID0gKC1iICsgZGlzYykgKiBkZW5vbTsKICAgICAgY29uc3Qgcm9vdDEgPSAoLWIgLSBkaXNjKSAqIGRlbm9tOwogICAgICBpZiAocm9vdDAgPCByb290MSkgewogICAgICAgIHJlc3VsdC5yb290MCA9IHJvb3QwOwogICAgICAgIHJlc3VsdC5yb290MSA9IHJvb3QxOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdC5yb290MCA9IHJvb3QxOwogICAgICAgIHJlc3VsdC5yb290MSA9IHJvb3QwOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBjb25zdCByb290ID0gLWIgLyAoMiAqIGEzKTsKICAgIGlmIChyb290ID09PSAwKSB7CiAgICAgIHJldHVybiB2b2lkIDA7CiAgICB9CiAgICByZXN1bHQucm9vdDAgPSByZXN1bHQucm9vdDEgPSByb290OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgZnVuY3Rpb24gcmF5U3BoZXJlKHJheSwgc3BoZXJlLCByZXN1bHQpIHsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgcmVzdWx0ID0gbmV3IEludGVydmFsX2RlZmF1bHQoKTsKICAgIH0KICAgIGNvbnN0IG9yaWdpbiA9IHJheS5vcmlnaW47CiAgICBjb25zdCBkaXJlY3Rpb24yID0gcmF5LmRpcmVjdGlvbjsKICAgIGNvbnN0IGNlbnRlciA9IHNwaGVyZS5jZW50ZXI7CiAgICBjb25zdCByYWRpdXNTcXVhcmVkID0gc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXM7CiAgICBjb25zdCBkaWZmID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KG9yaWdpbiwgY2VudGVyLCBzY3JhdGNoUFZlYyk7CiAgICBjb25zdCBhMyA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoZGlyZWN0aW9uMiwgZGlyZWN0aW9uMik7CiAgICBjb25zdCBiID0gMiAqIENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoZGlyZWN0aW9uMiwgZGlmZik7CiAgICBjb25zdCBjID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZVNxdWFyZWQoZGlmZikgLSByYWRpdXNTcXVhcmVkOwogICAgY29uc3Qgcm9vdHMgPSBzb2x2ZVF1YWRyYXRpYyhhMywgYiwgYywgcmF5U3BoZXJlUm9vdHMpOwogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocm9vdHMpKSB7CiAgICAgIHJldHVybiB2b2lkIDA7CiAgICB9CiAgICByZXN1bHQuc3RhcnQgPSByb290cy5yb290MDsKICAgIHJlc3VsdC5zdG9wID0gcm9vdHMucm9vdDE7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBmdW5jdGlvbiBhZGRXaXRoQ2FuY2VsbGF0aW9uQ2hlY2syKGxlZnQsIHJpZ2h0LCB0b2xlcmFuY2UpIHsKICAgIGNvbnN0IGRpZmZlcmVuY2UgPSBsZWZ0ICsgcmlnaHQ7CiAgICBpZiAoTWF0aF9kZWZhdWx0LnNpZ24obGVmdCkgIT09IE1hdGhfZGVmYXVsdC5zaWduKHJpZ2h0KSAmJiBNYXRoLmFicyhkaWZmZXJlbmNlIC8gTWF0aC5tYXgoTWF0aC5hYnMobGVmdCksIE1hdGguYWJzKHJpZ2h0KSkpIDwgdG9sZXJhbmNlKSB7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuIGRpZmZlcmVuY2U7CiAgfQogIHZhciBJbnRlcnNlY3Rpb25UZXN0cywgc2NyYXRjaEVkZ2UwLCBzY3JhdGNoRWRnZTEsIHNjcmF0Y2hQVmVjLCBzY3JhdGNoVFZlYywgc2NyYXRjaFFWZWMsIHNjcmF0Y2hMaW5lU2VnbWVudFRyaWFuZ2xlUmF5LCByYXlTcGhlcmVSb290cywgc2NyYXRjaExpbmVTZWdtZW50UmF5LCBzY3JhdGNoUSwgc2NyYXRjaFcsIGZpcnN0QXhpc1NjcmF0Y2gsIHNlY29uZEF4aXNTY3JhdGNoLCB0aGlyZEF4aXNTY3JhdGNoLCByZWZlcmVuY2VTY3JhdGNoLCBiQ2FydCwgYlNjcmF0Y2gsIGJ0U2NyYXRjaCwgZGlTY3JhdGNoLCBkU2NyYXRjaCwgY1NjcmF0Y2gsIHRlbXBNYXRyaXgsIGFTY3JhdGNoLCBzU2NyYXRjaCwgY2xvc2VzdFNjcmF0Y2gsIHN1cmZQb2ludFNjcmF0Y2gsIGxpbmVTZWdtZW50UGxhbmVEaWZmZXJlbmNlLCBJbnRlcnNlY3Rpb25UZXN0c19kZWZhdWx0OwogIHZhciBpbml0X0ludGVyc2VjdGlvblRlc3RzID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9JbnRlcnNlY3Rpb25UZXN0cy5qcyIoKSB7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRvZ3JhcGhpYygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X0ludGVydmFsKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBpbml0X01hdHJpeDMoKTsKICAgICAgaW5pdF9RdWFkcmF0aWNSZWFsUG9seW5vbWlhbCgpOwogICAgICBpbml0X1F1YXJ0aWNSZWFsUG9seW5vbWlhbCgpOwogICAgICBpbml0X1JheSgpOwogICAgICBJbnRlcnNlY3Rpb25UZXN0cyA9IHt9OwogICAgICBJbnRlcnNlY3Rpb25UZXN0cy5yYXlQbGFuZSA9IGZ1bmN0aW9uKHJheSwgcGxhbmUsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJheSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJyYXkgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHBsYW5lKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInBsYW5lIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG9yaWdpbiA9IHJheS5vcmlnaW47CiAgICAgICAgY29uc3QgZGlyZWN0aW9uMiA9IHJheS5kaXJlY3Rpb247CiAgICAgICAgY29uc3Qgbm9ybWFsMiA9IHBsYW5lLm5vcm1hbDsKICAgICAgICBjb25zdCBkZW5vbWluYXRvciA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3Qobm9ybWFsMiwgZGlyZWN0aW9uMik7CiAgICAgICAgaWYgKE1hdGguYWJzKGRlbm9taW5hdG9yKSA8IE1hdGhfZGVmYXVsdC5FUFNJTE9OMTUpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHQgPSAoLXBsYW5lLmRpc3RhbmNlIC0gQ2FydGVzaWFuM19kZWZhdWx0LmRvdChub3JtYWwyLCBvcmlnaW4pKSAvIGRlbm9taW5hdG9yOwogICAgICAgIGlmICh0IDwgMCkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoZGlyZWN0aW9uMiwgdCwgcmVzdWx0KTsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuM19kZWZhdWx0LmFkZChvcmlnaW4sIHJlc3VsdCwgcmVzdWx0KTsKICAgICAgfTsKICAgICAgc2NyYXRjaEVkZ2UwID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoRWRnZTEgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hQVmVjID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoVFZlYyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFFWZWMgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIEludGVyc2VjdGlvblRlc3RzLnJheVRyaWFuZ2xlUGFyYW1ldHJpYyA9IGZ1bmN0aW9uKHJheSwgcDAsIHAxLCBwMiwgY3VsbEJhY2tGYWNlcykgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJheSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJyYXkgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHAwKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInAwIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwMSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJwMSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocDIpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgicDIgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGN1bGxCYWNrRmFjZXMgPSBjdWxsQmFja0ZhY2VzID8/IGZhbHNlOwogICAgICAgIGNvbnN0IG9yaWdpbiA9IHJheS5vcmlnaW47CiAgICAgICAgY29uc3QgZGlyZWN0aW9uMiA9IHJheS5kaXJlY3Rpb247CiAgICAgICAgY29uc3QgZWRnZTAgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QocDEsIHAwLCBzY3JhdGNoRWRnZTApOwogICAgICAgIGNvbnN0IGVkZ2UxID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KHAyLCBwMCwgc2NyYXRjaEVkZ2UxKTsKICAgICAgICBjb25zdCBwID0gQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKGRpcmVjdGlvbjIsIGVkZ2UxLCBzY3JhdGNoUFZlYyk7CiAgICAgICAgY29uc3QgZGV0ID0gQ2FydGVzaWFuM19kZWZhdWx0LmRvdChlZGdlMCwgcCk7CiAgICAgICAgbGV0IHR2ZWM7CiAgICAgICAgbGV0IHE7CiAgICAgICAgbGV0IHUzOwogICAgICAgIGxldCB2MzsKICAgICAgICBsZXQgdDsKICAgICAgICBpZiAoY3VsbEJhY2tGYWNlcykgewogICAgICAgICAgaWYgKGRldCA8IE1hdGhfZGVmYXVsdC5FUFNJTE9ONikgewogICAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgICAgfQogICAgICAgICAgdHZlYyA9IENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChvcmlnaW4sIHAwLCBzY3JhdGNoVFZlYyk7CiAgICAgICAgICB1MyA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3QodHZlYywgcCk7CiAgICAgICAgICBpZiAodTMgPCAwIHx8IHUzID4gZGV0KSB7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgICB9CiAgICAgICAgICBxID0gQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKHR2ZWMsIGVkZ2UwLCBzY3JhdGNoUVZlYyk7CiAgICAgICAgICB2MyA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoZGlyZWN0aW9uMiwgcSk7CiAgICAgICAgICBpZiAodjMgPCAwIHx8IHUzICsgdjMgPiBkZXQpIHsKICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICAgIHQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KGVkZ2UxLCBxKSAvIGRldDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKE1hdGguYWJzKGRldCkgPCBNYXRoX2RlZmF1bHQuRVBTSUxPTjYpIHsKICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGludkRldCA9IDEgLyBkZXQ7CiAgICAgICAgICB0dmVjID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KG9yaWdpbiwgcDAsIHNjcmF0Y2hUVmVjKTsKICAgICAgICAgIHUzID0gQ2FydGVzaWFuM19kZWZhdWx0LmRvdCh0dmVjLCBwKSAqIGludkRldDsKICAgICAgICAgIGlmICh1MyA8IDAgfHwgdTMgPiAxKSB7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgICB9CiAgICAgICAgICBxID0gQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKHR2ZWMsIGVkZ2UwLCBzY3JhdGNoUVZlYyk7CiAgICAgICAgICB2MyA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoZGlyZWN0aW9uMiwgcSkgKiBpbnZEZXQ7CiAgICAgICAgICBpZiAodjMgPCAwIHx8IHUzICsgdjMgPiAxKSB7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgICB9CiAgICAgICAgICB0ID0gQ2FydGVzaWFuM19kZWZhdWx0LmRvdChlZGdlMSwgcSkgKiBpbnZEZXQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0OwogICAgICB9OwogICAgICBJbnRlcnNlY3Rpb25UZXN0cy5yYXlUcmlhbmdsZSA9IGZ1bmN0aW9uKHJheSwgcDAsIHAxLCBwMiwgY3VsbEJhY2tGYWNlcywgcmVzdWx0KSB7CiAgICAgICAgY29uc3QgdCA9IEludGVyc2VjdGlvblRlc3RzLnJheVRyaWFuZ2xlUGFyYW1ldHJpYygKICAgICAgICAgIHJheSwKICAgICAgICAgIHAwLAogICAgICAgICAgcDEsCiAgICAgICAgICBwMiwKICAgICAgICAgIGN1bGxCYWNrRmFjZXMKICAgICAgICApOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHQpIHx8IHQgPCAwKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKHJheS5kaXJlY3Rpb24sIHQsIHJlc3VsdCk7CiAgICAgICAgcmV0dXJuIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQocmF5Lm9yaWdpbiwgcmVzdWx0LCByZXN1bHQpOwogICAgICB9OwogICAgICBzY3JhdGNoTGluZVNlZ21lbnRUcmlhbmdsZVJheSA9IG5ldyBSYXlfZGVmYXVsdCgpOwogICAgICBJbnRlcnNlY3Rpb25UZXN0cy5saW5lU2VnbWVudFRyaWFuZ2xlID0gZnVuY3Rpb24odjAyLCB2MTIsIHAwLCBwMSwgcDIsIGN1bGxCYWNrRmFjZXMsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHYwMikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJ2MCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodjEyKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInYxIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwMCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJwMCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocDEpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgicDEgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHAyKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInAyIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCByYXkgPSBzY3JhdGNoTGluZVNlZ21lbnRUcmlhbmdsZVJheTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUodjAyLCByYXkub3JpZ2luKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QodjEyLCB2MDIsIHJheS5kaXJlY3Rpb24pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUocmF5LmRpcmVjdGlvbiwgcmF5LmRpcmVjdGlvbik7CiAgICAgICAgY29uc3QgdCA9IEludGVyc2VjdGlvblRlc3RzLnJheVRyaWFuZ2xlUGFyYW1ldHJpYygKICAgICAgICAgIHJheSwKICAgICAgICAgIHAwLAogICAgICAgICAgcDEsCiAgICAgICAgICBwMiwKICAgICAgICAgIGN1bGxCYWNrRmFjZXMKICAgICAgICApOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHQpIHx8IHQgPCAwIHx8IHQgPiBDYXJ0ZXNpYW4zX2RlZmF1bHQuZGlzdGFuY2UodjAyLCB2MTIpKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKHJheS5kaXJlY3Rpb24sIHQsIHJlc3VsdCk7CiAgICAgICAgcmV0dXJuIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQocmF5Lm9yaWdpbiwgcmVzdWx0LCByZXN1bHQpOwogICAgICB9OwogICAgICByYXlTcGhlcmVSb290cyA9IHsKICAgICAgICByb290MDogMCwKICAgICAgICByb290MTogMAogICAgICB9OwogICAgICBJbnRlcnNlY3Rpb25UZXN0cy5yYXlTcGhlcmUgPSBmdW5jdGlvbihyYXksIHNwaGVyZSwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmF5KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInJheSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoc3BoZXJlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInNwaGVyZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gcmF5U3BoZXJlKHJheSwgc3BoZXJlLCByZXN1bHQpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkgfHwgcmVzdWx0LnN0b3AgPCAwKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICByZXN1bHQuc3RhcnQgPSBNYXRoLm1heChyZXN1bHQuc3RhcnQsIDApOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hMaW5lU2VnbWVudFJheSA9IG5ldyBSYXlfZGVmYXVsdCgpOwogICAgICBJbnRlcnNlY3Rpb25UZXN0cy5saW5lU2VnbWVudFNwaGVyZSA9IGZ1bmN0aW9uKHAwLCBwMSwgc3BoZXJlLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwMCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJwMCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocDEpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgicDEgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHNwaGVyZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJzcGhlcmUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJheSA9IHNjcmF0Y2hMaW5lU2VnbWVudFJheTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUocDAsIHJheS5vcmlnaW4pOwogICAgICAgIGNvbnN0IGRpcmVjdGlvbjIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QocDEsIHAwLCByYXkuZGlyZWN0aW9uKTsKICAgICAgICBjb25zdCBtYXhUID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZShkaXJlY3Rpb24yKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKGRpcmVjdGlvbjIsIGRpcmVjdGlvbjIpOwogICAgICAgIHJlc3VsdCA9IHJheVNwaGVyZShyYXksIHNwaGVyZSwgcmVzdWx0KTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpIHx8IHJlc3VsdC5zdG9wIDwgMCB8fCByZXN1bHQuc3RhcnQgPiBtYXhUKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICByZXN1bHQuc3RhcnQgPSBNYXRoLm1heChyZXN1bHQuc3RhcnQsIDApOwogICAgICAgIHJlc3VsdC5zdG9wID0gTWF0aC5taW4ocmVzdWx0LnN0b3AsIG1heFQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hRID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoVyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgSW50ZXJzZWN0aW9uVGVzdHMucmF5RWxsaXBzb2lkID0gZnVuY3Rpb24ocmF5LCBlbGxpcHNvaWQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyYXkpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgicmF5IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChlbGxpcHNvaWQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZWxsaXBzb2lkIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBpbnZlcnNlUmFkaWkgPSBlbGxpcHNvaWQub25lT3ZlclJhZGlpOwogICAgICAgIGNvbnN0IHEgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlDb21wb25lbnRzKGludmVyc2VSYWRpaSwgcmF5Lm9yaWdpbiwgc2NyYXRjaFEpOwogICAgICAgIGNvbnN0IHcgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlDb21wb25lbnRzKAogICAgICAgICAgaW52ZXJzZVJhZGlpLAogICAgICAgICAgcmF5LmRpcmVjdGlvbiwKICAgICAgICAgIHNjcmF0Y2hXCiAgICAgICAgKTsKICAgICAgICBjb25zdCBxMjIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlU3F1YXJlZChxKTsKICAgICAgICBjb25zdCBxdyA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3QocSwgdyk7CiAgICAgICAgbGV0IGRpZmZlcmVuY2UsIHcyLCBwcm9kdWN0LCBkaXNjcmltaW5hbnQsIHRlbXA7CiAgICAgICAgaWYgKHEyMiA+IDEpIHsKICAgICAgICAgIGlmIChxdyA+PSAwKSB7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBxdzIgPSBxdyAqIHF3OwogICAgICAgICAgZGlmZmVyZW5jZSA9IHEyMiAtIDE7CiAgICAgICAgICB3MiA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGVTcXVhcmVkKHcpOwogICAgICAgICAgcHJvZHVjdCA9IHcyICogZGlmZmVyZW5jZTsKICAgICAgICAgIGlmIChxdzIgPCBwcm9kdWN0KSB7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgICB9IGVsc2UgaWYgKHF3MiA+IHByb2R1Y3QpIHsKICAgICAgICAgICAgZGlzY3JpbWluYW50ID0gcXcgKiBxdyAtIHByb2R1Y3Q7CiAgICAgICAgICAgIHRlbXAgPSAtcXcgKyBNYXRoLnNxcnQoZGlzY3JpbWluYW50KTsKICAgICAgICAgICAgY29uc3Qgcm9vdDAgPSB0ZW1wIC8gdzI7CiAgICAgICAgICAgIGNvbnN0IHJvb3QxID0gZGlmZmVyZW5jZSAvIHRlbXA7CiAgICAgICAgICAgIGlmIChyb290MCA8IHJvb3QxKSB7CiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbF9kZWZhdWx0KHJvb3QwLCByb290MSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBzdGFydDogcm9vdDEsCiAgICAgICAgICAgICAgc3RvcDogcm9vdDAKICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHJvb3QgPSBNYXRoLnNxcnQoZGlmZmVyZW5jZSAvIHcyKTsKICAgICAgICAgIHJldHVybiBuZXcgSW50ZXJ2YWxfZGVmYXVsdChyb290LCByb290KTsKICAgICAgICB9IGVsc2UgaWYgKHEyMiA8IDEpIHsKICAgICAgICAgIGRpZmZlcmVuY2UgPSBxMjIgLSAxOwogICAgICAgICAgdzIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlU3F1YXJlZCh3KTsKICAgICAgICAgIHByb2R1Y3QgPSB3MiAqIGRpZmZlcmVuY2U7CiAgICAgICAgICBkaXNjcmltaW5hbnQgPSBxdyAqIHF3IC0gcHJvZHVjdDsKICAgICAgICAgIHRlbXAgPSAtcXcgKyBNYXRoLnNxcnQoZGlzY3JpbWluYW50KTsKICAgICAgICAgIHJldHVybiBuZXcgSW50ZXJ2YWxfZGVmYXVsdCgwLCB0ZW1wIC8gdzIpOwogICAgICAgIH0KICAgICAgICBpZiAocXcgPCAwKSB7CiAgICAgICAgICB3MiA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGVTcXVhcmVkKHcpOwogICAgICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbF9kZWZhdWx0KDAsIC1xdyAvIHcyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgfTsKICAgICAgSW50ZXJzZWN0aW9uVGVzdHMucXVhZHJhdGljVmVjdG9yRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKEEsIGIsIGMsIHgsIHcpIHsKICAgICAgICBjb25zdCB4U3F1YXJlZCA9IHggKiB4OwogICAgICAgIGNvbnN0IHdTcXVhcmVkID0gdyAqIHc7CiAgICAgICAgY29uc3QgbDIgPSAoQVtNYXRyaXgzX2RlZmF1bHQuQ09MVU1OMVJPVzFdIC0gQVtNYXRyaXgzX2RlZmF1bHQuQ09MVU1OMlJPVzJdKSAqIHdTcXVhcmVkOwogICAgICAgIGNvbnN0IGwxID0gdyAqICh4ICogYWRkV2l0aENhbmNlbGxhdGlvbkNoZWNrMigKICAgICAgICAgIEFbTWF0cml4M19kZWZhdWx0LkNPTFVNTjFST1cwXSwKICAgICAgICAgIEFbTWF0cml4M19kZWZhdWx0LkNPTFVNTjBST1cxXSwKICAgICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9OMTUKICAgICAgICApICsgYi55KTsKICAgICAgICBjb25zdCBsMCA9IEFbTWF0cml4M19kZWZhdWx0LkNPTFVNTjBST1cwXSAqIHhTcXVhcmVkICsgQVtNYXRyaXgzX2RlZmF1bHQuQ09MVU1OMlJPVzJdICogd1NxdWFyZWQgKyB4ICogYi54ICsgYzsKICAgICAgICBjb25zdCByMSA9IHdTcXVhcmVkICogYWRkV2l0aENhbmNlbGxhdGlvbkNoZWNrMigKICAgICAgICAgIEFbTWF0cml4M19kZWZhdWx0LkNPTFVNTjJST1cxXSwKICAgICAgICAgIEFbTWF0cml4M19kZWZhdWx0LkNPTFVNTjFST1cyXSwKICAgICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9OMTUKICAgICAgICApOwogICAgICAgIGNvbnN0IHIwID0gdyAqICh4ICogYWRkV2l0aENhbmNlbGxhdGlvbkNoZWNrMihBW01hdHJpeDNfZGVmYXVsdC5DT0xVTU4yUk9XMF0sIEFbTWF0cml4M19kZWZhdWx0LkNPTFVNTjBST1cyXSkgKyBiLnopOwogICAgICAgIGxldCBjb3NpbmVzOwogICAgICAgIGNvbnN0IHNvbHV0aW9ucyA9IFtdOwogICAgICAgIGlmIChyMCA9PT0gMCAmJiByMSA9PT0gMCkgewogICAgICAgICAgY29zaW5lcyA9IFF1YWRyYXRpY1JlYWxQb2x5bm9taWFsX2RlZmF1bHQuY29tcHV0ZVJlYWxSb290cyhsMiwgbDEsIGwwKTsKICAgICAgICAgIGlmIChjb3NpbmVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gc29sdXRpb25zOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgY29zaW5lMCA9IGNvc2luZXNbMF07CiAgICAgICAgICBjb25zdCBzaW5lMCA9IE1hdGguc3FydChNYXRoLm1heCgxIC0gY29zaW5lMCAqIGNvc2luZTAsIDApKTsKICAgICAgICAgIHNvbHV0aW9ucy5wdXNoKG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoeCwgdyAqIGNvc2luZTAsIHcgKiAtc2luZTApKTsKICAgICAgICAgIHNvbHV0aW9ucy5wdXNoKG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoeCwgdyAqIGNvc2luZTAsIHcgKiBzaW5lMCkpOwogICAgICAgICAgaWYgKGNvc2luZXMubGVuZ3RoID09PSAyKSB7CiAgICAgICAgICAgIGNvbnN0IGNvc2luZTEgPSBjb3NpbmVzWzFdOwogICAgICAgICAgICBjb25zdCBzaW5lMSA9IE1hdGguc3FydChNYXRoLm1heCgxIC0gY29zaW5lMSAqIGNvc2luZTEsIDApKTsKICAgICAgICAgICAgc29sdXRpb25zLnB1c2gobmV3IENhcnRlc2lhbjNfZGVmYXVsdCh4LCB3ICogY29zaW5lMSwgdyAqIC1zaW5lMSkpOwogICAgICAgICAgICBzb2x1dGlvbnMucHVzaChuZXcgQ2FydGVzaWFuM19kZWZhdWx0KHgsIHcgKiBjb3NpbmUxLCB3ICogc2luZTEpKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBzb2x1dGlvbnM7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHIwU3F1YXJlZCA9IHIwICogcjA7CiAgICAgICAgY29uc3QgcjFTcXVhcmVkID0gcjEgKiByMTsKICAgICAgICBjb25zdCBsMlNxdWFyZWQgPSBsMiAqIGwyOwogICAgICAgIGNvbnN0IHIwcjEgPSByMCAqIHIxOwogICAgICAgIGNvbnN0IGM0ID0gbDJTcXVhcmVkICsgcjFTcXVhcmVkOwogICAgICAgIGNvbnN0IGMzMiA9IDIgKiAobDEgKiBsMiArIHIwcjEpOwogICAgICAgIGNvbnN0IGMyID0gMiAqIGwwICogbDIgKyBsMSAqIGwxIC0gcjFTcXVhcmVkICsgcjBTcXVhcmVkOwogICAgICAgIGNvbnN0IGMxID0gMiAqIChsMCAqIGwxIC0gcjByMSk7CiAgICAgICAgY29uc3QgYzAgPSBsMCAqIGwwIC0gcjBTcXVhcmVkOwogICAgICAgIGlmIChjNCA9PT0gMCAmJiBjMzIgPT09IDAgJiYgYzIgPT09IDAgJiYgYzEgPT09IDApIHsKICAgICAgICAgIHJldHVybiBzb2x1dGlvbnM7CiAgICAgICAgfQogICAgICAgIGNvc2luZXMgPSBRdWFydGljUmVhbFBvbHlub21pYWxfZGVmYXVsdC5jb21wdXRlUmVhbFJvb3RzKGM0LCBjMzIsIGMyLCBjMSwgYzApOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IGNvc2luZXMubGVuZ3RoOwogICAgICAgIGlmIChsZW5ndGggPT09IDApIHsKICAgICAgICAgIHJldHVybiBzb2x1dGlvbnM7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgIGNvbnN0IGNvc2luZSA9IGNvc2luZXNbaV07CiAgICAgICAgICBjb25zdCBjb3NpbmVTcXVhcmVkID0gY29zaW5lICogY29zaW5lOwogICAgICAgICAgY29uc3Qgc2luZVNxdWFyZWQgPSBNYXRoLm1heCgxIC0gY29zaW5lU3F1YXJlZCwgMCk7CiAgICAgICAgICBjb25zdCBzaW5lID0gTWF0aC5zcXJ0KHNpbmVTcXVhcmVkKTsKICAgICAgICAgIGxldCBsZWZ0OwogICAgICAgICAgaWYgKE1hdGhfZGVmYXVsdC5zaWduKGwyKSA9PT0gTWF0aF9kZWZhdWx0LnNpZ24obDApKSB7CiAgICAgICAgICAgIGxlZnQgPSBhZGRXaXRoQ2FuY2VsbGF0aW9uQ2hlY2syKAogICAgICAgICAgICAgIGwyICogY29zaW5lU3F1YXJlZCArIGwwLAogICAgICAgICAgICAgIGwxICogY29zaW5lLAogICAgICAgICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9OMTIKICAgICAgICAgICAgKTsKICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aF9kZWZhdWx0LnNpZ24obDApID09PSBNYXRoX2RlZmF1bHQuc2lnbihsMSAqIGNvc2luZSkpIHsKICAgICAgICAgICAgbGVmdCA9IGFkZFdpdGhDYW5jZWxsYXRpb25DaGVjazIoCiAgICAgICAgICAgICAgbDIgKiBjb3NpbmVTcXVhcmVkLAogICAgICAgICAgICAgIGwxICogY29zaW5lICsgbDAsCiAgICAgICAgICAgICAgTWF0aF9kZWZhdWx0LkVQU0lMT04xMgogICAgICAgICAgICApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGVmdCA9IGFkZFdpdGhDYW5jZWxsYXRpb25DaGVjazIoCiAgICAgICAgICAgICAgbDIgKiBjb3NpbmVTcXVhcmVkICsgbDEgKiBjb3NpbmUsCiAgICAgICAgICAgICAgbDAsCiAgICAgICAgICAgICAgTWF0aF9kZWZhdWx0LkVQU0lMT04xMgogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgcmlnaHQgPSBhZGRXaXRoQ2FuY2VsbGF0aW9uQ2hlY2syKAogICAgICAgICAgICByMSAqIGNvc2luZSwKICAgICAgICAgICAgcjAsCiAgICAgICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9OMTUKICAgICAgICAgICk7CiAgICAgICAgICBjb25zdCBwcm9kdWN0ID0gbGVmdCAqIHJpZ2h0OwogICAgICAgICAgaWYgKHByb2R1Y3QgPCAwKSB7CiAgICAgICAgICAgIHNvbHV0aW9ucy5wdXNoKG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoeCwgdyAqIGNvc2luZSwgdyAqIHNpbmUpKTsKICAgICAgICAgIH0gZWxzZSBpZiAocHJvZHVjdCA+IDApIHsKICAgICAgICAgICAgc29sdXRpb25zLnB1c2gobmV3IENhcnRlc2lhbjNfZGVmYXVsdCh4LCB3ICogY29zaW5lLCB3ICogLXNpbmUpKTsKICAgICAgICAgIH0gZWxzZSBpZiAoc2luZSAhPT0gMCkgewogICAgICAgICAgICBzb2x1dGlvbnMucHVzaChuZXcgQ2FydGVzaWFuM19kZWZhdWx0KHgsIHcgKiBjb3NpbmUsIHcgKiAtc2luZSkpOwogICAgICAgICAgICBzb2x1dGlvbnMucHVzaChuZXcgQ2FydGVzaWFuM19kZWZhdWx0KHgsIHcgKiBjb3NpbmUsIHcgKiBzaW5lKSk7CiAgICAgICAgICAgICsraTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNvbHV0aW9ucy5wdXNoKG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoeCwgdyAqIGNvc2luZSwgdyAqIHNpbmUpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNvbHV0aW9uczsKICAgICAgfTsKICAgICAgZmlyc3RBeGlzU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2Vjb25kQXhpc1NjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHRoaXJkQXhpc1NjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHJlZmVyZW5jZVNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGJDYXJ0ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBiU2NyYXRjaCA9IG5ldyBNYXRyaXgzX2RlZmF1bHQoKTsKICAgICAgYnRTY3JhdGNoID0gbmV3IE1hdHJpeDNfZGVmYXVsdCgpOwogICAgICBkaVNjcmF0Y2ggPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgIGRTY3JhdGNoID0gbmV3IE1hdHJpeDNfZGVmYXVsdCgpOwogICAgICBjU2NyYXRjaCA9IG5ldyBNYXRyaXgzX2RlZmF1bHQoKTsKICAgICAgdGVtcE1hdHJpeCA9IG5ldyBNYXRyaXgzX2RlZmF1bHQoKTsKICAgICAgYVNjcmF0Y2ggPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgIHNTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjbG9zZXN0U2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc3VyZlBvaW50U2NyYXRjaCA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBJbnRlcnNlY3Rpb25UZXN0cy5ncmF6aW5nQWx0aXR1ZGVMb2NhdGlvbiA9IGZ1bmN0aW9uKHJheSwgZWxsaXBzb2lkKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmF5KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInJheSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZWxsaXBzb2lkKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImVsbGlwc29pZCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcG9zaXRpb24gPSByYXkub3JpZ2luOwogICAgICAgIGNvbnN0IGRpcmVjdGlvbjIgPSByYXkuZGlyZWN0aW9uOwogICAgICAgIGlmICghQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFscyhwb3NpdGlvbiwgQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8pKSB7CiAgICAgICAgICBjb25zdCBub3JtYWwyID0gZWxsaXBzb2lkLmdlb2RldGljU3VyZmFjZU5vcm1hbChwb3NpdGlvbiwgZmlyc3RBeGlzU2NyYXRjaCk7CiAgICAgICAgICBpZiAoQ2FydGVzaWFuM19kZWZhdWx0LmRvdChkaXJlY3Rpb24yLCBub3JtYWwyKSA+PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgaW50ZXJzZWN0czIgPSBkZWZpbmVkX2RlZmF1bHQodGhpcy5yYXlFbGxpcHNvaWQocmF5LCBlbGxpcHNvaWQpKTsKICAgICAgICBjb25zdCBmID0gZWxsaXBzb2lkLnRyYW5zZm9ybVBvc2l0aW9uVG9TY2FsZWRTcGFjZSgKICAgICAgICAgIGRpcmVjdGlvbjIsCiAgICAgICAgICBmaXJzdEF4aXNTY3JhdGNoCiAgICAgICAgKTsKICAgICAgICBjb25zdCBmaXJzdEF4aXMgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKGYsIGYpOwogICAgICAgIGNvbnN0IHJlZmVyZW5jZSA9IENhcnRlc2lhbjNfZGVmYXVsdC5tb3N0T3J0aG9nb25hbEF4aXMoZiwgcmVmZXJlbmNlU2NyYXRjaCk7CiAgICAgICAgY29uc3Qgc2Vjb25kQXhpcyA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3MocmVmZXJlbmNlLCBmaXJzdEF4aXMsIHNlY29uZEF4aXNTY3JhdGNoKSwKICAgICAgICAgIHNlY29uZEF4aXNTY3JhdGNoCiAgICAgICAgKTsKICAgICAgICBjb25zdCB0aGlyZEF4aXMgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKGZpcnN0QXhpcywgc2Vjb25kQXhpcywgdGhpcmRBeGlzU2NyYXRjaCksCiAgICAgICAgICB0aGlyZEF4aXNTY3JhdGNoCiAgICAgICAgKTsKICAgICAgICBjb25zdCBCID0gYlNjcmF0Y2g7CiAgICAgICAgQlswXSA9IGZpcnN0QXhpcy54OwogICAgICAgIEJbMV0gPSBmaXJzdEF4aXMueTsKICAgICAgICBCWzJdID0gZmlyc3RBeGlzLno7CiAgICAgICAgQlszXSA9IHNlY29uZEF4aXMueDsKICAgICAgICBCWzRdID0gc2Vjb25kQXhpcy55OwogICAgICAgIEJbNV0gPSBzZWNvbmRBeGlzLno7CiAgICAgICAgQls2XSA9IHRoaXJkQXhpcy54OwogICAgICAgIEJbN10gPSB0aGlyZEF4aXMueTsKICAgICAgICBCWzhdID0gdGhpcmRBeGlzLno7CiAgICAgICAgY29uc3QgQl9UID0gTWF0cml4M19kZWZhdWx0LnRyYW5zcG9zZShCLCBidFNjcmF0Y2gpOwogICAgICAgIGNvbnN0IERfSSA9IE1hdHJpeDNfZGVmYXVsdC5mcm9tU2NhbGUoZWxsaXBzb2lkLnJhZGlpLCBkaVNjcmF0Y2gpOwogICAgICAgIGNvbnN0IEQgPSBNYXRyaXgzX2RlZmF1bHQuZnJvbVNjYWxlKGVsbGlwc29pZC5vbmVPdmVyUmFkaWksIGRTY3JhdGNoKTsKICAgICAgICBjb25zdCBDID0gY1NjcmF0Y2g7CiAgICAgICAgQ1swXSA9IDA7CiAgICAgICAgQ1sxXSA9IC1kaXJlY3Rpb24yLno7CiAgICAgICAgQ1syXSA9IGRpcmVjdGlvbjIueTsKICAgICAgICBDWzNdID0gZGlyZWN0aW9uMi56OwogICAgICAgIENbNF0gPSAwOwogICAgICAgIENbNV0gPSAtZGlyZWN0aW9uMi54OwogICAgICAgIENbNl0gPSAtZGlyZWN0aW9uMi55OwogICAgICAgIENbN10gPSBkaXJlY3Rpb24yLng7CiAgICAgICAgQ1s4XSA9IDA7CiAgICAgICAgY29uc3QgdGVtcCA9IE1hdHJpeDNfZGVmYXVsdC5tdWx0aXBseSgKICAgICAgICAgIE1hdHJpeDNfZGVmYXVsdC5tdWx0aXBseShCX1QsIEQsIHRlbXBNYXRyaXgpLAogICAgICAgICAgQywKICAgICAgICAgIHRlbXBNYXRyaXgKICAgICAgICApOwogICAgICAgIGNvbnN0IEEgPSBNYXRyaXgzX2RlZmF1bHQubXVsdGlwbHkoCiAgICAgICAgICBNYXRyaXgzX2RlZmF1bHQubXVsdGlwbHkodGVtcCwgRF9JLCBhU2NyYXRjaCksCiAgICAgICAgICBCLAogICAgICAgICAgYVNjcmF0Y2gKICAgICAgICApOwogICAgICAgIGNvbnN0IGIgPSBNYXRyaXgzX2RlZmF1bHQubXVsdGlwbHlCeVZlY3Rvcih0ZW1wLCBwb3NpdGlvbiwgYkNhcnQpOwogICAgICAgIGNvbnN0IHNvbHV0aW9ucyA9IEludGVyc2VjdGlvblRlc3RzLnF1YWRyYXRpY1ZlY3RvckV4cHJlc3Npb24oCiAgICAgICAgICBBLAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZShiLCBmaXJzdEF4aXNTY3JhdGNoKSwKICAgICAgICAgIDAsCiAgICAgICAgICAwLAogICAgICAgICAgMQogICAgICAgICk7CiAgICAgICAgbGV0IHM7CiAgICAgICAgbGV0IGFsdGl0dWRlOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IHNvbHV0aW9ucy5sZW5ndGg7CiAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgICAgIGxldCBjbG9zZXN0ID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPLCBjbG9zZXN0U2NyYXRjaCk7CiAgICAgICAgICBsZXQgbWF4aW11bVZhbHVlID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOwogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgICBzID0gTWF0cml4M19kZWZhdWx0Lm11bHRpcGx5QnlWZWN0b3IoCiAgICAgICAgICAgICAgRF9JLAogICAgICAgICAgICAgIE1hdHJpeDNfZGVmYXVsdC5tdWx0aXBseUJ5VmVjdG9yKEIsIHNvbHV0aW9uc1tpXSwgc1NjcmF0Y2gpLAogICAgICAgICAgICAgIHNTY3JhdGNoCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNvbnN0IHYzID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QocywgcG9zaXRpb24sIHJlZmVyZW5jZVNjcmF0Y2gpLAogICAgICAgICAgICAgIHJlZmVyZW5jZVNjcmF0Y2gKICAgICAgICAgICAgKTsKICAgICAgICAgICAgY29uc3QgZG90UHJvZHVjdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3QodjMsIGRpcmVjdGlvbjIpOwogICAgICAgICAgICBpZiAoZG90UHJvZHVjdCA+IG1heGltdW1WYWx1ZSkgewogICAgICAgICAgICAgIG1heGltdW1WYWx1ZSA9IGRvdFByb2R1Y3Q7CiAgICAgICAgICAgICAgY2xvc2VzdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShzLCBjbG9zZXN0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY29uc3Qgc3VyZmFjZVBvaW50ID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKAogICAgICAgICAgICBjbG9zZXN0LAogICAgICAgICAgICBzdXJmUG9pbnRTY3JhdGNoCiAgICAgICAgICApOwogICAgICAgICAgbWF4aW11bVZhbHVlID0gTWF0aF9kZWZhdWx0LmNsYW1wKG1heGltdW1WYWx1ZSwgMCwgMSk7CiAgICAgICAgICBhbHRpdHVkZSA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUoCiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChjbG9zZXN0LCBwb3NpdGlvbiwgcmVmZXJlbmNlU2NyYXRjaCkKICAgICAgICAgICkgKiBNYXRoLnNxcnQoMSAtIG1heGltdW1WYWx1ZSAqIG1heGltdW1WYWx1ZSk7CiAgICAgICAgICBhbHRpdHVkZSA9IGludGVyc2VjdHMyID8gLWFsdGl0dWRlIDogYWx0aXR1ZGU7CiAgICAgICAgICBzdXJmYWNlUG9pbnQuaGVpZ2h0ID0gYWx0aXR1ZGU7CiAgICAgICAgICByZXR1cm4gZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKHN1cmZhY2VQb2ludCwgbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgfTsKICAgICAgbGluZVNlZ21lbnRQbGFuZURpZmZlcmVuY2UgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIEludGVyc2VjdGlvblRlc3RzLmxpbmVTZWdtZW50UGxhbmUgPSBmdW5jdGlvbihlbmRQb2ludDAsIGVuZFBvaW50MSwgcGxhbmUsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGVuZFBvaW50MCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJlbmRQb2ludDAgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGVuZFBvaW50MSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJlbmRQb2ludDEgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHBsYW5lKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInBsYW5lIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGRpZmZlcmVuY2UgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoCiAgICAgICAgICBlbmRQb2ludDEsCiAgICAgICAgICBlbmRQb2ludDAsCiAgICAgICAgICBsaW5lU2VnbWVudFBsYW5lRGlmZmVyZW5jZQogICAgICAgICk7CiAgICAgICAgY29uc3Qgbm9ybWFsMiA9IHBsYW5lLm5vcm1hbDsKICAgICAgICBjb25zdCBuRG90RGlmZiA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3Qobm9ybWFsMiwgZGlmZmVyZW5jZSk7CiAgICAgICAgaWYgKE1hdGguYWJzKG5Eb3REaWZmKSA8IE1hdGhfZGVmYXVsdC5FUFNJTE9ONikgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgY29uc3QgbkRvdFAwID0gQ2FydGVzaWFuM19kZWZhdWx0LmRvdChub3JtYWwyLCBlbmRQb2ludDApOwogICAgICAgIGNvbnN0IHQgPSAtKHBsYW5lLmRpc3RhbmNlICsgbkRvdFAwKSAvIG5Eb3REaWZmOwogICAgICAgIGlmICh0IDwgMCB8fCB0ID4gMSkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoZGlmZmVyZW5jZSwgdCwgcmVzdWx0KTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGVuZFBvaW50MCwgcmVzdWx0LCByZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEludGVyc2VjdGlvblRlc3RzLnRyaWFuZ2xlUGxhbmVJbnRlcnNlY3Rpb24gPSBmdW5jdGlvbihwMCwgcDEsIHAyLCBwbGFuZSkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHAwKSB8fCAhZGVmaW5lZF9kZWZhdWx0KHAxKSB8fCAhZGVmaW5lZF9kZWZhdWx0KHAyKSB8fCAhZGVmaW5lZF9kZWZhdWx0KHBsYW5lKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInAwLCBwMSwgcDIsIGFuZCBwbGFuZSBhcmUgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYW5lTm9ybWFsID0gcGxhbmUubm9ybWFsOwogICAgICAgIGNvbnN0IHBsYW5lRCA9IHBsYW5lLmRpc3RhbmNlOwogICAgICAgIGNvbnN0IHAwQmVoaW5kID0gQ2FydGVzaWFuM19kZWZhdWx0LmRvdChwbGFuZU5vcm1hbCwgcDApICsgcGxhbmVEIDwgMDsKICAgICAgICBjb25zdCBwMUJlaGluZCA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3QocGxhbmVOb3JtYWwsIHAxKSArIHBsYW5lRCA8IDA7CiAgICAgICAgY29uc3QgcDJCZWhpbmQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KHBsYW5lTm9ybWFsLCBwMikgKyBwbGFuZUQgPCAwOwogICAgICAgIGxldCBudW1CZWhpbmQgPSAwOwogICAgICAgIG51bUJlaGluZCArPSBwMEJlaGluZCA/IDEgOiAwOwogICAgICAgIG51bUJlaGluZCArPSBwMUJlaGluZCA/IDEgOiAwOwogICAgICAgIG51bUJlaGluZCArPSBwMkJlaGluZCA/IDEgOiAwOwogICAgICAgIGxldCB1MTIsIHUyMjsKICAgICAgICBpZiAobnVtQmVoaW5kID09PSAxIHx8IG51bUJlaGluZCA9PT0gMikgewogICAgICAgICAgdTEyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICAgICAgdTIyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgICBpZiAobnVtQmVoaW5kID09PSAxKSB7CiAgICAgICAgICBpZiAocDBCZWhpbmQpIHsKICAgICAgICAgICAgSW50ZXJzZWN0aW9uVGVzdHMubGluZVNlZ21lbnRQbGFuZShwMCwgcDEsIHBsYW5lLCB1MTIpOwogICAgICAgICAgICBJbnRlcnNlY3Rpb25UZXN0cy5saW5lU2VnbWVudFBsYW5lKHAwLCBwMiwgcGxhbmUsIHUyMik7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgcG9zaXRpb25zOiBbcDAsIHAxLCBwMiwgdTEyLCB1MjJdLAogICAgICAgICAgICAgIGluZGljZXM6IFsKICAgICAgICAgICAgICAgIC8vIEJlaGluZAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgLy8gSW4gZnJvbnQKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgMwogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSBpZiAocDFCZWhpbmQpIHsKICAgICAgICAgICAgSW50ZXJzZWN0aW9uVGVzdHMubGluZVNlZ21lbnRQbGFuZShwMSwgcDIsIHBsYW5lLCB1MTIpOwogICAgICAgICAgICBJbnRlcnNlY3Rpb25UZXN0cy5saW5lU2VnbWVudFBsYW5lKHAxLCBwMCwgcGxhbmUsIHUyMik7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgcG9zaXRpb25zOiBbcDAsIHAxLCBwMiwgdTEyLCB1MjJdLAogICAgICAgICAgICAgIGluZGljZXM6IFsKICAgICAgICAgICAgICAgIC8vIEJlaGluZAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgLy8gSW4gZnJvbnQKICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgMwogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSBpZiAocDJCZWhpbmQpIHsKICAgICAgICAgICAgSW50ZXJzZWN0aW9uVGVzdHMubGluZVNlZ21lbnRQbGFuZShwMiwgcDAsIHBsYW5lLCB1MTIpOwogICAgICAgICAgICBJbnRlcnNlY3Rpb25UZXN0cy5saW5lU2VnbWVudFBsYW5lKHAyLCBwMSwgcGxhbmUsIHUyMik7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgcG9zaXRpb25zOiBbcDAsIHAxLCBwMiwgdTEyLCB1MjJdLAogICAgICAgICAgICAgIGluZGljZXM6IFsKICAgICAgICAgICAgICAgIC8vIEJlaGluZAogICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgLy8gSW4gZnJvbnQKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgMwogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG51bUJlaGluZCA9PT0gMikgewogICAgICAgICAgaWYgKCFwMEJlaGluZCkgewogICAgICAgICAgICBJbnRlcnNlY3Rpb25UZXN0cy5saW5lU2VnbWVudFBsYW5lKHAxLCBwMCwgcGxhbmUsIHUxMik7CiAgICAgICAgICAgIEludGVyc2VjdGlvblRlc3RzLmxpbmVTZWdtZW50UGxhbmUocDIsIHAwLCBwbGFuZSwgdTIyKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBwb3NpdGlvbnM6IFtwMCwgcDEsIHAyLCB1MTIsIHUyMl0sCiAgICAgICAgICAgICAgaW5kaWNlczogWwogICAgICAgICAgICAgICAgLy8gQmVoaW5kCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAvLyBJbiBmcm9udAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICA0CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9OwogICAgICAgICAgfSBlbHNlIGlmICghcDFCZWhpbmQpIHsKICAgICAgICAgICAgSW50ZXJzZWN0aW9uVGVzdHMubGluZVNlZ21lbnRQbGFuZShwMiwgcDEsIHBsYW5lLCB1MTIpOwogICAgICAgICAgICBJbnRlcnNlY3Rpb25UZXN0cy5saW5lU2VnbWVudFBsYW5lKHAwLCBwMSwgcGxhbmUsIHUyMik7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgcG9zaXRpb25zOiBbcDAsIHAxLCBwMiwgdTEyLCB1MjJdLAogICAgICAgICAgICAgIGluZGljZXM6IFsKICAgICAgICAgICAgICAgIC8vIEJlaGluZAogICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgLy8gSW4gZnJvbnQKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgNAogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSBpZiAoIXAyQmVoaW5kKSB7CiAgICAgICAgICAgIEludGVyc2VjdGlvblRlc3RzLmxpbmVTZWdtZW50UGxhbmUocDAsIHAyLCBwbGFuZSwgdTEyKTsKICAgICAgICAgICAgSW50ZXJzZWN0aW9uVGVzdHMubGluZVNlZ21lbnRQbGFuZShwMSwgcDIsIHBsYW5lLCB1MjIpOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHBvc2l0aW9uczogW3AwLCBwMSwgcDIsIHUxMiwgdTIyXSwKICAgICAgICAgICAgICBpbmRpY2VzOiBbCiAgICAgICAgICAgICAgICAvLyBCZWhpbmQKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgIC8vIEluIGZyb250CiAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgIDQKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH07CiAgICAgIEludGVyc2VjdGlvblRlc3RzX2RlZmF1bHQgPSBJbnRlcnNlY3Rpb25UZXN0czsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1BsYW5lLmpzCiAgZnVuY3Rpb24gUGxhbmUobm9ybWFsMiwgZGlzdGFuY2UpIHsKICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibm9ybWFsIiwgbm9ybWFsMik7CiAgICBpZiAoIU1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlKG5vcm1hbDIpLAogICAgICAxLAogICAgICBNYXRoX2RlZmF1bHQuRVBTSUxPTjYKICAgICkpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm5vcm1hbCBtdXN0IGJlIG5vcm1hbGl6ZWQuIik7CiAgICB9CiAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoImRpc3RhbmNlIiwgZGlzdGFuY2UpOwogICAgdGhpcy5ub3JtYWwgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUobm9ybWFsMik7CiAgICB0aGlzLmRpc3RhbmNlID0gZGlzdGFuY2U7CiAgfQogIHZhciBzY3JhdGNoTm9ybWFsLCBzY3JhdGNoQ2FydGVzaWFuLCBzY3JhdGNoSW52ZXJzZVRyYW5zcG9zZSwgc2NyYXRjaFBsYW5lQ2FydGVzaWFuNCwgc2NyYXRjaFRyYW5zZm9ybU5vcm1hbCwgUGxhbmVfZGVmYXVsdDsKICB2YXIgaW5pdF9QbGFuZSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUGxhbmUuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW40KCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGluaXRfTWF0cml4NCgpOwogICAgICBQbGFuZS5mcm9tUG9pbnROb3JtYWwgPSBmdW5jdGlvbihwb2ludCwgbm9ybWFsMiwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJwb2ludCIsIHBvaW50KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm5vcm1hbCIsIG5vcm1hbDIpOwogICAgICAgIGlmICghTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlKG5vcm1hbDIpLAogICAgICAgICAgMSwKICAgICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9ONgogICAgICAgICkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJub3JtYWwgbXVzdCBiZSBub3JtYWxpemVkLiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBkaXN0YW5jZSA9IC1DYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KG5vcm1hbDIsIHBvaW50KTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFBsYW5lKG5vcm1hbDIsIGRpc3RhbmNlKTsKICAgICAgICB9CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKG5vcm1hbDIsIHJlc3VsdC5ub3JtYWwpOwogICAgICAgIHJlc3VsdC5kaXN0YW5jZSA9IGRpc3RhbmNlOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hOb3JtYWwgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIFBsYW5lLmZyb21DYXJ0ZXNpYW40ID0gZnVuY3Rpb24oY29lZmZpY2llbnRzLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNvZWZmaWNpZW50cyIsIGNvZWZmaWNpZW50cyk7CiAgICAgICAgY29uc3Qgbm9ybWFsMiA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQ2FydGVzaWFuNChjb2VmZmljaWVudHMsIHNjcmF0Y2hOb3JtYWwpOwogICAgICAgIGNvbnN0IGRpc3RhbmNlID0gY29lZmZpY2llbnRzLnc7CiAgICAgICAgaWYgKCFNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUobm9ybWFsMiksCiAgICAgICAgICAxLAogICAgICAgICAgTWF0aF9kZWZhdWx0LkVQU0lMT042CiAgICAgICAgKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm5vcm1hbCBtdXN0IGJlIG5vcm1hbGl6ZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgUGxhbmUobm9ybWFsMiwgZGlzdGFuY2UpOwogICAgICAgIH0KICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUobm9ybWFsMiwgcmVzdWx0Lm5vcm1hbCk7CiAgICAgICAgcmVzdWx0LmRpc3RhbmNlID0gZGlzdGFuY2U7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgUGxhbmUuZ2V0UG9pbnREaXN0YW5jZSA9IGZ1bmN0aW9uKHBsYW5lLCBwb2ludCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicGxhbmUiLCBwbGFuZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJwb2ludCIsIHBvaW50KTsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuM19kZWZhdWx0LmRvdChwbGFuZS5ub3JtYWwsIHBvaW50KSArIHBsYW5lLmRpc3RhbmNlOwogICAgICB9OwogICAgICBzY3JhdGNoQ2FydGVzaWFuID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBQbGFuZS5wcm9qZWN0UG9pbnRPbnRvUGxhbmUgPSBmdW5jdGlvbihwbGFuZSwgcG9pbnQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicGxhbmUiLCBwbGFuZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJwb2ludCIsIHBvaW50KTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBvaW50RGlzdGFuY2UgPSBQbGFuZS5nZXRQb2ludERpc3RhbmNlKHBsYW5lLCBwb2ludCk7CiAgICAgICAgY29uc3Qgc2NhbGVkTm9ybWFsID0gQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoCiAgICAgICAgICBwbGFuZS5ub3JtYWwsCiAgICAgICAgICBwb2ludERpc3RhbmNlLAogICAgICAgICAgc2NyYXRjaENhcnRlc2lhbgogICAgICAgICk7CiAgICAgICAgcmV0dXJuIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChwb2ludCwgc2NhbGVkTm9ybWFsLCByZXN1bHQpOwogICAgICB9OwogICAgICBzY3JhdGNoSW52ZXJzZVRyYW5zcG9zZSA9IG5ldyBNYXRyaXg0X2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFBsYW5lQ2FydGVzaWFuNCA9IG5ldyBDYXJ0ZXNpYW40X2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFRyYW5zZm9ybU5vcm1hbCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgUGxhbmUudHJhbnNmb3JtID0gZnVuY3Rpb24ocGxhbmUsIHRyYW5zZm9ybTIsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicGxhbmUiLCBwbGFuZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ0cmFuc2Zvcm0iLCB0cmFuc2Zvcm0yKTsKICAgICAgICBjb25zdCBub3JtYWwyID0gcGxhbmUubm9ybWFsOwogICAgICAgIGNvbnN0IGRpc3RhbmNlID0gcGxhbmUuZGlzdGFuY2U7CiAgICAgICAgY29uc3QgaW52ZXJzZVRyYW5zcG9zZTIgPSBNYXRyaXg0X2RlZmF1bHQuaW52ZXJzZVRyYW5zcG9zZSgKICAgICAgICAgIHRyYW5zZm9ybTIsCiAgICAgICAgICBzY3JhdGNoSW52ZXJzZVRyYW5zcG9zZQogICAgICAgICk7CiAgICAgICAgbGV0IHBsYW5lQXNDYXJ0ZXNpYW40ID0gQ2FydGVzaWFuNF9kZWZhdWx0LmZyb21FbGVtZW50cygKICAgICAgICAgIG5vcm1hbDIueCwKICAgICAgICAgIG5vcm1hbDIueSwKICAgICAgICAgIG5vcm1hbDIueiwKICAgICAgICAgIGRpc3RhbmNlLAogICAgICAgICAgc2NyYXRjaFBsYW5lQ2FydGVzaWFuNAogICAgICAgICk7CiAgICAgICAgcGxhbmVBc0NhcnRlc2lhbjQgPSBNYXRyaXg0X2RlZmF1bHQubXVsdGlwbHlCeVZlY3RvcigKICAgICAgICAgIGludmVyc2VUcmFuc3Bvc2UyLAogICAgICAgICAgcGxhbmVBc0NhcnRlc2lhbjQsCiAgICAgICAgICBwbGFuZUFzQ2FydGVzaWFuNAogICAgICAgICk7CiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWROb3JtYWwgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUNhcnRlc2lhbjQoCiAgICAgICAgICBwbGFuZUFzQ2FydGVzaWFuNCwKICAgICAgICAgIHNjcmF0Y2hUcmFuc2Zvcm1Ob3JtYWwKICAgICAgICApOwogICAgICAgIHBsYW5lQXNDYXJ0ZXNpYW40ID0gQ2FydGVzaWFuNF9kZWZhdWx0LmRpdmlkZUJ5U2NhbGFyKAogICAgICAgICAgcGxhbmVBc0NhcnRlc2lhbjQsCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlKHRyYW5zZm9ybWVkTm9ybWFsKSwKICAgICAgICAgIHBsYW5lQXNDYXJ0ZXNpYW40CiAgICAgICAgKTsKICAgICAgICByZXR1cm4gUGxhbmUuZnJvbUNhcnRlc2lhbjQocGxhbmVBc0NhcnRlc2lhbjQsIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIFBsYW5lLmNsb25lID0gZnVuY3Rpb24ocGxhbmUsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicGxhbmUiLCBwbGFuZSk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBQbGFuZShwbGFuZS5ub3JtYWwsIHBsYW5lLmRpc3RhbmNlKTsKICAgICAgICB9CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKHBsYW5lLm5vcm1hbCwgcmVzdWx0Lm5vcm1hbCk7CiAgICAgICAgcmVzdWx0LmRpc3RhbmNlID0gcGxhbmUuZGlzdGFuY2U7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgUGxhbmUuZXF1YWxzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImxlZnQiLCBsZWZ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJpZ2h0IiwgcmlnaHQpOwogICAgICAgIHJldHVybiBsZWZ0LmRpc3RhbmNlID09PSByaWdodC5kaXN0YW5jZSAmJiBDYXJ0ZXNpYW4zX2RlZmF1bHQuZXF1YWxzKGxlZnQubm9ybWFsLCByaWdodC5ub3JtYWwpOwogICAgICB9OwogICAgICBQbGFuZS5PUklHSU5fWFlfUExBTkUgPSBPYmplY3QuZnJlZXplKG5ldyBQbGFuZShDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9aLCAwKSk7CiAgICAgIFBsYW5lLk9SSUdJTl9ZWl9QTEFORSA9IE9iamVjdC5mcmVlemUobmV3IFBsYW5lKENhcnRlc2lhbjNfZGVmYXVsdC5VTklUX1gsIDApKTsKICAgICAgUGxhbmUuT1JJR0lOX1pYX1BMQU5FID0gT2JqZWN0LmZyZWV6ZShuZXcgUGxhbmUoQ2FydGVzaWFuM19kZWZhdWx0LlVOSVRfWSwgMCkpOwogICAgICBQbGFuZV9kZWZhdWx0ID0gUGxhbmU7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9UaXBzaWZ5LmpzCiAgdmFyIFRpcHNpZnksIFRpcHNpZnlfZGVmYXVsdDsKICB2YXIgaW5pdF9UaXBzaWZ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9UaXBzaWZ5LmpzIigpIHsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgVGlwc2lmeSA9IHt9OwogICAgICBUaXBzaWZ5LmNhbGN1bGF0ZUFDTVIgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgPz8gRnJvemVuX2RlZmF1bHQuRU1QVFlfT0JKRUNUOwogICAgICAgIGNvbnN0IGluZGljZXMgPSBvcHRpb25zLmluZGljZXM7CiAgICAgICAgbGV0IG1heGltdW1JbmRleCA9IG9wdGlvbnMubWF4aW11bUluZGV4OwogICAgICAgIGNvbnN0IGNhY2hlU2l6ZSA9IG9wdGlvbnMuY2FjaGVTaXplID8/IDI0OwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGluZGljZXMpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiaW5kaWNlcyBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbnVtSW5kaWNlcyA9IGluZGljZXMubGVuZ3RoOwogICAgICAgIGlmIChudW1JbmRpY2VzIDwgMyB8fCBudW1JbmRpY2VzICUgMyAhPT0gMCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImluZGljZXMgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aHJlZS4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKG1heGltdW1JbmRleCA8PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgibWF4aW11bUluZGV4IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7CiAgICAgICAgfQogICAgICAgIGlmIChjYWNoZVNpemUgPCAzKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiY2FjaGVTaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIHR3by4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobWF4aW11bUluZGV4KSkgewogICAgICAgICAgbWF4aW11bUluZGV4ID0gMDsKICAgICAgICAgIGxldCBjdXJyZW50SW5kZXggPSAwOwogICAgICAgICAgbGV0IGludG9JbmRpY2VzID0gaW5kaWNlc1tjdXJyZW50SW5kZXhdOwogICAgICAgICAgd2hpbGUgKGN1cnJlbnRJbmRleCA8IG51bUluZGljZXMpIHsKICAgICAgICAgICAgaWYgKGludG9JbmRpY2VzID4gbWF4aW11bUluZGV4KSB7CiAgICAgICAgICAgICAgbWF4aW11bUluZGV4ID0gaW50b0luZGljZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKytjdXJyZW50SW5kZXg7CiAgICAgICAgICAgIGludG9JbmRpY2VzID0gaW5kaWNlc1tjdXJyZW50SW5kZXhdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCB2ZXJ0ZXhUaW1lU3RhbXBzID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhpbXVtSW5kZXggKyAxOyBpKyspIHsKICAgICAgICAgIHZlcnRleFRpbWVTdGFtcHNbaV0gPSAwOwogICAgICAgIH0KICAgICAgICBsZXQgcyA9IGNhY2hlU2l6ZSArIDE7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1JbmRpY2VzOyArK2opIHsKICAgICAgICAgIGlmIChzIC0gdmVydGV4VGltZVN0YW1wc1tpbmRpY2VzW2pdXSA+IGNhY2hlU2l6ZSkgewogICAgICAgICAgICB2ZXJ0ZXhUaW1lU3RhbXBzW2luZGljZXNbal1dID0gczsKICAgICAgICAgICAgKytzOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gKHMgLSBjYWNoZVNpemUgKyAxKSAvIChudW1JbmRpY2VzIC8gMyk7CiAgICAgIH07CiAgICAgIFRpcHNpZnkudGlwc2lmeSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICAgICAgY29uc3QgaW5kaWNlcyA9IG9wdGlvbnMuaW5kaWNlczsKICAgICAgICBjb25zdCBtYXhpbXVtSW5kZXggPSBvcHRpb25zLm1heGltdW1JbmRleDsKICAgICAgICBjb25zdCBjYWNoZVNpemUgPSBvcHRpb25zLmNhY2hlU2l6ZSA/PyAyNDsKICAgICAgICBsZXQgY3Vyc29yOwogICAgICAgIGZ1bmN0aW9uIHNraXBEZWFkRW5kKHZlcnRpY2VzMiwgZGVhZEVuZDIsIGluZGljZXMyLCBtYXhpbXVtSW5kZXhQbHVzT25lMikgewogICAgICAgICAgd2hpbGUgKGRlYWRFbmQyLmxlbmd0aCA+PSAxKSB7CiAgICAgICAgICAgIGNvbnN0IGQgPSBkZWFkRW5kMltkZWFkRW5kMi5sZW5ndGggLSAxXTsKICAgICAgICAgICAgZGVhZEVuZDIuc3BsaWNlKGRlYWRFbmQyLmxlbmd0aCAtIDEsIDEpOwogICAgICAgICAgICBpZiAodmVydGljZXMyW2RdLm51bUxpdmVUcmlhbmdsZXMgPiAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHdoaWxlIChjdXJzb3IgPCBtYXhpbXVtSW5kZXhQbHVzT25lMikgewogICAgICAgICAgICBpZiAodmVydGljZXMyW2N1cnNvcl0ubnVtTGl2ZVRyaWFuZ2xlcyA+IDApIHsKICAgICAgICAgICAgICArK2N1cnNvcjsKICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yIC0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICArK2N1cnNvcjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZ2V0TmV4dFZlcnRleChpbmRpY2VzMiwgY2FjaGVTaXplMiwgb25lUmluZzIsIHZlcnRpY2VzMiwgczIsIGRlYWRFbmQyLCBtYXhpbXVtSW5kZXhQbHVzT25lMikgewogICAgICAgICAgbGV0IG4gPSAtMTsKICAgICAgICAgIGxldCBwOwogICAgICAgICAgbGV0IG0gPSAtMTsKICAgICAgICAgIGxldCBpdE9uZVJpbmcgPSAwOwogICAgICAgICAgd2hpbGUgKGl0T25lUmluZyA8IG9uZVJpbmcyLmxlbmd0aCkgewogICAgICAgICAgICBjb25zdCBpbmRleDIgPSBvbmVSaW5nMltpdE9uZVJpbmddOwogICAgICAgICAgICBpZiAodmVydGljZXMyW2luZGV4Ml0ubnVtTGl2ZVRyaWFuZ2xlcykgewogICAgICAgICAgICAgIHAgPSAwOwogICAgICAgICAgICAgIGlmIChzMiAtIHZlcnRpY2VzMltpbmRleDJdLnRpbWVTdGFtcCArIDIgKiB2ZXJ0aWNlczJbaW5kZXgyXS5udW1MaXZlVHJpYW5nbGVzIDw9IGNhY2hlU2l6ZTIpIHsKICAgICAgICAgICAgICAgIHAgPSBzMiAtIHZlcnRpY2VzMltpbmRleDJdLnRpbWVTdGFtcDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHAgPiBtIHx8IG0gPT09IC0xKSB7CiAgICAgICAgICAgICAgICBtID0gcDsKICAgICAgICAgICAgICAgIG4gPSBpbmRleDI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICsraXRPbmVSaW5nOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG4gPT09IC0xKSB7CiAgICAgICAgICAgIHJldHVybiBza2lwRGVhZEVuZCh2ZXJ0aWNlczIsIGRlYWRFbmQyLCBpbmRpY2VzMiwgbWF4aW11bUluZGV4UGx1c09uZTIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGluZGljZXMpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiaW5kaWNlcyBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbnVtSW5kaWNlcyA9IGluZGljZXMubGVuZ3RoOwogICAgICAgIGlmIChudW1JbmRpY2VzIDwgMyB8fCBudW1JbmRpY2VzICUgMyAhPT0gMCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImluZGljZXMgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aHJlZS4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKG1heGltdW1JbmRleCA8PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgibWF4aW11bUluZGV4IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7CiAgICAgICAgfQogICAgICAgIGlmIChjYWNoZVNpemUgPCAzKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiY2FjaGVTaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIHR3by4iKTsKICAgICAgICB9CiAgICAgICAgbGV0IG1heGltdW1JbmRleFBsdXNPbmUgPSAwOwogICAgICAgIGxldCBjdXJyZW50SW5kZXggPSAwOwogICAgICAgIGxldCBpbnRvSW5kaWNlcyA9IGluZGljZXNbY3VycmVudEluZGV4XTsKICAgICAgICBjb25zdCBlbmRJbmRleCA9IG51bUluZGljZXM7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChtYXhpbXVtSW5kZXgpKSB7CiAgICAgICAgICBtYXhpbXVtSW5kZXhQbHVzT25lID0gbWF4aW11bUluZGV4ICsgMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgd2hpbGUgKGN1cnJlbnRJbmRleCA8IGVuZEluZGV4KSB7CiAgICAgICAgICAgIGlmIChpbnRvSW5kaWNlcyA+IG1heGltdW1JbmRleFBsdXNPbmUpIHsKICAgICAgICAgICAgICBtYXhpbXVtSW5kZXhQbHVzT25lID0gaW50b0luZGljZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKytjdXJyZW50SW5kZXg7CiAgICAgICAgICAgIGludG9JbmRpY2VzID0gaW5kaWNlc1tjdXJyZW50SW5kZXhdOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG1heGltdW1JbmRleFBsdXNPbmUgPT09IC0xKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgKyttYXhpbXVtSW5kZXhQbHVzT25lOwogICAgICAgIH0KICAgICAgICBjb25zdCB2ZXJ0aWNlcyA9IFtdOwogICAgICAgIGxldCBpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXhpbXVtSW5kZXhQbHVzT25lOyBpKyspIHsKICAgICAgICAgIHZlcnRpY2VzW2ldID0gewogICAgICAgICAgICBudW1MaXZlVHJpYW5nbGVzOiAwLAogICAgICAgICAgICB0aW1lU3RhbXA6IDAsCiAgICAgICAgICAgIHZlcnRleFRyaWFuZ2xlczogW10KICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGN1cnJlbnRJbmRleCA9IDA7CiAgICAgICAgbGV0IHRyaWFuZ2xlID0gMDsKICAgICAgICB3aGlsZSAoY3VycmVudEluZGV4IDwgZW5kSW5kZXgpIHsKICAgICAgICAgIHZlcnRpY2VzW2luZGljZXNbY3VycmVudEluZGV4XV0udmVydGV4VHJpYW5nbGVzLnB1c2godHJpYW5nbGUpOwogICAgICAgICAgKyt2ZXJ0aWNlc1tpbmRpY2VzW2N1cnJlbnRJbmRleF1dLm51bUxpdmVUcmlhbmdsZXM7CiAgICAgICAgICB2ZXJ0aWNlc1tpbmRpY2VzW2N1cnJlbnRJbmRleCArIDFdXS52ZXJ0ZXhUcmlhbmdsZXMucHVzaCh0cmlhbmdsZSk7CiAgICAgICAgICArK3ZlcnRpY2VzW2luZGljZXNbY3VycmVudEluZGV4ICsgMV1dLm51bUxpdmVUcmlhbmdsZXM7CiAgICAgICAgICB2ZXJ0aWNlc1tpbmRpY2VzW2N1cnJlbnRJbmRleCArIDJdXS52ZXJ0ZXhUcmlhbmdsZXMucHVzaCh0cmlhbmdsZSk7CiAgICAgICAgICArK3ZlcnRpY2VzW2luZGljZXNbY3VycmVudEluZGV4ICsgMl1dLm51bUxpdmVUcmlhbmdsZXM7CiAgICAgICAgICArK3RyaWFuZ2xlOwogICAgICAgICAgY3VycmVudEluZGV4ICs9IDM7CiAgICAgICAgfQogICAgICAgIGxldCBmID0gMDsKICAgICAgICBsZXQgcyA9IGNhY2hlU2l6ZSArIDE7CiAgICAgICAgY3Vyc29yID0gMTsKICAgICAgICBsZXQgb25lUmluZyA9IFtdOwogICAgICAgIGNvbnN0IGRlYWRFbmQgPSBbXTsKICAgICAgICBsZXQgdmVydGV4OwogICAgICAgIGxldCBpbnRvVmVydGljZXM7CiAgICAgICAgbGV0IGN1cnJlbnRPdXRwdXRJbmRleCA9IDA7CiAgICAgICAgY29uc3Qgb3V0cHV0SW5kaWNlcyA9IFtdOwogICAgICAgIGNvbnN0IG51bVRyaWFuZ2xlcyA9IG51bUluZGljZXMgLyAzOwogICAgICAgIGNvbnN0IHRyaWFuZ2xlRW1pdHRlZCA9IFtdOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1UcmlhbmdsZXM7IGkrKykgewogICAgICAgICAgdHJpYW5nbGVFbWl0dGVkW2ldID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGxldCBpbmRleDsKICAgICAgICBsZXQgbGltaXQ7CiAgICAgICAgd2hpbGUgKGYgIT09IC0xKSB7CiAgICAgICAgICBvbmVSaW5nID0gW107CiAgICAgICAgICBpbnRvVmVydGljZXMgPSB2ZXJ0aWNlc1tmXTsKICAgICAgICAgIGxpbWl0ID0gaW50b1ZlcnRpY2VzLnZlcnRleFRyaWFuZ2xlcy5sZW5ndGg7CiAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGxpbWl0OyArK2spIHsKICAgICAgICAgICAgdHJpYW5nbGUgPSBpbnRvVmVydGljZXMudmVydGV4VHJpYW5nbGVzW2tdOwogICAgICAgICAgICBpZiAoIXRyaWFuZ2xlRW1pdHRlZFt0cmlhbmdsZV0pIHsKICAgICAgICAgICAgICB0cmlhbmdsZUVtaXR0ZWRbdHJpYW5nbGVdID0gdHJ1ZTsKICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSB0cmlhbmdsZSArIHRyaWFuZ2xlICsgdHJpYW5nbGU7CiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kaWNlc1tjdXJyZW50SW5kZXhdOwogICAgICAgICAgICAgICAgb25lUmluZy5wdXNoKGluZGV4KTsKICAgICAgICAgICAgICAgIGRlYWRFbmQucHVzaChpbmRleCk7CiAgICAgICAgICAgICAgICBvdXRwdXRJbmRpY2VzW2N1cnJlbnRPdXRwdXRJbmRleF0gPSBpbmRleDsKICAgICAgICAgICAgICAgICsrY3VycmVudE91dHB1dEluZGV4OwogICAgICAgICAgICAgICAgdmVydGV4ID0gdmVydGljZXNbaW5kZXhdOwogICAgICAgICAgICAgICAgLS12ZXJ0ZXgubnVtTGl2ZVRyaWFuZ2xlczsKICAgICAgICAgICAgICAgIGlmIChzIC0gdmVydGV4LnRpbWVTdGFtcCA+IGNhY2hlU2l6ZSkgewogICAgICAgICAgICAgICAgICB2ZXJ0ZXgudGltZVN0YW1wID0gczsKICAgICAgICAgICAgICAgICAgKytzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKytjdXJyZW50SW5kZXg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmID0gZ2V0TmV4dFZlcnRleCgKICAgICAgICAgICAgaW5kaWNlcywKICAgICAgICAgICAgY2FjaGVTaXplLAogICAgICAgICAgICBvbmVSaW5nLAogICAgICAgICAgICB2ZXJ0aWNlcywKICAgICAgICAgICAgcywKICAgICAgICAgICAgZGVhZEVuZCwKICAgICAgICAgICAgbWF4aW11bUluZGV4UGx1c09uZQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dHB1dEluZGljZXM7CiAgICAgIH07CiAgICAgIFRpcHNpZnlfZGVmYXVsdCA9IFRpcHNpZnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9HZW9tZXRyeVBpcGVsaW5lLmpzCiAgZnVuY3Rpb24gYWRkVHJpYW5nbGUobGluZXMsIGluZGV4LCBpMCwgaTEsIGkyKSB7CiAgICBsaW5lc1tpbmRleCsrXSA9IGkwOwogICAgbGluZXNbaW5kZXgrK10gPSBpMTsKICAgIGxpbmVzW2luZGV4KytdID0gaTE7CiAgICBsaW5lc1tpbmRleCsrXSA9IGkyOwogICAgbGluZXNbaW5kZXgrK10gPSBpMjsKICAgIGxpbmVzW2luZGV4XSA9IGkwOwogIH0KICBmdW5jdGlvbiB0cmlhbmdsZXNUb0xpbmVzKHRyaWFuZ2xlcykgewogICAgY29uc3QgY291bnQgPSB0cmlhbmdsZXMubGVuZ3RoOwogICAgY29uc3Qgc2l6ZSA9IGNvdW50IC8gMyAqIDY7CiAgICBjb25zdCBsaW5lcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KGNvdW50LCBzaXplKTsKICAgIGxldCBpbmRleCA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpICs9IDMsIGluZGV4ICs9IDYpIHsKICAgICAgYWRkVHJpYW5nbGUobGluZXMsIGluZGV4LCB0cmlhbmdsZXNbaV0sIHRyaWFuZ2xlc1tpICsgMV0sIHRyaWFuZ2xlc1tpICsgMl0pOwogICAgfQogICAgcmV0dXJuIGxpbmVzOwogIH0KICBmdW5jdGlvbiB0cmlhbmdsZVN0cmlwVG9MaW5lcyh0cmlhbmdsZXMpIHsKICAgIGNvbnN0IGNvdW50ID0gdHJpYW5nbGVzLmxlbmd0aDsKICAgIGlmIChjb3VudCA+PSAzKSB7CiAgICAgIGNvbnN0IHNpemUgPSAoY291bnQgLSAyKSAqIDY7CiAgICAgIGNvbnN0IGxpbmVzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkoY291bnQsIHNpemUpOwogICAgICBhZGRUcmlhbmdsZShsaW5lcywgMCwgdHJpYW5nbGVzWzBdLCB0cmlhbmdsZXNbMV0sIHRyaWFuZ2xlc1syXSk7CiAgICAgIGxldCBpbmRleCA9IDY7CiAgICAgIGZvciAobGV0IGkgPSAzOyBpIDwgY291bnQ7ICsraSwgaW5kZXggKz0gNikgewogICAgICAgIGFkZFRyaWFuZ2xlKAogICAgICAgICAgbGluZXMsCiAgICAgICAgICBpbmRleCwKICAgICAgICAgIHRyaWFuZ2xlc1tpIC0gMV0sCiAgICAgICAgICB0cmlhbmdsZXNbaV0sCiAgICAgICAgICB0cmlhbmdsZXNbaSAtIDJdCiAgICAgICAgKTsKICAgICAgfQogICAgICByZXR1cm4gbGluZXM7CiAgICB9CiAgICByZXR1cm4gbmV3IFVpbnQxNkFycmF5KCk7CiAgfQogIGZ1bmN0aW9uIHRyaWFuZ2xlRmFuVG9MaW5lcyh0cmlhbmdsZXMpIHsKICAgIGlmICh0cmlhbmdsZXMubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBjb3VudCA9IHRyaWFuZ2xlcy5sZW5ndGggLSAxOwogICAgICBjb25zdCBzaXplID0gKGNvdW50IC0gMSkgKiA2OwogICAgICBjb25zdCBsaW5lcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KGNvdW50LCBzaXplKTsKICAgICAgY29uc3QgYmFzZSA9IHRyaWFuZ2xlc1swXTsKICAgICAgbGV0IGluZGV4ID0gMDsKICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjb3VudDsgKytpLCBpbmRleCArPSA2KSB7CiAgICAgICAgYWRkVHJpYW5nbGUobGluZXMsIGluZGV4LCBiYXNlLCB0cmlhbmdsZXNbaV0sIHRyaWFuZ2xlc1tpICsgMV0pOwogICAgICB9CiAgICAgIHJldHVybiBsaW5lczsKICAgIH0KICAgIHJldHVybiBuZXcgVWludDE2QXJyYXkoKTsKICB9CiAgZnVuY3Rpb24gY29weUF0dHJpYnV0ZXNEZXNjcmlwdGlvbnMoYXR0cmlidXRlcykgewogICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IHt9OwogICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgaW4gYXR0cmlidXRlcykgewogICAgICBpZiAoYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShhdHRyaWJ1dGUpICYmIGRlZmluZWRfZGVmYXVsdChhdHRyaWJ1dGVzW2F0dHJpYnV0ZV0pICYmIGRlZmluZWRfZGVmYXVsdChhdHRyaWJ1dGVzW2F0dHJpYnV0ZV0udmFsdWVzKSkgewogICAgICAgIGNvbnN0IGF0dHIgPSBhdHRyaWJ1dGVzW2F0dHJpYnV0ZV07CiAgICAgICAgbmV3QXR0cmlidXRlc1thdHRyaWJ1dGVdID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IGF0dHIuY29tcG9uZW50RGF0YXR5cGUsCiAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiBhdHRyLmNvbXBvbmVudHNQZXJBdHRyaWJ1dGUsCiAgICAgICAgICBub3JtYWxpemU6IGF0dHIubm9ybWFsaXplLAogICAgICAgICAgdmFsdWVzOiBbXQogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3QXR0cmlidXRlczsKICB9CiAgZnVuY3Rpb24gY29weVZlcnRleChkZXN0aW5hdGlvbkF0dHJpYnV0ZXMsIHNvdXJjZUF0dHJpYnV0ZXMsIGluZGV4KSB7CiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBpbiBzb3VyY2VBdHRyaWJ1dGVzKSB7CiAgICAgIGlmIChzb3VyY2VBdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KGF0dHJpYnV0ZSkgJiYgZGVmaW5lZF9kZWZhdWx0KHNvdXJjZUF0dHJpYnV0ZXNbYXR0cmlidXRlXSkgJiYgZGVmaW5lZF9kZWZhdWx0KHNvdXJjZUF0dHJpYnV0ZXNbYXR0cmlidXRlXS52YWx1ZXMpKSB7CiAgICAgICAgY29uc3QgYXR0ciA9IHNvdXJjZUF0dHJpYnV0ZXNbYXR0cmlidXRlXTsKICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGF0dHIuY29tcG9uZW50c1BlckF0dHJpYnV0ZTsgKytrKSB7CiAgICAgICAgICBkZXN0aW5hdGlvbkF0dHJpYnV0ZXNbYXR0cmlidXRlXS52YWx1ZXMucHVzaCgKICAgICAgICAgICAgYXR0ci52YWx1ZXNbaW5kZXggKiBhdHRyLmNvbXBvbmVudHNQZXJBdHRyaWJ1dGUgKyBrXQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnQobWF0cml4LCBhdHRyaWJ1dGUpIHsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoYXR0cmlidXRlKSkgewogICAgICBjb25zdCB2YWx1ZXMgPSBhdHRyaWJ1dGUudmFsdWVzOwogICAgICBjb25zdCBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAzKSB7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjayh2YWx1ZXMsIGksIHNjcmF0Y2hDYXJ0ZXNpYW4zMyk7CiAgICAgICAgTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5QnlQb2ludChtYXRyaXgsIHNjcmF0Y2hDYXJ0ZXNpYW4zMywgc2NyYXRjaENhcnRlc2lhbjMzKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayhzY3JhdGNoQ2FydGVzaWFuMzMsIHZhbHVlcywgaSk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gdHJhbnNmb3JtVmVjdG9yKG1hdHJpeCwgYXR0cmlidXRlKSB7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGF0dHJpYnV0ZSkpIHsKICAgICAgY29uc3QgdmFsdWVzID0gYXR0cmlidXRlLnZhbHVlczsKICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aDsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMykgewogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2sodmFsdWVzLCBpLCBzY3JhdGNoQ2FydGVzaWFuMzMpOwogICAgICAgIE1hdHJpeDNfZGVmYXVsdC5tdWx0aXBseUJ5VmVjdG9yKG1hdHJpeCwgc2NyYXRjaENhcnRlc2lhbjMzLCBzY3JhdGNoQ2FydGVzaWFuMzMpOwogICAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zMyA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoCiAgICAgICAgICBzY3JhdGNoQ2FydGVzaWFuMzMsCiAgICAgICAgICBzY3JhdGNoQ2FydGVzaWFuMzMKICAgICAgICApOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKHNjcmF0Y2hDYXJ0ZXNpYW4zMywgdmFsdWVzLCBpKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlc0luQWxsR2VvbWV0cmllcyhpbnN0YW5jZXMsIHByb3BlcnR5TmFtZSkgewogICAgY29uc3QgbGVuZ3RoID0gaW5zdGFuY2VzLmxlbmd0aDsKICAgIGNvbnN0IGF0dHJpYnV0ZXNJbkFsbEdlb21ldHJpZXMgPSB7fTsKICAgIGNvbnN0IGF0dHJpYnV0ZXMwID0gaW5zdGFuY2VzWzBdW3Byb3BlcnR5TmFtZV0uYXR0cmlidXRlczsKICAgIGxldCBuYW1lOwogICAgZm9yIChuYW1lIGluIGF0dHJpYnV0ZXMwKSB7CiAgICAgIGlmIChhdHRyaWJ1dGVzMC5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiBkZWZpbmVkX2RlZmF1bHQoYXR0cmlidXRlczBbbmFtZV0pICYmIGRlZmluZWRfZGVmYXVsdChhdHRyaWJ1dGVzMFtuYW1lXS52YWx1ZXMpKSB7CiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlczBbbmFtZV07CiAgICAgICAgbGV0IG51bWJlck9mQ29tcG9uZW50cyA9IGF0dHJpYnV0ZS52YWx1ZXMubGVuZ3RoOwogICAgICAgIGxldCBpbkFsbEdlb21ldHJpZXMgPSB0cnVlOwogICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgIGNvbnN0IG90aGVyQXR0cmlidXRlID0gaW5zdGFuY2VzW2ldW3Byb3BlcnR5TmFtZV0uYXR0cmlidXRlc1tuYW1lXTsKICAgICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KG90aGVyQXR0cmlidXRlKSB8fCBhdHRyaWJ1dGUuY29tcG9uZW50RGF0YXR5cGUgIT09IG90aGVyQXR0cmlidXRlLmNvbXBvbmVudERhdGF0eXBlIHx8IGF0dHJpYnV0ZS5jb21wb25lbnRzUGVyQXR0cmlidXRlICE9PSBvdGhlckF0dHJpYnV0ZS5jb21wb25lbnRzUGVyQXR0cmlidXRlIHx8IGF0dHJpYnV0ZS5ub3JtYWxpemUgIT09IG90aGVyQXR0cmlidXRlLm5vcm1hbGl6ZSkgewogICAgICAgICAgICBpbkFsbEdlb21ldHJpZXMgPSBmYWxzZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBudW1iZXJPZkNvbXBvbmVudHMgKz0gb3RoZXJBdHRyaWJ1dGUudmFsdWVzLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgaWYgKGluQWxsR2VvbWV0cmllcykgewogICAgICAgICAgYXR0cmlidXRlc0luQWxsR2VvbWV0cmllc1tuYW1lXSA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IGF0dHJpYnV0ZS5jb21wb25lbnREYXRhdHlwZSwKICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogYXR0cmlidXRlLmNvbXBvbmVudHNQZXJBdHRyaWJ1dGUsCiAgICAgICAgICAgIG5vcm1hbGl6ZTogYXR0cmlidXRlLm5vcm1hbGl6ZSwKICAgICAgICAgICAgdmFsdWVzOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkoCiAgICAgICAgICAgICAgYXR0cmlidXRlLmNvbXBvbmVudERhdGF0eXBlLAogICAgICAgICAgICAgIG51bWJlck9mQ29tcG9uZW50cwogICAgICAgICAgICApCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBhdHRyaWJ1dGVzSW5BbGxHZW9tZXRyaWVzOwogIH0KICBmdW5jdGlvbiBjb21iaW5lR2VvbWV0cmllcyhpbnN0YW5jZXMsIHByb3BlcnR5TmFtZSkgewogICAgY29uc3QgbGVuZ3RoID0gaW5zdGFuY2VzLmxlbmd0aDsKICAgIGxldCBuYW1lOwogICAgbGV0IGk7CiAgICBsZXQgajsKICAgIGxldCBrOwogICAgY29uc3QgbSA9IGluc3RhbmNlc1swXS5tb2RlbE1hdHJpeDsKICAgIGNvbnN0IGhhdmVJbmRpY2VzID0gZGVmaW5lZF9kZWZhdWx0KGluc3RhbmNlc1swXVtwcm9wZXJ0eU5hbWVdLmluZGljZXMpOwogICAgY29uc3QgcHJpbWl0aXZlVHlwZSA9IGluc3RhbmNlc1swXVtwcm9wZXJ0eU5hbWVdLnByaW1pdGl2ZVR5cGU7CiAgICBmb3IgKGkgPSAxOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKCFNYXRyaXg0X2RlZmF1bHQuZXF1YWxzKGluc3RhbmNlc1tpXS5tb2RlbE1hdHJpeCwgbSkpIHsKICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiQWxsIGluc3RhbmNlcyBtdXN0IGhhdmUgdGhlIHNhbWUgbW9kZWxNYXRyaXguIik7CiAgICAgIH0KICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChpbnN0YW5jZXNbaV1bcHJvcGVydHlOYW1lXS5pbmRpY2VzKSAhPT0gaGF2ZUluZGljZXMpIHsKICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICJBbGwgaW5zdGFuY2UgZ2VvbWV0cmllcyBtdXN0IGhhdmUgYW4gaW5kaWNlcyBvciBub3QgaGF2ZSBvbmUuIgogICAgICAgICk7CiAgICAgIH0KICAgICAgaWYgKGluc3RhbmNlc1tpXVtwcm9wZXJ0eU5hbWVdLnByaW1pdGl2ZVR5cGUgIT09IHByaW1pdGl2ZVR5cGUpIHsKICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICJBbGwgaW5zdGFuY2UgZ2VvbWV0cmllcyBtdXN0IGhhdmUgdGhlIHNhbWUgcHJpbWl0aXZlVHlwZS4iCiAgICAgICAgKTsKICAgICAgfQogICAgfQogICAgY29uc3QgYXR0cmlidXRlcyA9IGZpbmRBdHRyaWJ1dGVzSW5BbGxHZW9tZXRyaWVzKGluc3RhbmNlcywgcHJvcGVydHlOYW1lKTsKICAgIGxldCB2YWx1ZXM7CiAgICBsZXQgc291cmNlVmFsdWVzOwogICAgbGV0IHNvdXJjZVZhbHVlc0xlbmd0aDsKICAgIGZvciAobmFtZSBpbiBhdHRyaWJ1dGVzKSB7CiAgICAgIGlmIChhdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgICAgdmFsdWVzID0gYXR0cmlidXRlc1tuYW1lXS52YWx1ZXM7CiAgICAgICAgayA9IDA7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgICBzb3VyY2VWYWx1ZXMgPSBpbnN0YW5jZXNbaV1bcHJvcGVydHlOYW1lXS5hdHRyaWJ1dGVzW25hbWVdLnZhbHVlczsKICAgICAgICAgIHNvdXJjZVZhbHVlc0xlbmd0aCA9IHNvdXJjZVZhbHVlcy5sZW5ndGg7CiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc291cmNlVmFsdWVzTGVuZ3RoOyArK2opIHsKICAgICAgICAgICAgdmFsdWVzW2srK10gPSBzb3VyY2VWYWx1ZXNbal07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBsZXQgaW5kaWNlczsKICAgIGlmIChoYXZlSW5kaWNlcykgewogICAgICBsZXQgbnVtYmVyT2ZJbmRpY2VzID0gMDsKICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgbnVtYmVyT2ZJbmRpY2VzICs9IGluc3RhbmNlc1tpXVtwcm9wZXJ0eU5hbWVdLmluZGljZXMubGVuZ3RoOwogICAgICB9CiAgICAgIGNvbnN0IG51bWJlck9mVmVydGljZXMgPSBHZW9tZXRyeV9kZWZhdWx0LmNvbXB1dGVOdW1iZXJPZlZlcnRpY2VzKAogICAgICAgIG5ldyBHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgICAgIGF0dHJpYnV0ZXMsCiAgICAgICAgICBwcmltaXRpdmVUeXBlOiBQcmltaXRpdmVUeXBlX2RlZmF1bHQuUE9JTlRTCiAgICAgICAgfSkKICAgICAgKTsKICAgICAgY29uc3QgZGVzdEluZGljZXMgPSBJbmRleERhdGF0eXBlX2RlZmF1bHQuY3JlYXRlVHlwZWRBcnJheSgKICAgICAgICBudW1iZXJPZlZlcnRpY2VzLAogICAgICAgIG51bWJlck9mSW5kaWNlcwogICAgICApOwogICAgICBsZXQgZGVzdE9mZnNldCA9IDA7CiAgICAgIGxldCBvZmZzZXQgPSAwOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICBjb25zdCBzb3VyY2VJbmRpY2VzID0gaW5zdGFuY2VzW2ldW3Byb3BlcnR5TmFtZV0uaW5kaWNlczsKICAgICAgICBjb25zdCBzb3VyY2VJbmRpY2VzTGVuID0gc291cmNlSW5kaWNlcy5sZW5ndGg7CiAgICAgICAgZm9yIChrID0gMDsgayA8IHNvdXJjZUluZGljZXNMZW47ICsraykgewogICAgICAgICAgZGVzdEluZGljZXNbZGVzdE9mZnNldCsrXSA9IG9mZnNldCArIHNvdXJjZUluZGljZXNba107CiAgICAgICAgfQogICAgICAgIG9mZnNldCArPSBHZW9tZXRyeV9kZWZhdWx0LmNvbXB1dGVOdW1iZXJPZlZlcnRpY2VzKGluc3RhbmNlc1tpXVtwcm9wZXJ0eU5hbWVdKTsKICAgICAgfQogICAgICBpbmRpY2VzID0gZGVzdEluZGljZXM7CiAgICB9CiAgICBsZXQgY2VudGVyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgbGV0IHJhZGl1cyA9IDA7CiAgICBsZXQgYnM7CiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgYnMgPSBpbnN0YW5jZXNbaV1bcHJvcGVydHlOYW1lXS5ib3VuZGluZ1NwaGVyZTsKICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYnMpKSB7CiAgICAgICAgY2VudGVyID0gdm9pZCAwOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoYnMuY2VudGVyLCBjZW50ZXIsIGNlbnRlcik7CiAgICB9CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGNlbnRlcikpIHsKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmRpdmlkZUJ5U2NhbGFyKGNlbnRlciwgbGVuZ3RoLCBjZW50ZXIpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICBicyA9IGluc3RhbmNlc1tpXVtwcm9wZXJ0eU5hbWVdLmJvdW5kaW5nU3BoZXJlOwogICAgICAgIGNvbnN0IHRlbXBSYWRpdXMgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlKAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KGJzLmNlbnRlciwgY2VudGVyLCB0ZW1wU2NyYXRjaCkKICAgICAgICApICsgYnMucmFkaXVzOwogICAgICAgIGlmICh0ZW1wUmFkaXVzID4gcmFkaXVzKSB7CiAgICAgICAgICByYWRpdXMgPSB0ZW1wUmFkaXVzOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgYXR0cmlidXRlcywKICAgICAgaW5kaWNlcywKICAgICAgcHJpbWl0aXZlVHlwZSwKICAgICAgYm91bmRpbmdTcGhlcmU6IGRlZmluZWRfZGVmYXVsdChjZW50ZXIpID8gbmV3IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQoY2VudGVyLCByYWRpdXMpIDogdm9pZCAwCiAgICB9KTsKICB9CiAgZnVuY3Rpb24gaW5kZXhUcmlhbmdsZXMoZ2VvbWV0cnkpIHsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoZ2VvbWV0cnkuaW5kaWNlcykpIHsKICAgICAgcmV0dXJuIGdlb21ldHJ5OwogICAgfQogICAgY29uc3QgbnVtYmVyT2ZWZXJ0aWNlcyA9IEdlb21ldHJ5X2RlZmF1bHQuY29tcHV0ZU51bWJlck9mVmVydGljZXMoZ2VvbWV0cnkpOwogICAgaWYgKG51bWJlck9mVmVydGljZXMgPCAzKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJUaGUgbnVtYmVyIG9mIHZlcnRpY2VzIG11c3QgYmUgYXQgbGVhc3QgdGhyZWUuIik7CiAgICB9CiAgICBpZiAobnVtYmVyT2ZWZXJ0aWNlcyAlIDMgIT09IDApIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgIlRoZSBudW1iZXIgb2YgdmVydGljZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRocmVlLiIKICAgICAgKTsKICAgIH0KICAgIGNvbnN0IGluZGljZXMgPSBJbmRleERhdGF0eXBlX2RlZmF1bHQuY3JlYXRlVHlwZWRBcnJheSgKICAgICAgbnVtYmVyT2ZWZXJ0aWNlcywKICAgICAgbnVtYmVyT2ZWZXJ0aWNlcwogICAgKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZWZXJ0aWNlczsgKytpKSB7CiAgICAgIGluZGljZXNbaV0gPSBpOwogICAgfQogICAgZ2VvbWV0cnkuaW5kaWNlcyA9IGluZGljZXM7CiAgICByZXR1cm4gZ2VvbWV0cnk7CiAgfQogIGZ1bmN0aW9uIGluZGV4VHJpYW5nbGVGYW4oZ2VvbWV0cnkpIHsKICAgIGNvbnN0IG51bWJlck9mVmVydGljZXMgPSBHZW9tZXRyeV9kZWZhdWx0LmNvbXB1dGVOdW1iZXJPZlZlcnRpY2VzKGdlb21ldHJ5KTsKICAgIGlmIChudW1iZXJPZlZlcnRpY2VzIDwgMykgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiVGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBtdXN0IGJlIGF0IGxlYXN0IHRocmVlLiIpOwogICAgfQogICAgY29uc3QgaW5kaWNlcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KAogICAgICBudW1iZXJPZlZlcnRpY2VzLAogICAgICAobnVtYmVyT2ZWZXJ0aWNlcyAtIDIpICogMwogICAgKTsKICAgIGluZGljZXNbMF0gPSAxOwogICAgaW5kaWNlc1sxXSA9IDA7CiAgICBpbmRpY2VzWzJdID0gMjsKICAgIGxldCBpbmRpY2VzSW5kZXggPSAzOwogICAgZm9yIChsZXQgaSA9IDM7IGkgPCBudW1iZXJPZlZlcnRpY2VzOyArK2kpIHsKICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBpIC0gMTsKICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSAwOwogICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IGk7CiAgICB9CiAgICBnZW9tZXRyeS5pbmRpY2VzID0gaW5kaWNlczsKICAgIGdlb21ldHJ5LnByaW1pdGl2ZVR5cGUgPSBQcmltaXRpdmVUeXBlX2RlZmF1bHQuVFJJQU5HTEVTOwogICAgcmV0dXJuIGdlb21ldHJ5OwogIH0KICBmdW5jdGlvbiBpbmRleFRyaWFuZ2xlU3RyaXAoZ2VvbWV0cnkpIHsKICAgIGNvbnN0IG51bWJlck9mVmVydGljZXMgPSBHZW9tZXRyeV9kZWZhdWx0LmNvbXB1dGVOdW1iZXJPZlZlcnRpY2VzKGdlb21ldHJ5KTsKICAgIGlmIChudW1iZXJPZlZlcnRpY2VzIDwgMykgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiVGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBtdXN0IGJlIGF0IGxlYXN0IDMuIik7CiAgICB9CiAgICBjb25zdCBpbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkoCiAgICAgIG51bWJlck9mVmVydGljZXMsCiAgICAgIChudW1iZXJPZlZlcnRpY2VzIC0gMikgKiAzCiAgICApOwogICAgaW5kaWNlc1swXSA9IDA7CiAgICBpbmRpY2VzWzFdID0gMTsKICAgIGluZGljZXNbMl0gPSAyOwogICAgaWYgKG51bWJlck9mVmVydGljZXMgPiAzKSB7CiAgICAgIGluZGljZXNbM10gPSAwOwogICAgICBpbmRpY2VzWzRdID0gMjsKICAgICAgaW5kaWNlc1s1XSA9IDM7CiAgICB9CiAgICBsZXQgaW5kaWNlc0luZGV4ID0gNjsKICAgIGZvciAobGV0IGkgPSAzOyBpIDwgbnVtYmVyT2ZWZXJ0aWNlcyAtIDE7IGkgKz0gMikgewogICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IGk7CiAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gaSAtIDE7CiAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gaSArIDE7CiAgICAgIGlmIChpICsgMiA8IG51bWJlck9mVmVydGljZXMpIHsKICAgICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IGk7CiAgICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBpICsgMTsKICAgICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IGkgKyAyOwogICAgICB9CiAgICB9CiAgICBnZW9tZXRyeS5pbmRpY2VzID0gaW5kaWNlczsKICAgIGdlb21ldHJ5LnByaW1pdGl2ZVR5cGUgPSBQcmltaXRpdmVUeXBlX2RlZmF1bHQuVFJJQU5HTEVTOwogICAgcmV0dXJuIGdlb21ldHJ5OwogIH0KICBmdW5jdGlvbiBpbmRleExpbmVzKGdlb21ldHJ5KSB7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGdlb21ldHJ5LmluZGljZXMpKSB7CiAgICAgIHJldHVybiBnZW9tZXRyeTsKICAgIH0KICAgIGNvbnN0IG51bWJlck9mVmVydGljZXMgPSBHZW9tZXRyeV9kZWZhdWx0LmNvbXB1dGVOdW1iZXJPZlZlcnRpY2VzKGdlb21ldHJ5KTsKICAgIGlmIChudW1iZXJPZlZlcnRpY2VzIDwgMikgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiVGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBtdXN0IGJlIGF0IGxlYXN0IHR3by4iKTsKICAgIH0KICAgIGlmIChudW1iZXJPZlZlcnRpY2VzICUgMiAhPT0gMCkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiVGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMi4iKTsKICAgIH0KICAgIGNvbnN0IGluZGljZXMgPSBJbmRleERhdGF0eXBlX2RlZmF1bHQuY3JlYXRlVHlwZWRBcnJheSgKICAgICAgbnVtYmVyT2ZWZXJ0aWNlcywKICAgICAgbnVtYmVyT2ZWZXJ0aWNlcwogICAgKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZWZXJ0aWNlczsgKytpKSB7CiAgICAgIGluZGljZXNbaV0gPSBpOwogICAgfQogICAgZ2VvbWV0cnkuaW5kaWNlcyA9IGluZGljZXM7CiAgICByZXR1cm4gZ2VvbWV0cnk7CiAgfQogIGZ1bmN0aW9uIGluZGV4TGluZVN0cmlwKGdlb21ldHJ5KSB7CiAgICBjb25zdCBudW1iZXJPZlZlcnRpY2VzID0gR2VvbWV0cnlfZGVmYXVsdC5jb21wdXRlTnVtYmVyT2ZWZXJ0aWNlcyhnZW9tZXRyeSk7CiAgICBpZiAobnVtYmVyT2ZWZXJ0aWNlcyA8IDIpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIlRoZSBudW1iZXIgb2YgdmVydGljZXMgbXVzdCBiZSBhdCBsZWFzdCB0d28uIik7CiAgICB9CiAgICBjb25zdCBpbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkoCiAgICAgIG51bWJlck9mVmVydGljZXMsCiAgICAgIChudW1iZXJPZlZlcnRpY2VzIC0gMSkgKiAyCiAgICApOwogICAgaW5kaWNlc1swXSA9IDA7CiAgICBpbmRpY2VzWzFdID0gMTsKICAgIGxldCBpbmRpY2VzSW5kZXggPSAyOwogICAgZm9yIChsZXQgaSA9IDI7IGkgPCBudW1iZXJPZlZlcnRpY2VzOyArK2kpIHsKICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBpIC0gMTsKICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBpOwogICAgfQogICAgZ2VvbWV0cnkuaW5kaWNlcyA9IGluZGljZXM7CiAgICBnZW9tZXRyeS5wcmltaXRpdmVUeXBlID0gUHJpbWl0aXZlVHlwZV9kZWZhdWx0LkxJTkVTOwogICAgcmV0dXJuIGdlb21ldHJ5OwogIH0KICBmdW5jdGlvbiBpbmRleExpbmVMb29wKGdlb21ldHJ5KSB7CiAgICBjb25zdCBudW1iZXJPZlZlcnRpY2VzID0gR2VvbWV0cnlfZGVmYXVsdC5jb21wdXRlTnVtYmVyT2ZWZXJ0aWNlcyhnZW9tZXRyeSk7CiAgICBpZiAobnVtYmVyT2ZWZXJ0aWNlcyA8IDIpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIlRoZSBudW1iZXIgb2YgdmVydGljZXMgbXVzdCBiZSBhdCBsZWFzdCB0d28uIik7CiAgICB9CiAgICBjb25zdCBpbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkoCiAgICAgIG51bWJlck9mVmVydGljZXMsCiAgICAgIG51bWJlck9mVmVydGljZXMgKiAyCiAgICApOwogICAgaW5kaWNlc1swXSA9IDA7CiAgICBpbmRpY2VzWzFdID0gMTsKICAgIGxldCBpbmRpY2VzSW5kZXggPSAyOwogICAgZm9yIChsZXQgaSA9IDI7IGkgPCBudW1iZXJPZlZlcnRpY2VzOyArK2kpIHsKICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBpIC0gMTsKICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBpOwogICAgfQogICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBudW1iZXJPZlZlcnRpY2VzIC0gMTsKICAgIGluZGljZXNbaW5kaWNlc0luZGV4XSA9IDA7CiAgICBnZW9tZXRyeS5pbmRpY2VzID0gaW5kaWNlczsKICAgIGdlb21ldHJ5LnByaW1pdGl2ZVR5cGUgPSBQcmltaXRpdmVUeXBlX2RlZmF1bHQuTElORVM7CiAgICByZXR1cm4gZ2VvbWV0cnk7CiAgfQogIGZ1bmN0aW9uIGluZGV4UHJpbWl0aXZlKGdlb21ldHJ5KSB7CiAgICBzd2l0Y2ggKGdlb21ldHJ5LnByaW1pdGl2ZVR5cGUpIHsKICAgICAgY2FzZSBQcmltaXRpdmVUeXBlX2RlZmF1bHQuVFJJQU5HTEVfRkFOOgogICAgICAgIHJldHVybiBpbmRleFRyaWFuZ2xlRmFuKGdlb21ldHJ5KTsKICAgICAgY2FzZSBQcmltaXRpdmVUeXBlX2RlZmF1bHQuVFJJQU5HTEVfU1RSSVA6CiAgICAgICAgcmV0dXJuIGluZGV4VHJpYW5nbGVTdHJpcChnZW9tZXRyeSk7CiAgICAgIGNhc2UgUHJpbWl0aXZlVHlwZV9kZWZhdWx0LlRSSUFOR0xFUzoKICAgICAgICByZXR1cm4gaW5kZXhUcmlhbmdsZXMoZ2VvbWV0cnkpOwogICAgICBjYXNlIFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5MSU5FX1NUUklQOgogICAgICAgIHJldHVybiBpbmRleExpbmVTdHJpcChnZW9tZXRyeSk7CiAgICAgIGNhc2UgUHJpbWl0aXZlVHlwZV9kZWZhdWx0LkxJTkVfTE9PUDoKICAgICAgICByZXR1cm4gaW5kZXhMaW5lTG9vcChnZW9tZXRyeSk7CiAgICAgIGNhc2UgUHJpbWl0aXZlVHlwZV9kZWZhdWx0LkxJTkVTOgogICAgICAgIHJldHVybiBpbmRleExpbmVzKGdlb21ldHJ5KTsKICAgIH0KICAgIHJldHVybiBnZW9tZXRyeTsKICB9CiAgZnVuY3Rpb24gb2Zmc2V0UG9pbnRGcm9tWFpQbGFuZShwLCBpc0JlaGluZCkgewogICAgaWYgKE1hdGguYWJzKHAueSkgPCBNYXRoX2RlZmF1bHQuRVBTSUxPTjYpIHsKICAgICAgaWYgKGlzQmVoaW5kKSB7CiAgICAgICAgcC55ID0gLU1hdGhfZGVmYXVsdC5FUFNJTE9ONjsKICAgICAgfSBlbHNlIHsKICAgICAgICBwLnkgPSBNYXRoX2RlZmF1bHQuRVBTSUxPTjY7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gb2Zmc2V0VHJpYW5nbGVGcm9tWFpQbGFuZShwMCwgcDEsIHAyKSB7CiAgICBpZiAocDAueSAhPT0gMCAmJiBwMS55ICE9PSAwICYmIHAyLnkgIT09IDApIHsKICAgICAgb2Zmc2V0UG9pbnRGcm9tWFpQbGFuZShwMCwgcDAueSA8IDApOwogICAgICBvZmZzZXRQb2ludEZyb21YWlBsYW5lKHAxLCBwMS55IDwgMCk7CiAgICAgIG9mZnNldFBvaW50RnJvbVhaUGxhbmUocDIsIHAyLnkgPCAwKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcDB5ID0gTWF0aC5hYnMocDAueSk7CiAgICBjb25zdCBwMXkgPSBNYXRoLmFicyhwMS55KTsKICAgIGNvbnN0IHAyeSA9IE1hdGguYWJzKHAyLnkpOwogICAgbGV0IHNpZ24zOwogICAgaWYgKHAweSA+IHAxeSkgewogICAgICBpZiAocDB5ID4gcDJ5KSB7CiAgICAgICAgc2lnbjMgPSBNYXRoX2RlZmF1bHQuc2lnbihwMC55KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzaWduMyA9IE1hdGhfZGVmYXVsdC5zaWduKHAyLnkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHAxeSA+IHAyeSkgewogICAgICBzaWduMyA9IE1hdGhfZGVmYXVsdC5zaWduKHAxLnkpOwogICAgfSBlbHNlIHsKICAgICAgc2lnbjMgPSBNYXRoX2RlZmF1bHQuc2lnbihwMi55KTsKICAgIH0KICAgIGNvbnN0IGlzQmVoaW5kID0gc2lnbjMgPCAwOwogICAgb2Zmc2V0UG9pbnRGcm9tWFpQbGFuZShwMCwgaXNCZWhpbmQpOwogICAgb2Zmc2V0UG9pbnRGcm9tWFpQbGFuZShwMSwgaXNCZWhpbmQpOwogICAgb2Zmc2V0UG9pbnRGcm9tWFpQbGFuZShwMiwgaXNCZWhpbmQpOwogIH0KICBmdW5jdGlvbiBnZXRYWkludGVyc2VjdGlvbk9mZnNldFBvaW50cyhwLCBwMSwgdTEyLCB2MTIpIHsKICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoCiAgICAgIHAsCiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKAogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChwMSwgcCwgYzMpLAogICAgICAgIHAueSAvIChwLnkgLSBwMS55KSwKICAgICAgICBjMwogICAgICApLAogICAgICB1MTIKICAgICk7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUodTEyLCB2MTIpOwogICAgb2Zmc2V0UG9pbnRGcm9tWFpQbGFuZSh1MTIsIHRydWUpOwogICAgb2Zmc2V0UG9pbnRGcm9tWFpQbGFuZSh2MTIsIGZhbHNlKTsKICB9CiAgZnVuY3Rpb24gc3BsaXRUcmlhbmdsZShwMCwgcDEsIHAyKSB7CiAgICBpZiAocDAueCA+PSAwIHx8IHAxLnggPj0gMCB8fCBwMi54ID49IDApIHsKICAgICAgcmV0dXJuIHZvaWQgMDsKICAgIH0KICAgIG9mZnNldFRyaWFuZ2xlRnJvbVhaUGxhbmUocDAsIHAxLCBwMik7CiAgICBjb25zdCBwMEJlaGluZCA9IHAwLnkgPCAwOwogICAgY29uc3QgcDFCZWhpbmQgPSBwMS55IDwgMDsKICAgIGNvbnN0IHAyQmVoaW5kID0gcDIueSA8IDA7CiAgICBsZXQgbnVtQmVoaW5kID0gMDsKICAgIG51bUJlaGluZCArPSBwMEJlaGluZCA/IDEgOiAwOwogICAgbnVtQmVoaW5kICs9IHAxQmVoaW5kID8gMSA6IDA7CiAgICBudW1CZWhpbmQgKz0gcDJCZWhpbmQgPyAxIDogMDsKICAgIGNvbnN0IGluZGljZXMgPSBzcGxpdFRyaWFuZ2xlUmVzdWx0LmluZGljZXM7CiAgICBpZiAobnVtQmVoaW5kID09PSAxKSB7CiAgICAgIGluZGljZXNbMV0gPSAzOwogICAgICBpbmRpY2VzWzJdID0gNDsKICAgICAgaW5kaWNlc1s1XSA9IDY7CiAgICAgIGluZGljZXNbN10gPSA2OwogICAgICBpbmRpY2VzWzhdID0gNTsKICAgICAgaWYgKHAwQmVoaW5kKSB7CiAgICAgICAgZ2V0WFpJbnRlcnNlY3Rpb25PZmZzZXRQb2ludHMocDAsIHAxLCB1MSwgcTEpOwogICAgICAgIGdldFhaSW50ZXJzZWN0aW9uT2Zmc2V0UG9pbnRzKHAwLCBwMiwgdTIsIHEyKTsKICAgICAgICBpbmRpY2VzWzBdID0gMDsKICAgICAgICBpbmRpY2VzWzNdID0gMTsKICAgICAgICBpbmRpY2VzWzRdID0gMjsKICAgICAgICBpbmRpY2VzWzZdID0gMTsKICAgICAgfSBlbHNlIGlmIChwMUJlaGluZCkgewogICAgICAgIGdldFhaSW50ZXJzZWN0aW9uT2Zmc2V0UG9pbnRzKHAxLCBwMiwgdTEsIHExKTsKICAgICAgICBnZXRYWkludGVyc2VjdGlvbk9mZnNldFBvaW50cyhwMSwgcDAsIHUyLCBxMik7CiAgICAgICAgaW5kaWNlc1swXSA9IDE7CiAgICAgICAgaW5kaWNlc1szXSA9IDI7CiAgICAgICAgaW5kaWNlc1s0XSA9IDA7CiAgICAgICAgaW5kaWNlc1s2XSA9IDI7CiAgICAgIH0gZWxzZSBpZiAocDJCZWhpbmQpIHsKICAgICAgICBnZXRYWkludGVyc2VjdGlvbk9mZnNldFBvaW50cyhwMiwgcDAsIHUxLCBxMSk7CiAgICAgICAgZ2V0WFpJbnRlcnNlY3Rpb25PZmZzZXRQb2ludHMocDIsIHAxLCB1MiwgcTIpOwogICAgICAgIGluZGljZXNbMF0gPSAyOwogICAgICAgIGluZGljZXNbM10gPSAwOwogICAgICAgIGluZGljZXNbNF0gPSAxOwogICAgICAgIGluZGljZXNbNl0gPSAwOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG51bUJlaGluZCA9PT0gMikgewogICAgICBpbmRpY2VzWzJdID0gNDsKICAgICAgaW5kaWNlc1s0XSA9IDQ7CiAgICAgIGluZGljZXNbNV0gPSAzOwogICAgICBpbmRpY2VzWzddID0gNTsKICAgICAgaW5kaWNlc1s4XSA9IDY7CiAgICAgIGlmICghcDBCZWhpbmQpIHsKICAgICAgICBnZXRYWkludGVyc2VjdGlvbk9mZnNldFBvaW50cyhwMCwgcDEsIHUxLCBxMSk7CiAgICAgICAgZ2V0WFpJbnRlcnNlY3Rpb25PZmZzZXRQb2ludHMocDAsIHAyLCB1MiwgcTIpOwogICAgICAgIGluZGljZXNbMF0gPSAxOwogICAgICAgIGluZGljZXNbMV0gPSAyOwogICAgICAgIGluZGljZXNbM10gPSAxOwogICAgICAgIGluZGljZXNbNl0gPSAwOwogICAgICB9IGVsc2UgaWYgKCFwMUJlaGluZCkgewogICAgICAgIGdldFhaSW50ZXJzZWN0aW9uT2Zmc2V0UG9pbnRzKHAxLCBwMiwgdTEsIHExKTsKICAgICAgICBnZXRYWkludGVyc2VjdGlvbk9mZnNldFBvaW50cyhwMSwgcDAsIHUyLCBxMik7CiAgICAgICAgaW5kaWNlc1swXSA9IDI7CiAgICAgICAgaW5kaWNlc1sxXSA9IDA7CiAgICAgICAgaW5kaWNlc1szXSA9IDI7CiAgICAgICAgaW5kaWNlc1s2XSA9IDE7CiAgICAgIH0gZWxzZSBpZiAoIXAyQmVoaW5kKSB7CiAgICAgICAgZ2V0WFpJbnRlcnNlY3Rpb25PZmZzZXRQb2ludHMocDIsIHAwLCB1MSwgcTEpOwogICAgICAgIGdldFhaSW50ZXJzZWN0aW9uT2Zmc2V0UG9pbnRzKHAyLCBwMSwgdTIsIHEyKTsKICAgICAgICBpbmRpY2VzWzBdID0gMDsKICAgICAgICBpbmRpY2VzWzFdID0gMTsKICAgICAgICBpbmRpY2VzWzNdID0gMDsKICAgICAgICBpbmRpY2VzWzZdID0gMjsKICAgICAgfQogICAgfQogICAgY29uc3QgcG9zaXRpb25zID0gc3BsaXRUcmlhbmdsZVJlc3VsdC5wb3NpdGlvbnM7CiAgICBwb3NpdGlvbnNbMF0gPSBwMDsKICAgIHBvc2l0aW9uc1sxXSA9IHAxOwogICAgcG9zaXRpb25zWzJdID0gcDI7CiAgICBwb3NpdGlvbnMubGVuZ3RoID0gMzsKICAgIGlmIChudW1CZWhpbmQgPT09IDEgfHwgbnVtQmVoaW5kID09PSAyKSB7CiAgICAgIHBvc2l0aW9uc1szXSA9IHUxOwogICAgICBwb3NpdGlvbnNbNF0gPSB1MjsKICAgICAgcG9zaXRpb25zWzVdID0gcTE7CiAgICAgIHBvc2l0aW9uc1s2XSA9IHEyOwogICAgICBwb3NpdGlvbnMubGVuZ3RoID0gNzsKICAgIH0KICAgIHJldHVybiBzcGxpdFRyaWFuZ2xlUmVzdWx0OwogIH0KICBmdW5jdGlvbiB1cGRhdGVHZW9tZXRyeUFmdGVyU3BsaXQoZ2VvbWV0cnksIGNvbXB1dGVCb3VuZGluZ1NwaGVyZSkgewogICAgY29uc3QgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7CiAgICBpZiAoYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiB2b2lkIDA7CiAgICB9CiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGF0dHJpYnV0ZXMpIHsKICAgICAgaWYgKGF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkocHJvcGVydHkpICYmIGRlZmluZWRfZGVmYXVsdChhdHRyaWJ1dGVzW3Byb3BlcnR5XSkgJiYgZGVmaW5lZF9kZWZhdWx0KGF0dHJpYnV0ZXNbcHJvcGVydHldLnZhbHVlcykpIHsKICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW3Byb3BlcnR5XTsKICAgICAgICBhdHRyaWJ1dGUudmFsdWVzID0gQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KAogICAgICAgICAgYXR0cmlidXRlLmNvbXBvbmVudERhdGF0eXBlLAogICAgICAgICAgYXR0cmlidXRlLnZhbHVlcwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IG51bWJlck9mVmVydGljZXMgPSBHZW9tZXRyeV9kZWZhdWx0LmNvbXB1dGVOdW1iZXJPZlZlcnRpY2VzKGdlb21ldHJ5KTsKICAgIGdlb21ldHJ5LmluZGljZXMgPSBJbmRleERhdGF0eXBlX2RlZmF1bHQuY3JlYXRlVHlwZWRBcnJheSgKICAgICAgbnVtYmVyT2ZWZXJ0aWNlcywKICAgICAgZ2VvbWV0cnkuaW5kaWNlcwogICAgKTsKICAgIGlmIChjb21wdXRlQm91bmRpbmdTcGhlcmUpIHsKICAgICAgZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPSBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LmZyb21WZXJ0aWNlcygKICAgICAgICBhdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcwogICAgICApOwogICAgfQogICAgcmV0dXJuIGdlb21ldHJ5OwogIH0KICBmdW5jdGlvbiBjb3B5R2VvbWV0cnlGb3JTcGxpdChnZW9tZXRyeSkgewogICAgY29uc3QgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7CiAgICBjb25zdCBjb3BpZWRBdHRyaWJ1dGVzID0ge307CiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGF0dHJpYnV0ZXMpIHsKICAgICAgaWYgKGF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkocHJvcGVydHkpICYmIGRlZmluZWRfZGVmYXVsdChhdHRyaWJ1dGVzW3Byb3BlcnR5XSkgJiYgZGVmaW5lZF9kZWZhdWx0KGF0dHJpYnV0ZXNbcHJvcGVydHldLnZhbHVlcykpIHsKICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW3Byb3BlcnR5XTsKICAgICAgICBjb3BpZWRBdHRyaWJ1dGVzW3Byb3BlcnR5XSA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBhdHRyaWJ1dGUuY29tcG9uZW50RGF0YXR5cGUsCiAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiBhdHRyaWJ1dGUuY29tcG9uZW50c1BlckF0dHJpYnV0ZSwKICAgICAgICAgIG5vcm1hbGl6ZTogYXR0cmlidXRlLm5vcm1hbGl6ZSwKICAgICAgICAgIHZhbHVlczogW10KICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgYXR0cmlidXRlczogY29waWVkQXR0cmlidXRlcywKICAgICAgaW5kaWNlczogW10sCiAgICAgIHByaW1pdGl2ZVR5cGU6IGdlb21ldHJ5LnByaW1pdGl2ZVR5cGUKICAgIH0pOwogIH0KICBmdW5jdGlvbiB1cGRhdGVJbnN0YW5jZUFmdGVyU3BsaXQoaW5zdGFuY2UsIHdlc3RHZW9tZXRyeSwgZWFzdEdlb21ldHJ5KSB7CiAgICBjb25zdCBjb21wdXRlQm91bmRpbmdTcGhlcmUgPSBkZWZpbmVkX2RlZmF1bHQoaW5zdGFuY2UuZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUpOwogICAgd2VzdEdlb21ldHJ5ID0gdXBkYXRlR2VvbWV0cnlBZnRlclNwbGl0KHdlc3RHZW9tZXRyeSwgY29tcHV0ZUJvdW5kaW5nU3BoZXJlKTsKICAgIGVhc3RHZW9tZXRyeSA9IHVwZGF0ZUdlb21ldHJ5QWZ0ZXJTcGxpdChlYXN0R2VvbWV0cnksIGNvbXB1dGVCb3VuZGluZ1NwaGVyZSk7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGVhc3RHZW9tZXRyeSkgJiYgIWRlZmluZWRfZGVmYXVsdCh3ZXN0R2VvbWV0cnkpKSB7CiAgICAgIGluc3RhbmNlLmdlb21ldHJ5ID0gZWFzdEdlb21ldHJ5OwogICAgfSBlbHNlIGlmICghZGVmaW5lZF9kZWZhdWx0KGVhc3RHZW9tZXRyeSkgJiYgZGVmaW5lZF9kZWZhdWx0KHdlc3RHZW9tZXRyeSkpIHsKICAgICAgaW5zdGFuY2UuZ2VvbWV0cnkgPSB3ZXN0R2VvbWV0cnk7CiAgICB9IGVsc2UgewogICAgICBpbnN0YW5jZS53ZXN0SGVtaXNwaGVyZUdlb21ldHJ5ID0gd2VzdEdlb21ldHJ5OwogICAgICBpbnN0YW5jZS5lYXN0SGVtaXNwaGVyZUdlb21ldHJ5ID0gZWFzdEdlb21ldHJ5OwogICAgICBpbnN0YW5jZS5nZW9tZXRyeSA9IHZvaWQgMDsKICAgIH0KICB9CiAgZnVuY3Rpb24gZ2VuZXJhdGVCYXJ5Y2VudHJpY0ludGVycG9sYXRlRnVuY3Rpb24oQ2FydGVzaWFuVHlwZSwgbnVtYmVyT2ZDb21wb25lbnRzKSB7CiAgICBjb25zdCB2MFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuVHlwZSgpOwogICAgY29uc3QgdjFTY3JhdGNoMiA9IG5ldyBDYXJ0ZXNpYW5UeXBlKCk7CiAgICBjb25zdCB2MlNjcmF0Y2gyID0gbmV3IENhcnRlc2lhblR5cGUoKTsKICAgIHJldHVybiBmdW5jdGlvbihpMCwgaTEsIGkyLCBjb29yZHMsIHNvdXJjZVZhbHVlcywgY3VycmVudFZhbHVlcywgaW5zZXJ0ZWRJbmRleCwgbm9ybWFsaXplKSB7CiAgICAgIGNvbnN0IHYwMiA9IENhcnRlc2lhblR5cGUuZnJvbUFycmF5KAogICAgICAgIHNvdXJjZVZhbHVlcywKICAgICAgICBpMCAqIG51bWJlck9mQ29tcG9uZW50cywKICAgICAgICB2MFNjcmF0Y2gKICAgICAgKTsKICAgICAgY29uc3QgdjEyID0gQ2FydGVzaWFuVHlwZS5mcm9tQXJyYXkoCiAgICAgICAgc291cmNlVmFsdWVzLAogICAgICAgIGkxICogbnVtYmVyT2ZDb21wb25lbnRzLAogICAgICAgIHYxU2NyYXRjaDIKICAgICAgKTsKICAgICAgY29uc3QgdjIyID0gQ2FydGVzaWFuVHlwZS5mcm9tQXJyYXkoCiAgICAgICAgc291cmNlVmFsdWVzLAogICAgICAgIGkyICogbnVtYmVyT2ZDb21wb25lbnRzLAogICAgICAgIHYyU2NyYXRjaDIKICAgICAgKTsKICAgICAgQ2FydGVzaWFuVHlwZS5tdWx0aXBseUJ5U2NhbGFyKHYwMiwgY29vcmRzLngsIHYwMik7CiAgICAgIENhcnRlc2lhblR5cGUubXVsdGlwbHlCeVNjYWxhcih2MTIsIGNvb3Jkcy55LCB2MTIpOwogICAgICBDYXJ0ZXNpYW5UeXBlLm11bHRpcGx5QnlTY2FsYXIodjIyLCBjb29yZHMueiwgdjIyKTsKICAgICAgY29uc3QgdmFsdWUgPSBDYXJ0ZXNpYW5UeXBlLmFkZCh2MDIsIHYxMiwgdjAyKTsKICAgICAgQ2FydGVzaWFuVHlwZS5hZGQodmFsdWUsIHYyMiwgdmFsdWUpOwogICAgICBpZiAobm9ybWFsaXplKSB7CiAgICAgICAgQ2FydGVzaWFuVHlwZS5ub3JtYWxpemUodmFsdWUsIHZhbHVlKTsKICAgICAgfQogICAgICBDYXJ0ZXNpYW5UeXBlLnBhY2soCiAgICAgICAgdmFsdWUsCiAgICAgICAgY3VycmVudFZhbHVlcywKICAgICAgICBpbnNlcnRlZEluZGV4ICogbnVtYmVyT2ZDb21wb25lbnRzCiAgICAgICk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBjb21wdXRlVHJpYW5nbGVBdHRyaWJ1dGVzKGkwLCBpMSwgaTIsIHBvaW50LCBwb3NpdGlvbnMsIG5vcm1hbHMsIHRhbmdlbnRzLCBiaXRhbmdlbnRzLCB0ZXhDb29yZHMsIGV4dHJ1ZGVEaXJlY3Rpb25zLCBhcHBseU9mZnNldCwgY3VycmVudEF0dHJpYnV0ZXMsIGN1c3RvbUF0dHJpYnV0ZU5hbWVzLCBjdXN0b21BdHRyaWJ1dGVzTGVuZ3RoLCBhbGxBdHRyaWJ1dGVzLCBpbnNlcnRlZEluZGV4KSB7CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChub3JtYWxzKSAmJiAhZGVmaW5lZF9kZWZhdWx0KHRhbmdlbnRzKSAmJiAhZGVmaW5lZF9kZWZhdWx0KGJpdGFuZ2VudHMpICYmICFkZWZpbmVkX2RlZmF1bHQodGV4Q29vcmRzKSAmJiAhZGVmaW5lZF9kZWZhdWx0KGV4dHJ1ZGVEaXJlY3Rpb25zKSAmJiBjdXN0b21BdHRyaWJ1dGVzTGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHAwID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShwb3NpdGlvbnMsIGkwICogMywgcDBTY3JhdGNoKTsKICAgIGNvbnN0IHAxID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShwb3NpdGlvbnMsIGkxICogMywgcDFTY3JhdGNoKTsKICAgIGNvbnN0IHAyID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShwb3NpdGlvbnMsIGkyICogMywgcDJTY3JhdGNoKTsKICAgIGNvbnN0IGNvb3JkcyA9IGJhcnljZW50cmljQ29vcmRpbmF0ZXNfZGVmYXVsdChwb2ludCwgcDAsIHAxLCBwMiwgYmFyeWNlbnRyaWNTY3JhdGNoKTsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGNvb3JkcykpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGRlZmluZWRfZGVmYXVsdChub3JtYWxzKSkgewogICAgICBpbnRlcnBvbGF0ZUFuZFBhY2tDYXJ0ZXNpYW4zKAogICAgICAgIGkwLAogICAgICAgIGkxLAogICAgICAgIGkyLAogICAgICAgIGNvb3JkcywKICAgICAgICBub3JtYWxzLAogICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZXMsCiAgICAgICAgaW5zZXJ0ZWRJbmRleCwKICAgICAgICB0cnVlCiAgICAgICk7CiAgICB9CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGV4dHJ1ZGVEaXJlY3Rpb25zKSkgewogICAgICBjb25zdCBkMCA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoZXh0cnVkZURpcmVjdGlvbnMsIGkwICogMywgcDBTY3JhdGNoKTsKICAgICAgY29uc3QgZDEgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KGV4dHJ1ZGVEaXJlY3Rpb25zLCBpMSAqIDMsIHAxU2NyYXRjaCk7CiAgICAgIGNvbnN0IGQyID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShleHRydWRlRGlyZWN0aW9ucywgaTIgKiAzLCBwMlNjcmF0Y2gpOwogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihkMCwgY29vcmRzLngsIGQwKTsKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoZDEsIGNvb3Jkcy55LCBkMSk7CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKGQyLCBjb29yZHMueiwgZDIpOwogICAgICBsZXQgZGlyZWN0aW9uMjsKICAgICAgaWYgKCFDYXJ0ZXNpYW4zX2RlZmF1bHQuZXF1YWxzKGQwLCBDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTykgfHwgIUNhcnRlc2lhbjNfZGVmYXVsdC5lcXVhbHMoZDEsIENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPKSB8fCAhQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFscyhkMiwgQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8pKSB7CiAgICAgICAgZGlyZWN0aW9uMiA9IENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoZDAsIGQxLCBkMCk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChkaXJlY3Rpb24yLCBkMiwgZGlyZWN0aW9uMik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShkaXJlY3Rpb24yLCBkaXJlY3Rpb24yKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkaXJlY3Rpb24yID0gcDBTY3JhdGNoOwogICAgICAgIGRpcmVjdGlvbjIueCA9IDA7CiAgICAgICAgZGlyZWN0aW9uMi55ID0gMDsKICAgICAgICBkaXJlY3Rpb24yLnogPSAwOwogICAgICB9CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKAogICAgICAgIGRpcmVjdGlvbjIsCiAgICAgICAgY3VycmVudEF0dHJpYnV0ZXMuZXh0cnVkZURpcmVjdGlvbi52YWx1ZXMsCiAgICAgICAgaW5zZXJ0ZWRJbmRleCAqIDMKICAgICAgKTsKICAgIH0KICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoYXBwbHlPZmZzZXQpKSB7CiAgICAgIGludGVycG9sYXRlQW5kUGFja0Jvb2xlYW4oCiAgICAgICAgaTAsCiAgICAgICAgaTEsCiAgICAgICAgaTIsCiAgICAgICAgY29vcmRzLAogICAgICAgIGFwcGx5T2Zmc2V0LAogICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0LnZhbHVlcywKICAgICAgICBpbnNlcnRlZEluZGV4CiAgICAgICk7CiAgICB9CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHRhbmdlbnRzKSkgewogICAgICBpbnRlcnBvbGF0ZUFuZFBhY2tDYXJ0ZXNpYW4zKAogICAgICAgIGkwLAogICAgICAgIGkxLAogICAgICAgIGkyLAogICAgICAgIGNvb3JkcywKICAgICAgICB0YW5nZW50cywKICAgICAgICBjdXJyZW50QXR0cmlidXRlcy50YW5nZW50LnZhbHVlcywKICAgICAgICBpbnNlcnRlZEluZGV4LAogICAgICAgIHRydWUKICAgICAgKTsKICAgIH0KICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoYml0YW5nZW50cykpIHsKICAgICAgaW50ZXJwb2xhdGVBbmRQYWNrQ2FydGVzaWFuMygKICAgICAgICBpMCwKICAgICAgICBpMSwKICAgICAgICBpMiwKICAgICAgICBjb29yZHMsCiAgICAgICAgYml0YW5nZW50cywKICAgICAgICBjdXJyZW50QXR0cmlidXRlcy5iaXRhbmdlbnQudmFsdWVzLAogICAgICAgIGluc2VydGVkSW5kZXgsCiAgICAgICAgdHJ1ZQogICAgICApOwogICAgfQogICAgaWYgKGRlZmluZWRfZGVmYXVsdCh0ZXhDb29yZHMpKSB7CiAgICAgIGludGVycG9sYXRlQW5kUGFja0NhcnRlc2lhbjIoCiAgICAgICAgaTAsCiAgICAgICAgaTEsCiAgICAgICAgaTIsCiAgICAgICAgY29vcmRzLAogICAgICAgIHRleENvb3JkcywKICAgICAgICBjdXJyZW50QXR0cmlidXRlcy5zdC52YWx1ZXMsCiAgICAgICAgaW5zZXJ0ZWRJbmRleAogICAgICApOwogICAgfQogICAgaWYgKGN1c3RvbUF0dHJpYnV0ZXNMZW5ndGggPiAwKSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VzdG9tQXR0cmlidXRlc0xlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGN1c3RvbUF0dHJpYnV0ZU5hbWVzW2ldOwogICAgICAgIGdlbmVyaWNJbnRlcnBvbGF0ZSgKICAgICAgICAgIGkwLAogICAgICAgICAgaTEsCiAgICAgICAgICBpMiwKICAgICAgICAgIGNvb3JkcywKICAgICAgICAgIGluc2VydGVkSW5kZXgsCiAgICAgICAgICBhbGxBdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdLAogICAgICAgICAgY3VycmVudEF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0KICAgICAgICApOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGdlbmVyaWNJbnRlcnBvbGF0ZShpMCwgaTEsIGkyLCBjb29yZHMsIGluc2VydGVkSW5kZXgsIHNvdXJjZUF0dHJpYnV0ZSwgY3VycmVudEF0dHJpYnV0ZSkgewogICAgY29uc3QgY29tcG9uZW50c1BlckF0dHJpYnV0ZSA9IHNvdXJjZUF0dHJpYnV0ZS5jb21wb25lbnRzUGVyQXR0cmlidXRlOwogICAgY29uc3Qgc291cmNlVmFsdWVzID0gc291cmNlQXR0cmlidXRlLnZhbHVlczsKICAgIGNvbnN0IGN1cnJlbnRWYWx1ZXMgPSBjdXJyZW50QXR0cmlidXRlLnZhbHVlczsKICAgIHN3aXRjaCAoY29tcG9uZW50c1BlckF0dHJpYnV0ZSkgewogICAgICBjYXNlIDQ6CiAgICAgICAgaW50ZXJwb2xhdGVBbmRQYWNrQ2FydGVzaWFuNCgKICAgICAgICAgIGkwLAogICAgICAgICAgaTEsCiAgICAgICAgICBpMiwKICAgICAgICAgIGNvb3JkcywKICAgICAgICAgIHNvdXJjZVZhbHVlcywKICAgICAgICAgIGN1cnJlbnRWYWx1ZXMsCiAgICAgICAgICBpbnNlcnRlZEluZGV4LAogICAgICAgICAgZmFsc2UKICAgICAgICApOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6CiAgICAgICAgaW50ZXJwb2xhdGVBbmRQYWNrQ2FydGVzaWFuMygKICAgICAgICAgIGkwLAogICAgICAgICAgaTEsCiAgICAgICAgICBpMiwKICAgICAgICAgIGNvb3JkcywKICAgICAgICAgIHNvdXJjZVZhbHVlcywKICAgICAgICAgIGN1cnJlbnRWYWx1ZXMsCiAgICAgICAgICBpbnNlcnRlZEluZGV4LAogICAgICAgICAgZmFsc2UKICAgICAgICApOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDI6CiAgICAgICAgaW50ZXJwb2xhdGVBbmRQYWNrQ2FydGVzaWFuMigKICAgICAgICAgIGkwLAogICAgICAgICAgaTEsCiAgICAgICAgICBpMiwKICAgICAgICAgIGNvb3JkcywKICAgICAgICAgIHNvdXJjZVZhbHVlcywKICAgICAgICAgIGN1cnJlbnRWYWx1ZXMsCiAgICAgICAgICBpbnNlcnRlZEluZGV4LAogICAgICAgICAgZmFsc2UKICAgICAgICApOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGN1cnJlbnRWYWx1ZXNbaW5zZXJ0ZWRJbmRleF0gPSBzb3VyY2VWYWx1ZXNbaTBdICogY29vcmRzLnggKyBzb3VyY2VWYWx1ZXNbaTFdICogY29vcmRzLnkgKyBzb3VyY2VWYWx1ZXNbaTJdICogY29vcmRzLno7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGluc2VydFNwbGl0UG9pbnQoY3VycmVudEF0dHJpYnV0ZXMsIGN1cnJlbnRJbmRpY2VzLCBjdXJyZW50SW5kZXhNYXAsIGluZGljZXMsIGN1cnJlbnRJbmRleCwgcG9pbnQpIHsKICAgIGNvbnN0IGluc2VydEluZGV4ID0gY3VycmVudEF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLmxlbmd0aCAvIDM7CiAgICBpZiAoY3VycmVudEluZGV4ICE9PSAtMSkgewogICAgICBjb25zdCBwcmV2SW5kZXggPSBpbmRpY2VzW2N1cnJlbnRJbmRleF07CiAgICAgIGNvbnN0IG5ld0luZGV4ID0gY3VycmVudEluZGV4TWFwW3ByZXZJbmRleF07CiAgICAgIGlmIChuZXdJbmRleCA9PT0gLTEpIHsKICAgICAgICBjdXJyZW50SW5kZXhNYXBbcHJldkluZGV4XSA9IGluc2VydEluZGV4OwogICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5wdXNoKHBvaW50LngsIHBvaW50LnksIHBvaW50LnopOwogICAgICAgIGN1cnJlbnRJbmRpY2VzLnB1c2goaW5zZXJ0SW5kZXgpOwogICAgICAgIHJldHVybiBpbnNlcnRJbmRleDsKICAgICAgfQogICAgICBjdXJyZW50SW5kaWNlcy5wdXNoKG5ld0luZGV4KTsKICAgICAgcmV0dXJuIG5ld0luZGV4OwogICAgfQogICAgY3VycmVudEF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLnB1c2gocG9pbnQueCwgcG9pbnQueSwgcG9pbnQueik7CiAgICBjdXJyZW50SW5kaWNlcy5wdXNoKGluc2VydEluZGV4KTsKICAgIHJldHVybiBpbnNlcnRJbmRleDsKICB9CiAgZnVuY3Rpb24gc3BsaXRMb25naXR1ZGVUcmlhbmdsZXMoaW5zdGFuY2UpIHsKICAgIGNvbnN0IGdlb21ldHJ5ID0gaW5zdGFuY2UuZ2VvbWV0cnk7CiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlczsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzOwogICAgY29uc3Qgbm9ybWFscyA9IGRlZmluZWRfZGVmYXVsdChhdHRyaWJ1dGVzLm5vcm1hbCkgPyBhdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZXMgOiB2b2lkIDA7CiAgICBjb25zdCBiaXRhbmdlbnRzID0gZGVmaW5lZF9kZWZhdWx0KGF0dHJpYnV0ZXMuYml0YW5nZW50KSA/IGF0dHJpYnV0ZXMuYml0YW5nZW50LnZhbHVlcyA6IHZvaWQgMDsKICAgIGNvbnN0IHRhbmdlbnRzID0gZGVmaW5lZF9kZWZhdWx0KGF0dHJpYnV0ZXMudGFuZ2VudCkgPyBhdHRyaWJ1dGVzLnRhbmdlbnQudmFsdWVzIDogdm9pZCAwOwogICAgY29uc3QgdGV4Q29vcmRzID0gZGVmaW5lZF9kZWZhdWx0KGF0dHJpYnV0ZXMuc3QpID8gYXR0cmlidXRlcy5zdC52YWx1ZXMgOiB2b2lkIDA7CiAgICBjb25zdCBleHRydWRlRGlyZWN0aW9ucyA9IGRlZmluZWRfZGVmYXVsdChhdHRyaWJ1dGVzLmV4dHJ1ZGVEaXJlY3Rpb24pID8gYXR0cmlidXRlcy5leHRydWRlRGlyZWN0aW9uLnZhbHVlcyA6IHZvaWQgMDsKICAgIGNvbnN0IGFwcGx5T2Zmc2V0ID0gZGVmaW5lZF9kZWZhdWx0KGF0dHJpYnV0ZXMuYXBwbHlPZmZzZXQpID8gYXR0cmlidXRlcy5hcHBseU9mZnNldC52YWx1ZXMgOiB2b2lkIDA7CiAgICBjb25zdCBpbmRpY2VzID0gZ2VvbWV0cnkuaW5kaWNlczsKICAgIGNvbnN0IGN1c3RvbUF0dHJpYnV0ZU5hbWVzID0gW107CiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgaW4gYXR0cmlidXRlcykgewogICAgICBpZiAoYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShhdHRyaWJ1dGVOYW1lKSAmJiAhTkFNRURfQVRUUklCVVRFU1thdHRyaWJ1dGVOYW1lXSAmJiBkZWZpbmVkX2RlZmF1bHQoYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSkpIHsKICAgICAgICBjdXN0b21BdHRyaWJ1dGVOYW1lcy5wdXNoKGF0dHJpYnV0ZU5hbWUpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBjdXN0b21BdHRyaWJ1dGVzTGVuZ3RoID0gY3VzdG9tQXR0cmlidXRlTmFtZXMubGVuZ3RoOwogICAgY29uc3QgZWFzdEdlb21ldHJ5ID0gY29weUdlb21ldHJ5Rm9yU3BsaXQoZ2VvbWV0cnkpOwogICAgY29uc3Qgd2VzdEdlb21ldHJ5ID0gY29weUdlb21ldHJ5Rm9yU3BsaXQoZ2VvbWV0cnkpOwogICAgbGV0IGN1cnJlbnRBdHRyaWJ1dGVzOwogICAgbGV0IGN1cnJlbnRJbmRpY2VzOwogICAgbGV0IGN1cnJlbnRJbmRleE1hcDsKICAgIGxldCBpbnNlcnRlZEluZGV4OwogICAgbGV0IGk7CiAgICBjb25zdCB3ZXN0R2VvbWV0cnlJbmRleE1hcCA9IFtdOwogICAgd2VzdEdlb21ldHJ5SW5kZXhNYXAubGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aCAvIDM7CiAgICBjb25zdCBlYXN0R2VvbWV0cnlJbmRleE1hcCA9IFtdOwogICAgZWFzdEdlb21ldHJ5SW5kZXhNYXAubGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aCAvIDM7CiAgICBmb3IgKGkgPSAwOyBpIDwgd2VzdEdlb21ldHJ5SW5kZXhNYXAubGVuZ3RoOyArK2kpIHsKICAgICAgd2VzdEdlb21ldHJ5SW5kZXhNYXBbaV0gPSAtMTsKICAgICAgZWFzdEdlb21ldHJ5SW5kZXhNYXBbaV0gPSAtMTsKICAgIH0KICAgIGNvbnN0IGxlbiA9IGluZGljZXMubGVuZ3RoOwogICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAzKSB7CiAgICAgIGNvbnN0IGkwID0gaW5kaWNlc1tpXTsKICAgICAgY29uc3QgaTEgPSBpbmRpY2VzW2kgKyAxXTsKICAgICAgY29uc3QgaTIgPSBpbmRpY2VzW2kgKyAyXTsKICAgICAgbGV0IHAwID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShwb3NpdGlvbnMsIGkwICogMyk7CiAgICAgIGxldCBwMSA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkocG9zaXRpb25zLCBpMSAqIDMpOwogICAgICBsZXQgcDIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KHBvc2l0aW9ucywgaTIgKiAzKTsKICAgICAgY29uc3QgcmVzdWx0ID0gc3BsaXRUcmlhbmdsZShwMCwgcDEsIHAyKTsKICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChyZXN1bHQpICYmIHJlc3VsdC5wb3NpdGlvbnMubGVuZ3RoID4gMykgewogICAgICAgIGNvbnN0IHJlc3VsdFBvc2l0aW9ucyA9IHJlc3VsdC5wb3NpdGlvbnM7CiAgICAgICAgY29uc3QgcmVzdWx0SW5kaWNlcyA9IHJlc3VsdC5pbmRpY2VzOwogICAgICAgIGNvbnN0IHJlc3VsdExlbmd0aCA9IHJlc3VsdEluZGljZXMubGVuZ3RoOwogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVzdWx0TGVuZ3RoOyArK2opIHsKICAgICAgICAgIGNvbnN0IHJlc3VsdEluZGV4ID0gcmVzdWx0SW5kaWNlc1tqXTsKICAgICAgICAgIGNvbnN0IHBvaW50ID0gcmVzdWx0UG9zaXRpb25zW3Jlc3VsdEluZGV4XTsKICAgICAgICAgIGlmIChwb2ludC55IDwgMCkgewogICAgICAgICAgICBjdXJyZW50QXR0cmlidXRlcyA9IHdlc3RHZW9tZXRyeS5hdHRyaWJ1dGVzOwogICAgICAgICAgICBjdXJyZW50SW5kaWNlcyA9IHdlc3RHZW9tZXRyeS5pbmRpY2VzOwogICAgICAgICAgICBjdXJyZW50SW5kZXhNYXAgPSB3ZXN0R2VvbWV0cnlJbmRleE1hcDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVzID0gZWFzdEdlb21ldHJ5LmF0dHJpYnV0ZXM7CiAgICAgICAgICAgIGN1cnJlbnRJbmRpY2VzID0gZWFzdEdlb21ldHJ5LmluZGljZXM7CiAgICAgICAgICAgIGN1cnJlbnRJbmRleE1hcCA9IGVhc3RHZW9tZXRyeUluZGV4TWFwOwogICAgICAgICAgfQogICAgICAgICAgaW5zZXJ0ZWRJbmRleCA9IGluc2VydFNwbGl0UG9pbnQoCiAgICAgICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVzLAogICAgICAgICAgICBjdXJyZW50SW5kaWNlcywKICAgICAgICAgICAgY3VycmVudEluZGV4TWFwLAogICAgICAgICAgICBpbmRpY2VzLAogICAgICAgICAgICByZXN1bHRJbmRleCA8IDMgPyBpICsgcmVzdWx0SW5kZXggOiAtMSwKICAgICAgICAgICAgcG9pbnQKICAgICAgICAgICk7CiAgICAgICAgICBjb21wdXRlVHJpYW5nbGVBdHRyaWJ1dGVzKAogICAgICAgICAgICBpMCwKICAgICAgICAgICAgaTEsCiAgICAgICAgICAgIGkyLAogICAgICAgICAgICBwb2ludCwKICAgICAgICAgICAgcG9zaXRpb25zLAogICAgICAgICAgICBub3JtYWxzLAogICAgICAgICAgICB0YW5nZW50cywKICAgICAgICAgICAgYml0YW5nZW50cywKICAgICAgICAgICAgdGV4Q29vcmRzLAogICAgICAgICAgICBleHRydWRlRGlyZWN0aW9ucywKICAgICAgICAgICAgYXBwbHlPZmZzZXQsCiAgICAgICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVzLAogICAgICAgICAgICBjdXN0b21BdHRyaWJ1dGVOYW1lcywKICAgICAgICAgICAgY3VzdG9tQXR0cmlidXRlc0xlbmd0aCwKICAgICAgICAgICAgYXR0cmlidXRlcywKICAgICAgICAgICAgaW5zZXJ0ZWRJbmRleAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICBwMCA9IHJlc3VsdC5wb3NpdGlvbnNbMF07CiAgICAgICAgICBwMSA9IHJlc3VsdC5wb3NpdGlvbnNbMV07CiAgICAgICAgICBwMiA9IHJlc3VsdC5wb3NpdGlvbnNbMl07CiAgICAgICAgfQogICAgICAgIGlmIChwMC55IDwgMCkgewogICAgICAgICAgY3VycmVudEF0dHJpYnV0ZXMgPSB3ZXN0R2VvbWV0cnkuYXR0cmlidXRlczsKICAgICAgICAgIGN1cnJlbnRJbmRpY2VzID0gd2VzdEdlb21ldHJ5LmluZGljZXM7CiAgICAgICAgICBjdXJyZW50SW5kZXhNYXAgPSB3ZXN0R2VvbWV0cnlJbmRleE1hcDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudEF0dHJpYnV0ZXMgPSBlYXN0R2VvbWV0cnkuYXR0cmlidXRlczsKICAgICAgICAgIGN1cnJlbnRJbmRpY2VzID0gZWFzdEdlb21ldHJ5LmluZGljZXM7CiAgICAgICAgICBjdXJyZW50SW5kZXhNYXAgPSBlYXN0R2VvbWV0cnlJbmRleE1hcDsKICAgICAgICB9CiAgICAgICAgaW5zZXJ0ZWRJbmRleCA9IGluc2VydFNwbGl0UG9pbnQoCiAgICAgICAgICBjdXJyZW50QXR0cmlidXRlcywKICAgICAgICAgIGN1cnJlbnRJbmRpY2VzLAogICAgICAgICAgY3VycmVudEluZGV4TWFwLAogICAgICAgICAgaW5kaWNlcywKICAgICAgICAgIGksCiAgICAgICAgICBwMAogICAgICAgICk7CiAgICAgICAgY29tcHV0ZVRyaWFuZ2xlQXR0cmlidXRlcygKICAgICAgICAgIGkwLAogICAgICAgICAgaTEsCiAgICAgICAgICBpMiwKICAgICAgICAgIHAwLAogICAgICAgICAgcG9zaXRpb25zLAogICAgICAgICAgbm9ybWFscywKICAgICAgICAgIHRhbmdlbnRzLAogICAgICAgICAgYml0YW5nZW50cywKICAgICAgICAgIHRleENvb3JkcywKICAgICAgICAgIGV4dHJ1ZGVEaXJlY3Rpb25zLAogICAgICAgICAgYXBwbHlPZmZzZXQsCiAgICAgICAgICBjdXJyZW50QXR0cmlidXRlcywKICAgICAgICAgIGN1c3RvbUF0dHJpYnV0ZU5hbWVzLAogICAgICAgICAgY3VzdG9tQXR0cmlidXRlc0xlbmd0aCwKICAgICAgICAgIGF0dHJpYnV0ZXMsCiAgICAgICAgICBpbnNlcnRlZEluZGV4CiAgICAgICAgKTsKICAgICAgICBpbnNlcnRlZEluZGV4ID0gaW5zZXJ0U3BsaXRQb2ludCgKICAgICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVzLAogICAgICAgICAgY3VycmVudEluZGljZXMsCiAgICAgICAgICBjdXJyZW50SW5kZXhNYXAsCiAgICAgICAgICBpbmRpY2VzLAogICAgICAgICAgaSArIDEsCiAgICAgICAgICBwMQogICAgICAgICk7CiAgICAgICAgY29tcHV0ZVRyaWFuZ2xlQXR0cmlidXRlcygKICAgICAgICAgIGkwLAogICAgICAgICAgaTEsCiAgICAgICAgICBpMiwKICAgICAgICAgIHAxLAogICAgICAgICAgcG9zaXRpb25zLAogICAgICAgICAgbm9ybWFscywKICAgICAgICAgIHRhbmdlbnRzLAogICAgICAgICAgYml0YW5nZW50cywKICAgICAgICAgIHRleENvb3JkcywKICAgICAgICAgIGV4dHJ1ZGVEaXJlY3Rpb25zLAogICAgICAgICAgYXBwbHlPZmZzZXQsCiAgICAgICAgICBjdXJyZW50QXR0cmlidXRlcywKICAgICAgICAgIGN1c3RvbUF0dHJpYnV0ZU5hbWVzLAogICAgICAgICAgY3VzdG9tQXR0cmlidXRlc0xlbmd0aCwKICAgICAgICAgIGF0dHJpYnV0ZXMsCiAgICAgICAgICBpbnNlcnRlZEluZGV4CiAgICAgICAgKTsKICAgICAgICBpbnNlcnRlZEluZGV4ID0gaW5zZXJ0U3BsaXRQb2ludCgKICAgICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVzLAogICAgICAgICAgY3VycmVudEluZGljZXMsCiAgICAgICAgICBjdXJyZW50SW5kZXhNYXAsCiAgICAgICAgICBpbmRpY2VzLAogICAgICAgICAgaSArIDIsCiAgICAgICAgICBwMgogICAgICAgICk7CiAgICAgICAgY29tcHV0ZVRyaWFuZ2xlQXR0cmlidXRlcygKICAgICAgICAgIGkwLAogICAgICAgICAgaTEsCiAgICAgICAgICBpMiwKICAgICAgICAgIHAyLAogICAgICAgICAgcG9zaXRpb25zLAogICAgICAgICAgbm9ybWFscywKICAgICAgICAgIHRhbmdlbnRzLAogICAgICAgICAgYml0YW5nZW50cywKICAgICAgICAgIHRleENvb3JkcywKICAgICAgICAgIGV4dHJ1ZGVEaXJlY3Rpb25zLAogICAgICAgICAgYXBwbHlPZmZzZXQsCiAgICAgICAgICBjdXJyZW50QXR0cmlidXRlcywKICAgICAgICAgIGN1c3RvbUF0dHJpYnV0ZU5hbWVzLAogICAgICAgICAgY3VzdG9tQXR0cmlidXRlc0xlbmd0aCwKICAgICAgICAgIGF0dHJpYnV0ZXMsCiAgICAgICAgICBpbnNlcnRlZEluZGV4CiAgICAgICAgKTsKICAgICAgfQogICAgfQogICAgdXBkYXRlSW5zdGFuY2VBZnRlclNwbGl0KGluc3RhbmNlLCB3ZXN0R2VvbWV0cnksIGVhc3RHZW9tZXRyeSk7CiAgfQogIGZ1bmN0aW9uIGNvbXB1dGVMaW5lQXR0cmlidXRlcyhpMCwgaTEsIHBvaW50LCBwb3NpdGlvbnMsIGluc2VydEluZGV4LCBjdXJyZW50QXR0cmlidXRlcywgYXBwbHlPZmZzZXQpIHsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFwcGx5T2Zmc2V0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBwMCA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkocG9zaXRpb25zLCBpMCAqIDMsIHAwU2NyYXRjaCk7CiAgICBpZiAoQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24ocDAsIHBvaW50LCBNYXRoX2RlZmF1bHQuRVBTSUxPTjEwKSkgewogICAgICBjdXJyZW50QXR0cmlidXRlcy5hcHBseU9mZnNldC52YWx1ZXNbaW5zZXJ0SW5kZXhdID0gYXBwbHlPZmZzZXRbaTBdOwogICAgfSBlbHNlIHsKICAgICAgY3VycmVudEF0dHJpYnV0ZXMuYXBwbHlPZmZzZXQudmFsdWVzW2luc2VydEluZGV4XSA9IGFwcGx5T2Zmc2V0W2kxXTsKICAgIH0KICB9CiAgZnVuY3Rpb24gc3BsaXRMb25naXR1ZGVMaW5lcyhpbnN0YW5jZSkgewogICAgY29uc3QgZ2VvbWV0cnkgPSBpbnN0YW5jZS5nZW9tZXRyeTsKICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOwogICAgY29uc3QgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXM7CiAgICBjb25zdCBhcHBseU9mZnNldCA9IGRlZmluZWRfZGVmYXVsdChhdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0KSA/IGF0dHJpYnV0ZXMuYXBwbHlPZmZzZXQudmFsdWVzIDogdm9pZCAwOwogICAgY29uc3QgaW5kaWNlcyA9IGdlb21ldHJ5LmluZGljZXM7CiAgICBjb25zdCBlYXN0R2VvbWV0cnkgPSBjb3B5R2VvbWV0cnlGb3JTcGxpdChnZW9tZXRyeSk7CiAgICBjb25zdCB3ZXN0R2VvbWV0cnkgPSBjb3B5R2VvbWV0cnlGb3JTcGxpdChnZW9tZXRyeSk7CiAgICBsZXQgaTsKICAgIGNvbnN0IGxlbmd0aCA9IGluZGljZXMubGVuZ3RoOwogICAgY29uc3Qgd2VzdEdlb21ldHJ5SW5kZXhNYXAgPSBbXTsKICAgIHdlc3RHZW9tZXRyeUluZGV4TWFwLmxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGggLyAzOwogICAgY29uc3QgZWFzdEdlb21ldHJ5SW5kZXhNYXAgPSBbXTsKICAgIGVhc3RHZW9tZXRyeUluZGV4TWFwLmxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGggLyAzOwogICAgZm9yIChpID0gMDsgaSA8IHdlc3RHZW9tZXRyeUluZGV4TWFwLmxlbmd0aDsgKytpKSB7CiAgICAgIHdlc3RHZW9tZXRyeUluZGV4TWFwW2ldID0gLTE7CiAgICAgIGVhc3RHZW9tZXRyeUluZGV4TWFwW2ldID0gLTE7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDIpIHsKICAgICAgY29uc3QgaTAgPSBpbmRpY2VzW2ldOwogICAgICBjb25zdCBpMSA9IGluZGljZXNbaSArIDFdOwogICAgICBjb25zdCBwMCA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkocG9zaXRpb25zLCBpMCAqIDMsIHAwU2NyYXRjaCk7CiAgICAgIGNvbnN0IHAxID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShwb3NpdGlvbnMsIGkxICogMywgcDFTY3JhdGNoKTsKICAgICAgbGV0IGluc2VydEluZGV4OwogICAgICBpZiAoTWF0aC5hYnMocDAueSkgPCBNYXRoX2RlZmF1bHQuRVBTSUxPTjYpIHsKICAgICAgICBpZiAocDAueSA8IDApIHsKICAgICAgICAgIHAwLnkgPSAtTWF0aF9kZWZhdWx0LkVQU0lMT042OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwMC55ID0gTWF0aF9kZWZhdWx0LkVQU0lMT042OwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoTWF0aC5hYnMocDEueSkgPCBNYXRoX2RlZmF1bHQuRVBTSUxPTjYpIHsKICAgICAgICBpZiAocDEueSA8IDApIHsKICAgICAgICAgIHAxLnkgPSAtTWF0aF9kZWZhdWx0LkVQU0lMT042OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwMS55ID0gTWF0aF9kZWZhdWx0LkVQU0lMT042OwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgcDBBdHRyaWJ1dGVzID0gZWFzdEdlb21ldHJ5LmF0dHJpYnV0ZXM7CiAgICAgIGxldCBwMEluZGljZXMgPSBlYXN0R2VvbWV0cnkuaW5kaWNlczsKICAgICAgbGV0IHAwSW5kZXhNYXAgPSBlYXN0R2VvbWV0cnlJbmRleE1hcDsKICAgICAgbGV0IHAxQXR0cmlidXRlcyA9IHdlc3RHZW9tZXRyeS5hdHRyaWJ1dGVzOwogICAgICBsZXQgcDFJbmRpY2VzID0gd2VzdEdlb21ldHJ5LmluZGljZXM7CiAgICAgIGxldCBwMUluZGV4TWFwID0gd2VzdEdlb21ldHJ5SW5kZXhNYXA7CiAgICAgIGNvbnN0IGludGVyc2VjdGlvbiA9IEludGVyc2VjdGlvblRlc3RzX2RlZmF1bHQubGluZVNlZ21lbnRQbGFuZSgKICAgICAgICBwMCwKICAgICAgICBwMSwKICAgICAgICB4elBsYW5lLAogICAgICAgIHAyU2NyYXRjaAogICAgICApOwogICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGludGVyc2VjdGlvbikpIHsKICAgICAgICBjb25zdCBvZmZzZXQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcigKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5VTklUX1ksCiAgICAgICAgICA1ICogTWF0aF9kZWZhdWx0LkVQU0lMT045LAogICAgICAgICAgb2Zmc2V0U2NyYXRjaAogICAgICAgICk7CiAgICAgICAgaWYgKHAwLnkgPCAwKSB7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKG9mZnNldCwgb2Zmc2V0KTsKICAgICAgICAgIHAwQXR0cmlidXRlcyA9IHdlc3RHZW9tZXRyeS5hdHRyaWJ1dGVzOwogICAgICAgICAgcDBJbmRpY2VzID0gd2VzdEdlb21ldHJ5LmluZGljZXM7CiAgICAgICAgICBwMEluZGV4TWFwID0gd2VzdEdlb21ldHJ5SW5kZXhNYXA7CiAgICAgICAgICBwMUF0dHJpYnV0ZXMgPSBlYXN0R2VvbWV0cnkuYXR0cmlidXRlczsKICAgICAgICAgIHAxSW5kaWNlcyA9IGVhc3RHZW9tZXRyeS5pbmRpY2VzOwogICAgICAgICAgcDFJbmRleE1hcCA9IGVhc3RHZW9tZXRyeUluZGV4TWFwOwogICAgICAgIH0KICAgICAgICBjb25zdCBvZmZzZXRQb2ludCA9IENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoCiAgICAgICAgICBpbnRlcnNlY3Rpb24sCiAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICBvZmZzZXRQb2ludFNjcmF0Y2gKICAgICAgICApOwogICAgICAgIGluc2VydEluZGV4ID0gaW5zZXJ0U3BsaXRQb2ludCgKICAgICAgICAgIHAwQXR0cmlidXRlcywKICAgICAgICAgIHAwSW5kaWNlcywKICAgICAgICAgIHAwSW5kZXhNYXAsCiAgICAgICAgICBpbmRpY2VzLAogICAgICAgICAgaSwKICAgICAgICAgIHAwCiAgICAgICAgKTsKICAgICAgICBjb21wdXRlTGluZUF0dHJpYnV0ZXMoCiAgICAgICAgICBpMCwKICAgICAgICAgIGkxLAogICAgICAgICAgcDAsCiAgICAgICAgICBwb3NpdGlvbnMsCiAgICAgICAgICBpbnNlcnRJbmRleCwKICAgICAgICAgIHAwQXR0cmlidXRlcywKICAgICAgICAgIGFwcGx5T2Zmc2V0CiAgICAgICAgKTsKICAgICAgICBpbnNlcnRJbmRleCA9IGluc2VydFNwbGl0UG9pbnQoCiAgICAgICAgICBwMEF0dHJpYnV0ZXMsCiAgICAgICAgICBwMEluZGljZXMsCiAgICAgICAgICBwMEluZGV4TWFwLAogICAgICAgICAgaW5kaWNlcywKICAgICAgICAgIC0xLAogICAgICAgICAgb2Zmc2V0UG9pbnQKICAgICAgICApOwogICAgICAgIGNvbXB1dGVMaW5lQXR0cmlidXRlcygKICAgICAgICAgIGkwLAogICAgICAgICAgaTEsCiAgICAgICAgICBvZmZzZXRQb2ludCwKICAgICAgICAgIHBvc2l0aW9ucywKICAgICAgICAgIGluc2VydEluZGV4LAogICAgICAgICAgcDBBdHRyaWJ1dGVzLAogICAgICAgICAgYXBwbHlPZmZzZXQKICAgICAgICApOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5uZWdhdGUob2Zmc2V0LCBvZmZzZXQpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoaW50ZXJzZWN0aW9uLCBvZmZzZXQsIG9mZnNldFBvaW50KTsKICAgICAgICBpbnNlcnRJbmRleCA9IGluc2VydFNwbGl0UG9pbnQoCiAgICAgICAgICBwMUF0dHJpYnV0ZXMsCiAgICAgICAgICBwMUluZGljZXMsCiAgICAgICAgICBwMUluZGV4TWFwLAogICAgICAgICAgaW5kaWNlcywKICAgICAgICAgIC0xLAogICAgICAgICAgb2Zmc2V0UG9pbnQKICAgICAgICApOwogICAgICAgIGNvbXB1dGVMaW5lQXR0cmlidXRlcygKICAgICAgICAgIGkwLAogICAgICAgICAgaTEsCiAgICAgICAgICBvZmZzZXRQb2ludCwKICAgICAgICAgIHBvc2l0aW9ucywKICAgICAgICAgIGluc2VydEluZGV4LAogICAgICAgICAgcDFBdHRyaWJ1dGVzLAogICAgICAgICAgYXBwbHlPZmZzZXQKICAgICAgICApOwogICAgICAgIGluc2VydEluZGV4ID0gaW5zZXJ0U3BsaXRQb2ludCgKICAgICAgICAgIHAxQXR0cmlidXRlcywKICAgICAgICAgIHAxSW5kaWNlcywKICAgICAgICAgIHAxSW5kZXhNYXAsCiAgICAgICAgICBpbmRpY2VzLAogICAgICAgICAgaSArIDEsCiAgICAgICAgICBwMQogICAgICAgICk7CiAgICAgICAgY29tcHV0ZUxpbmVBdHRyaWJ1dGVzKAogICAgICAgICAgaTAsCiAgICAgICAgICBpMSwKICAgICAgICAgIHAxLAogICAgICAgICAgcG9zaXRpb25zLAogICAgICAgICAgaW5zZXJ0SW5kZXgsCiAgICAgICAgICBwMUF0dHJpYnV0ZXMsCiAgICAgICAgICBhcHBseU9mZnNldAogICAgICAgICk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGV0IGN1cnJlbnRBdHRyaWJ1dGVzOwogICAgICAgIGxldCBjdXJyZW50SW5kaWNlczsKICAgICAgICBsZXQgY3VycmVudEluZGV4TWFwOwogICAgICAgIGlmIChwMC55IDwgMCkgewogICAgICAgICAgY3VycmVudEF0dHJpYnV0ZXMgPSB3ZXN0R2VvbWV0cnkuYXR0cmlidXRlczsKICAgICAgICAgIGN1cnJlbnRJbmRpY2VzID0gd2VzdEdlb21ldHJ5LmluZGljZXM7CiAgICAgICAgICBjdXJyZW50SW5kZXhNYXAgPSB3ZXN0R2VvbWV0cnlJbmRleE1hcDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudEF0dHJpYnV0ZXMgPSBlYXN0R2VvbWV0cnkuYXR0cmlidXRlczsKICAgICAgICAgIGN1cnJlbnRJbmRpY2VzID0gZWFzdEdlb21ldHJ5LmluZGljZXM7CiAgICAgICAgICBjdXJyZW50SW5kZXhNYXAgPSBlYXN0R2VvbWV0cnlJbmRleE1hcDsKICAgICAgICB9CiAgICAgICAgaW5zZXJ0SW5kZXggPSBpbnNlcnRTcGxpdFBvaW50KAogICAgICAgICAgY3VycmVudEF0dHJpYnV0ZXMsCiAgICAgICAgICBjdXJyZW50SW5kaWNlcywKICAgICAgICAgIGN1cnJlbnRJbmRleE1hcCwKICAgICAgICAgIGluZGljZXMsCiAgICAgICAgICBpLAogICAgICAgICAgcDAKICAgICAgICApOwogICAgICAgIGNvbXB1dGVMaW5lQXR0cmlidXRlcygKICAgICAgICAgIGkwLAogICAgICAgICAgaTEsCiAgICAgICAgICBwMCwKICAgICAgICAgIHBvc2l0aW9ucywKICAgICAgICAgIGluc2VydEluZGV4LAogICAgICAgICAgY3VycmVudEF0dHJpYnV0ZXMsCiAgICAgICAgICBhcHBseU9mZnNldAogICAgICAgICk7CiAgICAgICAgaW5zZXJ0SW5kZXggPSBpbnNlcnRTcGxpdFBvaW50KAogICAgICAgICAgY3VycmVudEF0dHJpYnV0ZXMsCiAgICAgICAgICBjdXJyZW50SW5kaWNlcywKICAgICAgICAgIGN1cnJlbnRJbmRleE1hcCwKICAgICAgICAgIGluZGljZXMsCiAgICAgICAgICBpICsgMSwKICAgICAgICAgIHAxCiAgICAgICAgKTsKICAgICAgICBjb21wdXRlTGluZUF0dHJpYnV0ZXMoCiAgICAgICAgICBpMCwKICAgICAgICAgIGkxLAogICAgICAgICAgcDEsCiAgICAgICAgICBwb3NpdGlvbnMsCiAgICAgICAgICBpbnNlcnRJbmRleCwKICAgICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVzLAogICAgICAgICAgYXBwbHlPZmZzZXQKICAgICAgICApOwogICAgICB9CiAgICB9CiAgICB1cGRhdGVJbnN0YW5jZUFmdGVyU3BsaXQoaW5zdGFuY2UsIHdlc3RHZW9tZXRyeSwgZWFzdEdlb21ldHJ5KTsKICB9CiAgZnVuY3Rpb24gdXBkYXRlQWRqYWNlbmN5QWZ0ZXJTcGxpdChnZW9tZXRyeSkgewogICAgY29uc3QgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7CiAgICBjb25zdCBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlczsKICAgIGNvbnN0IHByZXZQb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnByZXZQb3NpdGlvbi52YWx1ZXM7CiAgICBjb25zdCBuZXh0UG9zaXRpb25zID0gYXR0cmlidXRlcy5uZXh0UG9zaXRpb24udmFsdWVzOwogICAgY29uc3QgbGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aDsKICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGVuZ3RoOyBqICs9IDMpIHsKICAgICAgY29uc3QgcG9zaXRpb24gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKHBvc2l0aW9ucywgaiwgY2FydGVzaWFuM1NjcmF0Y2gwKTsKICAgICAgaWYgKHBvc2l0aW9uLnggPiAwKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgcHJldlBvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjaygKICAgICAgICBwcmV2UG9zaXRpb25zLAogICAgICAgIGosCiAgICAgICAgY2FydGVzaWFuM1NjcmF0Y2gyCiAgICAgICk7CiAgICAgIGlmIChwb3NpdGlvbi55IDwgMCAmJiBwcmV2UG9zaXRpb24ueSA+IDAgfHwgcG9zaXRpb24ueSA+IDAgJiYgcHJldlBvc2l0aW9uLnkgPCAwKSB7CiAgICAgICAgaWYgKGogLSAzID4gMCkgewogICAgICAgICAgcHJldlBvc2l0aW9uc1tqXSA9IHBvc2l0aW9uc1tqIC0gM107CiAgICAgICAgICBwcmV2UG9zaXRpb25zW2ogKyAxXSA9IHBvc2l0aW9uc1tqIC0gMl07CiAgICAgICAgICBwcmV2UG9zaXRpb25zW2ogKyAyXSA9IHBvc2l0aW9uc1tqIC0gMV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKHBvc2l0aW9uLCBwcmV2UG9zaXRpb25zLCBqKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgbmV4dFBvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjaygKICAgICAgICBuZXh0UG9zaXRpb25zLAogICAgICAgIGosCiAgICAgICAgY2FydGVzaWFuM1NjcmF0Y2gzCiAgICAgICk7CiAgICAgIGlmIChwb3NpdGlvbi55IDwgMCAmJiBuZXh0UG9zaXRpb24ueSA+IDAgfHwgcG9zaXRpb24ueSA+IDAgJiYgbmV4dFBvc2l0aW9uLnkgPCAwKSB7CiAgICAgICAgaWYgKGogKyAzIDwgbGVuZ3RoKSB7CiAgICAgICAgICBuZXh0UG9zaXRpb25zW2pdID0gcG9zaXRpb25zW2ogKyAzXTsKICAgICAgICAgIG5leHRQb3NpdGlvbnNbaiArIDFdID0gcG9zaXRpb25zW2ogKyA0XTsKICAgICAgICAgIG5leHRQb3NpdGlvbnNbaiArIDJdID0gcG9zaXRpb25zW2ogKyA1XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2socG9zaXRpb24sIG5leHRQb3NpdGlvbnMsIGopOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBzcGxpdExvbmdpdHVkZVBvbHlsaW5lKGluc3RhbmNlKSB7CiAgICBjb25zdCBnZW9tZXRyeSA9IGluc3RhbmNlLmdlb21ldHJ5OwogICAgY29uc3QgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7CiAgICBjb25zdCBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlczsKICAgIGNvbnN0IHByZXZQb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnByZXZQb3NpdGlvbi52YWx1ZXM7CiAgICBjb25zdCBuZXh0UG9zaXRpb25zID0gYXR0cmlidXRlcy5uZXh0UG9zaXRpb24udmFsdWVzOwogICAgY29uc3QgZXhwYW5kQW5kV2lkdGhzID0gYXR0cmlidXRlcy5leHBhbmRBbmRXaWR0aC52YWx1ZXM7CiAgICBjb25zdCB0ZXhDb29yZHMgPSBkZWZpbmVkX2RlZmF1bHQoYXR0cmlidXRlcy5zdCkgPyBhdHRyaWJ1dGVzLnN0LnZhbHVlcyA6IHZvaWQgMDsKICAgIGNvbnN0IGNvbG9ycyA9IGRlZmluZWRfZGVmYXVsdChhdHRyaWJ1dGVzLmNvbG9yKSA/IGF0dHJpYnV0ZXMuY29sb3IudmFsdWVzIDogdm9pZCAwOwogICAgY29uc3QgZWFzdEdlb21ldHJ5ID0gY29weUdlb21ldHJ5Rm9yU3BsaXQoZ2VvbWV0cnkpOwogICAgY29uc3Qgd2VzdEdlb21ldHJ5ID0gY29weUdlb21ldHJ5Rm9yU3BsaXQoZ2VvbWV0cnkpOwogICAgbGV0IGk7CiAgICBsZXQgajsKICAgIGxldCBpbmRleDsKICAgIGxldCBpbnRlcnNlY3Rpb25Gb3VuZCA9IGZhbHNlOwogICAgY29uc3QgbGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aCAvIDM7CiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKICAgICAgY29uc3QgaTAgPSBpOwogICAgICBjb25zdCBpMiA9IGkgKyAyOwogICAgICBjb25zdCBwMCA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkocG9zaXRpb25zLCBpMCAqIDMsIGNhcnRlc2lhbjNTY3JhdGNoMCk7CiAgICAgIGNvbnN0IHAyID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShwb3NpdGlvbnMsIGkyICogMywgY2FydGVzaWFuM1NjcmF0Y2gyKTsKICAgICAgaWYgKE1hdGguYWJzKHAwLnkpIDwgY29wbGFuYXJPZmZzZXQpIHsKICAgICAgICBwMC55ID0gY29wbGFuYXJPZmZzZXQgKiAocDIueSA8IDAgPyAtMSA6IDEpOwogICAgICAgIHBvc2l0aW9uc1tpICogMyArIDFdID0gcDAueTsKICAgICAgICBwb3NpdGlvbnNbKGkgKyAxKSAqIDMgKyAxXSA9IHAwLnk7CiAgICAgICAgZm9yIChqID0gaTAgKiAzOyBqIDwgaTAgKiAzICsgNCAqIDM7IGogKz0gMykgewogICAgICAgICAgcHJldlBvc2l0aW9uc1tqXSA9IHBvc2l0aW9uc1tpICogM107CiAgICAgICAgICBwcmV2UG9zaXRpb25zW2ogKyAxXSA9IHBvc2l0aW9uc1tpICogMyArIDFdOwogICAgICAgICAgcHJldlBvc2l0aW9uc1tqICsgMl0gPSBwb3NpdGlvbnNbaSAqIDMgKyAyXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKE1hdGguYWJzKHAyLnkpIDwgY29wbGFuYXJPZmZzZXQpIHsKICAgICAgICBwMi55ID0gY29wbGFuYXJPZmZzZXQgKiAocDAueSA8IDAgPyAtMSA6IDEpOwogICAgICAgIHBvc2l0aW9uc1soaSArIDIpICogMyArIDFdID0gcDIueTsKICAgICAgICBwb3NpdGlvbnNbKGkgKyAzKSAqIDMgKyAxXSA9IHAyLnk7CiAgICAgICAgZm9yIChqID0gaTAgKiAzOyBqIDwgaTAgKiAzICsgNCAqIDM7IGogKz0gMykgewogICAgICAgICAgbmV4dFBvc2l0aW9uc1tqXSA9IHBvc2l0aW9uc1soaSArIDIpICogM107CiAgICAgICAgICBuZXh0UG9zaXRpb25zW2ogKyAxXSA9IHBvc2l0aW9uc1soaSArIDIpICogMyArIDFdOwogICAgICAgICAgbmV4dFBvc2l0aW9uc1tqICsgMl0gPSBwb3NpdGlvbnNbKGkgKyAyKSAqIDMgKyAyXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbGV0IHAwQXR0cmlidXRlcyA9IGVhc3RHZW9tZXRyeS5hdHRyaWJ1dGVzOwogICAgICBsZXQgcDBJbmRpY2VzID0gZWFzdEdlb21ldHJ5LmluZGljZXM7CiAgICAgIGxldCBwMkF0dHJpYnV0ZXMgPSB3ZXN0R2VvbWV0cnkuYXR0cmlidXRlczsKICAgICAgbGV0IHAySW5kaWNlcyA9IHdlc3RHZW9tZXRyeS5pbmRpY2VzOwogICAgICBjb25zdCBpbnRlcnNlY3Rpb24gPSBJbnRlcnNlY3Rpb25UZXN0c19kZWZhdWx0LmxpbmVTZWdtZW50UGxhbmUoCiAgICAgICAgcDAsCiAgICAgICAgcDIsCiAgICAgICAgeHpQbGFuZSwKICAgICAgICBjYXJ0ZXNpYW4zU2NyYXRjaDQKICAgICAgKTsKICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChpbnRlcnNlY3Rpb24pKSB7CiAgICAgICAgaW50ZXJzZWN0aW9uRm91bmQgPSB0cnVlOwogICAgICAgIGNvbnN0IG9mZnNldCA9IENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LlVOSVRfWSwKICAgICAgICAgIG9mZnNldFNjYWxhciwKICAgICAgICAgIGNhcnRlc2lhbjNTY3JhdGNoNQogICAgICAgICk7CiAgICAgICAgaWYgKHAwLnkgPCAwKSB7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKG9mZnNldCwgb2Zmc2V0KTsKICAgICAgICAgIHAwQXR0cmlidXRlcyA9IHdlc3RHZW9tZXRyeS5hdHRyaWJ1dGVzOwogICAgICAgICAgcDBJbmRpY2VzID0gd2VzdEdlb21ldHJ5LmluZGljZXM7CiAgICAgICAgICBwMkF0dHJpYnV0ZXMgPSBlYXN0R2VvbWV0cnkuYXR0cmlidXRlczsKICAgICAgICAgIHAySW5kaWNlcyA9IGVhc3RHZW9tZXRyeS5pbmRpY2VzOwogICAgICAgIH0KICAgICAgICBjb25zdCBvZmZzZXRQb2ludCA9IENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoCiAgICAgICAgICBpbnRlcnNlY3Rpb24sCiAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICBjYXJ0ZXNpYW4zU2NyYXRjaDYKICAgICAgICApOwogICAgICAgIHAwQXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMucHVzaChwMC54LCBwMC55LCBwMC56LCBwMC54LCBwMC55LCBwMC56KTsKICAgICAgICBwMEF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLnB1c2goCiAgICAgICAgICBvZmZzZXRQb2ludC54LAogICAgICAgICAgb2Zmc2V0UG9pbnQueSwKICAgICAgICAgIG9mZnNldFBvaW50LnoKICAgICAgICApOwogICAgICAgIHAwQXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMucHVzaCgKICAgICAgICAgIG9mZnNldFBvaW50LngsCiAgICAgICAgICBvZmZzZXRQb2ludC55LAogICAgICAgICAgb2Zmc2V0UG9pbnQuegogICAgICAgICk7CiAgICAgICAgcDBBdHRyaWJ1dGVzLnByZXZQb3NpdGlvbi52YWx1ZXMucHVzaCgKICAgICAgICAgIHByZXZQb3NpdGlvbnNbaTAgKiAzXSwKICAgICAgICAgIHByZXZQb3NpdGlvbnNbaTAgKiAzICsgMV0sCiAgICAgICAgICBwcmV2UG9zaXRpb25zW2kwICogMyArIDJdCiAgICAgICAgKTsKICAgICAgICBwMEF0dHJpYnV0ZXMucHJldlBvc2l0aW9uLnZhbHVlcy5wdXNoKAogICAgICAgICAgcHJldlBvc2l0aW9uc1tpMCAqIDMgKyAzXSwKICAgICAgICAgIHByZXZQb3NpdGlvbnNbaTAgKiAzICsgNF0sCiAgICAgICAgICBwcmV2UG9zaXRpb25zW2kwICogMyArIDVdCiAgICAgICAgKTsKICAgICAgICBwMEF0dHJpYnV0ZXMucHJldlBvc2l0aW9uLnZhbHVlcy5wdXNoKHAwLngsIHAwLnksIHAwLnosIHAwLngsIHAwLnksIHAwLnopOwogICAgICAgIHAwQXR0cmlidXRlcy5uZXh0UG9zaXRpb24udmFsdWVzLnB1c2goCiAgICAgICAgICBvZmZzZXRQb2ludC54LAogICAgICAgICAgb2Zmc2V0UG9pbnQueSwKICAgICAgICAgIG9mZnNldFBvaW50LnoKICAgICAgICApOwogICAgICAgIHAwQXR0cmlidXRlcy5uZXh0UG9zaXRpb24udmFsdWVzLnB1c2goCiAgICAgICAgICBvZmZzZXRQb2ludC54LAogICAgICAgICAgb2Zmc2V0UG9pbnQueSwKICAgICAgICAgIG9mZnNldFBvaW50LnoKICAgICAgICApOwogICAgICAgIHAwQXR0cmlidXRlcy5uZXh0UG9zaXRpb24udmFsdWVzLnB1c2goCiAgICAgICAgICBvZmZzZXRQb2ludC54LAogICAgICAgICAgb2Zmc2V0UG9pbnQueSwKICAgICAgICAgIG9mZnNldFBvaW50LnoKICAgICAgICApOwogICAgICAgIHAwQXR0cmlidXRlcy5uZXh0UG9zaXRpb24udmFsdWVzLnB1c2goCiAgICAgICAgICBvZmZzZXRQb2ludC54LAogICAgICAgICAgb2Zmc2V0UG9pbnQueSwKICAgICAgICAgIG9mZnNldFBvaW50LnoKICAgICAgICApOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5uZWdhdGUob2Zmc2V0LCBvZmZzZXQpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoaW50ZXJzZWN0aW9uLCBvZmZzZXQsIG9mZnNldFBvaW50KTsKICAgICAgICBwMkF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLnB1c2goCiAgICAgICAgICBvZmZzZXRQb2ludC54LAogICAgICAgICAgb2Zmc2V0UG9pbnQueSwKICAgICAgICAgIG9mZnNldFBvaW50LnoKICAgICAgICApOwogICAgICAgIHAyQXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMucHVzaCgKICAgICAgICAgIG9mZnNldFBvaW50LngsCiAgICAgICAgICBvZmZzZXRQb2ludC55LAogICAgICAgICAgb2Zmc2V0UG9pbnQuegogICAgICAgICk7CiAgICAgICAgcDJBdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5wdXNoKHAyLngsIHAyLnksIHAyLnosIHAyLngsIHAyLnksIHAyLnopOwogICAgICAgIHAyQXR0cmlidXRlcy5wcmV2UG9zaXRpb24udmFsdWVzLnB1c2goCiAgICAgICAgICBvZmZzZXRQb2ludC54LAogICAgICAgICAgb2Zmc2V0UG9pbnQueSwKICAgICAgICAgIG9mZnNldFBvaW50LnoKICAgICAgICApOwogICAgICAgIHAyQXR0cmlidXRlcy5wcmV2UG9zaXRpb24udmFsdWVzLnB1c2goCiAgICAgICAgICBvZmZzZXRQb2ludC54LAogICAgICAgICAgb2Zmc2V0UG9pbnQueSwKICAgICAgICAgIG9mZnNldFBvaW50LnoKICAgICAgICApOwogICAgICAgIHAyQXR0cmlidXRlcy5wcmV2UG9zaXRpb24udmFsdWVzLnB1c2goCiAgICAgICAgICBvZmZzZXRQb2ludC54LAogICAgICAgICAgb2Zmc2V0UG9pbnQueSwKICAgICAgICAgIG9mZnNldFBvaW50LnoKICAgICAgICApOwogICAgICAgIHAyQXR0cmlidXRlcy5wcmV2UG9zaXRpb24udmFsdWVzLnB1c2goCiAgICAgICAgICBvZmZzZXRQb2ludC54LAogICAgICAgICAgb2Zmc2V0UG9pbnQueSwKICAgICAgICAgIG9mZnNldFBvaW50LnoKICAgICAgICApOwogICAgICAgIHAyQXR0cmlidXRlcy5uZXh0UG9zaXRpb24udmFsdWVzLnB1c2gocDIueCwgcDIueSwgcDIueiwgcDIueCwgcDIueSwgcDIueik7CiAgICAgICAgcDJBdHRyaWJ1dGVzLm5leHRQb3NpdGlvbi52YWx1ZXMucHVzaCgKICAgICAgICAgIG5leHRQb3NpdGlvbnNbaTIgKiAzXSwKICAgICAgICAgIG5leHRQb3NpdGlvbnNbaTIgKiAzICsgMV0sCiAgICAgICAgICBuZXh0UG9zaXRpb25zW2kyICogMyArIDJdCiAgICAgICAgKTsKICAgICAgICBwMkF0dHJpYnV0ZXMubmV4dFBvc2l0aW9uLnZhbHVlcy5wdXNoKAogICAgICAgICAgbmV4dFBvc2l0aW9uc1tpMiAqIDMgKyAzXSwKICAgICAgICAgIG5leHRQb3NpdGlvbnNbaTIgKiAzICsgNF0sCiAgICAgICAgICBuZXh0UG9zaXRpb25zW2kyICogMyArIDVdCiAgICAgICAgKTsKICAgICAgICBjb25zdCBldzAgPSBDYXJ0ZXNpYW4yX2RlZmF1bHQuZnJvbUFycmF5KAogICAgICAgICAgZXhwYW5kQW5kV2lkdGhzLAogICAgICAgICAgaTAgKiAyLAogICAgICAgICAgY2FydGVzaWFuMlNjcmF0Y2gwCiAgICAgICAgKTsKICAgICAgICBjb25zdCB3aWR0aCA9IE1hdGguYWJzKGV3MC55KTsKICAgICAgICBwMEF0dHJpYnV0ZXMuZXhwYW5kQW5kV2lkdGgudmFsdWVzLnB1c2goLTEsIHdpZHRoLCAxLCB3aWR0aCk7CiAgICAgICAgcDBBdHRyaWJ1dGVzLmV4cGFuZEFuZFdpZHRoLnZhbHVlcy5wdXNoKC0xLCAtd2lkdGgsIDEsIC13aWR0aCk7CiAgICAgICAgcDJBdHRyaWJ1dGVzLmV4cGFuZEFuZFdpZHRoLnZhbHVlcy5wdXNoKC0xLCB3aWR0aCwgMSwgd2lkdGgpOwogICAgICAgIHAyQXR0cmlidXRlcy5leHBhbmRBbmRXaWR0aC52YWx1ZXMucHVzaCgtMSwgLXdpZHRoLCAxLCAtd2lkdGgpOwogICAgICAgIGxldCB0ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZVNxdWFyZWQoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoaW50ZXJzZWN0aW9uLCBwMCwgY2FydGVzaWFuM1NjcmF0Y2gzKQogICAgICAgICk7CiAgICAgICAgdCAvPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlU3F1YXJlZCgKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChwMiwgcDAsIGNhcnRlc2lhbjNTY3JhdGNoMykKICAgICAgICApOwogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoY29sb3JzKSkgewogICAgICAgICAgY29uc3QgYzAgPSBDYXJ0ZXNpYW40X2RlZmF1bHQuZnJvbUFycmF5KGNvbG9ycywgaTAgKiA0LCBjYXJ0ZXNpYW40U2NyYXRjaDApOwogICAgICAgICAgY29uc3QgYzIgPSBDYXJ0ZXNpYW40X2RlZmF1bHQuZnJvbUFycmF5KGNvbG9ycywgaTIgKiA0LCBjYXJ0ZXNpYW40U2NyYXRjaDApOwogICAgICAgICAgY29uc3QgciA9IE1hdGhfZGVmYXVsdC5sZXJwKGMwLngsIGMyLngsIHQpOwogICAgICAgICAgY29uc3QgZyA9IE1hdGhfZGVmYXVsdC5sZXJwKGMwLnksIGMyLnksIHQpOwogICAgICAgICAgY29uc3QgYiA9IE1hdGhfZGVmYXVsdC5sZXJwKGMwLnosIGMyLnosIHQpOwogICAgICAgICAgY29uc3QgYTMgPSBNYXRoX2RlZmF1bHQubGVycChjMC53LCBjMi53LCB0KTsKICAgICAgICAgIGZvciAoaiA9IGkwICogNDsgaiA8IGkwICogNCArIDIgKiA0OyArK2opIHsKICAgICAgICAgICAgcDBBdHRyaWJ1dGVzLmNvbG9yLnZhbHVlcy5wdXNoKGNvbG9yc1tqXSk7CiAgICAgICAgICB9CiAgICAgICAgICBwMEF0dHJpYnV0ZXMuY29sb3IudmFsdWVzLnB1c2gociwgZywgYiwgYTMpOwogICAgICAgICAgcDBBdHRyaWJ1dGVzLmNvbG9yLnZhbHVlcy5wdXNoKHIsIGcsIGIsIGEzKTsKICAgICAgICAgIHAyQXR0cmlidXRlcy5jb2xvci52YWx1ZXMucHVzaChyLCBnLCBiLCBhMyk7CiAgICAgICAgICBwMkF0dHJpYnV0ZXMuY29sb3IudmFsdWVzLnB1c2gociwgZywgYiwgYTMpOwogICAgICAgICAgZm9yIChqID0gaTIgKiA0OyBqIDwgaTIgKiA0ICsgMiAqIDQ7ICsraikgewogICAgICAgICAgICBwMkF0dHJpYnV0ZXMuY29sb3IudmFsdWVzLnB1c2goY29sb3JzW2pdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdCh0ZXhDb29yZHMpKSB7CiAgICAgICAgICBjb25zdCBzMCA9IENhcnRlc2lhbjJfZGVmYXVsdC5mcm9tQXJyYXkodGV4Q29vcmRzLCBpMCAqIDIsIGNhcnRlc2lhbjJTY3JhdGNoMCk7CiAgICAgICAgICBjb25zdCBzMyA9IENhcnRlc2lhbjJfZGVmYXVsdC5mcm9tQXJyYXkoCiAgICAgICAgICAgIHRleENvb3JkcywKICAgICAgICAgICAgKGkgKyAzKSAqIDIsCiAgICAgICAgICAgIGNhcnRlc2lhbjJTY3JhdGNoMQogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IHN4ID0gTWF0aF9kZWZhdWx0LmxlcnAoczAueCwgczMueCwgdCk7CiAgICAgICAgICBmb3IgKGogPSBpMCAqIDI7IGogPCBpMCAqIDIgKyAyICogMjsgKytqKSB7CiAgICAgICAgICAgIHAwQXR0cmlidXRlcy5zdC52YWx1ZXMucHVzaCh0ZXhDb29yZHNbal0pOwogICAgICAgICAgfQogICAgICAgICAgcDBBdHRyaWJ1dGVzLnN0LnZhbHVlcy5wdXNoKHN4LCBzMC55KTsKICAgICAgICAgIHAwQXR0cmlidXRlcy5zdC52YWx1ZXMucHVzaChzeCwgczMueSk7CiAgICAgICAgICBwMkF0dHJpYnV0ZXMuc3QudmFsdWVzLnB1c2goc3gsIHMwLnkpOwogICAgICAgICAgcDJBdHRyaWJ1dGVzLnN0LnZhbHVlcy5wdXNoKHN4LCBzMy55KTsKICAgICAgICAgIGZvciAoaiA9IGkyICogMjsgaiA8IGkyICogMiArIDIgKiAyOyArK2opIHsKICAgICAgICAgICAgcDJBdHRyaWJ1dGVzLnN0LnZhbHVlcy5wdXNoKHRleENvb3Jkc1tqXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGluZGV4ID0gcDBBdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGggLyAzIC0gNDsKICAgICAgICBwMEluZGljZXMucHVzaChpbmRleCwgaW5kZXggKyAyLCBpbmRleCArIDEpOwogICAgICAgIHAwSW5kaWNlcy5wdXNoKGluZGV4ICsgMSwgaW5kZXggKyAyLCBpbmRleCArIDMpOwogICAgICAgIGluZGV4ID0gcDJBdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGggLyAzIC0gNDsKICAgICAgICBwMkluZGljZXMucHVzaChpbmRleCwgaW5kZXggKyAyLCBpbmRleCArIDEpOwogICAgICAgIHAySW5kaWNlcy5wdXNoKGluZGV4ICsgMSwgaW5kZXggKyAyLCBpbmRleCArIDMpOwogICAgICB9IGVsc2UgewogICAgICAgIGxldCBjdXJyZW50QXR0cmlidXRlczsKICAgICAgICBsZXQgY3VycmVudEluZGljZXM7CiAgICAgICAgaWYgKHAwLnkgPCAwKSB7CiAgICAgICAgICBjdXJyZW50QXR0cmlidXRlcyA9IHdlc3RHZW9tZXRyeS5hdHRyaWJ1dGVzOwogICAgICAgICAgY3VycmVudEluZGljZXMgPSB3ZXN0R2VvbWV0cnkuaW5kaWNlczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudEF0dHJpYnV0ZXMgPSBlYXN0R2VvbWV0cnkuYXR0cmlidXRlczsKICAgICAgICAgIGN1cnJlbnRJbmRpY2VzID0gZWFzdEdlb21ldHJ5LmluZGljZXM7CiAgICAgICAgfQogICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5wdXNoKHAwLngsIHAwLnksIHAwLnopOwogICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5wdXNoKHAwLngsIHAwLnksIHAwLnopOwogICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5wdXNoKHAyLngsIHAyLnksIHAyLnopOwogICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5wdXNoKHAyLngsIHAyLnksIHAyLnopOwogICAgICAgIGZvciAoaiA9IGkgKiAzOyBqIDwgaSAqIDMgKyA0ICogMzsgKytqKSB7CiAgICAgICAgICBjdXJyZW50QXR0cmlidXRlcy5wcmV2UG9zaXRpb24udmFsdWVzLnB1c2gocHJldlBvc2l0aW9uc1tqXSk7CiAgICAgICAgICBjdXJyZW50QXR0cmlidXRlcy5uZXh0UG9zaXRpb24udmFsdWVzLnB1c2gobmV4dFBvc2l0aW9uc1tqXSk7CiAgICAgICAgfQogICAgICAgIGZvciAoaiA9IGkgKiAyOyBqIDwgaSAqIDIgKyA0ICogMjsgKytqKSB7CiAgICAgICAgICBjdXJyZW50QXR0cmlidXRlcy5leHBhbmRBbmRXaWR0aC52YWx1ZXMucHVzaChleHBhbmRBbmRXaWR0aHNbal0pOwogICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdCh0ZXhDb29yZHMpKSB7CiAgICAgICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVzLnN0LnZhbHVlcy5wdXNoKHRleENvb3Jkc1tqXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoY29sb3JzKSkgewogICAgICAgICAgZm9yIChqID0gaSAqIDQ7IGogPCBpICogNCArIDQgKiA0OyArK2opIHsKICAgICAgICAgICAgY3VycmVudEF0dHJpYnV0ZXMuY29sb3IudmFsdWVzLnB1c2goY29sb3JzW2pdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaW5kZXggPSBjdXJyZW50QXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoIC8gMyAtIDQ7CiAgICAgICAgY3VycmVudEluZGljZXMucHVzaChpbmRleCwgaW5kZXggKyAyLCBpbmRleCArIDEpOwogICAgICAgIGN1cnJlbnRJbmRpY2VzLnB1c2goaW5kZXggKyAxLCBpbmRleCArIDIsIGluZGV4ICsgMyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChpbnRlcnNlY3Rpb25Gb3VuZCkgewogICAgICB1cGRhdGVBZGphY2VuY3lBZnRlclNwbGl0KHdlc3RHZW9tZXRyeSk7CiAgICAgIHVwZGF0ZUFkamFjZW5jeUFmdGVyU3BsaXQoZWFzdEdlb21ldHJ5KTsKICAgIH0KICAgIHVwZGF0ZUluc3RhbmNlQWZ0ZXJTcGxpdChpbnN0YW5jZSwgd2VzdEdlb21ldHJ5LCBlYXN0R2VvbWV0cnkpOwogIH0KICB2YXIgR2VvbWV0cnlQaXBlbGluZSwgc2NyYXRjaFByb2plY3RUbzJEQ2FydGVzaWFuMywgc2NyYXRjaFByb2plY3RUbzJEQ2FydG9ncmFwaGljLCBlbmNvZGVkUmVzdWx0LCBzY3JhdGNoQ2FydGVzaWFuMzMsIGludmVyc2VUcmFuc3Bvc2UsIG5vcm1hbE1hdHJpeCwgdGVtcFNjcmF0Y2gsIG5vcm1hbCwgdjAsIHYxLCB2Miwgbm9ybWFsU2NyYXRjaDIsIG5vcm1hbFNjYWxlLCB0U2NyYXRjaCwgc2NyYXRjaENhcnRlc2lhbjIyLCB0b0VuY29kZTEsIHRvRW5jb2RlMiwgdG9FbmNvZGUzLCBlbmNvZGVSZXN1bHQyLCBjMywgdTEsIHUyLCBxMSwgcTIsIHNwbGl0VHJpYW5nbGVSZXN1bHQsIGludGVycG9sYXRlQW5kUGFja0NhcnRlc2lhbjQsIGludGVycG9sYXRlQW5kUGFja0NhcnRlc2lhbjMsIGludGVycG9sYXRlQW5kUGFja0NhcnRlc2lhbjIsIGludGVycG9sYXRlQW5kUGFja0Jvb2xlYW4sIHAwU2NyYXRjaCwgcDFTY3JhdGNoLCBwMlNjcmF0Y2gsIGJhcnljZW50cmljU2NyYXRjaCwgTkFNRURfQVRUUklCVVRFUywgeHpQbGFuZSwgb2Zmc2V0U2NyYXRjaCwgb2Zmc2V0UG9pbnRTY3JhdGNoLCBjYXJ0ZXNpYW4yU2NyYXRjaDAsIGNhcnRlc2lhbjJTY3JhdGNoMSwgY2FydGVzaWFuM1NjcmF0Y2gwLCBjYXJ0ZXNpYW4zU2NyYXRjaDIsIGNhcnRlc2lhbjNTY3JhdGNoMywgY2FydGVzaWFuM1NjcmF0Y2g0LCBjYXJ0ZXNpYW4zU2NyYXRjaDUsIGNhcnRlc2lhbjNTY3JhdGNoNiwgY2FydGVzaWFuNFNjcmF0Y2gwLCBvZmZzZXRTY2FsYXIsIGNvcGxhbmFyT2Zmc2V0LCBHZW9tZXRyeVBpcGVsaW5lX2RlZmF1bHQ7CiAgdmFyIGluaXRfR2VvbWV0cnlQaXBlbGluZSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvR2VvbWV0cnlQaXBlbGluZS5qcyIoKSB7CiAgICAgIGluaXRfQXR0cmlidXRlQ29tcHJlc3Npb24oKTsKICAgICAgaW5pdF9iYXJ5Y2VudHJpY0Nvb3JkaW5hdGVzKCk7CiAgICAgIGluaXRfQm91bmRpbmdTcGhlcmUoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4yKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRlc2lhbjQoKTsKICAgICAgaW5pdF9DYXJ0b2dyYXBoaWMoKTsKICAgICAgaW5pdF9Db21wb25lbnREYXRhdHlwZSgpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X0VuY29kZWRDYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfR2VvZ3JhcGhpY1Byb2plY3Rpb24oKTsKICAgICAgaW5pdF9HZW9tZXRyeSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlKCk7CiAgICAgIGluaXRfR2VvbWV0cnlUeXBlKCk7CiAgICAgIGluaXRfSW5kZXhEYXRhdHlwZSgpOwogICAgICBpbml0X0ludGVyc2VjdCgpOwogICAgICBpbml0X0ludGVyc2VjdGlvblRlc3RzKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBpbml0X01hdHJpeDMoKTsKICAgICAgaW5pdF9NYXRyaXg0KCk7CiAgICAgIGluaXRfUGxhbmUoKTsKICAgICAgaW5pdF9QcmltaXRpdmVUeXBlKCk7CiAgICAgIGluaXRfVGlwc2lmeSgpOwogICAgICBHZW9tZXRyeVBpcGVsaW5lID0ge307CiAgICAgIEdlb21ldHJ5UGlwZWxpbmUudG9XaXJlZnJhbWUgPSBmdW5jdGlvbihnZW9tZXRyeSkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGdlb21ldHJ5KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImdlb21ldHJ5IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBpbmRpY2VzID0gZ2VvbWV0cnkuaW5kaWNlczsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGluZGljZXMpKSB7CiAgICAgICAgICBzd2l0Y2ggKGdlb21ldHJ5LnByaW1pdGl2ZVR5cGUpIHsKICAgICAgICAgICAgY2FzZSBQcmltaXRpdmVUeXBlX2RlZmF1bHQuVFJJQU5HTEVTOgogICAgICAgICAgICAgIGdlb21ldHJ5LmluZGljZXMgPSB0cmlhbmdsZXNUb0xpbmVzKGluZGljZXMpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5UUklBTkdMRV9TVFJJUDoKICAgICAgICAgICAgICBnZW9tZXRyeS5pbmRpY2VzID0gdHJpYW5nbGVTdHJpcFRvTGluZXMoaW5kaWNlcyk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgUHJpbWl0aXZlVHlwZV9kZWZhdWx0LlRSSUFOR0xFX0ZBTjoKICAgICAgICAgICAgICBnZW9tZXRyeS5pbmRpY2VzID0gdHJpYW5nbGVGYW5Ub0xpbmVzKGluZGljZXMpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvLz4+aW5jbHVkZVN0YXJ0KCdkZWJ1ZycsIHByYWdtYXMuZGVidWcpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAgICAgImdlb21ldHJ5LnByaW1pdGl2ZVR5cGUgbXVzdCBiZSBUUklBTkdMRVMsIFRSSUFOR0xFX1NUUklQLCBvciBUUklBTkdMRV9GQU4uIgogICAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgICBnZW9tZXRyeS5wcmltaXRpdmVUeXBlID0gUHJpbWl0aXZlVHlwZV9kZWZhdWx0LkxJTkVTOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZ2VvbWV0cnk7CiAgICAgIH07CiAgICAgIEdlb21ldHJ5UGlwZWxpbmUuY3JlYXRlTGluZVNlZ21lbnRzRm9yVmVjdG9ycyA9IGZ1bmN0aW9uKGdlb21ldHJ5LCBhdHRyaWJ1dGVOYW1lLCBsZW5ndGgpIHsKICAgICAgICBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZSA/PyAibm9ybWFsIjsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChnZW9tZXRyeSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJnZW9tZXRyeSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChnZW9tZXRyeS5hdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGBnZW9tZXRyeS5hdHRyaWJ1dGVzIG11c3QgaGF2ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBhdHRyaWJ1dGVOYW1lIHBhcmFtZXRlciwgJHthdHRyaWJ1dGVOYW1lfS5gCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBsZW5ndGggPz8gMWU0OwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzOwogICAgICAgIGNvbnN0IHZlY3RvcnMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdLnZhbHVlczsKICAgICAgICBjb25zdCBwb3NpdGlvbnNMZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGNvbnN0IG5ld1Bvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkoMiAqIHBvc2l0aW9uc0xlbmd0aCk7CiAgICAgICAgbGV0IGogPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zTGVuZ3RoOyBpICs9IDMpIHsKICAgICAgICAgIG5ld1Bvc2l0aW9uc1tqKytdID0gcG9zaXRpb25zW2ldOwogICAgICAgICAgbmV3UG9zaXRpb25zW2orK10gPSBwb3NpdGlvbnNbaSArIDFdOwogICAgICAgICAgbmV3UG9zaXRpb25zW2orK10gPSBwb3NpdGlvbnNbaSArIDJdOwogICAgICAgICAgbmV3UG9zaXRpb25zW2orK10gPSBwb3NpdGlvbnNbaV0gKyB2ZWN0b3JzW2ldICogbGVuZ3RoOwogICAgICAgICAgbmV3UG9zaXRpb25zW2orK10gPSBwb3NpdGlvbnNbaSArIDFdICsgdmVjdG9yc1tpICsgMV0gKiBsZW5ndGg7CiAgICAgICAgICBuZXdQb3NpdGlvbnNbaisrXSA9IHBvc2l0aW9uc1tpICsgMl0gKyB2ZWN0b3JzW2kgKyAyXSAqIGxlbmd0aDsKICAgICAgICB9CiAgICAgICAgbGV0IG5ld0JvdW5kaW5nU3BoZXJlOwogICAgICAgIGNvbnN0IGJzID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmU7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChicykpIHsKICAgICAgICAgIG5ld0JvdW5kaW5nU3BoZXJlID0gbmV3IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQoYnMuY2VudGVyLCBicy5yYWRpdXMgKyBsZW5ndGgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IEdlb21ldHJ5X2RlZmF1bHQoewogICAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgICBwb3NpdGlvbjogbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkRPVUJMRSwKICAgICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgICAgICAgIHZhbHVlczogbmV3UG9zaXRpb25zCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9LAogICAgICAgICAgcHJpbWl0aXZlVHlwZTogUHJpbWl0aXZlVHlwZV9kZWZhdWx0LkxJTkVTLAogICAgICAgICAgYm91bmRpbmdTcGhlcmU6IG5ld0JvdW5kaW5nU3BoZXJlCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIEdlb21ldHJ5UGlwZWxpbmUuY3JlYXRlQXR0cmlidXRlTG9jYXRpb25zID0gZnVuY3Rpb24oZ2VvbWV0cnkpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChnZW9tZXRyeSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJnZW9tZXRyeSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc2VtYW50aWNzID0gWwogICAgICAgICAgInBvc2l0aW9uIiwKICAgICAgICAgICJwb3NpdGlvbkhpZ2giLAogICAgICAgICAgInBvc2l0aW9uTG93IiwKICAgICAgICAgIC8vIEZyb20gVmVydGV4Rm9ybWF0LnBvc2l0aW9uIC0gYWZ0ZXIgMkQgcHJvamVjdGlvbiBhbmQgaGlnaC1wcmVjaXNpb24gZW5jb2RpbmcKICAgICAgICAgICJwb3NpdGlvbjNESGlnaCIsCiAgICAgICAgICAicG9zaXRpb24zRExvdyIsCiAgICAgICAgICAicG9zaXRpb24yREhpZ2giLAogICAgICAgICAgInBvc2l0aW9uMkRMb3ciLAogICAgICAgICAgLy8gRnJvbSBQcmltaXRpdmUKICAgICAgICAgICJwaWNrQ29sb3IiLAogICAgICAgICAgLy8gRnJvbSBWZXJ0ZXhGb3JtYXQKICAgICAgICAgICJub3JtYWwiLAogICAgICAgICAgInN0IiwKICAgICAgICAgICJ0YW5nZW50IiwKICAgICAgICAgICJiaXRhbmdlbnQiLAogICAgICAgICAgLy8gRm9yIHNoYWRvdyB2b2x1bWVzCiAgICAgICAgICAiZXh0cnVkZURpcmVjdGlvbiIsCiAgICAgICAgICAvLyBGcm9tIGNvbXByZXNzaW5nIHRleHR1cmUgY29vcmRpbmF0ZXMgYW5kIG5vcm1hbHMKICAgICAgICAgICJjb21wcmVzc2VkQXR0cmlidXRlcyIKICAgICAgICBdOwogICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOwogICAgICAgIGNvbnN0IGluZGljZXMgPSB7fTsKICAgICAgICBsZXQgaiA9IDA7CiAgICAgICAgbGV0IGk7CiAgICAgICAgY29uc3QgbGVuID0gc2VtYW50aWNzLmxlbmd0aDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgICAgIGNvbnN0IHNlbWFudGljID0gc2VtYW50aWNzW2ldOwogICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChhdHRyaWJ1dGVzW3NlbWFudGljXSkpIHsKICAgICAgICAgICAgaW5kaWNlc1tzZW1hbnRpY10gPSBqKys7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBhdHRyaWJ1dGVzKSB7CiAgICAgICAgICBpZiAoYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiAhZGVmaW5lZF9kZWZhdWx0KGluZGljZXNbbmFtZV0pKSB7CiAgICAgICAgICAgIGluZGljZXNbbmFtZV0gPSBqKys7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBpbmRpY2VzOwogICAgICB9OwogICAgICBHZW9tZXRyeVBpcGVsaW5lLnJlb3JkZXJGb3JQcmVWZXJ0ZXhDYWNoZSA9IGZ1bmN0aW9uKGdlb21ldHJ5KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZ2VvbWV0cnkpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZ2VvbWV0cnkgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG51bVZlcnRpY2VzID0gR2VvbWV0cnlfZGVmYXVsdC5jb21wdXRlTnVtYmVyT2ZWZXJ0aWNlcyhnZW9tZXRyeSk7CiAgICAgICAgY29uc3QgaW5kaWNlcyA9IGdlb21ldHJ5LmluZGljZXM7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChpbmRpY2VzKSkgewogICAgICAgICAgY29uc3QgaW5kZXhDcm9zc1JlZmVyZW5jZU9sZFRvTmV3ID0gbmV3IEludDMyQXJyYXkobnVtVmVydGljZXMpOwogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1WZXJ0aWNlczsgaSsrKSB7CiAgICAgICAgICAgIGluZGV4Q3Jvc3NSZWZlcmVuY2VPbGRUb05ld1tpXSA9IC0xOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgaW5kaWNlc0luID0gaW5kaWNlczsKICAgICAgICAgIGNvbnN0IG51bUluZGljZXMgPSBpbmRpY2VzSW4ubGVuZ3RoOwogICAgICAgICAgY29uc3QgaW5kaWNlc091dCA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KG51bVZlcnRpY2VzLCBudW1JbmRpY2VzKTsKICAgICAgICAgIGxldCBpbnRvSW5kaWNlc0luID0gMDsKICAgICAgICAgIGxldCBpbnRvSW5kaWNlc091dCA9IDA7CiAgICAgICAgICBsZXQgbmV4dEluZGV4ID0gMDsKICAgICAgICAgIGxldCB0ZW1wSW5kZXg7CiAgICAgICAgICB3aGlsZSAoaW50b0luZGljZXNJbiA8IG51bUluZGljZXMpIHsKICAgICAgICAgICAgdGVtcEluZGV4ID0gaW5kZXhDcm9zc1JlZmVyZW5jZU9sZFRvTmV3W2luZGljZXNJbltpbnRvSW5kaWNlc0luXV07CiAgICAgICAgICAgIGlmICh0ZW1wSW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgICAgaW5kaWNlc091dFtpbnRvSW5kaWNlc091dF0gPSB0ZW1wSW5kZXg7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGVtcEluZGV4ID0gaW5kaWNlc0luW2ludG9JbmRpY2VzSW5dOwogICAgICAgICAgICAgIGluZGV4Q3Jvc3NSZWZlcmVuY2VPbGRUb05ld1t0ZW1wSW5kZXhdID0gbmV4dEluZGV4OwogICAgICAgICAgICAgIGluZGljZXNPdXRbaW50b0luZGljZXNPdXRdID0gbmV4dEluZGV4OwogICAgICAgICAgICAgICsrbmV4dEluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgICAgICsraW50b0luZGljZXNJbjsKICAgICAgICAgICAgKytpbnRvSW5kaWNlc091dDsKICAgICAgICAgIH0KICAgICAgICAgIGdlb21ldHJ5LmluZGljZXMgPSBpbmRpY2VzT3V0OwogICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7CiAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkocHJvcGVydHkpICYmIGRlZmluZWRfZGVmYXVsdChhdHRyaWJ1dGVzW3Byb3BlcnR5XSkgJiYgZGVmaW5lZF9kZWZhdWx0KGF0dHJpYnV0ZXNbcHJvcGVydHldLnZhbHVlcykpIHsKICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW3Byb3BlcnR5XTsKICAgICAgICAgICAgICBjb25zdCBlbGVtZW50c0luID0gYXR0cmlidXRlLnZhbHVlczsKICAgICAgICAgICAgICBsZXQgaW50b0VsZW1lbnRzSW4gPSAwOwogICAgICAgICAgICAgIGNvbnN0IG51bUNvbXBvbmVudHMgPSBhdHRyaWJ1dGUuY29tcG9uZW50c1BlckF0dHJpYnV0ZTsKICAgICAgICAgICAgICBjb25zdCBlbGVtZW50c091dCA9IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuY3JlYXRlVHlwZWRBcnJheSgKICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5jb21wb25lbnREYXRhdHlwZSwKICAgICAgICAgICAgICAgIG5leHRJbmRleCAqIG51bUNvbXBvbmVudHMKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIHdoaWxlIChpbnRvRWxlbWVudHNJbiA8IG51bVZlcnRpY2VzKSB7CiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0gaW5kZXhDcm9zc1JlZmVyZW5jZU9sZFRvTmV3W2ludG9FbGVtZW50c0luXTsKICAgICAgICAgICAgICAgIGlmICh0ZW1wICE9PSAtMSkgewogICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bUNvbXBvbmVudHM7IGorKykgewogICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzT3V0W251bUNvbXBvbmVudHMgKiB0ZW1wICsgal0gPSBlbGVtZW50c0luW251bUNvbXBvbmVudHMgKiBpbnRvRWxlbWVudHNJbiArIGpdOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICArK2ludG9FbGVtZW50c0luOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBhdHRyaWJ1dGUudmFsdWVzID0gZWxlbWVudHNPdXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGdlb21ldHJ5OwogICAgICB9OwogICAgICBHZW9tZXRyeVBpcGVsaW5lLnJlb3JkZXJGb3JQb3N0VmVydGV4Q2FjaGUgPSBmdW5jdGlvbihnZW9tZXRyeSwgY2FjaGVDYXBhY2l0eSkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGdlb21ldHJ5KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImdlb21ldHJ5IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBpbmRpY2VzID0gZ2VvbWV0cnkuaW5kaWNlczsKICAgICAgICBpZiAoZ2VvbWV0cnkucHJpbWl0aXZlVHlwZSA9PT0gUHJpbWl0aXZlVHlwZV9kZWZhdWx0LlRSSUFOR0xFUyAmJiBkZWZpbmVkX2RlZmF1bHQoaW5kaWNlcykpIHsKICAgICAgICAgIGNvbnN0IG51bUluZGljZXMgPSBpbmRpY2VzLmxlbmd0aDsKICAgICAgICAgIGxldCBtYXhpbXVtSW5kZXggPSAwOwogICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1JbmRpY2VzOyBqKyspIHsKICAgICAgICAgICAgaWYgKGluZGljZXNbal0gPiBtYXhpbXVtSW5kZXgpIHsKICAgICAgICAgICAgICBtYXhpbXVtSW5kZXggPSBpbmRpY2VzW2pdOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBnZW9tZXRyeS5pbmRpY2VzID0gVGlwc2lmeV9kZWZhdWx0LnRpcHNpZnkoewogICAgICAgICAgICBpbmRpY2VzLAogICAgICAgICAgICBtYXhpbXVtSW5kZXgsCiAgICAgICAgICAgIGNhY2hlU2l6ZTogY2FjaGVDYXBhY2l0eQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBnZW9tZXRyeTsKICAgICAgfTsKICAgICAgR2VvbWV0cnlQaXBlbGluZS5maXRUb1Vuc2lnbmVkU2hvcnRJbmRpY2VzID0gZnVuY3Rpb24oZ2VvbWV0cnkpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChnZW9tZXRyeSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJnZW9tZXRyeSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChnZW9tZXRyeS5pbmRpY2VzKSAmJiBnZW9tZXRyeS5wcmltaXRpdmVUeXBlICE9PSBQcmltaXRpdmVUeXBlX2RlZmF1bHQuVFJJQU5HTEVTICYmIGdlb21ldHJ5LnByaW1pdGl2ZVR5cGUgIT09IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5MSU5FUyAmJiBnZW9tZXRyeS5wcmltaXRpdmVUeXBlICE9PSBQcmltaXRpdmVUeXBlX2RlZmF1bHQuUE9JTlRTKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgImdlb21ldHJ5LnByaW1pdGl2ZVR5cGUgbXVzdCBlcXVhbCB0byBQcmltaXRpdmVUeXBlLlRSSUFOR0xFUywgUHJpbWl0aXZlVHlwZS5MSU5FUywgb3IgUHJpbWl0aXZlVHlwZS5QT0lOVFMuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZ2VvbWV0cmllcyA9IFtdOwogICAgICAgIGNvbnN0IG51bWJlck9mVmVydGljZXMgPSBHZW9tZXRyeV9kZWZhdWx0LmNvbXB1dGVOdW1iZXJPZlZlcnRpY2VzKGdlb21ldHJ5KTsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGdlb21ldHJ5LmluZGljZXMpICYmIG51bWJlck9mVmVydGljZXMgPj0gTWF0aF9kZWZhdWx0LlNJWFRZX0ZPVVJfS0lMT0JZVEVTKSB7CiAgICAgICAgICBsZXQgb2xkVG9OZXdJbmRleCA9IFtdOwogICAgICAgICAgbGV0IG5ld0luZGljZXMgPSBbXTsKICAgICAgICAgIGxldCBjdXJyZW50SW5kZXggPSAwOwogICAgICAgICAgbGV0IG5ld0F0dHJpYnV0ZXMgPSBjb3B5QXR0cmlidXRlc0Rlc2NyaXB0aW9ucyhnZW9tZXRyeS5hdHRyaWJ1dGVzKTsKICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSW5kaWNlcyA9IGdlb21ldHJ5LmluZGljZXM7CiAgICAgICAgICBjb25zdCBudW1iZXJPZkluZGljZXMgPSBvcmlnaW5hbEluZGljZXMubGVuZ3RoOwogICAgICAgICAgbGV0IGluZGljZXNQZXJQcmltaXRpdmU7CiAgICAgICAgICBpZiAoZ2VvbWV0cnkucHJpbWl0aXZlVHlwZSA9PT0gUHJpbWl0aXZlVHlwZV9kZWZhdWx0LlRSSUFOR0xFUykgewogICAgICAgICAgICBpbmRpY2VzUGVyUHJpbWl0aXZlID0gMzsKICAgICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkucHJpbWl0aXZlVHlwZSA9PT0gUHJpbWl0aXZlVHlwZV9kZWZhdWx0LkxJTkVTKSB7CiAgICAgICAgICAgIGluZGljZXNQZXJQcmltaXRpdmUgPSAyOwogICAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS5wcmltaXRpdmVUeXBlID09PSBQcmltaXRpdmVUeXBlX2RlZmF1bHQuUE9JTlRTKSB7CiAgICAgICAgICAgIGluZGljZXNQZXJQcmltaXRpdmUgPSAxOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1iZXJPZkluZGljZXM7IGogKz0gaW5kaWNlc1BlclByaW1pdGl2ZSkgewogICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGluZGljZXNQZXJQcmltaXRpdmU7ICsraykgewogICAgICAgICAgICAgIGNvbnN0IHggPSBvcmlnaW5hbEluZGljZXNbaiArIGtdOwogICAgICAgICAgICAgIGxldCBpID0gb2xkVG9OZXdJbmRleFt4XTsKICAgICAgICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChpKSkgewogICAgICAgICAgICAgICAgaSA9IGN1cnJlbnRJbmRleCsrOwogICAgICAgICAgICAgICAgb2xkVG9OZXdJbmRleFt4XSA9IGk7CiAgICAgICAgICAgICAgICBjb3B5VmVydGV4KG5ld0F0dHJpYnV0ZXMsIGdlb21ldHJ5LmF0dHJpYnV0ZXMsIHgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBuZXdJbmRpY2VzLnB1c2goaSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCArIGluZGljZXNQZXJQcmltaXRpdmUgPj0gTWF0aF9kZWZhdWx0LlNJWFRZX0ZPVVJfS0lMT0JZVEVTKSB7CiAgICAgICAgICAgICAgZ2VvbWV0cmllcy5wdXNoKAogICAgICAgICAgICAgICAgbmV3IEdlb21ldHJ5X2RlZmF1bHQoewogICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBuZXdBdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgICBpbmRpY2VzOiBuZXdJbmRpY2VzLAogICAgICAgICAgICAgICAgICBwcmltaXRpdmVUeXBlOiBnZW9tZXRyeS5wcmltaXRpdmVUeXBlLAogICAgICAgICAgICAgICAgICBib3VuZGluZ1NwaGVyZTogZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUsCiAgICAgICAgICAgICAgICAgIGJvdW5kaW5nU3BoZXJlQ1Y6IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlQ1YKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICBvbGRUb05ld0luZGV4ID0gW107CiAgICAgICAgICAgICAgbmV3SW5kaWNlcyA9IFtdOwogICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IDA7CiAgICAgICAgICAgICAgbmV3QXR0cmlidXRlcyA9IGNvcHlBdHRyaWJ1dGVzRGVzY3JpcHRpb25zKGdlb21ldHJ5LmF0dHJpYnV0ZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobmV3SW5kaWNlcy5sZW5ndGggIT09IDApIHsKICAgICAgICAgICAgZ2VvbWV0cmllcy5wdXNoKAogICAgICAgICAgICAgIG5ldyBHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IG5ld0F0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBpbmRpY2VzOiBuZXdJbmRpY2VzLAogICAgICAgICAgICAgICAgcHJpbWl0aXZlVHlwZTogZ2VvbWV0cnkucHJpbWl0aXZlVHlwZSwKICAgICAgICAgICAgICAgIGJvdW5kaW5nU3BoZXJlOiBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSwKICAgICAgICAgICAgICAgIGJvdW5kaW5nU3BoZXJlQ1Y6IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlQ1YKICAgICAgICAgICAgICB9KQogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBnZW9tZXRyaWVzLnB1c2goZ2VvbWV0cnkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZ2VvbWV0cmllczsKICAgICAgfTsKICAgICAgc2NyYXRjaFByb2plY3RUbzJEQ2FydGVzaWFuMyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFByb2plY3RUbzJEQ2FydG9ncmFwaGljID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIEdlb21ldHJ5UGlwZWxpbmUucHJvamVjdFRvMkQgPSBmdW5jdGlvbihnZW9tZXRyeSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZTNELCBhdHRyaWJ1dGVOYW1lMkQsIHByb2plY3Rpb24pIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChnZW9tZXRyeSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJnZW9tZXRyeSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYXR0cmlidXRlTmFtZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhdHRyaWJ1dGVOYW1lIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhdHRyaWJ1dGVOYW1lM0QpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXR0cmlidXRlTmFtZTNEIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhdHRyaWJ1dGVOYW1lMkQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXR0cmlidXRlTmFtZTJEIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChnZW9tZXRyeS5hdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGBnZW9tZXRyeSBtdXN0IGhhdmUgYXR0cmlidXRlIG1hdGNoaW5nIHRoZSBhdHRyaWJ1dGVOYW1lIGFyZ3VtZW50OiAke2F0dHJpYnV0ZU5hbWV9LmAKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmIChnZW9tZXRyeS5hdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdLmNvbXBvbmVudERhdGF0eXBlICE9PSBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkRPVUJMRSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJUaGUgYXR0cmlidXRlIGNvbXBvbmVudERhdGF0eXBlIG11c3QgYmUgQ29tcG9uZW50RGF0YXR5cGUuRE9VQkxFLiIKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV07CiAgICAgICAgcHJvamVjdGlvbiA9IGRlZmluZWRfZGVmYXVsdChwcm9qZWN0aW9uKSA/IHByb2plY3Rpb24gOiBuZXcgR2VvZ3JhcGhpY1Byb2plY3Rpb25fZGVmYXVsdCgpOwogICAgICAgIGNvbnN0IGVsbGlwc29pZCA9IHByb2plY3Rpb24uZWxsaXBzb2lkOwogICAgICAgIGNvbnN0IHZhbHVlczNEID0gYXR0cmlidXRlLnZhbHVlczsKICAgICAgICBjb25zdCBwcm9qZWN0ZWRWYWx1ZXMgPSBuZXcgRmxvYXQ2NEFycmF5KHZhbHVlczNELmxlbmd0aCk7CiAgICAgICAgbGV0IGluZGV4ID0gMDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlczNELmxlbmd0aDsgaSArPSAzKSB7CiAgICAgICAgICBjb25zdCB2YWx1ZSA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoCiAgICAgICAgICAgIHZhbHVlczNELAogICAgICAgICAgICBpLAogICAgICAgICAgICBzY3JhdGNoUHJvamVjdFRvMkRDYXJ0ZXNpYW4zCiAgICAgICAgICApOwogICAgICAgICAgY29uc3QgbG9uTGF0ID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKAogICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgc2NyYXRjaFByb2plY3RUbzJEQ2FydG9ncmFwaGljCiAgICAgICAgICApOwogICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobG9uTGF0KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgICBgQ291bGQgbm90IHByb2plY3QgcG9pbnQgKCR7dmFsdWUueH0sICR7dmFsdWUueX0sICR7dmFsdWUuen0pIHRvIDJELmAKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHByb2plY3RlZExvbkxhdCA9IHByb2plY3Rpb24ucHJvamVjdCgKICAgICAgICAgICAgbG9uTGF0LAogICAgICAgICAgICBzY3JhdGNoUHJvamVjdFRvMkRDYXJ0ZXNpYW4zCiAgICAgICAgICApOwogICAgICAgICAgcHJvamVjdGVkVmFsdWVzW2luZGV4KytdID0gcHJvamVjdGVkTG9uTGF0Lng7CiAgICAgICAgICBwcm9qZWN0ZWRWYWx1ZXNbaW5kZXgrK10gPSBwcm9qZWN0ZWRMb25MYXQueTsKICAgICAgICAgIHByb2plY3RlZFZhbHVlc1tpbmRleCsrXSA9IHByb2plY3RlZExvbkxhdC56OwogICAgICAgIH0KICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWUzRF0gPSBhdHRyaWJ1dGU7CiAgICAgICAgZ2VvbWV0cnkuYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lMkRdID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRE9VQkxFLAogICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgIHZhbHVlczogcHJvamVjdGVkVmFsdWVzCiAgICAgICAgfSk7CiAgICAgICAgZGVsZXRlIGdlb21ldHJ5LmF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV07CiAgICAgICAgcmV0dXJuIGdlb21ldHJ5OwogICAgICB9OwogICAgICBlbmNvZGVkUmVzdWx0ID0gewogICAgICAgIGhpZ2g6IDAsCiAgICAgICAgbG93OiAwCiAgICAgIH07CiAgICAgIEdlb21ldHJ5UGlwZWxpbmUuZW5jb2RlQXR0cmlidXRlID0gZnVuY3Rpb24oZ2VvbWV0cnksIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZUhpZ2hOYW1lLCBhdHRyaWJ1dGVMb3dOYW1lKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZ2VvbWV0cnkpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZ2VvbWV0cnkgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGF0dHJpYnV0ZU5hbWUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXR0cmlidXRlTmFtZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYXR0cmlidXRlSGlnaE5hbWUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXR0cmlidXRlSGlnaE5hbWUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGF0dHJpYnV0ZUxvd05hbWUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXR0cmlidXRlTG93TmFtZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZ2VvbWV0cnkuYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICBgZ2VvbWV0cnkgbXVzdCBoYXZlIGF0dHJpYnV0ZSBtYXRjaGluZyB0aGUgYXR0cmlidXRlTmFtZSBhcmd1bWVudDogJHthdHRyaWJ1dGVOYW1lfS5gCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAoZ2VvbWV0cnkuYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXS5jb21wb25lbnREYXRhdHlwZSAhPT0gQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5ET1VCTEUpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAiVGhlIGF0dHJpYnV0ZSBjb21wb25lbnREYXRhdHlwZSBtdXN0IGJlIENvbXBvbmVudERhdGF0eXBlLkRPVUJMRS4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdOwogICAgICAgIGNvbnN0IHZhbHVlcyA9IGF0dHJpYnV0ZS52YWx1ZXM7CiAgICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aDsKICAgICAgICBjb25zdCBoaWdoVmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShsZW5ndGgpOwogICAgICAgIGNvbnN0IGxvd1ZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkobGVuZ3RoKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgICBFbmNvZGVkQ2FydGVzaWFuM19kZWZhdWx0LmVuY29kZSh2YWx1ZXNbaV0sIGVuY29kZWRSZXN1bHQpOwogICAgICAgICAgaGlnaFZhbHVlc1tpXSA9IGVuY29kZWRSZXN1bHQuaGlnaDsKICAgICAgICAgIGxvd1ZhbHVlc1tpXSA9IGVuY29kZWRSZXN1bHQubG93OwogICAgICAgIH0KICAgICAgICBjb25zdCBjb21wb25lbnRzUGVyQXR0cmlidXRlID0gYXR0cmlidXRlLmNvbXBvbmVudHNQZXJBdHRyaWJ1dGU7CiAgICAgICAgZ2VvbWV0cnkuYXR0cmlidXRlc1thdHRyaWJ1dGVIaWdoTmFtZV0gPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5GTE9BVCwKICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGUsCiAgICAgICAgICB2YWx1ZXM6IGhpZ2hWYWx1ZXMKICAgICAgICB9KTsKICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzW2F0dHJpYnV0ZUxvd05hbWVdID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlLAogICAgICAgICAgdmFsdWVzOiBsb3dWYWx1ZXMKICAgICAgICB9KTsKICAgICAgICBkZWxldGUgZ2VvbWV0cnkuYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXTsKICAgICAgICByZXR1cm4gZ2VvbWV0cnk7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zMyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgaW52ZXJzZVRyYW5zcG9zZSA9IG5ldyBNYXRyaXg0X2RlZmF1bHQoKTsKICAgICAgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDNfZGVmYXVsdCgpOwogICAgICBHZW9tZXRyeVBpcGVsaW5lLnRyYW5zZm9ybVRvV29ybGRDb29yZGluYXRlcyA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaW5zdGFuY2UpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiaW5zdGFuY2UgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1vZGVsTWF0cml4ID0gaW5zdGFuY2UubW9kZWxNYXRyaXg7CiAgICAgICAgaWYgKE1hdHJpeDRfZGVmYXVsdC5lcXVhbHMobW9kZWxNYXRyaXgsIE1hdHJpeDRfZGVmYXVsdC5JREVOVElUWSkpIHsKICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGluc3RhbmNlLmdlb21ldHJ5LmF0dHJpYnV0ZXM7CiAgICAgICAgdHJhbnNmb3JtUG9pbnQobW9kZWxNYXRyaXgsIGF0dHJpYnV0ZXMucG9zaXRpb24pOwogICAgICAgIHRyYW5zZm9ybVBvaW50KG1vZGVsTWF0cml4LCBhdHRyaWJ1dGVzLnByZXZQb3NpdGlvbik7CiAgICAgICAgdHJhbnNmb3JtUG9pbnQobW9kZWxNYXRyaXgsIGF0dHJpYnV0ZXMubmV4dFBvc2l0aW9uKTsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGF0dHJpYnV0ZXMubm9ybWFsKSB8fCBkZWZpbmVkX2RlZmF1bHQoYXR0cmlidXRlcy50YW5nZW50KSB8fCBkZWZpbmVkX2RlZmF1bHQoYXR0cmlidXRlcy5iaXRhbmdlbnQpKSB7CiAgICAgICAgICBNYXRyaXg0X2RlZmF1bHQuaW52ZXJzZShtb2RlbE1hdHJpeCwgaW52ZXJzZVRyYW5zcG9zZSk7CiAgICAgICAgICBNYXRyaXg0X2RlZmF1bHQudHJhbnNwb3NlKGludmVyc2VUcmFuc3Bvc2UsIGludmVyc2VUcmFuc3Bvc2UpOwogICAgICAgICAgTWF0cml4NF9kZWZhdWx0LmdldE1hdHJpeDMoaW52ZXJzZVRyYW5zcG9zZSwgbm9ybWFsTWF0cml4KTsKICAgICAgICAgIHRyYW5zZm9ybVZlY3Rvcihub3JtYWxNYXRyaXgsIGF0dHJpYnV0ZXMubm9ybWFsKTsKICAgICAgICAgIHRyYW5zZm9ybVZlY3Rvcihub3JtYWxNYXRyaXgsIGF0dHJpYnV0ZXMudGFuZ2VudCk7CiAgICAgICAgICB0cmFuc2Zvcm1WZWN0b3Iobm9ybWFsTWF0cml4LCBhdHRyaWJ1dGVzLmJpdGFuZ2VudCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGJvdW5kaW5nU3BoZXJlID0gaW5zdGFuY2UuZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmU7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChib3VuZGluZ1NwaGVyZSkpIHsKICAgICAgICAgIGluc3RhbmNlLmdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID0gQm91bmRpbmdTcGhlcmVfZGVmYXVsdC50cmFuc2Zvcm0oCiAgICAgICAgICAgIGJvdW5kaW5nU3BoZXJlLAogICAgICAgICAgICBtb2RlbE1hdHJpeCwKICAgICAgICAgICAgYm91bmRpbmdTcGhlcmUKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGluc3RhbmNlLm1vZGVsTWF0cml4ID0gTWF0cml4NF9kZWZhdWx0LmNsb25lKE1hdHJpeDRfZGVmYXVsdC5JREVOVElUWSk7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgICB9OwogICAgICB0ZW1wU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgR2VvbWV0cnlQaXBlbGluZS5jb21iaW5lSW5zdGFuY2VzID0gZnVuY3Rpb24oaW5zdGFuY2VzKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaW5zdGFuY2VzKSB8fCBpbnN0YW5jZXMubGVuZ3RoIDwgMSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJpbnN0YW5jZXMgaXMgcmVxdWlyZWQgYW5kIG11c3QgaGF2ZSBsZW5ndGggZ3JlYXRlciB0aGFuIHplcm8uIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaW5zdGFuY2VHZW9tZXRyeSA9IFtdOwogICAgICAgIGNvbnN0IGluc3RhbmNlU3BsaXRHZW9tZXRyeSA9IFtdOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IGluc3RhbmNlcy5sZW5ndGg7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBpbnN0YW5jZXNbaV07CiAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGluc3RhbmNlLmdlb21ldHJ5KSkgewogICAgICAgICAgICBpbnN0YW5jZUdlb21ldHJ5LnB1c2goaW5zdGFuY2UpOwogICAgICAgICAgfSBlbHNlIGlmIChkZWZpbmVkX2RlZmF1bHQoaW5zdGFuY2Uud2VzdEhlbWlzcGhlcmVHZW9tZXRyeSkgJiYgZGVmaW5lZF9kZWZhdWx0KGluc3RhbmNlLmVhc3RIZW1pc3BoZXJlR2VvbWV0cnkpKSB7CiAgICAgICAgICAgIGluc3RhbmNlU3BsaXRHZW9tZXRyeS5wdXNoKGluc3RhbmNlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgZ2VvbWV0cmllcyA9IFtdOwogICAgICAgIGlmIChpbnN0YW5jZUdlb21ldHJ5Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIGdlb21ldHJpZXMucHVzaChjb21iaW5lR2VvbWV0cmllcyhpbnN0YW5jZUdlb21ldHJ5LCAiZ2VvbWV0cnkiKSk7CiAgICAgICAgfQogICAgICAgIGlmIChpbnN0YW5jZVNwbGl0R2VvbWV0cnkubGVuZ3RoID4gMCkgewogICAgICAgICAgZ2VvbWV0cmllcy5wdXNoKAogICAgICAgICAgICBjb21iaW5lR2VvbWV0cmllcyhpbnN0YW5jZVNwbGl0R2VvbWV0cnksICJ3ZXN0SGVtaXNwaGVyZUdlb21ldHJ5IikKICAgICAgICAgICk7CiAgICAgICAgICBnZW9tZXRyaWVzLnB1c2goCiAgICAgICAgICAgIGNvbWJpbmVHZW9tZXRyaWVzKGluc3RhbmNlU3BsaXRHZW9tZXRyeSwgImVhc3RIZW1pc3BoZXJlR2VvbWV0cnkiKQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGdlb21ldHJpZXM7CiAgICAgIH07CiAgICAgIG5vcm1hbCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgdjAgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHYxID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICB2MiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgR2VvbWV0cnlQaXBlbGluZS5jb21wdXRlTm9ybWFsID0gZnVuY3Rpb24oZ2VvbWV0cnkpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChnZW9tZXRyeSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJnZW9tZXRyeSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbikgfHwgIWRlZmluZWRfZGVmYXVsdChnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcykpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAiZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMgaXMgcmVxdWlyZWQuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZ2VvbWV0cnkuaW5kaWNlcykpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJnZW9tZXRyeS5pbmRpY2VzIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoZ2VvbWV0cnkuaW5kaWNlcy5sZW5ndGggPCAyIHx8IGdlb21ldHJ5LmluZGljZXMubGVuZ3RoICUgMyAhPT0gMCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJnZW9tZXRyeS5pbmRpY2VzIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIGFuZCBiZSBhIG11bHRpcGxlIG9mIDMuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKGdlb21ldHJ5LnByaW1pdGl2ZVR5cGUgIT09IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5UUklBTkdMRVMpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAiZ2VvbWV0cnkucHJpbWl0aXZlVHlwZSBtdXN0IGJlIFByaW1pdGl2ZVR5cGUuVFJJQU5HTEVTLiIKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGluZGljZXMgPSBnZW9tZXRyeS5pbmRpY2VzOwogICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOwogICAgICAgIGNvbnN0IHZlcnRpY2VzID0gYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXM7CiAgICAgICAgY29uc3QgbnVtVmVydGljZXMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGggLyAzOwogICAgICAgIGNvbnN0IG51bUluZGljZXMgPSBpbmRpY2VzLmxlbmd0aDsKICAgICAgICBjb25zdCBub3JtYWxzUGVyVmVydGV4ID0gbmV3IEFycmF5KG51bVZlcnRpY2VzKTsKICAgICAgICBjb25zdCBub3JtYWxzUGVyVHJpYW5nbGUgPSBuZXcgQXJyYXkobnVtSW5kaWNlcyAvIDMpOwogICAgICAgIGNvbnN0IG5vcm1hbEluZGljZXMgPSBuZXcgQXJyYXkobnVtSW5kaWNlcyk7CiAgICAgICAgbGV0IGk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVZlcnRpY2VzOyBpKyspIHsKICAgICAgICAgIG5vcm1hbHNQZXJWZXJ0ZXhbaV0gPSB7CiAgICAgICAgICAgIGluZGV4T2Zmc2V0OiAwLAogICAgICAgICAgICBjb3VudDogMCwKICAgICAgICAgICAgY3VycmVudENvdW50OiAwCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBsZXQgaiA9IDA7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUluZGljZXM7IGkgKz0gMykgewogICAgICAgICAgY29uc3QgaTAgPSBpbmRpY2VzW2ldOwogICAgICAgICAgY29uc3QgaTEgPSBpbmRpY2VzW2kgKyAxXTsKICAgICAgICAgIGNvbnN0IGkyID0gaW5kaWNlc1tpICsgMl07CiAgICAgICAgICBjb25zdCBpMDMgPSBpMCAqIDM7CiAgICAgICAgICBjb25zdCBpMTMgPSBpMSAqIDM7CiAgICAgICAgICBjb25zdCBpMjMgPSBpMiAqIDM7CiAgICAgICAgICB2MC54ID0gdmVydGljZXNbaTAzXTsKICAgICAgICAgIHYwLnkgPSB2ZXJ0aWNlc1tpMDMgKyAxXTsKICAgICAgICAgIHYwLnogPSB2ZXJ0aWNlc1tpMDMgKyAyXTsKICAgICAgICAgIHYxLnggPSB2ZXJ0aWNlc1tpMTNdOwogICAgICAgICAgdjEueSA9IHZlcnRpY2VzW2kxMyArIDFdOwogICAgICAgICAgdjEueiA9IHZlcnRpY2VzW2kxMyArIDJdOwogICAgICAgICAgdjIueCA9IHZlcnRpY2VzW2kyM107CiAgICAgICAgICB2Mi55ID0gdmVydGljZXNbaTIzICsgMV07CiAgICAgICAgICB2Mi56ID0gdmVydGljZXNbaTIzICsgMl07CiAgICAgICAgICBub3JtYWxzUGVyVmVydGV4W2kwXS5jb3VudCsrOwogICAgICAgICAgbm9ybWFsc1BlclZlcnRleFtpMV0uY291bnQrKzsKICAgICAgICAgIG5vcm1hbHNQZXJWZXJ0ZXhbaTJdLmNvdW50Kys7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QodjEsIHYwLCB2MSk7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QodjIsIHYwLCB2Mik7CiAgICAgICAgICBub3JtYWxzUGVyVHJpYW5nbGVbal0gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3ModjEsIHYyLCBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCkpOwogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBsZXQgaW5kZXhPZmZzZXQgPSAwOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1WZXJ0aWNlczsgaSsrKSB7CiAgICAgICAgICBub3JtYWxzUGVyVmVydGV4W2ldLmluZGV4T2Zmc2V0ICs9IGluZGV4T2Zmc2V0OwogICAgICAgICAgaW5kZXhPZmZzZXQgKz0gbm9ybWFsc1BlclZlcnRleFtpXS5jb3VudDsKICAgICAgICB9CiAgICAgICAgaiA9IDA7CiAgICAgICAgbGV0IHZlcnRleE5vcm1hbERhdGE7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUluZGljZXM7IGkgKz0gMykgewogICAgICAgICAgdmVydGV4Tm9ybWFsRGF0YSA9IG5vcm1hbHNQZXJWZXJ0ZXhbaW5kaWNlc1tpXV07CiAgICAgICAgICBsZXQgaW5kZXggPSB2ZXJ0ZXhOb3JtYWxEYXRhLmluZGV4T2Zmc2V0ICsgdmVydGV4Tm9ybWFsRGF0YS5jdXJyZW50Q291bnQ7CiAgICAgICAgICBub3JtYWxJbmRpY2VzW2luZGV4XSA9IGo7CiAgICAgICAgICB2ZXJ0ZXhOb3JtYWxEYXRhLmN1cnJlbnRDb3VudCsrOwogICAgICAgICAgdmVydGV4Tm9ybWFsRGF0YSA9IG5vcm1hbHNQZXJWZXJ0ZXhbaW5kaWNlc1tpICsgMV1dOwogICAgICAgICAgaW5kZXggPSB2ZXJ0ZXhOb3JtYWxEYXRhLmluZGV4T2Zmc2V0ICsgdmVydGV4Tm9ybWFsRGF0YS5jdXJyZW50Q291bnQ7CiAgICAgICAgICBub3JtYWxJbmRpY2VzW2luZGV4XSA9IGo7CiAgICAgICAgICB2ZXJ0ZXhOb3JtYWxEYXRhLmN1cnJlbnRDb3VudCsrOwogICAgICAgICAgdmVydGV4Tm9ybWFsRGF0YSA9IG5vcm1hbHNQZXJWZXJ0ZXhbaW5kaWNlc1tpICsgMl1dOwogICAgICAgICAgaW5kZXggPSB2ZXJ0ZXhOb3JtYWxEYXRhLmluZGV4T2Zmc2V0ICsgdmVydGV4Tm9ybWFsRGF0YS5jdXJyZW50Q291bnQ7CiAgICAgICAgICBub3JtYWxJbmRpY2VzW2luZGV4XSA9IGo7CiAgICAgICAgICB2ZXJ0ZXhOb3JtYWxEYXRhLmN1cnJlbnRDb3VudCsrOwogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBjb25zdCBub3JtYWxWYWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KG51bVZlcnRpY2VzICogMyk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVZlcnRpY2VzOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGkzID0gaSAqIDM7CiAgICAgICAgICB2ZXJ0ZXhOb3JtYWxEYXRhID0gbm9ybWFsc1BlclZlcnRleFtpXTsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTywgbm9ybWFsKTsKICAgICAgICAgIGlmICh2ZXJ0ZXhOb3JtYWxEYXRhLmNvdW50ID4gMCkgewogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdmVydGV4Tm9ybWFsRGF0YS5jb3VudDsgaisrKSB7CiAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZCgKICAgICAgICAgICAgICAgIG5vcm1hbCwKICAgICAgICAgICAgICAgIG5vcm1hbHNQZXJUcmlhbmdsZVtub3JtYWxJbmRpY2VzW3ZlcnRleE5vcm1hbERhdGEuaW5kZXhPZmZzZXQgKyBqXV0sCiAgICAgICAgICAgICAgICBub3JtYWwKICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChDYXJ0ZXNpYW4zX2RlZmF1bHQuZXF1YWxzRXBzaWxvbihDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTywgbm9ybWFsLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjEwKSkgewogICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZSgKICAgICAgICAgICAgICAgIG5vcm1hbHNQZXJUcmlhbmdsZVtub3JtYWxJbmRpY2VzW3ZlcnRleE5vcm1hbERhdGEuaW5kZXhPZmZzZXRdXSwKICAgICAgICAgICAgICAgIG5vcm1hbAogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChDYXJ0ZXNpYW4zX2RlZmF1bHQuZXF1YWxzRXBzaWxvbihDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTywgbm9ybWFsLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjEwKSkgewogICAgICAgICAgICBub3JtYWwueiA9IDE7CiAgICAgICAgICB9CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKG5vcm1hbCwgbm9ybWFsKTsKICAgICAgICAgIG5vcm1hbFZhbHVlc1tpM10gPSBub3JtYWwueDsKICAgICAgICAgIG5vcm1hbFZhbHVlc1tpMyArIDFdID0gbm9ybWFsLnk7CiAgICAgICAgICBub3JtYWxWYWx1ZXNbaTMgKyAyXSA9IG5vcm1hbC56OwogICAgICAgIH0KICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgIHZhbHVlczogbm9ybWFsVmFsdWVzCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGdlb21ldHJ5OwogICAgICB9OwogICAgICBub3JtYWxTY3JhdGNoMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgbm9ybWFsU2NhbGUgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHRTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBHZW9tZXRyeVBpcGVsaW5lLmNvbXB1dGVUYW5nZW50QW5kQml0YW5nZW50ID0gZnVuY3Rpb24oZ2VvbWV0cnkpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChnZW9tZXRyeSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJnZW9tZXRyeSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7CiAgICAgICAgY29uc3QgaW5kaWNlcyA9IGdlb21ldHJ5LmluZGljZXM7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYXR0cmlidXRlcy5wb3NpdGlvbikgfHwgIWRlZmluZWRfZGVmYXVsdChhdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcykpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAiZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMgaXMgcmVxdWlyZWQuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYXR0cmlidXRlcy5ub3JtYWwpIHx8ICFkZWZpbmVkX2RlZmF1bHQoYXR0cmlidXRlcy5ub3JtYWwudmFsdWVzKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsLnZhbHVlcyBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYXR0cmlidXRlcy5zdCkgfHwgIWRlZmluZWRfZGVmYXVsdChhdHRyaWJ1dGVzLnN0LnZhbHVlcykpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJnZW9tZXRyeS5hdHRyaWJ1dGVzLnN0LnZhbHVlcyBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaW5kaWNlcykpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJnZW9tZXRyeS5pbmRpY2VzIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoaW5kaWNlcy5sZW5ndGggPCAyIHx8IGluZGljZXMubGVuZ3RoICUgMyAhPT0gMCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJnZW9tZXRyeS5pbmRpY2VzIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIGFuZCBiZSBhIG11bHRpcGxlIG9mIDMuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKGdlb21ldHJ5LnByaW1pdGl2ZVR5cGUgIT09IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5UUklBTkdMRVMpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAiZ2VvbWV0cnkucHJpbWl0aXZlVHlwZSBtdXN0IGJlIFByaW1pdGl2ZVR5cGUuVFJJQU5HTEVTLiIKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHZlcnRpY2VzID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXM7CiAgICAgICAgY29uc3Qgbm9ybWFscyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsLnZhbHVlczsKICAgICAgICBjb25zdCBzdCA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMuc3QudmFsdWVzOwogICAgICAgIGNvbnN0IG51bVZlcnRpY2VzID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoIC8gMzsKICAgICAgICBjb25zdCBudW1JbmRpY2VzID0gaW5kaWNlcy5sZW5ndGg7CiAgICAgICAgY29uc3QgdGFuMSA9IG5ldyBBcnJheShudW1WZXJ0aWNlcyAqIDMpOwogICAgICAgIGxldCBpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCB0YW4xLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0YW4xW2ldID0gMDsKICAgICAgICB9CiAgICAgICAgbGV0IGkwMzsKICAgICAgICBsZXQgaTEzOwogICAgICAgIGxldCBpMjM7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUluZGljZXM7IGkgKz0gMykgewogICAgICAgICAgY29uc3QgaTAgPSBpbmRpY2VzW2ldOwogICAgICAgICAgY29uc3QgaTEgPSBpbmRpY2VzW2kgKyAxXTsKICAgICAgICAgIGNvbnN0IGkyID0gaW5kaWNlc1tpICsgMl07CiAgICAgICAgICBpMDMgPSBpMCAqIDM7CiAgICAgICAgICBpMTMgPSBpMSAqIDM7CiAgICAgICAgICBpMjMgPSBpMiAqIDM7CiAgICAgICAgICBjb25zdCBpMDIgPSBpMCAqIDI7CiAgICAgICAgICBjb25zdCBpMTIgPSBpMSAqIDI7CiAgICAgICAgICBjb25zdCBpMjIgPSBpMiAqIDI7CiAgICAgICAgICBjb25zdCB1eCA9IHZlcnRpY2VzW2kwM107CiAgICAgICAgICBjb25zdCB1eSA9IHZlcnRpY2VzW2kwMyArIDFdOwogICAgICAgICAgY29uc3QgdXogPSB2ZXJ0aWNlc1tpMDMgKyAyXTsKICAgICAgICAgIGNvbnN0IHd4ID0gc3RbaTAyXTsKICAgICAgICAgIGNvbnN0IHd5ID0gc3RbaTAyICsgMV07CiAgICAgICAgICBjb25zdCB0MSA9IHN0W2kxMiArIDFdIC0gd3k7CiAgICAgICAgICBjb25zdCB0MiA9IHN0W2kyMiArIDFdIC0gd3k7CiAgICAgICAgICBjb25zdCByID0gMSAvICgoc3RbaTEyXSAtIHd4KSAqIHQyIC0gKHN0W2kyMl0gLSB3eCkgKiB0MSk7CiAgICAgICAgICBjb25zdCBzZGlyeCA9ICh0MiAqICh2ZXJ0aWNlc1tpMTNdIC0gdXgpIC0gdDEgKiAodmVydGljZXNbaTIzXSAtIHV4KSkgKiByOwogICAgICAgICAgY29uc3Qgc2RpcnkgPSAodDIgKiAodmVydGljZXNbaTEzICsgMV0gLSB1eSkgLSB0MSAqICh2ZXJ0aWNlc1tpMjMgKyAxXSAtIHV5KSkgKiByOwogICAgICAgICAgY29uc3Qgc2RpcnogPSAodDIgKiAodmVydGljZXNbaTEzICsgMl0gLSB1eikgLSB0MSAqICh2ZXJ0aWNlc1tpMjMgKyAyXSAtIHV6KSkgKiByOwogICAgICAgICAgdGFuMVtpMDNdICs9IHNkaXJ4OwogICAgICAgICAgdGFuMVtpMDMgKyAxXSArPSBzZGlyeTsKICAgICAgICAgIHRhbjFbaTAzICsgMl0gKz0gc2Rpcno7CiAgICAgICAgICB0YW4xW2kxM10gKz0gc2Rpcng7CiAgICAgICAgICB0YW4xW2kxMyArIDFdICs9IHNkaXJ5OwogICAgICAgICAgdGFuMVtpMTMgKyAyXSArPSBzZGlyejsKICAgICAgICAgIHRhbjFbaTIzXSArPSBzZGlyeDsKICAgICAgICAgIHRhbjFbaTIzICsgMV0gKz0gc2Rpcnk7CiAgICAgICAgICB0YW4xW2kyMyArIDJdICs9IHNkaXJ6OwogICAgICAgIH0KICAgICAgICBjb25zdCB0YW5nZW50VmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShudW1WZXJ0aWNlcyAqIDMpOwogICAgICAgIGNvbnN0IGJpdGFuZ2VudFZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkobnVtVmVydGljZXMgKiAzKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVmVydGljZXM7IGkrKykgewogICAgICAgICAgaTAzID0gaSAqIDM7CiAgICAgICAgICBpMTMgPSBpMDMgKyAxOwogICAgICAgICAgaTIzID0gaTAzICsgMjsKICAgICAgICAgIGNvbnN0IG4gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KG5vcm1hbHMsIGkwMywgbm9ybWFsU2NyYXRjaDIpOwogICAgICAgICAgY29uc3QgdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkodGFuMSwgaTAzLCB0U2NyYXRjaCk7CiAgICAgICAgICBjb25zdCBzY2FsYXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KG4sIHQpOwogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIobiwgc2NhbGFyLCBub3JtYWxTY2FsZSk7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdCh0LCBub3JtYWxTY2FsZSwgdCksIHQpOwogICAgICAgICAgdGFuZ2VudFZhbHVlc1tpMDNdID0gdC54OwogICAgICAgICAgdGFuZ2VudFZhbHVlc1tpMTNdID0gdC55OwogICAgICAgICAgdGFuZ2VudFZhbHVlc1tpMjNdID0gdC56OwogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3MobiwgdCwgdCksIHQpOwogICAgICAgICAgYml0YW5nZW50VmFsdWVzW2kwM10gPSB0Lng7CiAgICAgICAgICBiaXRhbmdlbnRWYWx1ZXNbaTEzXSA9IHQueTsKICAgICAgICAgIGJpdGFuZ2VudFZhbHVlc1tpMjNdID0gdC56OwogICAgICAgIH0KICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLnRhbmdlbnQgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5GTE9BVCwKICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgICB2YWx1ZXM6IHRhbmdlbnRWYWx1ZXMKICAgICAgICB9KTsKICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLmJpdGFuZ2VudCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgIHZhbHVlczogYml0YW5nZW50VmFsdWVzCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGdlb21ldHJ5OwogICAgICB9OwogICAgICBzY3JhdGNoQ2FydGVzaWFuMjIgPSBuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KCk7CiAgICAgIHRvRW5jb2RlMSA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgdG9FbmNvZGUyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICB0b0VuY29kZTMgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGVuY29kZVJlc3VsdDIgPSBuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KCk7CiAgICAgIEdlb21ldHJ5UGlwZWxpbmUuY29tcHJlc3NWZXJ0aWNlcyA9IGZ1bmN0aW9uKGdlb21ldHJ5KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZ2VvbWV0cnkpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZ2VvbWV0cnkgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGV4dHJ1ZGVBdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLmV4dHJ1ZGVEaXJlY3Rpb247CiAgICAgICAgbGV0IGk7CiAgICAgICAgbGV0IG51bVZlcnRpY2VzOwogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoZXh0cnVkZUF0dHJpYnV0ZSkpIHsKICAgICAgICAgIGNvbnN0IGV4dHJ1ZGVEaXJlY3Rpb25zID0gZXh0cnVkZUF0dHJpYnV0ZS52YWx1ZXM7CiAgICAgICAgICBudW1WZXJ0aWNlcyA9IGV4dHJ1ZGVEaXJlY3Rpb25zLmxlbmd0aCAvIDM7CiAgICAgICAgICBjb25zdCBjb21wcmVzc2VkRGlyZWN0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkobnVtVmVydGljZXMgKiAyKTsKICAgICAgICAgIGxldCBpMiA9IDA7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVmVydGljZXM7ICsraSkgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KGV4dHJ1ZGVEaXJlY3Rpb25zLCBpICogMywgdG9FbmNvZGUxKTsKICAgICAgICAgICAgaWYgKENhcnRlc2lhbjNfZGVmYXVsdC5lcXVhbHModG9FbmNvZGUxLCBDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTykpIHsKICAgICAgICAgICAgICBpMiArPSAyOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVuY29kZVJlc3VsdDIgPSBBdHRyaWJ1dGVDb21wcmVzc2lvbl9kZWZhdWx0Lm9jdEVuY29kZUluUmFuZ2UoCiAgICAgICAgICAgICAgdG9FbmNvZGUxLAogICAgICAgICAgICAgIDY1NTM1LAogICAgICAgICAgICAgIGVuY29kZVJlc3VsdDIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgY29tcHJlc3NlZERpcmVjdGlvbnNbaTIrK10gPSBlbmNvZGVSZXN1bHQyLng7CiAgICAgICAgICAgIGNvbXByZXNzZWREaXJlY3Rpb25zW2kyKytdID0gZW5jb2RlUmVzdWx0Mi55OwogICAgICAgICAgfQogICAgICAgICAgZ2VvbWV0cnkuYXR0cmlidXRlcy5jb21wcmVzc2VkQXR0cmlidXRlcyA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDIsCiAgICAgICAgICAgIHZhbHVlczogY29tcHJlc3NlZERpcmVjdGlvbnMKICAgICAgICAgIH0pOwogICAgICAgICAgZGVsZXRlIGdlb21ldHJ5LmF0dHJpYnV0ZXMuZXh0cnVkZURpcmVjdGlvbjsKICAgICAgICAgIHJldHVybiBnZW9tZXRyeTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgbm9ybWFsQXR0cmlidXRlID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWw7CiAgICAgICAgY29uc3Qgc3RBdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnN0OwogICAgICAgIGNvbnN0IGhhc05vcm1hbCA9IGRlZmluZWRfZGVmYXVsdChub3JtYWxBdHRyaWJ1dGUpOwogICAgICAgIGNvbnN0IGhhc1N0ID0gZGVmaW5lZF9kZWZhdWx0KHN0QXR0cmlidXRlKTsKICAgICAgICBpZiAoIWhhc05vcm1hbCAmJiAhaGFzU3QpIHsKICAgICAgICAgIHJldHVybiBnZW9tZXRyeTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdGFuZ2VudEF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMudGFuZ2VudDsKICAgICAgICBjb25zdCBiaXRhbmdlbnRBdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLmJpdGFuZ2VudDsKICAgICAgICBjb25zdCBoYXNUYW5nZW50ID0gZGVmaW5lZF9kZWZhdWx0KHRhbmdlbnRBdHRyaWJ1dGUpOwogICAgICAgIGNvbnN0IGhhc0JpdGFuZ2VudCA9IGRlZmluZWRfZGVmYXVsdChiaXRhbmdlbnRBdHRyaWJ1dGUpOwogICAgICAgIGxldCBub3JtYWxzOwogICAgICAgIGxldCBzdDsKICAgICAgICBsZXQgdGFuZ2VudHM7CiAgICAgICAgbGV0IGJpdGFuZ2VudHM7CiAgICAgICAgaWYgKGhhc05vcm1hbCkgewogICAgICAgICAgbm9ybWFscyA9IG5vcm1hbEF0dHJpYnV0ZS52YWx1ZXM7CiAgICAgICAgfQogICAgICAgIGlmIChoYXNTdCkgewogICAgICAgICAgc3QgPSBzdEF0dHJpYnV0ZS52YWx1ZXM7CiAgICAgICAgfQogICAgICAgIGlmIChoYXNUYW5nZW50KSB7CiAgICAgICAgICB0YW5nZW50cyA9IHRhbmdlbnRBdHRyaWJ1dGUudmFsdWVzOwogICAgICAgIH0KICAgICAgICBpZiAoaGFzQml0YW5nZW50KSB7CiAgICAgICAgICBiaXRhbmdlbnRzID0gYml0YW5nZW50QXR0cmlidXRlLnZhbHVlczsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGVuZ3RoID0gaGFzTm9ybWFsID8gbm9ybWFscy5sZW5ndGggOiBzdC5sZW5ndGg7CiAgICAgICAgY29uc3QgbnVtQ29tcG9uZW50cyA9IGhhc05vcm1hbCA/IDMgOiAyOwogICAgICAgIG51bVZlcnRpY2VzID0gbGVuZ3RoIC8gbnVtQ29tcG9uZW50czsKICAgICAgICBsZXQgY29tcHJlc3NlZExlbmd0aCA9IG51bVZlcnRpY2VzOwogICAgICAgIGxldCBudW1Db21wcmVzc2VkQ29tcG9uZW50cyA9IGhhc1N0ICYmIGhhc05vcm1hbCA/IDIgOiAxOwogICAgICAgIG51bUNvbXByZXNzZWRDb21wb25lbnRzICs9IGhhc1RhbmdlbnQgfHwgaGFzQml0YW5nZW50ID8gMSA6IDA7CiAgICAgICAgY29tcHJlc3NlZExlbmd0aCAqPSBudW1Db21wcmVzc2VkQ29tcG9uZW50czsKICAgICAgICBjb25zdCBjb21wcmVzc2VkQXR0cmlidXRlcyA9IG5ldyBGbG9hdDMyQXJyYXkoY29tcHJlc3NlZExlbmd0aCk7CiAgICAgICAgbGV0IG5vcm1hbEluZGV4ID0gMDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVmVydGljZXM7ICsraSkgewogICAgICAgICAgaWYgKGhhc1N0KSB7CiAgICAgICAgICAgIENhcnRlc2lhbjJfZGVmYXVsdC5mcm9tQXJyYXkoc3QsIGkgKiAyLCBzY3JhdGNoQ2FydGVzaWFuMjIpOwogICAgICAgICAgICBjb21wcmVzc2VkQXR0cmlidXRlc1tub3JtYWxJbmRleCsrXSA9IEF0dHJpYnV0ZUNvbXByZXNzaW9uX2RlZmF1bHQuY29tcHJlc3NUZXh0dXJlQ29vcmRpbmF0ZXMoc2NyYXRjaENhcnRlc2lhbjIyKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGluZGV4ID0gaSAqIDM7CiAgICAgICAgICBpZiAoaGFzTm9ybWFsICYmIGRlZmluZWRfZGVmYXVsdCh0YW5nZW50cykgJiYgZGVmaW5lZF9kZWZhdWx0KGJpdGFuZ2VudHMpKSB7CiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkobm9ybWFscywgaW5kZXgsIHRvRW5jb2RlMSk7CiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkodGFuZ2VudHMsIGluZGV4LCB0b0VuY29kZTIpOwogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KGJpdGFuZ2VudHMsIGluZGV4LCB0b0VuY29kZTMpOwogICAgICAgICAgICBBdHRyaWJ1dGVDb21wcmVzc2lvbl9kZWZhdWx0Lm9jdFBhY2soCiAgICAgICAgICAgICAgdG9FbmNvZGUxLAogICAgICAgICAgICAgIHRvRW5jb2RlMiwKICAgICAgICAgICAgICB0b0VuY29kZTMsCiAgICAgICAgICAgICAgc2NyYXRjaENhcnRlc2lhbjIyCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNvbXByZXNzZWRBdHRyaWJ1dGVzW25vcm1hbEluZGV4KytdID0gc2NyYXRjaENhcnRlc2lhbjIyLng7CiAgICAgICAgICAgIGNvbXByZXNzZWRBdHRyaWJ1dGVzW25vcm1hbEluZGV4KytdID0gc2NyYXRjaENhcnRlc2lhbjIyLnk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoaGFzTm9ybWFsKSB7CiAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShub3JtYWxzLCBpbmRleCwgdG9FbmNvZGUxKTsKICAgICAgICAgICAgICBjb21wcmVzc2VkQXR0cmlidXRlc1tub3JtYWxJbmRleCsrXSA9IEF0dHJpYnV0ZUNvbXByZXNzaW9uX2RlZmF1bHQub2N0RW5jb2RlRmxvYXQodG9FbmNvZGUxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaGFzVGFuZ2VudCkgewogICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkodGFuZ2VudHMsIGluZGV4LCB0b0VuY29kZTEpOwogICAgICAgICAgICAgIGNvbXByZXNzZWRBdHRyaWJ1dGVzW25vcm1hbEluZGV4KytdID0gQXR0cmlidXRlQ29tcHJlc3Npb25fZGVmYXVsdC5vY3RFbmNvZGVGbG9hdCh0b0VuY29kZTEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChoYXNCaXRhbmdlbnQpIHsKICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KGJpdGFuZ2VudHMsIGluZGV4LCB0b0VuY29kZTEpOwogICAgICAgICAgICAgIGNvbXByZXNzZWRBdHRyaWJ1dGVzW25vcm1hbEluZGV4KytdID0gQXR0cmlidXRlQ29tcHJlc3Npb25fZGVmYXVsdC5vY3RFbmNvZGVGbG9hdCh0b0VuY29kZTEpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMuY29tcHJlc3NlZEF0dHJpYnV0ZXMgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5GTE9BVCwKICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IG51bUNvbXByZXNzZWRDb21wb25lbnRzLAogICAgICAgICAgdmFsdWVzOiBjb21wcmVzc2VkQXR0cmlidXRlcwogICAgICAgIH0pOwogICAgICAgIGlmIChoYXNOb3JtYWwpIHsKICAgICAgICAgIGRlbGV0ZSBnZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbDsKICAgICAgICB9CiAgICAgICAgaWYgKGhhc1N0KSB7CiAgICAgICAgICBkZWxldGUgZ2VvbWV0cnkuYXR0cmlidXRlcy5zdDsKICAgICAgICB9CiAgICAgICAgaWYgKGhhc0JpdGFuZ2VudCkgewogICAgICAgICAgZGVsZXRlIGdlb21ldHJ5LmF0dHJpYnV0ZXMuYml0YW5nZW50OwogICAgICAgIH0KICAgICAgICBpZiAoaGFzVGFuZ2VudCkgewogICAgICAgICAgZGVsZXRlIGdlb21ldHJ5LmF0dHJpYnV0ZXMudGFuZ2VudDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGdlb21ldHJ5OwogICAgICB9OwogICAgICBjMyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgdTEgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHUyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBxMSA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgcTIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNwbGl0VHJpYW5nbGVSZXN1bHQgPSB7CiAgICAgICAgcG9zaXRpb25zOiBuZXcgQXJyYXkoNyksCiAgICAgICAgaW5kaWNlczogbmV3IEFycmF5KDMgKiAzKQogICAgICB9OwogICAgICBpbnRlcnBvbGF0ZUFuZFBhY2tDYXJ0ZXNpYW40ID0gZ2VuZXJhdGVCYXJ5Y2VudHJpY0ludGVycG9sYXRlRnVuY3Rpb24oCiAgICAgICAgQ2FydGVzaWFuNF9kZWZhdWx0LAogICAgICAgIDQKICAgICAgKTsKICAgICAgaW50ZXJwb2xhdGVBbmRQYWNrQ2FydGVzaWFuMyA9IGdlbmVyYXRlQmFyeWNlbnRyaWNJbnRlcnBvbGF0ZUZ1bmN0aW9uKAogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdCwKICAgICAgICAzCiAgICAgICk7CiAgICAgIGludGVycG9sYXRlQW5kUGFja0NhcnRlc2lhbjIgPSBnZW5lcmF0ZUJhcnljZW50cmljSW50ZXJwb2xhdGVGdW5jdGlvbigKICAgICAgICBDYXJ0ZXNpYW4yX2RlZmF1bHQsCiAgICAgICAgMgogICAgICApOwogICAgICBpbnRlcnBvbGF0ZUFuZFBhY2tCb29sZWFuID0gZnVuY3Rpb24oaTAsIGkxLCBpMiwgY29vcmRzLCBzb3VyY2VWYWx1ZXMsIGN1cnJlbnRWYWx1ZXMsIGluc2VydGVkSW5kZXgpIHsKICAgICAgICBjb25zdCB2MTIgPSBzb3VyY2VWYWx1ZXNbaTBdICogY29vcmRzLng7CiAgICAgICAgY29uc3QgdjIyID0gc291cmNlVmFsdWVzW2kxXSAqIGNvb3Jkcy55OwogICAgICAgIGNvbnN0IHYzID0gc291cmNlVmFsdWVzW2kyXSAqIGNvb3Jkcy56OwogICAgICAgIGN1cnJlbnRWYWx1ZXNbaW5zZXJ0ZWRJbmRleF0gPSB2MTIgKyB2MjIgKyB2MyA+IE1hdGhfZGVmYXVsdC5FUFNJTE9ONiA/IDEgOiAwOwogICAgICB9OwogICAgICBwMFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHAxU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgcDJTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBiYXJ5Y2VudHJpY1NjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIE5BTUVEX0FUVFJJQlVURVMgPSB7CiAgICAgICAgcG9zaXRpb246IHRydWUsCiAgICAgICAgbm9ybWFsOiB0cnVlLAogICAgICAgIGJpdGFuZ2VudDogdHJ1ZSwKICAgICAgICB0YW5nZW50OiB0cnVlLAogICAgICAgIHN0OiB0cnVlLAogICAgICAgIGV4dHJ1ZGVEaXJlY3Rpb246IHRydWUsCiAgICAgICAgYXBwbHlPZmZzZXQ6IHRydWUKICAgICAgfTsKICAgICAgeHpQbGFuZSA9IFBsYW5lX2RlZmF1bHQuZnJvbVBvaW50Tm9ybWFsKENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPLCBDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9ZKTsKICAgICAgb2Zmc2V0U2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgb2Zmc2V0UG9pbnRTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYXJ0ZXNpYW4yU2NyYXRjaDAgPSBuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KCk7CiAgICAgIGNhcnRlc2lhbjJTY3JhdGNoMSA9IG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKTsKICAgICAgY2FydGVzaWFuM1NjcmF0Y2gwID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYXJ0ZXNpYW4zU2NyYXRjaDIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGNhcnRlc2lhbjNTY3JhdGNoMyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgY2FydGVzaWFuM1NjcmF0Y2g0ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYXJ0ZXNpYW4zU2NyYXRjaDUgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGNhcnRlc2lhbjNTY3JhdGNoNiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgY2FydGVzaWFuNFNjcmF0Y2gwID0gbmV3IENhcnRlc2lhbjRfZGVmYXVsdCgpOwogICAgICBvZmZzZXRTY2FsYXIgPSA1ICogTWF0aF9kZWZhdWx0LkVQU0lMT045OwogICAgICBjb3BsYW5hck9mZnNldCA9IE1hdGhfZGVmYXVsdC5FUFNJTE9ONjsKICAgICAgR2VvbWV0cnlQaXBlbGluZS5zcGxpdExvbmdpdHVkZSA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaW5zdGFuY2UpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiaW5zdGFuY2UgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGdlb21ldHJ5ID0gaW5zdGFuY2UuZ2VvbWV0cnk7CiAgICAgICAgY29uc3QgYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZTsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGJvdW5kaW5nU3BoZXJlKSkgewogICAgICAgICAgY29uc3QgbWluWCA9IGJvdW5kaW5nU3BoZXJlLmNlbnRlci54IC0gYm91bmRpbmdTcGhlcmUucmFkaXVzOwogICAgICAgICAgaWYgKG1pblggPiAwIHx8IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQuaW50ZXJzZWN0UGxhbmUoYm91bmRpbmdTcGhlcmUsIFBsYW5lX2RlZmF1bHQuT1JJR0lOX1pYX1BMQU5FKSAhPT0gSW50ZXJzZWN0X2RlZmF1bHQuSU5URVJTRUNUSU5HKSB7CiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGdlb21ldHJ5Lmdlb21ldHJ5VHlwZSAhPT0gR2VvbWV0cnlUeXBlX2RlZmF1bHQuTk9ORSkgewogICAgICAgICAgc3dpdGNoIChnZW9tZXRyeS5nZW9tZXRyeVR5cGUpIHsKICAgICAgICAgICAgY2FzZSBHZW9tZXRyeVR5cGVfZGVmYXVsdC5QT0xZTElORVM6CiAgICAgICAgICAgICAgc3BsaXRMb25naXR1ZGVQb2x5bGluZShpbnN0YW5jZSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgR2VvbWV0cnlUeXBlX2RlZmF1bHQuVFJJQU5HTEVTOgogICAgICAgICAgICAgIHNwbGl0TG9uZ2l0dWRlVHJpYW5nbGVzKGluc3RhbmNlKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBHZW9tZXRyeVR5cGVfZGVmYXVsdC5MSU5FUzoKICAgICAgICAgICAgICBzcGxpdExvbmdpdHVkZUxpbmVzKGluc3RhbmNlKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5kZXhQcmltaXRpdmUoZ2VvbWV0cnkpOwogICAgICAgICAgaWYgKGdlb21ldHJ5LnByaW1pdGl2ZVR5cGUgPT09IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5UUklBTkdMRVMpIHsKICAgICAgICAgICAgc3BsaXRMb25naXR1ZGVUcmlhbmdsZXMoaW5zdGFuY2UpOwogICAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS5wcmltaXRpdmVUeXBlID09PSBQcmltaXRpdmVUeXBlX2RlZmF1bHQuTElORVMpIHsKICAgICAgICAgICAgc3BsaXRMb25naXR1ZGVMaW5lcyhpbnN0YW5jZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgICAgfTsKICAgICAgR2VvbWV0cnlQaXBlbGluZV9kZWZhdWx0ID0gR2VvbWV0cnlQaXBlbGluZTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL09mZnNldEdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGUuanMKICBmdW5jdGlvbiBPZmZzZXRHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlKHgsIHksIHopIHsKICAgIHggPSB4ID8/IDA7CiAgICB5ID0geSA/PyAwOwogICAgeiA9IHogPz8gMDsKICAgIHRoaXMudmFsdWUgPSBuZXcgRmxvYXQzMkFycmF5KFt4LCB5LCB6XSk7CiAgfQogIHZhciBPZmZzZXRHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlX2RlZmF1bHQ7CiAgdmFyIGluaXRfT2Zmc2V0R2VvbWV0cnlJbnN0YW5jZUF0dHJpYnV0ZSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvT2Zmc2V0R2VvbWV0cnlJbnN0YW5jZUF0dHJpYnV0ZS5qcyIoKSB7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9Db21wb25lbnREYXRhdHlwZSgpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoT2Zmc2V0R2VvbWV0cnlJbnN0YW5jZUF0dHJpYnV0ZS5wcm90b3R5cGUsIHsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZGF0YXR5cGUgb2YgZWFjaCBjb21wb25lbnQgaW4gdGhlIGF0dHJpYnV0ZSwgZS5nLiwgaW5kaXZpZHVhbCBlbGVtZW50cyBpbgogICAgICAgICAqIHtAbGluayBPZmZzZXRHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlI3ZhbHVlfS4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBPZmZzZXRHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlLnByb3RvdHlwZQogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge0NvbXBvbmVudERhdGF0eXBlfQogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqCiAgICAgICAgICogQGRlZmF1bHQge0BsaW5rIENvbXBvbmVudERhdGF0eXBlLkZMT0FUfQogICAgICAgICAqLwogICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5GTE9BVDsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aGUgYXR0cmlidXRlcywgaS5lLiwge0BsaW5rIE9mZnNldEdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGUjdmFsdWV9LgogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIE9mZnNldEdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGUucHJvdG90eXBlCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqCiAgICAgICAgICogQGRlZmF1bHQgMwogICAgICAgICAqLwogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAzOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiA8Y29kZT50cnVlPC9jb2RlPiBhbmQgPGNvZGU+Y29tcG9uZW50RGF0YXR5cGU8L2NvZGU+IGlzIGFuIGludGVnZXIgZm9ybWF0LAogICAgICAgICAqIGluZGljYXRlIHRoYXQgdGhlIGNvbXBvbmVudHMgc2hvdWxkIGJlIG1hcHBlZCB0byB0aGUgcmFuZ2UgWzAsIDFdICh1bnNpZ25lZCkKICAgICAgICAgKiBvciBbLTEsIDFdIChzaWduZWQpIHdoZW4gdGhleSBhcmUgYWNjZXNzZWQgYXMgZmxvYXRpbmctcG9pbnQgZm9yIHJlbmRlcmluZy4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBPZmZzZXRHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlLnByb3RvdHlwZQogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59CiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICoKICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZQogICAgICAgICAqLwogICAgICAgIG5vcm1hbGl6ZTogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIE9mZnNldEdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGUuZnJvbUNhcnRlc2lhbjMgPSBmdW5jdGlvbihvZmZzZXQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoIm9mZnNldCIsIG9mZnNldCk7CiAgICAgICAgcmV0dXJuIG5ldyBPZmZzZXRHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlKG9mZnNldC54LCBvZmZzZXQueSwgb2Zmc2V0LnopOwogICAgICB9OwogICAgICBPZmZzZXRHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlLnRvVmFsdWUgPSBmdW5jdGlvbihvZmZzZXQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgib2Zmc2V0Iiwgb2Zmc2V0KTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgRmxvYXQzMkFycmF5KFtvZmZzZXQueCwgb2Zmc2V0LnksIG9mZnNldC56XSk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdFswXSA9IG9mZnNldC54OwogICAgICAgIHJlc3VsdFsxXSA9IG9mZnNldC55OwogICAgICAgIHJlc3VsdFsyXSA9IG9mZnNldC56OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE9mZnNldEdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGVfZGVmYXVsdCA9IE9mZnNldEdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGU7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9XZWJNZXJjYXRvclByb2plY3Rpb24uanMKICBmdW5jdGlvbiBXZWJNZXJjYXRvclByb2plY3Rpb24oZWxsaXBzb2lkKSB7CiAgICB0aGlzLl9lbGxpcHNvaWQgPSBlbGxpcHNvaWQgPz8gRWxsaXBzb2lkX2RlZmF1bHQuV0dTODQ7CiAgICB0aGlzLl9zZW1pbWFqb3JBeGlzID0gdGhpcy5fZWxsaXBzb2lkLm1heGltdW1SYWRpdXM7CiAgICB0aGlzLl9vbmVPdmVyU2VtaW1ham9yQXhpcyA9IDEgLyB0aGlzLl9zZW1pbWFqb3JBeGlzOwogIH0KICB2YXIgV2ViTWVyY2F0b3JQcm9qZWN0aW9uX2RlZmF1bHQ7CiAgdmFyIGluaXRfV2ViTWVyY2F0b3JQcm9qZWN0aW9uID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9XZWJNZXJjYXRvclByb2plY3Rpb24uanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DYXJ0b2dyYXBoaWMoKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFdlYk1lcmNhdG9yUHJvamVjdGlvbi5wcm90b3R5cGUsIHsKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSB7QGxpbmsgRWxsaXBzb2lkfS4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBXZWJNZXJjYXRvclByb2plY3Rpb24ucHJvdG90eXBlCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7RWxsaXBzb2lkfQogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqLwogICAgICAgIGVsbGlwc29pZDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VsbGlwc29pZDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBXZWJNZXJjYXRvclByb2plY3Rpb24ubWVyY2F0b3JBbmdsZVRvR2VvZGV0aWNMYXRpdHVkZSA9IGZ1bmN0aW9uKG1lcmNhdG9yQW5nbGUpIHsKICAgICAgICByZXR1cm4gTWF0aF9kZWZhdWx0LlBJX09WRVJfVFdPIC0gMiAqIE1hdGguYXRhbihNYXRoLmV4cCgtbWVyY2F0b3JBbmdsZSkpOwogICAgICB9OwogICAgICBXZWJNZXJjYXRvclByb2plY3Rpb24uZ2VvZGV0aWNMYXRpdHVkZVRvTWVyY2F0b3JBbmdsZSA9IGZ1bmN0aW9uKGxhdGl0dWRlKSB7CiAgICAgICAgaWYgKGxhdGl0dWRlID4gV2ViTWVyY2F0b3JQcm9qZWN0aW9uLk1heGltdW1MYXRpdHVkZSkgewogICAgICAgICAgbGF0aXR1ZGUgPSBXZWJNZXJjYXRvclByb2plY3Rpb24uTWF4aW11bUxhdGl0dWRlOwogICAgICAgIH0gZWxzZSBpZiAobGF0aXR1ZGUgPCAtV2ViTWVyY2F0b3JQcm9qZWN0aW9uLk1heGltdW1MYXRpdHVkZSkgewogICAgICAgICAgbGF0aXR1ZGUgPSAtV2ViTWVyY2F0b3JQcm9qZWN0aW9uLk1heGltdW1MYXRpdHVkZTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc2luTGF0aXR1ZGUgPSBNYXRoLnNpbihsYXRpdHVkZSk7CiAgICAgICAgcmV0dXJuIDAuNSAqIE1hdGgubG9nKCgxICsgc2luTGF0aXR1ZGUpIC8gKDEgLSBzaW5MYXRpdHVkZSkpOwogICAgICB9OwogICAgICBXZWJNZXJjYXRvclByb2plY3Rpb24uTWF4aW11bUxhdGl0dWRlID0gV2ViTWVyY2F0b3JQcm9qZWN0aW9uLm1lcmNhdG9yQW5nbGVUb0dlb2RldGljTGF0aXR1ZGUoTWF0aC5QSSk7CiAgICAgIFdlYk1lcmNhdG9yUHJvamVjdGlvbi5wcm90b3R5cGUucHJvamVjdCA9IGZ1bmN0aW9uKGNhcnRvZ3JhcGhpYzIsIHJlc3VsdCkgewogICAgICAgIGNvbnN0IHNlbWltYWpvckF4aXMgPSB0aGlzLl9zZW1pbWFqb3JBeGlzOwogICAgICAgIGNvbnN0IHggPSBjYXJ0b2dyYXBoaWMyLmxvbmdpdHVkZSAqIHNlbWltYWpvckF4aXM7CiAgICAgICAgY29uc3QgeSA9IFdlYk1lcmNhdG9yUHJvamVjdGlvbi5nZW9kZXRpY0xhdGl0dWRlVG9NZXJjYXRvckFuZ2xlKAogICAgICAgICAgY2FydG9ncmFwaGljMi5sYXRpdHVkZQogICAgICAgICkgKiBzZW1pbWFqb3JBeGlzOwogICAgICAgIGNvbnN0IHogPSBjYXJ0b2dyYXBoaWMyLmhlaWdodDsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCh4LCB5LCB6KTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnggPSB4OwogICAgICAgIHJlc3VsdC55ID0geTsKICAgICAgICByZXN1bHQueiA9IHo7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgV2ViTWVyY2F0b3JQcm9qZWN0aW9uLnByb3RvdHlwZS51bnByb2plY3QgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoY2FydGVzaWFuMTEpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiY2FydGVzaWFuIGlzIHJlcXVpcmVkIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG9uZU92ZXJFYXJ0aFNlbWltYWpvckF4aXMgPSB0aGlzLl9vbmVPdmVyU2VtaW1ham9yQXhpczsKICAgICAgICBjb25zdCBsb25naXR1ZGUgPSBjYXJ0ZXNpYW4xMS54ICogb25lT3ZlckVhcnRoU2VtaW1ham9yQXhpczsKICAgICAgICBjb25zdCBsYXRpdHVkZSA9IFdlYk1lcmNhdG9yUHJvamVjdGlvbi5tZXJjYXRvckFuZ2xlVG9HZW9kZXRpY0xhdGl0dWRlKAogICAgICAgICAgY2FydGVzaWFuMTEueSAqIG9uZU92ZXJFYXJ0aFNlbWltYWpvckF4aXMKICAgICAgICApOwogICAgICAgIGNvbnN0IGhlaWdodCA9IGNhcnRlc2lhbjExLno7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdChsb25naXR1ZGUsIGxhdGl0dWRlLCBoZWlnaHQpOwogICAgICAgIH0KICAgICAgICByZXN1bHQubG9uZ2l0dWRlID0gbG9uZ2l0dWRlOwogICAgICAgIHJlc3VsdC5sYXRpdHVkZSA9IGxhdGl0dWRlOwogICAgICAgIHJlc3VsdC5oZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgV2ViTWVyY2F0b3JQcm9qZWN0aW9uX2RlZmF1bHQgPSBXZWJNZXJjYXRvclByb2plY3Rpb247CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvU2NlbmUvUHJpbWl0aXZlUGlwZWxpbmUuanMKICBmdW5jdGlvbiB0cmFuc2Zvcm1Ub1dvcmxkQ29vcmRpbmF0ZXMoaW5zdGFuY2VzLCBwcmltaXRpdmVNb2RlbE1hdHJpeCwgc2NlbmUzRE9ubHkpIHsKICAgIGxldCB0b1dvcmxkID0gIXNjZW5lM0RPbmx5OwogICAgY29uc3QgbGVuZ3RoID0gaW5zdGFuY2VzLmxlbmd0aDsKICAgIGxldCBpOwogICAgaWYgKCF0b1dvcmxkICYmIGxlbmd0aCA+IDEpIHsKICAgICAgY29uc3QgbW9kZWxNYXRyaXggPSBpbnN0YW5jZXNbMF0ubW9kZWxNYXRyaXg7CiAgICAgIGZvciAoaSA9IDE7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgIGlmICghTWF0cml4NF9kZWZhdWx0LmVxdWFscyhtb2RlbE1hdHJpeCwgaW5zdGFuY2VzW2ldLm1vZGVsTWF0cml4KSkgewogICAgICAgICAgdG9Xb3JsZCA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICh0b1dvcmxkKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoaW5zdGFuY2VzW2ldLmdlb21ldHJ5KSkgewogICAgICAgICAgR2VvbWV0cnlQaXBlbGluZV9kZWZhdWx0LnRyYW5zZm9ybVRvV29ybGRDb29yZGluYXRlcyhpbnN0YW5jZXNbaV0pOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5VHJhbnNmb3JtYXRpb24oCiAgICAgICAgcHJpbWl0aXZlTW9kZWxNYXRyaXgsCiAgICAgICAgaW5zdGFuY2VzWzBdLm1vZGVsTWF0cml4LAogICAgICAgIHByaW1pdGl2ZU1vZGVsTWF0cml4CiAgICAgICk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGFkZEdlb21ldHJ5QmF0Y2hJZChnZW9tZXRyeSwgYmF0Y2hJZCkgewogICAgY29uc3QgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7CiAgICBjb25zdCBwb3NpdGlvbkF0dHIgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgY29uc3QgbnVtYmVyT2ZDb21wb25lbnRzID0gcG9zaXRpb25BdHRyLnZhbHVlcy5sZW5ndGggLyBwb3NpdGlvbkF0dHIuY29tcG9uZW50c1BlckF0dHJpYnV0ZTsKICAgIGF0dHJpYnV0ZXMuYmF0Y2hJZCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDEsCiAgICAgIHZhbHVlczogbmV3IEZsb2F0MzJBcnJheShudW1iZXJPZkNvbXBvbmVudHMpCiAgICB9KTsKICAgIGNvbnN0IHZhbHVlcyA9IGF0dHJpYnV0ZXMuYmF0Y2hJZC52YWx1ZXM7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bWJlck9mQ29tcG9uZW50czsgKytqKSB7CiAgICAgIHZhbHVlc1tqXSA9IGJhdGNoSWQ7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGFkZEJhdGNoSWRzKGluc3RhbmNlcykgewogICAgY29uc3QgbGVuZ3RoID0gaW5zdGFuY2VzLmxlbmd0aDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgY29uc3QgaW5zdGFuY2UgPSBpbnN0YW5jZXNbaV07CiAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoaW5zdGFuY2UuZ2VvbWV0cnkpKSB7CiAgICAgICAgYWRkR2VvbWV0cnlCYXRjaElkKGluc3RhbmNlLmdlb21ldHJ5LCBpKTsKICAgICAgfSBlbHNlIGlmIChkZWZpbmVkX2RlZmF1bHQoaW5zdGFuY2Uud2VzdEhlbWlzcGhlcmVHZW9tZXRyeSkgJiYgZGVmaW5lZF9kZWZhdWx0KGluc3RhbmNlLmVhc3RIZW1pc3BoZXJlR2VvbWV0cnkpKSB7CiAgICAgICAgYWRkR2VvbWV0cnlCYXRjaElkKGluc3RhbmNlLndlc3RIZW1pc3BoZXJlR2VvbWV0cnksIGkpOwogICAgICAgIGFkZEdlb21ldHJ5QmF0Y2hJZChpbnN0YW5jZS5lYXN0SGVtaXNwaGVyZUdlb21ldHJ5LCBpKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBnZW9tZXRyeVBpcGVsaW5lKHBhcmFtZXRlcnMpIHsKICAgIGNvbnN0IGluc3RhbmNlcyA9IHBhcmFtZXRlcnMuaW5zdGFuY2VzOwogICAgY29uc3QgcHJvamVjdGlvbiA9IHBhcmFtZXRlcnMucHJvamVjdGlvbjsKICAgIGNvbnN0IHVpbnRJbmRleFN1cHBvcnQgPSBwYXJhbWV0ZXJzLmVsZW1lbnRJbmRleFVpbnRTdXBwb3J0ZWQ7CiAgICBjb25zdCBzY2VuZTNET25seSA9IHBhcmFtZXRlcnMuc2NlbmUzRE9ubHk7CiAgICBjb25zdCB2ZXJ0ZXhDYWNoZU9wdGltaXplID0gcGFyYW1ldGVycy52ZXJ0ZXhDYWNoZU9wdGltaXplOwogICAgY29uc3QgY29tcHJlc3NWZXJ0aWNlcyA9IHBhcmFtZXRlcnMuY29tcHJlc3NWZXJ0aWNlczsKICAgIGNvbnN0IG1vZGVsTWF0cml4ID0gcGFyYW1ldGVycy5tb2RlbE1hdHJpeDsKICAgIGxldCBpOwogICAgbGV0IGdlb21ldHJ5OwogICAgbGV0IHByaW1pdGl2ZVR5cGU7CiAgICBsZXQgbGVuZ3RoID0gaW5zdGFuY2VzLmxlbmd0aDsKICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGluc3RhbmNlc1tpXS5nZW9tZXRyeSkpIHsKICAgICAgICBwcmltaXRpdmVUeXBlID0gaW5zdGFuY2VzW2ldLmdlb21ldHJ5LnByaW1pdGl2ZVR5cGU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGZvciAoaSA9IDE7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGluc3RhbmNlc1tpXS5nZW9tZXRyeSkgJiYgaW5zdGFuY2VzW2ldLmdlb21ldHJ5LnByaW1pdGl2ZVR5cGUgIT09IHByaW1pdGl2ZVR5cGUpIHsKICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICJBbGwgaW5zdGFuY2UgZ2VvbWV0cmllcyBtdXN0IGhhdmUgdGhlIHNhbWUgcHJpbWl0aXZlVHlwZS4iCiAgICAgICAgKTsKICAgICAgfQogICAgfQogICAgdHJhbnNmb3JtVG9Xb3JsZENvb3JkaW5hdGVzKGluc3RhbmNlcywgbW9kZWxNYXRyaXgsIHNjZW5lM0RPbmx5KTsKICAgIGlmICghc2NlbmUzRE9ubHkpIHsKICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChpbnN0YW5jZXNbaV0uZ2VvbWV0cnkpKSB7CiAgICAgICAgICBHZW9tZXRyeVBpcGVsaW5lX2RlZmF1bHQuc3BsaXRMb25naXR1ZGUoaW5zdGFuY2VzW2ldKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGFkZEJhdGNoSWRzKGluc3RhbmNlcyk7CiAgICBpZiAodmVydGV4Q2FjaGVPcHRpbWl6ZSkgewogICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGluc3RhbmNlc1tpXTsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGluc3RhbmNlLmdlb21ldHJ5KSkgewogICAgICAgICAgR2VvbWV0cnlQaXBlbGluZV9kZWZhdWx0LnJlb3JkZXJGb3JQb3N0VmVydGV4Q2FjaGUoaW5zdGFuY2UuZ2VvbWV0cnkpOwogICAgICAgICAgR2VvbWV0cnlQaXBlbGluZV9kZWZhdWx0LnJlb3JkZXJGb3JQcmVWZXJ0ZXhDYWNoZShpbnN0YW5jZS5nZW9tZXRyeSk7CiAgICAgICAgfSBlbHNlIGlmIChkZWZpbmVkX2RlZmF1bHQoaW5zdGFuY2Uud2VzdEhlbWlzcGhlcmVHZW9tZXRyeSkgJiYgZGVmaW5lZF9kZWZhdWx0KGluc3RhbmNlLmVhc3RIZW1pc3BoZXJlR2VvbWV0cnkpKSB7CiAgICAgICAgICBHZW9tZXRyeVBpcGVsaW5lX2RlZmF1bHQucmVvcmRlckZvclBvc3RWZXJ0ZXhDYWNoZSgKICAgICAgICAgICAgaW5zdGFuY2Uud2VzdEhlbWlzcGhlcmVHZW9tZXRyeQogICAgICAgICAgKTsKICAgICAgICAgIEdlb21ldHJ5UGlwZWxpbmVfZGVmYXVsdC5yZW9yZGVyRm9yUHJlVmVydGV4Q2FjaGUoCiAgICAgICAgICAgIGluc3RhbmNlLndlc3RIZW1pc3BoZXJlR2VvbWV0cnkKICAgICAgICAgICk7CiAgICAgICAgICBHZW9tZXRyeVBpcGVsaW5lX2RlZmF1bHQucmVvcmRlckZvclBvc3RWZXJ0ZXhDYWNoZSgKICAgICAgICAgICAgaW5zdGFuY2UuZWFzdEhlbWlzcGhlcmVHZW9tZXRyeQogICAgICAgICAgKTsKICAgICAgICAgIEdlb21ldHJ5UGlwZWxpbmVfZGVmYXVsdC5yZW9yZGVyRm9yUHJlVmVydGV4Q2FjaGUoCiAgICAgICAgICAgIGluc3RhbmNlLmVhc3RIZW1pc3BoZXJlR2VvbWV0cnkKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBsZXQgZ2VvbWV0cmllcyA9IEdlb21ldHJ5UGlwZWxpbmVfZGVmYXVsdC5jb21iaW5lSW5zdGFuY2VzKGluc3RhbmNlcyk7CiAgICBsZW5ndGggPSBnZW9tZXRyaWVzLmxlbmd0aDsKICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBnZW9tZXRyeSA9IGdlb21ldHJpZXNbaV07CiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOwogICAgICBpZiAoIXNjZW5lM0RPbmx5KSB7CiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGF0dHJpYnV0ZXMpIHsKICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIGF0dHJpYnV0ZXNbbmFtZV0uY29tcG9uZW50RGF0YXR5cGUgPT09IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRE9VQkxFKSB7CiAgICAgICAgICAgIGNvbnN0IG5hbWUzRCA9IGAke25hbWV9M0RgOwogICAgICAgICAgICBjb25zdCBuYW1lMkQgPSBgJHtuYW1lfTJEYDsKICAgICAgICAgICAgR2VvbWV0cnlQaXBlbGluZV9kZWZhdWx0LnByb2plY3RUbzJEKAogICAgICAgICAgICAgIGdlb21ldHJ5LAogICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgbmFtZTNELAogICAgICAgICAgICAgIG5hbWUyRCwKICAgICAgICAgICAgICBwcm9qZWN0aW9uCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUpICYmIG5hbWUgPT09ICJwb3NpdGlvbiIpIHsKICAgICAgICAgICAgICBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZUNWID0gQm91bmRpbmdTcGhlcmVfZGVmYXVsdC5mcm9tVmVydGljZXMoCiAgICAgICAgICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uMkQudmFsdWVzCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBHZW9tZXRyeVBpcGVsaW5lX2RlZmF1bHQuZW5jb2RlQXR0cmlidXRlKAogICAgICAgICAgICAgIGdlb21ldHJ5LAogICAgICAgICAgICAgIG5hbWUzRCwKICAgICAgICAgICAgICBgJHtuYW1lM0R9SGlnaGAsCiAgICAgICAgICAgICAgYCR7bmFtZTNEfUxvd2AKICAgICAgICAgICAgKTsKICAgICAgICAgICAgR2VvbWV0cnlQaXBlbGluZV9kZWZhdWx0LmVuY29kZUF0dHJpYnV0ZSgKICAgICAgICAgICAgICBnZW9tZXRyeSwKICAgICAgICAgICAgICBuYW1lMkQsCiAgICAgICAgICAgICAgYCR7bmFtZTJEfUhpZ2hgLAogICAgICAgICAgICAgIGAke25hbWUyRH1Mb3dgCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBhdHRyaWJ1dGVzKSB7CiAgICAgICAgICBpZiAoYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiBhdHRyaWJ1dGVzW25hbWVdLmNvbXBvbmVudERhdGF0eXBlID09PSBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkRPVUJMRSkgewogICAgICAgICAgICBHZW9tZXRyeVBpcGVsaW5lX2RlZmF1bHQuZW5jb2RlQXR0cmlidXRlKAogICAgICAgICAgICAgIGdlb21ldHJ5LAogICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgYCR7bmFtZX0zREhpZ2hgLAogICAgICAgICAgICAgIGAke25hbWV9M0RMb3dgCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjb21wcmVzc1ZlcnRpY2VzKSB7CiAgICAgICAgR2VvbWV0cnlQaXBlbGluZV9kZWZhdWx0LmNvbXByZXNzVmVydGljZXMoZ2VvbWV0cnkpOwogICAgICB9CiAgICB9CiAgICBpZiAoIXVpbnRJbmRleFN1cHBvcnQpIHsKICAgICAgbGV0IHNwbGl0R2VvbWV0cmllcyA9IFtdOwogICAgICBsZW5ndGggPSBnZW9tZXRyaWVzLmxlbmd0aDsKICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyaWVzW2ldOwogICAgICAgIHNwbGl0R2VvbWV0cmllcyA9IHNwbGl0R2VvbWV0cmllcy5jb25jYXQoCiAgICAgICAgICBHZW9tZXRyeVBpcGVsaW5lX2RlZmF1bHQuZml0VG9VbnNpZ25lZFNob3J0SW5kaWNlcyhnZW9tZXRyeSkKICAgICAgICApOwogICAgICB9CiAgICAgIGdlb21ldHJpZXMgPSBzcGxpdEdlb21ldHJpZXM7CiAgICB9CiAgICByZXR1cm4gZ2VvbWV0cmllczsKICB9CiAgZnVuY3Rpb24gY3JlYXRlUGlja09mZnNldHMoaW5zdGFuY2VzLCBnZW9tZXRyeU5hbWUsIGdlb21ldHJpZXMsIHBpY2tPZmZzZXRzKSB7CiAgICBsZXQgb2Zmc2V0OwogICAgbGV0IGluZGV4Q291bnQ7CiAgICBsZXQgZ2VvbWV0cnlJbmRleDsKICAgIGNvbnN0IG9mZnNldEluZGV4ID0gcGlja09mZnNldHMubGVuZ3RoIC0gMTsKICAgIGlmIChvZmZzZXRJbmRleCA+PSAwKSB7CiAgICAgIGNvbnN0IHBpY2tPZmZzZXQgPSBwaWNrT2Zmc2V0c1tvZmZzZXRJbmRleF07CiAgICAgIG9mZnNldCA9IHBpY2tPZmZzZXQub2Zmc2V0ICsgcGlja09mZnNldC5jb3VudDsKICAgICAgZ2VvbWV0cnlJbmRleCA9IHBpY2tPZmZzZXQuaW5kZXg7CiAgICAgIGluZGV4Q291bnQgPSBnZW9tZXRyaWVzW2dlb21ldHJ5SW5kZXhdLmluZGljZXMubGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgb2Zmc2V0ID0gMDsKICAgICAgZ2VvbWV0cnlJbmRleCA9IDA7CiAgICAgIGluZGV4Q291bnQgPSBnZW9tZXRyaWVzW2dlb21ldHJ5SW5kZXhdLmluZGljZXMubGVuZ3RoOwogICAgfQogICAgY29uc3QgbGVuZ3RoID0gaW5zdGFuY2VzLmxlbmd0aDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgY29uc3QgaW5zdGFuY2UgPSBpbnN0YW5jZXNbaV07CiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gaW5zdGFuY2VbZ2VvbWV0cnlOYW1lXTsKICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZ2VvbWV0cnkpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgY291bnQgPSBnZW9tZXRyeS5pbmRpY2VzLmxlbmd0aDsKICAgICAgaWYgKG9mZnNldCArIGNvdW50ID4gaW5kZXhDb3VudCkgewogICAgICAgIG9mZnNldCA9IDA7CiAgICAgICAgaW5kZXhDb3VudCA9IGdlb21ldHJpZXNbKytnZW9tZXRyeUluZGV4XS5pbmRpY2VzLmxlbmd0aDsKICAgICAgfQogICAgICBwaWNrT2Zmc2V0cy5wdXNoKHsKICAgICAgICBpbmRleDogZ2VvbWV0cnlJbmRleCwKICAgICAgICBvZmZzZXQsCiAgICAgICAgY291bnQKICAgICAgfSk7CiAgICAgIG9mZnNldCArPSBjb3VudDsKICAgIH0KICB9CiAgZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VQaWNrT2Zmc2V0cyhpbnN0YW5jZXMsIGdlb21ldHJpZXMpIHsKICAgIGNvbnN0IHBpY2tPZmZzZXRzID0gW107CiAgICBjcmVhdGVQaWNrT2Zmc2V0cyhpbnN0YW5jZXMsICJnZW9tZXRyeSIsIGdlb21ldHJpZXMsIHBpY2tPZmZzZXRzKTsKICAgIGNyZWF0ZVBpY2tPZmZzZXRzKAogICAgICBpbnN0YW5jZXMsCiAgICAgICJ3ZXN0SGVtaXNwaGVyZUdlb21ldHJ5IiwKICAgICAgZ2VvbWV0cmllcywKICAgICAgcGlja09mZnNldHMKICAgICk7CiAgICBjcmVhdGVQaWNrT2Zmc2V0cygKICAgICAgaW5zdGFuY2VzLAogICAgICAiZWFzdEhlbWlzcGhlcmVHZW9tZXRyeSIsCiAgICAgIGdlb21ldHJpZXMsCiAgICAgIHBpY2tPZmZzZXRzCiAgICApOwogICAgcmV0dXJuIHBpY2tPZmZzZXRzOwogIH0KICBmdW5jdGlvbiB0cmFuc2Zlckdlb21ldHJ5KGdlb21ldHJ5LCB0cmFuc2ZlcmFibGVPYmplY3RzKSB7CiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlczsKICAgIGZvciAoY29uc3QgbmFtZSBpbiBhdHRyaWJ1dGVzKSB7CiAgICAgIGlmIChhdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlc1tuYW1lXTsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGF0dHJpYnV0ZSkgJiYgZGVmaW5lZF9kZWZhdWx0KGF0dHJpYnV0ZS52YWx1ZXMpKSB7CiAgICAgICAgICB0cmFuc2ZlcmFibGVPYmplY3RzLnB1c2goYXR0cmlidXRlLnZhbHVlcy5idWZmZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGRlZmluZWRfZGVmYXVsdChnZW9tZXRyeS5pbmRpY2VzKSkgewogICAgICB0cmFuc2ZlcmFibGVPYmplY3RzLnB1c2goZ2VvbWV0cnkuaW5kaWNlcy5idWZmZXIpOwogICAgfQogIH0KICBmdW5jdGlvbiB0cmFuc2Zlckdlb21ldHJpZXMoZ2VvbWV0cmllcywgdHJhbnNmZXJhYmxlT2JqZWN0cykgewogICAgY29uc3QgbGVuZ3RoID0gZ2VvbWV0cmllcy5sZW5ndGg7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIHRyYW5zZmVyR2VvbWV0cnkoZ2VvbWV0cmllc1tpXSwgdHJhbnNmZXJhYmxlT2JqZWN0cyk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGNvdW50Q3JlYXRlR2VvbWV0cnlSZXN1bHRzKGl0ZW1zKSB7CiAgICBsZXQgY291bnQgPSAxOwogICAgY29uc3QgbGVuZ3RoID0gaXRlbXMubGVuZ3RoOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBjb25zdCBnZW9tZXRyeSA9IGl0ZW1zW2ldOwogICAgICArK2NvdW50OwogICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChnZW9tZXRyeSkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlczsKICAgICAgY291bnQgKz0gNyArIDIgKiBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LnBhY2tlZExlbmd0aCArIChkZWZpbmVkX2RlZmF1bHQoZ2VvbWV0cnkuaW5kaWNlcykgPyBnZW9tZXRyeS5pbmRpY2VzLmxlbmd0aCA6IDApOwogICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGF0dHJpYnV0ZXMpIHsKICAgICAgICBpZiAoYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkgJiYgZGVmaW5lZF9kZWZhdWx0KGF0dHJpYnV0ZXNbcHJvcGVydHldKSkgewogICAgICAgICAgY29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlc1twcm9wZXJ0eV07CiAgICAgICAgICBjb3VudCArPSA1ICsgYXR0cmlidXRlLnZhbHVlcy5sZW5ndGg7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gY291bnQ7CiAgfQogIGZ1bmN0aW9uIHBhY2tJbnN0YW5jZXNGb3JDb21iaW5lKGluc3RhbmNlcywgdHJhbnNmZXJhYmxlT2JqZWN0cykgewogICAgY29uc3QgbGVuZ3RoID0gaW5zdGFuY2VzLmxlbmd0aDsKICAgIGNvbnN0IHBhY2tlZERhdGEgPSBuZXcgRmxvYXQ2NEFycmF5KDEgKyBsZW5ndGggKiAxOSk7CiAgICBsZXQgY291bnQgPSAwOwogICAgcGFja2VkRGF0YVtjb3VudCsrXSA9IGxlbmd0aDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgaW5zdGFuY2UgPSBpbnN0YW5jZXNbaV07CiAgICAgIE1hdHJpeDRfZGVmYXVsdC5wYWNrKGluc3RhbmNlLm1vZGVsTWF0cml4LCBwYWNrZWREYXRhLCBjb3VudCk7CiAgICAgIGNvdW50ICs9IE1hdHJpeDRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoaW5zdGFuY2UuYXR0cmlidXRlcykgJiYgZGVmaW5lZF9kZWZhdWx0KGluc3RhbmNlLmF0dHJpYnV0ZXMub2Zmc2V0KSkgewogICAgICAgIGNvbnN0IHZhbHVlcyA9IGluc3RhbmNlLmF0dHJpYnV0ZXMub2Zmc2V0LnZhbHVlOwogICAgICAgIHBhY2tlZERhdGFbY291bnRdID0gdmFsdWVzWzBdOwogICAgICAgIHBhY2tlZERhdGFbY291bnQgKyAxXSA9IHZhbHVlc1sxXTsKICAgICAgICBwYWNrZWREYXRhW2NvdW50ICsgMl0gPSB2YWx1ZXNbMl07CiAgICAgIH0KICAgICAgY291bnQgKz0gMzsKICAgIH0KICAgIHRyYW5zZmVyYWJsZU9iamVjdHMucHVzaChwYWNrZWREYXRhLmJ1ZmZlcik7CiAgICByZXR1cm4gcGFja2VkRGF0YTsKICB9CiAgZnVuY3Rpb24gdW5wYWNrSW5zdGFuY2VzRm9yQ29tYmluZShkYXRhKSB7CiAgICBjb25zdCBwYWNrZWRJbnN0YW5jZXMgPSBkYXRhOwogICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KHBhY2tlZEluc3RhbmNlc1swXSk7CiAgICBsZXQgY291bnQgPSAwOwogICAgbGV0IGkgPSAxOwogICAgd2hpbGUgKGkgPCBwYWNrZWRJbnN0YW5jZXMubGVuZ3RoKSB7CiAgICAgIGNvbnN0IG1vZGVsTWF0cml4ID0gTWF0cml4NF9kZWZhdWx0LnVucGFjayhwYWNrZWRJbnN0YW5jZXMsIGkpOwogICAgICBsZXQgYXR0cmlidXRlczsKICAgICAgaSArPSBNYXRyaXg0X2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHBhY2tlZEluc3RhbmNlc1tpXSkpIHsKICAgICAgICBhdHRyaWJ1dGVzID0gewogICAgICAgICAgb2Zmc2V0OiBuZXcgT2Zmc2V0R2VvbWV0cnlJbnN0YW5jZUF0dHJpYnV0ZV9kZWZhdWx0KAogICAgICAgICAgICBwYWNrZWRJbnN0YW5jZXNbaV0sCiAgICAgICAgICAgIHBhY2tlZEluc3RhbmNlc1tpICsgMV0sCiAgICAgICAgICAgIHBhY2tlZEluc3RhbmNlc1tpICsgMl0KICAgICAgICAgICkKICAgICAgICB9OwogICAgICB9CiAgICAgIGkgKz0gMzsKICAgICAgcmVzdWx0W2NvdW50KytdID0gewogICAgICAgIG1vZGVsTWF0cml4LAogICAgICAgIGF0dHJpYnV0ZXMKICAgICAgfTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIHBhY2tCb3VuZGluZ1NwaGVyZXMoYm91bmRpbmdTcGhlcmVzKSB7CiAgICBjb25zdCBsZW5ndGggPSBib3VuZGluZ1NwaGVyZXMubGVuZ3RoOwogICAgY29uc3QgYnVmZmVyTGVuZ3RoID0gMSArIChCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LnBhY2tlZExlbmd0aCArIDEpICogbGVuZ3RoOwogICAgY29uc3QgYnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheShidWZmZXJMZW5ndGgpOwogICAgbGV0IGJ1ZmZlckluZGV4ID0gMDsKICAgIGJ1ZmZlcltidWZmZXJJbmRleCsrXSA9IGxlbmd0aDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgY29uc3QgYnMgPSBib3VuZGluZ1NwaGVyZXNbaV07CiAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGJzKSkgewogICAgICAgIGJ1ZmZlcltidWZmZXJJbmRleCsrXSA9IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnVmZmVyW2J1ZmZlckluZGV4KytdID0gMTsKICAgICAgICBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LnBhY2soYm91bmRpbmdTcGhlcmVzW2ldLCBidWZmZXIsIGJ1ZmZlckluZGV4KTsKICAgICAgfQogICAgICBidWZmZXJJbmRleCArPSBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgIH0KICAgIHJldHVybiBidWZmZXI7CiAgfQogIGZ1bmN0aW9uIHVucGFja0JvdW5kaW5nU3BoZXJlcyhidWZmZXIpIHsKICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheShidWZmZXJbMF0pOwogICAgbGV0IGNvdW50ID0gMDsKICAgIGxldCBpID0gMTsKICAgIHdoaWxlIChpIDwgYnVmZmVyLmxlbmd0aCkgewogICAgICBpZiAoYnVmZmVyW2krK10gPT09IDEpIHsKICAgICAgICByZXN1bHRbY291bnRdID0gQm91bmRpbmdTcGhlcmVfZGVmYXVsdC51bnBhY2soYnVmZmVyLCBpKTsKICAgICAgfQogICAgICArK2NvdW50OwogICAgICBpICs9IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgdmFyIFByaW1pdGl2ZVBpcGVsaW5lLCBQcmltaXRpdmVQaXBlbGluZV9kZWZhdWx0OwogIHZhciBpbml0X1ByaW1pdGl2ZVBpcGVsaW5lID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvU2NlbmUvUHJpbWl0aXZlUGlwZWxpbmUuanMiKCkgewogICAgICBpbml0X0JvdW5kaW5nU3BoZXJlKCk7CiAgICAgIGluaXRfQ29tcG9uZW50RGF0YXR5cGUoKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9HZW9ncmFwaGljUHJvamVjdGlvbigpOwogICAgICBpbml0X0dlb21ldHJ5KCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGUoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZXMoKTsKICAgICAgaW5pdF9HZW9tZXRyeVBpcGVsaW5lKCk7CiAgICAgIGluaXRfSW5kZXhEYXRhdHlwZSgpOwogICAgICBpbml0X01hdHJpeDQoKTsKICAgICAgaW5pdF9PZmZzZXRHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlKCk7CiAgICAgIGluaXRfV2ViTWVyY2F0b3JQcm9qZWN0aW9uKCk7CiAgICAgIFByaW1pdGl2ZVBpcGVsaW5lID0ge307CiAgICAgIFByaW1pdGl2ZVBpcGVsaW5lLmNvbWJpbmVHZW9tZXRyeSA9IGZ1bmN0aW9uKHBhcmFtZXRlcnMpIHsKICAgICAgICBsZXQgZ2VvbWV0cmllczsKICAgICAgICBsZXQgYXR0cmlidXRlTG9jYXRpb25zOwogICAgICAgIGNvbnN0IGluc3RhbmNlcyA9IHBhcmFtZXRlcnMuaW5zdGFuY2VzOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IGluc3RhbmNlcy5sZW5ndGg7CiAgICAgICAgbGV0IHBpY2tPZmZzZXRzOwogICAgICAgIGxldCBvZmZzZXRJbnN0YW5jZUV4dGVuZDsKICAgICAgICBsZXQgaGFzT2Zmc2V0ID0gZmFsc2U7CiAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgICAgIGdlb21ldHJpZXMgPSBnZW9tZXRyeVBpcGVsaW5lKHBhcmFtZXRlcnMpOwogICAgICAgICAgaWYgKGdlb21ldHJpZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBhdHRyaWJ1dGVMb2NhdGlvbnMgPSBHZW9tZXRyeVBpcGVsaW5lX2RlZmF1bHQuY3JlYXRlQXR0cmlidXRlTG9jYXRpb25zKAogICAgICAgICAgICAgIGdlb21ldHJpZXNbMF0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMuY3JlYXRlUGlja09mZnNldHMpIHsKICAgICAgICAgICAgICBwaWNrT2Zmc2V0cyA9IGNyZWF0ZUluc3RhbmNlUGlja09mZnNldHMoaW5zdGFuY2VzLCBnZW9tZXRyaWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChpbnN0YW5jZXNbMF0uYXR0cmlidXRlcykgJiYgZGVmaW5lZF9kZWZhdWx0KGluc3RhbmNlc1swXS5hdHRyaWJ1dGVzLm9mZnNldCkpIHsKICAgICAgICAgICAgb2Zmc2V0SW5zdGFuY2VFeHRlbmQgPSBuZXcgQXJyYXkobGVuZ3RoKTsKICAgICAgICAgICAgaGFzT2Zmc2V0ID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgYm91bmRpbmdTcGhlcmVzID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICAgICAgY29uc3QgYm91bmRpbmdTcGhlcmVzQ1YgPSBuZXcgQXJyYXkobGVuZ3RoKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGluc3RhbmNlc1tpXTsKICAgICAgICAgIGNvbnN0IGdlb21ldHJ5ID0gaW5zdGFuY2UuZ2VvbWV0cnk7CiAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGdlb21ldHJ5KSkgewogICAgICAgICAgICBib3VuZGluZ1NwaGVyZXNbaV0gPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZTsKICAgICAgICAgICAgYm91bmRpbmdTcGhlcmVzQ1ZbaV0gPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZUNWOwogICAgICAgICAgICBpZiAoaGFzT2Zmc2V0KSB7CiAgICAgICAgICAgICAgb2Zmc2V0SW5zdGFuY2VFeHRlbmRbaV0gPSBpbnN0YW5jZS5nZW9tZXRyeS5vZmZzZXRBdHRyaWJ1dGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGVhc3RIZW1pc3BoZXJlR2VvbWV0cnkgPSBpbnN0YW5jZS5lYXN0SGVtaXNwaGVyZUdlb21ldHJ5OwogICAgICAgICAgY29uc3Qgd2VzdEhlbWlzcGhlcmVHZW9tZXRyeSA9IGluc3RhbmNlLndlc3RIZW1pc3BoZXJlR2VvbWV0cnk7CiAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGVhc3RIZW1pc3BoZXJlR2VvbWV0cnkpICYmIGRlZmluZWRfZGVmYXVsdCh3ZXN0SGVtaXNwaGVyZUdlb21ldHJ5KSkgewogICAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGVhc3RIZW1pc3BoZXJlR2VvbWV0cnkuYm91bmRpbmdTcGhlcmUpICYmIGRlZmluZWRfZGVmYXVsdCh3ZXN0SGVtaXNwaGVyZUdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlKSkgewogICAgICAgICAgICAgIGJvdW5kaW5nU3BoZXJlc1tpXSA9IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQudW5pb24oCiAgICAgICAgICAgICAgICBlYXN0SGVtaXNwaGVyZUdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLAogICAgICAgICAgICAgICAgd2VzdEhlbWlzcGhlcmVHZW9tZXRyeS5ib3VuZGluZ1NwaGVyZQogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChlYXN0SGVtaXNwaGVyZUdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlQ1YpICYmIGRlZmluZWRfZGVmYXVsdCh3ZXN0SGVtaXNwaGVyZUdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlQ1YpKSB7CiAgICAgICAgICAgICAgYm91bmRpbmdTcGhlcmVzQ1ZbaV0gPSBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LnVuaW9uKAogICAgICAgICAgICAgICAgZWFzdEhlbWlzcGhlcmVHZW9tZXRyeS5ib3VuZGluZ1NwaGVyZUNWLAogICAgICAgICAgICAgICAgd2VzdEhlbWlzcGhlcmVHZW9tZXRyeS5ib3VuZGluZ1NwaGVyZUNWCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgZ2VvbWV0cmllcywKICAgICAgICAgIG1vZGVsTWF0cml4OiBwYXJhbWV0ZXJzLm1vZGVsTWF0cml4LAogICAgICAgICAgYXR0cmlidXRlTG9jYXRpb25zLAogICAgICAgICAgcGlja09mZnNldHMsCiAgICAgICAgICBvZmZzZXRJbnN0YW5jZUV4dGVuZCwKICAgICAgICAgIGJvdW5kaW5nU3BoZXJlcywKICAgICAgICAgIGJvdW5kaW5nU3BoZXJlc0NWCiAgICAgICAgfTsKICAgICAgfTsKICAgICAgUHJpbWl0aXZlUGlwZWxpbmUucGFja0NyZWF0ZUdlb21ldHJ5UmVzdWx0cyA9IGZ1bmN0aW9uKGl0ZW1zLCB0cmFuc2ZlcmFibGVPYmplY3RzKSB7CiAgICAgICAgY29uc3QgcGFja2VkRGF0YSA9IG5ldyBGbG9hdDY0QXJyYXkoY291bnRDcmVhdGVHZW9tZXRyeVJlc3VsdHMoaXRlbXMpKTsKICAgICAgICBjb25zdCBzdHJpbmdUYWJsZSA9IFtdOwogICAgICAgIGNvbnN0IHN0cmluZ0hhc2ggPSB7fTsKICAgICAgICBjb25zdCBsZW5ndGggPSBpdGVtcy5sZW5ndGg7CiAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICBwYWNrZWREYXRhW2NvdW50KytdID0gbGVuZ3RoOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGdlb21ldHJ5ID0gaXRlbXNbaV07CiAgICAgICAgICBjb25zdCB2YWxpZEdlb21ldHJ5ID0gZGVmaW5lZF9kZWZhdWx0KGdlb21ldHJ5KTsKICAgICAgICAgIHBhY2tlZERhdGFbY291bnQrK10gPSB2YWxpZEdlb21ldHJ5ID8gMSA6IDA7CiAgICAgICAgICBpZiAoIXZhbGlkR2VvbWV0cnkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBwYWNrZWREYXRhW2NvdW50KytdID0gZ2VvbWV0cnkucHJpbWl0aXZlVHlwZTsKICAgICAgICAgIHBhY2tlZERhdGFbY291bnQrK10gPSBnZW9tZXRyeS5nZW9tZXRyeVR5cGU7CiAgICAgICAgICBwYWNrZWREYXRhW2NvdW50KytdID0gZ2VvbWV0cnkub2Zmc2V0QXR0cmlidXRlID8/IC0xOwogICAgICAgICAgY29uc3QgdmFsaWRCb3VuZGluZ1NwaGVyZSA9IGRlZmluZWRfZGVmYXVsdChnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSkgPyAxIDogMDsKICAgICAgICAgIHBhY2tlZERhdGFbY291bnQrK10gPSB2YWxpZEJvdW5kaW5nU3BoZXJlOwogICAgICAgICAgaWYgKHZhbGlkQm91bmRpbmdTcGhlcmUpIHsKICAgICAgICAgICAgQm91bmRpbmdTcGhlcmVfZGVmYXVsdC5wYWNrKGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLCBwYWNrZWREYXRhLCBjb3VudCk7CiAgICAgICAgICB9CiAgICAgICAgICBjb3VudCArPSBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICAgIGNvbnN0IHZhbGlkQm91bmRpbmdTcGhlcmVDViA9IGRlZmluZWRfZGVmYXVsdChnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZUNWKSA/IDEgOiAwOwogICAgICAgICAgcGFja2VkRGF0YVtjb3VudCsrXSA9IHZhbGlkQm91bmRpbmdTcGhlcmVDVjsKICAgICAgICAgIGlmICh2YWxpZEJvdW5kaW5nU3BoZXJlQ1YpIHsKICAgICAgICAgICAgQm91bmRpbmdTcGhlcmVfZGVmYXVsdC5wYWNrKGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlQ1YsIHBhY2tlZERhdGEsIGNvdW50KTsKICAgICAgICAgIH0KICAgICAgICAgIGNvdW50ICs9IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7CiAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzVG9Xcml0ZSA9IFtdOwogICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBhdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSAmJiBkZWZpbmVkX2RlZmF1bHQoYXR0cmlidXRlc1twcm9wZXJ0eV0pKSB7CiAgICAgICAgICAgICAgYXR0cmlidXRlc1RvV3JpdGUucHVzaChwcm9wZXJ0eSk7CiAgICAgICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoc3RyaW5nSGFzaFtwcm9wZXJ0eV0pKSB7CiAgICAgICAgICAgICAgICBzdHJpbmdIYXNoW3Byb3BlcnR5XSA9IHN0cmluZ1RhYmxlLmxlbmd0aDsKICAgICAgICAgICAgICAgIHN0cmluZ1RhYmxlLnB1c2gocHJvcGVydHkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcGFja2VkRGF0YVtjb3VudCsrXSA9IGF0dHJpYnV0ZXNUb1dyaXRlLmxlbmd0aDsKICAgICAgICAgIGZvciAobGV0IHEgPSAwOyBxIDwgYXR0cmlidXRlc1RvV3JpdGUubGVuZ3RoOyBxKyspIHsKICAgICAgICAgICAgY29uc3QgbmFtZSA9IGF0dHJpYnV0ZXNUb1dyaXRlW3FdOwogICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW25hbWVdOwogICAgICAgICAgICBwYWNrZWREYXRhW2NvdW50KytdID0gc3RyaW5nSGFzaFtuYW1lXTsKICAgICAgICAgICAgcGFja2VkRGF0YVtjb3VudCsrXSA9IGF0dHJpYnV0ZS5jb21wb25lbnREYXRhdHlwZTsKICAgICAgICAgICAgcGFja2VkRGF0YVtjb3VudCsrXSA9IGF0dHJpYnV0ZS5jb21wb25lbnRzUGVyQXR0cmlidXRlOwogICAgICAgICAgICBwYWNrZWREYXRhW2NvdW50KytdID0gYXR0cmlidXRlLm5vcm1hbGl6ZSA/IDEgOiAwOwogICAgICAgICAgICBwYWNrZWREYXRhW2NvdW50KytdID0gYXR0cmlidXRlLnZhbHVlcy5sZW5ndGg7CiAgICAgICAgICAgIHBhY2tlZERhdGEuc2V0KGF0dHJpYnV0ZS52YWx1ZXMsIGNvdW50KTsKICAgICAgICAgICAgY291bnQgKz0gYXR0cmlidXRlLnZhbHVlcy5sZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBpbmRpY2VzTGVuZ3RoID0gZGVmaW5lZF9kZWZhdWx0KGdlb21ldHJ5LmluZGljZXMpID8gZ2VvbWV0cnkuaW5kaWNlcy5sZW5ndGggOiAwOwogICAgICAgICAgcGFja2VkRGF0YVtjb3VudCsrXSA9IGluZGljZXNMZW5ndGg7CiAgICAgICAgICBpZiAoaW5kaWNlc0xlbmd0aCA+IDApIHsKICAgICAgICAgICAgcGFja2VkRGF0YS5zZXQoZ2VvbWV0cnkuaW5kaWNlcywgY291bnQpOwogICAgICAgICAgICBjb3VudCArPSBpbmRpY2VzTGVuZ3RoOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0cmFuc2ZlcmFibGVPYmplY3RzLnB1c2gocGFja2VkRGF0YS5idWZmZXIpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBzdHJpbmdUYWJsZSwKICAgICAgICAgIHBhY2tlZERhdGEKICAgICAgICB9OwogICAgICB9OwogICAgICBQcmltaXRpdmVQaXBlbGluZS51bnBhY2tDcmVhdGVHZW9tZXRyeVJlc3VsdHMgPSBmdW5jdGlvbihjcmVhdGVHZW9tZXRyeVJlc3VsdCkgewogICAgICAgIGNvbnN0IHN0cmluZ1RhYmxlID0gY3JlYXRlR2VvbWV0cnlSZXN1bHQuc3RyaW5nVGFibGU7CiAgICAgICAgY29uc3QgcGFja2VkR2VvbWV0cnkgPSBjcmVhdGVHZW9tZXRyeVJlc3VsdC5wYWNrZWREYXRhOwogICAgICAgIGxldCBpOwogICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheShwYWNrZWRHZW9tZXRyeVswXSk7CiAgICAgICAgbGV0IHJlc3VsdEluZGV4ID0gMDsKICAgICAgICBsZXQgcGFja2VkR2VvbWV0cnlJbmRleCA9IDE7CiAgICAgICAgd2hpbGUgKHBhY2tlZEdlb21ldHJ5SW5kZXggPCBwYWNrZWRHZW9tZXRyeS5sZW5ndGgpIHsKICAgICAgICAgIGNvbnN0IHZhbGlkID0gcGFja2VkR2VvbWV0cnlbcGFja2VkR2VvbWV0cnlJbmRleCsrXSA9PT0gMTsKICAgICAgICAgIGlmICghdmFsaWQpIHsKICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdEluZGV4KytdID0gdm9pZCAwOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHByaW1pdGl2ZVR5cGUgPSBwYWNrZWRHZW9tZXRyeVtwYWNrZWRHZW9tZXRyeUluZGV4KytdOwogICAgICAgICAgY29uc3QgZ2VvbWV0cnlUeXBlID0gcGFja2VkR2VvbWV0cnlbcGFja2VkR2VvbWV0cnlJbmRleCsrXTsKICAgICAgICAgIGxldCBvZmZzZXRBdHRyaWJ1dGUgPSBwYWNrZWRHZW9tZXRyeVtwYWNrZWRHZW9tZXRyeUluZGV4KytdOwogICAgICAgICAgaWYgKG9mZnNldEF0dHJpYnV0ZSA9PT0gLTEpIHsKICAgICAgICAgICAgb2Zmc2V0QXR0cmlidXRlID0gdm9pZCAwOwogICAgICAgICAgfQogICAgICAgICAgbGV0IGJvdW5kaW5nU3BoZXJlOwogICAgICAgICAgbGV0IGJvdW5kaW5nU3BoZXJlQ1Y7CiAgICAgICAgICBjb25zdCB2YWxpZEJvdW5kaW5nU3BoZXJlID0gcGFja2VkR2VvbWV0cnlbcGFja2VkR2VvbWV0cnlJbmRleCsrXSA9PT0gMTsKICAgICAgICAgIGlmICh2YWxpZEJvdW5kaW5nU3BoZXJlKSB7CiAgICAgICAgICAgIGJvdW5kaW5nU3BoZXJlID0gQm91bmRpbmdTcGhlcmVfZGVmYXVsdC51bnBhY2soCiAgICAgICAgICAgICAgcGFja2VkR2VvbWV0cnksCiAgICAgICAgICAgICAgcGFja2VkR2VvbWV0cnlJbmRleAogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgICAgcGFja2VkR2VvbWV0cnlJbmRleCArPSBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICAgIGNvbnN0IHZhbGlkQm91bmRpbmdTcGhlcmVDViA9IHBhY2tlZEdlb21ldHJ5W3BhY2tlZEdlb21ldHJ5SW5kZXgrK10gPT09IDE7CiAgICAgICAgICBpZiAodmFsaWRCb3VuZGluZ1NwaGVyZUNWKSB7CiAgICAgICAgICAgIGJvdW5kaW5nU3BoZXJlQ1YgPSBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LnVucGFjaygKICAgICAgICAgICAgICBwYWNrZWRHZW9tZXRyeSwKICAgICAgICAgICAgICBwYWNrZWRHZW9tZXRyeUluZGV4CiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgICBwYWNrZWRHZW9tZXRyeUluZGV4ICs9IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgICAgbGV0IGxlbmd0aDsKICAgICAgICAgIGxldCB2YWx1ZXM7CiAgICAgICAgICBsZXQgY29tcG9uZW50c1BlckF0dHJpYnV0ZTsKICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVzX2RlZmF1bHQoKTsKICAgICAgICAgIGNvbnN0IG51bUF0dHJpYnV0ZXMgPSBwYWNrZWRHZW9tZXRyeVtwYWNrZWRHZW9tZXRyeUluZGV4KytdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUF0dHJpYnV0ZXM7IGkrKykgewogICAgICAgICAgICBjb25zdCBuYW1lID0gc3RyaW5nVGFibGVbcGFja2VkR2VvbWV0cnlbcGFja2VkR2VvbWV0cnlJbmRleCsrXV07CiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudERhdGF0eXBlID0gcGFja2VkR2VvbWV0cnlbcGFja2VkR2VvbWV0cnlJbmRleCsrXTsKICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZSA9IHBhY2tlZEdlb21ldHJ5W3BhY2tlZEdlb21ldHJ5SW5kZXgrK107CiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZSA9IHBhY2tlZEdlb21ldHJ5W3BhY2tlZEdlb21ldHJ5SW5kZXgrK10gIT09IDA7CiAgICAgICAgICAgIGxlbmd0aCA9IHBhY2tlZEdlb21ldHJ5W3BhY2tlZEdlb21ldHJ5SW5kZXgrK107CiAgICAgICAgICAgIHZhbHVlcyA9IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuY3JlYXRlVHlwZWRBcnJheShjb21wb25lbnREYXRhdHlwZSwgbGVuZ3RoKTsKICAgICAgICAgICAgZm9yIChsZXQgdmFsdWVzSW5kZXggPSAwOyB2YWx1ZXNJbmRleCA8IGxlbmd0aDsgdmFsdWVzSW5kZXgrKykgewogICAgICAgICAgICAgIHZhbHVlc1t2YWx1ZXNJbmRleF0gPSBwYWNrZWRHZW9tZXRyeVtwYWNrZWRHZW9tZXRyeUluZGV4KytdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF0dHJpYnV0ZXNbbmFtZV0gPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGUsCiAgICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZSwKICAgICAgICAgICAgICBub3JtYWxpemUsCiAgICAgICAgICAgICAgdmFsdWVzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgbGV0IGluZGljZXM7CiAgICAgICAgICBsZW5ndGggPSBwYWNrZWRHZW9tZXRyeVtwYWNrZWRHZW9tZXRyeUluZGV4KytdOwogICAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgICAgICAgY29uc3QgbnVtYmVyT2ZWZXJ0aWNlcyA9IHZhbHVlcy5sZW5ndGggLyBjb21wb25lbnRzUGVyQXR0cmlidXRlOwogICAgICAgICAgICBpbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkobnVtYmVyT2ZWZXJ0aWNlcywgbGVuZ3RoKTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgaW5kaWNlc1tpXSA9IHBhY2tlZEdlb21ldHJ5W3BhY2tlZEdlb21ldHJ5SW5kZXgrK107CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdFtyZXN1bHRJbmRleCsrXSA9IG5ldyBHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgICAgICAgcHJpbWl0aXZlVHlwZSwKICAgICAgICAgICAgZ2VvbWV0cnlUeXBlLAogICAgICAgICAgICBib3VuZGluZ1NwaGVyZSwKICAgICAgICAgICAgYm91bmRpbmdTcGhlcmVDViwKICAgICAgICAgICAgaW5kaWNlcywKICAgICAgICAgICAgYXR0cmlidXRlcywKICAgICAgICAgICAgb2Zmc2V0QXR0cmlidXRlCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgUHJpbWl0aXZlUGlwZWxpbmUucGFja0NvbWJpbmVHZW9tZXRyeVBhcmFtZXRlcnMgPSBmdW5jdGlvbihwYXJhbWV0ZXJzLCB0cmFuc2ZlcmFibGVPYmplY3RzKSB7CiAgICAgICAgY29uc3QgY3JlYXRlR2VvbWV0cnlSZXN1bHRzID0gcGFyYW1ldGVycy5jcmVhdGVHZW9tZXRyeVJlc3VsdHM7CiAgICAgICAgY29uc3QgbGVuZ3RoID0gY3JlYXRlR2VvbWV0cnlSZXN1bHRzLmxlbmd0aDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0cmFuc2ZlcmFibGVPYmplY3RzLnB1c2goY3JlYXRlR2VvbWV0cnlSZXN1bHRzW2ldLnBhY2tlZERhdGEuYnVmZmVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGNyZWF0ZUdlb21ldHJ5UmVzdWx0czogcGFyYW1ldGVycy5jcmVhdGVHZW9tZXRyeVJlc3VsdHMsCiAgICAgICAgICBwYWNrZWRJbnN0YW5jZXM6IHBhY2tJbnN0YW5jZXNGb3JDb21iaW5lKAogICAgICAgICAgICBwYXJhbWV0ZXJzLmluc3RhbmNlcywKICAgICAgICAgICAgdHJhbnNmZXJhYmxlT2JqZWN0cwogICAgICAgICAgKSwKICAgICAgICAgIGVsbGlwc29pZDogcGFyYW1ldGVycy5lbGxpcHNvaWQsCiAgICAgICAgICBpc0dlb2dyYXBoaWM6IHBhcmFtZXRlcnMucHJvamVjdGlvbiBpbnN0YW5jZW9mIEdlb2dyYXBoaWNQcm9qZWN0aW9uX2RlZmF1bHQsCiAgICAgICAgICBlbGVtZW50SW5kZXhVaW50U3VwcG9ydGVkOiBwYXJhbWV0ZXJzLmVsZW1lbnRJbmRleFVpbnRTdXBwb3J0ZWQsCiAgICAgICAgICBzY2VuZTNET25seTogcGFyYW1ldGVycy5zY2VuZTNET25seSwKICAgICAgICAgIHZlcnRleENhY2hlT3B0aW1pemU6IHBhcmFtZXRlcnMudmVydGV4Q2FjaGVPcHRpbWl6ZSwKICAgICAgICAgIGNvbXByZXNzVmVydGljZXM6IHBhcmFtZXRlcnMuY29tcHJlc3NWZXJ0aWNlcywKICAgICAgICAgIG1vZGVsTWF0cml4OiBwYXJhbWV0ZXJzLm1vZGVsTWF0cml4LAogICAgICAgICAgY3JlYXRlUGlja09mZnNldHM6IHBhcmFtZXRlcnMuY3JlYXRlUGlja09mZnNldHMKICAgICAgICB9OwogICAgICB9OwogICAgICBQcmltaXRpdmVQaXBlbGluZS51bnBhY2tDb21iaW5lR2VvbWV0cnlQYXJhbWV0ZXJzID0gZnVuY3Rpb24ocGFja2VkUGFyYW1ldGVycykgewogICAgICAgIGNvbnN0IGluc3RhbmNlcyA9IHVucGFja0luc3RhbmNlc0ZvckNvbWJpbmUocGFja2VkUGFyYW1ldGVycy5wYWNrZWRJbnN0YW5jZXMpOwogICAgICAgIGNvbnN0IGNyZWF0ZUdlb21ldHJ5UmVzdWx0cyA9IHBhY2tlZFBhcmFtZXRlcnMuY3JlYXRlR2VvbWV0cnlSZXN1bHRzOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IGNyZWF0ZUdlb21ldHJ5UmVzdWx0cy5sZW5ndGg7CiAgICAgICAgbGV0IGluc3RhbmNlSW5kZXggPSAwOwogICAgICAgIGZvciAobGV0IHJlc3VsdEluZGV4ID0gMDsgcmVzdWx0SW5kZXggPCBsZW5ndGg7IHJlc3VsdEluZGV4KyspIHsKICAgICAgICAgIGNvbnN0IGdlb21ldHJpZXMgPSBQcmltaXRpdmVQaXBlbGluZS51bnBhY2tDcmVhdGVHZW9tZXRyeVJlc3VsdHMoCiAgICAgICAgICAgIGNyZWF0ZUdlb21ldHJ5UmVzdWx0c1tyZXN1bHRJbmRleF0KICAgICAgICAgICk7CiAgICAgICAgICBjb25zdCBnZW9tZXRyaWVzTGVuZ3RoID0gZ2VvbWV0cmllcy5sZW5ndGg7CiAgICAgICAgICBmb3IgKGxldCBnZW9tZXRyeUluZGV4ID0gMDsgZ2VvbWV0cnlJbmRleCA8IGdlb21ldHJpZXNMZW5ndGg7IGdlb21ldHJ5SW5kZXgrKykgewogICAgICAgICAgICBjb25zdCBnZW9tZXRyeSA9IGdlb21ldHJpZXNbZ2VvbWV0cnlJbmRleF07CiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSW5kZXhdOwogICAgICAgICAgICBpbnN0YW5jZS5nZW9tZXRyeSA9IGdlb21ldHJ5OwogICAgICAgICAgICArK2luc3RhbmNlSW5kZXg7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKHBhY2tlZFBhcmFtZXRlcnMuZWxsaXBzb2lkKTsKICAgICAgICBjb25zdCBwcm9qZWN0aW9uID0gcGFja2VkUGFyYW1ldGVycy5pc0dlb2dyYXBoaWMgPyBuZXcgR2VvZ3JhcGhpY1Byb2plY3Rpb25fZGVmYXVsdChlbGxpcHNvaWQpIDogbmV3IFdlYk1lcmNhdG9yUHJvamVjdGlvbl9kZWZhdWx0KGVsbGlwc29pZCk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGluc3RhbmNlcywKICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgIHByb2plY3Rpb24sCiAgICAgICAgICBlbGVtZW50SW5kZXhVaW50U3VwcG9ydGVkOiBwYWNrZWRQYXJhbWV0ZXJzLmVsZW1lbnRJbmRleFVpbnRTdXBwb3J0ZWQsCiAgICAgICAgICBzY2VuZTNET25seTogcGFja2VkUGFyYW1ldGVycy5zY2VuZTNET25seSwKICAgICAgICAgIHZlcnRleENhY2hlT3B0aW1pemU6IHBhY2tlZFBhcmFtZXRlcnMudmVydGV4Q2FjaGVPcHRpbWl6ZSwKICAgICAgICAgIGNvbXByZXNzVmVydGljZXM6IHBhY2tlZFBhcmFtZXRlcnMuY29tcHJlc3NWZXJ0aWNlcywKICAgICAgICAgIG1vZGVsTWF0cml4OiBNYXRyaXg0X2RlZmF1bHQuY2xvbmUocGFja2VkUGFyYW1ldGVycy5tb2RlbE1hdHJpeCksCiAgICAgICAgICBjcmVhdGVQaWNrT2Zmc2V0czogcGFja2VkUGFyYW1ldGVycy5jcmVhdGVQaWNrT2Zmc2V0cwogICAgICAgIH07CiAgICAgIH07CiAgICAgIFByaW1pdGl2ZVBpcGVsaW5lLnBhY2tDb21iaW5lR2VvbWV0cnlSZXN1bHRzID0gZnVuY3Rpb24ocmVzdWx0cywgdHJhbnNmZXJhYmxlT2JqZWN0cykgewogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQocmVzdWx0cy5nZW9tZXRyaWVzKSkgewogICAgICAgICAgdHJhbnNmZXJHZW9tZXRyaWVzKHJlc3VsdHMuZ2VvbWV0cmllcywgdHJhbnNmZXJhYmxlT2JqZWN0cyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBhY2tlZEJvdW5kaW5nU3BoZXJlcyA9IHBhY2tCb3VuZGluZ1NwaGVyZXMocmVzdWx0cy5ib3VuZGluZ1NwaGVyZXMpOwogICAgICAgIGNvbnN0IHBhY2tlZEJvdW5kaW5nU3BoZXJlc0NWID0gcGFja0JvdW5kaW5nU3BoZXJlcygKICAgICAgICAgIHJlc3VsdHMuYm91bmRpbmdTcGhlcmVzQ1YKICAgICAgICApOwogICAgICAgIHRyYW5zZmVyYWJsZU9iamVjdHMucHVzaCgKICAgICAgICAgIHBhY2tlZEJvdW5kaW5nU3BoZXJlcy5idWZmZXIsCiAgICAgICAgICBwYWNrZWRCb3VuZGluZ1NwaGVyZXNDVi5idWZmZXIKICAgICAgICApOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBnZW9tZXRyaWVzOiByZXN1bHRzLmdlb21ldHJpZXMsCiAgICAgICAgICBhdHRyaWJ1dGVMb2NhdGlvbnM6IHJlc3VsdHMuYXR0cmlidXRlTG9jYXRpb25zLAogICAgICAgICAgbW9kZWxNYXRyaXg6IHJlc3VsdHMubW9kZWxNYXRyaXgsCiAgICAgICAgICBwaWNrT2Zmc2V0czogcmVzdWx0cy5waWNrT2Zmc2V0cywKICAgICAgICAgIG9mZnNldEluc3RhbmNlRXh0ZW5kOiByZXN1bHRzLm9mZnNldEluc3RhbmNlRXh0ZW5kLAogICAgICAgICAgYm91bmRpbmdTcGhlcmVzOiBwYWNrZWRCb3VuZGluZ1NwaGVyZXMsCiAgICAgICAgICBib3VuZGluZ1NwaGVyZXNDVjogcGFja2VkQm91bmRpbmdTcGhlcmVzQ1YKICAgICAgICB9OwogICAgICB9OwogICAgICBQcmltaXRpdmVQaXBlbGluZS51bnBhY2tDb21iaW5lR2VvbWV0cnlSZXN1bHRzID0gZnVuY3Rpb24ocGFja2VkUmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGdlb21ldHJpZXM6IHBhY2tlZFJlc3VsdC5nZW9tZXRyaWVzLAogICAgICAgICAgYXR0cmlidXRlTG9jYXRpb25zOiBwYWNrZWRSZXN1bHQuYXR0cmlidXRlTG9jYXRpb25zLAogICAgICAgICAgbW9kZWxNYXRyaXg6IHBhY2tlZFJlc3VsdC5tb2RlbE1hdHJpeCwKICAgICAgICAgIHBpY2tPZmZzZXRzOiBwYWNrZWRSZXN1bHQucGlja09mZnNldHMsCiAgICAgICAgICBvZmZzZXRJbnN0YW5jZUV4dGVuZDogcGFja2VkUmVzdWx0Lm9mZnNldEluc3RhbmNlRXh0ZW5kLAogICAgICAgICAgYm91bmRpbmdTcGhlcmVzOiB1bnBhY2tCb3VuZGluZ1NwaGVyZXMocGFja2VkUmVzdWx0LmJvdW5kaW5nU3BoZXJlcyksCiAgICAgICAgICBib3VuZGluZ1NwaGVyZXNDVjogdW5wYWNrQm91bmRpbmdTcGhlcmVzKHBhY2tlZFJlc3VsdC5ib3VuZGluZ1NwaGVyZXNDVikKICAgICAgICB9OwogICAgICB9OwogICAgICBQcmltaXRpdmVQaXBlbGluZV9kZWZhdWx0ID0gUHJpbWl0aXZlUGlwZWxpbmU7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9mb3JtYXRFcnJvci5qcwogIGZ1bmN0aW9uIGZvcm1hdEVycm9yKG9iamVjdCkgewogICAgbGV0IHJlc3VsdDsKICAgIGNvbnN0IG5hbWUgPSBvYmplY3QubmFtZTsKICAgIGNvbnN0IG1lc3NhZ2UgPSBvYmplY3QubWVzc2FnZTsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQobmFtZSkgJiYgZGVmaW5lZF9kZWZhdWx0KG1lc3NhZ2UpKSB7CiAgICAgIHJlc3VsdCA9IGAke25hbWV9OiAke21lc3NhZ2V9YDsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IG9iamVjdC50b1N0cmluZygpOwogICAgfQogICAgY29uc3Qgc3RhY2sgPSBvYmplY3Quc3RhY2s7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHN0YWNrKSkgewogICAgICByZXN1bHQgKz0gYAoke3N0YWNrfWA7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICB2YXIgZm9ybWF0RXJyb3JfZGVmYXVsdDsKICB2YXIgaW5pdF9mb3JtYXRFcnJvciA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvZm9ybWF0RXJyb3IuanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgZm9ybWF0RXJyb3JfZGVmYXVsdCA9IGZvcm1hdEVycm9yOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlVGFza1Byb2Nlc3Nvcldvcmtlci5qcwogIHZhciBjcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyX2V4cG9ydHMgPSB7fTsKICBfX2V4cG9ydChjcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyX2V4cG9ydHMsIHsKICAgIGRlZmF1bHQ6ICgpID0+IGNyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXJfZGVmYXVsdAogIH0pOwogIGZ1bmN0aW9uIGNyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXIod29ya2VyRnVuY3Rpb24pIHsKICAgIGFzeW5jIGZ1bmN0aW9uIG9uTWVzc2FnZUhhbmRsZXIoeyBkYXRhIH0pIHsKICAgICAgY29uc3QgdHJhbnNmZXJhYmxlT2JqZWN0cyA9IFtdOwogICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSB7CiAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgcmVzdWx0OiB2b2lkIDAsCiAgICAgICAgZXJyb3I6IHZvaWQgMAogICAgICB9OwogICAgICBzZWxmLkNFU0lVTV9CQVNFX1VSTCA9IGRhdGEuYmFzZVVybDsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3b3JrZXJGdW5jdGlvbihkYXRhLnBhcmFtZXRlcnMsIHRyYW5zZmVyYWJsZU9iamVjdHMpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQgPSByZXN1bHQ7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS5lcnJvciA9IHsKICAgICAgICAgICAgbmFtZTogZXJyb3IubmFtZSwKICAgICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSwKICAgICAgICAgICAgc3RhY2s6IGVycm9yLnN0YWNrCiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXNwb25zZU1lc3NhZ2UuZXJyb3IgPSBlcnJvcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFkYXRhLmNhblRyYW5zZmVyQXJyYXlCdWZmZXIpIHsKICAgICAgICB0cmFuc2ZlcmFibGVPYmplY3RzLmxlbmd0aCA9IDA7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBwb3N0TWVzc2FnZShyZXNwb25zZU1lc3NhZ2UsIHRyYW5zZmVyYWJsZU9iamVjdHMpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQgPSB2b2lkIDA7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLmVycm9yID0gYHBvc3RNZXNzYWdlIGZhaWxlZCB3aXRoIGVycm9yOiAke2Zvcm1hdEVycm9yX2RlZmF1bHQoCiAgICAgICAgICBlcnJvcgogICAgICAgICl9CiAgd2l0aCByZXNwb25zZU1lc3NhZ2U6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2VNZXNzYWdlKX1gOwogICAgICAgIHBvc3RNZXNzYWdlKHJlc3BvbnNlTWVzc2FnZSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIG9uTWVzc2FnZUVycm9ySGFuZGxlcihldmVudCkgewogICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgaWQ6IGV2ZW50LmRhdGE/LmlkLAogICAgICAgIGVycm9yOiBgcG9zdE1lc3NhZ2UgZmFpbGVkIHdpdGggZXJyb3I6ICR7SlNPTi5zdHJpbmdpZnkoZXZlbnQpfWAKICAgICAgfSk7CiAgICB9CiAgICBzZWxmLm9ubWVzc2FnZSA9IG9uTWVzc2FnZUhhbmRsZXI7CiAgICBzZWxmLm9ubWVzc2FnZWVycm9yID0gb25NZXNzYWdlRXJyb3JIYW5kbGVyOwogICAgcmV0dXJuIHNlbGY7CiAgfQogIHZhciBjcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyX2RlZmF1bHQ7CiAgdmFyIGluaXRfY3JlYXRlVGFza1Byb2Nlc3NvcldvcmtlciA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlVGFza1Byb2Nlc3Nvcldvcmtlci5qcyIoKSB7CiAgICAgIGluaXRfZm9ybWF0RXJyb3IoKTsKICAgICAgY3JlYXRlVGFza1Byb2Nlc3Nvcldvcmtlcl9kZWZhdWx0ID0gY3JlYXRlVGFza1Byb2Nlc3NvcldvcmtlcjsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NvbWJpbmVHZW9tZXRyeS5qcwogIHZhciBjb21iaW5lR2VvbWV0cnlfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGNvbWJpbmVHZW9tZXRyeV9leHBvcnRzLCB7CiAgICBkZWZhdWx0OiAoKSA9PiBjb21iaW5lR2VvbWV0cnlfZGVmYXVsdAogIH0pOwogIGZ1bmN0aW9uIGNvbWJpbmVHZW9tZXRyeShwYWNrZWRQYXJhbWV0ZXJzLCB0cmFuc2ZlcmFibGVPYmplY3RzKSB7CiAgICBjb25zdCBwYXJhbWV0ZXJzID0gUHJpbWl0aXZlUGlwZWxpbmVfZGVmYXVsdC51bnBhY2tDb21iaW5lR2VvbWV0cnlQYXJhbWV0ZXJzKHBhY2tlZFBhcmFtZXRlcnMpOwogICAgY29uc3QgcmVzdWx0cyA9IFByaW1pdGl2ZVBpcGVsaW5lX2RlZmF1bHQuY29tYmluZUdlb21ldHJ5KHBhcmFtZXRlcnMpOwogICAgcmV0dXJuIFByaW1pdGl2ZVBpcGVsaW5lX2RlZmF1bHQucGFja0NvbWJpbmVHZW9tZXRyeVJlc3VsdHMoCiAgICAgIHJlc3VsdHMsCiAgICAgIHRyYW5zZmVyYWJsZU9iamVjdHMKICAgICk7CiAgfQogIHZhciBjb21iaW5lR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9jb21iaW5lR2VvbWV0cnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NvbWJpbmVHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfUHJpbWl0aXZlUGlwZWxpbmUoKTsKICAgICAgaW5pdF9jcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyKCk7CiAgICAgIGNvbWJpbmVHZW9tZXRyeV9kZWZhdWx0ID0gY3JlYXRlVGFza1Byb2Nlc3Nvcldvcmtlcl9kZWZhdWx0KGNvbWJpbmVHZW9tZXRyeSk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9HZW9tZXRyeU9mZnNldEF0dHJpYnV0ZS5qcwogIHZhciBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZSwgR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGVfZGVmYXVsdDsKICB2YXIgaW5pdF9HZW9tZXRyeU9mZnNldEF0dHJpYnV0ZSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGUuanMiKCkgewogICAgICBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZSA9IHsKICAgICAgICBOT05FOiAwLAogICAgICAgIFRPUDogMSwKICAgICAgICBBTEw6IDIKICAgICAgfTsKICAgICAgR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGVfZGVmYXVsdCA9IE9iamVjdC5mcmVlemUoR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGUpOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvVmVydGV4Rm9ybWF0LmpzCiAgZnVuY3Rpb24gVmVydGV4Rm9ybWF0KG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgIHRoaXMucG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uID8/IGZhbHNlOwogICAgdGhpcy5ub3JtYWwgPSBvcHRpb25zLm5vcm1hbCA/PyBmYWxzZTsKICAgIHRoaXMuc3QgPSBvcHRpb25zLnN0ID8/IGZhbHNlOwogICAgdGhpcy5iaXRhbmdlbnQgPSBvcHRpb25zLmJpdGFuZ2VudCA/PyBmYWxzZTsKICAgIHRoaXMudGFuZ2VudCA9IG9wdGlvbnMudGFuZ2VudCA/PyBmYWxzZTsKICAgIHRoaXMuY29sb3IgPSBvcHRpb25zLmNvbG9yID8/IGZhbHNlOwogIH0KICB2YXIgVmVydGV4Rm9ybWF0X2RlZmF1bHQ7CiAgdmFyIGluaXRfVmVydGV4Rm9ybWF0ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9WZXJ0ZXhGb3JtYXQuanMiKCkgewogICAgICBpbml0X0Zyb3plbigpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBWZXJ0ZXhGb3JtYXQuUE9TSVRJT05fT05MWSA9IE9iamVjdC5mcmVlemUoCiAgICAgICAgbmV3IFZlcnRleEZvcm1hdCh7CiAgICAgICAgICBwb3NpdGlvbjogdHJ1ZQogICAgICAgIH0pCiAgICAgICk7CiAgICAgIFZlcnRleEZvcm1hdC5QT1NJVElPTl9BTkRfTk9STUFMID0gT2JqZWN0LmZyZWV6ZSgKICAgICAgICBuZXcgVmVydGV4Rm9ybWF0KHsKICAgICAgICAgIHBvc2l0aW9uOiB0cnVlLAogICAgICAgICAgbm9ybWFsOiB0cnVlCiAgICAgICAgfSkKICAgICAgKTsKICAgICAgVmVydGV4Rm9ybWF0LlBPU0lUSU9OX05PUk1BTF9BTkRfU1QgPSBPYmplY3QuZnJlZXplKAogICAgICAgIG5ldyBWZXJ0ZXhGb3JtYXQoewogICAgICAgICAgcG9zaXRpb246IHRydWUsCiAgICAgICAgICBub3JtYWw6IHRydWUsCiAgICAgICAgICBzdDogdHJ1ZQogICAgICAgIH0pCiAgICAgICk7CiAgICAgIFZlcnRleEZvcm1hdC5QT1NJVElPTl9BTkRfU1QgPSBPYmplY3QuZnJlZXplKAogICAgICAgIG5ldyBWZXJ0ZXhGb3JtYXQoewogICAgICAgICAgcG9zaXRpb246IHRydWUsCiAgICAgICAgICBzdDogdHJ1ZQogICAgICAgIH0pCiAgICAgICk7CiAgICAgIFZlcnRleEZvcm1hdC5QT1NJVElPTl9BTkRfQ09MT1IgPSBPYmplY3QuZnJlZXplKAogICAgICAgIG5ldyBWZXJ0ZXhGb3JtYXQoewogICAgICAgICAgcG9zaXRpb246IHRydWUsCiAgICAgICAgICBjb2xvcjogdHJ1ZQogICAgICAgIH0pCiAgICAgICk7CiAgICAgIFZlcnRleEZvcm1hdC5BTEwgPSBPYmplY3QuZnJlZXplKAogICAgICAgIG5ldyBWZXJ0ZXhGb3JtYXQoewogICAgICAgICAgcG9zaXRpb246IHRydWUsCiAgICAgICAgICBub3JtYWw6IHRydWUsCiAgICAgICAgICBzdDogdHJ1ZSwKICAgICAgICAgIHRhbmdlbnQ6IHRydWUsCiAgICAgICAgICBiaXRhbmdlbnQ6IHRydWUKICAgICAgICB9KQogICAgICApOwogICAgICBWZXJ0ZXhGb3JtYXQuREVGQVVMVCA9IFZlcnRleEZvcm1hdC5QT1NJVElPTl9OT1JNQUxfQU5EX1NUOwogICAgICBWZXJ0ZXhGb3JtYXQucGFja2VkTGVuZ3RoID0gNjsKICAgICAgVmVydGV4Rm9ybWF0LnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh2YWx1ZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJ2YWx1ZSBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhcnJheSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhcnJheSBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5wb3NpdGlvbiA/IDEgOiAwOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5ub3JtYWwgPyAxIDogMDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuc3QgPyAxIDogMDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUudGFuZ2VudCA/IDEgOiAwOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5iaXRhbmdlbnQgPyAxIDogMDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4XSA9IHZhbHVlLmNvbG9yID8gMSA6IDA7CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9OwogICAgICBWZXJ0ZXhGb3JtYXQudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFycmF5KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFycmF5IGlzIHJlcXVpcmVkIik7CiAgICAgICAgfQogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IFZlcnRleEZvcm1hdCgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQucG9zaXRpb24gPSBhcnJheVtzdGFydGluZ0luZGV4KytdID09PSAxOwogICAgICAgIHJlc3VsdC5ub3JtYWwgPSBhcnJheVtzdGFydGluZ0luZGV4KytdID09PSAxOwogICAgICAgIHJlc3VsdC5zdCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPT09IDE7CiAgICAgICAgcmVzdWx0LnRhbmdlbnQgPSBhcnJheVtzdGFydGluZ0luZGV4KytdID09PSAxOwogICAgICAgIHJlc3VsdC5iaXRhbmdlbnQgPSBhcnJheVtzdGFydGluZ0luZGV4KytdID09PSAxOwogICAgICAgIHJlc3VsdC5jb2xvciA9IGFycmF5W3N0YXJ0aW5nSW5kZXhdID09PSAxOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFZlcnRleEZvcm1hdC5jbG9uZSA9IGZ1bmN0aW9uKHZlcnRleEZvcm1hdCwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodmVydGV4Rm9ybWF0KSkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IFZlcnRleEZvcm1hdCgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQucG9zaXRpb24gPSB2ZXJ0ZXhGb3JtYXQucG9zaXRpb247CiAgICAgICAgcmVzdWx0Lm5vcm1hbCA9IHZlcnRleEZvcm1hdC5ub3JtYWw7CiAgICAgICAgcmVzdWx0LnN0ID0gdmVydGV4Rm9ybWF0LnN0OwogICAgICAgIHJlc3VsdC50YW5nZW50ID0gdmVydGV4Rm9ybWF0LnRhbmdlbnQ7CiAgICAgICAgcmVzdWx0LmJpdGFuZ2VudCA9IHZlcnRleEZvcm1hdC5iaXRhbmdlbnQ7CiAgICAgICAgcmVzdWx0LmNvbG9yID0gdmVydGV4Rm9ybWF0LmNvbG9yOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFZlcnRleEZvcm1hdF9kZWZhdWx0ID0gVmVydGV4Rm9ybWF0OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQm94R2VvbWV0cnkuanMKICBmdW5jdGlvbiBCb3hHZW9tZXRyeShvcHRpb25zKSB7CiAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICBjb25zdCBtaW4zID0gb3B0aW9ucy5taW5pbXVtOwogICAgY29uc3QgbWF4MyA9IG9wdGlvbnMubWF4aW11bTsKICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWluIiwgbWluMyk7CiAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1heCIsIG1heDMpOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvcHRpb25zLm9mZnNldEF0dHJpYnV0ZSkgJiYgb3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGUgPT09IEdlb21ldHJ5T2Zmc2V0QXR0cmlidXRlX2RlZmF1bHQuVE9QKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICJHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZS5UT1AgaXMgbm90IGEgc3VwcG9ydGVkIG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlIGZvciB0aGlzIGdlb21ldHJ5LiIKICAgICAgKTsKICAgIH0KICAgIGNvbnN0IHZlcnRleEZvcm1hdCA9IG9wdGlvbnMudmVydGV4Rm9ybWF0ID8/IFZlcnRleEZvcm1hdF9kZWZhdWx0LkRFRkFVTFQ7CiAgICB0aGlzLl9taW5pbXVtID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKG1pbjMpOwogICAgdGhpcy5fbWF4aW11bSA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShtYXgzKTsKICAgIHRoaXMuX3ZlcnRleEZvcm1hdCA9IHZlcnRleEZvcm1hdDsKICAgIHRoaXMuX29mZnNldEF0dHJpYnV0ZSA9IG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlOwogICAgdGhpcy5fd29ya2VyTmFtZSA9ICJjcmVhdGVCb3hHZW9tZXRyeSI7CiAgfQogIHZhciBkaWZmU2NyYXRjaCwgc2NyYXRjaE1pbiwgc2NyYXRjaE1heCwgc2NyYXRjaFZlcnRleEZvcm1hdCwgc2NyYXRjaE9wdGlvbnMsIHVuaXRCb3hHZW9tZXRyeSwgQm94R2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9Cb3hHZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQm94R2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X0JvdW5kaW5nU3BoZXJlKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfQ29tcG9uZW50RGF0YXR5cGUoKTsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9HZW9tZXRyeSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlKCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGVzKCk7CiAgICAgIGluaXRfR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGUoKTsKICAgICAgaW5pdF9QcmltaXRpdmVUeXBlKCk7CiAgICAgIGluaXRfVmVydGV4Rm9ybWF0KCk7CiAgICAgIGRpZmZTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBCb3hHZW9tZXRyeS5mcm9tRGltZW5zaW9ucyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICAgICAgY29uc3QgZGltZW5zaW9ucyA9IG9wdGlvbnMuZGltZW5zaW9uczsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImRpbWVuc2lvbnMiLCBkaW1lbnNpb25zKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiZGltZW5zaW9ucy54IiwgZGltZW5zaW9ucy54LCAwKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiZGltZW5zaW9ucy55IiwgZGltZW5zaW9ucy55LCAwKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiZGltZW5zaW9ucy56IiwgZGltZW5zaW9ucy56LCAwKTsKICAgICAgICBjb25zdCBjb3JuZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihkaW1lbnNpb25zLCAwLjUsIG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKSk7CiAgICAgICAgcmV0dXJuIG5ldyBCb3hHZW9tZXRyeSh7CiAgICAgICAgICBtaW5pbXVtOiBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKGNvcm5lciwgbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpKSwKICAgICAgICAgIG1heGltdW06IGNvcm5lciwKICAgICAgICAgIHZlcnRleEZvcm1hdDogb3B0aW9ucy52ZXJ0ZXhGb3JtYXQsCiAgICAgICAgICBvZmZzZXRBdHRyaWJ1dGU6IG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIEJveEdlb21ldHJ5LmZyb21BeGlzQWxpZ25lZEJvdW5kaW5nQm94ID0gZnVuY3Rpb24oYm91bmRpbmdCb3gpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImJvdW5kaW5nQm94IiwgYm91bmRpbmdCb3gpOwogICAgICAgIHJldHVybiBuZXcgQm94R2VvbWV0cnkoewogICAgICAgICAgbWluaW11bTogYm91bmRpbmdCb3gubWluaW11bSwKICAgICAgICAgIG1heGltdW06IGJvdW5kaW5nQm94Lm1heGltdW0KICAgICAgICB9KTsKICAgICAgfTsKICAgICAgQm94R2VvbWV0cnkucGFja2VkTGVuZ3RoID0gMiAqIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyAxOwogICAgICBCb3hHZW9tZXRyeS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2sodmFsdWUuX21pbmltdW0sIGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjaygKICAgICAgICAgIHZhbHVlLl9tYXhpbXVtLAogICAgICAgICAgYXJyYXksCiAgICAgICAgICBzdGFydGluZ0luZGV4ICsgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aAogICAgICAgICk7CiAgICAgICAgVmVydGV4Rm9ybWF0X2RlZmF1bHQucGFjaygKICAgICAgICAgIHZhbHVlLl92ZXJ0ZXhGb3JtYXQsCiAgICAgICAgICBhcnJheSwKICAgICAgICAgIHN0YXJ0aW5nSW5kZXggKyAyICogQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aAogICAgICAgICk7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCArIDIgKiBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoICsgVmVydGV4Rm9ybWF0X2RlZmF1bHQucGFja2VkTGVuZ3RoXSA9IHZhbHVlLl9vZmZzZXRBdHRyaWJ1dGUgPz8gLTE7CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9OwogICAgICBzY3JhdGNoTWluID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoTWF4ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoVmVydGV4Rm9ybWF0ID0gbmV3IFZlcnRleEZvcm1hdF9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hPcHRpb25zID0gewogICAgICAgIG1pbmltdW06IHNjcmF0Y2hNaW4sCiAgICAgICAgbWF4aW11bTogc2NyYXRjaE1heCwKICAgICAgICB2ZXJ0ZXhGb3JtYXQ6IHNjcmF0Y2hWZXJ0ZXhGb3JtYXQsCiAgICAgICAgb2Zmc2V0QXR0cmlidXRlOiB2b2lkIDAKICAgICAgfTsKICAgICAgQm94R2VvbWV0cnkudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBjb25zdCBtaW4zID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCwgc2NyYXRjaE1pbik7CiAgICAgICAgY29uc3QgbWF4MyA9IENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2soCiAgICAgICAgICBhcnJheSwKICAgICAgICAgIHN0YXJ0aW5nSW5kZXggKyBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoLAogICAgICAgICAgc2NyYXRjaE1heAogICAgICAgICk7CiAgICAgICAgY29uc3QgdmVydGV4Rm9ybWF0ID0gVmVydGV4Rm9ybWF0X2RlZmF1bHQudW5wYWNrKAogICAgICAgICAgYXJyYXksCiAgICAgICAgICBzdGFydGluZ0luZGV4ICsgMiAqIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGgsCiAgICAgICAgICBzY3JhdGNoVmVydGV4Rm9ybWF0CiAgICAgICAgKTsKICAgICAgICBjb25zdCBvZmZzZXRBdHRyaWJ1dGUgPSBhcnJheVtzdGFydGluZ0luZGV4ICsgMiAqIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrZWRMZW5ndGhdOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zLm9mZnNldEF0dHJpYnV0ZSA9IG9mZnNldEF0dHJpYnV0ZSA9PT0gLTEgPyB2b2lkIDAgOiBvZmZzZXRBdHRyaWJ1dGU7CiAgICAgICAgICByZXR1cm4gbmV3IEJveEdlb21ldHJ5KHNjcmF0Y2hPcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0Ll9taW5pbXVtID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKG1pbjMsIHJlc3VsdC5fbWluaW11bSk7CiAgICAgICAgcmVzdWx0Ll9tYXhpbXVtID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKG1heDMsIHJlc3VsdC5fbWF4aW11bSk7CiAgICAgICAgcmVzdWx0Ll92ZXJ0ZXhGb3JtYXQgPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5jbG9uZSh2ZXJ0ZXhGb3JtYXQsIHJlc3VsdC5fdmVydGV4Rm9ybWF0KTsKICAgICAgICByZXN1bHQuX29mZnNldEF0dHJpYnV0ZSA9IG9mZnNldEF0dHJpYnV0ZSA9PT0gLTEgPyB2b2lkIDAgOiBvZmZzZXRBdHRyaWJ1dGU7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQm94R2VvbWV0cnkuY3JlYXRlR2VvbWV0cnkgPSBmdW5jdGlvbihib3hHZW9tZXRyeSkgewogICAgICAgIGNvbnN0IG1pbjMgPSBib3hHZW9tZXRyeS5fbWluaW11bTsKICAgICAgICBjb25zdCBtYXgzID0gYm94R2VvbWV0cnkuX21heGltdW07CiAgICAgICAgY29uc3QgdmVydGV4Rm9ybWF0ID0gYm94R2VvbWV0cnkuX3ZlcnRleEZvcm1hdDsKICAgICAgICBpZiAoQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFscyhtaW4zLCBtYXgzKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlc19kZWZhdWx0KCk7CiAgICAgICAgbGV0IGluZGljZXM7CiAgICAgICAgbGV0IHBvc2l0aW9uczsKICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnBvc2l0aW9uICYmICh2ZXJ0ZXhGb3JtYXQuc3QgfHwgdmVydGV4Rm9ybWF0Lm5vcm1hbCB8fCB2ZXJ0ZXhGb3JtYXQudGFuZ2VudCB8fCB2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSkgewogICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5wb3NpdGlvbikgewogICAgICAgICAgICBwb3NpdGlvbnMgPSBuZXcgRmxvYXQ2NEFycmF5KDYgKiA0ICogMyk7CiAgICAgICAgICAgIHBvc2l0aW9uc1swXSA9IG1pbjMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzFdID0gbWluMy55OwogICAgICAgICAgICBwb3NpdGlvbnNbMl0gPSBtYXgzLno7CiAgICAgICAgICAgIHBvc2l0aW9uc1szXSA9IG1heDMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzRdID0gbWluMy55OwogICAgICAgICAgICBwb3NpdGlvbnNbNV0gPSBtYXgzLno7CiAgICAgICAgICAgIHBvc2l0aW9uc1s2XSA9IG1heDMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzddID0gbWF4My55OwogICAgICAgICAgICBwb3NpdGlvbnNbOF0gPSBtYXgzLno7CiAgICAgICAgICAgIHBvc2l0aW9uc1s5XSA9IG1pbjMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzEwXSA9IG1heDMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzExXSA9IG1heDMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzEyXSA9IG1pbjMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzEzXSA9IG1pbjMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzE0XSA9IG1pbjMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzE1XSA9IG1heDMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzE2XSA9IG1pbjMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzE3XSA9IG1pbjMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzE4XSA9IG1heDMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzE5XSA9IG1heDMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzIwXSA9IG1pbjMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzIxXSA9IG1pbjMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzIyXSA9IG1heDMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzIzXSA9IG1pbjMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzI0XSA9IG1heDMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzI1XSA9IG1pbjMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzI2XSA9IG1pbjMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzI3XSA9IG1heDMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzI4XSA9IG1heDMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzI5XSA9IG1pbjMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzMwXSA9IG1heDMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzMxXSA9IG1heDMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzMyXSA9IG1heDMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzMzXSA9IG1heDMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzM0XSA9IG1pbjMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzM1XSA9IG1heDMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzM2XSA9IG1pbjMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzM3XSA9IG1pbjMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzM4XSA9IG1pbjMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzM5XSA9IG1pbjMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzQwXSA9IG1heDMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzQxXSA9IG1pbjMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzQyXSA9IG1pbjMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzQzXSA9IG1heDMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzQ0XSA9IG1heDMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzQ1XSA9IG1pbjMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzQ2XSA9IG1pbjMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzQ3XSA9IG1heDMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzQ4XSA9IG1pbjMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzQ5XSA9IG1heDMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzUwXSA9IG1pbjMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzUxXSA9IG1heDMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzUyXSA9IG1heDMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzUzXSA9IG1pbjMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzU0XSA9IG1heDMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzU1XSA9IG1heDMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzU2XSA9IG1heDMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzU3XSA9IG1pbjMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzU4XSA9IG1heDMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzU5XSA9IG1heDMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzYwXSA9IG1pbjMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzYxXSA9IG1pbjMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzYyXSA9IG1pbjMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzYzXSA9IG1heDMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzY0XSA9IG1pbjMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzY1XSA9IG1pbjMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzY2XSA9IG1heDMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzY3XSA9IG1pbjMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzY4XSA9IG1heDMuejsKICAgICAgICAgICAgcG9zaXRpb25zWzY5XSA9IG1pbjMueDsKICAgICAgICAgICAgcG9zaXRpb25zWzcwXSA9IG1pbjMueTsKICAgICAgICAgICAgcG9zaXRpb25zWzcxXSA9IG1heDMuejsKICAgICAgICAgICAgYXR0cmlidXRlcy5wb3NpdGlvbiA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5ET1VCTEUsCiAgICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgICAgICB2YWx1ZXM6IHBvc2l0aW9ucwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQubm9ybWFsKSB7CiAgICAgICAgICAgIGNvbnN0IG5vcm1hbHMgPSBuZXcgRmxvYXQzMkFycmF5KDYgKiA0ICogMyk7CiAgICAgICAgICAgIG5vcm1hbHNbMF0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzFdID0gMDsKICAgICAgICAgICAgbm9ybWFsc1syXSA9IDE7CiAgICAgICAgICAgIG5vcm1hbHNbM10gPSAwOwogICAgICAgICAgICBub3JtYWxzWzRdID0gMDsKICAgICAgICAgICAgbm9ybWFsc1s1XSA9IDE7CiAgICAgICAgICAgIG5vcm1hbHNbNl0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzddID0gMDsKICAgICAgICAgICAgbm9ybWFsc1s4XSA9IDE7CiAgICAgICAgICAgIG5vcm1hbHNbOV0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzEwXSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbMTFdID0gMTsKICAgICAgICAgICAgbm9ybWFsc1sxMl0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzEzXSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbMTRdID0gLTE7CiAgICAgICAgICAgIG5vcm1hbHNbMTVdID0gMDsKICAgICAgICAgICAgbm9ybWFsc1sxNl0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzE3XSA9IC0xOwogICAgICAgICAgICBub3JtYWxzWzE4XSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbMTldID0gMDsKICAgICAgICAgICAgbm9ybWFsc1syMF0gPSAtMTsKICAgICAgICAgICAgbm9ybWFsc1syMV0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzIyXSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbMjNdID0gLTE7CiAgICAgICAgICAgIG5vcm1hbHNbMjRdID0gMTsKICAgICAgICAgICAgbm9ybWFsc1syNV0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzI2XSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbMjddID0gMTsKICAgICAgICAgICAgbm9ybWFsc1syOF0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzI5XSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbMzBdID0gMTsKICAgICAgICAgICAgbm9ybWFsc1szMV0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzMyXSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbMzNdID0gMTsKICAgICAgICAgICAgbm9ybWFsc1szNF0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzM1XSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbMzZdID0gLTE7CiAgICAgICAgICAgIG5vcm1hbHNbMzddID0gMDsKICAgICAgICAgICAgbm9ybWFsc1szOF0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzM5XSA9IC0xOwogICAgICAgICAgICBub3JtYWxzWzQwXSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbNDFdID0gMDsKICAgICAgICAgICAgbm9ybWFsc1s0Ml0gPSAtMTsKICAgICAgICAgICAgbm9ybWFsc1s0M10gPSAwOwogICAgICAgICAgICBub3JtYWxzWzQ0XSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbNDVdID0gLTE7CiAgICAgICAgICAgIG5vcm1hbHNbNDZdID0gMDsKICAgICAgICAgICAgbm9ybWFsc1s0N10gPSAwOwogICAgICAgICAgICBub3JtYWxzWzQ4XSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbNDldID0gMTsKICAgICAgICAgICAgbm9ybWFsc1s1MF0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzUxXSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbNTJdID0gMTsKICAgICAgICAgICAgbm9ybWFsc1s1M10gPSAwOwogICAgICAgICAgICBub3JtYWxzWzU0XSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbNTVdID0gMTsKICAgICAgICAgICAgbm9ybWFsc1s1Nl0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzU3XSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbNThdID0gMTsKICAgICAgICAgICAgbm9ybWFsc1s1OV0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzYwXSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbNjFdID0gLTE7CiAgICAgICAgICAgIG5vcm1hbHNbNjJdID0gMDsKICAgICAgICAgICAgbm9ybWFsc1s2M10gPSAwOwogICAgICAgICAgICBub3JtYWxzWzY0XSA9IC0xOwogICAgICAgICAgICBub3JtYWxzWzY1XSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbNjZdID0gMDsKICAgICAgICAgICAgbm9ybWFsc1s2N10gPSAtMTsKICAgICAgICAgICAgbm9ybWFsc1s2OF0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzY5XSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbNzBdID0gLTE7CiAgICAgICAgICAgIG5vcm1hbHNbNzFdID0gMDsKICAgICAgICAgICAgYXR0cmlidXRlcy5ub3JtYWwgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgICAgICB2YWx1ZXM6IG5vcm1hbHMKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnN0KSB7CiAgICAgICAgICAgIGNvbnN0IHRleENvb3JkcyA9IG5ldyBGbG9hdDMyQXJyYXkoNiAqIDQgKiAyKTsKICAgICAgICAgICAgdGV4Q29vcmRzWzBdID0gMDsKICAgICAgICAgICAgdGV4Q29vcmRzWzFdID0gMDsKICAgICAgICAgICAgdGV4Q29vcmRzWzJdID0gMTsKICAgICAgICAgICAgdGV4Q29vcmRzWzNdID0gMDsKICAgICAgICAgICAgdGV4Q29vcmRzWzRdID0gMTsKICAgICAgICAgICAgdGV4Q29vcmRzWzVdID0gMTsKICAgICAgICAgICAgdGV4Q29vcmRzWzZdID0gMDsKICAgICAgICAgICAgdGV4Q29vcmRzWzddID0gMTsKICAgICAgICAgICAgdGV4Q29vcmRzWzhdID0gMTsKICAgICAgICAgICAgdGV4Q29vcmRzWzldID0gMDsKICAgICAgICAgICAgdGV4Q29vcmRzWzEwXSA9IDA7CiAgICAgICAgICAgIHRleENvb3Jkc1sxMV0gPSAwOwogICAgICAgICAgICB0ZXhDb29yZHNbMTJdID0gMDsKICAgICAgICAgICAgdGV4Q29vcmRzWzEzXSA9IDE7CiAgICAgICAgICAgIHRleENvb3Jkc1sxNF0gPSAxOwogICAgICAgICAgICB0ZXhDb29yZHNbMTVdID0gMTsKICAgICAgICAgICAgdGV4Q29vcmRzWzE2XSA9IDA7CiAgICAgICAgICAgIHRleENvb3Jkc1sxN10gPSAwOwogICAgICAgICAgICB0ZXhDb29yZHNbMThdID0gMTsKICAgICAgICAgICAgdGV4Q29vcmRzWzE5XSA9IDA7CiAgICAgICAgICAgIHRleENvb3Jkc1syMF0gPSAxOwogICAgICAgICAgICB0ZXhDb29yZHNbMjFdID0gMTsKICAgICAgICAgICAgdGV4Q29vcmRzWzIyXSA9IDA7CiAgICAgICAgICAgIHRleENvb3Jkc1syM10gPSAxOwogICAgICAgICAgICB0ZXhDb29yZHNbMjRdID0gMTsKICAgICAgICAgICAgdGV4Q29vcmRzWzI1XSA9IDA7CiAgICAgICAgICAgIHRleENvb3Jkc1syNl0gPSAwOwogICAgICAgICAgICB0ZXhDb29yZHNbMjddID0gMDsKICAgICAgICAgICAgdGV4Q29vcmRzWzI4XSA9IDA7CiAgICAgICAgICAgIHRleENvb3Jkc1syOV0gPSAxOwogICAgICAgICAgICB0ZXhDb29yZHNbMzBdID0gMTsKICAgICAgICAgICAgdGV4Q29vcmRzWzMxXSA9IDE7CiAgICAgICAgICAgIHRleENvb3Jkc1szMl0gPSAxOwogICAgICAgICAgICB0ZXhDb29yZHNbMzNdID0gMDsKICAgICAgICAgICAgdGV4Q29vcmRzWzM0XSA9IDA7CiAgICAgICAgICAgIHRleENvb3Jkc1szNV0gPSAwOwogICAgICAgICAgICB0ZXhDb29yZHNbMzZdID0gMDsKICAgICAgICAgICAgdGV4Q29vcmRzWzM3XSA9IDE7CiAgICAgICAgICAgIHRleENvb3Jkc1szOF0gPSAxOwogICAgICAgICAgICB0ZXhDb29yZHNbMzldID0gMTsKICAgICAgICAgICAgdGV4Q29vcmRzWzQwXSA9IDA7CiAgICAgICAgICAgIHRleENvb3Jkc1s0MV0gPSAwOwogICAgICAgICAgICB0ZXhDb29yZHNbNDJdID0gMTsKICAgICAgICAgICAgdGV4Q29vcmRzWzQzXSA9IDA7CiAgICAgICAgICAgIHRleENvb3Jkc1s0NF0gPSAxOwogICAgICAgICAgICB0ZXhDb29yZHNbNDVdID0gMTsKICAgICAgICAgICAgdGV4Q29vcmRzWzQ2XSA9IDA7CiAgICAgICAgICAgIHRleENvb3Jkc1s0N10gPSAxOwogICAgICAgICAgICBhdHRyaWJ1dGVzLnN0ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDIsCiAgICAgICAgICAgICAgdmFsdWVzOiB0ZXhDb29yZHMKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnRhbmdlbnQpIHsKICAgICAgICAgICAgY29uc3QgdGFuZ2VudHMgPSBuZXcgRmxvYXQzMkFycmF5KDYgKiA0ICogMyk7CiAgICAgICAgICAgIHRhbmdlbnRzWzBdID0gMTsKICAgICAgICAgICAgdGFuZ2VudHNbMV0gPSAwOwogICAgICAgICAgICB0YW5nZW50c1syXSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzNdID0gMTsKICAgICAgICAgICAgdGFuZ2VudHNbNF0gPSAwOwogICAgICAgICAgICB0YW5nZW50c1s1XSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzZdID0gMTsKICAgICAgICAgICAgdGFuZ2VudHNbN10gPSAwOwogICAgICAgICAgICB0YW5nZW50c1s4XSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzldID0gMTsKICAgICAgICAgICAgdGFuZ2VudHNbMTBdID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbMTFdID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbMTJdID0gLTE7CiAgICAgICAgICAgIHRhbmdlbnRzWzEzXSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzE0XSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzE1XSA9IC0xOwogICAgICAgICAgICB0YW5nZW50c1sxNl0gPSAwOwogICAgICAgICAgICB0YW5nZW50c1sxN10gPSAwOwogICAgICAgICAgICB0YW5nZW50c1sxOF0gPSAtMTsKICAgICAgICAgICAgdGFuZ2VudHNbMTldID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbMjBdID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbMjFdID0gLTE7CiAgICAgICAgICAgIHRhbmdlbnRzWzIyXSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzIzXSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzI0XSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzI1XSA9IDE7CiAgICAgICAgICAgIHRhbmdlbnRzWzI2XSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzI3XSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzI4XSA9IDE7CiAgICAgICAgICAgIHRhbmdlbnRzWzI5XSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzMwXSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzMxXSA9IDE7CiAgICAgICAgICAgIHRhbmdlbnRzWzMyXSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzMzXSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzM0XSA9IDE7CiAgICAgICAgICAgIHRhbmdlbnRzWzM1XSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzM2XSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzM3XSA9IC0xOwogICAgICAgICAgICB0YW5nZW50c1szOF0gPSAwOwogICAgICAgICAgICB0YW5nZW50c1szOV0gPSAwOwogICAgICAgICAgICB0YW5nZW50c1s0MF0gPSAtMTsKICAgICAgICAgICAgdGFuZ2VudHNbNDFdID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbNDJdID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbNDNdID0gLTE7CiAgICAgICAgICAgIHRhbmdlbnRzWzQ0XSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzQ1XSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzQ2XSA9IC0xOwogICAgICAgICAgICB0YW5nZW50c1s0N10gPSAwOwogICAgICAgICAgICB0YW5nZW50c1s0OF0gPSAtMTsKICAgICAgICAgICAgdGFuZ2VudHNbNDldID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbNTBdID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbNTFdID0gLTE7CiAgICAgICAgICAgIHRhbmdlbnRzWzUyXSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzUzXSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzU0XSA9IC0xOwogICAgICAgICAgICB0YW5nZW50c1s1NV0gPSAwOwogICAgICAgICAgICB0YW5nZW50c1s1Nl0gPSAwOwogICAgICAgICAgICB0YW5nZW50c1s1N10gPSAtMTsKICAgICAgICAgICAgdGFuZ2VudHNbNThdID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbNTldID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbNjBdID0gMTsKICAgICAgICAgICAgdGFuZ2VudHNbNjFdID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbNjJdID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbNjNdID0gMTsKICAgICAgICAgICAgdGFuZ2VudHNbNjRdID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbNjVdID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbNjZdID0gMTsKICAgICAgICAgICAgdGFuZ2VudHNbNjddID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbNjhdID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbNjldID0gMTsKICAgICAgICAgICAgdGFuZ2VudHNbNzBdID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbNzFdID0gMDsKICAgICAgICAgICAgYXR0cmlidXRlcy50YW5nZW50ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgICAgICAgdmFsdWVzOiB0YW5nZW50cwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgICAgICAgIGNvbnN0IGJpdGFuZ2VudHMgPSBuZXcgRmxvYXQzMkFycmF5KDYgKiA0ICogMyk7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbMF0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzFdID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1syXSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbM10gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzRdID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1s1XSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbNl0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzddID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1s4XSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbOV0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzEwXSA9IDE7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbMTFdID0gMDsKICAgICAgICAgICAgYml0YW5nZW50c1sxMl0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzEzXSA9IDE7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbMTRdID0gMDsKICAgICAgICAgICAgYml0YW5nZW50c1sxNV0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzE2XSA9IDE7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbMTddID0gMDsKICAgICAgICAgICAgYml0YW5nZW50c1sxOF0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzE5XSA9IDE7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbMjBdID0gMDsKICAgICAgICAgICAgYml0YW5nZW50c1syMV0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzIyXSA9IDE7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbMjNdID0gMDsKICAgICAgICAgICAgYml0YW5nZW50c1syNF0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzI1XSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbMjZdID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1syN10gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzI4XSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbMjldID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1szMF0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzMxXSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbMzJdID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1szM10gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzM0XSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbMzVdID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1szNl0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzM3XSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbMzhdID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1szOV0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzQwXSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbNDFdID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1s0Ml0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzQzXSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbNDRdID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1s0NV0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzQ2XSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbNDddID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1s0OF0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzQ5XSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbNTBdID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1s1MV0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzUyXSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbNTNdID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1s1NF0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzU1XSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbNTZdID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1s1N10gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzU4XSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbNTldID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1s2MF0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzYxXSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbNjJdID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1s2M10gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzY0XSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbNjVdID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1s2Nl0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzY3XSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbNjhdID0gMTsKICAgICAgICAgICAgYml0YW5nZW50c1s2OV0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzcwXSA9IDA7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbNzFdID0gMTsKICAgICAgICAgICAgYXR0cmlidXRlcy5iaXRhbmdlbnQgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgICAgICB2YWx1ZXM6IGJpdGFuZ2VudHMKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KDYgKiAyICogMyk7CiAgICAgICAgICBpbmRpY2VzWzBdID0gMDsKICAgICAgICAgIGluZGljZXNbMV0gPSAxOwogICAgICAgICAgaW5kaWNlc1syXSA9IDI7CiAgICAgICAgICBpbmRpY2VzWzNdID0gMDsKICAgICAgICAgIGluZGljZXNbNF0gPSAyOwogICAgICAgICAgaW5kaWNlc1s1XSA9IDM7CiAgICAgICAgICBpbmRpY2VzWzZdID0gNCArIDI7CiAgICAgICAgICBpbmRpY2VzWzddID0gNCArIDE7CiAgICAgICAgICBpbmRpY2VzWzhdID0gNCArIDA7CiAgICAgICAgICBpbmRpY2VzWzldID0gNCArIDM7CiAgICAgICAgICBpbmRpY2VzWzEwXSA9IDQgKyAyOwogICAgICAgICAgaW5kaWNlc1sxMV0gPSA0ICsgMDsKICAgICAgICAgIGluZGljZXNbMTJdID0gOCArIDA7CiAgICAgICAgICBpbmRpY2VzWzEzXSA9IDggKyAxOwogICAgICAgICAgaW5kaWNlc1sxNF0gPSA4ICsgMjsKICAgICAgICAgIGluZGljZXNbMTVdID0gOCArIDA7CiAgICAgICAgICBpbmRpY2VzWzE2XSA9IDggKyAyOwogICAgICAgICAgaW5kaWNlc1sxN10gPSA4ICsgMzsKICAgICAgICAgIGluZGljZXNbMThdID0gMTIgKyAyOwogICAgICAgICAgaW5kaWNlc1sxOV0gPSAxMiArIDE7CiAgICAgICAgICBpbmRpY2VzWzIwXSA9IDEyICsgMDsKICAgICAgICAgIGluZGljZXNbMjFdID0gMTIgKyAzOwogICAgICAgICAgaW5kaWNlc1syMl0gPSAxMiArIDI7CiAgICAgICAgICBpbmRpY2VzWzIzXSA9IDEyICsgMDsKICAgICAgICAgIGluZGljZXNbMjRdID0gMTYgKyAyOwogICAgICAgICAgaW5kaWNlc1syNV0gPSAxNiArIDE7CiAgICAgICAgICBpbmRpY2VzWzI2XSA9IDE2ICsgMDsKICAgICAgICAgIGluZGljZXNbMjddID0gMTYgKyAzOwogICAgICAgICAgaW5kaWNlc1syOF0gPSAxNiArIDI7CiAgICAgICAgICBpbmRpY2VzWzI5XSA9IDE2ICsgMDsKICAgICAgICAgIGluZGljZXNbMzBdID0gMjAgKyAwOwogICAgICAgICAgaW5kaWNlc1szMV0gPSAyMCArIDE7CiAgICAgICAgICBpbmRpY2VzWzMyXSA9IDIwICsgMjsKICAgICAgICAgIGluZGljZXNbMzNdID0gMjAgKyAwOwogICAgICAgICAgaW5kaWNlc1szNF0gPSAyMCArIDI7CiAgICAgICAgICBpbmRpY2VzWzM1XSA9IDIwICsgMzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcG9zaXRpb25zID0gbmV3IEZsb2F0NjRBcnJheSg4ICogMyk7CiAgICAgICAgICBwb3NpdGlvbnNbMF0gPSBtaW4zLng7CiAgICAgICAgICBwb3NpdGlvbnNbMV0gPSBtaW4zLnk7CiAgICAgICAgICBwb3NpdGlvbnNbMl0gPSBtaW4zLno7CiAgICAgICAgICBwb3NpdGlvbnNbM10gPSBtYXgzLng7CiAgICAgICAgICBwb3NpdGlvbnNbNF0gPSBtaW4zLnk7CiAgICAgICAgICBwb3NpdGlvbnNbNV0gPSBtaW4zLno7CiAgICAgICAgICBwb3NpdGlvbnNbNl0gPSBtYXgzLng7CiAgICAgICAgICBwb3NpdGlvbnNbN10gPSBtYXgzLnk7CiAgICAgICAgICBwb3NpdGlvbnNbOF0gPSBtaW4zLno7CiAgICAgICAgICBwb3NpdGlvbnNbOV0gPSBtaW4zLng7CiAgICAgICAgICBwb3NpdGlvbnNbMTBdID0gbWF4My55OwogICAgICAgICAgcG9zaXRpb25zWzExXSA9IG1pbjMuejsKICAgICAgICAgIHBvc2l0aW9uc1sxMl0gPSBtaW4zLng7CiAgICAgICAgICBwb3NpdGlvbnNbMTNdID0gbWluMy55OwogICAgICAgICAgcG9zaXRpb25zWzE0XSA9IG1heDMuejsKICAgICAgICAgIHBvc2l0aW9uc1sxNV0gPSBtYXgzLng7CiAgICAgICAgICBwb3NpdGlvbnNbMTZdID0gbWluMy55OwogICAgICAgICAgcG9zaXRpb25zWzE3XSA9IG1heDMuejsKICAgICAgICAgIHBvc2l0aW9uc1sxOF0gPSBtYXgzLng7CiAgICAgICAgICBwb3NpdGlvbnNbMTldID0gbWF4My55OwogICAgICAgICAgcG9zaXRpb25zWzIwXSA9IG1heDMuejsKICAgICAgICAgIHBvc2l0aW9uc1syMV0gPSBtaW4zLng7CiAgICAgICAgICBwb3NpdGlvbnNbMjJdID0gbWF4My55OwogICAgICAgICAgcG9zaXRpb25zWzIzXSA9IG1heDMuejsKICAgICAgICAgIGF0dHJpYnV0ZXMucG9zaXRpb24gPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkRPVUJMRSwKICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgICAgdmFsdWVzOiBwb3NpdGlvbnMKICAgICAgICAgIH0pOwogICAgICAgICAgaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheSg2ICogMiAqIDMpOwogICAgICAgICAgaW5kaWNlc1swXSA9IDQ7CiAgICAgICAgICBpbmRpY2VzWzFdID0gNTsKICAgICAgICAgIGluZGljZXNbMl0gPSA2OwogICAgICAgICAgaW5kaWNlc1szXSA9IDQ7CiAgICAgICAgICBpbmRpY2VzWzRdID0gNjsKICAgICAgICAgIGluZGljZXNbNV0gPSA3OwogICAgICAgICAgaW5kaWNlc1s2XSA9IDE7CiAgICAgICAgICBpbmRpY2VzWzddID0gMDsKICAgICAgICAgIGluZGljZXNbOF0gPSAzOwogICAgICAgICAgaW5kaWNlc1s5XSA9IDE7CiAgICAgICAgICBpbmRpY2VzWzEwXSA9IDM7CiAgICAgICAgICBpbmRpY2VzWzExXSA9IDI7CiAgICAgICAgICBpbmRpY2VzWzEyXSA9IDE7CiAgICAgICAgICBpbmRpY2VzWzEzXSA9IDY7CiAgICAgICAgICBpbmRpY2VzWzE0XSA9IDU7CiAgICAgICAgICBpbmRpY2VzWzE1XSA9IDE7CiAgICAgICAgICBpbmRpY2VzWzE2XSA9IDI7CiAgICAgICAgICBpbmRpY2VzWzE3XSA9IDY7CiAgICAgICAgICBpbmRpY2VzWzE4XSA9IDI7CiAgICAgICAgICBpbmRpY2VzWzE5XSA9IDM7CiAgICAgICAgICBpbmRpY2VzWzIwXSA9IDc7CiAgICAgICAgICBpbmRpY2VzWzIxXSA9IDI7CiAgICAgICAgICBpbmRpY2VzWzIyXSA9IDc7CiAgICAgICAgICBpbmRpY2VzWzIzXSA9IDY7CiAgICAgICAgICBpbmRpY2VzWzI0XSA9IDM7CiAgICAgICAgICBpbmRpY2VzWzI1XSA9IDA7CiAgICAgICAgICBpbmRpY2VzWzI2XSA9IDQ7CiAgICAgICAgICBpbmRpY2VzWzI3XSA9IDM7CiAgICAgICAgICBpbmRpY2VzWzI4XSA9IDQ7CiAgICAgICAgICBpbmRpY2VzWzI5XSA9IDc7CiAgICAgICAgICBpbmRpY2VzWzMwXSA9IDA7CiAgICAgICAgICBpbmRpY2VzWzMxXSA9IDE7CiAgICAgICAgICBpbmRpY2VzWzMyXSA9IDU7CiAgICAgICAgICBpbmRpY2VzWzMzXSA9IDA7CiAgICAgICAgICBpbmRpY2VzWzM0XSA9IDU7CiAgICAgICAgICBpbmRpY2VzWzM1XSA9IDQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGRpZmYgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QobWF4MywgbWluMywgZGlmZlNjcmF0Y2gpOwogICAgICAgIGNvbnN0IHJhZGl1cyA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUoZGlmZikgKiAwLjU7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChib3hHZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlKSkgewogICAgICAgICAgY29uc3QgbGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aDsKICAgICAgICAgIGNvbnN0IG9mZnNldFZhbHVlID0gYm94R2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZSA9PT0gR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGVfZGVmYXVsdC5OT05FID8gMCA6IDE7CiAgICAgICAgICBjb25zdCBhcHBseU9mZnNldCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCAvIDMpLmZpbGwob2Zmc2V0VmFsdWUpOwogICAgICAgICAgYXR0cmlidXRlcy5hcHBseU9mZnNldCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuVU5TSUdORURfQllURSwKICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMSwKICAgICAgICAgICAgdmFsdWVzOiBhcHBseU9mZnNldAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgR2VvbWV0cnlfZGVmYXVsdCh7CiAgICAgICAgICBhdHRyaWJ1dGVzLAogICAgICAgICAgaW5kaWNlcywKICAgICAgICAgIHByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5UUklBTkdMRVMsCiAgICAgICAgICBib3VuZGluZ1NwaGVyZTogbmV3IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQoQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8sIHJhZGl1cyksCiAgICAgICAgICBvZmZzZXRBdHRyaWJ1dGU6IGJveEdlb21ldHJ5Ll9vZmZzZXRBdHRyaWJ1dGUKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgQm94R2VvbWV0cnkuZ2V0VW5pdEJveCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHVuaXRCb3hHZW9tZXRyeSkpIHsKICAgICAgICAgIHVuaXRCb3hHZW9tZXRyeSA9IEJveEdlb21ldHJ5LmNyZWF0ZUdlb21ldHJ5KAogICAgICAgICAgICBCb3hHZW9tZXRyeS5mcm9tRGltZW5zaW9ucyh7CiAgICAgICAgICAgICAgZGltZW5zaW9uczogbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgxLCAxLCAxKSwKICAgICAgICAgICAgICB2ZXJ0ZXhGb3JtYXQ6IFZlcnRleEZvcm1hdF9kZWZhdWx0LlBPU0lUSU9OX09OTFkKICAgICAgICAgICAgfSkKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1bml0Qm94R2VvbWV0cnk7CiAgICAgIH07CiAgICAgIEJveEdlb21ldHJ5X2RlZmF1bHQgPSBCb3hHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZUJveEdlb21ldHJ5LmpzCiAgdmFyIGNyZWF0ZUJveEdlb21ldHJ5X2V4cG9ydHMgPSB7fTsKICBfX2V4cG9ydChjcmVhdGVCb3hHZW9tZXRyeV9leHBvcnRzLCB7CiAgICBkZWZhdWx0OiAoKSA9PiBjcmVhdGVCb3hHZW9tZXRyeV9kZWZhdWx0CiAgfSk7CiAgZnVuY3Rpb24gY3JlYXRlQm94R2VvbWV0cnkoYm94R2VvbWV0cnksIG9mZnNldCkgewogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvZmZzZXQpKSB7CiAgICAgIGJveEdlb21ldHJ5ID0gQm94R2VvbWV0cnlfZGVmYXVsdC51bnBhY2soYm94R2VvbWV0cnksIG9mZnNldCk7CiAgICB9CiAgICByZXR1cm4gQm94R2VvbWV0cnlfZGVmYXVsdC5jcmVhdGVHZW9tZXRyeShib3hHZW9tZXRyeSk7CiAgfQogIHZhciBjcmVhdGVCb3hHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X2NyZWF0ZUJveEdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVCb3hHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfQm94R2VvbWV0cnkoKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGNyZWF0ZUJveEdlb21ldHJ5X2RlZmF1bHQgPSBjcmVhdGVCb3hHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0JveE91dGxpbmVHZW9tZXRyeS5qcwogIGZ1bmN0aW9uIEJveE91dGxpbmVHZW9tZXRyeShvcHRpb25zKSB7CiAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICBjb25zdCBtaW4zID0gb3B0aW9ucy5taW5pbXVtOwogICAgY29uc3QgbWF4MyA9IG9wdGlvbnMubWF4aW11bTsKICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWluIiwgbWluMyk7CiAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1heCIsIG1heDMpOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvcHRpb25zLm9mZnNldEF0dHJpYnV0ZSkgJiYgb3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGUgPT09IEdlb21ldHJ5T2Zmc2V0QXR0cmlidXRlX2RlZmF1bHQuVE9QKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICJHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZS5UT1AgaXMgbm90IGEgc3VwcG9ydGVkIG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlIGZvciB0aGlzIGdlb21ldHJ5LiIKICAgICAgKTsKICAgIH0KICAgIHRoaXMuX21pbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShtaW4zKTsKICAgIHRoaXMuX21heCA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShtYXgzKTsKICAgIHRoaXMuX29mZnNldEF0dHJpYnV0ZSA9IG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlOwogICAgdGhpcy5fd29ya2VyTmFtZSA9ICJjcmVhdGVCb3hPdXRsaW5lR2VvbWV0cnkiOwogIH0KICB2YXIgZGlmZlNjcmF0Y2gyLCBzY3JhdGNoTWluMiwgc2NyYXRjaE1heDIsIHNjcmF0Y2hPcHRpb25zMiwgQm94T3V0bGluZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfQm94T3V0bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Cb3hPdXRsaW5lR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X0JvdW5kaW5nU3BoZXJlKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfQ29tcG9uZW50RGF0YXR5cGUoKTsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9HZW9tZXRyeSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlKCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGVzKCk7CiAgICAgIGluaXRfR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGUoKTsKICAgICAgaW5pdF9QcmltaXRpdmVUeXBlKCk7CiAgICAgIGRpZmZTY3JhdGNoMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgQm94T3V0bGluZUdlb21ldHJ5LmZyb21EaW1lbnNpb25zID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgICAgICBjb25zdCBkaW1lbnNpb25zID0gb3B0aW9ucy5kaW1lbnNpb25zOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiZGltZW5zaW9ucyIsIGRpbWVuc2lvbnMpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJkaW1lbnNpb25zLngiLCBkaW1lbnNpb25zLngsIDApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJkaW1lbnNpb25zLnkiLCBkaW1lbnNpb25zLnksIDApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJkaW1lbnNpb25zLnoiLCBkaW1lbnNpb25zLnosIDApOwogICAgICAgIGNvbnN0IGNvcm5lciA9IENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKGRpbWVuc2lvbnMsIDAuNSwgbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpKTsKICAgICAgICByZXR1cm4gbmV3IEJveE91dGxpbmVHZW9tZXRyeSh7CiAgICAgICAgICBtaW5pbXVtOiBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKGNvcm5lciwgbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpKSwKICAgICAgICAgIG1heGltdW06IGNvcm5lciwKICAgICAgICAgIG9mZnNldEF0dHJpYnV0ZTogb3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGUKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgQm94T3V0bGluZUdlb21ldHJ5LmZyb21BeGlzQWxpZ25lZEJvdW5kaW5nQm94ID0gZnVuY3Rpb24oYm91bmRpbmdCb3gpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImJvdW5kaW5kQm94IiwgYm91bmRpbmdCb3gpOwogICAgICAgIHJldHVybiBuZXcgQm94T3V0bGluZUdlb21ldHJ5KHsKICAgICAgICAgIG1pbmltdW06IGJvdW5kaW5nQm94Lm1pbmltdW0sCiAgICAgICAgICBtYXhpbXVtOiBib3VuZGluZ0JveC5tYXhpbXVtCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIEJveE91dGxpbmVHZW9tZXRyeS5wYWNrZWRMZW5ndGggPSAyICogQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aCArIDE7CiAgICAgIEJveE91dGxpbmVHZW9tZXRyeS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2sodmFsdWUuX21pbiwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKHZhbHVlLl9tYXgsIGFycmF5LCBzdGFydGluZ0luZGV4ICsgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aCk7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCArIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGggKiAyXSA9IHZhbHVlLl9vZmZzZXRBdHRyaWJ1dGUgPz8gLTE7CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9OwogICAgICBzY3JhdGNoTWluMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaE1heDIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hPcHRpb25zMiA9IHsKICAgICAgICBtaW5pbXVtOiBzY3JhdGNoTWluMiwKICAgICAgICBtYXhpbXVtOiBzY3JhdGNoTWF4MiwKICAgICAgICBvZmZzZXRBdHRyaWJ1dGU6IHZvaWQgMAogICAgICB9OwogICAgICBCb3hPdXRsaW5lR2VvbWV0cnkudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBjb25zdCBtaW4zID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCwgc2NyYXRjaE1pbjIpOwogICAgICAgIGNvbnN0IG1heDMgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKAogICAgICAgICAgYXJyYXksCiAgICAgICAgICBzdGFydGluZ0luZGV4ICsgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aCwKICAgICAgICAgIHNjcmF0Y2hNYXgyCiAgICAgICAgKTsKICAgICAgICBjb25zdCBvZmZzZXRBdHRyaWJ1dGUgPSBhcnJheVtzdGFydGluZ0luZGV4ICsgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aCAqIDJdOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMi5vZmZzZXRBdHRyaWJ1dGUgPSBvZmZzZXRBdHRyaWJ1dGUgPT09IC0xID8gdm9pZCAwIDogb2Zmc2V0QXR0cmlidXRlOwogICAgICAgICAgcmV0dXJuIG5ldyBCb3hPdXRsaW5lR2VvbWV0cnkoc2NyYXRjaE9wdGlvbnMyKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0Ll9taW4gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUobWluMywgcmVzdWx0Ll9taW4pOwogICAgICAgIHJlc3VsdC5fbWF4ID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKG1heDMsIHJlc3VsdC5fbWF4KTsKICAgICAgICByZXN1bHQuX29mZnNldEF0dHJpYnV0ZSA9IG9mZnNldEF0dHJpYnV0ZSA9PT0gLTEgPyB2b2lkIDAgOiBvZmZzZXRBdHRyaWJ1dGU7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQm94T3V0bGluZUdlb21ldHJ5LmNyZWF0ZUdlb21ldHJ5ID0gZnVuY3Rpb24oYm94R2VvbWV0cnkpIHsKICAgICAgICBjb25zdCBtaW4zID0gYm94R2VvbWV0cnkuX21pbjsKICAgICAgICBjb25zdCBtYXgzID0gYm94R2VvbWV0cnkuX21heDsKICAgICAgICBpZiAoQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFscyhtaW4zLCBtYXgzKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlc19kZWZhdWx0KCk7CiAgICAgICAgY29uc3QgaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheSgxMiAqIDIpOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkoOCAqIDMpOwogICAgICAgIHBvc2l0aW9uc1swXSA9IG1pbjMueDsKICAgICAgICBwb3NpdGlvbnNbMV0gPSBtaW4zLnk7CiAgICAgICAgcG9zaXRpb25zWzJdID0gbWluMy56OwogICAgICAgIHBvc2l0aW9uc1szXSA9IG1heDMueDsKICAgICAgICBwb3NpdGlvbnNbNF0gPSBtaW4zLnk7CiAgICAgICAgcG9zaXRpb25zWzVdID0gbWluMy56OwogICAgICAgIHBvc2l0aW9uc1s2XSA9IG1heDMueDsKICAgICAgICBwb3NpdGlvbnNbN10gPSBtYXgzLnk7CiAgICAgICAgcG9zaXRpb25zWzhdID0gbWluMy56OwogICAgICAgIHBvc2l0aW9uc1s5XSA9IG1pbjMueDsKICAgICAgICBwb3NpdGlvbnNbMTBdID0gbWF4My55OwogICAgICAgIHBvc2l0aW9uc1sxMV0gPSBtaW4zLno7CiAgICAgICAgcG9zaXRpb25zWzEyXSA9IG1pbjMueDsKICAgICAgICBwb3NpdGlvbnNbMTNdID0gbWluMy55OwogICAgICAgIHBvc2l0aW9uc1sxNF0gPSBtYXgzLno7CiAgICAgICAgcG9zaXRpb25zWzE1XSA9IG1heDMueDsKICAgICAgICBwb3NpdGlvbnNbMTZdID0gbWluMy55OwogICAgICAgIHBvc2l0aW9uc1sxN10gPSBtYXgzLno7CiAgICAgICAgcG9zaXRpb25zWzE4XSA9IG1heDMueDsKICAgICAgICBwb3NpdGlvbnNbMTldID0gbWF4My55OwogICAgICAgIHBvc2l0aW9uc1syMF0gPSBtYXgzLno7CiAgICAgICAgcG9zaXRpb25zWzIxXSA9IG1pbjMueDsKICAgICAgICBwb3NpdGlvbnNbMjJdID0gbWF4My55OwogICAgICAgIHBvc2l0aW9uc1syM10gPSBtYXgzLno7CiAgICAgICAgYXR0cmlidXRlcy5wb3NpdGlvbiA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkRPVUJMRSwKICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgICB2YWx1ZXM6IHBvc2l0aW9ucwogICAgICAgIH0pOwogICAgICAgIGluZGljZXNbMF0gPSA0OwogICAgICAgIGluZGljZXNbMV0gPSA1OwogICAgICAgIGluZGljZXNbMl0gPSA1OwogICAgICAgIGluZGljZXNbM10gPSA2OwogICAgICAgIGluZGljZXNbNF0gPSA2OwogICAgICAgIGluZGljZXNbNV0gPSA3OwogICAgICAgIGluZGljZXNbNl0gPSA3OwogICAgICAgIGluZGljZXNbN10gPSA0OwogICAgICAgIGluZGljZXNbOF0gPSAwOwogICAgICAgIGluZGljZXNbOV0gPSAxOwogICAgICAgIGluZGljZXNbMTBdID0gMTsKICAgICAgICBpbmRpY2VzWzExXSA9IDI7CiAgICAgICAgaW5kaWNlc1sxMl0gPSAyOwogICAgICAgIGluZGljZXNbMTNdID0gMzsKICAgICAgICBpbmRpY2VzWzE0XSA9IDM7CiAgICAgICAgaW5kaWNlc1sxNV0gPSAwOwogICAgICAgIGluZGljZXNbMTZdID0gMDsKICAgICAgICBpbmRpY2VzWzE3XSA9IDQ7CiAgICAgICAgaW5kaWNlc1sxOF0gPSAxOwogICAgICAgIGluZGljZXNbMTldID0gNTsKICAgICAgICBpbmRpY2VzWzIwXSA9IDI7CiAgICAgICAgaW5kaWNlc1syMV0gPSA2OwogICAgICAgIGluZGljZXNbMjJdID0gMzsKICAgICAgICBpbmRpY2VzWzIzXSA9IDc7CiAgICAgICAgY29uc3QgZGlmZiA9IENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChtYXgzLCBtaW4zLCBkaWZmU2NyYXRjaDIpOwogICAgICAgIGNvbnN0IHJhZGl1cyA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUoZGlmZikgKiAwLjU7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChib3hHZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlKSkgewogICAgICAgICAgY29uc3QgbGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aDsKICAgICAgICAgIGNvbnN0IG9mZnNldFZhbHVlID0gYm94R2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZSA9PT0gR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGVfZGVmYXVsdC5OT05FID8gMCA6IDE7CiAgICAgICAgICBjb25zdCBhcHBseU9mZnNldCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCAvIDMpLmZpbGwob2Zmc2V0VmFsdWUpOwogICAgICAgICAgYXR0cmlidXRlcy5hcHBseU9mZnNldCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuVU5TSUdORURfQllURSwKICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMSwKICAgICAgICAgICAgdmFsdWVzOiBhcHBseU9mZnNldAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgR2VvbWV0cnlfZGVmYXVsdCh7CiAgICAgICAgICBhdHRyaWJ1dGVzLAogICAgICAgICAgaW5kaWNlcywKICAgICAgICAgIHByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5MSU5FUywKICAgICAgICAgIGJvdW5kaW5nU3BoZXJlOiBuZXcgQm91bmRpbmdTcGhlcmVfZGVmYXVsdChDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTywgcmFkaXVzKSwKICAgICAgICAgIG9mZnNldEF0dHJpYnV0ZTogYm94R2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZQogICAgICAgIH0pOwogICAgICB9OwogICAgICBCb3hPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdCA9IEJveE91dGxpbmVHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZUJveE91dGxpbmVHZW9tZXRyeS5qcwogIHZhciBjcmVhdGVCb3hPdXRsaW5lR2VvbWV0cnlfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGNyZWF0ZUJveE91dGxpbmVHZW9tZXRyeV9leHBvcnRzLCB7CiAgICBkZWZhdWx0OiAoKSA9PiBjcmVhdGVCb3hPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdAogIH0pOwogIGZ1bmN0aW9uIGNyZWF0ZUJveE91dGxpbmVHZW9tZXRyeShib3hHZW9tZXRyeSwgb2Zmc2V0KSB7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG9mZnNldCkpIHsKICAgICAgYm94R2VvbWV0cnkgPSBCb3hPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdC51bnBhY2soYm94R2VvbWV0cnksIG9mZnNldCk7CiAgICB9CiAgICByZXR1cm4gQm94T3V0bGluZUdlb21ldHJ5X2RlZmF1bHQuY3JlYXRlR2VvbWV0cnkoYm94R2VvbWV0cnkpOwogIH0KICB2YXIgY3JlYXRlQm94T3V0bGluZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfY3JlYXRlQm94T3V0bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVCb3hPdXRsaW5lR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X0JveE91dGxpbmVHZW9tZXRyeSgpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgY3JlYXRlQm94T3V0bGluZUdlb21ldHJ5X2RlZmF1bHQgPSBjcmVhdGVCb3hPdXRsaW5lR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9FbGxpcHNlR2VvbWV0cnlMaWJyYXJ5LmpzCiAgZnVuY3Rpb24gcG9pbnRPbkVsbGlwc29pZCh0aGV0YSwgcm90YXRpb24sIG5vcnRoVmVjLCBlYXN0VmVjLCBhU3FyLCBhYiwgYlNxciwgbWFnLCB1bml0UG9zLCByZXN1bHQpIHsKICAgIGNvbnN0IGF6aW11dGggPSB0aGV0YSArIHJvdGF0aW9uOwogICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoZWFzdFZlYywgTWF0aC5jb3MoYXppbXV0aCksIHJvdEF4aXMpOwogICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIobm9ydGhWZWMsIE1hdGguc2luKGF6aW11dGgpLCB0ZW1wVmVjKTsKICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQocm90QXhpcywgdGVtcFZlYywgcm90QXhpcyk7CiAgICBsZXQgY29zVGhldGFTcXVhcmVkID0gTWF0aC5jb3ModGhldGEpOwogICAgY29zVGhldGFTcXVhcmVkID0gY29zVGhldGFTcXVhcmVkICogY29zVGhldGFTcXVhcmVkOwogICAgbGV0IHNpblRoZXRhU3F1YXJlZCA9IE1hdGguc2luKHRoZXRhKTsKICAgIHNpblRoZXRhU3F1YXJlZCA9IHNpblRoZXRhU3F1YXJlZCAqIHNpblRoZXRhU3F1YXJlZDsKICAgIGNvbnN0IHJhZGl1cyA9IGFiIC8gTWF0aC5zcXJ0KGJTcXIgKiBjb3NUaGV0YVNxdWFyZWQgKyBhU3FyICogc2luVGhldGFTcXVhcmVkKTsKICAgIGNvbnN0IGFuZ2xlID0gcmFkaXVzIC8gbWFnOwogICAgUXVhdGVybmlvbl9kZWZhdWx0LmZyb21BeGlzQW5nbGUocm90QXhpcywgYW5nbGUsIHVuaXRRdWF0KTsKICAgIE1hdHJpeDNfZGVmYXVsdC5mcm9tUXVhdGVybmlvbih1bml0UXVhdCwgcm90TXR4KTsKICAgIE1hdHJpeDNfZGVmYXVsdC5tdWx0aXBseUJ5VmVjdG9yKHJvdE10eCwgdW5pdFBvcywgcmVzdWx0KTsKICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUocmVzdWx0LCByZXN1bHQpOwogICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIocmVzdWx0LCBtYWcsIHJlc3VsdCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICB2YXIgRWxsaXBzZUdlb21ldHJ5TGlicmFyeSwgcm90QXhpcywgdGVtcFZlYywgdW5pdFF1YXQsIHJvdE10eCwgc2NyYXRjaENhcnRlc2lhbjEyLCBzY3JhdGNoQ2FydGVzaWFuMjMsIHNjcmF0Y2hDYXJ0ZXNpYW4zNCwgc2NyYXRjaE5vcm1hbDIsIHVuaXRQb3NTY3JhdGNoLCBlYXN0VmVjU2NyYXRjaCwgbm9ydGhWZWNTY3JhdGNoLCBFbGxpcHNlR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfRWxsaXBzZUdlb21ldHJ5TGlicmFyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvRWxsaXBzZUdlb21ldHJ5TGlicmFyeS5qcyIoKSB7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9NYXRyaXgzKCk7CiAgICAgIGluaXRfUXVhdGVybmlvbigpOwogICAgICBFbGxpcHNlR2VvbWV0cnlMaWJyYXJ5ID0ge307CiAgICAgIHJvdEF4aXMgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHRlbXBWZWMgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHVuaXRRdWF0ID0gbmV3IFF1YXRlcm5pb25fZGVmYXVsdCgpOwogICAgICByb3RNdHggPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4xMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaENhcnRlc2lhbjIzID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydGVzaWFuMzQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hOb3JtYWwyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBFbGxpcHNlR2VvbWV0cnlMaWJyYXJ5LnJhaXNlUG9zaXRpb25zVG9IZWlnaHQgPSBmdW5jdGlvbihwb3NpdGlvbnMsIG9wdGlvbnMsIGV4dHJ1ZGUpIHsKICAgICAgICBjb25zdCBlbGxpcHNvaWQgPSBvcHRpb25zLmVsbGlwc29pZDsKICAgICAgICBjb25zdCBoZWlnaHQgPSBvcHRpb25zLmhlaWdodDsKICAgICAgICBjb25zdCBleHRydWRlZEhlaWdodCA9IG9wdGlvbnMuZXh0cnVkZWRIZWlnaHQ7CiAgICAgICAgY29uc3Qgc2l6ZSA9IGV4dHJ1ZGUgPyBwb3NpdGlvbnMubGVuZ3RoIC8gMyAqIDIgOiBwb3NpdGlvbnMubGVuZ3RoIC8gMzsKICAgICAgICBjb25zdCBmaW5hbFBvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSAqIDMpOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgY29uc3QgYm90dG9tT2Zmc2V0ID0gZXh0cnVkZSA/IGxlbmd0aCA6IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMykgewogICAgICAgICAgY29uc3QgaTEgPSBpICsgMTsKICAgICAgICAgIGNvbnN0IGkyID0gaSArIDI7CiAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkocG9zaXRpb25zLCBpLCBzY3JhdGNoQ2FydGVzaWFuMTIpOwogICAgICAgICAgZWxsaXBzb2lkLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UocG9zaXRpb24sIHBvc2l0aW9uKTsKICAgICAgICAgIGNvbnN0IGV4dHJ1ZGVkUG9zaXRpb24gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUocG9zaXRpb24sIHNjcmF0Y2hDYXJ0ZXNpYW4yMyk7CiAgICAgICAgICBjb25zdCBub3JtYWwyID0gZWxsaXBzb2lkLmdlb2RldGljU3VyZmFjZU5vcm1hbChwb3NpdGlvbiwgc2NyYXRjaE5vcm1hbDIpOwogICAgICAgICAgY29uc3Qgc2NhbGVkTm9ybWFsID0gQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoCiAgICAgICAgICAgIG5vcm1hbDIsCiAgICAgICAgICAgIGhlaWdodCwKICAgICAgICAgICAgc2NyYXRjaENhcnRlc2lhbjM0CiAgICAgICAgICApOwogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChwb3NpdGlvbiwgc2NhbGVkTm9ybWFsLCBwb3NpdGlvbik7CiAgICAgICAgICBpZiAoZXh0cnVkZSkgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihub3JtYWwyLCBleHRydWRlZEhlaWdodCwgc2NhbGVkTm9ybWFsKTsKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChleHRydWRlZFBvc2l0aW9uLCBzY2FsZWROb3JtYWwsIGV4dHJ1ZGVkUG9zaXRpb24pOwogICAgICAgICAgICBmaW5hbFBvc2l0aW9uc1tpICsgYm90dG9tT2Zmc2V0XSA9IGV4dHJ1ZGVkUG9zaXRpb24ueDsKICAgICAgICAgICAgZmluYWxQb3NpdGlvbnNbaTEgKyBib3R0b21PZmZzZXRdID0gZXh0cnVkZWRQb3NpdGlvbi55OwogICAgICAgICAgICBmaW5hbFBvc2l0aW9uc1tpMiArIGJvdHRvbU9mZnNldF0gPSBleHRydWRlZFBvc2l0aW9uLno7CiAgICAgICAgICB9CiAgICAgICAgICBmaW5hbFBvc2l0aW9uc1tpXSA9IHBvc2l0aW9uLng7CiAgICAgICAgICBmaW5hbFBvc2l0aW9uc1tpMV0gPSBwb3NpdGlvbi55OwogICAgICAgICAgZmluYWxQb3NpdGlvbnNbaTJdID0gcG9zaXRpb24uejsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZpbmFsUG9zaXRpb25zOwogICAgICB9OwogICAgICB1bml0UG9zU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgZWFzdFZlY1NjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIG5vcnRoVmVjU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgRWxsaXBzZUdlb21ldHJ5TGlicmFyeS5jb21wdXRlRWxsaXBzZVBvc2l0aW9ucyA9IGZ1bmN0aW9uKG9wdGlvbnMsIGFkZEZpbGxQb3NpdGlvbnMsIGFkZEVkZ2VQb3NpdGlvbnMpIHsKICAgICAgICBjb25zdCBzZW1pTWlub3JBeGlzID0gb3B0aW9ucy5zZW1pTWlub3JBeGlzOwogICAgICAgIGNvbnN0IHNlbWlNYWpvckF4aXMgPSBvcHRpb25zLnNlbWlNYWpvckF4aXM7CiAgICAgICAgY29uc3Qgcm90YXRpb24gPSBvcHRpb25zLnJvdGF0aW9uOwogICAgICAgIGNvbnN0IGNlbnRlciA9IG9wdGlvbnMuY2VudGVyOwogICAgICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gb3B0aW9ucy5ncmFudWxhcml0eSAqIDg7CiAgICAgICAgY29uc3QgYVNxciA9IHNlbWlNaW5vckF4aXMgKiBzZW1pTWlub3JBeGlzOwogICAgICAgIGNvbnN0IGJTcXIgPSBzZW1pTWFqb3JBeGlzICogc2VtaU1ham9yQXhpczsKICAgICAgICBjb25zdCBhYiA9IHNlbWlNYWpvckF4aXMgKiBzZW1pTWlub3JBeGlzOwogICAgICAgIGNvbnN0IG1hZyA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUoY2VudGVyKTsKICAgICAgICBjb25zdCB1bml0UG9zID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShjZW50ZXIsIHVuaXRQb3NTY3JhdGNoKTsKICAgICAgICBsZXQgZWFzdFZlYyA9IENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9aLCBjZW50ZXIsIGVhc3RWZWNTY3JhdGNoKTsKICAgICAgICBlYXN0VmVjID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShlYXN0VmVjLCBlYXN0VmVjKTsKICAgICAgICBjb25zdCBub3J0aFZlYyA9IENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyh1bml0UG9zLCBlYXN0VmVjLCBub3J0aFZlY1NjcmF0Y2gpOwogICAgICAgIGxldCBudW1QdHMgPSAxICsgTWF0aC5jZWlsKE1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTyAvIGdyYW51bGFyaXR5KTsKICAgICAgICBjb25zdCBkZWx0YVRoZXRhID0gTWF0aF9kZWZhdWx0LlBJX09WRVJfVFdPIC8gKG51bVB0cyAtIDEpOwogICAgICAgIGxldCB0aGV0YSA9IE1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTyAtIG51bVB0cyAqIGRlbHRhVGhldGE7CiAgICAgICAgaWYgKHRoZXRhIDwgMCkgewogICAgICAgICAgbnVtUHRzIC09IE1hdGguY2VpbChNYXRoLmFicyh0aGV0YSkgLyBkZWx0YVRoZXRhKTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc2l6ZSA9IDIgKiAobnVtUHRzICogKG51bVB0cyArIDIpKTsKICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBhZGRGaWxsUG9zaXRpb25zID8gbmV3IEFycmF5KHNpemUgKiAzKSA6IHZvaWQgMDsKICAgICAgICBsZXQgcG9zaXRpb25JbmRleCA9IDA7CiAgICAgICAgbGV0IHBvc2l0aW9uID0gc2NyYXRjaENhcnRlc2lhbjEyOwogICAgICAgIGxldCByZWZsZWN0ZWRQb3NpdGlvbiA9IHNjcmF0Y2hDYXJ0ZXNpYW4yMzsKICAgICAgICBjb25zdCBvdXRlclBvc2l0aW9uc0xlbmd0aCA9IG51bVB0cyAqIDQgKiAzOwogICAgICAgIGxldCBvdXRlclJpZ2h0SW5kZXggPSBvdXRlclBvc2l0aW9uc0xlbmd0aCAtIDE7CiAgICAgICAgbGV0IG91dGVyTGVmdEluZGV4ID0gMDsKICAgICAgICBjb25zdCBvdXRlclBvc2l0aW9ucyA9IGFkZEVkZ2VQb3NpdGlvbnMgPyBuZXcgQXJyYXkob3V0ZXJQb3NpdGlvbnNMZW5ndGgpIDogdm9pZCAwOwogICAgICAgIGxldCBpOwogICAgICAgIGxldCBqOwogICAgICAgIGxldCBudW1JbnRlcmlvcjsKICAgICAgICBsZXQgdDsKICAgICAgICBsZXQgaW50ZXJpb3JQb3NpdGlvbjsKICAgICAgICB0aGV0YSA9IE1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTzsKICAgICAgICBwb3NpdGlvbiA9IHBvaW50T25FbGxpcHNvaWQoCiAgICAgICAgICB0aGV0YSwKICAgICAgICAgIHJvdGF0aW9uLAogICAgICAgICAgbm9ydGhWZWMsCiAgICAgICAgICBlYXN0VmVjLAogICAgICAgICAgYVNxciwKICAgICAgICAgIGFiLAogICAgICAgICAgYlNxciwKICAgICAgICAgIG1hZywKICAgICAgICAgIHVuaXRQb3MsCiAgICAgICAgICBwb3NpdGlvbgogICAgICAgICk7CiAgICAgICAgaWYgKGFkZEZpbGxQb3NpdGlvbnMpIHsKICAgICAgICAgIHBvc2l0aW9uc1twb3NpdGlvbkluZGV4KytdID0gcG9zaXRpb24ueDsKICAgICAgICAgIHBvc2l0aW9uc1twb3NpdGlvbkluZGV4KytdID0gcG9zaXRpb24ueTsKICAgICAgICAgIHBvc2l0aW9uc1twb3NpdGlvbkluZGV4KytdID0gcG9zaXRpb24uejsKICAgICAgICB9CiAgICAgICAgaWYgKGFkZEVkZ2VQb3NpdGlvbnMpIHsKICAgICAgICAgIG91dGVyUG9zaXRpb25zW291dGVyUmlnaHRJbmRleC0tXSA9IHBvc2l0aW9uLno7CiAgICAgICAgICBvdXRlclBvc2l0aW9uc1tvdXRlclJpZ2h0SW5kZXgtLV0gPSBwb3NpdGlvbi55OwogICAgICAgICAgb3V0ZXJQb3NpdGlvbnNbb3V0ZXJSaWdodEluZGV4LS1dID0gcG9zaXRpb24ueDsKICAgICAgICB9CiAgICAgICAgdGhldGEgPSBNYXRoX2RlZmF1bHQuUElfT1ZFUl9UV08gLSBkZWx0YVRoZXRhOwogICAgICAgIGZvciAoaSA9IDE7IGkgPCBudW1QdHMgKyAxOyArK2kpIHsKICAgICAgICAgIHBvc2l0aW9uID0gcG9pbnRPbkVsbGlwc29pZCgKICAgICAgICAgICAgdGhldGEsCiAgICAgICAgICAgIHJvdGF0aW9uLAogICAgICAgICAgICBub3J0aFZlYywKICAgICAgICAgICAgZWFzdFZlYywKICAgICAgICAgICAgYVNxciwKICAgICAgICAgICAgYWIsCiAgICAgICAgICAgIGJTcXIsCiAgICAgICAgICAgIG1hZywKICAgICAgICAgICAgdW5pdFBvcywKICAgICAgICAgICAgcG9zaXRpb24KICAgICAgICAgICk7CiAgICAgICAgICByZWZsZWN0ZWRQb3NpdGlvbiA9IHBvaW50T25FbGxpcHNvaWQoCiAgICAgICAgICAgIE1hdGguUEkgLSB0aGV0YSwKICAgICAgICAgICAgcm90YXRpb24sCiAgICAgICAgICAgIG5vcnRoVmVjLAogICAgICAgICAgICBlYXN0VmVjLAogICAgICAgICAgICBhU3FyLAogICAgICAgICAgICBhYiwKICAgICAgICAgICAgYlNxciwKICAgICAgICAgICAgbWFnLAogICAgICAgICAgICB1bml0UG9zLAogICAgICAgICAgICByZWZsZWN0ZWRQb3NpdGlvbgogICAgICAgICAgKTsKICAgICAgICAgIGlmIChhZGRGaWxsUG9zaXRpb25zKSB7CiAgICAgICAgICAgIHBvc2l0aW9uc1twb3NpdGlvbkluZGV4KytdID0gcG9zaXRpb24ueDsKICAgICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSBwb3NpdGlvbi55OwogICAgICAgICAgICBwb3NpdGlvbnNbcG9zaXRpb25JbmRleCsrXSA9IHBvc2l0aW9uLno7CiAgICAgICAgICAgIG51bUludGVyaW9yID0gMiAqIGkgKyAyOwogICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgbnVtSW50ZXJpb3IgLSAxOyArK2opIHsKICAgICAgICAgICAgICB0ID0gaiAvIChudW1JbnRlcmlvciAtIDEpOwogICAgICAgICAgICAgIGludGVyaW9yUG9zaXRpb24gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubGVycCgKICAgICAgICAgICAgICAgIHBvc2l0aW9uLAogICAgICAgICAgICAgICAgcmVmbGVjdGVkUG9zaXRpb24sCiAgICAgICAgICAgICAgICB0LAogICAgICAgICAgICAgICAgc2NyYXRjaENhcnRlc2lhbjM0CiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICBwb3NpdGlvbnNbcG9zaXRpb25JbmRleCsrXSA9IGludGVyaW9yUG9zaXRpb24ueDsKICAgICAgICAgICAgICBwb3NpdGlvbnNbcG9zaXRpb25JbmRleCsrXSA9IGludGVyaW9yUG9zaXRpb24ueTsKICAgICAgICAgICAgICBwb3NpdGlvbnNbcG9zaXRpb25JbmRleCsrXSA9IGludGVyaW9yUG9zaXRpb24uejsKICAgICAgICAgICAgfQogICAgICAgICAgICBwb3NpdGlvbnNbcG9zaXRpb25JbmRleCsrXSA9IHJlZmxlY3RlZFBvc2l0aW9uLng7CiAgICAgICAgICAgIHBvc2l0aW9uc1twb3NpdGlvbkluZGV4KytdID0gcmVmbGVjdGVkUG9zaXRpb24ueTsKICAgICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSByZWZsZWN0ZWRQb3NpdGlvbi56OwogICAgICAgICAgfQogICAgICAgICAgaWYgKGFkZEVkZ2VQb3NpdGlvbnMpIHsKICAgICAgICAgICAgb3V0ZXJQb3NpdGlvbnNbb3V0ZXJSaWdodEluZGV4LS1dID0gcG9zaXRpb24uejsKICAgICAgICAgICAgb3V0ZXJQb3NpdGlvbnNbb3V0ZXJSaWdodEluZGV4LS1dID0gcG9zaXRpb24ueTsKICAgICAgICAgICAgb3V0ZXJQb3NpdGlvbnNbb3V0ZXJSaWdodEluZGV4LS1dID0gcG9zaXRpb24ueDsKICAgICAgICAgICAgb3V0ZXJQb3NpdGlvbnNbb3V0ZXJMZWZ0SW5kZXgrK10gPSByZWZsZWN0ZWRQb3NpdGlvbi54OwogICAgICAgICAgICBvdXRlclBvc2l0aW9uc1tvdXRlckxlZnRJbmRleCsrXSA9IHJlZmxlY3RlZFBvc2l0aW9uLnk7CiAgICAgICAgICAgIG91dGVyUG9zaXRpb25zW291dGVyTGVmdEluZGV4KytdID0gcmVmbGVjdGVkUG9zaXRpb24uejsKICAgICAgICAgIH0KICAgICAgICAgIHRoZXRhID0gTWF0aF9kZWZhdWx0LlBJX09WRVJfVFdPIC0gKGkgKyAxKSAqIGRlbHRhVGhldGE7CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IG51bVB0czsgaSA+IDE7IC0taSkgewogICAgICAgICAgdGhldGEgPSBNYXRoX2RlZmF1bHQuUElfT1ZFUl9UV08gLSAoaSAtIDEpICogZGVsdGFUaGV0YTsKICAgICAgICAgIHBvc2l0aW9uID0gcG9pbnRPbkVsbGlwc29pZCgKICAgICAgICAgICAgLXRoZXRhLAogICAgICAgICAgICByb3RhdGlvbiwKICAgICAgICAgICAgbm9ydGhWZWMsCiAgICAgICAgICAgIGVhc3RWZWMsCiAgICAgICAgICAgIGFTcXIsCiAgICAgICAgICAgIGFiLAogICAgICAgICAgICBiU3FyLAogICAgICAgICAgICBtYWcsCiAgICAgICAgICAgIHVuaXRQb3MsCiAgICAgICAgICAgIHBvc2l0aW9uCiAgICAgICAgICApOwogICAgICAgICAgcmVmbGVjdGVkUG9zaXRpb24gPSBwb2ludE9uRWxsaXBzb2lkKAogICAgICAgICAgICB0aGV0YSArIE1hdGguUEksCiAgICAgICAgICAgIHJvdGF0aW9uLAogICAgICAgICAgICBub3J0aFZlYywKICAgICAgICAgICAgZWFzdFZlYywKICAgICAgICAgICAgYVNxciwKICAgICAgICAgICAgYWIsCiAgICAgICAgICAgIGJTcXIsCiAgICAgICAgICAgIG1hZywKICAgICAgICAgICAgdW5pdFBvcywKICAgICAgICAgICAgcmVmbGVjdGVkUG9zaXRpb24KICAgICAgICAgICk7CiAgICAgICAgICBpZiAoYWRkRmlsbFBvc2l0aW9ucykgewogICAgICAgICAgICBwb3NpdGlvbnNbcG9zaXRpb25JbmRleCsrXSA9IHBvc2l0aW9uLng7CiAgICAgICAgICAgIHBvc2l0aW9uc1twb3NpdGlvbkluZGV4KytdID0gcG9zaXRpb24ueTsKICAgICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSBwb3NpdGlvbi56OwogICAgICAgICAgICBudW1JbnRlcmlvciA9IDIgKiAoaSAtIDEpICsgMjsKICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IG51bUludGVyaW9yIC0gMTsgKytqKSB7CiAgICAgICAgICAgICAgdCA9IGogLyAobnVtSW50ZXJpb3IgLSAxKTsKICAgICAgICAgICAgICBpbnRlcmlvclBvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LmxlcnAoCiAgICAgICAgICAgICAgICBwb3NpdGlvbiwKICAgICAgICAgICAgICAgIHJlZmxlY3RlZFBvc2l0aW9uLAogICAgICAgICAgICAgICAgdCwKICAgICAgICAgICAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zNAogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSBpbnRlcmlvclBvc2l0aW9uLng7CiAgICAgICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSBpbnRlcmlvclBvc2l0aW9uLnk7CiAgICAgICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSBpbnRlcmlvclBvc2l0aW9uLno7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSByZWZsZWN0ZWRQb3NpdGlvbi54OwogICAgICAgICAgICBwb3NpdGlvbnNbcG9zaXRpb25JbmRleCsrXSA9IHJlZmxlY3RlZFBvc2l0aW9uLnk7CiAgICAgICAgICAgIHBvc2l0aW9uc1twb3NpdGlvbkluZGV4KytdID0gcmVmbGVjdGVkUG9zaXRpb24uejsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChhZGRFZGdlUG9zaXRpb25zKSB7CiAgICAgICAgICAgIG91dGVyUG9zaXRpb25zW291dGVyUmlnaHRJbmRleC0tXSA9IHBvc2l0aW9uLno7CiAgICAgICAgICAgIG91dGVyUG9zaXRpb25zW291dGVyUmlnaHRJbmRleC0tXSA9IHBvc2l0aW9uLnk7CiAgICAgICAgICAgIG91dGVyUG9zaXRpb25zW291dGVyUmlnaHRJbmRleC0tXSA9IHBvc2l0aW9uLng7CiAgICAgICAgICAgIG91dGVyUG9zaXRpb25zW291dGVyTGVmdEluZGV4KytdID0gcmVmbGVjdGVkUG9zaXRpb24ueDsKICAgICAgICAgICAgb3V0ZXJQb3NpdGlvbnNbb3V0ZXJMZWZ0SW5kZXgrK10gPSByZWZsZWN0ZWRQb3NpdGlvbi55OwogICAgICAgICAgICBvdXRlclBvc2l0aW9uc1tvdXRlckxlZnRJbmRleCsrXSA9IHJlZmxlY3RlZFBvc2l0aW9uLno7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoZXRhID0gTWF0aF9kZWZhdWx0LlBJX09WRVJfVFdPOwogICAgICAgIHBvc2l0aW9uID0gcG9pbnRPbkVsbGlwc29pZCgKICAgICAgICAgIC10aGV0YSwKICAgICAgICAgIHJvdGF0aW9uLAogICAgICAgICAgbm9ydGhWZWMsCiAgICAgICAgICBlYXN0VmVjLAogICAgICAgICAgYVNxciwKICAgICAgICAgIGFiLAogICAgICAgICAgYlNxciwKICAgICAgICAgIG1hZywKICAgICAgICAgIHVuaXRQb3MsCiAgICAgICAgICBwb3NpdGlvbgogICAgICAgICk7CiAgICAgICAgY29uc3QgciA9IHt9OwogICAgICAgIGlmIChhZGRGaWxsUG9zaXRpb25zKSB7CiAgICAgICAgICBwb3NpdGlvbnNbcG9zaXRpb25JbmRleCsrXSA9IHBvc2l0aW9uLng7CiAgICAgICAgICBwb3NpdGlvbnNbcG9zaXRpb25JbmRleCsrXSA9IHBvc2l0aW9uLnk7CiAgICAgICAgICBwb3NpdGlvbnNbcG9zaXRpb25JbmRleCsrXSA9IHBvc2l0aW9uLno7CiAgICAgICAgICByLnBvc2l0aW9ucyA9IHBvc2l0aW9uczsKICAgICAgICAgIHIubnVtUHRzID0gbnVtUHRzOwogICAgICAgIH0KICAgICAgICBpZiAoYWRkRWRnZVBvc2l0aW9ucykgewogICAgICAgICAgb3V0ZXJQb3NpdGlvbnNbb3V0ZXJSaWdodEluZGV4LS1dID0gcG9zaXRpb24uejsKICAgICAgICAgIG91dGVyUG9zaXRpb25zW291dGVyUmlnaHRJbmRleC0tXSA9IHBvc2l0aW9uLnk7CiAgICAgICAgICBvdXRlclBvc2l0aW9uc1tvdXRlclJpZ2h0SW5kZXgtLV0gPSBwb3NpdGlvbi54OwogICAgICAgICAgci5vdXRlclBvc2l0aW9ucyA9IG91dGVyUG9zaXRpb25zOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcjsKICAgICAgfTsKICAgICAgRWxsaXBzZUdlb21ldHJ5TGlicmFyeV9kZWZhdWx0ID0gRWxsaXBzZUdlb21ldHJ5TGlicmFyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0dlb21ldHJ5SW5zdGFuY2UuanMKICBmdW5jdGlvbiBHZW9tZXRyeUluc3RhbmNlKG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KG9wdGlvbnMuZ2VvbWV0cnkpKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJvcHRpb25zLmdlb21ldHJ5IGlzIHJlcXVpcmVkLiIpOwogICAgfQogICAgdGhpcy5nZW9tZXRyeSA9IG9wdGlvbnMuZ2VvbWV0cnk7CiAgICB0aGlzLm1vZGVsTWF0cml4ID0gTWF0cml4NF9kZWZhdWx0LmNsb25lKG9wdGlvbnMubW9kZWxNYXRyaXggPz8gTWF0cml4NF9kZWZhdWx0LklERU5USVRZKTsKICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkOwogICAgdGhpcy5waWNrUHJpbWl0aXZlID0gb3B0aW9ucy5waWNrUHJpbWl0aXZlOwogICAgdGhpcy5hdHRyaWJ1dGVzID0gb3B0aW9ucy5hdHRyaWJ1dGVzID8/IHt9OwogICAgdGhpcy53ZXN0SGVtaXNwaGVyZUdlb21ldHJ5ID0gdm9pZCAwOwogICAgdGhpcy5lYXN0SGVtaXNwaGVyZUdlb21ldHJ5ID0gdm9pZCAwOwogIH0KICB2YXIgR2VvbWV0cnlJbnN0YW5jZV9kZWZhdWx0OwogIHZhciBpbml0X0dlb21ldHJ5SW5zdGFuY2UgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0dlb21ldHJ5SW5zdGFuY2UuanMiKCkgewogICAgICBpbml0X0Zyb3plbigpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X01hdHJpeDQoKTsKICAgICAgR2VvbWV0cnlJbnN0YW5jZV9kZWZhdWx0ID0gR2VvbWV0cnlJbnN0YW5jZTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0VsbGlwc2VHZW9tZXRyeS5qcwogIGZ1bmN0aW9uIGNvbXB1dGVUb3BCb3R0b21BdHRyaWJ1dGVzKHBvc2l0aW9ucywgb3B0aW9ucywgZXh0cnVkZSkgewogICAgY29uc3QgdmVydGV4Rm9ybWF0ID0gb3B0aW9ucy52ZXJ0ZXhGb3JtYXQ7CiAgICBjb25zdCBjZW50ZXIgPSBvcHRpb25zLmNlbnRlcjsKICAgIGNvbnN0IHNlbWlNYWpvckF4aXMgPSBvcHRpb25zLnNlbWlNYWpvckF4aXM7CiAgICBjb25zdCBzZW1pTWlub3JBeGlzID0gb3B0aW9ucy5zZW1pTWlub3JBeGlzOwogICAgY29uc3QgZWxsaXBzb2lkID0gb3B0aW9ucy5lbGxpcHNvaWQ7CiAgICBjb25zdCBzdFJvdGF0aW9uID0gb3B0aW9ucy5zdFJvdGF0aW9uOwogICAgY29uc3Qgc2l6ZSA9IGV4dHJ1ZGUgPyBwb3NpdGlvbnMubGVuZ3RoIC8gMyAqIDIgOiBwb3NpdGlvbnMubGVuZ3RoIC8gMzsKICAgIGNvbnN0IHNoYWRvd1ZvbHVtZSA9IG9wdGlvbnMuc2hhZG93Vm9sdW1lOwogICAgY29uc3QgdGV4dHVyZUNvb3JkaW5hdGVzID0gdmVydGV4Rm9ybWF0LnN0ID8gbmV3IEZsb2F0MzJBcnJheShzaXplICogMikgOiB2b2lkIDA7CiAgICBjb25zdCBub3JtYWxzID0gdmVydGV4Rm9ybWF0Lm5vcm1hbCA/IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSAqIDMpIDogdm9pZCAwOwogICAgY29uc3QgdGFuZ2VudHMgPSB2ZXJ0ZXhGb3JtYXQudGFuZ2VudCA/IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSAqIDMpIDogdm9pZCAwOwogICAgY29uc3QgYml0YW5nZW50cyA9IHZlcnRleEZvcm1hdC5iaXRhbmdlbnQgPyBuZXcgRmxvYXQzMkFycmF5KHNpemUgKiAzKSA6IHZvaWQgMDsKICAgIGNvbnN0IGV4dHJ1ZGVOb3JtYWxzID0gc2hhZG93Vm9sdW1lID8gbmV3IEZsb2F0MzJBcnJheShzaXplICogMykgOiB2b2lkIDA7CiAgICBsZXQgdGV4dHVyZUNvb3JkSW5kZXggPSAwOwogICAgbGV0IG5vcm1hbDIgPSBzY3JhdGNoTm9ybWFsMzsKICAgIGxldCB0YW5nZW50ID0gc2NyYXRjaFRhbmdlbnQ7CiAgICBsZXQgYml0YW5nZW50ID0gc2NyYXRjaEJpdGFuZ2VudDsKICAgIGNvbnN0IHByb2plY3Rpb24gPSBuZXcgR2VvZ3JhcGhpY1Byb2plY3Rpb25fZGVmYXVsdChlbGxpcHNvaWQpOwogICAgY29uc3QgcHJvamVjdGVkQ2VudGVyID0gcHJvamVjdGlvbi5wcm9qZWN0KAogICAgICBlbGxpcHNvaWQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoY2VudGVyLCBzY3JhdGNoQ2FydG9ncmFwaGljMiksCiAgICAgIHByb2plY3RlZENlbnRlclNjcmF0Y2gKICAgICk7CiAgICBjb25zdCBnZW9kZXRpY05vcm1hbCA9IGVsbGlwc29pZC5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKAogICAgICBjZW50ZXIsCiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4xMwogICAgKTsKICAgIGVsbGlwc29pZC5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoZ2VvZGV0aWNOb3JtYWwsIGdlb2RldGljTm9ybWFsKTsKICAgIGxldCB0ZXh0dXJlTWF0cml4ID0gdGV4dHVyZU1hdHJpeFNjcmF0Y2g7CiAgICBsZXQgdGFuZ2VudE1hdHJpeCA9IHRhbmdlbnRNYXRyaXhTY3JhdGNoOwogICAgaWYgKHN0Um90YXRpb24gIT09IDApIHsKICAgICAgbGV0IHJvdGF0aW9uID0gUXVhdGVybmlvbl9kZWZhdWx0LmZyb21BeGlzQW5nbGUoCiAgICAgICAgZ2VvZGV0aWNOb3JtYWwsCiAgICAgICAgc3RSb3RhdGlvbiwKICAgICAgICBxdWF0ZXJuaW9uU2NyYXRjaAogICAgICApOwogICAgICB0ZXh0dXJlTWF0cml4ID0gTWF0cml4M19kZWZhdWx0LmZyb21RdWF0ZXJuaW9uKHJvdGF0aW9uLCB0ZXh0dXJlTWF0cml4KTsKICAgICAgcm90YXRpb24gPSBRdWF0ZXJuaW9uX2RlZmF1bHQuZnJvbUF4aXNBbmdsZSgKICAgICAgICBnZW9kZXRpY05vcm1hbCwKICAgICAgICAtc3RSb3RhdGlvbiwKICAgICAgICBxdWF0ZXJuaW9uU2NyYXRjaAogICAgICApOwogICAgICB0YW5nZW50TWF0cml4ID0gTWF0cml4M19kZWZhdWx0LmZyb21RdWF0ZXJuaW9uKHJvdGF0aW9uLCB0YW5nZW50TWF0cml4KTsKICAgIH0gZWxzZSB7CiAgICAgIHRleHR1cmVNYXRyaXggPSBNYXRyaXgzX2RlZmF1bHQuY2xvbmUoTWF0cml4M19kZWZhdWx0LklERU5USVRZLCB0ZXh0dXJlTWF0cml4KTsKICAgICAgdGFuZ2VudE1hdHJpeCA9IE1hdHJpeDNfZGVmYXVsdC5jbG9uZShNYXRyaXgzX2RlZmF1bHQuSURFTlRJVFksIHRhbmdlbnRNYXRyaXgpOwogICAgfQogICAgY29uc3QgbWluVGV4Q29vcmQgPSBDYXJ0ZXNpYW4yX2RlZmF1bHQuZnJvbUVsZW1lbnRzKAogICAgICBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksCiAgICAgIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwKICAgICAgc2NyYXRjaE1pblRleENvb3JkCiAgICApOwogICAgY29uc3QgbWF4VGV4Q29vcmQgPSBDYXJ0ZXNpYW4yX2RlZmF1bHQuZnJvbUVsZW1lbnRzKAogICAgICBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksCiAgICAgIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSwKICAgICAgc2NyYXRjaE1heFRleENvb3JkCiAgICApOwogICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICBjb25zdCBib3R0b21PZmZzZXQgPSBleHRydWRlID8gbGVuZ3RoIDogMDsKICAgIGNvbnN0IHN0T2Zmc2V0ID0gYm90dG9tT2Zmc2V0IC8gMyAqIDI7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAzKSB7CiAgICAgIGNvbnN0IGkxID0gaSArIDE7CiAgICAgIGNvbnN0IGkyID0gaSArIDI7CiAgICAgIGNvbnN0IHBvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShwb3NpdGlvbnMsIGksIHNjcmF0Y2hDYXJ0ZXNpYW4xMyk7CiAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuc3QpIHsKICAgICAgICBjb25zdCByb3RhdGVkUG9pbnQgPSBNYXRyaXgzX2RlZmF1bHQubXVsdGlwbHlCeVZlY3RvcigKICAgICAgICAgIHRleHR1cmVNYXRyaXgsCiAgICAgICAgICBwb3NpdGlvbiwKICAgICAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4yNAogICAgICAgICk7CiAgICAgICAgY29uc3QgcHJvamVjdGVkUG9pbnQgPSBwcm9qZWN0aW9uLnByb2plY3QoCiAgICAgICAgICBlbGxpcHNvaWQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMocm90YXRlZFBvaW50LCBzY3JhdGNoQ2FydG9ncmFwaGljMiksCiAgICAgICAgICBzY3JhdGNoQ2FydGVzaWFuMzUKICAgICAgICApOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChwcm9qZWN0ZWRQb2ludCwgcHJvamVjdGVkQ2VudGVyLCBwcm9qZWN0ZWRQb2ludCk7CiAgICAgICAgdGV4Q29vcmRTY3JhdGNoLnggPSAocHJvamVjdGVkUG9pbnQueCArIHNlbWlNYWpvckF4aXMpIC8gKDIgKiBzZW1pTWFqb3JBeGlzKTsKICAgICAgICB0ZXhDb29yZFNjcmF0Y2gueSA9IChwcm9qZWN0ZWRQb2ludC55ICsgc2VtaU1pbm9yQXhpcykgLyAoMiAqIHNlbWlNaW5vckF4aXMpOwogICAgICAgIG1pblRleENvb3JkLnggPSBNYXRoLm1pbih0ZXhDb29yZFNjcmF0Y2gueCwgbWluVGV4Q29vcmQueCk7CiAgICAgICAgbWluVGV4Q29vcmQueSA9IE1hdGgubWluKHRleENvb3JkU2NyYXRjaC55LCBtaW5UZXhDb29yZC55KTsKICAgICAgICBtYXhUZXhDb29yZC54ID0gTWF0aC5tYXgodGV4Q29vcmRTY3JhdGNoLngsIG1heFRleENvb3JkLngpOwogICAgICAgIG1heFRleENvb3JkLnkgPSBNYXRoLm1heCh0ZXhDb29yZFNjcmF0Y2gueSwgbWF4VGV4Q29vcmQueSk7CiAgICAgICAgaWYgKGV4dHJ1ZGUpIHsKICAgICAgICAgIHRleHR1cmVDb29yZGluYXRlc1t0ZXh0dXJlQ29vcmRJbmRleCArIHN0T2Zmc2V0XSA9IHRleENvb3JkU2NyYXRjaC54OwogICAgICAgICAgdGV4dHVyZUNvb3JkaW5hdGVzW3RleHR1cmVDb29yZEluZGV4ICsgMSArIHN0T2Zmc2V0XSA9IHRleENvb3JkU2NyYXRjaC55OwogICAgICAgIH0KICAgICAgICB0ZXh0dXJlQ29vcmRpbmF0ZXNbdGV4dHVyZUNvb3JkSW5kZXgrK10gPSB0ZXhDb29yZFNjcmF0Y2gueDsKICAgICAgICB0ZXh0dXJlQ29vcmRpbmF0ZXNbdGV4dHVyZUNvb3JkSW5kZXgrK10gPSB0ZXhDb29yZFNjcmF0Y2gueTsKICAgICAgfQogICAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCB8fCB2ZXJ0ZXhGb3JtYXQudGFuZ2VudCB8fCB2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50IHx8IHNoYWRvd1ZvbHVtZSkgewogICAgICAgIG5vcm1hbDIgPSBlbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKHBvc2l0aW9uLCBub3JtYWwyKTsKICAgICAgICBpZiAoc2hhZG93Vm9sdW1lKSB7CiAgICAgICAgICBleHRydWRlTm9ybWFsc1tpICsgYm90dG9tT2Zmc2V0XSA9IC1ub3JtYWwyLng7CiAgICAgICAgICBleHRydWRlTm9ybWFsc1tpMSArIGJvdHRvbU9mZnNldF0gPSAtbm9ybWFsMi55OwogICAgICAgICAgZXh0cnVkZU5vcm1hbHNbaTIgKyBib3R0b21PZmZzZXRdID0gLW5vcm1hbDIuejsKICAgICAgICB9CiAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5ub3JtYWwgfHwgdmVydGV4Rm9ybWF0LnRhbmdlbnQgfHwgdmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgewogICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC50YW5nZW50IHx8IHZlcnRleEZvcm1hdC5iaXRhbmdlbnQpIHsKICAgICAgICAgICAgdGFuZ2VudCA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoCiAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKENhcnRlc2lhbjNfZGVmYXVsdC5VTklUX1osIG5vcm1hbDIsIHRhbmdlbnQpLAogICAgICAgICAgICAgIHRhbmdlbnQKICAgICAgICAgICAgKTsKICAgICAgICAgICAgTWF0cml4M19kZWZhdWx0Lm11bHRpcGx5QnlWZWN0b3IodGFuZ2VudE1hdHJpeCwgdGFuZ2VudCwgdGFuZ2VudCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCkgewogICAgICAgICAgICBub3JtYWxzW2ldID0gbm9ybWFsMi54OwogICAgICAgICAgICBub3JtYWxzW2kxXSA9IG5vcm1hbDIueTsKICAgICAgICAgICAgbm9ybWFsc1tpMl0gPSBub3JtYWwyLno7CiAgICAgICAgICAgIGlmIChleHRydWRlKSB7CiAgICAgICAgICAgICAgbm9ybWFsc1tpICsgYm90dG9tT2Zmc2V0XSA9IC1ub3JtYWwyLng7CiAgICAgICAgICAgICAgbm9ybWFsc1tpMSArIGJvdHRvbU9mZnNldF0gPSAtbm9ybWFsMi55OwogICAgICAgICAgICAgIG5vcm1hbHNbaTIgKyBib3R0b21PZmZzZXRdID0gLW5vcm1hbDIuejsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC50YW5nZW50KSB7CiAgICAgICAgICAgIHRhbmdlbnRzW2ldID0gdGFuZ2VudC54OwogICAgICAgICAgICB0YW5nZW50c1tpMV0gPSB0YW5nZW50Lnk7CiAgICAgICAgICAgIHRhbmdlbnRzW2kyXSA9IHRhbmdlbnQuejsKICAgICAgICAgICAgaWYgKGV4dHJ1ZGUpIHsKICAgICAgICAgICAgICB0YW5nZW50c1tpICsgYm90dG9tT2Zmc2V0XSA9IC10YW5nZW50Lng7CiAgICAgICAgICAgICAgdGFuZ2VudHNbaTEgKyBib3R0b21PZmZzZXRdID0gLXRhbmdlbnQueTsKICAgICAgICAgICAgICB0YW5nZW50c1tpMiArIGJvdHRvbU9mZnNldF0gPSAtdGFuZ2VudC56OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgewogICAgICAgICAgICBiaXRhbmdlbnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKAogICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhub3JtYWwyLCB0YW5nZW50LCBiaXRhbmdlbnQpLAogICAgICAgICAgICAgIGJpdGFuZ2VudAogICAgICAgICAgICApOwogICAgICAgICAgICBiaXRhbmdlbnRzW2ldID0gYml0YW5nZW50Lng7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbaTFdID0gYml0YW5nZW50Lnk7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbaTJdID0gYml0YW5nZW50Lno7CiAgICAgICAgICAgIGlmIChleHRydWRlKSB7CiAgICAgICAgICAgICAgYml0YW5nZW50c1tpICsgYm90dG9tT2Zmc2V0XSA9IGJpdGFuZ2VudC54OwogICAgICAgICAgICAgIGJpdGFuZ2VudHNbaTEgKyBib3R0b21PZmZzZXRdID0gYml0YW5nZW50Lnk7CiAgICAgICAgICAgICAgYml0YW5nZW50c1tpMiArIGJvdHRvbU9mZnNldF0gPSBiaXRhbmdlbnQuejsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKHZlcnRleEZvcm1hdC5zdCkgewogICAgICBsZW5ndGggPSB0ZXh0dXJlQ29vcmRpbmF0ZXMubGVuZ3RoOwogICAgICBmb3IgKGxldCBrID0gMDsgayA8IGxlbmd0aDsgayArPSAyKSB7CiAgICAgICAgdGV4dHVyZUNvb3JkaW5hdGVzW2tdID0gKHRleHR1cmVDb29yZGluYXRlc1trXSAtIG1pblRleENvb3JkLngpIC8gKG1heFRleENvb3JkLnggLSBtaW5UZXhDb29yZC54KTsKICAgICAgICB0ZXh0dXJlQ29vcmRpbmF0ZXNbayArIDFdID0gKHRleHR1cmVDb29yZGluYXRlc1trICsgMV0gLSBtaW5UZXhDb29yZC55KSAvIChtYXhUZXhDb29yZC55IC0gbWluVGV4Q29vcmQueSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVzX2RlZmF1bHQoKTsKICAgIGlmICh2ZXJ0ZXhGb3JtYXQucG9zaXRpb24pIHsKICAgICAgY29uc3QgZmluYWxQb3NpdGlvbnMgPSBFbGxpcHNlR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQucmFpc2VQb3NpdGlvbnNUb0hlaWdodCgKICAgICAgICBwb3NpdGlvbnMsCiAgICAgICAgb3B0aW9ucywKICAgICAgICBleHRydWRlCiAgICAgICk7CiAgICAgIGF0dHJpYnV0ZXMucG9zaXRpb24gPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRE9VQkxFLAogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgdmFsdWVzOiBmaW5hbFBvc2l0aW9ucwogICAgICB9KTsKICAgIH0KICAgIGlmICh2ZXJ0ZXhGb3JtYXQuc3QpIHsKICAgICAgYXR0cmlidXRlcy5zdCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5GTE9BVCwKICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAyLAogICAgICAgIHZhbHVlczogdGV4dHVyZUNvb3JkaW5hdGVzCiAgICAgIH0pOwogICAgfQogICAgaWYgKHZlcnRleEZvcm1hdC5ub3JtYWwpIHsKICAgICAgYXR0cmlidXRlcy5ub3JtYWwgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICB2YWx1ZXM6IG5vcm1hbHMKICAgICAgfSk7CiAgICB9CiAgICBpZiAodmVydGV4Rm9ybWF0LnRhbmdlbnQpIHsKICAgICAgYXR0cmlidXRlcy50YW5nZW50ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgdmFsdWVzOiB0YW5nZW50cwogICAgICB9KTsKICAgIH0KICAgIGlmICh2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgIGF0dHJpYnV0ZXMuYml0YW5nZW50ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgdmFsdWVzOiBiaXRhbmdlbnRzCiAgICAgIH0pOwogICAgfQogICAgaWYgKHNoYWRvd1ZvbHVtZSkgewogICAgICBhdHRyaWJ1dGVzLmV4dHJ1ZGVEaXJlY3Rpb24gPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICB2YWx1ZXM6IGV4dHJ1ZGVOb3JtYWxzCiAgICAgIH0pOwogICAgfQogICAgaWYgKGV4dHJ1ZGUgJiYgZGVmaW5lZF9kZWZhdWx0KG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlKSkgewogICAgICBsZXQgb2Zmc2V0QXR0cmlidXRlID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7CiAgICAgIGlmIChvcHRpb25zLm9mZnNldEF0dHJpYnV0ZSA9PT0gR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGVfZGVmYXVsdC5UT1ApIHsKICAgICAgICBvZmZzZXRBdHRyaWJ1dGUgPSBvZmZzZXRBdHRyaWJ1dGUuZmlsbCgxLCAwLCBzaXplIC8gMik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3Qgb2Zmc2V0VmFsdWUgPSBvcHRpb25zLm9mZnNldEF0dHJpYnV0ZSA9PT0gR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGVfZGVmYXVsdC5OT05FID8gMCA6IDE7CiAgICAgICAgb2Zmc2V0QXR0cmlidXRlID0gb2Zmc2V0QXR0cmlidXRlLmZpbGwob2Zmc2V0VmFsdWUpOwogICAgICB9CiAgICAgIGF0dHJpYnV0ZXMuYXBwbHlPZmZzZXQgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuVU5TSUdORURfQllURSwKICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAxLAogICAgICAgIHZhbHVlczogb2Zmc2V0QXR0cmlidXRlCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIGF0dHJpYnV0ZXM7CiAgfQogIGZ1bmN0aW9uIHRvcEluZGljZXMobnVtUHRzKSB7CiAgICBjb25zdCBpbmRpY2VzID0gbmV3IEFycmF5KDEyICogKG51bVB0cyAqIChudW1QdHMgKyAxKSkgLSA2KTsKICAgIGxldCBpbmRpY2VzSW5kZXggPSAwOwogICAgbGV0IHByZXZJbmRleDsKICAgIGxldCBudW1JbnRlcmlvcjsKICAgIGxldCBwb3NpdGlvbkluZGV4OwogICAgbGV0IGk7CiAgICBsZXQgajsKICAgIHByZXZJbmRleCA9IDA7CiAgICBwb3NpdGlvbkluZGV4ID0gMTsKICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwb3NpdGlvbkluZGV4Kys7CiAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcHJldkluZGV4OwogICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IHBvc2l0aW9uSW5kZXg7CiAgICB9CiAgICBmb3IgKGkgPSAyOyBpIDwgbnVtUHRzICsgMTsgKytpKSB7CiAgICAgIHBvc2l0aW9uSW5kZXggPSBpICogKGkgKyAxKSAtIDE7CiAgICAgIHByZXZJbmRleCA9IChpIC0gMSkgKiBpIC0gMTsKICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwb3NpdGlvbkluZGV4Kys7CiAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcHJldkluZGV4OwogICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IHBvc2l0aW9uSW5kZXg7CiAgICAgIG51bUludGVyaW9yID0gMiAqIGk7CiAgICAgIGZvciAoaiA9IDA7IGogPCBudW1JbnRlcmlvciAtIDE7ICsraikgewogICAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcG9zaXRpb25JbmRleDsKICAgICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IHByZXZJbmRleCsrOwogICAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcHJldkluZGV4OwogICAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcG9zaXRpb25JbmRleCsrOwogICAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcHJldkluZGV4OwogICAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcG9zaXRpb25JbmRleDsKICAgICAgfQogICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IHBvc2l0aW9uSW5kZXgrKzsKICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwcmV2SW5kZXg7CiAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcG9zaXRpb25JbmRleDsKICAgIH0KICAgIG51bUludGVyaW9yID0gbnVtUHRzICogMjsKICAgICsrcG9zaXRpb25JbmRleDsKICAgICsrcHJldkluZGV4OwogICAgZm9yIChpID0gMDsgaSA8IG51bUludGVyaW9yIC0gMTsgKytpKSB7CiAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcG9zaXRpb25JbmRleDsKICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwcmV2SW5kZXgrKzsKICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwcmV2SW5kZXg7CiAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcG9zaXRpb25JbmRleCsrOwogICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IHByZXZJbmRleDsKICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwb3NpdGlvbkluZGV4OwogICAgfQogICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwb3NpdGlvbkluZGV4OwogICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwcmV2SW5kZXgrKzsKICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcHJldkluZGV4OwogICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwb3NpdGlvbkluZGV4Kys7CiAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IHByZXZJbmRleCsrOwogICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwcmV2SW5kZXg7CiAgICArK3ByZXZJbmRleDsKICAgIGZvciAoaSA9IG51bVB0cyAtIDE7IGkgPiAxOyAtLWkpIHsKICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwcmV2SW5kZXgrKzsKICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwcmV2SW5kZXg7CiAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcG9zaXRpb25JbmRleDsKICAgICAgbnVtSW50ZXJpb3IgPSAyICogaTsKICAgICAgZm9yIChqID0gMDsgaiA8IG51bUludGVyaW9yIC0gMTsgKytqKSB7CiAgICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwb3NpdGlvbkluZGV4OwogICAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcHJldkluZGV4Kys7CiAgICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwcmV2SW5kZXg7CiAgICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwb3NpdGlvbkluZGV4Kys7CiAgICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwcmV2SW5kZXg7CiAgICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwb3NpdGlvbkluZGV4OwogICAgICB9CiAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcHJldkluZGV4Kys7CiAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcHJldkluZGV4Kys7CiAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcG9zaXRpb25JbmRleCsrOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IHByZXZJbmRleCsrOwogICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IHByZXZJbmRleDsKICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBwb3NpdGlvbkluZGV4OwogICAgfQogICAgcmV0dXJuIGluZGljZXM7CiAgfQogIGZ1bmN0aW9uIGNvbXB1dGVFbGxpcHNlKG9wdGlvbnMpIHsKICAgIGNvbnN0IGNlbnRlciA9IG9wdGlvbnMuY2VudGVyOwogICAgYm91bmRpbmdTcGhlcmVDZW50ZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcigKICAgICAgb3B0aW9ucy5lbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGNlbnRlciwgYm91bmRpbmdTcGhlcmVDZW50ZXIpLAogICAgICBvcHRpb25zLmhlaWdodCwKICAgICAgYm91bmRpbmdTcGhlcmVDZW50ZXIKICAgICk7CiAgICBib3VuZGluZ1NwaGVyZUNlbnRlciA9IENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoCiAgICAgIGNlbnRlciwKICAgICAgYm91bmRpbmdTcGhlcmVDZW50ZXIsCiAgICAgIGJvdW5kaW5nU3BoZXJlQ2VudGVyCiAgICApOwogICAgY29uc3QgYm91bmRpbmdTcGhlcmUgPSBuZXcgQm91bmRpbmdTcGhlcmVfZGVmYXVsdCgKICAgICAgYm91bmRpbmdTcGhlcmVDZW50ZXIsCiAgICAgIG9wdGlvbnMuc2VtaU1ham9yQXhpcwogICAgKTsKICAgIGNvbnN0IGNlcCA9IEVsbGlwc2VHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5jb21wdXRlRWxsaXBzZVBvc2l0aW9ucygKICAgICAgb3B0aW9ucywKICAgICAgdHJ1ZSwKICAgICAgZmFsc2UKICAgICk7CiAgICBjb25zdCBwb3NpdGlvbnMgPSBjZXAucG9zaXRpb25zOwogICAgY29uc3QgbnVtUHRzID0gY2VwLm51bVB0czsKICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBjb21wdXRlVG9wQm90dG9tQXR0cmlidXRlcyhwb3NpdGlvbnMsIG9wdGlvbnMsIGZhbHNlKTsKICAgIGxldCBpbmRpY2VzID0gdG9wSW5kaWNlcyhudW1QdHMpOwogICAgaW5kaWNlcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KHBvc2l0aW9ucy5sZW5ndGggLyAzLCBpbmRpY2VzKTsKICAgIHJldHVybiB7CiAgICAgIGJvdW5kaW5nU3BoZXJlLAogICAgICBhdHRyaWJ1dGVzLAogICAgICBpbmRpY2VzCiAgICB9OwogIH0KICBmdW5jdGlvbiBjb21wdXRlV2FsbEF0dHJpYnV0ZXMocG9zaXRpb25zLCBvcHRpb25zKSB7CiAgICBjb25zdCB2ZXJ0ZXhGb3JtYXQgPSBvcHRpb25zLnZlcnRleEZvcm1hdDsKICAgIGNvbnN0IGNlbnRlciA9IG9wdGlvbnMuY2VudGVyOwogICAgY29uc3Qgc2VtaU1ham9yQXhpcyA9IG9wdGlvbnMuc2VtaU1ham9yQXhpczsKICAgIGNvbnN0IHNlbWlNaW5vckF4aXMgPSBvcHRpb25zLnNlbWlNaW5vckF4aXM7CiAgICBjb25zdCBlbGxpcHNvaWQgPSBvcHRpb25zLmVsbGlwc29pZDsKICAgIGNvbnN0IGhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0OwogICAgY29uc3QgZXh0cnVkZWRIZWlnaHQgPSBvcHRpb25zLmV4dHJ1ZGVkSGVpZ2h0OwogICAgY29uc3Qgc3RSb3RhdGlvbiA9IG9wdGlvbnMuc3RSb3RhdGlvbjsKICAgIGNvbnN0IHNpemUgPSBwb3NpdGlvbnMubGVuZ3RoIC8gMyAqIDI7CiAgICBjb25zdCBmaW5hbFBvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSAqIDMpOwogICAgY29uc3QgdGV4dHVyZUNvb3JkaW5hdGVzID0gdmVydGV4Rm9ybWF0LnN0ID8gbmV3IEZsb2F0MzJBcnJheShzaXplICogMikgOiB2b2lkIDA7CiAgICBjb25zdCBub3JtYWxzID0gdmVydGV4Rm9ybWF0Lm5vcm1hbCA/IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSAqIDMpIDogdm9pZCAwOwogICAgY29uc3QgdGFuZ2VudHMgPSB2ZXJ0ZXhGb3JtYXQudGFuZ2VudCA/IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSAqIDMpIDogdm9pZCAwOwogICAgY29uc3QgYml0YW5nZW50cyA9IHZlcnRleEZvcm1hdC5iaXRhbmdlbnQgPyBuZXcgRmxvYXQzMkFycmF5KHNpemUgKiAzKSA6IHZvaWQgMDsKICAgIGNvbnN0IHNoYWRvd1ZvbHVtZSA9IG9wdGlvbnMuc2hhZG93Vm9sdW1lOwogICAgY29uc3QgZXh0cnVkZU5vcm1hbHMgPSBzaGFkb3dWb2x1bWUgPyBuZXcgRmxvYXQzMkFycmF5KHNpemUgKiAzKSA6IHZvaWQgMDsKICAgIGxldCB0ZXh0dXJlQ29vcmRJbmRleCA9IDA7CiAgICBsZXQgbm9ybWFsMiA9IHNjcmF0Y2hOb3JtYWwzOwogICAgbGV0IHRhbmdlbnQgPSBzY3JhdGNoVGFuZ2VudDsKICAgIGxldCBiaXRhbmdlbnQgPSBzY3JhdGNoQml0YW5nZW50OwogICAgY29uc3QgcHJvamVjdGlvbiA9IG5ldyBHZW9ncmFwaGljUHJvamVjdGlvbl9kZWZhdWx0KGVsbGlwc29pZCk7CiAgICBjb25zdCBwcm9qZWN0ZWRDZW50ZXIgPSBwcm9qZWN0aW9uLnByb2plY3QoCiAgICAgIGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhjZW50ZXIsIHNjcmF0Y2hDYXJ0b2dyYXBoaWMyKSwKICAgICAgcHJvamVjdGVkQ2VudGVyU2NyYXRjaAogICAgKTsKICAgIGNvbnN0IGdlb2RldGljTm9ybWFsID0gZWxsaXBzb2lkLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoCiAgICAgIGNlbnRlciwKICAgICAgc2NyYXRjaENhcnRlc2lhbjEzCiAgICApOwogICAgZWxsaXBzb2lkLmdlb2RldGljU3VyZmFjZU5vcm1hbChnZW9kZXRpY05vcm1hbCwgZ2VvZGV0aWNOb3JtYWwpOwogICAgY29uc3Qgcm90YXRpb24gPSBRdWF0ZXJuaW9uX2RlZmF1bHQuZnJvbUF4aXNBbmdsZSgKICAgICAgZ2VvZGV0aWNOb3JtYWwsCiAgICAgIHN0Um90YXRpb24sCiAgICAgIHF1YXRlcm5pb25TY3JhdGNoCiAgICApOwogICAgY29uc3QgdGV4dHVyZU1hdHJpeCA9IE1hdHJpeDNfZGVmYXVsdC5mcm9tUXVhdGVybmlvbihyb3RhdGlvbiwgdGV4dHVyZU1hdHJpeFNjcmF0Y2gpOwogICAgY29uc3QgbWluVGV4Q29vcmQgPSBDYXJ0ZXNpYW4yX2RlZmF1bHQuZnJvbUVsZW1lbnRzKAogICAgICBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksCiAgICAgIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwKICAgICAgc2NyYXRjaE1pblRleENvb3JkCiAgICApOwogICAgY29uc3QgbWF4VGV4Q29vcmQgPSBDYXJ0ZXNpYW4yX2RlZmF1bHQuZnJvbUVsZW1lbnRzKAogICAgICBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksCiAgICAgIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSwKICAgICAgc2NyYXRjaE1heFRleENvb3JkCiAgICApOwogICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICBjb25zdCBzdE9mZnNldCA9IGxlbmd0aCAvIDMgKiAyOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMykgewogICAgICBjb25zdCBpMSA9IGkgKyAxOwogICAgICBjb25zdCBpMiA9IGkgKyAyOwogICAgICBsZXQgcG9zaXRpb24gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KHBvc2l0aW9ucywgaSwgc2NyYXRjaENhcnRlc2lhbjEzKTsKICAgICAgbGV0IGV4dHJ1ZGVkUG9zaXRpb247CiAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuc3QpIHsKICAgICAgICBjb25zdCByb3RhdGVkUG9pbnQgPSBNYXRyaXgzX2RlZmF1bHQubXVsdGlwbHlCeVZlY3RvcigKICAgICAgICAgIHRleHR1cmVNYXRyaXgsCiAgICAgICAgICBwb3NpdGlvbiwKICAgICAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4yNAogICAgICAgICk7CiAgICAgICAgY29uc3QgcHJvamVjdGVkUG9pbnQgPSBwcm9qZWN0aW9uLnByb2plY3QoCiAgICAgICAgICBlbGxpcHNvaWQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMocm90YXRlZFBvaW50LCBzY3JhdGNoQ2FydG9ncmFwaGljMiksCiAgICAgICAgICBzY3JhdGNoQ2FydGVzaWFuMzUKICAgICAgICApOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChwcm9qZWN0ZWRQb2ludCwgcHJvamVjdGVkQ2VudGVyLCBwcm9qZWN0ZWRQb2ludCk7CiAgICAgICAgdGV4Q29vcmRTY3JhdGNoLnggPSAocHJvamVjdGVkUG9pbnQueCArIHNlbWlNYWpvckF4aXMpIC8gKDIgKiBzZW1pTWFqb3JBeGlzKTsKICAgICAgICB0ZXhDb29yZFNjcmF0Y2gueSA9IChwcm9qZWN0ZWRQb2ludC55ICsgc2VtaU1pbm9yQXhpcykgLyAoMiAqIHNlbWlNaW5vckF4aXMpOwogICAgICAgIG1pblRleENvb3JkLnggPSBNYXRoLm1pbih0ZXhDb29yZFNjcmF0Y2gueCwgbWluVGV4Q29vcmQueCk7CiAgICAgICAgbWluVGV4Q29vcmQueSA9IE1hdGgubWluKHRleENvb3JkU2NyYXRjaC55LCBtaW5UZXhDb29yZC55KTsKICAgICAgICBtYXhUZXhDb29yZC54ID0gTWF0aC5tYXgodGV4Q29vcmRTY3JhdGNoLngsIG1heFRleENvb3JkLngpOwogICAgICAgIG1heFRleENvb3JkLnkgPSBNYXRoLm1heCh0ZXhDb29yZFNjcmF0Y2gueSwgbWF4VGV4Q29vcmQueSk7CiAgICAgICAgdGV4dHVyZUNvb3JkaW5hdGVzW3RleHR1cmVDb29yZEluZGV4ICsgc3RPZmZzZXRdID0gdGV4Q29vcmRTY3JhdGNoLng7CiAgICAgICAgdGV4dHVyZUNvb3JkaW5hdGVzW3RleHR1cmVDb29yZEluZGV4ICsgMSArIHN0T2Zmc2V0XSA9IHRleENvb3JkU2NyYXRjaC55OwogICAgICAgIHRleHR1cmVDb29yZGluYXRlc1t0ZXh0dXJlQ29vcmRJbmRleCsrXSA9IHRleENvb3JkU2NyYXRjaC54OwogICAgICAgIHRleHR1cmVDb29yZGluYXRlc1t0ZXh0dXJlQ29vcmRJbmRleCsrXSA9IHRleENvb3JkU2NyYXRjaC55OwogICAgICB9CiAgICAgIHBvc2l0aW9uID0gZWxsaXBzb2lkLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UocG9zaXRpb24sIHBvc2l0aW9uKTsKICAgICAgZXh0cnVkZWRQb3NpdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShwb3NpdGlvbiwgc2NyYXRjaENhcnRlc2lhbjI0KTsKICAgICAgbm9ybWFsMiA9IGVsbGlwc29pZC5nZW9kZXRpY1N1cmZhY2VOb3JtYWwocG9zaXRpb24sIG5vcm1hbDIpOwogICAgICBpZiAoc2hhZG93Vm9sdW1lKSB7CiAgICAgICAgZXh0cnVkZU5vcm1hbHNbaSArIGxlbmd0aF0gPSAtbm9ybWFsMi54OwogICAgICAgIGV4dHJ1ZGVOb3JtYWxzW2kxICsgbGVuZ3RoXSA9IC1ub3JtYWwyLnk7CiAgICAgICAgZXh0cnVkZU5vcm1hbHNbaTIgKyBsZW5ndGhdID0gLW5vcm1hbDIuejsKICAgICAgfQogICAgICBsZXQgc2NhbGVkTm9ybWFsID0gQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoCiAgICAgICAgbm9ybWFsMiwKICAgICAgICBoZWlnaHQsCiAgICAgICAgc2NyYXRjaENhcnRlc2lhbjQKICAgICAgKTsKICAgICAgcG9zaXRpb24gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHBvc2l0aW9uLCBzY2FsZWROb3JtYWwsIHBvc2l0aW9uKTsKICAgICAgc2NhbGVkTm9ybWFsID0gQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoCiAgICAgICAgbm9ybWFsMiwKICAgICAgICBleHRydWRlZEhlaWdodCwKICAgICAgICBzY2FsZWROb3JtYWwKICAgICAgKTsKICAgICAgZXh0cnVkZWRQb3NpdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoCiAgICAgICAgZXh0cnVkZWRQb3NpdGlvbiwKICAgICAgICBzY2FsZWROb3JtYWwsCiAgICAgICAgZXh0cnVkZWRQb3NpdGlvbgogICAgICApOwogICAgICBpZiAodmVydGV4Rm9ybWF0LnBvc2l0aW9uKSB7CiAgICAgICAgZmluYWxQb3NpdGlvbnNbaSArIGxlbmd0aF0gPSBleHRydWRlZFBvc2l0aW9uLng7CiAgICAgICAgZmluYWxQb3NpdGlvbnNbaTEgKyBsZW5ndGhdID0gZXh0cnVkZWRQb3NpdGlvbi55OwogICAgICAgIGZpbmFsUG9zaXRpb25zW2kyICsgbGVuZ3RoXSA9IGV4dHJ1ZGVkUG9zaXRpb24uejsKICAgICAgICBmaW5hbFBvc2l0aW9uc1tpXSA9IHBvc2l0aW9uLng7CiAgICAgICAgZmluYWxQb3NpdGlvbnNbaTFdID0gcG9zaXRpb24ueTsKICAgICAgICBmaW5hbFBvc2l0aW9uc1tpMl0gPSBwb3NpdGlvbi56OwogICAgICB9CiAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQubm9ybWFsIHx8IHZlcnRleEZvcm1hdC50YW5nZW50IHx8IHZlcnRleEZvcm1hdC5iaXRhbmdlbnQpIHsKICAgICAgICBiaXRhbmdlbnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUobm9ybWFsMiwgYml0YW5nZW50KTsKICAgICAgICBjb25zdCBuZXh0ID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheSgKICAgICAgICAgIHBvc2l0aW9ucywKICAgICAgICAgIChpICsgMykgJSBsZW5ndGgsCiAgICAgICAgICBzY3JhdGNoQ2FydGVzaWFuNAogICAgICAgICk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KG5leHQsIHBvc2l0aW9uLCBuZXh0KTsKICAgICAgICBjb25zdCBib3R0b20gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoCiAgICAgICAgICBleHRydWRlZFBvc2l0aW9uLAogICAgICAgICAgcG9zaXRpb24sCiAgICAgICAgICBzY3JhdGNoQ2FydGVzaWFuMzUKICAgICAgICApOwogICAgICAgIG5vcm1hbDIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKGJvdHRvbSwgbmV4dCwgbm9ybWFsMiksCiAgICAgICAgICBub3JtYWwyCiAgICAgICAgKTsKICAgICAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCkgewogICAgICAgICAgbm9ybWFsc1tpXSA9IG5vcm1hbDIueDsKICAgICAgICAgIG5vcm1hbHNbaTFdID0gbm9ybWFsMi55OwogICAgICAgICAgbm9ybWFsc1tpMl0gPSBub3JtYWwyLno7CiAgICAgICAgICBub3JtYWxzW2kgKyBsZW5ndGhdID0gbm9ybWFsMi54OwogICAgICAgICAgbm9ybWFsc1tpMSArIGxlbmd0aF0gPSBub3JtYWwyLnk7CiAgICAgICAgICBub3JtYWxzW2kyICsgbGVuZ3RoXSA9IG5vcm1hbDIuejsKICAgICAgICB9CiAgICAgICAgaWYgKHZlcnRleEZvcm1hdC50YW5nZW50KSB7CiAgICAgICAgICB0YW5nZW50ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKGJpdGFuZ2VudCwgbm9ybWFsMiwgdGFuZ2VudCksCiAgICAgICAgICAgIHRhbmdlbnQKICAgICAgICAgICk7CiAgICAgICAgICB0YW5nZW50c1tpXSA9IHRhbmdlbnQueDsKICAgICAgICAgIHRhbmdlbnRzW2kxXSA9IHRhbmdlbnQueTsKICAgICAgICAgIHRhbmdlbnRzW2kyXSA9IHRhbmdlbnQuejsKICAgICAgICAgIHRhbmdlbnRzW2kgKyBsZW5ndGhdID0gdGFuZ2VudC54OwogICAgICAgICAgdGFuZ2VudHNbaSArIDEgKyBsZW5ndGhdID0gdGFuZ2VudC55OwogICAgICAgICAgdGFuZ2VudHNbaSArIDIgKyBsZW5ndGhdID0gdGFuZ2VudC56OwogICAgICAgIH0KICAgICAgICBpZiAodmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgewogICAgICAgICAgYml0YW5nZW50c1tpXSA9IGJpdGFuZ2VudC54OwogICAgICAgICAgYml0YW5nZW50c1tpMV0gPSBiaXRhbmdlbnQueTsKICAgICAgICAgIGJpdGFuZ2VudHNbaTJdID0gYml0YW5nZW50Lno7CiAgICAgICAgICBiaXRhbmdlbnRzW2kgKyBsZW5ndGhdID0gYml0YW5nZW50Lng7CiAgICAgICAgICBiaXRhbmdlbnRzW2kxICsgbGVuZ3RoXSA9IGJpdGFuZ2VudC55OwogICAgICAgICAgYml0YW5nZW50c1tpMiArIGxlbmd0aF0gPSBiaXRhbmdlbnQuejsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICh2ZXJ0ZXhGb3JtYXQuc3QpIHsKICAgICAgbGVuZ3RoID0gdGV4dHVyZUNvb3JkaW5hdGVzLmxlbmd0aDsKICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBsZW5ndGg7IGsgKz0gMikgewogICAgICAgIHRleHR1cmVDb29yZGluYXRlc1trXSA9ICh0ZXh0dXJlQ29vcmRpbmF0ZXNba10gLSBtaW5UZXhDb29yZC54KSAvIChtYXhUZXhDb29yZC54IC0gbWluVGV4Q29vcmQueCk7CiAgICAgICAgdGV4dHVyZUNvb3JkaW5hdGVzW2sgKyAxXSA9ICh0ZXh0dXJlQ29vcmRpbmF0ZXNbayArIDFdIC0gbWluVGV4Q29vcmQueSkgLyAobWF4VGV4Q29vcmQueSAtIG1pblRleENvb3JkLnkpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBhdHRyaWJ1dGVzID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlc19kZWZhdWx0KCk7CiAgICBpZiAodmVydGV4Rm9ybWF0LnBvc2l0aW9uKSB7CiAgICAgIGF0dHJpYnV0ZXMucG9zaXRpb24gPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRE9VQkxFLAogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgdmFsdWVzOiBmaW5hbFBvc2l0aW9ucwogICAgICB9KTsKICAgIH0KICAgIGlmICh2ZXJ0ZXhGb3JtYXQuc3QpIHsKICAgICAgYXR0cmlidXRlcy5zdCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5GTE9BVCwKICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAyLAogICAgICAgIHZhbHVlczogdGV4dHVyZUNvb3JkaW5hdGVzCiAgICAgIH0pOwogICAgfQogICAgaWYgKHZlcnRleEZvcm1hdC5ub3JtYWwpIHsKICAgICAgYXR0cmlidXRlcy5ub3JtYWwgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICB2YWx1ZXM6IG5vcm1hbHMKICAgICAgfSk7CiAgICB9CiAgICBpZiAodmVydGV4Rm9ybWF0LnRhbmdlbnQpIHsKICAgICAgYXR0cmlidXRlcy50YW5nZW50ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgdmFsdWVzOiB0YW5nZW50cwogICAgICB9KTsKICAgIH0KICAgIGlmICh2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgIGF0dHJpYnV0ZXMuYml0YW5nZW50ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgdmFsdWVzOiBiaXRhbmdlbnRzCiAgICAgIH0pOwogICAgfQogICAgaWYgKHNoYWRvd1ZvbHVtZSkgewogICAgICBhdHRyaWJ1dGVzLmV4dHJ1ZGVEaXJlY3Rpb24gPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICB2YWx1ZXM6IGV4dHJ1ZGVOb3JtYWxzCiAgICAgIH0pOwogICAgfQogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvcHRpb25zLm9mZnNldEF0dHJpYnV0ZSkpIHsKICAgICAgbGV0IG9mZnNldEF0dHJpYnV0ZSA9IG5ldyBVaW50OEFycmF5KHNpemUpOwogICAgICBpZiAob3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGUgPT09IEdlb21ldHJ5T2Zmc2V0QXR0cmlidXRlX2RlZmF1bHQuVE9QKSB7CiAgICAgICAgb2Zmc2V0QXR0cmlidXRlID0gb2Zmc2V0QXR0cmlidXRlLmZpbGwoMSwgMCwgc2l6ZSAvIDIpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IG9mZnNldFZhbHVlID0gb3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGUgPT09IEdlb21ldHJ5T2Zmc2V0QXR0cmlidXRlX2RlZmF1bHQuTk9ORSA/IDAgOiAxOwogICAgICAgIG9mZnNldEF0dHJpYnV0ZSA9IG9mZnNldEF0dHJpYnV0ZS5maWxsKG9mZnNldFZhbHVlKTsKICAgICAgfQogICAgICBhdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LlVOU0lHTkVEX0JZVEUsCiAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMSwKICAgICAgICB2YWx1ZXM6IG9mZnNldEF0dHJpYnV0ZQogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBhdHRyaWJ1dGVzOwogIH0KICBmdW5jdGlvbiBjb21wdXRlV2FsbEluZGljZXMocG9zaXRpb25zKSB7CiAgICBjb25zdCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoIC8gMzsKICAgIGNvbnN0IGluZGljZXMgPSBJbmRleERhdGF0eXBlX2RlZmF1bHQuY3JlYXRlVHlwZWRBcnJheShsZW5ndGgsIGxlbmd0aCAqIDYpOwogICAgbGV0IGluZGV4ID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgVUwgPSBpOwogICAgICBjb25zdCBMTCA9IGkgKyBsZW5ndGg7CiAgICAgIGNvbnN0IFVSID0gKFVMICsgMSkgJSBsZW5ndGg7CiAgICAgIGNvbnN0IExSID0gVVIgKyBsZW5ndGg7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSBVTDsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IExMOwogICAgICBpbmRpY2VzW2luZGV4KytdID0gVVI7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSBVUjsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IExMOwogICAgICBpbmRpY2VzW2luZGV4KytdID0gTFI7CiAgICB9CiAgICByZXR1cm4gaW5kaWNlczsKICB9CiAgZnVuY3Rpb24gY29tcHV0ZUV4dHJ1ZGVkRWxsaXBzZShvcHRpb25zKSB7CiAgICBjb25zdCBjZW50ZXIgPSBvcHRpb25zLmNlbnRlcjsKICAgIGNvbnN0IGVsbGlwc29pZCA9IG9wdGlvbnMuZWxsaXBzb2lkOwogICAgY29uc3Qgc2VtaU1ham9yQXhpcyA9IG9wdGlvbnMuc2VtaU1ham9yQXhpczsKICAgIGxldCBzY2FsZWROb3JtYWwgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcigKICAgICAgZWxsaXBzb2lkLmdlb2RldGljU3VyZmFjZU5vcm1hbChjZW50ZXIsIHNjcmF0Y2hDYXJ0ZXNpYW4xMyksCiAgICAgIG9wdGlvbnMuaGVpZ2h0LAogICAgICBzY3JhdGNoQ2FydGVzaWFuMTMKICAgICk7CiAgICB0b3BCb3VuZGluZ1NwaGVyZS5jZW50ZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKAogICAgICBjZW50ZXIsCiAgICAgIHNjYWxlZE5vcm1hbCwKICAgICAgdG9wQm91bmRpbmdTcGhlcmUuY2VudGVyCiAgICApOwogICAgdG9wQm91bmRpbmdTcGhlcmUucmFkaXVzID0gc2VtaU1ham9yQXhpczsKICAgIHNjYWxlZE5vcm1hbCA9IENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKAogICAgICBlbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGNlbnRlciwgc2NhbGVkTm9ybWFsKSwKICAgICAgb3B0aW9ucy5leHRydWRlZEhlaWdodCwKICAgICAgc2NhbGVkTm9ybWFsCiAgICApOwogICAgYm90dG9tQm91bmRpbmdTcGhlcmUuY2VudGVyID0gQ2FydGVzaWFuM19kZWZhdWx0LmFkZCgKICAgICAgY2VudGVyLAogICAgICBzY2FsZWROb3JtYWwsCiAgICAgIGJvdHRvbUJvdW5kaW5nU3BoZXJlLmNlbnRlcgogICAgKTsKICAgIGJvdHRvbUJvdW5kaW5nU3BoZXJlLnJhZGl1cyA9IHNlbWlNYWpvckF4aXM7CiAgICBjb25zdCBjZXAgPSBFbGxpcHNlR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuY29tcHV0ZUVsbGlwc2VQb3NpdGlvbnMoCiAgICAgIG9wdGlvbnMsCiAgICAgIHRydWUsCiAgICAgIHRydWUKICAgICk7CiAgICBjb25zdCBwb3NpdGlvbnMgPSBjZXAucG9zaXRpb25zOwogICAgY29uc3QgbnVtUHRzID0gY2VwLm51bVB0czsKICAgIGNvbnN0IG91dGVyUG9zaXRpb25zID0gY2VwLm91dGVyUG9zaXRpb25zOwogICAgY29uc3QgYm91bmRpbmdTcGhlcmUgPSBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LnVuaW9uKAogICAgICB0b3BCb3VuZGluZ1NwaGVyZSwKICAgICAgYm90dG9tQm91bmRpbmdTcGhlcmUKICAgICk7CiAgICBjb25zdCB0b3BCb3R0b21BdHRyaWJ1dGVzID0gY29tcHV0ZVRvcEJvdHRvbUF0dHJpYnV0ZXMoCiAgICAgIHBvc2l0aW9ucywKICAgICAgb3B0aW9ucywKICAgICAgdHJ1ZQogICAgKTsKICAgIGxldCBpbmRpY2VzID0gdG9wSW5kaWNlcyhudW1QdHMpOwogICAgY29uc3QgbGVuZ3RoID0gaW5kaWNlcy5sZW5ndGg7CiAgICBpbmRpY2VzLmxlbmd0aCA9IGxlbmd0aCAqIDI7CiAgICBjb25zdCBwb3NMZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoIC8gMzsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDMpIHsKICAgICAgaW5kaWNlc1tpICsgbGVuZ3RoXSA9IGluZGljZXNbaSArIDJdICsgcG9zTGVuZ3RoOwogICAgICBpbmRpY2VzW2kgKyAxICsgbGVuZ3RoXSA9IGluZGljZXNbaSArIDFdICsgcG9zTGVuZ3RoOwogICAgICBpbmRpY2VzW2kgKyAyICsgbGVuZ3RoXSA9IGluZGljZXNbaV0gKyBwb3NMZW5ndGg7CiAgICB9CiAgICBjb25zdCB0b3BCb3R0b21JbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkoCiAgICAgIHBvc0xlbmd0aCAqIDIgLyAzLAogICAgICBpbmRpY2VzCiAgICApOwogICAgY29uc3QgdG9wQm90dG9tR2VvID0gbmV3IEdlb21ldHJ5X2RlZmF1bHQoewogICAgICBhdHRyaWJ1dGVzOiB0b3BCb3R0b21BdHRyaWJ1dGVzLAogICAgICBpbmRpY2VzOiB0b3BCb3R0b21JbmRpY2VzLAogICAgICBwcmltaXRpdmVUeXBlOiBQcmltaXRpdmVUeXBlX2RlZmF1bHQuVFJJQU5HTEVTCiAgICB9KTsKICAgIGNvbnN0IHdhbGxBdHRyaWJ1dGVzID0gY29tcHV0ZVdhbGxBdHRyaWJ1dGVzKG91dGVyUG9zaXRpb25zLCBvcHRpb25zKTsKICAgIGluZGljZXMgPSBjb21wdXRlV2FsbEluZGljZXMob3V0ZXJQb3NpdGlvbnMpOwogICAgY29uc3Qgd2FsbEluZGljZXMgPSBJbmRleERhdGF0eXBlX2RlZmF1bHQuY3JlYXRlVHlwZWRBcnJheSgKICAgICAgb3V0ZXJQb3NpdGlvbnMubGVuZ3RoICogMiAvIDMsCiAgICAgIGluZGljZXMKICAgICk7CiAgICBjb25zdCB3YWxsR2VvID0gbmV3IEdlb21ldHJ5X2RlZmF1bHQoewogICAgICBhdHRyaWJ1dGVzOiB3YWxsQXR0cmlidXRlcywKICAgICAgaW5kaWNlczogd2FsbEluZGljZXMsCiAgICAgIHByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5UUklBTkdMRVMKICAgIH0pOwogICAgY29uc3QgZ2VvID0gR2VvbWV0cnlQaXBlbGluZV9kZWZhdWx0LmNvbWJpbmVJbnN0YW5jZXMoWwogICAgICBuZXcgR2VvbWV0cnlJbnN0YW5jZV9kZWZhdWx0KHsKICAgICAgICBnZW9tZXRyeTogdG9wQm90dG9tR2VvCiAgICAgIH0pLAogICAgICBuZXcgR2VvbWV0cnlJbnN0YW5jZV9kZWZhdWx0KHsKICAgICAgICBnZW9tZXRyeTogd2FsbEdlbwogICAgICB9KQogICAgXSk7CiAgICByZXR1cm4gewogICAgICBib3VuZGluZ1NwaGVyZSwKICAgICAgYXR0cmlidXRlczogZ2VvWzBdLmF0dHJpYnV0ZXMsCiAgICAgIGluZGljZXM6IGdlb1swXS5pbmRpY2VzCiAgICB9OwogIH0KICBmdW5jdGlvbiBjb21wdXRlUmVjdGFuZ2xlKGNlbnRlciwgc2VtaU1ham9yQXhpcywgc2VtaU1pbm9yQXhpcywgcm90YXRpb24sIGdyYW51bGFyaXR5LCBlbGxpcHNvaWQsIHJlc3VsdCkgewogICAgY29uc3QgY2VwID0gRWxsaXBzZUdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmNvbXB1dGVFbGxpcHNlUG9zaXRpb25zKAogICAgICB7CiAgICAgICAgY2VudGVyLAogICAgICAgIHNlbWlNYWpvckF4aXMsCiAgICAgICAgc2VtaU1pbm9yQXhpcywKICAgICAgICByb3RhdGlvbiwKICAgICAgICBncmFudWxhcml0eQogICAgICB9LAogICAgICBmYWxzZSwKICAgICAgdHJ1ZQogICAgKTsKICAgIGNvbnN0IHBvc2l0aW9uc0ZsYXQgPSBjZXAub3V0ZXJQb3NpdGlvbnM7CiAgICBjb25zdCBwb3NpdGlvbnNDb3VudCA9IHBvc2l0aW9uc0ZsYXQubGVuZ3RoIC8gMzsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBBcnJheShwb3NpdGlvbnNDb3VudCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9uc0NvdW50OyArK2kpIHsKICAgICAgcG9zaXRpb25zW2ldID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShwb3NpdGlvbnNGbGF0LCBpICogMyk7CiAgICB9CiAgICBjb25zdCByZWN0YW5nbGUgPSBSZWN0YW5nbGVfZGVmYXVsdC5mcm9tQ2FydGVzaWFuQXJyYXkocG9zaXRpb25zLCBlbGxpcHNvaWQsIHJlc3VsdCk7CiAgICBpZiAocmVjdGFuZ2xlLndpZHRoID4gTWF0aF9kZWZhdWx0LlBJKSB7CiAgICAgIHJlY3RhbmdsZS5ub3J0aCA9IHJlY3RhbmdsZS5ub3J0aCA+IDAgPyBNYXRoX2RlZmF1bHQuUElfT1ZFUl9UV08gLSBNYXRoX2RlZmF1bHQuRVBTSUxPTjcgOiByZWN0YW5nbGUubm9ydGg7CiAgICAgIHJlY3RhbmdsZS5zb3V0aCA9IHJlY3RhbmdsZS5zb3V0aCA8IDAgPyBNYXRoX2RlZmF1bHQuRVBTSUxPTjcgLSBNYXRoX2RlZmF1bHQuUElfT1ZFUl9UV08gOiByZWN0YW5nbGUuc291dGg7CiAgICAgIHJlY3RhbmdsZS5lYXN0ID0gTWF0aF9kZWZhdWx0LlBJOwogICAgICByZWN0YW5nbGUud2VzdCA9IC1NYXRoX2RlZmF1bHQuUEk7CiAgICB9CiAgICByZXR1cm4gcmVjdGFuZ2xlOwogIH0KICBmdW5jdGlvbiBFbGxpcHNlR2VvbWV0cnkob3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgPz8gRnJvemVuX2RlZmF1bHQuRU1QVFlfT0JKRUNUOwogICAgY29uc3QgY2VudGVyID0gb3B0aW9ucy5jZW50ZXI7CiAgICBjb25zdCBlbGxpcHNvaWQgPSBvcHRpb25zLmVsbGlwc29pZCA/PyBFbGxpcHNvaWRfZGVmYXVsdC5kZWZhdWx0OwogICAgY29uc3Qgc2VtaU1ham9yQXhpcyA9IG9wdGlvbnMuc2VtaU1ham9yQXhpczsKICAgIGNvbnN0IHNlbWlNaW5vckF4aXMgPSBvcHRpb25zLnNlbWlNaW5vckF4aXM7CiAgICBjb25zdCBncmFudWxhcml0eSA9IG9wdGlvbnMuZ3JhbnVsYXJpdHkgPz8gTWF0aF9kZWZhdWx0LlJBRElBTlNfUEVSX0RFR1JFRTsKICAgIGNvbnN0IHZlcnRleEZvcm1hdCA9IG9wdGlvbnMudmVydGV4Rm9ybWF0ID8/IFZlcnRleEZvcm1hdF9kZWZhdWx0LkRFRkFVTFQ7CiAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoIm9wdGlvbnMuY2VudGVyIiwgY2VudGVyKTsKICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigib3B0aW9ucy5zZW1pTWFqb3JBeGlzIiwgc2VtaU1ham9yQXhpcyk7CiAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoIm9wdGlvbnMuc2VtaU1pbm9yQXhpcyIsIHNlbWlNaW5vckF4aXMpOwogICAgaWYgKHNlbWlNYWpvckF4aXMgPCBzZW1pTWlub3JBeGlzKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICJzZW1pTWFqb3JBeGlzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZW1pTWlub3JBeGlzLiIKICAgICAgKTsKICAgIH0KICAgIGlmIChncmFudWxhcml0eSA8PSAwKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJncmFudWxhcml0eSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpOwogICAgfQogICAgY29uc3QgaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgPz8gMDsKICAgIGNvbnN0IGV4dHJ1ZGVkSGVpZ2h0ID0gb3B0aW9ucy5leHRydWRlZEhlaWdodCA/PyBoZWlnaHQ7CiAgICB0aGlzLl9jZW50ZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY2VudGVyKTsKICAgIHRoaXMuX3NlbWlNYWpvckF4aXMgPSBzZW1pTWFqb3JBeGlzOwogICAgdGhpcy5fc2VtaU1pbm9yQXhpcyA9IHNlbWlNaW5vckF4aXM7CiAgICB0aGlzLl9lbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC5jbG9uZShlbGxpcHNvaWQpOwogICAgdGhpcy5fcm90YXRpb24gPSBvcHRpb25zLnJvdGF0aW9uID8/IDA7CiAgICB0aGlzLl9zdFJvdGF0aW9uID0gb3B0aW9ucy5zdFJvdGF0aW9uID8/IDA7CiAgICB0aGlzLl9oZWlnaHQgPSBNYXRoLm1heChleHRydWRlZEhlaWdodCwgaGVpZ2h0KTsKICAgIHRoaXMuX2dyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHk7CiAgICB0aGlzLl92ZXJ0ZXhGb3JtYXQgPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5jbG9uZSh2ZXJ0ZXhGb3JtYXQpOwogICAgdGhpcy5fZXh0cnVkZWRIZWlnaHQgPSBNYXRoLm1pbihleHRydWRlZEhlaWdodCwgaGVpZ2h0KTsKICAgIHRoaXMuX3NoYWRvd1ZvbHVtZSA9IG9wdGlvbnMuc2hhZG93Vm9sdW1lID8/IGZhbHNlOwogICAgdGhpcy5fd29ya2VyTmFtZSA9ICJjcmVhdGVFbGxpcHNlR2VvbWV0cnkiOwogICAgdGhpcy5fb2Zmc2V0QXR0cmlidXRlID0gb3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGU7CiAgICB0aGlzLl9yZWN0YW5nbGUgPSB2b2lkIDA7CiAgICB0aGlzLl90ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzID0gdm9pZCAwOwogIH0KICBmdW5jdGlvbiB0ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzKGVsbGlwc2VHZW9tZXRyeSkgewogICAgY29uc3Qgc3RSb3RhdGlvbiA9IC1lbGxpcHNlR2VvbWV0cnkuX3N0Um90YXRpb247CiAgICBpZiAoc3RSb3RhdGlvbiA9PT0gMCkgewogICAgICByZXR1cm4gWzAsIDAsIDAsIDEsIDEsIDBdOwogICAgfQogICAgY29uc3QgY2VwID0gRWxsaXBzZUdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmNvbXB1dGVFbGxpcHNlUG9zaXRpb25zKAogICAgICB7CiAgICAgICAgY2VudGVyOiBlbGxpcHNlR2VvbWV0cnkuX2NlbnRlciwKICAgICAgICBzZW1pTWFqb3JBeGlzOiBlbGxpcHNlR2VvbWV0cnkuX3NlbWlNYWpvckF4aXMsCiAgICAgICAgc2VtaU1pbm9yQXhpczogZWxsaXBzZUdlb21ldHJ5Ll9zZW1pTWlub3JBeGlzLAogICAgICAgIHJvdGF0aW9uOiBlbGxpcHNlR2VvbWV0cnkuX3JvdGF0aW9uLAogICAgICAgIGdyYW51bGFyaXR5OiBlbGxpcHNlR2VvbWV0cnkuX2dyYW51bGFyaXR5CiAgICAgIH0sCiAgICAgIGZhbHNlLAogICAgICB0cnVlCiAgICApOwogICAgY29uc3QgcG9zaXRpb25zRmxhdCA9IGNlcC5vdXRlclBvc2l0aW9uczsKICAgIGNvbnN0IHBvc2l0aW9uc0NvdW50ID0gcG9zaXRpb25zRmxhdC5sZW5ndGggLyAzOwogICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEFycmF5KHBvc2l0aW9uc0NvdW50KTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zQ291bnQ7ICsraSkgewogICAgICBwb3NpdGlvbnNbaV0gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KHBvc2l0aW9uc0ZsYXQsIGkgKiAzKTsKICAgIH0KICAgIGNvbnN0IGVsbGlwc29pZCA9IGVsbGlwc2VHZW9tZXRyeS5fZWxsaXBzb2lkOwogICAgY29uc3QgYm91bmRpbmdSZWN0YW5nbGUgPSBlbGxpcHNlR2VvbWV0cnkucmVjdGFuZ2xlOwogICAgcmV0dXJuIEdlb21ldHJ5X2RlZmF1bHQuX3RleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHMoCiAgICAgIHBvc2l0aW9ucywKICAgICAgc3RSb3RhdGlvbiwKICAgICAgZWxsaXBzb2lkLAogICAgICBib3VuZGluZ1JlY3RhbmdsZQogICAgKTsKICB9CiAgdmFyIHNjcmF0Y2hDYXJ0ZXNpYW4xMywgc2NyYXRjaENhcnRlc2lhbjI0LCBzY3JhdGNoQ2FydGVzaWFuMzUsIHNjcmF0Y2hDYXJ0ZXNpYW40LCB0ZXhDb29yZFNjcmF0Y2gsIHRleHR1cmVNYXRyaXhTY3JhdGNoLCB0YW5nZW50TWF0cml4U2NyYXRjaCwgcXVhdGVybmlvblNjcmF0Y2gsIHNjcmF0Y2hOb3JtYWwzLCBzY3JhdGNoVGFuZ2VudCwgc2NyYXRjaEJpdGFuZ2VudCwgc2NyYXRjaENhcnRvZ3JhcGhpYzIsIHByb2plY3RlZENlbnRlclNjcmF0Y2gsIHNjcmF0Y2hNaW5UZXhDb29yZCwgc2NyYXRjaE1heFRleENvb3JkLCBib3VuZGluZ1NwaGVyZUNlbnRlciwgdG9wQm91bmRpbmdTcGhlcmUsIGJvdHRvbUJvdW5kaW5nU3BoZXJlLCBzY3JhdGNoQ2VudGVyMiwgc2NyYXRjaEVsbGlwc29pZCwgc2NyYXRjaFZlcnRleEZvcm1hdDIsIHNjcmF0Y2hPcHRpb25zMywgRWxsaXBzZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfRWxsaXBzZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9FbGxpcHNlR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X0JvdW5kaW5nU3BoZXJlKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMigpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DYXJ0b2dyYXBoaWMoKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X0NvbXBvbmVudERhdGF0eXBlKCk7CiAgICAgIGluaXRfRnJvemVuKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfRWxsaXBzZUdlb21ldHJ5TGlicmFyeSgpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X0dlb2dyYXBoaWNQcm9qZWN0aW9uKCk7CiAgICAgIGluaXRfR2VvbWV0cnkoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlcygpOwogICAgICBpbml0X0dlb21ldHJ5SW5zdGFuY2UoKTsKICAgICAgaW5pdF9HZW9tZXRyeU9mZnNldEF0dHJpYnV0ZSgpOwogICAgICBpbml0X0dlb21ldHJ5UGlwZWxpbmUoKTsKICAgICAgaW5pdF9JbmRleERhdGF0eXBlKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBpbml0X01hdHJpeDMoKTsKICAgICAgaW5pdF9QcmltaXRpdmVUeXBlKCk7CiAgICAgIGluaXRfUXVhdGVybmlvbigpOwogICAgICBpbml0X1JlY3RhbmdsZSgpOwogICAgICBpbml0X1ZlcnRleEZvcm1hdCgpOwogICAgICBzY3JhdGNoQ2FydGVzaWFuMTMgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4yNCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaENhcnRlc2lhbjM1ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydGVzaWFuNCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgdGV4Q29vcmRTY3JhdGNoID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICB0ZXh0dXJlTWF0cml4U2NyYXRjaCA9IG5ldyBNYXRyaXgzX2RlZmF1bHQoKTsKICAgICAgdGFuZ2VudE1hdHJpeFNjcmF0Y2ggPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgIHF1YXRlcm5pb25TY3JhdGNoID0gbmV3IFF1YXRlcm5pb25fZGVmYXVsdCgpOwogICAgICBzY3JhdGNoTm9ybWFsMyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFRhbmdlbnQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hCaXRhbmdlbnQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWMyID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIHByb2plY3RlZENlbnRlclNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hNaW5UZXhDb29yZCA9IG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaE1heFRleENvb3JkID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICBib3VuZGluZ1NwaGVyZUNlbnRlciA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgdG9wQm91bmRpbmdTcGhlcmUgPSBuZXcgQm91bmRpbmdTcGhlcmVfZGVmYXVsdCgpOwogICAgICBib3R0b21Cb3VuZGluZ1NwaGVyZSA9IG5ldyBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0KCk7CiAgICAgIEVsbGlwc2VHZW9tZXRyeS5wYWNrZWRMZW5ndGggPSBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoICsgRWxsaXBzb2lkX2RlZmF1bHQucGFja2VkTGVuZ3RoICsgVmVydGV4Rm9ybWF0X2RlZmF1bHQucGFja2VkTGVuZ3RoICsgOTsKICAgICAgRWxsaXBzZUdlb21ldHJ5LnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayh2YWx1ZS5fY2VudGVyLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIEVsbGlwc29pZF9kZWZhdWx0LnBhY2sodmFsdWUuX2VsbGlwc29pZCwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gRWxsaXBzb2lkX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIFZlcnRleEZvcm1hdF9kZWZhdWx0LnBhY2sodmFsdWUuX3ZlcnRleEZvcm1hdCwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gVmVydGV4Rm9ybWF0X2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5fc2VtaU1ham9yQXhpczsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX3NlbWlNaW5vckF4aXM7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9yb3RhdGlvbjsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX3N0Um90YXRpb247CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9oZWlnaHQ7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9ncmFudWxhcml0eTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX2V4dHJ1ZGVkSGVpZ2h0OwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5fc2hhZG93Vm9sdW1lID8gMSA6IDA7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleF0gPSB2YWx1ZS5fb2Zmc2V0QXR0cmlidXRlID8/IC0xOwogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfTsKICAgICAgc2NyYXRjaENlbnRlcjIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hFbGxpcHNvaWQgPSBuZXcgRWxsaXBzb2lkX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFZlcnRleEZvcm1hdDIgPSBuZXcgVmVydGV4Rm9ybWF0X2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaE9wdGlvbnMzID0gewogICAgICAgIGNlbnRlcjogc2NyYXRjaENlbnRlcjIsCiAgICAgICAgZWxsaXBzb2lkOiBzY3JhdGNoRWxsaXBzb2lkLAogICAgICAgIHZlcnRleEZvcm1hdDogc2NyYXRjaFZlcnRleEZvcm1hdDIsCiAgICAgICAgc2VtaU1ham9yQXhpczogdm9pZCAwLAogICAgICAgIHNlbWlNaW5vckF4aXM6IHZvaWQgMCwKICAgICAgICByb3RhdGlvbjogdm9pZCAwLAogICAgICAgIHN0Um90YXRpb246IHZvaWQgMCwKICAgICAgICBoZWlnaHQ6IHZvaWQgMCwKICAgICAgICBncmFudWxhcml0eTogdm9pZCAwLAogICAgICAgIGV4dHJ1ZGVkSGVpZ2h0OiB2b2lkIDAsCiAgICAgICAgc2hhZG93Vm9sdW1lOiB2b2lkIDAsCiAgICAgICAgb2Zmc2V0QXR0cmlidXRlOiB2b2lkIDAKICAgICAgfTsKICAgICAgRWxsaXBzZUdlb21ldHJ5LnVucGFjayA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydGluZ0luZGV4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgY29uc3QgY2VudGVyID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCwgc2NyYXRjaENlbnRlcjIpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBjb25zdCBlbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC51bnBhY2soYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHNjcmF0Y2hFbGxpcHNvaWQpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gRWxsaXBzb2lkX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGNvbnN0IHZlcnRleEZvcm1hdCA9IFZlcnRleEZvcm1hdF9kZWZhdWx0LnVucGFjaygKICAgICAgICAgIGFycmF5LAogICAgICAgICAgc3RhcnRpbmdJbmRleCwKICAgICAgICAgIHNjcmF0Y2hWZXJ0ZXhGb3JtYXQyCiAgICAgICAgKTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IFZlcnRleEZvcm1hdF9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBjb25zdCBzZW1pTWFqb3JBeGlzID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBzZW1pTWlub3JBeGlzID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCByb3RhdGlvbiA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3Qgc3RSb3RhdGlvbiA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgaGVpZ2h0ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBncmFudWxhcml0eSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgZXh0cnVkZWRIZWlnaHQgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IHNoYWRvd1ZvbHVtZSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPT09IDE7CiAgICAgICAgY29uc3Qgb2Zmc2V0QXR0cmlidXRlID0gYXJyYXlbc3RhcnRpbmdJbmRleF07CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgc2NyYXRjaE9wdGlvbnMzLmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMy5leHRydWRlZEhlaWdodCA9IGV4dHJ1ZGVkSGVpZ2h0OwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMzLmdyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHk7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczMuc3RSb3RhdGlvbiA9IHN0Um90YXRpb247CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczMucm90YXRpb24gPSByb3RhdGlvbjsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMy5zZW1pTWFqb3JBeGlzID0gc2VtaU1ham9yQXhpczsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMy5zZW1pTWlub3JBeGlzID0gc2VtaU1pbm9yQXhpczsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMy5zaGFkb3dWb2x1bWUgPSBzaGFkb3dWb2x1bWU7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczMub2Zmc2V0QXR0cmlidXRlID0gb2Zmc2V0QXR0cmlidXRlID09PSAtMSA/IHZvaWQgMCA6IG9mZnNldEF0dHJpYnV0ZTsKICAgICAgICAgIHJldHVybiBuZXcgRWxsaXBzZUdlb21ldHJ5KHNjcmF0Y2hPcHRpb25zMyk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5fY2VudGVyID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGNlbnRlciwgcmVzdWx0Ll9jZW50ZXIpOwogICAgICAgIHJlc3VsdC5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUoZWxsaXBzb2lkLCByZXN1bHQuX2VsbGlwc29pZCk7CiAgICAgICAgcmVzdWx0Ll92ZXJ0ZXhGb3JtYXQgPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5jbG9uZSh2ZXJ0ZXhGb3JtYXQsIHJlc3VsdC5fdmVydGV4Rm9ybWF0KTsKICAgICAgICByZXN1bHQuX3NlbWlNYWpvckF4aXMgPSBzZW1pTWFqb3JBeGlzOwogICAgICAgIHJlc3VsdC5fc2VtaU1pbm9yQXhpcyA9IHNlbWlNaW5vckF4aXM7CiAgICAgICAgcmVzdWx0Ll9yb3RhdGlvbiA9IHJvdGF0aW9uOwogICAgICAgIHJlc3VsdC5fc3RSb3RhdGlvbiA9IHN0Um90YXRpb247CiAgICAgICAgcmVzdWx0Ll9oZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgcmVzdWx0Ll9ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwogICAgICAgIHJlc3VsdC5fZXh0cnVkZWRIZWlnaHQgPSBleHRydWRlZEhlaWdodDsKICAgICAgICByZXN1bHQuX3NoYWRvd1ZvbHVtZSA9IHNoYWRvd1ZvbHVtZTsKICAgICAgICByZXN1bHQuX29mZnNldEF0dHJpYnV0ZSA9IG9mZnNldEF0dHJpYnV0ZSA9PT0gLTEgPyB2b2lkIDAgOiBvZmZzZXRBdHRyaWJ1dGU7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgRWxsaXBzZUdlb21ldHJ5LmNvbXB1dGVSZWN0YW5nbGUgPSBmdW5jdGlvbihvcHRpb25zLCByZXN1bHQpIHsKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICAgICAgY29uc3QgY2VudGVyID0gb3B0aW9ucy5jZW50ZXI7CiAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gb3B0aW9ucy5lbGxpcHNvaWQgPz8gRWxsaXBzb2lkX2RlZmF1bHQuZGVmYXVsdDsKICAgICAgICBjb25zdCBzZW1pTWFqb3JBeGlzID0gb3B0aW9ucy5zZW1pTWFqb3JBeGlzOwogICAgICAgIGNvbnN0IHNlbWlNaW5vckF4aXMgPSBvcHRpb25zLnNlbWlNaW5vckF4aXM7CiAgICAgICAgY29uc3QgZ3JhbnVsYXJpdHkgPSBvcHRpb25zLmdyYW51bGFyaXR5ID8/IE1hdGhfZGVmYXVsdC5SQURJQU5TX1BFUl9ERUdSRUU7CiAgICAgICAgY29uc3Qgcm90YXRpb24gPSBvcHRpb25zLnJvdGF0aW9uID8/IDA7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJvcHRpb25zLmNlbnRlciIsIGNlbnRlcik7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJvcHRpb25zLnNlbWlNYWpvckF4aXMiLCBzZW1pTWFqb3JBeGlzKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoIm9wdGlvbnMuc2VtaU1pbm9yQXhpcyIsIHNlbWlNaW5vckF4aXMpOwogICAgICAgIGlmIChzZW1pTWFqb3JBeGlzIDwgc2VtaU1pbm9yQXhpcykgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJzZW1pTWFqb3JBeGlzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZW1pTWlub3JBeGlzLiIKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmIChncmFudWxhcml0eSA8PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZ3JhbnVsYXJpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbXB1dGVSZWN0YW5nbGUoCiAgICAgICAgICBjZW50ZXIsCiAgICAgICAgICBzZW1pTWFqb3JBeGlzLAogICAgICAgICAgc2VtaU1pbm9yQXhpcywKICAgICAgICAgIHJvdGF0aW9uLAogICAgICAgICAgZ3JhbnVsYXJpdHksCiAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICByZXN1bHQKICAgICAgICApOwogICAgICB9OwogICAgICBFbGxpcHNlR2VvbWV0cnkuY3JlYXRlR2VvbWV0cnkgPSBmdW5jdGlvbihlbGxpcHNlR2VvbWV0cnkpIHsKICAgICAgICBpZiAoZWxsaXBzZUdlb21ldHJ5Ll9zZW1pTWFqb3JBeGlzIDw9IDAgfHwgZWxsaXBzZUdlb21ldHJ5Ll9zZW1pTWlub3JBeGlzIDw9IDApIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgaGVpZ2h0ID0gZWxsaXBzZUdlb21ldHJ5Ll9oZWlnaHQ7CiAgICAgICAgY29uc3QgZXh0cnVkZWRIZWlnaHQgPSBlbGxpcHNlR2VvbWV0cnkuX2V4dHJ1ZGVkSGVpZ2h0OwogICAgICAgIGNvbnN0IGV4dHJ1ZGUgPSAhTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oCiAgICAgICAgICBoZWlnaHQsCiAgICAgICAgICBleHRydWRlZEhlaWdodCwKICAgICAgICAgIDAsCiAgICAgICAgICBNYXRoX2RlZmF1bHQuRVBTSUxPTjIKICAgICAgICApOwogICAgICAgIGVsbGlwc2VHZW9tZXRyeS5fY2VudGVyID0gZWxsaXBzZUdlb21ldHJ5Ll9lbGxpcHNvaWQuc2NhbGVUb0dlb2RldGljU3VyZmFjZSgKICAgICAgICAgIGVsbGlwc2VHZW9tZXRyeS5fY2VudGVyLAogICAgICAgICAgZWxsaXBzZUdlb21ldHJ5Ll9jZW50ZXIKICAgICAgICApOwogICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7CiAgICAgICAgICBjZW50ZXI6IGVsbGlwc2VHZW9tZXRyeS5fY2VudGVyLAogICAgICAgICAgc2VtaU1ham9yQXhpczogZWxsaXBzZUdlb21ldHJ5Ll9zZW1pTWFqb3JBeGlzLAogICAgICAgICAgc2VtaU1pbm9yQXhpczogZWxsaXBzZUdlb21ldHJ5Ll9zZW1pTWlub3JBeGlzLAogICAgICAgICAgZWxsaXBzb2lkOiBlbGxpcHNlR2VvbWV0cnkuX2VsbGlwc29pZCwKICAgICAgICAgIHJvdGF0aW9uOiBlbGxpcHNlR2VvbWV0cnkuX3JvdGF0aW9uLAogICAgICAgICAgaGVpZ2h0LAogICAgICAgICAgZ3JhbnVsYXJpdHk6IGVsbGlwc2VHZW9tZXRyeS5fZ3JhbnVsYXJpdHksCiAgICAgICAgICB2ZXJ0ZXhGb3JtYXQ6IGVsbGlwc2VHZW9tZXRyeS5fdmVydGV4Rm9ybWF0LAogICAgICAgICAgc3RSb3RhdGlvbjogZWxsaXBzZUdlb21ldHJ5Ll9zdFJvdGF0aW9uCiAgICAgICAgfTsKICAgICAgICBsZXQgZ2VvbWV0cnk7CiAgICAgICAgaWYgKGV4dHJ1ZGUpIHsKICAgICAgICAgIG9wdGlvbnMuZXh0cnVkZWRIZWlnaHQgPSBleHRydWRlZEhlaWdodDsKICAgICAgICAgIG9wdGlvbnMuc2hhZG93Vm9sdW1lID0gZWxsaXBzZUdlb21ldHJ5Ll9zaGFkb3dWb2x1bWU7CiAgICAgICAgICBvcHRpb25zLm9mZnNldEF0dHJpYnV0ZSA9IGVsbGlwc2VHZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlOwogICAgICAgICAgZ2VvbWV0cnkgPSBjb21wdXRlRXh0cnVkZWRFbGxpcHNlKG9wdGlvbnMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBnZW9tZXRyeSA9IGNvbXB1dGVFbGxpcHNlKG9wdGlvbnMpOwogICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChlbGxpcHNlR2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZSkpIHsKICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoOwogICAgICAgICAgICBjb25zdCBvZmZzZXRWYWx1ZSA9IGVsbGlwc2VHZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlID09PSBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZV9kZWZhdWx0Lk5PTkUgPyAwIDogMTsKICAgICAgICAgICAgY29uc3QgYXBwbHlPZmZzZXQgPSBuZXcgVWludDhBcnJheShsZW5ndGggLyAzKS5maWxsKG9mZnNldFZhbHVlKTsKICAgICAgICAgICAgZ2VvbWV0cnkuYXR0cmlidXRlcy5hcHBseU9mZnNldCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5VTlNJR05FRF9CWVRFLAogICAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDEsCiAgICAgICAgICAgICAgdmFsdWVzOiBhcHBseU9mZnNldAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgICAgIGF0dHJpYnV0ZXM6IGdlb21ldHJ5LmF0dHJpYnV0ZXMsCiAgICAgICAgICBpbmRpY2VzOiBnZW9tZXRyeS5pbmRpY2VzLAogICAgICAgICAgcHJpbWl0aXZlVHlwZTogUHJpbWl0aXZlVHlwZV9kZWZhdWx0LlRSSUFOR0xFUywKICAgICAgICAgIGJvdW5kaW5nU3BoZXJlOiBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSwKICAgICAgICAgIG9mZnNldEF0dHJpYnV0ZTogZWxsaXBzZUdlb21ldHJ5Ll9vZmZzZXRBdHRyaWJ1dGUKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgRWxsaXBzZUdlb21ldHJ5LmNyZWF0ZVNoYWRvd1ZvbHVtZSA9IGZ1bmN0aW9uKGVsbGlwc2VHZW9tZXRyeSwgbWluSGVpZ2h0RnVuYywgbWF4SGVpZ2h0RnVuYykgewogICAgICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gZWxsaXBzZUdlb21ldHJ5Ll9ncmFudWxhcml0eTsKICAgICAgICBjb25zdCBlbGxpcHNvaWQgPSBlbGxpcHNlR2VvbWV0cnkuX2VsbGlwc29pZDsKICAgICAgICBjb25zdCBtaW5IZWlnaHQgPSBtaW5IZWlnaHRGdW5jKGdyYW51bGFyaXR5LCBlbGxpcHNvaWQpOwogICAgICAgIGNvbnN0IG1heEhlaWdodCA9IG1heEhlaWdodEZ1bmMoZ3JhbnVsYXJpdHksIGVsbGlwc29pZCk7CiAgICAgICAgcmV0dXJuIG5ldyBFbGxpcHNlR2VvbWV0cnkoewogICAgICAgICAgY2VudGVyOiBlbGxpcHNlR2VvbWV0cnkuX2NlbnRlciwKICAgICAgICAgIHNlbWlNYWpvckF4aXM6IGVsbGlwc2VHZW9tZXRyeS5fc2VtaU1ham9yQXhpcywKICAgICAgICAgIHNlbWlNaW5vckF4aXM6IGVsbGlwc2VHZW9tZXRyeS5fc2VtaU1pbm9yQXhpcywKICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgIHJvdGF0aW9uOiBlbGxpcHNlR2VvbWV0cnkuX3JvdGF0aW9uLAogICAgICAgICAgc3RSb3RhdGlvbjogZWxsaXBzZUdlb21ldHJ5Ll9zdFJvdGF0aW9uLAogICAgICAgICAgZ3JhbnVsYXJpdHksCiAgICAgICAgICBleHRydWRlZEhlaWdodDogbWluSGVpZ2h0LAogICAgICAgICAgaGVpZ2h0OiBtYXhIZWlnaHQsCiAgICAgICAgICB2ZXJ0ZXhGb3JtYXQ6IFZlcnRleEZvcm1hdF9kZWZhdWx0LlBPU0lUSU9OX09OTFksCiAgICAgICAgICBzaGFkb3dWb2x1bWU6IHRydWUKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRWxsaXBzZUdlb21ldHJ5LnByb3RvdHlwZSwgewogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICovCiAgICAgICAgcmVjdGFuZ2xlOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh0aGlzLl9yZWN0YW5nbGUpKSB7CiAgICAgICAgICAgICAgdGhpcy5fcmVjdGFuZ2xlID0gY29tcHV0ZVJlY3RhbmdsZSgKICAgICAgICAgICAgICAgIHRoaXMuX2NlbnRlciwKICAgICAgICAgICAgICAgIHRoaXMuX3NlbWlNYWpvckF4aXMsCiAgICAgICAgICAgICAgICB0aGlzLl9zZW1pTWlub3JBeGlzLAogICAgICAgICAgICAgICAgdGhpcy5fcm90YXRpb24sCiAgICAgICAgICAgICAgICB0aGlzLl9ncmFudWxhcml0eSwKICAgICAgICAgICAgICAgIHRoaXMuX2VsbGlwc29pZAogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlY3RhbmdsZTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIEZvciByZW1hcHBpbmcgdGV4dHVyZSBjb29yZGluYXRlcyB3aGVuIHJlbmRlcmluZyBFbGxpcHNlR2VvbWV0cmllcyBhcyBHcm91bmRQcmltaXRpdmVzLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICovCiAgICAgICAgdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50czogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodGhpcy5fdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50cykpIHsKICAgICAgICAgICAgICB0aGlzLl90ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzID0gdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50cyh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50czsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBFbGxpcHNlR2VvbWV0cnlfZGVmYXVsdCA9IEVsbGlwc2VHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NpcmNsZUdlb21ldHJ5LmpzCiAgZnVuY3Rpb24gQ2lyY2xlR2VvbWV0cnkob3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgPz8gRnJvemVuX2RlZmF1bHQuRU1QVFlfT0JKRUNUOwogICAgY29uc3QgcmFkaXVzID0gb3B0aW9ucy5yYWRpdXM7CiAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoInJhZGl1cyIsIHJhZGl1cyk7CiAgICBjb25zdCBlbGxpcHNlR2VvbWV0cnlPcHRpb25zID0gewogICAgICBjZW50ZXI6IG9wdGlvbnMuY2VudGVyLAogICAgICBzZW1pTWFqb3JBeGlzOiByYWRpdXMsCiAgICAgIHNlbWlNaW5vckF4aXM6IHJhZGl1cywKICAgICAgZWxsaXBzb2lkOiBvcHRpb25zLmVsbGlwc29pZCwKICAgICAgaGVpZ2h0OiBvcHRpb25zLmhlaWdodCwKICAgICAgZXh0cnVkZWRIZWlnaHQ6IG9wdGlvbnMuZXh0cnVkZWRIZWlnaHQsCiAgICAgIGdyYW51bGFyaXR5OiBvcHRpb25zLmdyYW51bGFyaXR5LAogICAgICB2ZXJ0ZXhGb3JtYXQ6IG9wdGlvbnMudmVydGV4Rm9ybWF0LAogICAgICBzdFJvdGF0aW9uOiBvcHRpb25zLnN0Um90YXRpb24sCiAgICAgIHNoYWRvd1ZvbHVtZTogb3B0aW9ucy5zaGFkb3dWb2x1bWUKICAgIH07CiAgICB0aGlzLl9lbGxpcHNlR2VvbWV0cnkgPSBuZXcgRWxsaXBzZUdlb21ldHJ5X2RlZmF1bHQoZWxsaXBzZUdlb21ldHJ5T3B0aW9ucyk7CiAgICB0aGlzLl93b3JrZXJOYW1lID0gImNyZWF0ZUNpcmNsZUdlb21ldHJ5IjsKICB9CiAgdmFyIHNjcmF0Y2hFbGxpcHNlR2VvbWV0cnksIHNjcmF0Y2hPcHRpb25zNCwgQ2lyY2xlR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9DaXJjbGVHZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ2lyY2xlR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X0Zyb3plbigpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9FbGxpcHNlR2VvbWV0cnkoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9WZXJ0ZXhGb3JtYXQoKTsKICAgICAgQ2lyY2xlR2VvbWV0cnkucGFja2VkTGVuZ3RoID0gRWxsaXBzZUdlb21ldHJ5X2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICBDaXJjbGVHZW9tZXRyeS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICByZXR1cm4gRWxsaXBzZUdlb21ldHJ5X2RlZmF1bHQucGFjayh2YWx1ZS5fZWxsaXBzZUdlb21ldHJ5LCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hFbGxpcHNlR2VvbWV0cnkgPSBuZXcgRWxsaXBzZUdlb21ldHJ5X2RlZmF1bHQoewogICAgICAgIGNlbnRlcjogbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpLAogICAgICAgIHNlbWlNYWpvckF4aXM6IDEsCiAgICAgICAgc2VtaU1pbm9yQXhpczogMQogICAgICB9KTsKICAgICAgc2NyYXRjaE9wdGlvbnM0ID0gewogICAgICAgIGNlbnRlcjogbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpLAogICAgICAgIHJhZGl1czogdm9pZCAwLAogICAgICAgIGVsbGlwc29pZDogRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUoRWxsaXBzb2lkX2RlZmF1bHQuZGVmYXVsdCksCiAgICAgICAgaGVpZ2h0OiB2b2lkIDAsCiAgICAgICAgZXh0cnVkZWRIZWlnaHQ6IHZvaWQgMCwKICAgICAgICBncmFudWxhcml0eTogdm9pZCAwLAogICAgICAgIHZlcnRleEZvcm1hdDogbmV3IFZlcnRleEZvcm1hdF9kZWZhdWx0KCksCiAgICAgICAgc3RSb3RhdGlvbjogdm9pZCAwLAogICAgICAgIHNlbWlNYWpvckF4aXM6IHZvaWQgMCwKICAgICAgICBzZW1pTWlub3JBeGlzOiB2b2lkIDAsCiAgICAgICAgc2hhZG93Vm9sdW1lOiB2b2lkIDAKICAgICAgfTsKICAgICAgQ2lyY2xlR2VvbWV0cnkudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIGNvbnN0IGVsbGlwc2VHZW9tZXRyeSA9IEVsbGlwc2VHZW9tZXRyeV9kZWZhdWx0LnVucGFjaygKICAgICAgICAgIGFycmF5LAogICAgICAgICAgc3RhcnRpbmdJbmRleCwKICAgICAgICAgIHNjcmF0Y2hFbGxpcHNlR2VvbWV0cnkKICAgICAgICApOwogICAgICAgIHNjcmF0Y2hPcHRpb25zNC5jZW50ZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoCiAgICAgICAgICBlbGxpcHNlR2VvbWV0cnkuX2NlbnRlciwKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zNC5jZW50ZXIKICAgICAgICApOwogICAgICAgIHNjcmF0Y2hPcHRpb25zNC5lbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC5jbG9uZSgKICAgICAgICAgIGVsbGlwc2VHZW9tZXRyeS5fZWxsaXBzb2lkLAogICAgICAgICAgc2NyYXRjaE9wdGlvbnM0LmVsbGlwc29pZAogICAgICAgICk7CiAgICAgICAgc2NyYXRjaE9wdGlvbnM0LmVsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKAogICAgICAgICAgZWxsaXBzZUdlb21ldHJ5Ll9lbGxpcHNvaWQsCiAgICAgICAgICBzY3JhdGNoRWxsaXBzZUdlb21ldHJ5Ll9lbGxpcHNvaWQKICAgICAgICApOwogICAgICAgIHNjcmF0Y2hPcHRpb25zNC5oZWlnaHQgPSBlbGxpcHNlR2VvbWV0cnkuX2hlaWdodDsKICAgICAgICBzY3JhdGNoT3B0aW9uczQuZXh0cnVkZWRIZWlnaHQgPSBlbGxpcHNlR2VvbWV0cnkuX2V4dHJ1ZGVkSGVpZ2h0OwogICAgICAgIHNjcmF0Y2hPcHRpb25zNC5ncmFudWxhcml0eSA9IGVsbGlwc2VHZW9tZXRyeS5fZ3JhbnVsYXJpdHk7CiAgICAgICAgc2NyYXRjaE9wdGlvbnM0LnZlcnRleEZvcm1hdCA9IFZlcnRleEZvcm1hdF9kZWZhdWx0LmNsb25lKAogICAgICAgICAgZWxsaXBzZUdlb21ldHJ5Ll92ZXJ0ZXhGb3JtYXQsCiAgICAgICAgICBzY3JhdGNoT3B0aW9uczQudmVydGV4Rm9ybWF0CiAgICAgICAgKTsKICAgICAgICBzY3JhdGNoT3B0aW9uczQuc3RSb3RhdGlvbiA9IGVsbGlwc2VHZW9tZXRyeS5fc3RSb3RhdGlvbjsKICAgICAgICBzY3JhdGNoT3B0aW9uczQuc2hhZG93Vm9sdW1lID0gZWxsaXBzZUdlb21ldHJ5Ll9zaGFkb3dWb2x1bWU7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgc2NyYXRjaE9wdGlvbnM0LnJhZGl1cyA9IGVsbGlwc2VHZW9tZXRyeS5fc2VtaU1ham9yQXhpczsKICAgICAgICAgIHJldHVybiBuZXcgQ2lyY2xlR2VvbWV0cnkoc2NyYXRjaE9wdGlvbnM0KTsKICAgICAgICB9CiAgICAgICAgc2NyYXRjaE9wdGlvbnM0LnNlbWlNYWpvckF4aXMgPSBlbGxpcHNlR2VvbWV0cnkuX3NlbWlNYWpvckF4aXM7CiAgICAgICAgc2NyYXRjaE9wdGlvbnM0LnNlbWlNaW5vckF4aXMgPSBlbGxpcHNlR2VvbWV0cnkuX3NlbWlNaW5vckF4aXM7CiAgICAgICAgcmVzdWx0Ll9lbGxpcHNlR2VvbWV0cnkgPSBuZXcgRWxsaXBzZUdlb21ldHJ5X2RlZmF1bHQoc2NyYXRjaE9wdGlvbnM0KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDaXJjbGVHZW9tZXRyeS5jcmVhdGVHZW9tZXRyeSA9IGZ1bmN0aW9uKGNpcmNsZUdlb21ldHJ5KSB7CiAgICAgICAgcmV0dXJuIEVsbGlwc2VHZW9tZXRyeV9kZWZhdWx0LmNyZWF0ZUdlb21ldHJ5KGNpcmNsZUdlb21ldHJ5Ll9lbGxpcHNlR2VvbWV0cnkpOwogICAgICB9OwogICAgICBDaXJjbGVHZW9tZXRyeS5jcmVhdGVTaGFkb3dWb2x1bWUgPSBmdW5jdGlvbihjaXJjbGVHZW9tZXRyeSwgbWluSGVpZ2h0RnVuYywgbWF4SGVpZ2h0RnVuYykgewogICAgICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gY2lyY2xlR2VvbWV0cnkuX2VsbGlwc2VHZW9tZXRyeS5fZ3JhbnVsYXJpdHk7CiAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gY2lyY2xlR2VvbWV0cnkuX2VsbGlwc2VHZW9tZXRyeS5fZWxsaXBzb2lkOwogICAgICAgIGNvbnN0IG1pbkhlaWdodCA9IG1pbkhlaWdodEZ1bmMoZ3JhbnVsYXJpdHksIGVsbGlwc29pZCk7CiAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gbWF4SGVpZ2h0RnVuYyhncmFudWxhcml0eSwgZWxsaXBzb2lkKTsKICAgICAgICByZXR1cm4gbmV3IENpcmNsZUdlb21ldHJ5KHsKICAgICAgICAgIGNlbnRlcjogY2lyY2xlR2VvbWV0cnkuX2VsbGlwc2VHZW9tZXRyeS5fY2VudGVyLAogICAgICAgICAgcmFkaXVzOiBjaXJjbGVHZW9tZXRyeS5fZWxsaXBzZUdlb21ldHJ5Ll9zZW1pTWFqb3JBeGlzLAogICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgc3RSb3RhdGlvbjogY2lyY2xlR2VvbWV0cnkuX2VsbGlwc2VHZW9tZXRyeS5fc3RSb3RhdGlvbiwKICAgICAgICAgIGdyYW51bGFyaXR5LAogICAgICAgICAgZXh0cnVkZWRIZWlnaHQ6IG1pbkhlaWdodCwKICAgICAgICAgIGhlaWdodDogbWF4SGVpZ2h0LAogICAgICAgICAgdmVydGV4Rm9ybWF0OiBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5QT1NJVElPTl9PTkxZLAogICAgICAgICAgc2hhZG93Vm9sdW1lOiB0cnVlCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENpcmNsZUdlb21ldHJ5LnByb3RvdHlwZSwgewogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICovCiAgICAgICAgcmVjdGFuZ2xlOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxsaXBzZUdlb21ldHJ5LnJlY3RhbmdsZTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIEZvciByZW1hcHBpbmcgdGV4dHVyZSBjb29yZGluYXRlcyB3aGVuIHJlbmRlcmluZyBDaXJjbGVHZW9tZXRyaWVzIGFzIEdyb3VuZFByaW1pdGl2ZXMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICB0ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxsaXBzZUdlb21ldHJ5LnRleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHM7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgQ2lyY2xlR2VvbWV0cnlfZGVmYXVsdCA9IENpcmNsZUdlb21ldHJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlQ2lyY2xlR2VvbWV0cnkuanMKICB2YXIgY3JlYXRlQ2lyY2xlR2VvbWV0cnlfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGNyZWF0ZUNpcmNsZUdlb21ldHJ5X2V4cG9ydHMsIHsKICAgIGRlZmF1bHQ6ICgpID0+IGNyZWF0ZUNpcmNsZUdlb21ldHJ5X2RlZmF1bHQKICB9KTsKICBmdW5jdGlvbiBjcmVhdGVDaXJjbGVHZW9tZXRyeShjaXJjbGVHZW9tZXRyeSwgb2Zmc2V0KSB7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG9mZnNldCkpIHsKICAgICAgY2lyY2xlR2VvbWV0cnkgPSBDaXJjbGVHZW9tZXRyeV9kZWZhdWx0LnVucGFjayhjaXJjbGVHZW9tZXRyeSwgb2Zmc2V0KTsKICAgIH0KICAgIGNpcmNsZUdlb21ldHJ5Ll9lbGxpcHNlR2VvbWV0cnkuX2NlbnRlciA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZSgKICAgICAgY2lyY2xlR2VvbWV0cnkuX2VsbGlwc2VHZW9tZXRyeS5fY2VudGVyCiAgICApOwogICAgY2lyY2xlR2VvbWV0cnkuX2VsbGlwc2VHZW9tZXRyeS5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUoCiAgICAgIGNpcmNsZUdlb21ldHJ5Ll9lbGxpcHNlR2VvbWV0cnkuX2VsbGlwc29pZAogICAgKTsKICAgIHJldHVybiBDaXJjbGVHZW9tZXRyeV9kZWZhdWx0LmNyZWF0ZUdlb21ldHJ5KGNpcmNsZUdlb21ldHJ5KTsKICB9CiAgdmFyIGNyZWF0ZUNpcmNsZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfY3JlYXRlQ2lyY2xlR2VvbWV0cnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZUNpcmNsZUdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2lyY2xlR2VvbWV0cnkoKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGNyZWF0ZUNpcmNsZUdlb21ldHJ5X2RlZmF1bHQgPSBjcmVhdGVDaXJjbGVHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0VsbGlwc2VPdXRsaW5lR2VvbWV0cnkuanMKICBmdW5jdGlvbiBjb21wdXRlRWxsaXBzZTIob3B0aW9ucykgewogICAgY29uc3QgY2VudGVyID0gb3B0aW9ucy5jZW50ZXI7CiAgICBib3VuZGluZ1NwaGVyZUNlbnRlcjIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcigKICAgICAgb3B0aW9ucy5lbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGNlbnRlciwgYm91bmRpbmdTcGhlcmVDZW50ZXIyKSwKICAgICAgb3B0aW9ucy5oZWlnaHQsCiAgICAgIGJvdW5kaW5nU3BoZXJlQ2VudGVyMgogICAgKTsKICAgIGJvdW5kaW5nU3BoZXJlQ2VudGVyMiA9IENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoCiAgICAgIGNlbnRlciwKICAgICAgYm91bmRpbmdTcGhlcmVDZW50ZXIyLAogICAgICBib3VuZGluZ1NwaGVyZUNlbnRlcjIKICAgICk7CiAgICBjb25zdCBib3VuZGluZ1NwaGVyZSA9IG5ldyBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0KAogICAgICBib3VuZGluZ1NwaGVyZUNlbnRlcjIsCiAgICAgIG9wdGlvbnMuc2VtaU1ham9yQXhpcwogICAgKTsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IEVsbGlwc2VHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5jb21wdXRlRWxsaXBzZVBvc2l0aW9ucygKICAgICAgb3B0aW9ucywKICAgICAgZmFsc2UsCiAgICAgIHRydWUKICAgICkub3V0ZXJQb3NpdGlvbnM7CiAgICBjb25zdCBhdHRyaWJ1dGVzID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlc19kZWZhdWx0KHsKICAgICAgcG9zaXRpb246IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5ET1VCTEUsCiAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICB2YWx1ZXM6IEVsbGlwc2VHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5yYWlzZVBvc2l0aW9uc1RvSGVpZ2h0KAogICAgICAgICAgcG9zaXRpb25zLAogICAgICAgICAgb3B0aW9ucywKICAgICAgICAgIGZhbHNlCiAgICAgICAgKQogICAgICB9KQogICAgfSk7CiAgICBjb25zdCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoIC8gMzsKICAgIGNvbnN0IGluZGljZXMgPSBJbmRleERhdGF0eXBlX2RlZmF1bHQuY3JlYXRlVHlwZWRBcnJheShsZW5ndGgsIGxlbmd0aCAqIDIpOwogICAgbGV0IGluZGV4ID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGk7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSAoaSArIDEpICUgbGVuZ3RoOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgYm91bmRpbmdTcGhlcmUsCiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIGluZGljZXMKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNvbXB1dGVFeHRydWRlZEVsbGlwc2UyKG9wdGlvbnMpIHsKICAgIGNvbnN0IGNlbnRlciA9IG9wdGlvbnMuY2VudGVyOwogICAgY29uc3QgZWxsaXBzb2lkID0gb3B0aW9ucy5lbGxpcHNvaWQ7CiAgICBjb25zdCBzZW1pTWFqb3JBeGlzID0gb3B0aW9ucy5zZW1pTWFqb3JBeGlzOwogICAgbGV0IHNjYWxlZE5vcm1hbCA9IENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKAogICAgICBlbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGNlbnRlciwgc2NyYXRjaENhcnRlc2lhbjE0KSwKICAgICAgb3B0aW9ucy5oZWlnaHQsCiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4xNAogICAgKTsKICAgIHRvcEJvdW5kaW5nU3BoZXJlMi5jZW50ZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKAogICAgICBjZW50ZXIsCiAgICAgIHNjYWxlZE5vcm1hbCwKICAgICAgdG9wQm91bmRpbmdTcGhlcmUyLmNlbnRlcgogICAgKTsKICAgIHRvcEJvdW5kaW5nU3BoZXJlMi5yYWRpdXMgPSBzZW1pTWFqb3JBeGlzOwogICAgc2NhbGVkTm9ybWFsID0gQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoCiAgICAgIGVsbGlwc29pZC5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoY2VudGVyLCBzY2FsZWROb3JtYWwpLAogICAgICBvcHRpb25zLmV4dHJ1ZGVkSGVpZ2h0LAogICAgICBzY2FsZWROb3JtYWwKICAgICk7CiAgICBib3R0b21Cb3VuZGluZ1NwaGVyZTIuY2VudGVyID0gQ2FydGVzaWFuM19kZWZhdWx0LmFkZCgKICAgICAgY2VudGVyLAogICAgICBzY2FsZWROb3JtYWwsCiAgICAgIGJvdHRvbUJvdW5kaW5nU3BoZXJlMi5jZW50ZXIKICAgICk7CiAgICBib3R0b21Cb3VuZGluZ1NwaGVyZTIucmFkaXVzID0gc2VtaU1ham9yQXhpczsKICAgIGxldCBwb3NpdGlvbnMgPSBFbGxpcHNlR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuY29tcHV0ZUVsbGlwc2VQb3NpdGlvbnMoCiAgICAgIG9wdGlvbnMsCiAgICAgIGZhbHNlLAogICAgICB0cnVlCiAgICApLm91dGVyUG9zaXRpb25zOwogICAgY29uc3QgYXR0cmlidXRlcyA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZXNfZGVmYXVsdCh7CiAgICAgIHBvc2l0aW9uOiBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRE9VQkxFLAogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgdmFsdWVzOiBFbGxpcHNlR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQucmFpc2VQb3NpdGlvbnNUb0hlaWdodCgKICAgICAgICAgIHBvc2l0aW9ucywKICAgICAgICAgIG9wdGlvbnMsCiAgICAgICAgICB0cnVlCiAgICAgICAgKQogICAgICB9KQogICAgfSk7CiAgICBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlczsKICAgIGNvbnN0IGJvdW5kaW5nU3BoZXJlID0gQm91bmRpbmdTcGhlcmVfZGVmYXVsdC51bmlvbigKICAgICAgdG9wQm91bmRpbmdTcGhlcmUyLAogICAgICBib3R0b21Cb3VuZGluZ1NwaGVyZTIKICAgICk7CiAgICBsZXQgbGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aCAvIDM7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlKSkgewogICAgICBsZXQgYXBwbHlPZmZzZXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOwogICAgICBpZiAob3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGUgPT09IEdlb21ldHJ5T2Zmc2V0QXR0cmlidXRlX2RlZmF1bHQuVE9QKSB7CiAgICAgICAgYXBwbHlPZmZzZXQgPSBhcHBseU9mZnNldC5maWxsKDEsIDAsIGxlbmd0aCAvIDIpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IG9mZnNldFZhbHVlID0gb3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGUgPT09IEdlb21ldHJ5T2Zmc2V0QXR0cmlidXRlX2RlZmF1bHQuTk9ORSA/IDAgOiAxOwogICAgICAgIGFwcGx5T2Zmc2V0ID0gYXBwbHlPZmZzZXQuZmlsbChvZmZzZXRWYWx1ZSk7CiAgICAgIH0KICAgICAgYXR0cmlidXRlcy5hcHBseU9mZnNldCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5VTlNJR05FRF9CWVRFLAogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDEsCiAgICAgICAgdmFsdWVzOiBhcHBseU9mZnNldAogICAgICB9KTsKICAgIH0KICAgIGxldCBudW1iZXJPZlZlcnRpY2FsTGluZXMgPSBvcHRpb25zLm51bWJlck9mVmVydGljYWxMaW5lcyA/PyAxNjsKICAgIG51bWJlck9mVmVydGljYWxMaW5lcyA9IE1hdGhfZGVmYXVsdC5jbGFtcCgKICAgICAgbnVtYmVyT2ZWZXJ0aWNhbExpbmVzLAogICAgICAwLAogICAgICBsZW5ndGggLyAyCiAgICApOwogICAgY29uc3QgaW5kaWNlcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KAogICAgICBsZW5ndGgsCiAgICAgIGxlbmd0aCAqIDIgKyBudW1iZXJPZlZlcnRpY2FsTGluZXMgKiAyCiAgICApOwogICAgbGVuZ3RoIC89IDI7CiAgICBsZXQgaW5kZXggPSAwOwogICAgbGV0IGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGk7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSAoaSArIDEpICUgbGVuZ3RoOwogICAgICBpbmRpY2VzW2luZGV4KytdID0gaSArIGxlbmd0aDsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IChpICsgMSkgJSBsZW5ndGggKyBsZW5ndGg7CiAgICB9CiAgICBsZXQgbnVtU2lkZTsKICAgIGlmIChudW1iZXJPZlZlcnRpY2FsTGluZXMgPiAwKSB7CiAgICAgIGNvbnN0IG51bVNpZGVMaW5lcyA9IE1hdGgubWluKG51bWJlck9mVmVydGljYWxMaW5lcywgbGVuZ3RoKTsKICAgICAgbnVtU2lkZSA9IE1hdGgucm91bmQobGVuZ3RoIC8gbnVtU2lkZUxpbmVzKTsKICAgICAgY29uc3QgbWF4SSA9IE1hdGgubWluKG51bVNpZGUgKiBudW1iZXJPZlZlcnRpY2FsTGluZXMsIGxlbmd0aCk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXhJOyBpICs9IG51bVNpZGUpIHsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gaTsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gaSArIGxlbmd0aDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHsKICAgICAgYm91bmRpbmdTcGhlcmUsCiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIGluZGljZXMKICAgIH07CiAgfQogIGZ1bmN0aW9uIEVsbGlwc2VPdXRsaW5lR2VvbWV0cnkob3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgPz8gRnJvemVuX2RlZmF1bHQuRU1QVFlfT0JKRUNUOwogICAgY29uc3QgY2VudGVyID0gb3B0aW9ucy5jZW50ZXI7CiAgICBjb25zdCBlbGxpcHNvaWQgPSBvcHRpb25zLmVsbGlwc29pZCA/PyBFbGxpcHNvaWRfZGVmYXVsdC5kZWZhdWx0OwogICAgY29uc3Qgc2VtaU1ham9yQXhpcyA9IG9wdGlvbnMuc2VtaU1ham9yQXhpczsKICAgIGNvbnN0IHNlbWlNaW5vckF4aXMgPSBvcHRpb25zLnNlbWlNaW5vckF4aXM7CiAgICBjb25zdCBncmFudWxhcml0eSA9IG9wdGlvbnMuZ3JhbnVsYXJpdHkgPz8gTWF0aF9kZWZhdWx0LlJBRElBTlNfUEVSX0RFR1JFRTsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGNlbnRlcikpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImNlbnRlciBpcyByZXF1aXJlZC4iKTsKICAgIH0KICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHNlbWlNYWpvckF4aXMpKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJzZW1pTWFqb3JBeGlzIGlzIHJlcXVpcmVkLiIpOwogICAgfQogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoc2VtaU1pbm9yQXhpcykpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInNlbWlNaW5vckF4aXMgaXMgcmVxdWlyZWQuIik7CiAgICB9CiAgICBpZiAoc2VtaU1ham9yQXhpcyA8IHNlbWlNaW5vckF4aXMpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgInNlbWlNYWpvckF4aXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlbWlNaW5vckF4aXMuIgogICAgICApOwogICAgfQogICAgaWYgKGdyYW51bGFyaXR5IDw9IDApIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImdyYW51bGFyaXR5IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7CiAgICB9CiAgICBjb25zdCBoZWlnaHQgPSBvcHRpb25zLmhlaWdodCA/PyAwOwogICAgY29uc3QgZXh0cnVkZWRIZWlnaHQgPSBvcHRpb25zLmV4dHJ1ZGVkSGVpZ2h0ID8/IGhlaWdodDsKICAgIHRoaXMuX2NlbnRlciA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShjZW50ZXIpOwogICAgdGhpcy5fc2VtaU1ham9yQXhpcyA9IHNlbWlNYWpvckF4aXM7CiAgICB0aGlzLl9zZW1pTWlub3JBeGlzID0gc2VtaU1pbm9yQXhpczsKICAgIHRoaXMuX2VsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKGVsbGlwc29pZCk7CiAgICB0aGlzLl9yb3RhdGlvbiA9IG9wdGlvbnMucm90YXRpb24gPz8gMDsKICAgIHRoaXMuX2hlaWdodCA9IE1hdGgubWF4KGV4dHJ1ZGVkSGVpZ2h0LCBoZWlnaHQpOwogICAgdGhpcy5fZ3JhbnVsYXJpdHkgPSBncmFudWxhcml0eTsKICAgIHRoaXMuX2V4dHJ1ZGVkSGVpZ2h0ID0gTWF0aC5taW4oZXh0cnVkZWRIZWlnaHQsIGhlaWdodCk7CiAgICB0aGlzLl9udW1iZXJPZlZlcnRpY2FsTGluZXMgPSBNYXRoLm1heCgKICAgICAgb3B0aW9ucy5udW1iZXJPZlZlcnRpY2FsTGluZXMgPz8gMTYsCiAgICAgIDAKICAgICk7CiAgICB0aGlzLl9vZmZzZXRBdHRyaWJ1dGUgPSBvcHRpb25zLm9mZnNldEF0dHJpYnV0ZTsKICAgIHRoaXMuX3dvcmtlck5hbWUgPSAiY3JlYXRlRWxsaXBzZU91dGxpbmVHZW9tZXRyeSI7CiAgfQogIHZhciBzY3JhdGNoQ2FydGVzaWFuMTQsIGJvdW5kaW5nU3BoZXJlQ2VudGVyMiwgdG9wQm91bmRpbmdTcGhlcmUyLCBib3R0b21Cb3VuZGluZ1NwaGVyZTIsIHNjcmF0Y2hDZW50ZXIzLCBzY3JhdGNoRWxsaXBzb2lkMiwgc2NyYXRjaE9wdGlvbnM1LCBFbGxpcHNlT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfRWxsaXBzZU91dGxpbmVHZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvRWxsaXBzZU91dGxpbmVHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfQm91bmRpbmdTcGhlcmUoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ29tcG9uZW50RGF0YXR5cGUoKTsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9FbGxpcHNlR2VvbWV0cnlMaWJyYXJ5KCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfR2VvbWV0cnkoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlcygpOwogICAgICBpbml0X0dlb21ldHJ5T2Zmc2V0QXR0cmlidXRlKCk7CiAgICAgIGluaXRfSW5kZXhEYXRhdHlwZSgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9QcmltaXRpdmVUeXBlKCk7CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4xNCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgYm91bmRpbmdTcGhlcmVDZW50ZXIyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICB0b3BCb3VuZGluZ1NwaGVyZTIgPSBuZXcgQm91bmRpbmdTcGhlcmVfZGVmYXVsdCgpOwogICAgICBib3R0b21Cb3VuZGluZ1NwaGVyZTIgPSBuZXcgQm91bmRpbmdTcGhlcmVfZGVmYXVsdCgpOwogICAgICBFbGxpcHNlT3V0bGluZUdlb21ldHJ5LnBhY2tlZExlbmd0aCA9IENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyA4OwogICAgICBFbGxpcHNlT3V0bGluZUdlb21ldHJ5LnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh2YWx1ZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJ2YWx1ZSBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhcnJheSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhcnJheSBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKHZhbHVlLl9jZW50ZXIsIGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgRWxsaXBzb2lkX2RlZmF1bHQucGFjayh2YWx1ZS5fZWxsaXBzb2lkLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9zZW1pTWFqb3JBeGlzOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5fc2VtaU1pbm9yQXhpczsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX3JvdGF0aW9uOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5faGVpZ2h0OwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5fZ3JhbnVsYXJpdHk7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9leHRydWRlZEhlaWdodDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX251bWJlck9mVmVydGljYWxMaW5lczsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4XSA9IHZhbHVlLl9vZmZzZXRBdHRyaWJ1dGUgPz8gLTE7CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9OwogICAgICBzY3JhdGNoQ2VudGVyMyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaEVsbGlwc29pZDIgPSBuZXcgRWxsaXBzb2lkX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaE9wdGlvbnM1ID0gewogICAgICAgIGNlbnRlcjogc2NyYXRjaENlbnRlcjMsCiAgICAgICAgZWxsaXBzb2lkOiBzY3JhdGNoRWxsaXBzb2lkMiwKICAgICAgICBzZW1pTWFqb3JBeGlzOiB2b2lkIDAsCiAgICAgICAgc2VtaU1pbm9yQXhpczogdm9pZCAwLAogICAgICAgIHJvdGF0aW9uOiB2b2lkIDAsCiAgICAgICAgaGVpZ2h0OiB2b2lkIDAsCiAgICAgICAgZ3JhbnVsYXJpdHk6IHZvaWQgMCwKICAgICAgICBleHRydWRlZEhlaWdodDogdm9pZCAwLAogICAgICAgIG51bWJlck9mVmVydGljYWxMaW5lczogdm9pZCAwLAogICAgICAgIG9mZnNldEF0dHJpYnV0ZTogdm9pZCAwCiAgICAgIH07CiAgICAgIEVsbGlwc2VPdXRsaW5lR2VvbWV0cnkudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFycmF5KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFycmF5IGlzIHJlcXVpcmVkIik7CiAgICAgICAgfQogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgY29uc3QgY2VudGVyID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCwgc2NyYXRjaENlbnRlcjMpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBjb25zdCBlbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC51bnBhY2soYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHNjcmF0Y2hFbGxpcHNvaWQyKTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IEVsbGlwc29pZF9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBjb25zdCBzZW1pTWFqb3JBeGlzID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBzZW1pTWlub3JBeGlzID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCByb3RhdGlvbiA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgaGVpZ2h0ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBncmFudWxhcml0eSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgZXh0cnVkZWRIZWlnaHQgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IG51bWJlck9mVmVydGljYWxMaW5lcyA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3Qgb2Zmc2V0QXR0cmlidXRlID0gYXJyYXlbc3RhcnRpbmdJbmRleF07CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgc2NyYXRjaE9wdGlvbnM1LmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zNS5leHRydWRlZEhlaWdodCA9IGV4dHJ1ZGVkSGVpZ2h0OwogICAgICAgICAgc2NyYXRjaE9wdGlvbnM1LmdyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHk7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczUucm90YXRpb24gPSByb3RhdGlvbjsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zNS5zZW1pTWFqb3JBeGlzID0gc2VtaU1ham9yQXhpczsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zNS5zZW1pTWlub3JBeGlzID0gc2VtaU1pbm9yQXhpczsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zNS5udW1iZXJPZlZlcnRpY2FsTGluZXMgPSBudW1iZXJPZlZlcnRpY2FsTGluZXM7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczUub2Zmc2V0QXR0cmlidXRlID0gb2Zmc2V0QXR0cmlidXRlID09PSAtMSA/IHZvaWQgMCA6IG9mZnNldEF0dHJpYnV0ZTsKICAgICAgICAgIHJldHVybiBuZXcgRWxsaXBzZU91dGxpbmVHZW9tZXRyeShzY3JhdGNoT3B0aW9uczUpOwogICAgICAgIH0KICAgICAgICByZXN1bHQuX2NlbnRlciA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShjZW50ZXIsIHJlc3VsdC5fY2VudGVyKTsKICAgICAgICByZXN1bHQuX2VsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKGVsbGlwc29pZCwgcmVzdWx0Ll9lbGxpcHNvaWQpOwogICAgICAgIHJlc3VsdC5fc2VtaU1ham9yQXhpcyA9IHNlbWlNYWpvckF4aXM7CiAgICAgICAgcmVzdWx0Ll9zZW1pTWlub3JBeGlzID0gc2VtaU1pbm9yQXhpczsKICAgICAgICByZXN1bHQuX3JvdGF0aW9uID0gcm90YXRpb247CiAgICAgICAgcmVzdWx0Ll9oZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgcmVzdWx0Ll9ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwogICAgICAgIHJlc3VsdC5fZXh0cnVkZWRIZWlnaHQgPSBleHRydWRlZEhlaWdodDsKICAgICAgICByZXN1bHQuX251bWJlck9mVmVydGljYWxMaW5lcyA9IG51bWJlck9mVmVydGljYWxMaW5lczsKICAgICAgICByZXN1bHQuX29mZnNldEF0dHJpYnV0ZSA9IG9mZnNldEF0dHJpYnV0ZSA9PT0gLTEgPyB2b2lkIDAgOiBvZmZzZXRBdHRyaWJ1dGU7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgRWxsaXBzZU91dGxpbmVHZW9tZXRyeS5jcmVhdGVHZW9tZXRyeSA9IGZ1bmN0aW9uKGVsbGlwc2VHZW9tZXRyeSkgewogICAgICAgIGlmIChlbGxpcHNlR2VvbWV0cnkuX3NlbWlNYWpvckF4aXMgPD0gMCB8fCBlbGxpcHNlR2VvbWV0cnkuX3NlbWlNaW5vckF4aXMgPD0gMCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBoZWlnaHQgPSBlbGxpcHNlR2VvbWV0cnkuX2hlaWdodDsKICAgICAgICBjb25zdCBleHRydWRlZEhlaWdodCA9IGVsbGlwc2VHZW9tZXRyeS5fZXh0cnVkZWRIZWlnaHQ7CiAgICAgICAgY29uc3QgZXh0cnVkZSA9ICFNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgIGhlaWdodCwKICAgICAgICAgIGV4dHJ1ZGVkSGVpZ2h0LAogICAgICAgICAgMCwKICAgICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9OMgogICAgICAgICk7CiAgICAgICAgZWxsaXBzZUdlb21ldHJ5Ll9jZW50ZXIgPSBlbGxpcHNlR2VvbWV0cnkuX2VsbGlwc29pZC5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKAogICAgICAgICAgZWxsaXBzZUdlb21ldHJ5Ll9jZW50ZXIsCiAgICAgICAgICBlbGxpcHNlR2VvbWV0cnkuX2NlbnRlcgogICAgICAgICk7CiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHsKICAgICAgICAgIGNlbnRlcjogZWxsaXBzZUdlb21ldHJ5Ll9jZW50ZXIsCiAgICAgICAgICBzZW1pTWFqb3JBeGlzOiBlbGxpcHNlR2VvbWV0cnkuX3NlbWlNYWpvckF4aXMsCiAgICAgICAgICBzZW1pTWlub3JBeGlzOiBlbGxpcHNlR2VvbWV0cnkuX3NlbWlNaW5vckF4aXMsCiAgICAgICAgICBlbGxpcHNvaWQ6IGVsbGlwc2VHZW9tZXRyeS5fZWxsaXBzb2lkLAogICAgICAgICAgcm90YXRpb246IGVsbGlwc2VHZW9tZXRyeS5fcm90YXRpb24sCiAgICAgICAgICBoZWlnaHQsCiAgICAgICAgICBncmFudWxhcml0eTogZWxsaXBzZUdlb21ldHJ5Ll9ncmFudWxhcml0eSwKICAgICAgICAgIG51bWJlck9mVmVydGljYWxMaW5lczogZWxsaXBzZUdlb21ldHJ5Ll9udW1iZXJPZlZlcnRpY2FsTGluZXMKICAgICAgICB9OwogICAgICAgIGxldCBnZW9tZXRyeTsKICAgICAgICBpZiAoZXh0cnVkZSkgewogICAgICAgICAgb3B0aW9ucy5leHRydWRlZEhlaWdodCA9IGV4dHJ1ZGVkSGVpZ2h0OwogICAgICAgICAgb3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGUgPSBlbGxpcHNlR2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZTsKICAgICAgICAgIGdlb21ldHJ5ID0gY29tcHV0ZUV4dHJ1ZGVkRWxsaXBzZTIob3B0aW9ucyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGdlb21ldHJ5ID0gY29tcHV0ZUVsbGlwc2UyKG9wdGlvbnMpOwogICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChlbGxpcHNlR2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZSkpIHsKICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoOwogICAgICAgICAgICBjb25zdCBvZmZzZXRWYWx1ZSA9IGVsbGlwc2VHZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlID09PSBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZV9kZWZhdWx0Lk5PTkUgPyAwIDogMTsKICAgICAgICAgICAgY29uc3QgYXBwbHlPZmZzZXQgPSBuZXcgVWludDhBcnJheShsZW5ndGggLyAzKS5maWxsKG9mZnNldFZhbHVlKTsKICAgICAgICAgICAgZ2VvbWV0cnkuYXR0cmlidXRlcy5hcHBseU9mZnNldCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5VTlNJR05FRF9CWVRFLAogICAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDEsCiAgICAgICAgICAgICAgdmFsdWVzOiBhcHBseU9mZnNldAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgICAgIGF0dHJpYnV0ZXM6IGdlb21ldHJ5LmF0dHJpYnV0ZXMsCiAgICAgICAgICBpbmRpY2VzOiBnZW9tZXRyeS5pbmRpY2VzLAogICAgICAgICAgcHJpbWl0aXZlVHlwZTogUHJpbWl0aXZlVHlwZV9kZWZhdWx0LkxJTkVTLAogICAgICAgICAgYm91bmRpbmdTcGhlcmU6IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLAogICAgICAgICAgb2Zmc2V0QXR0cmlidXRlOiBlbGxpcHNlR2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZQogICAgICAgIH0pOwogICAgICB9OwogICAgICBFbGxpcHNlT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQgPSBFbGxpcHNlT3V0bGluZUdlb21ldHJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ2lyY2xlT3V0bGluZUdlb21ldHJ5LmpzCiAgZnVuY3Rpb24gQ2lyY2xlT3V0bGluZUdlb21ldHJ5KG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgIGNvbnN0IHJhZGl1cyA9IG9wdGlvbnMucmFkaXVzOwogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJyYWRpdXMiLCByYWRpdXMpOwogICAgY29uc3QgZWxsaXBzZUdlb21ldHJ5T3B0aW9ucyA9IHsKICAgICAgY2VudGVyOiBvcHRpb25zLmNlbnRlciwKICAgICAgc2VtaU1ham9yQXhpczogcmFkaXVzLAogICAgICBzZW1pTWlub3JBeGlzOiByYWRpdXMsCiAgICAgIGVsbGlwc29pZDogb3B0aW9ucy5lbGxpcHNvaWQsCiAgICAgIGhlaWdodDogb3B0aW9ucy5oZWlnaHQsCiAgICAgIGV4dHJ1ZGVkSGVpZ2h0OiBvcHRpb25zLmV4dHJ1ZGVkSGVpZ2h0LAogICAgICBncmFudWxhcml0eTogb3B0aW9ucy5ncmFudWxhcml0eSwKICAgICAgbnVtYmVyT2ZWZXJ0aWNhbExpbmVzOiBvcHRpb25zLm51bWJlck9mVmVydGljYWxMaW5lcwogICAgfTsKICAgIHRoaXMuX2VsbGlwc2VHZW9tZXRyeSA9IG5ldyBFbGxpcHNlT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQoZWxsaXBzZUdlb21ldHJ5T3B0aW9ucyk7CiAgICB0aGlzLl93b3JrZXJOYW1lID0gImNyZWF0ZUNpcmNsZU91dGxpbmVHZW9tZXRyeSI7CiAgfQogIHZhciBzY3JhdGNoRWxsaXBzZUdlb21ldHJ5Miwgc2NyYXRjaE9wdGlvbnM2LCBDaXJjbGVPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9DaXJjbGVPdXRsaW5lR2VvbWV0cnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NpcmNsZU91dGxpbmVHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfRnJvemVuKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0VsbGlwc2VPdXRsaW5lR2VvbWV0cnkoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgQ2lyY2xlT3V0bGluZUdlb21ldHJ5LnBhY2tlZExlbmd0aCA9IEVsbGlwc2VPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgIENpcmNsZU91dGxpbmVHZW9tZXRyeS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICByZXR1cm4gRWxsaXBzZU91dGxpbmVHZW9tZXRyeV9kZWZhdWx0LnBhY2soCiAgICAgICAgICB2YWx1ZS5fZWxsaXBzZUdlb21ldHJ5LAogICAgICAgICAgYXJyYXksCiAgICAgICAgICBzdGFydGluZ0luZGV4CiAgICAgICAgKTsKICAgICAgfTsKICAgICAgc2NyYXRjaEVsbGlwc2VHZW9tZXRyeTIgPSBuZXcgRWxsaXBzZU91dGxpbmVHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgICBjZW50ZXI6IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKSwKICAgICAgICBzZW1pTWFqb3JBeGlzOiAxLAogICAgICAgIHNlbWlNaW5vckF4aXM6IDEKICAgICAgfSk7CiAgICAgIHNjcmF0Y2hPcHRpb25zNiA9IHsKICAgICAgICBjZW50ZXI6IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKSwKICAgICAgICByYWRpdXM6IHZvaWQgMCwKICAgICAgICBlbGxpcHNvaWQ6IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKEVsbGlwc29pZF9kZWZhdWx0LlVOSVRfU1BIRVJFKSwKICAgICAgICBoZWlnaHQ6IHZvaWQgMCwKICAgICAgICBleHRydWRlZEhlaWdodDogdm9pZCAwLAogICAgICAgIGdyYW51bGFyaXR5OiB2b2lkIDAsCiAgICAgICAgbnVtYmVyT2ZWZXJ0aWNhbExpbmVzOiB2b2lkIDAsCiAgICAgICAgc2VtaU1ham9yQXhpczogdm9pZCAwLAogICAgICAgIHNlbWlNaW5vckF4aXM6IHZvaWQgMAogICAgICB9OwogICAgICBDaXJjbGVPdXRsaW5lR2VvbWV0cnkudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIGNvbnN0IGVsbGlwc2VHZW9tZXRyeSA9IEVsbGlwc2VPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdC51bnBhY2soCiAgICAgICAgICBhcnJheSwKICAgICAgICAgIHN0YXJ0aW5nSW5kZXgsCiAgICAgICAgICBzY3JhdGNoRWxsaXBzZUdlb21ldHJ5MgogICAgICAgICk7CiAgICAgICAgc2NyYXRjaE9wdGlvbnM2LmNlbnRlciA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZSgKICAgICAgICAgIGVsbGlwc2VHZW9tZXRyeS5fY2VudGVyLAogICAgICAgICAgc2NyYXRjaE9wdGlvbnM2LmNlbnRlcgogICAgICAgICk7CiAgICAgICAgc2NyYXRjaE9wdGlvbnM2LmVsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKAogICAgICAgICAgZWxsaXBzZUdlb21ldHJ5Ll9lbGxpcHNvaWQsCiAgICAgICAgICBzY3JhdGNoT3B0aW9uczYuZWxsaXBzb2lkCiAgICAgICAgKTsKICAgICAgICBzY3JhdGNoT3B0aW9uczYuaGVpZ2h0ID0gZWxsaXBzZUdlb21ldHJ5Ll9oZWlnaHQ7CiAgICAgICAgc2NyYXRjaE9wdGlvbnM2LmV4dHJ1ZGVkSGVpZ2h0ID0gZWxsaXBzZUdlb21ldHJ5Ll9leHRydWRlZEhlaWdodDsKICAgICAgICBzY3JhdGNoT3B0aW9uczYuZ3JhbnVsYXJpdHkgPSBlbGxpcHNlR2VvbWV0cnkuX2dyYW51bGFyaXR5OwogICAgICAgIHNjcmF0Y2hPcHRpb25zNi5udW1iZXJPZlZlcnRpY2FsTGluZXMgPSBlbGxpcHNlR2VvbWV0cnkuX251bWJlck9mVmVydGljYWxMaW5lczsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczYucmFkaXVzID0gZWxsaXBzZUdlb21ldHJ5Ll9zZW1pTWFqb3JBeGlzOwogICAgICAgICAgcmV0dXJuIG5ldyBDaXJjbGVPdXRsaW5lR2VvbWV0cnkoc2NyYXRjaE9wdGlvbnM2KTsKICAgICAgICB9CiAgICAgICAgc2NyYXRjaE9wdGlvbnM2LnNlbWlNYWpvckF4aXMgPSBlbGxpcHNlR2VvbWV0cnkuX3NlbWlNYWpvckF4aXM7CiAgICAgICAgc2NyYXRjaE9wdGlvbnM2LnNlbWlNaW5vckF4aXMgPSBlbGxpcHNlR2VvbWV0cnkuX3NlbWlNaW5vckF4aXM7CiAgICAgICAgcmVzdWx0Ll9lbGxpcHNlR2VvbWV0cnkgPSBuZXcgRWxsaXBzZU91dGxpbmVHZW9tZXRyeV9kZWZhdWx0KHNjcmF0Y2hPcHRpb25zNik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2lyY2xlT3V0bGluZUdlb21ldHJ5LmNyZWF0ZUdlb21ldHJ5ID0gZnVuY3Rpb24oY2lyY2xlR2VvbWV0cnkpIHsKICAgICAgICByZXR1cm4gRWxsaXBzZU91dGxpbmVHZW9tZXRyeV9kZWZhdWx0LmNyZWF0ZUdlb21ldHJ5KGNpcmNsZUdlb21ldHJ5Ll9lbGxpcHNlR2VvbWV0cnkpOwogICAgICB9OwogICAgICBDaXJjbGVPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdCA9IENpcmNsZU91dGxpbmVHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZUNpcmNsZU91dGxpbmVHZW9tZXRyeS5qcwogIHZhciBjcmVhdGVDaXJjbGVPdXRsaW5lR2VvbWV0cnlfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGNyZWF0ZUNpcmNsZU91dGxpbmVHZW9tZXRyeV9leHBvcnRzLCB7CiAgICBkZWZhdWx0OiAoKSA9PiBjcmVhdGVDaXJjbGVPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdAogIH0pOwogIGZ1bmN0aW9uIGNyZWF0ZUNpcmNsZU91dGxpbmVHZW9tZXRyeShjaXJjbGVHZW9tZXRyeSwgb2Zmc2V0KSB7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG9mZnNldCkpIHsKICAgICAgY2lyY2xlR2VvbWV0cnkgPSBDaXJjbGVPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdC51bnBhY2soY2lyY2xlR2VvbWV0cnksIG9mZnNldCk7CiAgICB9CiAgICBjaXJjbGVHZW9tZXRyeS5fZWxsaXBzZUdlb21ldHJ5Ll9jZW50ZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoCiAgICAgIGNpcmNsZUdlb21ldHJ5Ll9lbGxpcHNlR2VvbWV0cnkuX2NlbnRlcgogICAgKTsKICAgIGNpcmNsZUdlb21ldHJ5Ll9lbGxpcHNlR2VvbWV0cnkuX2VsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKAogICAgICBjaXJjbGVHZW9tZXRyeS5fZWxsaXBzZUdlb21ldHJ5Ll9lbGxpcHNvaWQKICAgICk7CiAgICByZXR1cm4gQ2lyY2xlT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQuY3JlYXRlR2VvbWV0cnkoY2lyY2xlR2VvbWV0cnkpOwogIH0KICB2YXIgY3JlYXRlQ2lyY2xlT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfY3JlYXRlQ2lyY2xlT3V0bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVDaXJjbGVPdXRsaW5lR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DaXJjbGVPdXRsaW5lR2VvbWV0cnkoKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGNyZWF0ZUNpcmNsZU91dGxpbmVHZW9tZXRyeV9kZWZhdWx0ID0gY3JlYXRlQ2lyY2xlT3V0bGluZUdlb21ldHJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvYXJyYXlSZW1vdmVEdXBsaWNhdGVzLmpzCiAgZnVuY3Rpb24gYXJyYXlSZW1vdmVEdXBsaWNhdGVzKHZhbHVlcywgZXF1YWxzRXBzaWxvbiwgd3JhcEFyb3VuZCwgcmVtb3ZlZEluZGljZXMpIHsKICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiZXF1YWxzRXBzaWxvbiIsIGVxdWFsc0Vwc2lsb24pOwogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodmFsdWVzKSkgewogICAgICByZXR1cm4gdm9pZCAwOwogICAgfQogICAgd3JhcEFyb3VuZCA9IHdyYXBBcm91bmQgPz8gZmFsc2U7CiAgICBjb25zdCBzdG9yZVJlbW92ZWRJbmRpY2VzID0gZGVmaW5lZF9kZWZhdWx0KHJlbW92ZWRJbmRpY2VzKTsKICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlcy5sZW5ndGg7CiAgICBpZiAobGVuZ3RoIDwgMikgewogICAgICByZXR1cm4gdmFsdWVzOwogICAgfQogICAgbGV0IGk7CiAgICBsZXQgdjAyID0gdmFsdWVzWzBdOwogICAgbGV0IHYxMjsKICAgIGxldCBjbGVhbmVkVmFsdWVzOwogICAgbGV0IGxhc3RDbGVhbkluZGV4ID0gMDsKICAgIGxldCByZW1vdmVkSW5kZXhMQ0kgPSAtMTsKICAgIGZvciAoaSA9IDE7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICB2MTIgPSB2YWx1ZXNbaV07CiAgICAgIGlmIChlcXVhbHNFcHNpbG9uKHYwMiwgdjEyLCByZW1vdmVEdXBsaWNhdGVzRXBzaWxvbikpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChjbGVhbmVkVmFsdWVzKSkgewogICAgICAgICAgY2xlYW5lZFZhbHVlcyA9IHZhbHVlcy5zbGljZSgwLCBpKTsKICAgICAgICAgIGxhc3RDbGVhbkluZGV4ID0gaSAtIDE7CiAgICAgICAgICByZW1vdmVkSW5kZXhMQ0kgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoc3RvcmVSZW1vdmVkSW5kaWNlcykgewogICAgICAgICAgcmVtb3ZlZEluZGljZXMucHVzaChpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChjbGVhbmVkVmFsdWVzKSkgewogICAgICAgICAgY2xlYW5lZFZhbHVlcy5wdXNoKHYxMik7CiAgICAgICAgICBsYXN0Q2xlYW5JbmRleCA9IGk7CiAgICAgICAgICBpZiAoc3RvcmVSZW1vdmVkSW5kaWNlcykgewogICAgICAgICAgICByZW1vdmVkSW5kZXhMQ0kgPSByZW1vdmVkSW5kaWNlcy5sZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHYwMiA9IHYxMjsKICAgICAgfQogICAgfQogICAgaWYgKHdyYXBBcm91bmQgJiYgZXF1YWxzRXBzaWxvbih2YWx1ZXNbMF0sIHZhbHVlc1tsZW5ndGggLSAxXSwgcmVtb3ZlRHVwbGljYXRlc0Vwc2lsb24pKSB7CiAgICAgIGlmIChzdG9yZVJlbW92ZWRJbmRpY2VzKSB7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChjbGVhbmVkVmFsdWVzKSkgewogICAgICAgICAgcmVtb3ZlZEluZGljZXMuc3BsaWNlKHJlbW92ZWRJbmRleExDSSwgMCwgbGFzdENsZWFuSW5kZXgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZW1vdmVkSW5kaWNlcy5wdXNoKGxlbmd0aCAtIDEpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGNsZWFuZWRWYWx1ZXMpKSB7CiAgICAgICAgY2xlYW5lZFZhbHVlcy5sZW5ndGggLT0gMTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjbGVhbmVkVmFsdWVzID0gdmFsdWVzLnNsaWNlKDAsIC0xKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRlZmluZWRfZGVmYXVsdChjbGVhbmVkVmFsdWVzKSA/IGNsZWFuZWRWYWx1ZXMgOiB2YWx1ZXM7CiAgfQogIHZhciByZW1vdmVEdXBsaWNhdGVzRXBzaWxvbiwgYXJyYXlSZW1vdmVEdXBsaWNhdGVzX2RlZmF1bHQ7CiAgdmFyIGluaXRfYXJyYXlSZW1vdmVEdXBsaWNhdGVzID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9hcnJheVJlbW92ZUR1cGxpY2F0ZXMuanMiKCkgewogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgcmVtb3ZlRHVwbGljYXRlc0Vwc2lsb24gPSBNYXRoX2RlZmF1bHQuRVBTSUxPTjEwOwogICAgICBhcnJheVJlbW92ZUR1cGxpY2F0ZXNfZGVmYXVsdCA9IGFycmF5UmVtb3ZlRHVwbGljYXRlczsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0JvdW5kaW5nUmVjdGFuZ2xlLmpzCiAgZnVuY3Rpb24gQm91bmRpbmdSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkgewogICAgdGhpcy54ID0geCA/PyAwOwogICAgdGhpcy55ID0geSA/PyAwOwogICAgdGhpcy53aWR0aCA9IHdpZHRoID8/IDA7CiAgICB0aGlzLmhlaWdodCA9IGhlaWdodCA/PyAwOwogIH0KICB2YXIgZGVmYXVsdFByb2plY3Rpb24yLCBmcm9tUmVjdGFuZ2xlTG93ZXJMZWZ0LCBmcm9tUmVjdGFuZ2xlVXBwZXJSaWdodCwgQm91bmRpbmdSZWN0YW5nbGVfZGVmYXVsdDsKICB2YXIgaW5pdF9Cb3VuZGluZ1JlY3RhbmdsZSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQm91bmRpbmdSZWN0YW5nbGUuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjIoKTsKICAgICAgaW5pdF9DYXJ0b2dyYXBoaWMoKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9HZW9ncmFwaGljUHJvamVjdGlvbigpOwogICAgICBpbml0X0ludGVyc2VjdCgpOwogICAgICBpbml0X1JlY3RhbmdsZSgpOwogICAgICBCb3VuZGluZ1JlY3RhbmdsZS5wYWNrZWRMZW5ndGggPSA0OwogICAgICBCb3VuZGluZ1JlY3RhbmdsZS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLng7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLnk7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLndpZHRoOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXhdID0gdmFsdWUuaGVpZ2h0OwogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfTsKICAgICAgQm91bmRpbmdSZWN0YW5nbGUudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQm91bmRpbmdSZWN0YW5nbGUoKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnggPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdC55ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICByZXN1bHQud2lkdGggPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdC5oZWlnaHQgPSBhcnJheVtzdGFydGluZ0luZGV4XTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBCb3VuZGluZ1JlY3RhbmdsZS5mcm9tUG9pbnRzID0gZnVuY3Rpb24ocG9zaXRpb25zLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQm91bmRpbmdSZWN0YW5nbGUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocG9zaXRpb25zKSB8fCBwb3NpdGlvbnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXN1bHQueCA9IDA7CiAgICAgICAgICByZXN1bHQueSA9IDA7CiAgICAgICAgICByZXN1bHQud2lkdGggPSAwOwogICAgICAgICAgcmVzdWx0LmhlaWdodCA9IDA7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICBjb25zdCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGxldCBtaW5pbXVtWCA9IHBvc2l0aW9uc1swXS54OwogICAgICAgIGxldCBtaW5pbXVtWSA9IHBvc2l0aW9uc1swXS55OwogICAgICAgIGxldCBtYXhpbXVtWCA9IHBvc2l0aW9uc1swXS54OwogICAgICAgIGxldCBtYXhpbXVtWSA9IHBvc2l0aW9uc1swXS55OwogICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHAgPSBwb3NpdGlvbnNbaV07CiAgICAgICAgICBjb25zdCB4ID0gcC54OwogICAgICAgICAgY29uc3QgeSA9IHAueTsKICAgICAgICAgIG1pbmltdW1YID0gTWF0aC5taW4oeCwgbWluaW11bVgpOwogICAgICAgICAgbWF4aW11bVggPSBNYXRoLm1heCh4LCBtYXhpbXVtWCk7CiAgICAgICAgICBtaW5pbXVtWSA9IE1hdGgubWluKHksIG1pbmltdW1ZKTsKICAgICAgICAgIG1heGltdW1ZID0gTWF0aC5tYXgoeSwgbWF4aW11bVkpOwogICAgICAgIH0KICAgICAgICByZXN1bHQueCA9IG1pbmltdW1YOwogICAgICAgIHJlc3VsdC55ID0gbWluaW11bVk7CiAgICAgICAgcmVzdWx0LndpZHRoID0gbWF4aW11bVggLSBtaW5pbXVtWDsKICAgICAgICByZXN1bHQuaGVpZ2h0ID0gbWF4aW11bVkgLSBtaW5pbXVtWTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBkZWZhdWx0UHJvamVjdGlvbjIgPSBuZXcgR2VvZ3JhcGhpY1Byb2plY3Rpb25fZGVmYXVsdCgpOwogICAgICBmcm9tUmVjdGFuZ2xlTG93ZXJMZWZ0ID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIGZyb21SZWN0YW5nbGVVcHBlclJpZ2h0ID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIEJvdW5kaW5nUmVjdGFuZ2xlLmZyb21SZWN0YW5nbGUgPSBmdW5jdGlvbihyZWN0YW5nbGUsIHByb2plY3Rpb24sIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBCb3VuZGluZ1JlY3RhbmdsZSgpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZWN0YW5nbGUpKSB7CiAgICAgICAgICByZXN1bHQueCA9IDA7CiAgICAgICAgICByZXN1bHQueSA9IDA7CiAgICAgICAgICByZXN1bHQud2lkdGggPSAwOwogICAgICAgICAgcmVzdWx0LmhlaWdodCA9IDA7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICBkZWZhdWx0UHJvamVjdGlvbjIuX2VsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmRlZmF1bHQ7CiAgICAgICAgcHJvamVjdGlvbiA9IHByb2plY3Rpb24gPz8gZGVmYXVsdFByb2plY3Rpb24yOwogICAgICAgIGNvbnN0IGxvd2VyTGVmdCA9IHByb2plY3Rpb24ucHJvamVjdCgKICAgICAgICAgIFJlY3RhbmdsZV9kZWZhdWx0LnNvdXRod2VzdChyZWN0YW5nbGUsIGZyb21SZWN0YW5nbGVMb3dlckxlZnQpCiAgICAgICAgKTsKICAgICAgICBjb25zdCB1cHBlclJpZ2h0ID0gcHJvamVjdGlvbi5wcm9qZWN0KAogICAgICAgICAgUmVjdGFuZ2xlX2RlZmF1bHQubm9ydGhlYXN0KHJlY3RhbmdsZSwgZnJvbVJlY3RhbmdsZVVwcGVyUmlnaHQpCiAgICAgICAgKTsKICAgICAgICBDYXJ0ZXNpYW4yX2RlZmF1bHQuc3VidHJhY3QodXBwZXJSaWdodCwgbG93ZXJMZWZ0LCB1cHBlclJpZ2h0KTsKICAgICAgICByZXN1bHQueCA9IGxvd2VyTGVmdC54OwogICAgICAgIHJlc3VsdC55ID0gbG93ZXJMZWZ0Lnk7CiAgICAgICAgcmVzdWx0LndpZHRoID0gdXBwZXJSaWdodC54OwogICAgICAgIHJlc3VsdC5oZWlnaHQgPSB1cHBlclJpZ2h0Lnk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQm91bmRpbmdSZWN0YW5nbGUuY2xvbmUgPSBmdW5jdGlvbihyZWN0YW5nbGUsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlY3RhbmdsZSkpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgQm91bmRpbmdSZWN0YW5nbGUoCiAgICAgICAgICAgIHJlY3RhbmdsZS54LAogICAgICAgICAgICByZWN0YW5nbGUueSwKICAgICAgICAgICAgcmVjdGFuZ2xlLndpZHRoLAogICAgICAgICAgICByZWN0YW5nbGUuaGVpZ2h0CiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXN1bHQueCA9IHJlY3RhbmdsZS54OwogICAgICAgIHJlc3VsdC55ID0gcmVjdGFuZ2xlLnk7CiAgICAgICAgcmVzdWx0LndpZHRoID0gcmVjdGFuZ2xlLndpZHRoOwogICAgICAgIHJlc3VsdC5oZWlnaHQgPSByZWN0YW5nbGUuaGVpZ2h0OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEJvdW5kaW5nUmVjdGFuZ2xlLnVuaW9uID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IEJvdW5kaW5nUmVjdGFuZ2xlKCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxvd2VyTGVmdFggPSBNYXRoLm1pbihsZWZ0LngsIHJpZ2h0LngpOwogICAgICAgIGNvbnN0IGxvd2VyTGVmdFkgPSBNYXRoLm1pbihsZWZ0LnksIHJpZ2h0LnkpOwogICAgICAgIGNvbnN0IHVwcGVyUmlnaHRYID0gTWF0aC5tYXgobGVmdC54ICsgbGVmdC53aWR0aCwgcmlnaHQueCArIHJpZ2h0LndpZHRoKTsKICAgICAgICBjb25zdCB1cHBlclJpZ2h0WSA9IE1hdGgubWF4KGxlZnQueSArIGxlZnQuaGVpZ2h0LCByaWdodC55ICsgcmlnaHQuaGVpZ2h0KTsKICAgICAgICByZXN1bHQueCA9IGxvd2VyTGVmdFg7CiAgICAgICAgcmVzdWx0LnkgPSBsb3dlckxlZnRZOwogICAgICAgIHJlc3VsdC53aWR0aCA9IHVwcGVyUmlnaHRYIC0gbG93ZXJMZWZ0WDsKICAgICAgICByZXN1bHQuaGVpZ2h0ID0gdXBwZXJSaWdodFkgLSBsb3dlckxlZnRZOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEJvdW5kaW5nUmVjdGFuZ2xlLmV4cGFuZCA9IGZ1bmN0aW9uKHJlY3RhbmdsZSwgcG9pbnQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIiwgcmVjdGFuZ2xlKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInBvaW50IiwgcG9pbnQpOwogICAgICAgIHJlc3VsdCA9IEJvdW5kaW5nUmVjdGFuZ2xlLmNsb25lKHJlY3RhbmdsZSwgcmVzdWx0KTsKICAgICAgICBjb25zdCB3aWR0aCA9IHBvaW50LnggLSByZXN1bHQueDsKICAgICAgICBjb25zdCBoZWlnaHQgPSBwb2ludC55IC0gcmVzdWx0Lnk7CiAgICAgICAgaWYgKHdpZHRoID4gcmVzdWx0LndpZHRoKSB7CiAgICAgICAgICByZXN1bHQud2lkdGggPSB3aWR0aDsKICAgICAgICB9IGVsc2UgaWYgKHdpZHRoIDwgMCkgewogICAgICAgICAgcmVzdWx0LndpZHRoIC09IHdpZHRoOwogICAgICAgICAgcmVzdWx0LnggPSBwb2ludC54OwogICAgICAgIH0KICAgICAgICBpZiAoaGVpZ2h0ID4gcmVzdWx0LmhlaWdodCkgewogICAgICAgICAgcmVzdWx0LmhlaWdodCA9IGhlaWdodDsKICAgICAgICB9IGVsc2UgaWYgKGhlaWdodCA8IDApIHsKICAgICAgICAgIHJlc3VsdC5oZWlnaHQgLT0gaGVpZ2h0OwogICAgICAgICAgcmVzdWx0LnkgPSBwb2ludC55OwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBCb3VuZGluZ1JlY3RhbmdsZS5pbnRlcnNlY3QgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgY29uc3QgbGVmdFggPSBsZWZ0Lng7CiAgICAgICAgY29uc3QgbGVmdFkgPSBsZWZ0Lnk7CiAgICAgICAgY29uc3QgcmlnaHRYID0gcmlnaHQueDsKICAgICAgICBjb25zdCByaWdodFkgPSByaWdodC55OwogICAgICAgIGlmICghKGxlZnRYID4gcmlnaHRYICsgcmlnaHQud2lkdGggfHwgbGVmdFggKyBsZWZ0LndpZHRoIDwgcmlnaHRYIHx8IGxlZnRZICsgbGVmdC5oZWlnaHQgPCByaWdodFkgfHwgbGVmdFkgPiByaWdodFkgKyByaWdodC5oZWlnaHQpKSB7CiAgICAgICAgICByZXR1cm4gSW50ZXJzZWN0X2RlZmF1bHQuSU5URVJTRUNUSU5HOwogICAgICAgIH0KICAgICAgICByZXR1cm4gSW50ZXJzZWN0X2RlZmF1bHQuT1VUU0lERTsKICAgICAgfTsKICAgICAgQm91bmRpbmdSZWN0YW5nbGUuZXF1YWxzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQpIHsKICAgICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgZGVmaW5lZF9kZWZhdWx0KGxlZnQpICYmIGRlZmluZWRfZGVmYXVsdChyaWdodCkgJiYgbGVmdC54ID09PSByaWdodC54ICYmIGxlZnQueSA9PT0gcmlnaHQueSAmJiBsZWZ0LndpZHRoID09PSByaWdodC53aWR0aCAmJiBsZWZ0LmhlaWdodCA9PT0gcmlnaHQuaGVpZ2h0OwogICAgICB9OwogICAgICBCb3VuZGluZ1JlY3RhbmdsZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICByZXR1cm4gQm91bmRpbmdSZWN0YW5nbGUuY2xvbmUodGhpcywgcmVzdWx0KTsKICAgICAgfTsKICAgICAgQm91bmRpbmdSZWN0YW5nbGUucHJvdG90eXBlLmludGVyc2VjdCA9IGZ1bmN0aW9uKHJpZ2h0KSB7CiAgICAgICAgcmV0dXJuIEJvdW5kaW5nUmVjdGFuZ2xlLmludGVyc2VjdCh0aGlzLCByaWdodCk7CiAgICAgIH07CiAgICAgIEJvdW5kaW5nUmVjdGFuZ2xlLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbihyaWdodCkgewogICAgICAgIHJldHVybiBCb3VuZGluZ1JlY3RhbmdsZS5lcXVhbHModGhpcywgcmlnaHQpOwogICAgICB9OwogICAgICBCb3VuZGluZ1JlY3RhbmdsZV9kZWZhdWx0ID0gQm91bmRpbmdSZWN0YW5nbGU7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9BeGlzQWxpZ25lZEJvdW5kaW5nQm94LmpzCiAgZnVuY3Rpb24gQXhpc0FsaWduZWRCb3VuZGluZ0JveChtaW5pbXVtLCBtYXhpbXVtLCBjZW50ZXIpIHsKICAgIHRoaXMubWluaW11bSA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShtaW5pbXVtID8/IENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPKTsKICAgIHRoaXMubWF4aW11bSA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShtYXhpbXVtID8/IENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPKTsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGNlbnRlcikpIHsKICAgICAgY2VudGVyID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1pZHBvaW50KHRoaXMubWluaW11bSwgdGhpcy5tYXhpbXVtLCBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCkpOwogICAgfSBlbHNlIHsKICAgICAgY2VudGVyID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGNlbnRlcik7CiAgICB9CiAgICB0aGlzLmNlbnRlciA9IGNlbnRlcjsKICB9CiAgdmFyIGludGVyc2VjdFNjcmF0Y2gsIEF4aXNBbGlnbmVkQm91bmRpbmdCb3hfZGVmYXVsdDsKICB2YXIgaW5pdF9BeGlzQWxpZ25lZEJvdW5kaW5nQm94ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9BeGlzQWxpZ25lZEJvdW5kaW5nQm94LmpzIigpIHsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfSW50ZXJzZWN0KCk7CiAgICAgIEF4aXNBbGlnbmVkQm91bmRpbmdCb3guZnJvbUNvcm5lcnMgPSBmdW5jdGlvbihtaW5pbXVtLCBtYXhpbXVtLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoIm1pbmltdW0iLCBtaW5pbXVtKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoIm1heGltdW0iLCBtYXhpbXVtKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQXhpc0FsaWduZWRCb3VuZGluZ0JveCgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQubWluaW11bSA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShtaW5pbXVtLCByZXN1bHQubWluaW11bSk7CiAgICAgICAgcmVzdWx0Lm1heGltdW0gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUobWF4aW11bSwgcmVzdWx0Lm1heGltdW0pOwogICAgICAgIHJlc3VsdC5jZW50ZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWlkcG9pbnQobWluaW11bSwgbWF4aW11bSwgcmVzdWx0LmNlbnRlcik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQXhpc0FsaWduZWRCb3VuZGluZ0JveC5mcm9tUG9pbnRzID0gZnVuY3Rpb24ocG9zaXRpb25zLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQXhpc0FsaWduZWRCb3VuZGluZ0JveCgpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwb3NpdGlvbnMpIHx8IHBvc2l0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJlc3VsdC5taW5pbXVtID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPLCByZXN1bHQubWluaW11bSk7CiAgICAgICAgICByZXN1bHQubWF4aW11bSA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTywgcmVzdWx0Lm1heGltdW0pOwogICAgICAgICAgcmVzdWx0LmNlbnRlciA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTywgcmVzdWx0LmNlbnRlcik7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICBsZXQgbWluaW11bVggPSBwb3NpdGlvbnNbMF0ueDsKICAgICAgICBsZXQgbWluaW11bVkgPSBwb3NpdGlvbnNbMF0ueTsKICAgICAgICBsZXQgbWluaW11bVogPSBwb3NpdGlvbnNbMF0uejsKICAgICAgICBsZXQgbWF4aW11bVggPSBwb3NpdGlvbnNbMF0ueDsKICAgICAgICBsZXQgbWF4aW11bVkgPSBwb3NpdGlvbnNbMF0ueTsKICAgICAgICBsZXQgbWF4aW11bVogPSBwb3NpdGlvbnNbMF0uejsKICAgICAgICBjb25zdCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHAgPSBwb3NpdGlvbnNbaV07CiAgICAgICAgICBjb25zdCB4ID0gcC54OwogICAgICAgICAgY29uc3QgeSA9IHAueTsKICAgICAgICAgIGNvbnN0IHogPSBwLno7CiAgICAgICAgICBtaW5pbXVtWCA9IE1hdGgubWluKHgsIG1pbmltdW1YKTsKICAgICAgICAgIG1heGltdW1YID0gTWF0aC5tYXgoeCwgbWF4aW11bVgpOwogICAgICAgICAgbWluaW11bVkgPSBNYXRoLm1pbih5LCBtaW5pbXVtWSk7CiAgICAgICAgICBtYXhpbXVtWSA9IE1hdGgubWF4KHksIG1heGltdW1ZKTsKICAgICAgICAgIG1pbmltdW1aID0gTWF0aC5taW4oeiwgbWluaW11bVopOwogICAgICAgICAgbWF4aW11bVogPSBNYXRoLm1heCh6LCBtYXhpbXVtWik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1pbmltdW0gPSByZXN1bHQubWluaW11bTsKICAgICAgICBtaW5pbXVtLnggPSBtaW5pbXVtWDsKICAgICAgICBtaW5pbXVtLnkgPSBtaW5pbXVtWTsKICAgICAgICBtaW5pbXVtLnogPSBtaW5pbXVtWjsKICAgICAgICBjb25zdCBtYXhpbXVtID0gcmVzdWx0Lm1heGltdW07CiAgICAgICAgbWF4aW11bS54ID0gbWF4aW11bVg7CiAgICAgICAgbWF4aW11bS55ID0gbWF4aW11bVk7CiAgICAgICAgbWF4aW11bS56ID0gbWF4aW11bVo7CiAgICAgICAgcmVzdWx0LmNlbnRlciA9IENhcnRlc2lhbjNfZGVmYXVsdC5taWRwb2ludChtaW5pbXVtLCBtYXhpbXVtLCByZXN1bHQuY2VudGVyKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBBeGlzQWxpZ25lZEJvdW5kaW5nQm94LmNsb25lID0gZnVuY3Rpb24oYm94LCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChib3gpKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IEF4aXNBbGlnbmVkQm91bmRpbmdCb3goYm94Lm1pbmltdW0sIGJveC5tYXhpbXVtLCBib3guY2VudGVyKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0Lm1pbmltdW0gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoYm94Lm1pbmltdW0sIHJlc3VsdC5taW5pbXVtKTsKICAgICAgICByZXN1bHQubWF4aW11bSA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShib3gubWF4aW11bSwgcmVzdWx0Lm1heGltdW0pOwogICAgICAgIHJlc3VsdC5jZW50ZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoYm94LmNlbnRlciwgcmVzdWx0LmNlbnRlcik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQXhpc0FsaWduZWRCb3VuZGluZ0JveC5lcXVhbHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkgewogICAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodCB8fCBkZWZpbmVkX2RlZmF1bHQobGVmdCkgJiYgZGVmaW5lZF9kZWZhdWx0KHJpZ2h0KSAmJiBDYXJ0ZXNpYW4zX2RlZmF1bHQuZXF1YWxzKGxlZnQuY2VudGVyLCByaWdodC5jZW50ZXIpICYmIENhcnRlc2lhbjNfZGVmYXVsdC5lcXVhbHMobGVmdC5taW5pbXVtLCByaWdodC5taW5pbXVtKSAmJiBDYXJ0ZXNpYW4zX2RlZmF1bHQuZXF1YWxzKGxlZnQubWF4aW11bSwgcmlnaHQubWF4aW11bSk7CiAgICAgIH07CiAgICAgIGludGVyc2VjdFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIEF4aXNBbGlnbmVkQm91bmRpbmdCb3guaW50ZXJzZWN0UGxhbmUgPSBmdW5jdGlvbihib3gsIHBsYW5lKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJib3giLCBib3gpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgicGxhbmUiLCBwbGFuZSk7CiAgICAgICAgaW50ZXJzZWN0U2NyYXRjaCA9IENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdCgKICAgICAgICAgIGJveC5tYXhpbXVtLAogICAgICAgICAgYm94Lm1pbmltdW0sCiAgICAgICAgICBpbnRlcnNlY3RTY3JhdGNoCiAgICAgICAgKTsKICAgICAgICBjb25zdCBoID0gQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoCiAgICAgICAgICBpbnRlcnNlY3RTY3JhdGNoLAogICAgICAgICAgMC41LAogICAgICAgICAgaW50ZXJzZWN0U2NyYXRjaAogICAgICAgICk7CiAgICAgICAgY29uc3Qgbm9ybWFsMiA9IHBsYW5lLm5vcm1hbDsKICAgICAgICBjb25zdCBlID0gaC54ICogTWF0aC5hYnMobm9ybWFsMi54KSArIGgueSAqIE1hdGguYWJzKG5vcm1hbDIueSkgKyBoLnogKiBNYXRoLmFicyhub3JtYWwyLnopOwogICAgICAgIGNvbnN0IHMgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KGJveC5jZW50ZXIsIG5vcm1hbDIpICsgcGxhbmUuZGlzdGFuY2U7CiAgICAgICAgaWYgKHMgLSBlID4gMCkgewogICAgICAgICAgcmV0dXJuIEludGVyc2VjdF9kZWZhdWx0LklOU0lERTsKICAgICAgICB9CiAgICAgICAgaWYgKHMgKyBlIDwgMCkgewogICAgICAgICAgcmV0dXJuIEludGVyc2VjdF9kZWZhdWx0Lk9VVFNJREU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBJbnRlcnNlY3RfZGVmYXVsdC5JTlRFUlNFQ1RJTkc7CiAgICAgIH07CiAgICAgIEF4aXNBbGlnbmVkQm91bmRpbmdCb3gucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIEF4aXNBbGlnbmVkQm91bmRpbmdCb3guY2xvbmUodGhpcywgcmVzdWx0KTsKICAgICAgfTsKICAgICAgQXhpc0FsaWduZWRCb3VuZGluZ0JveC5wcm90b3R5cGUuaW50ZXJzZWN0UGxhbmUgPSBmdW5jdGlvbihwbGFuZSkgewogICAgICAgIHJldHVybiBBeGlzQWxpZ25lZEJvdW5kaW5nQm94LmludGVyc2VjdFBsYW5lKHRoaXMsIHBsYW5lKTsKICAgICAgfTsKICAgICAgQXhpc0FsaWduZWRCb3VuZGluZ0JveC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24ocmlnaHQpIHsKICAgICAgICByZXR1cm4gQXhpc0FsaWduZWRCb3VuZGluZ0JveC5lcXVhbHModGhpcywgcmlnaHQpOwogICAgICB9OwogICAgICBBeGlzQWxpZ25lZEJvdW5kaW5nQm94X2RlZmF1bHQgPSBBeGlzQWxpZ25lZEJvdW5kaW5nQm94OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvRWxsaXBzb2lkVGFuZ2VudFBsYW5lLmpzCiAgZnVuY3Rpb24gRWxsaXBzb2lkVGFuZ2VudFBsYW5lKG9yaWdpbiwgZWxsaXBzb2lkKSB7CiAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoIm9yaWdpbiIsIG9yaWdpbik7CiAgICBlbGxpcHNvaWQgPSBlbGxpcHNvaWQgPz8gRWxsaXBzb2lkX2RlZmF1bHQuZGVmYXVsdDsKICAgIG9yaWdpbiA9IGVsbGlwc29pZC5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKG9yaWdpbik7CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChvcmlnaW4pKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICJvcmlnaW4gbXVzdCBub3QgYmUgYXQgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzb2lkLiIKICAgICAgKTsKICAgIH0KICAgIGNvbnN0IGVhc3ROb3J0aFVwID0gVHJhbnNmb3Jtc19kZWZhdWx0LmVhc3ROb3J0aFVwVG9GaXhlZEZyYW1lKG9yaWdpbiwgZWxsaXBzb2lkKTsKICAgIHRoaXMuX2VsbGlwc29pZCA9IGVsbGlwc29pZDsKICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKICAgIHRoaXMuX3hBeGlzID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21DYXJ0ZXNpYW40KAogICAgICBNYXRyaXg0X2RlZmF1bHQuZ2V0Q29sdW1uKGVhc3ROb3J0aFVwLCAwLCBzY3JhdGNoQ2FydDQpCiAgICApOwogICAgdGhpcy5feUF4aXMgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUNhcnRlc2lhbjQoCiAgICAgIE1hdHJpeDRfZGVmYXVsdC5nZXRDb2x1bW4oZWFzdE5vcnRoVXAsIDEsIHNjcmF0Y2hDYXJ0NCkKICAgICk7CiAgICBjb25zdCBub3JtYWwyID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21DYXJ0ZXNpYW40KAogICAgICBNYXRyaXg0X2RlZmF1bHQuZ2V0Q29sdW1uKGVhc3ROb3J0aFVwLCAyLCBzY3JhdGNoQ2FydDQpCiAgICApOwogICAgdGhpcy5fcGxhbmUgPSBQbGFuZV9kZWZhdWx0LmZyb21Qb2ludE5vcm1hbChvcmlnaW4sIG5vcm1hbDIpOwogIH0KICB2YXIgc2NyYXRjaENhcnQ0LCB0bXAsIHNjcmF0Y2hQcm9qZWN0UG9pbnRPbnRvUGxhbmVSYXksIHNjcmF0Y2hQcm9qZWN0UG9pbnRPbnRvUGxhbmVDYXJ0ZXNpYW4zLCBwcm9qZWN0UG9pbnRzT250b0VsbGlwc29pZFNjcmF0Y2gsIEVsbGlwc29pZFRhbmdlbnRQbGFuZV9kZWZhdWx0OwogIHZhciBpbml0X0VsbGlwc29pZFRhbmdlbnRQbGFuZSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvRWxsaXBzb2lkVGFuZ2VudFBsYW5lLmpzIigpIHsKICAgICAgaW5pdF9BeGlzQWxpZ25lZEJvdW5kaW5nQm94KCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMigpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW40KCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9JbnRlcnNlY3Rpb25UZXN0cygpOwogICAgICBpbml0X01hdHJpeDQoKTsKICAgICAgaW5pdF9QbGFuZSgpOwogICAgICBpbml0X1JheSgpOwogICAgICBpbml0X1RyYW5zZm9ybXMoKTsKICAgICAgc2NyYXRjaENhcnQ0ID0gbmV3IENhcnRlc2lhbjRfZGVmYXVsdCgpOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhFbGxpcHNvaWRUYW5nZW50UGxhbmUucHJvdG90eXBlLCB7CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZWxsaXBzb2lkLgogICAgICAgICAqIEBtZW1iZXJvZiBFbGxpcHNvaWRUYW5nZW50UGxhbmUucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge0VsbGlwc29pZH0KICAgICAgICAgKi8KICAgICAgICBlbGxpcHNvaWQ6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbGxpcHNvaWQ7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBvcmlnaW4uCiAgICAgICAgICogQG1lbWJlcm9mIEVsbGlwc29pZFRhbmdlbnRQbGFuZS5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7Q2FydGVzaWFuM30KICAgICAgICAgKi8KICAgICAgICBvcmlnaW46IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcmlnaW47CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBwbGFuZSB3aGljaCBpcyB0YW5nZW50IHRvIHRoZSBlbGxpcHNvaWQuCiAgICAgICAgICogQG1lbWJlcm9mIEVsbGlwc29pZFRhbmdlbnRQbGFuZS5wcm90b3R5cGUKICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKiBAdHlwZSB7UGxhbmV9CiAgICAgICAgICovCiAgICAgICAgcGxhbmU6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wbGFuZTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGxvY2FsIFgtYXhpcyAoZWFzdCkgb2YgdGhlIHRhbmdlbnQgcGxhbmUuCiAgICAgICAgICogQG1lbWJlcm9mIEVsbGlwc29pZFRhbmdlbnRQbGFuZS5wcm90b3R5cGUKICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKiBAdHlwZSB7Q2FydGVzaWFuM30KICAgICAgICAgKi8KICAgICAgICB4QXhpczogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3hBeGlzOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgbG9jYWwgWS1heGlzIChub3J0aCkgb2YgdGhlIHRhbmdlbnQgcGxhbmUuCiAgICAgICAgICogQG1lbWJlcm9mIEVsbGlwc29pZFRhbmdlbnRQbGFuZS5wcm90b3R5cGUKICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKiBAdHlwZSB7Q2FydGVzaWFuM30KICAgICAgICAgKi8KICAgICAgICB5QXhpczogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3lBeGlzOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgbG9jYWwgWi1heGlzICh1cCkgb2YgdGhlIHRhbmdlbnQgcGxhbmUuCiAgICAgICAgICogQG1lbWJlcm9mIEVsbGlwc29pZFRhbmdlbnRQbGFuZS5wcm90b3R5cGUKICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKiBAdHlwZSB7Q2FydGVzaWFuM30KICAgICAgICAgKi8KICAgICAgICB6QXhpczogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BsYW5lLm5vcm1hbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICB0bXAgPSBuZXcgQXhpc0FsaWduZWRCb3VuZGluZ0JveF9kZWZhdWx0KCk7CiAgICAgIEVsbGlwc29pZFRhbmdlbnRQbGFuZS5mcm9tUG9pbnRzID0gZnVuY3Rpb24oY2FydGVzaWFucywgZWxsaXBzb2lkKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJjYXJ0ZXNpYW5zIiwgY2FydGVzaWFucyk7CiAgICAgICAgY29uc3QgYm94ID0gQXhpc0FsaWduZWRCb3VuZGluZ0JveF9kZWZhdWx0LmZyb21Qb2ludHMoY2FydGVzaWFucywgdG1wKTsKICAgICAgICByZXR1cm4gbmV3IEVsbGlwc29pZFRhbmdlbnRQbGFuZShib3guY2VudGVyLCBlbGxpcHNvaWQpOwogICAgICB9OwogICAgICBzY3JhdGNoUHJvamVjdFBvaW50T250b1BsYW5lUmF5ID0gbmV3IFJheV9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hQcm9qZWN0UG9pbnRPbnRvUGxhbmVDYXJ0ZXNpYW4zID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBFbGxpcHNvaWRUYW5nZW50UGxhbmUucHJvdG90eXBlLnByb2plY3RQb2ludE9udG9QbGFuZSA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImNhcnRlc2lhbiIsIGNhcnRlc2lhbjExKTsKICAgICAgICBjb25zdCByYXkgPSBzY3JhdGNoUHJvamVjdFBvaW50T250b1BsYW5lUmF5OwogICAgICAgIHJheS5vcmlnaW4gPSBjYXJ0ZXNpYW4xMTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKGNhcnRlc2lhbjExLCByYXkuZGlyZWN0aW9uKTsKICAgICAgICBsZXQgaW50ZXJzZWN0aW9uUG9pbnQgPSBJbnRlcnNlY3Rpb25UZXN0c19kZWZhdWx0LnJheVBsYW5lKAogICAgICAgICAgcmF5LAogICAgICAgICAgdGhpcy5fcGxhbmUsCiAgICAgICAgICBzY3JhdGNoUHJvamVjdFBvaW50T250b1BsYW5lQ2FydGVzaWFuMwogICAgICAgICk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaW50ZXJzZWN0aW9uUG9pbnQpKSB7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKHJheS5kaXJlY3Rpb24sIHJheS5kaXJlY3Rpb24pOwogICAgICAgICAgaW50ZXJzZWN0aW9uUG9pbnQgPSBJbnRlcnNlY3Rpb25UZXN0c19kZWZhdWx0LnJheVBsYW5lKAogICAgICAgICAgICByYXksCiAgICAgICAgICAgIHRoaXMuX3BsYW5lLAogICAgICAgICAgICBzY3JhdGNoUHJvamVjdFBvaW50T250b1BsYW5lQ2FydGVzaWFuMwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChpbnRlcnNlY3Rpb25Qb2ludCkpIHsKICAgICAgICAgIGNvbnN0IHYzID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KAogICAgICAgICAgICBpbnRlcnNlY3Rpb25Qb2ludCwKICAgICAgICAgICAgdGhpcy5fb3JpZ2luLAogICAgICAgICAgICBpbnRlcnNlY3Rpb25Qb2ludAogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IHggPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KHRoaXMuX3hBeGlzLCB2Myk7CiAgICAgICAgICBjb25zdCB5ID0gQ2FydGVzaWFuM19kZWZhdWx0LmRvdCh0aGlzLl95QXhpcywgdjMpOwogICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCh4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdC54ID0geDsKICAgICAgICAgIHJlc3VsdC55ID0geTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH07CiAgICAgIEVsbGlwc29pZFRhbmdlbnRQbGFuZS5wcm90b3R5cGUucHJvamVjdFBvaW50c09udG9QbGFuZSA9IGZ1bmN0aW9uKGNhcnRlc2lhbnMsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiY2FydGVzaWFucyIsIGNhcnRlc2lhbnMpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IFtdOwogICAgICAgIH0KICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IGNhcnRlc2lhbnMubGVuZ3RoOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLnByb2plY3RQb2ludE9udG9QbGFuZShjYXJ0ZXNpYW5zW2ldLCByZXN1bHRbY291bnRdKTsKICAgICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQocCkpIHsKICAgICAgICAgICAgcmVzdWx0W2NvdW50XSA9IHA7CiAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5sZW5ndGggPSBjb3VudDsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBFbGxpcHNvaWRUYW5nZW50UGxhbmUucHJvdG90eXBlLnByb2plY3RQb2ludFRvTmVhcmVzdE9uUGxhbmUgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgICBjb25zdCByYXkgPSBzY3JhdGNoUHJvamVjdFBvaW50T250b1BsYW5lUmF5OwogICAgICAgIHJheS5vcmlnaW4gPSBjYXJ0ZXNpYW4xMTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUodGhpcy5fcGxhbmUubm9ybWFsLCByYXkuZGlyZWN0aW9uKTsKICAgICAgICBsZXQgaW50ZXJzZWN0aW9uUG9pbnQgPSBJbnRlcnNlY3Rpb25UZXN0c19kZWZhdWx0LnJheVBsYW5lKAogICAgICAgICAgcmF5LAogICAgICAgICAgdGhpcy5fcGxhbmUsCiAgICAgICAgICBzY3JhdGNoUHJvamVjdFBvaW50T250b1BsYW5lQ2FydGVzaWFuMwogICAgICAgICk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaW50ZXJzZWN0aW9uUG9pbnQpKSB7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKHJheS5kaXJlY3Rpb24sIHJheS5kaXJlY3Rpb24pOwogICAgICAgICAgaW50ZXJzZWN0aW9uUG9pbnQgPSBJbnRlcnNlY3Rpb25UZXN0c19kZWZhdWx0LnJheVBsYW5lKAogICAgICAgICAgICByYXksCiAgICAgICAgICAgIHRoaXMuX3BsYW5lLAogICAgICAgICAgICBzY3JhdGNoUHJvamVjdFBvaW50T250b1BsYW5lQ2FydGVzaWFuMwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdjMgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoCiAgICAgICAgICBpbnRlcnNlY3Rpb25Qb2ludCwKICAgICAgICAgIHRoaXMuX29yaWdpbiwKICAgICAgICAgIGludGVyc2VjdGlvblBvaW50CiAgICAgICAgKTsKICAgICAgICBjb25zdCB4ID0gQ2FydGVzaWFuM19kZWZhdWx0LmRvdCh0aGlzLl94QXhpcywgdjMpOwogICAgICAgIGNvbnN0IHkgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KHRoaXMuX3lBeGlzLCB2Myk7CiAgICAgICAgcmVzdWx0LnggPSB4OwogICAgICAgIHJlc3VsdC55ID0geTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBFbGxpcHNvaWRUYW5nZW50UGxhbmUucHJvdG90eXBlLnByb2plY3RQb2ludHNUb05lYXJlc3RPblBsYW5lID0gZnVuY3Rpb24oY2FydGVzaWFucywgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJjYXJ0ZXNpYW5zIiwgY2FydGVzaWFucyk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gW107CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxlbmd0aCA9IGNhcnRlc2lhbnMubGVuZ3RoOwogICAgICAgIHJlc3VsdC5sZW5ndGggPSBsZW5ndGg7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgcmVzdWx0W2ldID0gdGhpcy5wcm9qZWN0UG9pbnRUb05lYXJlc3RPblBsYW5lKGNhcnRlc2lhbnNbaV0sIHJlc3VsdFtpXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHByb2plY3RQb2ludHNPbnRvRWxsaXBzb2lkU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgRWxsaXBzb2lkVGFuZ2VudFBsYW5lLnByb3RvdHlwZS5wcm9qZWN0UG9pbnRPbnRvRWxsaXBzb2lkID0gZnVuY3Rpb24oY2FydGVzaWFuMTEsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gdGhpcy5fZWxsaXBzb2lkOwogICAgICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMuX29yaWdpbjsKICAgICAgICBjb25zdCB4QXhpcyA9IHRoaXMuX3hBeGlzOwogICAgICAgIGNvbnN0IHlBeGlzID0gdGhpcy5feUF4aXM7CiAgICAgICAgY29uc3QgdG1wMiA9IHByb2plY3RQb2ludHNPbnRvRWxsaXBzb2lkU2NyYXRjaDsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcih4QXhpcywgY2FydGVzaWFuMTEueCwgdG1wMik7CiAgICAgICAgcmVzdWx0ID0gQ2FydGVzaWFuM19kZWZhdWx0LmFkZChvcmlnaW4sIHRtcDIsIHJlc3VsdCk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoeUF4aXMsIGNhcnRlc2lhbjExLnksIHRtcDIpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQocmVzdWx0LCB0bXAyLCByZXN1bHQpOwogICAgICAgIGVsbGlwc29pZC5zY2FsZVRvR2VvY2VudHJpY1N1cmZhY2UocmVzdWx0LCByZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEVsbGlwc29pZFRhbmdlbnRQbGFuZS5wcm90b3R5cGUucHJvamVjdFBvaW50c09udG9FbGxpcHNvaWQgPSBmdW5jdGlvbihjYXJ0ZXNpYW5zLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImNhcnRlc2lhbnMiLCBjYXJ0ZXNpYW5zKTsKICAgICAgICBjb25zdCBsZW5ndGggPSBjYXJ0ZXNpYW5zLmxlbmd0aDsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXkobGVuZ3RoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0Lmxlbmd0aCA9IGxlbmd0aDsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgcmVzdWx0W2ldID0gdGhpcy5wcm9qZWN0UG9pbnRPbnRvRWxsaXBzb2lkKGNhcnRlc2lhbnNbaV0sIHJlc3VsdFtpXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEVsbGlwc29pZFRhbmdlbnRQbGFuZV9kZWZhdWx0ID0gRWxsaXBzb2lkVGFuZ2VudFBsYW5lOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvT3JpZW50ZWRCb3VuZGluZ0JveC5qcwogIGZ1bmN0aW9uIE9yaWVudGVkQm91bmRpbmdCb3goY2VudGVyLCBoYWxmQXhlcykgewogICAgdGhpcy5jZW50ZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY2VudGVyID8/IENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPKTsKICAgIHRoaXMuaGFsZkF4ZXMgPSBNYXRyaXgzX2RlZmF1bHQuY2xvbmUoaGFsZkF4ZXMgPz8gTWF0cml4M19kZWZhdWx0LlpFUk8pOwogIH0KICBmdW5jdGlvbiBmcm9tUGxhbmVFeHRlbnRzKHBsYW5lT3JpZ2luLCBwbGFuZVhBeGlzLCBwbGFuZVlBeGlzLCBwbGFuZVpBeGlzLCBtaW5pbXVtWCwgbWF4aW11bVgsIG1pbmltdW1ZLCBtYXhpbXVtWSwgbWluaW11bVosIG1heGltdW1aLCByZXN1bHQpIHsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KG1pbmltdW1YKSB8fCAhZGVmaW5lZF9kZWZhdWx0KG1heGltdW1YKSB8fCAhZGVmaW5lZF9kZWZhdWx0KG1pbmltdW1ZKSB8fCAhZGVmaW5lZF9kZWZhdWx0KG1heGltdW1ZKSB8fCAhZGVmaW5lZF9kZWZhdWx0KG1pbmltdW1aKSB8fCAhZGVmaW5lZF9kZWZhdWx0KG1heGltdW1aKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAiYWxsIGV4dGVudHMgKG1pbmltdW0vbWF4aW11bSBYL1kvWikgYXJlIHJlcXVpcmVkLiIKICAgICAgKTsKICAgIH0KICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgcmVzdWx0ID0gbmV3IE9yaWVudGVkQm91bmRpbmdCb3goKTsKICAgIH0KICAgIGNvbnN0IGhhbGZBeGVzID0gcmVzdWx0LmhhbGZBeGVzOwogICAgTWF0cml4M19kZWZhdWx0LnNldENvbHVtbihoYWxmQXhlcywgMCwgcGxhbmVYQXhpcywgaGFsZkF4ZXMpOwogICAgTWF0cml4M19kZWZhdWx0LnNldENvbHVtbihoYWxmQXhlcywgMSwgcGxhbmVZQXhpcywgaGFsZkF4ZXMpOwogICAgTWF0cml4M19kZWZhdWx0LnNldENvbHVtbihoYWxmQXhlcywgMiwgcGxhbmVaQXhpcywgaGFsZkF4ZXMpOwogICAgbGV0IGNlbnRlck9mZnNldCA9IHNjcmF0Y2hPZmZzZXQ7CiAgICBjZW50ZXJPZmZzZXQueCA9IChtaW5pbXVtWCArIG1heGltdW1YKSAvIDI7CiAgICBjZW50ZXJPZmZzZXQueSA9IChtaW5pbXVtWSArIG1heGltdW1ZKSAvIDI7CiAgICBjZW50ZXJPZmZzZXQueiA9IChtaW5pbXVtWiArIG1heGltdW1aKSAvIDI7CiAgICBjb25zdCBzY2FsZSA9IHNjcmF0Y2hTY2FsZTI7CiAgICBzY2FsZS54ID0gKG1heGltdW1YIC0gbWluaW11bVgpIC8gMjsKICAgIHNjYWxlLnkgPSAobWF4aW11bVkgLSBtaW5pbXVtWSkgLyAyOwogICAgc2NhbGUueiA9IChtYXhpbXVtWiAtIG1pbmltdW1aKSAvIDI7CiAgICBjb25zdCBjZW50ZXIgPSByZXN1bHQuY2VudGVyOwogICAgY2VudGVyT2Zmc2V0ID0gTWF0cml4M19kZWZhdWx0Lm11bHRpcGx5QnlWZWN0b3IoaGFsZkF4ZXMsIGNlbnRlck9mZnNldCwgY2VudGVyT2Zmc2V0KTsKICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQocGxhbmVPcmlnaW4sIGNlbnRlck9mZnNldCwgY2VudGVyKTsKICAgIE1hdHJpeDNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGUoaGFsZkF4ZXMsIHNjYWxlLCBoYWxmQXhlcyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICB2YXIgc2NyYXRjaENhcnRlc2lhbjE1LCBzY3JhdGNoQ2FydGVzaWFuMjUsIHNjcmF0Y2hDYXJ0ZXNpYW4zNiwgc2NyYXRjaENhcnRlc2lhbjQyLCBzY3JhdGNoQ2FydGVzaWFuNSwgc2NyYXRjaENhcnRlc2lhbjYsIHNjcmF0Y2hDb3ZhcmlhbmNlUmVzdWx0LCBzY3JhdGNoRWlnZW5SZXN1bHQsIHNjcmF0Y2hPZmZzZXQsIHNjcmF0Y2hTY2FsZTIsIHNjcmF0Y2hSZWN0YW5nbGVDZW50ZXJDYXJ0b2dyYXBoaWMsIHNjcmF0Y2hSZWN0YW5nbGVDZW50ZXIsIHNjcmF0Y2hQZXJpbWV0ZXJDYXJ0b2dyYXBoaWNOQywgc2NyYXRjaFBlcmltZXRlckNhcnRvZ3JhcGhpY05XLCBzY3JhdGNoUGVyaW1ldGVyQ2FydG9ncmFwaGljQ1csIHNjcmF0Y2hQZXJpbWV0ZXJDYXJ0b2dyYXBoaWNTVywgc2NyYXRjaFBlcmltZXRlckNhcnRvZ3JhcGhpY1NDLCBzY3JhdGNoUGVyaW1ldGVyQ2FydGVzaWFuTkMsIHNjcmF0Y2hQZXJpbWV0ZXJDYXJ0ZXNpYW5OVywgc2NyYXRjaFBlcmltZXRlckNhcnRlc2lhbkNXLCBzY3JhdGNoUGVyaW1ldGVyQ2FydGVzaWFuU1csIHNjcmF0Y2hQZXJpbWV0ZXJDYXJ0ZXNpYW5TQywgc2NyYXRjaFBlcmltZXRlclByb2plY3RlZE5DLCBzY3JhdGNoUGVyaW1ldGVyUHJvamVjdGVkTlcsIHNjcmF0Y2hQZXJpbWV0ZXJQcm9qZWN0ZWRDVywgc2NyYXRjaFBlcmltZXRlclByb2plY3RlZFNXLCBzY3JhdGNoUGVyaW1ldGVyUHJvamVjdGVkU0MsIHNjcmF0Y2hQbGFuZU9yaWdpbiwgc2NyYXRjaFBsYW5lTm9ybWFsLCBzY3JhdGNoUGxhbmVYQXhpcywgc2NyYXRjaEhvcml6b25DYXJ0ZXNpYW4sIHNjcmF0Y2hIb3Jpem9uUHJvamVjdGVkLCBzY3JhdGNoTWF4WSwgc2NyYXRjaE1pblksIHNjcmF0Y2haLCBzY3JhdGNoUGxhbmUsIHNjcmF0Y2hDYXJ0ZXNpYW5VLCBzY3JhdGNoQ2FydGVzaWFuViwgc2NyYXRjaENhcnRlc2lhblcsIHNjcmF0Y2hWYWxpZEF4aXMyLCBzY3JhdGNoVmFsaWRBeGlzMywgc2NyYXRjaFBQcmltZSwgc2NyYXRjaENvcm5lciwgc2NyYXRjaFRvQ2VudGVyLCBzY3JhdGNoWEF4aXMsIHNjcmF0Y2hZQXhpcywgc2NyYXRjaFpBeGlzLCBzY3JhdGNoUm90YXRpb25TY2FsZSwgc2NyYXRjaEJvdW5kaW5nU3BoZXJlLCBPcmllbnRlZEJvdW5kaW5nQm94X2RlZmF1bHQ7CiAgdmFyIGluaXRfT3JpZW50ZWRCb3VuZGluZ0JveCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvT3JpZW50ZWRCb3VuZGluZ0JveC5qcyIoKSB7CiAgICAgIGluaXRfQm91bmRpbmdTcGhlcmUoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4yKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRvZ3JhcGhpYygpOwogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkVGFuZ2VudFBsYW5lKCk7CiAgICAgIGluaXRfSW50ZXJzZWN0KCk7CiAgICAgIGluaXRfSW50ZXJ2YWwoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGluaXRfTWF0cml4MygpOwogICAgICBpbml0X01hdHJpeDQoKTsKICAgICAgaW5pdF9QbGFuZSgpOwogICAgICBpbml0X1JlY3RhbmdsZSgpOwogICAgICBPcmllbnRlZEJvdW5kaW5nQm94LnBhY2tlZExlbmd0aCA9IENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyBNYXRyaXgzX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICBPcmllbnRlZEJvdW5kaW5nQm94LnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayh2YWx1ZS5jZW50ZXIsIGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICBNYXRyaXgzX2RlZmF1bHQucGFjayh2YWx1ZS5oYWxmQXhlcywgYXJyYXksIHN0YXJ0aW5nSW5kZXggKyBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoKTsKICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH07CiAgICAgIE9yaWVudGVkQm91bmRpbmdCb3gudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgT3JpZW50ZWRCb3VuZGluZ0JveCgpOwogICAgICAgIH0KICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKGFycmF5LCBzdGFydGluZ0luZGV4LCByZXN1bHQuY2VudGVyKTsKICAgICAgICBNYXRyaXgzX2RlZmF1bHQudW5wYWNrKAogICAgICAgICAgYXJyYXksCiAgICAgICAgICBzdGFydGluZ0luZGV4ICsgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aCwKICAgICAgICAgIHJlc3VsdC5oYWxmQXhlcwogICAgICAgICk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgc2NyYXRjaENhcnRlc2lhbjE1ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydGVzaWFuMjUgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zNiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaENhcnRlc2lhbjQyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydGVzaWFuNSA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaENhcnRlc2lhbjYgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDb3ZhcmlhbmNlUmVzdWx0ID0gbmV3IE1hdHJpeDNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoRWlnZW5SZXN1bHQgPSB7CiAgICAgICAgdW5pdGFyeTogbmV3IE1hdHJpeDNfZGVmYXVsdCgpLAogICAgICAgIGRpYWdvbmFsOiBuZXcgTWF0cml4M19kZWZhdWx0KCkKICAgICAgfTsKICAgICAgT3JpZW50ZWRCb3VuZGluZ0JveC5mcm9tUG9pbnRzID0gZnVuY3Rpb24ocG9zaXRpb25zLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgT3JpZW50ZWRCb3VuZGluZ0JveCgpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwb3NpdGlvbnMpIHx8IHBvc2l0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJlc3VsdC5oYWxmQXhlcyA9IE1hdHJpeDNfZGVmYXVsdC5aRVJPOwogICAgICAgICAgcmVzdWx0LmNlbnRlciA9IENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgbGV0IGk7CiAgICAgICAgY29uc3QgbGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aDsKICAgICAgICBjb25zdCBtZWFuUG9pbnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUocG9zaXRpb25zWzBdLCBzY3JhdGNoQ2FydGVzaWFuMTUpOwogICAgICAgIGZvciAoaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChtZWFuUG9pbnQsIHBvc2l0aW9uc1tpXSwgbWVhblBvaW50KTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaW52TGVuZ3RoID0gMSAvIGxlbmd0aDsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihtZWFuUG9pbnQsIGludkxlbmd0aCwgbWVhblBvaW50KTsKICAgICAgICBsZXQgZXh4ID0gMDsKICAgICAgICBsZXQgZXh5ID0gMDsKICAgICAgICBsZXQgZXh6ID0gMDsKICAgICAgICBsZXQgZXl5ID0gMDsKICAgICAgICBsZXQgZXl6ID0gMDsKICAgICAgICBsZXQgZXp6ID0gMDsKICAgICAgICBsZXQgcDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHAgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QocG9zaXRpb25zW2ldLCBtZWFuUG9pbnQsIHNjcmF0Y2hDYXJ0ZXNpYW4yNSk7CiAgICAgICAgICBleHggKz0gcC54ICogcC54OwogICAgICAgICAgZXh5ICs9IHAueCAqIHAueTsKICAgICAgICAgIGV4eiArPSBwLnggKiBwLno7CiAgICAgICAgICBleXkgKz0gcC55ICogcC55OwogICAgICAgICAgZXl6ICs9IHAueSAqIHAuejsKICAgICAgICAgIGV6eiArPSBwLnogKiBwLno7CiAgICAgICAgfQogICAgICAgIGV4eCAqPSBpbnZMZW5ndGg7CiAgICAgICAgZXh5ICo9IGludkxlbmd0aDsKICAgICAgICBleHogKj0gaW52TGVuZ3RoOwogICAgICAgIGV5eSAqPSBpbnZMZW5ndGg7CiAgICAgICAgZXl6ICo9IGludkxlbmd0aDsKICAgICAgICBlenogKj0gaW52TGVuZ3RoOwogICAgICAgIGNvbnN0IGNvdmFyaWFuY2VNYXRyaXggPSBzY3JhdGNoQ292YXJpYW5jZVJlc3VsdDsKICAgICAgICBjb3ZhcmlhbmNlTWF0cml4WzBdID0gZXh4OwogICAgICAgIGNvdmFyaWFuY2VNYXRyaXhbMV0gPSBleHk7CiAgICAgICAgY292YXJpYW5jZU1hdHJpeFsyXSA9IGV4ejsKICAgICAgICBjb3ZhcmlhbmNlTWF0cml4WzNdID0gZXh5OwogICAgICAgIGNvdmFyaWFuY2VNYXRyaXhbNF0gPSBleXk7CiAgICAgICAgY292YXJpYW5jZU1hdHJpeFs1XSA9IGV5ejsKICAgICAgICBjb3ZhcmlhbmNlTWF0cml4WzZdID0gZXh6OwogICAgICAgIGNvdmFyaWFuY2VNYXRyaXhbN10gPSBleXo7CiAgICAgICAgY292YXJpYW5jZU1hdHJpeFs4XSA9IGV6ejsKICAgICAgICBjb25zdCBlaWdlbkRlY29tcG9zaXRpb24gPSBNYXRyaXgzX2RlZmF1bHQuY29tcHV0ZUVpZ2VuRGVjb21wb3NpdGlvbigKICAgICAgICAgIGNvdmFyaWFuY2VNYXRyaXgsCiAgICAgICAgICBzY3JhdGNoRWlnZW5SZXN1bHQKICAgICAgICApOwogICAgICAgIGNvbnN0IHJvdGF0aW9uID0gTWF0cml4M19kZWZhdWx0LmNsb25lKGVpZ2VuRGVjb21wb3NpdGlvbi51bml0YXJ5LCByZXN1bHQuaGFsZkF4ZXMpOwogICAgICAgIGxldCB2MTIgPSBNYXRyaXgzX2RlZmF1bHQuZ2V0Q29sdW1uKHJvdGF0aW9uLCAwLCBzY3JhdGNoQ2FydGVzaWFuNDIpOwogICAgICAgIGxldCB2MjIgPSBNYXRyaXgzX2RlZmF1bHQuZ2V0Q29sdW1uKHJvdGF0aW9uLCAxLCBzY3JhdGNoQ2FydGVzaWFuNSk7CiAgICAgICAgbGV0IHYzID0gTWF0cml4M19kZWZhdWx0LmdldENvbHVtbihyb3RhdGlvbiwgMiwgc2NyYXRjaENhcnRlc2lhbjYpOwogICAgICAgIGxldCB1MTIgPSAtTnVtYmVyLk1BWF9WQUxVRTsKICAgICAgICBsZXQgdTIyID0gLU51bWJlci5NQVhfVkFMVUU7CiAgICAgICAgbGV0IHUzID0gLU51bWJlci5NQVhfVkFMVUU7CiAgICAgICAgbGV0IGwxID0gTnVtYmVyLk1BWF9WQUxVRTsKICAgICAgICBsZXQgbDIgPSBOdW1iZXIuTUFYX1ZBTFVFOwogICAgICAgIGxldCBsMyA9IE51bWJlci5NQVhfVkFMVUU7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBwID0gcG9zaXRpb25zW2ldOwogICAgICAgICAgdTEyID0gTWF0aC5tYXgoQ2FydGVzaWFuM19kZWZhdWx0LmRvdCh2MTIsIHApLCB1MTIpOwogICAgICAgICAgdTIyID0gTWF0aC5tYXgoQ2FydGVzaWFuM19kZWZhdWx0LmRvdCh2MjIsIHApLCB1MjIpOwogICAgICAgICAgdTMgPSBNYXRoLm1heChDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KHYzLCBwKSwgdTMpOwogICAgICAgICAgbDEgPSBNYXRoLm1pbihDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KHYxMiwgcCksIGwxKTsKICAgICAgICAgIGwyID0gTWF0aC5taW4oQ2FydGVzaWFuM19kZWZhdWx0LmRvdCh2MjIsIHApLCBsMik7CiAgICAgICAgICBsMyA9IE1hdGgubWluKENhcnRlc2lhbjNfZGVmYXVsdC5kb3QodjMsIHApLCBsMyk7CiAgICAgICAgfQogICAgICAgIHYxMiA9IENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKHYxMiwgMC41ICogKGwxICsgdTEyKSwgdjEyKTsKICAgICAgICB2MjIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcih2MjIsIDAuNSAqIChsMiArIHUyMiksIHYyMik7CiAgICAgICAgdjMgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcih2MywgMC41ICogKGwzICsgdTMpLCB2Myk7CiAgICAgICAgY29uc3QgY2VudGVyID0gQ2FydGVzaWFuM19kZWZhdWx0LmFkZCh2MTIsIHYyMiwgcmVzdWx0LmNlbnRlcik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChjZW50ZXIsIHYzLCBjZW50ZXIpOwogICAgICAgIGNvbnN0IHNjYWxlID0gc2NyYXRjaENhcnRlc2lhbjM2OwogICAgICAgIHNjYWxlLnggPSB1MTIgLSBsMTsKICAgICAgICBzY2FsZS55ID0gdTIyIC0gbDI7CiAgICAgICAgc2NhbGUueiA9IHUzIC0gbDM7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoc2NhbGUsIDAuNSwgc2NhbGUpOwogICAgICAgIE1hdHJpeDNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGUocmVzdWx0LmhhbGZBeGVzLCBzY2FsZSwgcmVzdWx0LmhhbGZBeGVzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBzY3JhdGNoT2Zmc2V0ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoU2NhbGUyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoUmVjdGFuZ2xlQ2VudGVyQ2FydG9ncmFwaGljID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hSZWN0YW5nbGVDZW50ZXIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hQZXJpbWV0ZXJDYXJ0b2dyYXBoaWNOQyA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoUGVyaW1ldGVyQ2FydG9ncmFwaGljTlcgPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFBlcmltZXRlckNhcnRvZ3JhcGhpY0NXID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hQZXJpbWV0ZXJDYXJ0b2dyYXBoaWNTVyA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoUGVyaW1ldGVyQ2FydG9ncmFwaGljU0MgPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFBlcmltZXRlckNhcnRlc2lhbk5DID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoUGVyaW1ldGVyQ2FydGVzaWFuTlcgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hQZXJpbWV0ZXJDYXJ0ZXNpYW5DVyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFBlcmltZXRlckNhcnRlc2lhblNXID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoUGVyaW1ldGVyQ2FydGVzaWFuU0MgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hQZXJpbWV0ZXJQcm9qZWN0ZWROQyA9IG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFBlcmltZXRlclByb2plY3RlZE5XID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoUGVyaW1ldGVyUHJvamVjdGVkQ1cgPSBuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hQZXJpbWV0ZXJQcm9qZWN0ZWRTVyA9IG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFBlcmltZXRlclByb2plY3RlZFNDID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoUGxhbmVPcmlnaW4gPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hQbGFuZU5vcm1hbCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFBsYW5lWEF4aXMgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hIb3Jpem9uQ2FydGVzaWFuID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoSG9yaXpvblByb2plY3RlZCA9IG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaE1heFkgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hNaW5ZID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoWiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFBsYW5lID0gbmV3IFBsYW5lX2RlZmF1bHQoQ2FydGVzaWFuM19kZWZhdWx0LlVOSVRfWCwgMCk7CiAgICAgIE9yaWVudGVkQm91bmRpbmdCb3guZnJvbVJlY3RhbmdsZSA9IGZ1bmN0aW9uKHJlY3RhbmdsZSwgbWluaW11bUhlaWdodCwgbWF4aW11bUhlaWdodCwgZWxsaXBzb2lkLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZWN0YW5nbGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgicmVjdGFuZ2xlIGlzIHJlcXVpcmVkIik7CiAgICAgICAgfQogICAgICAgIGlmIChyZWN0YW5nbGUud2lkdGggPCAwIHx8IHJlY3RhbmdsZS53aWR0aCA+IE1hdGhfZGVmYXVsdC5UV09fUEkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJSZWN0YW5nbGUgd2lkdGggbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDIgKiBwaSIpOwogICAgICAgIH0KICAgICAgICBpZiAocmVjdGFuZ2xlLmhlaWdodCA8IDAgfHwgcmVjdGFuZ2xlLmhlaWdodCA+IE1hdGhfZGVmYXVsdC5QSSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIlJlY3RhbmdsZSBoZWlnaHQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIHBpIik7CiAgICAgICAgfQogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoZWxsaXBzb2lkKSAmJiAhTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oCiAgICAgICAgICBlbGxpcHNvaWQucmFkaWkueCwKICAgICAgICAgIGVsbGlwc29pZC5yYWRpaS55LAogICAgICAgICAgTWF0aF9kZWZhdWx0LkVQU0lMT04xNQogICAgICAgICkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAiRWxsaXBzb2lkIG11c3QgYmUgYW4gZWxsaXBzb2lkIG9mIHJldm9sdXRpb24gKHJhZGlpLnggPT0gcmFkaWkueSkiCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBtaW5pbXVtSGVpZ2h0ID0gbWluaW11bUhlaWdodCA/PyAwOwogICAgICAgIG1heGltdW1IZWlnaHQgPSBtYXhpbXVtSGVpZ2h0ID8/IDA7CiAgICAgICAgZWxsaXBzb2lkID0gZWxsaXBzb2lkID8/IEVsbGlwc29pZF9kZWZhdWx0LmRlZmF1bHQ7CiAgICAgICAgbGV0IG1pblgsIG1heFgsIG1pblksIG1heFksIG1pblosIG1heFosIHBsYW5lOwogICAgICAgIGlmIChyZWN0YW5nbGUud2lkdGggPD0gTWF0aF9kZWZhdWx0LlBJKSB7CiAgICAgICAgICBjb25zdCB0YW5nZW50UG9pbnRDYXJ0b2dyYXBoaWMgPSBSZWN0YW5nbGVfZGVmYXVsdC5jZW50ZXIoCiAgICAgICAgICAgIHJlY3RhbmdsZSwKICAgICAgICAgICAgc2NyYXRjaFJlY3RhbmdsZUNlbnRlckNhcnRvZ3JhcGhpYwogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IHRhbmdlbnRQb2ludCA9IGVsbGlwc29pZC5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbigKICAgICAgICAgICAgdGFuZ2VudFBvaW50Q2FydG9ncmFwaGljLAogICAgICAgICAgICBzY3JhdGNoUmVjdGFuZ2xlQ2VudGVyCiAgICAgICAgICApOwogICAgICAgICAgY29uc3QgdGFuZ2VudFBsYW5lID0gbmV3IEVsbGlwc29pZFRhbmdlbnRQbGFuZV9kZWZhdWx0KHRhbmdlbnRQb2ludCwgZWxsaXBzb2lkKTsKICAgICAgICAgIHBsYW5lID0gdGFuZ2VudFBsYW5lLnBsYW5lOwogICAgICAgICAgY29uc3QgbG9uQ2VudGVyID0gdGFuZ2VudFBvaW50Q2FydG9ncmFwaGljLmxvbmdpdHVkZTsKICAgICAgICAgIGNvbnN0IGxhdENlbnRlciA9IHJlY3RhbmdsZS5zb3V0aCA8IDAgJiYgcmVjdGFuZ2xlLm5vcnRoID4gMCA/IDAgOiB0YW5nZW50UG9pbnRDYXJ0b2dyYXBoaWMubGF0aXR1ZGU7CiAgICAgICAgICBjb25zdCBwZXJpbWV0ZXJDYXJ0b2dyYXBoaWNOQyA9IENhcnRvZ3JhcGhpY19kZWZhdWx0LmZyb21SYWRpYW5zKAogICAgICAgICAgICBsb25DZW50ZXIsCiAgICAgICAgICAgIHJlY3RhbmdsZS5ub3J0aCwKICAgICAgICAgICAgbWF4aW11bUhlaWdodCwKICAgICAgICAgICAgc2NyYXRjaFBlcmltZXRlckNhcnRvZ3JhcGhpY05DCiAgICAgICAgICApOwogICAgICAgICAgY29uc3QgcGVyaW1ldGVyQ2FydG9ncmFwaGljTlcgPSBDYXJ0b2dyYXBoaWNfZGVmYXVsdC5mcm9tUmFkaWFucygKICAgICAgICAgICAgcmVjdGFuZ2xlLndlc3QsCiAgICAgICAgICAgIHJlY3RhbmdsZS5ub3J0aCwKICAgICAgICAgICAgbWF4aW11bUhlaWdodCwKICAgICAgICAgICAgc2NyYXRjaFBlcmltZXRlckNhcnRvZ3JhcGhpY05XCiAgICAgICAgICApOwogICAgICAgICAgY29uc3QgcGVyaW1ldGVyQ2FydG9ncmFwaGljQ1cgPSBDYXJ0b2dyYXBoaWNfZGVmYXVsdC5mcm9tUmFkaWFucygKICAgICAgICAgICAgcmVjdGFuZ2xlLndlc3QsCiAgICAgICAgICAgIGxhdENlbnRlciwKICAgICAgICAgICAgbWF4aW11bUhlaWdodCwKICAgICAgICAgICAgc2NyYXRjaFBlcmltZXRlckNhcnRvZ3JhcGhpY0NXCiAgICAgICAgICApOwogICAgICAgICAgY29uc3QgcGVyaW1ldGVyQ2FydG9ncmFwaGljU1cgPSBDYXJ0b2dyYXBoaWNfZGVmYXVsdC5mcm9tUmFkaWFucygKICAgICAgICAgICAgcmVjdGFuZ2xlLndlc3QsCiAgICAgICAgICAgIHJlY3RhbmdsZS5zb3V0aCwKICAgICAgICAgICAgbWF4aW11bUhlaWdodCwKICAgICAgICAgICAgc2NyYXRjaFBlcmltZXRlckNhcnRvZ3JhcGhpY1NXCiAgICAgICAgICApOwogICAgICAgICAgY29uc3QgcGVyaW1ldGVyQ2FydG9ncmFwaGljU0MgPSBDYXJ0b2dyYXBoaWNfZGVmYXVsdC5mcm9tUmFkaWFucygKICAgICAgICAgICAgbG9uQ2VudGVyLAogICAgICAgICAgICByZWN0YW5nbGUuc291dGgsCiAgICAgICAgICAgIG1heGltdW1IZWlnaHQsCiAgICAgICAgICAgIHNjcmF0Y2hQZXJpbWV0ZXJDYXJ0b2dyYXBoaWNTQwogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IHBlcmltZXRlckNhcnRlc2lhbk5DID0gZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKAogICAgICAgICAgICBwZXJpbWV0ZXJDYXJ0b2dyYXBoaWNOQywKICAgICAgICAgICAgc2NyYXRjaFBlcmltZXRlckNhcnRlc2lhbk5DCiAgICAgICAgICApOwogICAgICAgICAgbGV0IHBlcmltZXRlckNhcnRlc2lhbk5XID0gZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKAogICAgICAgICAgICBwZXJpbWV0ZXJDYXJ0b2dyYXBoaWNOVywKICAgICAgICAgICAgc2NyYXRjaFBlcmltZXRlckNhcnRlc2lhbk5XCiAgICAgICAgICApOwogICAgICAgICAgY29uc3QgcGVyaW1ldGVyQ2FydGVzaWFuQ1cgPSBlbGxpcHNvaWQuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oCiAgICAgICAgICAgIHBlcmltZXRlckNhcnRvZ3JhcGhpY0NXLAogICAgICAgICAgICBzY3JhdGNoUGVyaW1ldGVyQ2FydGVzaWFuQ1cKICAgICAgICAgICk7CiAgICAgICAgICBsZXQgcGVyaW1ldGVyQ2FydGVzaWFuU1cgPSBlbGxpcHNvaWQuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oCiAgICAgICAgICAgIHBlcmltZXRlckNhcnRvZ3JhcGhpY1NXLAogICAgICAgICAgICBzY3JhdGNoUGVyaW1ldGVyQ2FydGVzaWFuU1cKICAgICAgICAgICk7CiAgICAgICAgICBjb25zdCBwZXJpbWV0ZXJDYXJ0ZXNpYW5TQyA9IGVsbGlwc29pZC5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbigKICAgICAgICAgICAgcGVyaW1ldGVyQ2FydG9ncmFwaGljU0MsCiAgICAgICAgICAgIHNjcmF0Y2hQZXJpbWV0ZXJDYXJ0ZXNpYW5TQwogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IHBlcmltZXRlclByb2plY3RlZE5DID0gdGFuZ2VudFBsYW5lLnByb2plY3RQb2ludFRvTmVhcmVzdE9uUGxhbmUoCiAgICAgICAgICAgIHBlcmltZXRlckNhcnRlc2lhbk5DLAogICAgICAgICAgICBzY3JhdGNoUGVyaW1ldGVyUHJvamVjdGVkTkMKICAgICAgICAgICk7CiAgICAgICAgICBjb25zdCBwZXJpbWV0ZXJQcm9qZWN0ZWROVyA9IHRhbmdlbnRQbGFuZS5wcm9qZWN0UG9pbnRUb05lYXJlc3RPblBsYW5lKAogICAgICAgICAgICBwZXJpbWV0ZXJDYXJ0ZXNpYW5OVywKICAgICAgICAgICAgc2NyYXRjaFBlcmltZXRlclByb2plY3RlZE5XCiAgICAgICAgICApOwogICAgICAgICAgY29uc3QgcGVyaW1ldGVyUHJvamVjdGVkQ1cgPSB0YW5nZW50UGxhbmUucHJvamVjdFBvaW50VG9OZWFyZXN0T25QbGFuZSgKICAgICAgICAgICAgcGVyaW1ldGVyQ2FydGVzaWFuQ1csCiAgICAgICAgICAgIHNjcmF0Y2hQZXJpbWV0ZXJQcm9qZWN0ZWRDVwogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IHBlcmltZXRlclByb2plY3RlZFNXID0gdGFuZ2VudFBsYW5lLnByb2plY3RQb2ludFRvTmVhcmVzdE9uUGxhbmUoCiAgICAgICAgICAgIHBlcmltZXRlckNhcnRlc2lhblNXLAogICAgICAgICAgICBzY3JhdGNoUGVyaW1ldGVyUHJvamVjdGVkU1cKICAgICAgICAgICk7CiAgICAgICAgICBjb25zdCBwZXJpbWV0ZXJQcm9qZWN0ZWRTQyA9IHRhbmdlbnRQbGFuZS5wcm9qZWN0UG9pbnRUb05lYXJlc3RPblBsYW5lKAogICAgICAgICAgICBwZXJpbWV0ZXJDYXJ0ZXNpYW5TQywKICAgICAgICAgICAgc2NyYXRjaFBlcmltZXRlclByb2plY3RlZFNDCiAgICAgICAgICApOwogICAgICAgICAgbWluWCA9IE1hdGgubWluKAogICAgICAgICAgICBwZXJpbWV0ZXJQcm9qZWN0ZWROVy54LAogICAgICAgICAgICBwZXJpbWV0ZXJQcm9qZWN0ZWRDVy54LAogICAgICAgICAgICBwZXJpbWV0ZXJQcm9qZWN0ZWRTVy54CiAgICAgICAgICApOwogICAgICAgICAgbWF4WCA9IC1taW5YOwogICAgICAgICAgbWF4WSA9IE1hdGgubWF4KHBlcmltZXRlclByb2plY3RlZE5XLnksIHBlcmltZXRlclByb2plY3RlZE5DLnkpOwogICAgICAgICAgbWluWSA9IE1hdGgubWluKHBlcmltZXRlclByb2plY3RlZFNXLnksIHBlcmltZXRlclByb2plY3RlZFNDLnkpOwogICAgICAgICAgcGVyaW1ldGVyQ2FydG9ncmFwaGljTlcuaGVpZ2h0ID0gcGVyaW1ldGVyQ2FydG9ncmFwaGljU1cuaGVpZ2h0ID0gbWluaW11bUhlaWdodDsKICAgICAgICAgIHBlcmltZXRlckNhcnRlc2lhbk5XID0gZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKAogICAgICAgICAgICBwZXJpbWV0ZXJDYXJ0b2dyYXBoaWNOVywKICAgICAgICAgICAgc2NyYXRjaFBlcmltZXRlckNhcnRlc2lhbk5XCiAgICAgICAgICApOwogICAgICAgICAgcGVyaW1ldGVyQ2FydGVzaWFuU1cgPSBlbGxpcHNvaWQuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oCiAgICAgICAgICAgIHBlcmltZXRlckNhcnRvZ3JhcGhpY1NXLAogICAgICAgICAgICBzY3JhdGNoUGVyaW1ldGVyQ2FydGVzaWFuU1cKICAgICAgICAgICk7CiAgICAgICAgICBtaW5aID0gTWF0aC5taW4oCiAgICAgICAgICAgIFBsYW5lX2RlZmF1bHQuZ2V0UG9pbnREaXN0YW5jZShwbGFuZSwgcGVyaW1ldGVyQ2FydGVzaWFuTlcpLAogICAgICAgICAgICBQbGFuZV9kZWZhdWx0LmdldFBvaW50RGlzdGFuY2UocGxhbmUsIHBlcmltZXRlckNhcnRlc2lhblNXKQogICAgICAgICAgKTsKICAgICAgICAgIG1heFogPSBtYXhpbXVtSGVpZ2h0OwogICAgICAgICAgcmV0dXJuIGZyb21QbGFuZUV4dGVudHMoCiAgICAgICAgICAgIHRhbmdlbnRQbGFuZS5vcmlnaW4sCiAgICAgICAgICAgIHRhbmdlbnRQbGFuZS54QXhpcywKICAgICAgICAgICAgdGFuZ2VudFBsYW5lLnlBeGlzLAogICAgICAgICAgICB0YW5nZW50UGxhbmUuekF4aXMsCiAgICAgICAgICAgIG1pblgsCiAgICAgICAgICAgIG1heFgsCiAgICAgICAgICAgIG1pblksCiAgICAgICAgICAgIG1heFksCiAgICAgICAgICAgIG1pblosCiAgICAgICAgICAgIG1heFosCiAgICAgICAgICAgIHJlc3VsdAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZnVsbHlBYm92ZUVxdWF0b3IgPSByZWN0YW5nbGUuc291dGggPiAwOwogICAgICAgIGNvbnN0IGZ1bGx5QmVsb3dFcXVhdG9yID0gcmVjdGFuZ2xlLm5vcnRoIDwgMDsKICAgICAgICBjb25zdCBsYXRpdHVkZU5lYXJlc3RUb0VxdWF0b3IgPSBmdWxseUFib3ZlRXF1YXRvciA/IHJlY3RhbmdsZS5zb3V0aCA6IGZ1bGx5QmVsb3dFcXVhdG9yID8gcmVjdGFuZ2xlLm5vcnRoIDogMDsKICAgICAgICBjb25zdCBjZW50ZXJMb25naXR1ZGUgPSBSZWN0YW5nbGVfZGVmYXVsdC5jZW50ZXIoCiAgICAgICAgICByZWN0YW5nbGUsCiAgICAgICAgICBzY3JhdGNoUmVjdGFuZ2xlQ2VudGVyQ2FydG9ncmFwaGljCiAgICAgICAgKS5sb25naXR1ZGU7CiAgICAgICAgY29uc3QgcGxhbmVPcmlnaW4gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbVJhZGlhbnMoCiAgICAgICAgICBjZW50ZXJMb25naXR1ZGUsCiAgICAgICAgICBsYXRpdHVkZU5lYXJlc3RUb0VxdWF0b3IsCiAgICAgICAgICBtYXhpbXVtSGVpZ2h0LAogICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgc2NyYXRjaFBsYW5lT3JpZ2luCiAgICAgICAgKTsKICAgICAgICBwbGFuZU9yaWdpbi56ID0gMDsKICAgICAgICBjb25zdCBpc1BvbGUgPSBNYXRoLmFicyhwbGFuZU9yaWdpbi54KSA8IE1hdGhfZGVmYXVsdC5FUFNJTE9OMTAgJiYgTWF0aC5hYnMocGxhbmVPcmlnaW4ueSkgPCBNYXRoX2RlZmF1bHQuRVBTSUxPTjEwOwogICAgICAgIGNvbnN0IHBsYW5lTm9ybWFsID0gIWlzUG9sZSA/IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUocGxhbmVPcmlnaW4sIHNjcmF0Y2hQbGFuZU5vcm1hbCkgOiBDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9YOwogICAgICAgIGNvbnN0IHBsYW5lWUF4aXMgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9aOwogICAgICAgIGNvbnN0IHBsYW5lWEF4aXMgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3MoCiAgICAgICAgICBwbGFuZU5vcm1hbCwKICAgICAgICAgIHBsYW5lWUF4aXMsCiAgICAgICAgICBzY3JhdGNoUGxhbmVYQXhpcwogICAgICAgICk7CiAgICAgICAgcGxhbmUgPSBQbGFuZV9kZWZhdWx0LmZyb21Qb2ludE5vcm1hbChwbGFuZU9yaWdpbiwgcGxhbmVOb3JtYWwsIHNjcmF0Y2hQbGFuZSk7CiAgICAgICAgY29uc3QgaG9yaXpvbkNhcnRlc2lhbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tUmFkaWFucygKICAgICAgICAgIGNlbnRlckxvbmdpdHVkZSArIE1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTywKICAgICAgICAgIGxhdGl0dWRlTmVhcmVzdFRvRXF1YXRvciwKICAgICAgICAgIG1heGltdW1IZWlnaHQsCiAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICBzY3JhdGNoSG9yaXpvbkNhcnRlc2lhbgogICAgICAgICk7CiAgICAgICAgbWF4WCA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoCiAgICAgICAgICBQbGFuZV9kZWZhdWx0LnByb2plY3RQb2ludE9udG9QbGFuZSgKICAgICAgICAgICAgcGxhbmUsCiAgICAgICAgICAgIGhvcml6b25DYXJ0ZXNpYW4sCiAgICAgICAgICAgIHNjcmF0Y2hIb3Jpem9uUHJvamVjdGVkCiAgICAgICAgICApLAogICAgICAgICAgcGxhbmVYQXhpcwogICAgICAgICk7CiAgICAgICAgbWluWCA9IC1tYXhYOwogICAgICAgIG1heFkgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbVJhZGlhbnMoCiAgICAgICAgICAwLAogICAgICAgICAgcmVjdGFuZ2xlLm5vcnRoLAogICAgICAgICAgZnVsbHlCZWxvd0VxdWF0b3IgPyBtaW5pbXVtSGVpZ2h0IDogbWF4aW11bUhlaWdodCwKICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgIHNjcmF0Y2hNYXhZCiAgICAgICAgKS56OwogICAgICAgIG1pblkgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbVJhZGlhbnMoCiAgICAgICAgICAwLAogICAgICAgICAgcmVjdGFuZ2xlLnNvdXRoLAogICAgICAgICAgZnVsbHlBYm92ZUVxdWF0b3IgPyBtaW5pbXVtSGVpZ2h0IDogbWF4aW11bUhlaWdodCwKICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgIHNjcmF0Y2hNaW5ZCiAgICAgICAgKS56OwogICAgICAgIGNvbnN0IGZhclogPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbVJhZGlhbnMoCiAgICAgICAgICByZWN0YW5nbGUuZWFzdCwKICAgICAgICAgIGxhdGl0dWRlTmVhcmVzdFRvRXF1YXRvciwKICAgICAgICAgIG1heGltdW1IZWlnaHQsCiAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICBzY3JhdGNoWgogICAgICAgICk7CiAgICAgICAgbWluWiA9IFBsYW5lX2RlZmF1bHQuZ2V0UG9pbnREaXN0YW5jZShwbGFuZSwgZmFyWik7CiAgICAgICAgbWF4WiA9IDA7CiAgICAgICAgcmV0dXJuIGZyb21QbGFuZUV4dGVudHMoCiAgICAgICAgICBwbGFuZU9yaWdpbiwKICAgICAgICAgIHBsYW5lWEF4aXMsCiAgICAgICAgICBwbGFuZVlBeGlzLAogICAgICAgICAgcGxhbmVOb3JtYWwsCiAgICAgICAgICBtaW5YLAogICAgICAgICAgbWF4WCwKICAgICAgICAgIG1pblksCiAgICAgICAgICBtYXhZLAogICAgICAgICAgbWluWiwKICAgICAgICAgIG1heFosCiAgICAgICAgICByZXN1bHQKICAgICAgICApOwogICAgICB9OwogICAgICBPcmllbnRlZEJvdW5kaW5nQm94LmZyb21UcmFuc2Zvcm1hdGlvbiA9IGZ1bmN0aW9uKHRyYW5zZm9ybWF0aW9uLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInRyYW5zZm9ybWF0aW9uIiwgdHJhbnNmb3JtYXRpb24pOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBPcmllbnRlZEJvdW5kaW5nQm94KCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5jZW50ZXIgPSBNYXRyaXg0X2RlZmF1bHQuZ2V0VHJhbnNsYXRpb24odHJhbnNmb3JtYXRpb24sIHJlc3VsdC5jZW50ZXIpOwogICAgICAgIHJlc3VsdC5oYWxmQXhlcyA9IE1hdHJpeDRfZGVmYXVsdC5nZXRNYXRyaXgzKHRyYW5zZm9ybWF0aW9uLCByZXN1bHQuaGFsZkF4ZXMpOwogICAgICAgIHJlc3VsdC5oYWxmQXhlcyA9IE1hdHJpeDNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKAogICAgICAgICAgcmVzdWx0LmhhbGZBeGVzLAogICAgICAgICAgMC41LAogICAgICAgICAgcmVzdWx0LmhhbGZBeGVzCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBPcmllbnRlZEJvdW5kaW5nQm94LmNsb25lID0gZnVuY3Rpb24oYm94LCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChib3gpKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IE9yaWVudGVkQm91bmRpbmdCb3goYm94LmNlbnRlciwgYm94LmhhbGZBeGVzKTsKICAgICAgICB9CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGJveC5jZW50ZXIsIHJlc3VsdC5jZW50ZXIpOwogICAgICAgIE1hdHJpeDNfZGVmYXVsdC5jbG9uZShib3guaGFsZkF4ZXMsIHJlc3VsdC5oYWxmQXhlcyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgT3JpZW50ZWRCb3VuZGluZ0JveC5pbnRlcnNlY3RQbGFuZSA9IGZ1bmN0aW9uKGJveCwgcGxhbmUpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChib3gpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYm94IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwbGFuZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJwbGFuZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgY2VudGVyID0gYm94LmNlbnRlcjsKICAgICAgICBjb25zdCBub3JtYWwyID0gcGxhbmUubm9ybWFsOwogICAgICAgIGNvbnN0IGhhbGZBeGVzID0gYm94LmhhbGZBeGVzOwogICAgICAgIGNvbnN0IG5vcm1hbFggPSBub3JtYWwyLngsIG5vcm1hbFkgPSBub3JtYWwyLnksIG5vcm1hbFogPSBub3JtYWwyLno7CiAgICAgICAgY29uc3QgcmFkRWZmZWN0aXZlID0gTWF0aC5hYnMoCiAgICAgICAgICBub3JtYWxYICogaGFsZkF4ZXNbTWF0cml4M19kZWZhdWx0LkNPTFVNTjBST1cwXSArIG5vcm1hbFkgKiBoYWxmQXhlc1tNYXRyaXgzX2RlZmF1bHQuQ09MVU1OMFJPVzFdICsgbm9ybWFsWiAqIGhhbGZBeGVzW01hdHJpeDNfZGVmYXVsdC5DT0xVTU4wUk9XMl0KICAgICAgICApICsgTWF0aC5hYnMoCiAgICAgICAgICBub3JtYWxYICogaGFsZkF4ZXNbTWF0cml4M19kZWZhdWx0LkNPTFVNTjFST1cwXSArIG5vcm1hbFkgKiBoYWxmQXhlc1tNYXRyaXgzX2RlZmF1bHQuQ09MVU1OMVJPVzFdICsgbm9ybWFsWiAqIGhhbGZBeGVzW01hdHJpeDNfZGVmYXVsdC5DT0xVTU4xUk9XMl0KICAgICAgICApICsgTWF0aC5hYnMoCiAgICAgICAgICBub3JtYWxYICogaGFsZkF4ZXNbTWF0cml4M19kZWZhdWx0LkNPTFVNTjJST1cwXSArIG5vcm1hbFkgKiBoYWxmQXhlc1tNYXRyaXgzX2RlZmF1bHQuQ09MVU1OMlJPVzFdICsgbm9ybWFsWiAqIGhhbGZBeGVzW01hdHJpeDNfZGVmYXVsdC5DT0xVTU4yUk9XMl0KICAgICAgICApOwogICAgICAgIGNvbnN0IGRpc3RhbmNlVG9QbGFuZSA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3Qobm9ybWFsMiwgY2VudGVyKSArIHBsYW5lLmRpc3RhbmNlOwogICAgICAgIGlmIChkaXN0YW5jZVRvUGxhbmUgPD0gLXJhZEVmZmVjdGl2ZSkgewogICAgICAgICAgcmV0dXJuIEludGVyc2VjdF9kZWZhdWx0Lk9VVFNJREU7CiAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZVRvUGxhbmUgPj0gcmFkRWZmZWN0aXZlKSB7CiAgICAgICAgICByZXR1cm4gSW50ZXJzZWN0X2RlZmF1bHQuSU5TSURFOwogICAgICAgIH0KICAgICAgICByZXR1cm4gSW50ZXJzZWN0X2RlZmF1bHQuSU5URVJTRUNUSU5HOwogICAgICB9OwogICAgICBzY3JhdGNoQ2FydGVzaWFuVSA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaENhcnRlc2lhblYgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW5XID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoVmFsaWRBeGlzMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFZhbGlkQXhpczMgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hQUHJpbWUgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIE9yaWVudGVkQm91bmRpbmdCb3guZGlzdGFuY2VTcXVhcmVkVG8gPSBmdW5jdGlvbihib3gsIGNhcnRlc2lhbjExKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYm94KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImJveCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoY2FydGVzaWFuMTEpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiY2FydGVzaWFuIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBvZmZzZXQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoY2FydGVzaWFuMTEsIGJveC5jZW50ZXIsIHNjcmF0Y2hPZmZzZXQpOwogICAgICAgIGNvbnN0IGhhbGZBeGVzID0gYm94LmhhbGZBeGVzOwogICAgICAgIGxldCB1MyA9IE1hdHJpeDNfZGVmYXVsdC5nZXRDb2x1bW4oaGFsZkF4ZXMsIDAsIHNjcmF0Y2hDYXJ0ZXNpYW5VKTsKICAgICAgICBsZXQgdjMgPSBNYXRyaXgzX2RlZmF1bHQuZ2V0Q29sdW1uKGhhbGZBeGVzLCAxLCBzY3JhdGNoQ2FydGVzaWFuVik7CiAgICAgICAgbGV0IHcgPSBNYXRyaXgzX2RlZmF1bHQuZ2V0Q29sdW1uKGhhbGZBeGVzLCAyLCBzY3JhdGNoQ2FydGVzaWFuVyk7CiAgICAgICAgY29uc3QgdUhhbGYgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlKHUzKTsKICAgICAgICBjb25zdCB2SGFsZiA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUodjMpOwogICAgICAgIGNvbnN0IHdIYWxmID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZSh3KTsKICAgICAgICBsZXQgdVZhbGlkID0gdHJ1ZTsKICAgICAgICBsZXQgdlZhbGlkID0gdHJ1ZTsKICAgICAgICBsZXQgd1ZhbGlkID0gdHJ1ZTsKICAgICAgICBpZiAodUhhbGYgPiAwKSB7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuZGl2aWRlQnlTY2FsYXIodTMsIHVIYWxmLCB1Myk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVWYWxpZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAodkhhbGYgPiAwKSB7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuZGl2aWRlQnlTY2FsYXIodjMsIHZIYWxmLCB2Myk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZWYWxpZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAod0hhbGYgPiAwKSB7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuZGl2aWRlQnlTY2FsYXIodywgd0hhbGYsIHcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3VmFsaWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbnVtYmVyT2ZEZWdlbmVyYXRlQXhlcyA9ICF1VmFsaWQgKyAhdlZhbGlkICsgIXdWYWxpZDsKICAgICAgICBsZXQgdmFsaWRBeGlzMTsKICAgICAgICBsZXQgdmFsaWRBeGlzMjsKICAgICAgICBsZXQgdmFsaWRBeGlzMzsKICAgICAgICBpZiAobnVtYmVyT2ZEZWdlbmVyYXRlQXhlcyA9PT0gMSkgewogICAgICAgICAgbGV0IGRlZ2VuZXJhdGVBeGlzID0gdTM7CiAgICAgICAgICB2YWxpZEF4aXMxID0gdjM7CiAgICAgICAgICB2YWxpZEF4aXMyID0gdzsKICAgICAgICAgIGlmICghdlZhbGlkKSB7CiAgICAgICAgICAgIGRlZ2VuZXJhdGVBeGlzID0gdjM7CiAgICAgICAgICAgIHZhbGlkQXhpczEgPSB1MzsKICAgICAgICAgIH0gZWxzZSBpZiAoIXdWYWxpZCkgewogICAgICAgICAgICBkZWdlbmVyYXRlQXhpcyA9IHc7CiAgICAgICAgICAgIHZhbGlkQXhpczIgPSB1MzsKICAgICAgICAgIH0KICAgICAgICAgIHZhbGlkQXhpczMgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3ModmFsaWRBeGlzMSwgdmFsaWRBeGlzMiwgc2NyYXRjaFZhbGlkQXhpczMpOwogICAgICAgICAgaWYgKGRlZ2VuZXJhdGVBeGlzID09PSB1MykgewogICAgICAgICAgICB1MyA9IHZhbGlkQXhpczM7CiAgICAgICAgICB9IGVsc2UgaWYgKGRlZ2VuZXJhdGVBeGlzID09PSB2MykgewogICAgICAgICAgICB2MyA9IHZhbGlkQXhpczM7CiAgICAgICAgICB9IGVsc2UgaWYgKGRlZ2VuZXJhdGVBeGlzID09PSB3KSB7CiAgICAgICAgICAgIHcgPSB2YWxpZEF4aXMzOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAobnVtYmVyT2ZEZWdlbmVyYXRlQXhlcyA9PT0gMikgewogICAgICAgICAgdmFsaWRBeGlzMSA9IHUzOwogICAgICAgICAgaWYgKHZWYWxpZCkgewogICAgICAgICAgICB2YWxpZEF4aXMxID0gdjM7CiAgICAgICAgICB9IGVsc2UgaWYgKHdWYWxpZCkgewogICAgICAgICAgICB2YWxpZEF4aXMxID0gdzsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBjcm9zc1ZlY3RvciA9IENhcnRlc2lhbjNfZGVmYXVsdC5VTklUX1k7CiAgICAgICAgICBpZiAoY3Jvc3NWZWN0b3IuZXF1YWxzRXBzaWxvbih2YWxpZEF4aXMxLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjMpKSB7CiAgICAgICAgICAgIGNyb3NzVmVjdG9yID0gQ2FydGVzaWFuM19kZWZhdWx0LlVOSVRfWDsKICAgICAgICAgIH0KICAgICAgICAgIHZhbGlkQXhpczIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3ModmFsaWRBeGlzMSwgY3Jvc3NWZWN0b3IsIHNjcmF0Y2hWYWxpZEF4aXMyKTsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUodmFsaWRBeGlzMiwgdmFsaWRBeGlzMik7CiAgICAgICAgICB2YWxpZEF4aXMzID0gQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKHZhbGlkQXhpczEsIHZhbGlkQXhpczIsIHNjcmF0Y2hWYWxpZEF4aXMzKTsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUodmFsaWRBeGlzMywgdmFsaWRBeGlzMyk7CiAgICAgICAgICBpZiAodmFsaWRBeGlzMSA9PT0gdTMpIHsKICAgICAgICAgICAgdjMgPSB2YWxpZEF4aXMyOwogICAgICAgICAgICB3ID0gdmFsaWRBeGlzMzsKICAgICAgICAgIH0gZWxzZSBpZiAodmFsaWRBeGlzMSA9PT0gdjMpIHsKICAgICAgICAgICAgdyA9IHZhbGlkQXhpczI7CiAgICAgICAgICAgIHUzID0gdmFsaWRBeGlzMzsKICAgICAgICAgIH0gZWxzZSBpZiAodmFsaWRBeGlzMSA9PT0gdykgewogICAgICAgICAgICB1MyA9IHZhbGlkQXhpczI7CiAgICAgICAgICAgIHYzID0gdmFsaWRBeGlzMzsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG51bWJlck9mRGVnZW5lcmF0ZUF4ZXMgPT09IDMpIHsKICAgICAgICAgIHUzID0gQ2FydGVzaWFuM19kZWZhdWx0LlVOSVRfWDsKICAgICAgICAgIHYzID0gQ2FydGVzaWFuM19kZWZhdWx0LlVOSVRfWTsKICAgICAgICAgIHcgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9aOwogICAgICAgIH0KICAgICAgICBjb25zdCBwUHJpbWUgPSBzY3JhdGNoUFByaW1lOwogICAgICAgIHBQcmltZS54ID0gQ2FydGVzaWFuM19kZWZhdWx0LmRvdChvZmZzZXQsIHUzKTsKICAgICAgICBwUHJpbWUueSA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3Qob2Zmc2V0LCB2Myk7CiAgICAgICAgcFByaW1lLnogPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KG9mZnNldCwgdyk7CiAgICAgICAgbGV0IGRpc3RhbmNlU3F1YXJlZCA9IDA7CiAgICAgICAgbGV0IGQ7CiAgICAgICAgaWYgKHBQcmltZS54IDwgLXVIYWxmKSB7CiAgICAgICAgICBkID0gcFByaW1lLnggKyB1SGFsZjsKICAgICAgICAgIGRpc3RhbmNlU3F1YXJlZCArPSBkICogZDsKICAgICAgICB9IGVsc2UgaWYgKHBQcmltZS54ID4gdUhhbGYpIHsKICAgICAgICAgIGQgPSBwUHJpbWUueCAtIHVIYWxmOwogICAgICAgICAgZGlzdGFuY2VTcXVhcmVkICs9IGQgKiBkOwogICAgICAgIH0KICAgICAgICBpZiAocFByaW1lLnkgPCAtdkhhbGYpIHsKICAgICAgICAgIGQgPSBwUHJpbWUueSArIHZIYWxmOwogICAgICAgICAgZGlzdGFuY2VTcXVhcmVkICs9IGQgKiBkOwogICAgICAgIH0gZWxzZSBpZiAocFByaW1lLnkgPiB2SGFsZikgewogICAgICAgICAgZCA9IHBQcmltZS55IC0gdkhhbGY7CiAgICAgICAgICBkaXN0YW5jZVNxdWFyZWQgKz0gZCAqIGQ7CiAgICAgICAgfQogICAgICAgIGlmIChwUHJpbWUueiA8IC13SGFsZikgewogICAgICAgICAgZCA9IHBQcmltZS56ICsgd0hhbGY7CiAgICAgICAgICBkaXN0YW5jZVNxdWFyZWQgKz0gZCAqIGQ7CiAgICAgICAgfSBlbHNlIGlmIChwUHJpbWUueiA+IHdIYWxmKSB7CiAgICAgICAgICBkID0gcFByaW1lLnogLSB3SGFsZjsKICAgICAgICAgIGRpc3RhbmNlU3F1YXJlZCArPSBkICogZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRpc3RhbmNlU3F1YXJlZDsKICAgICAgfTsKICAgICAgc2NyYXRjaENvcm5lciA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFRvQ2VudGVyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBPcmllbnRlZEJvdW5kaW5nQm94LmNvbXB1dGVQbGFuZURpc3RhbmNlcyA9IGZ1bmN0aW9uKGJveCwgcG9zaXRpb24sIGRpcmVjdGlvbjIsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGJveCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJib3ggaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHBvc2l0aW9uKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInBvc2l0aW9uIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChkaXJlY3Rpb24yKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImRpcmVjdGlvbiBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IEludGVydmFsX2RlZmF1bHQoKTsKICAgICAgICB9CiAgICAgICAgbGV0IG1pbkRpc3QgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICAgICAgbGV0IG1heERpc3QgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7CiAgICAgICAgY29uc3QgY2VudGVyID0gYm94LmNlbnRlcjsKICAgICAgICBjb25zdCBoYWxmQXhlcyA9IGJveC5oYWxmQXhlczsKICAgICAgICBjb25zdCB1MyA9IE1hdHJpeDNfZGVmYXVsdC5nZXRDb2x1bW4oaGFsZkF4ZXMsIDAsIHNjcmF0Y2hDYXJ0ZXNpYW5VKTsKICAgICAgICBjb25zdCB2MyA9IE1hdHJpeDNfZGVmYXVsdC5nZXRDb2x1bW4oaGFsZkF4ZXMsIDEsIHNjcmF0Y2hDYXJ0ZXNpYW5WKTsKICAgICAgICBjb25zdCB3ID0gTWF0cml4M19kZWZhdWx0LmdldENvbHVtbihoYWxmQXhlcywgMiwgc2NyYXRjaENhcnRlc2lhblcpOwogICAgICAgIGNvbnN0IGNvcm5lciA9IENhcnRlc2lhbjNfZGVmYXVsdC5hZGQodTMsIHYzLCBzY3JhdGNoQ29ybmVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGNvcm5lciwgdywgY29ybmVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGNvcm5lciwgY2VudGVyLCBjb3JuZXIpOwogICAgICAgIGNvbnN0IHRvQ2VudGVyID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KGNvcm5lciwgcG9zaXRpb24sIHNjcmF0Y2hUb0NlbnRlcik7CiAgICAgICAgbGV0IG1hZyA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoZGlyZWN0aW9uMiwgdG9DZW50ZXIpOwogICAgICAgIG1pbkRpc3QgPSBNYXRoLm1pbihtYWcsIG1pbkRpc3QpOwogICAgICAgIG1heERpc3QgPSBNYXRoLm1heChtYWcsIG1heERpc3QpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoY2VudGVyLCB1MywgY29ybmVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGNvcm5lciwgdjMsIGNvcm5lcik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KGNvcm5lciwgdywgY29ybmVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoY29ybmVyLCBwb3NpdGlvbiwgdG9DZW50ZXIpOwogICAgICAgIG1hZyA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoZGlyZWN0aW9uMiwgdG9DZW50ZXIpOwogICAgICAgIG1pbkRpc3QgPSBNYXRoLm1pbihtYWcsIG1pbkRpc3QpOwogICAgICAgIG1heERpc3QgPSBNYXRoLm1heChtYWcsIG1heERpc3QpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoY2VudGVyLCB1MywgY29ybmVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoY29ybmVyLCB2MywgY29ybmVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGNvcm5lciwgdywgY29ybmVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoY29ybmVyLCBwb3NpdGlvbiwgdG9DZW50ZXIpOwogICAgICAgIG1hZyA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoZGlyZWN0aW9uMiwgdG9DZW50ZXIpOwogICAgICAgIG1pbkRpc3QgPSBNYXRoLm1pbihtYWcsIG1pbkRpc3QpOwogICAgICAgIG1heERpc3QgPSBNYXRoLm1heChtYWcsIG1heERpc3QpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoY2VudGVyLCB1MywgY29ybmVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoY29ybmVyLCB2MywgY29ybmVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoY29ybmVyLCB3LCBjb3JuZXIpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChjb3JuZXIsIHBvc2l0aW9uLCB0b0NlbnRlcik7CiAgICAgICAgbWFnID0gQ2FydGVzaWFuM19kZWZhdWx0LmRvdChkaXJlY3Rpb24yLCB0b0NlbnRlcik7CiAgICAgICAgbWluRGlzdCA9IE1hdGgubWluKG1hZywgbWluRGlzdCk7CiAgICAgICAgbWF4RGlzdCA9IE1hdGgubWF4KG1hZywgbWF4RGlzdCk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KGNlbnRlciwgdTMsIGNvcm5lcik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChjb3JuZXIsIHYzLCBjb3JuZXIpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoY29ybmVyLCB3LCBjb3JuZXIpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChjb3JuZXIsIHBvc2l0aW9uLCB0b0NlbnRlcik7CiAgICAgICAgbWFnID0gQ2FydGVzaWFuM19kZWZhdWx0LmRvdChkaXJlY3Rpb24yLCB0b0NlbnRlcik7CiAgICAgICAgbWluRGlzdCA9IE1hdGgubWluKG1hZywgbWluRGlzdCk7CiAgICAgICAgbWF4RGlzdCA9IE1hdGgubWF4KG1hZywgbWF4RGlzdCk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KGNlbnRlciwgdTMsIGNvcm5lcik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChjb3JuZXIsIHYzLCBjb3JuZXIpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChjb3JuZXIsIHcsIGNvcm5lcik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KGNvcm5lciwgcG9zaXRpb24sIHRvQ2VudGVyKTsKICAgICAgICBtYWcgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KGRpcmVjdGlvbjIsIHRvQ2VudGVyKTsKICAgICAgICBtaW5EaXN0ID0gTWF0aC5taW4obWFnLCBtaW5EaXN0KTsKICAgICAgICBtYXhEaXN0ID0gTWF0aC5tYXgobWFnLCBtYXhEaXN0KTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoY2VudGVyLCB1MywgY29ybmVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoY29ybmVyLCB2MywgY29ybmVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGNvcm5lciwgdywgY29ybmVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoY29ybmVyLCBwb3NpdGlvbiwgdG9DZW50ZXIpOwogICAgICAgIG1hZyA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoZGlyZWN0aW9uMiwgdG9DZW50ZXIpOwogICAgICAgIG1pbkRpc3QgPSBNYXRoLm1pbihtYWcsIG1pbkRpc3QpOwogICAgICAgIG1heERpc3QgPSBNYXRoLm1heChtYWcsIG1heERpc3QpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChjZW50ZXIsIHUzLCBjb3JuZXIpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChjb3JuZXIsIHYzLCBjb3JuZXIpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChjb3JuZXIsIHcsIGNvcm5lcik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KGNvcm5lciwgcG9zaXRpb24sIHRvQ2VudGVyKTsKICAgICAgICBtYWcgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KGRpcmVjdGlvbjIsIHRvQ2VudGVyKTsKICAgICAgICBtaW5EaXN0ID0gTWF0aC5taW4obWFnLCBtaW5EaXN0KTsKICAgICAgICBtYXhEaXN0ID0gTWF0aC5tYXgobWFnLCBtYXhEaXN0KTsKICAgICAgICByZXN1bHQuc3RhcnQgPSBtaW5EaXN0OwogICAgICAgIHJlc3VsdC5zdG9wID0gbWF4RGlzdDsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBzY3JhdGNoWEF4aXMgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hZQXhpcyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFpBeGlzID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBPcmllbnRlZEJvdW5kaW5nQm94LmNvbXB1dGVDb3JuZXJzID0gZnVuY3Rpb24oYm94LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImJveCIsIGJveCk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gWwogICAgICAgICAgICBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCksCiAgICAgICAgICAgIG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKSwKICAgICAgICAgICAgbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpLAogICAgICAgICAgICBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCksCiAgICAgICAgICAgIG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKSwKICAgICAgICAgICAgbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpLAogICAgICAgICAgICBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCksCiAgICAgICAgICAgIG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKQogICAgICAgICAgXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgY2VudGVyID0gYm94LmNlbnRlcjsKICAgICAgICBjb25zdCBoYWxmQXhlcyA9IGJveC5oYWxmQXhlczsKICAgICAgICBjb25zdCB4QXhpcyA9IE1hdHJpeDNfZGVmYXVsdC5nZXRDb2x1bW4oaGFsZkF4ZXMsIDAsIHNjcmF0Y2hYQXhpcyk7CiAgICAgICAgY29uc3QgeUF4aXMgPSBNYXRyaXgzX2RlZmF1bHQuZ2V0Q29sdW1uKGhhbGZBeGVzLCAxLCBzY3JhdGNoWUF4aXMpOwogICAgICAgIGNvbnN0IHpBeGlzID0gTWF0cml4M19kZWZhdWx0LmdldENvbHVtbihoYWxmQXhlcywgMiwgc2NyYXRjaFpBeGlzKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY2VudGVyLCByZXN1bHRbMF0pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChyZXN1bHRbMF0sIHhBeGlzLCByZXN1bHRbMF0pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChyZXN1bHRbMF0sIHlBeGlzLCByZXN1bHRbMF0pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChyZXN1bHRbMF0sIHpBeGlzLCByZXN1bHRbMF0pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShjZW50ZXIsIHJlc3VsdFsxXSk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KHJlc3VsdFsxXSwgeEF4aXMsIHJlc3VsdFsxXSk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KHJlc3VsdFsxXSwgeUF4aXMsIHJlc3VsdFsxXSk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChyZXN1bHRbMV0sIHpBeGlzLCByZXN1bHRbMV0pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShjZW50ZXIsIHJlc3VsdFsyXSk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KHJlc3VsdFsyXSwgeEF4aXMsIHJlc3VsdFsyXSk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChyZXN1bHRbMl0sIHlBeGlzLCByZXN1bHRbMl0pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChyZXN1bHRbMl0sIHpBeGlzLCByZXN1bHRbMl0pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShjZW50ZXIsIHJlc3VsdFszXSk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KHJlc3VsdFszXSwgeEF4aXMsIHJlc3VsdFszXSk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChyZXN1bHRbM10sIHlBeGlzLCByZXN1bHRbM10pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQocmVzdWx0WzNdLCB6QXhpcywgcmVzdWx0WzNdKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY2VudGVyLCByZXN1bHRbNF0pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQocmVzdWx0WzRdLCB4QXhpcywgcmVzdWx0WzRdKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QocmVzdWx0WzRdLCB5QXhpcywgcmVzdWx0WzRdKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QocmVzdWx0WzRdLCB6QXhpcywgcmVzdWx0WzRdKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY2VudGVyLCByZXN1bHRbNV0pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQocmVzdWx0WzVdLCB4QXhpcywgcmVzdWx0WzVdKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QocmVzdWx0WzVdLCB5QXhpcywgcmVzdWx0WzVdKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHJlc3VsdFs1XSwgekF4aXMsIHJlc3VsdFs1XSk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGNlbnRlciwgcmVzdWx0WzZdKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHJlc3VsdFs2XSwgeEF4aXMsIHJlc3VsdFs2XSk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChyZXN1bHRbNl0sIHlBeGlzLCByZXN1bHRbNl0pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChyZXN1bHRbNl0sIHpBeGlzLCByZXN1bHRbNl0pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShjZW50ZXIsIHJlc3VsdFs3XSk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChyZXN1bHRbN10sIHhBeGlzLCByZXN1bHRbN10pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQocmVzdWx0WzddLCB5QXhpcywgcmVzdWx0WzddKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHJlc3VsdFs3XSwgekF4aXMsIHJlc3VsdFs3XSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgc2NyYXRjaFJvdGF0aW9uU2NhbGUgPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgIE9yaWVudGVkQm91bmRpbmdCb3guY29tcHV0ZVRyYW5zZm9ybWF0aW9uID0gZnVuY3Rpb24oYm94LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImJveCIsIGJveCk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IE1hdHJpeDRfZGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgICBjb25zdCB0cmFuc2xhdGlvbjIgPSBib3guY2VudGVyOwogICAgICAgIGNvbnN0IHJvdGF0aW9uU2NhbGUgPSBNYXRyaXgzX2RlZmF1bHQubXVsdGlwbHlCeVVuaWZvcm1TY2FsZSgKICAgICAgICAgIGJveC5oYWxmQXhlcywKICAgICAgICAgIDIsCiAgICAgICAgICBzY3JhdGNoUm90YXRpb25TY2FsZQogICAgICAgICk7CiAgICAgICAgcmV0dXJuIE1hdHJpeDRfZGVmYXVsdC5mcm9tUm90YXRpb25UcmFuc2xhdGlvbihyb3RhdGlvblNjYWxlLCB0cmFuc2xhdGlvbjIsIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hCb3VuZGluZ1NwaGVyZSA9IG5ldyBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0KCk7CiAgICAgIE9yaWVudGVkQm91bmRpbmdCb3guaXNPY2NsdWRlZCA9IGZ1bmN0aW9uKGJveCwgb2NjbHVkZXIpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChib3gpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYm94IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChvY2NsdWRlcikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJvY2NsdWRlciBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc3BoZXJlID0gQm91bmRpbmdTcGhlcmVfZGVmYXVsdC5mcm9tT3JpZW50ZWRCb3VuZGluZ0JveCgKICAgICAgICAgIGJveCwKICAgICAgICAgIHNjcmF0Y2hCb3VuZGluZ1NwaGVyZQogICAgICAgICk7CiAgICAgICAgcmV0dXJuICFvY2NsdWRlci5pc0JvdW5kaW5nU3BoZXJlVmlzaWJsZShzcGhlcmUpOwogICAgICB9OwogICAgICBPcmllbnRlZEJvdW5kaW5nQm94LnByb3RvdHlwZS5pbnRlcnNlY3RQbGFuZSA9IGZ1bmN0aW9uKHBsYW5lKSB7CiAgICAgICAgcmV0dXJuIE9yaWVudGVkQm91bmRpbmdCb3guaW50ZXJzZWN0UGxhbmUodGhpcywgcGxhbmUpOwogICAgICB9OwogICAgICBPcmllbnRlZEJvdW5kaW5nQm94LnByb3RvdHlwZS5kaXN0YW5jZVNxdWFyZWRUbyA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExKSB7CiAgICAgICAgcmV0dXJuIE9yaWVudGVkQm91bmRpbmdCb3guZGlzdGFuY2VTcXVhcmVkVG8odGhpcywgY2FydGVzaWFuMTEpOwogICAgICB9OwogICAgICBPcmllbnRlZEJvdW5kaW5nQm94LnByb3RvdHlwZS5jb21wdXRlUGxhbmVEaXN0YW5jZXMgPSBmdW5jdGlvbihwb3NpdGlvbiwgZGlyZWN0aW9uMiwgcmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIE9yaWVudGVkQm91bmRpbmdCb3guY29tcHV0ZVBsYW5lRGlzdGFuY2VzKAogICAgICAgICAgdGhpcywKICAgICAgICAgIHBvc2l0aW9uLAogICAgICAgICAgZGlyZWN0aW9uMiwKICAgICAgICAgIHJlc3VsdAogICAgICAgICk7CiAgICAgIH07CiAgICAgIE9yaWVudGVkQm91bmRpbmdCb3gucHJvdG90eXBlLmNvbXB1dGVDb3JuZXJzID0gZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIE9yaWVudGVkQm91bmRpbmdCb3guY29tcHV0ZUNvcm5lcnModGhpcywgcmVzdWx0KTsKICAgICAgfTsKICAgICAgT3JpZW50ZWRCb3VuZGluZ0JveC5wcm90b3R5cGUuY29tcHV0ZVRyYW5zZm9ybWF0aW9uID0gZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIE9yaWVudGVkQm91bmRpbmdCb3guY29tcHV0ZVRyYW5zZm9ybWF0aW9uKHRoaXMsIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIE9yaWVudGVkQm91bmRpbmdCb3gucHJvdG90eXBlLmlzT2NjbHVkZWQgPSBmdW5jdGlvbihvY2NsdWRlcikgewogICAgICAgIHJldHVybiBPcmllbnRlZEJvdW5kaW5nQm94LmlzT2NjbHVkZWQodGhpcywgb2NjbHVkZXIpOwogICAgICB9OwogICAgICBPcmllbnRlZEJvdW5kaW5nQm94LmVxdWFscyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8IGRlZmluZWRfZGVmYXVsdChsZWZ0KSAmJiBkZWZpbmVkX2RlZmF1bHQocmlnaHQpICYmIENhcnRlc2lhbjNfZGVmYXVsdC5lcXVhbHMobGVmdC5jZW50ZXIsIHJpZ2h0LmNlbnRlcikgJiYgTWF0cml4M19kZWZhdWx0LmVxdWFscyhsZWZ0LmhhbGZBeGVzLCByaWdodC5oYWxmQXhlcyk7CiAgICAgIH07CiAgICAgIE9yaWVudGVkQm91bmRpbmdCb3gucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIE9yaWVudGVkQm91bmRpbmdCb3guY2xvbmUodGhpcywgcmVzdWx0KTsKICAgICAgfTsKICAgICAgT3JpZW50ZWRCb3VuZGluZ0JveC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24ocmlnaHQpIHsKICAgICAgICByZXR1cm4gT3JpZW50ZWRCb3VuZGluZ0JveC5lcXVhbHModGhpcywgcmlnaHQpOwogICAgICB9OwogICAgICBPcmllbnRlZEJvdW5kaW5nQm94X2RlZmF1bHQgPSBPcmllbnRlZEJvdW5kaW5nQm94OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5LmpzCiAgZnVuY3Rpb24gcHJvamVjdFRvMkQocG9zaXRpb24sIGNlbnRlciwgYXhpczEsIGF4aXMyLCByZXN1bHQpIHsKICAgIGNvbnN0IHYzID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KHBvc2l0aW9uLCBjZW50ZXIsIHNjcmF0Y2hJbnRlcnNlY3Rpb25Qb2ludCk7CiAgICBjb25zdCB4ID0gQ2FydGVzaWFuM19kZWZhdWx0LmRvdChheGlzMSwgdjMpOwogICAgY29uc3QgeSA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoYXhpczIsIHYzKTsKICAgIHJldHVybiBDYXJ0ZXNpYW4yX2RlZmF1bHQuZnJvbUVsZW1lbnRzKHgsIHksIHJlc3VsdCk7CiAgfQogIHZhciBDb3BsYW5hclBvbHlnb25HZW9tZXRyeUxpYnJhcnksIHNjcmF0Y2hJbnRlcnNlY3Rpb25Qb2ludCwgc2NyYXRjaFhBeGlzMiwgc2NyYXRjaFlBeGlzMiwgc2NyYXRjaFpBeGlzMiwgb2JiU2NyYXRjaCwgQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Db3BsYW5hclBvbHlnb25HZW9tZXRyeUxpYnJhcnkuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjIoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9NYXRyaXgzKCk7CiAgICAgIGluaXRfT3JpZW50ZWRCb3VuZGluZ0JveCgpOwogICAgICBDb3BsYW5hclBvbHlnb25HZW9tZXRyeUxpYnJhcnkgPSB7fTsKICAgICAgc2NyYXRjaEludGVyc2VjdGlvblBvaW50ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoWEF4aXMyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoWUF4aXMyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoWkF4aXMyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBvYmJTY3JhdGNoID0gbmV3IE9yaWVudGVkQm91bmRpbmdCb3hfZGVmYXVsdCgpOwogICAgICBDb3BsYW5hclBvbHlnb25HZW9tZXRyeUxpYnJhcnkudmFsaWRPdXRsaW5lID0gZnVuY3Rpb24ocG9zaXRpb25zKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJwb3NpdGlvbnMiLCBwb3NpdGlvbnMpOwogICAgICAgIGNvbnN0IG9yaWVudGVkQm91bmRpbmdCb3ggPSBPcmllbnRlZEJvdW5kaW5nQm94X2RlZmF1bHQuZnJvbVBvaW50cygKICAgICAgICAgIHBvc2l0aW9ucywKICAgICAgICAgIG9iYlNjcmF0Y2gKICAgICAgICApOwogICAgICAgIGNvbnN0IGhhbGZBeGVzID0gb3JpZW50ZWRCb3VuZGluZ0JveC5oYWxmQXhlczsKICAgICAgICBjb25zdCB4QXhpcyA9IE1hdHJpeDNfZGVmYXVsdC5nZXRDb2x1bW4oaGFsZkF4ZXMsIDAsIHNjcmF0Y2hYQXhpczIpOwogICAgICAgIGNvbnN0IHlBeGlzID0gTWF0cml4M19kZWZhdWx0LmdldENvbHVtbihoYWxmQXhlcywgMSwgc2NyYXRjaFlBeGlzMik7CiAgICAgICAgY29uc3QgekF4aXMgPSBNYXRyaXgzX2RlZmF1bHQuZ2V0Q29sdW1uKGhhbGZBeGVzLCAyLCBzY3JhdGNoWkF4aXMyKTsKICAgICAgICBjb25zdCB4TWFnID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZSh4QXhpcyk7CiAgICAgICAgY29uc3QgeU1hZyA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUoeUF4aXMpOwogICAgICAgIGNvbnN0IHpNYWcgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlKHpBeGlzKTsKICAgICAgICByZXR1cm4gISh4TWFnID09PSAwICYmICh5TWFnID09PSAwIHx8IHpNYWcgPT09IDApIHx8IHlNYWcgPT09IDAgJiYgek1hZyA9PT0gMCk7CiAgICAgIH07CiAgICAgIENvcGxhbmFyUG9seWdvbkdlb21ldHJ5TGlicmFyeS5jb21wdXRlUHJvamVjdFRvMkRBcmd1bWVudHMgPSBmdW5jdGlvbihwb3NpdGlvbnMsIGNlbnRlclJlc3VsdCwgcGxhbmVBeGlzMVJlc3VsdCwgcGxhbmVBeGlzMlJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgicG9zaXRpb25zIiwgcG9zaXRpb25zKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImNlbnRlclJlc3VsdCIsIGNlbnRlclJlc3VsdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJwbGFuZUF4aXMxUmVzdWx0IiwgcGxhbmVBeGlzMVJlc3VsdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJwbGFuZUF4aXMyUmVzdWx0IiwgcGxhbmVBeGlzMlJlc3VsdCk7CiAgICAgICAgY29uc3Qgb3JpZW50ZWRCb3VuZGluZ0JveCA9IE9yaWVudGVkQm91bmRpbmdCb3hfZGVmYXVsdC5mcm9tUG9pbnRzKAogICAgICAgICAgcG9zaXRpb25zLAogICAgICAgICAgb2JiU2NyYXRjaAogICAgICAgICk7CiAgICAgICAgY29uc3QgaGFsZkF4ZXMgPSBvcmllbnRlZEJvdW5kaW5nQm94LmhhbGZBeGVzOwogICAgICAgIGNvbnN0IHhBeGlzID0gTWF0cml4M19kZWZhdWx0LmdldENvbHVtbihoYWxmQXhlcywgMCwgc2NyYXRjaFhBeGlzMik7CiAgICAgICAgY29uc3QgeUF4aXMgPSBNYXRyaXgzX2RlZmF1bHQuZ2V0Q29sdW1uKGhhbGZBeGVzLCAxLCBzY3JhdGNoWUF4aXMyKTsKICAgICAgICBjb25zdCB6QXhpcyA9IE1hdHJpeDNfZGVmYXVsdC5nZXRDb2x1bW4oaGFsZkF4ZXMsIDIsIHNjcmF0Y2haQXhpczIpOwogICAgICAgIGNvbnN0IHhNYWcgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlKHhBeGlzKTsKICAgICAgICBjb25zdCB5TWFnID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZSh5QXhpcyk7CiAgICAgICAgY29uc3Qgek1hZyA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUoekF4aXMpOwogICAgICAgIGNvbnN0IG1pbjMgPSBNYXRoLm1pbih4TWFnLCB5TWFnLCB6TWFnKTsKICAgICAgICBpZiAoeE1hZyA9PT0gMCAmJiAoeU1hZyA9PT0gMCB8fCB6TWFnID09PSAwKSB8fCB5TWFnID09PSAwICYmIHpNYWcgPT09IDApIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgbGV0IHBsYW5lQXhpczE7CiAgICAgICAgbGV0IHBsYW5lQXhpczI7CiAgICAgICAgaWYgKG1pbjMgPT09IHlNYWcgfHwgbWluMyA9PT0gek1hZykgewogICAgICAgICAgcGxhbmVBeGlzMSA9IHhBeGlzOwogICAgICAgIH0KICAgICAgICBpZiAobWluMyA9PT0geE1hZykgewogICAgICAgICAgcGxhbmVBeGlzMSA9IHlBeGlzOwogICAgICAgIH0gZWxzZSBpZiAobWluMyA9PT0gek1hZykgewogICAgICAgICAgcGxhbmVBeGlzMiA9IHlBeGlzOwogICAgICAgIH0KICAgICAgICBpZiAobWluMyA9PT0geE1hZyB8fCBtaW4zID09PSB5TWFnKSB7CiAgICAgICAgICBwbGFuZUF4aXMyID0gekF4aXM7CiAgICAgICAgfQogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUocGxhbmVBeGlzMSwgcGxhbmVBeGlzMVJlc3VsdCk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShwbGFuZUF4aXMyLCBwbGFuZUF4aXMyUmVzdWx0KTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUob3JpZW50ZWRCb3VuZGluZ0JveC5jZW50ZXIsIGNlbnRlclJlc3VsdCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH07CiAgICAgIENvcGxhbmFyUG9seWdvbkdlb21ldHJ5TGlicmFyeS5jcmVhdGVQcm9qZWN0UG9pbnRzVG8yREZ1bmN0aW9uID0gZnVuY3Rpb24oY2VudGVyLCBheGlzMSwgYXhpczIpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24ocG9zaXRpb25zKSB7CiAgICAgICAgICBjb25zdCBwb3NpdGlvblJlc3VsdHMgPSBuZXcgQXJyYXkocG9zaXRpb25zLmxlbmd0aCk7CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBwb3NpdGlvblJlc3VsdHNbaV0gPSBwcm9qZWN0VG8yRChwb3NpdGlvbnNbaV0sIGNlbnRlciwgYXhpczEsIGF4aXMyKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwb3NpdGlvblJlc3VsdHM7CiAgICAgICAgfTsKICAgICAgfTsKICAgICAgQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5LmNyZWF0ZVByb2plY3RQb2ludFRvMkRGdW5jdGlvbiA9IGZ1bmN0aW9uKGNlbnRlciwgYXhpczEsIGF4aXMyKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHBvc2l0aW9uLCByZXN1bHQpIHsKICAgICAgICAgIHJldHVybiBwcm9qZWN0VG8yRChwb3NpdGlvbiwgY2VudGVyLCBheGlzMSwgYXhpczIsIHJlc3VsdCk7CiAgICAgICAgfTsKICAgICAgfTsKICAgICAgQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQgPSBDb3BsYW5hclBvbHlnb25HZW9tZXRyeUxpYnJhcnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9BcmNUeXBlLmpzCiAgdmFyIEFyY1R5cGUsIEFyY1R5cGVfZGVmYXVsdDsKICB2YXIgaW5pdF9BcmNUeXBlID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9BcmNUeXBlLmpzIigpIHsKICAgICAgQXJjVHlwZSA9IHsKICAgICAgICAvKioKICAgICAgICAgKiBTdHJhaWdodCBsaW5lIHRoYXQgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgc3VyZmFjZSBvZiB0aGUgZWxsaXBzb2lkLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBOT05FOiAwLAogICAgICAgIC8qKgogICAgICAgICAqIEZvbGxvdyBnZW9kZXNpYyBwYXRoLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBHRU9ERVNJQzogMSwKICAgICAgICAvKioKICAgICAgICAgKiBGb2xsb3cgcmh1bWIgb3IgbG94b2Ryb21lIHBhdGguCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFJIVU1COiAyCiAgICAgIH07CiAgICAgIEFyY1R5cGVfZGVmYXVsdCA9IE9iamVjdC5mcmVlemUoQXJjVHlwZSk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9FbGxpcHNvaWRSaHVtYkxpbmUuanMKICBmdW5jdGlvbiBjYWxjdWxhdGVNKGVsbGlwdGljaXR5LCBtYWpvciwgbGF0aXR1ZGUpIHsKICAgIGlmIChlbGxpcHRpY2l0eSA9PT0gMCkgewogICAgICByZXR1cm4gbWFqb3IgKiBsYXRpdHVkZTsKICAgIH0KICAgIGNvbnN0IGUyID0gZWxsaXB0aWNpdHkgKiBlbGxpcHRpY2l0eTsKICAgIGNvbnN0IGU0ID0gZTIgKiBlMjsKICAgIGNvbnN0IGU2ID0gZTQgKiBlMjsKICAgIGNvbnN0IGU4ID0gZTYgKiBlMjsKICAgIGNvbnN0IGUxMCA9IGU4ICogZTI7CiAgICBjb25zdCBlMTIgPSBlMTAgKiBlMjsKICAgIGNvbnN0IHBoaSA9IGxhdGl0dWRlOwogICAgY29uc3Qgc2luMlBoaSA9IE1hdGguc2luKDIgKiBwaGkpOwogICAgY29uc3Qgc2luNFBoaSA9IE1hdGguc2luKDQgKiBwaGkpOwogICAgY29uc3Qgc2luNlBoaSA9IE1hdGguc2luKDYgKiBwaGkpOwogICAgY29uc3Qgc2luOFBoaSA9IE1hdGguc2luKDggKiBwaGkpOwogICAgY29uc3Qgc2luMTBQaGkgPSBNYXRoLnNpbigxMCAqIHBoaSk7CiAgICBjb25zdCBzaW4xMlBoaSA9IE1hdGguc2luKDEyICogcGhpKTsKICAgIHJldHVybiBtYWpvciAqICgoMSAtIGUyIC8gNCAtIDMgKiBlNCAvIDY0IC0gNSAqIGU2IC8gMjU2IC0gMTc1ICogZTggLyAxNjM4NCAtIDQ0MSAqIGUxMCAvIDY1NTM2IC0gNDg1MSAqIGUxMiAvIDEwNDg1NzYpICogcGhpIC0gKDMgKiBlMiAvIDggKyAzICogZTQgLyAzMiArIDQ1ICogZTYgLyAxMDI0ICsgMTA1ICogZTggLyA0MDk2ICsgMjIwNSAqIGUxMCAvIDEzMTA3MiArIDYyMzcgKiBlMTIgLyA1MjQyODgpICogc2luMlBoaSArICgxNSAqIGU0IC8gMjU2ICsgNDUgKiBlNiAvIDEwMjQgKyA1MjUgKiBlOCAvIDE2Mzg0ICsgMTU3NSAqIGUxMCAvIDY1NTM2ICsgMTU1OTI1ICogZTEyIC8gODM4ODYwOCkgKiBzaW40UGhpIC0gKDM1ICogZTYgLyAzMDcyICsgMTc1ICogZTggLyAxMjI4OCArIDM2NzUgKiBlMTAgLyAyNjIxNDQgKyAxMzQ3NSAqIGUxMiAvIDEwNDg1NzYpICogc2luNlBoaSArICgzMTUgKiBlOCAvIDEzMTA3MiArIDIyMDUgKiBlMTAgLyA1MjQyODggKyA0MzY1OSAqIGUxMiAvIDgzODg2MDgpICogc2luOFBoaSAtICg2OTMgKiBlMTAgLyAxMzEwNzIwICsgNjIzNyAqIGUxMiAvIDUyNDI4ODApICogc2luMTBQaGkgKyAxMDAxICogZTEyIC8gODM4ODYwOCAqIHNpbjEyUGhpKTsKICB9CiAgZnVuY3Rpb24gY2FsY3VsYXRlSW52ZXJzZU0oTSwgZWxsaXB0aWNpdHksIG1ham9yKSB7CiAgICBjb25zdCBkID0gTSAvIG1ham9yOwogICAgaWYgKGVsbGlwdGljaXR5ID09PSAwKSB7CiAgICAgIHJldHVybiBkOwogICAgfQogICAgY29uc3QgZDIgPSBkICogZDsKICAgIGNvbnN0IGQzID0gZDIgKiBkOwogICAgY29uc3QgZDQgPSBkMyAqIGQ7CiAgICBjb25zdCBlID0gZWxsaXB0aWNpdHk7CiAgICBjb25zdCBlMiA9IGUgKiBlOwogICAgY29uc3QgZTQgPSBlMiAqIGUyOwogICAgY29uc3QgZTYgPSBlNCAqIGUyOwogICAgY29uc3QgZTggPSBlNiAqIGUyOwogICAgY29uc3QgZTEwID0gZTggKiBlMjsKICAgIGNvbnN0IGUxMiA9IGUxMCAqIGUyOwogICAgY29uc3Qgc2luMkQgPSBNYXRoLnNpbigyICogZCk7CiAgICBjb25zdCBjb3MyRCA9IE1hdGguY29zKDIgKiBkKTsKICAgIGNvbnN0IHNpbjREID0gTWF0aC5zaW4oNCAqIGQpOwogICAgY29uc3QgY29zNEQgPSBNYXRoLmNvcyg0ICogZCk7CiAgICBjb25zdCBzaW42RCA9IE1hdGguc2luKDYgKiBkKTsKICAgIGNvbnN0IGNvczZEID0gTWF0aC5jb3MoNiAqIGQpOwogICAgY29uc3Qgc2luOEQgPSBNYXRoLnNpbig4ICogZCk7CiAgICBjb25zdCBjb3M4RCA9IE1hdGguY29zKDggKiBkKTsKICAgIGNvbnN0IHNpbjEwRCA9IE1hdGguc2luKDEwICogZCk7CiAgICBjb25zdCBjb3MxMEQgPSBNYXRoLmNvcygxMCAqIGQpOwogICAgY29uc3Qgc2luMTJEID0gTWF0aC5zaW4oMTIgKiBkKTsKICAgIHJldHVybiBkICsgZCAqIGUyIC8gNCArIDcgKiBkICogZTQgLyA2NCArIDE1ICogZCAqIGU2IC8gMjU2ICsgNTc5ICogZCAqIGU4IC8gMTYzODQgKyAxNTE1ICogZCAqIGUxMCAvIDY1NTM2ICsgMTY4MzcgKiBkICogZTEyIC8gMTA0ODU3NiArICgzICogZCAqIGU0IC8gMTYgKyA0NSAqIGQgKiBlNiAvIDI1NiAtIGQgKiAoMzIgKiBkMiAtIDU2MSkgKiBlOCAvIDQwOTYgLSBkICogKDIzMiAqIGQyIC0gMTY3NykgKiBlMTAgLyAxNjM4NCArIGQgKiAoMzk5OTg1IC0gOTA1NjAgKiBkMiArIDUxMiAqIGQ0KSAqIGUxMiAvIDUyNDI4ODApICogY29zMkQgKyAoMjEgKiBkICogZTYgLyAyNTYgKyA0ODMgKiBkICogZTggLyA0MDk2IC0gZCAqICgyMjQgKiBkMiAtIDE5NjkpICogZTEwIC8gMTYzODQgLSBkICogKDMzMTUyICogZDIgLSAxMTI1OTkpICogZTEyIC8gMTA0ODU3NikgKiBjb3M0RCArICgxNTEgKiBkICogZTggLyA0MDk2ICsgNDY4MSAqIGQgKiBlMTAgLyA2NTUzNiArIDE0NzkgKiBkICogZTEyIC8gMTYzODQgLSA0NTMgKiBkMyAqIGUxMiAvIDMyNzY4KSAqIGNvczZEICsgKDEwOTcgKiBkICogZTEwIC8gNjU1MzYgKyA0Mjc4MyAqIGQgKiBlMTIgLyAxMDQ4NTc2KSAqIGNvczhEICsgODAxMSAqIGQgKiBlMTIgLyAxMDQ4NTc2ICogY29zMTBEICsgKDMgKiBlMiAvIDggKyAzICogZTQgLyAxNiArIDIxMyAqIGU2IC8gMjA0OCAtIDMgKiBkMiAqIGU2IC8gNjQgKyAyNTUgKiBlOCAvIDQwOTYgLSAzMyAqIGQyICogZTggLyA1MTIgKyAyMDg2MSAqIGUxMCAvIDUyNDI4OCAtIDMzICogZDIgKiBlMTAgLyA1MTIgKyBkNCAqIGUxMCAvIDEwMjQgKyAyODI3MyAqIGUxMiAvIDEwNDg1NzYgLSA0NzEgKiBkMiAqIGUxMiAvIDgxOTIgKyA5ICogZDQgKiBlMTIgLyA0MDk2KSAqIHNpbjJEICsgKDIxICogZTQgLyAyNTYgKyAyMSAqIGU2IC8gMjU2ICsgNTMzICogZTggLyA4MTkyIC0gMjEgKiBkMiAqIGU4IC8gNTEyICsgMTk3ICogZTEwIC8gNDA5NiAtIDMxNSAqIGQyICogZTEwIC8gNDA5NiArIDU4NDAzOSAqIGUxMiAvIDE2Nzc3MjE2IC0gMTI1MTcgKiBkMiAqIGUxMiAvIDEzMTA3MiArIDcgKiBkNCAqIGUxMiAvIDIwNDgpICogc2luNEQgKyAoMTUxICogZTYgLyA2MTQ0ICsgMTUxICogZTggLyA0MDk2ICsgNTAxOSAqIGUxMCAvIDEzMTA3MiAtIDQ1MyAqIGQyICogZTEwIC8gMTYzODQgKyAyNjk2NSAqIGUxMiAvIDc4NjQzMiAtIDg2MDcgKiBkMiAqIGUxMiAvIDEzMTA3MikgKiBzaW42RCArICgxMDk3ICogZTggLyAxMzEwNzIgKyAxMDk3ICogZTEwIC8gNjU1MzYgKyAyMjU3OTcgKiBlMTIgLyAxMDQ4NTc2MCAtIDEwOTcgKiBkMiAqIGUxMiAvIDY1NTM2KSAqIHNpbjhEICsgKDgwMTEgKiBlMTAgLyAyNjIxNDQwICsgODAxMSAqIGUxMiAvIDEwNDg1NzYpICogc2luMTBEICsgMjkzMzkzICogZTEyIC8gMjUxNjU4MjQwICogc2luMTJEOwogIH0KICBmdW5jdGlvbiBjYWxjdWxhdGVTaWdtYShlbGxpcHRpY2l0eSwgbGF0aXR1ZGUpIHsKICAgIGlmIChlbGxpcHRpY2l0eSA9PT0gMCkgewogICAgICByZXR1cm4gTWF0aC5sb2coTWF0aC50YW4oMC41ICogKE1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTyArIGxhdGl0dWRlKSkpOwogICAgfQogICAgY29uc3QgZVNpbkwgPSBlbGxpcHRpY2l0eSAqIE1hdGguc2luKGxhdGl0dWRlKTsKICAgIHJldHVybiBNYXRoLmxvZyhNYXRoLnRhbigwLjUgKiAoTWF0aF9kZWZhdWx0LlBJX09WRVJfVFdPICsgbGF0aXR1ZGUpKSkgLSBlbGxpcHRpY2l0eSAvIDIgKiBNYXRoLmxvZygoMSArIGVTaW5MKSAvICgxIC0gZVNpbkwpKTsKICB9CiAgZnVuY3Rpb24gY2FsY3VsYXRlSGVhZGluZyhlbGxpcHNvaWRSaHVtYkxpbmUsIGZpcnN0TG9uZ2l0dWRlLCBmaXJzdExhdGl0dWRlLCBzZWNvbmRMb25naXR1ZGUsIHNlY29uZExhdGl0dWRlKSB7CiAgICBjb25zdCBzaWdtYTEgPSBjYWxjdWxhdGVTaWdtYShlbGxpcHNvaWRSaHVtYkxpbmUuX2VsbGlwdGljaXR5LCBmaXJzdExhdGl0dWRlKTsKICAgIGNvbnN0IHNpZ21hMiA9IGNhbGN1bGF0ZVNpZ21hKAogICAgICBlbGxpcHNvaWRSaHVtYkxpbmUuX2VsbGlwdGljaXR5LAogICAgICBzZWNvbmRMYXRpdHVkZQogICAgKTsKICAgIHJldHVybiBNYXRoLmF0YW4yKAogICAgICBNYXRoX2RlZmF1bHQubmVnYXRpdmVQaVRvUGkoc2Vjb25kTG9uZ2l0dWRlIC0gZmlyc3RMb25naXR1ZGUpLAogICAgICBzaWdtYTIgLSBzaWdtYTEKICAgICk7CiAgfQogIGZ1bmN0aW9uIGNhbGN1bGF0ZUFyY0xlbmd0aChlbGxpcHNvaWRSaHVtYkxpbmUsIG1ham9yLCBtaW5vciwgZmlyc3RMb25naXR1ZGUsIGZpcnN0TGF0aXR1ZGUsIHNlY29uZExvbmdpdHVkZSwgc2Vjb25kTGF0aXR1ZGUpIHsKICAgIGNvbnN0IGhlYWRpbmcgPSBlbGxpcHNvaWRSaHVtYkxpbmUuX2hlYWRpbmc7CiAgICBjb25zdCBkZWx0YUxvbmdpdHVkZSA9IHNlY29uZExvbmdpdHVkZSAtIGZpcnN0TG9uZ2l0dWRlOwogICAgbGV0IGRpc3RhbmNlID0gMDsKICAgIGlmIChNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgTWF0aC5hYnMoaGVhZGluZyksCiAgICAgIE1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTywKICAgICAgTWF0aF9kZWZhdWx0LkVQU0lMT044CiAgICApKSB7CiAgICAgIGlmIChtYWpvciA9PT0gbWlub3IpIHsKICAgICAgICBkaXN0YW5jZSA9IG1ham9yICogTWF0aC5jb3MoZmlyc3RMYXRpdHVkZSkgKiBNYXRoX2RlZmF1bHQubmVnYXRpdmVQaVRvUGkoZGVsdGFMb25naXR1ZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHNpblBoaSA9IE1hdGguc2luKGZpcnN0TGF0aXR1ZGUpOwogICAgICAgIGRpc3RhbmNlID0gbWFqb3IgKiBNYXRoLmNvcyhmaXJzdExhdGl0dWRlKSAqIE1hdGhfZGVmYXVsdC5uZWdhdGl2ZVBpVG9QaShkZWx0YUxvbmdpdHVkZSkgLyBNYXRoLnNxcnQoMSAtIGVsbGlwc29pZFJodW1iTGluZS5fZWxsaXB0aWNpdHlTcXVhcmVkICogc2luUGhpICogc2luUGhpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY29uc3QgTTEgPSBjYWxjdWxhdGVNKAogICAgICAgIGVsbGlwc29pZFJodW1iTGluZS5fZWxsaXB0aWNpdHksCiAgICAgICAgbWFqb3IsCiAgICAgICAgZmlyc3RMYXRpdHVkZQogICAgICApOwogICAgICBjb25zdCBNMiA9IGNhbGN1bGF0ZU0oCiAgICAgICAgZWxsaXBzb2lkUmh1bWJMaW5lLl9lbGxpcHRpY2l0eSwKICAgICAgICBtYWpvciwKICAgICAgICBzZWNvbmRMYXRpdHVkZQogICAgICApOwogICAgICBkaXN0YW5jZSA9IChNMiAtIE0xKSAvIE1hdGguY29zKGhlYWRpbmcpOwogICAgfQogICAgcmV0dXJuIE1hdGguYWJzKGRpc3RhbmNlKTsKICB9CiAgZnVuY3Rpb24gY29tcHV0ZVByb3BlcnRpZXMoZWxsaXBzb2lkUmh1bWJMaW5lLCBzdGFydCwgZW5kLCBlbGxpcHNvaWQpIHsKICAgIGNvbnN0IGZpcnN0Q2FydGVzaWFuID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKHN0YXJ0LCBzY3JhdGNoQ2FydDIpLAogICAgICBzY3JhdGNoQ2FydDEKICAgICk7CiAgICBjb25zdCBsYXN0Q2FydGVzaWFuID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGVuZCwgc2NyYXRjaENhcnQyKSwKICAgICAgc2NyYXRjaENhcnQyCiAgICApOwogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoCiAgICAgICJ2YWx1ZSIsCiAgICAgIE1hdGguYWJzKAogICAgICAgIE1hdGguYWJzKENhcnRlc2lhbjNfZGVmYXVsdC5hbmdsZUJldHdlZW4oZmlyc3RDYXJ0ZXNpYW4sIGxhc3RDYXJ0ZXNpYW4pKSAtIE1hdGguUEkKICAgICAgKSwKICAgICAgMC4wMTI1CiAgICApOwogICAgY29uc3QgbWFqb3IgPSBlbGxpcHNvaWQubWF4aW11bVJhZGl1czsKICAgIGNvbnN0IG1pbm9yID0gZWxsaXBzb2lkLm1pbmltdW1SYWRpdXM7CiAgICBjb25zdCBtYWpvclNxdWFyZWQgPSBtYWpvciAqIG1ham9yOwogICAgY29uc3QgbWlub3JTcXVhcmVkID0gbWlub3IgKiBtaW5vcjsKICAgIGVsbGlwc29pZFJodW1iTGluZS5fZWxsaXB0aWNpdHlTcXVhcmVkID0gKG1ham9yU3F1YXJlZCAtIG1pbm9yU3F1YXJlZCkgLyBtYWpvclNxdWFyZWQ7CiAgICBlbGxpcHNvaWRSaHVtYkxpbmUuX2VsbGlwdGljaXR5ID0gTWF0aC5zcXJ0KAogICAgICBlbGxpcHNvaWRSaHVtYkxpbmUuX2VsbGlwdGljaXR5U3F1YXJlZAogICAgKTsKICAgIGVsbGlwc29pZFJodW1iTGluZS5fc3RhcnQgPSBDYXJ0b2dyYXBoaWNfZGVmYXVsdC5jbG9uZSgKICAgICAgc3RhcnQsCiAgICAgIGVsbGlwc29pZFJodW1iTGluZS5fc3RhcnQKICAgICk7CiAgICBlbGxpcHNvaWRSaHVtYkxpbmUuX3N0YXJ0LmhlaWdodCA9IDA7CiAgICBlbGxpcHNvaWRSaHVtYkxpbmUuX2VuZCA9IENhcnRvZ3JhcGhpY19kZWZhdWx0LmNsb25lKGVuZCwgZWxsaXBzb2lkUmh1bWJMaW5lLl9lbmQpOwogICAgZWxsaXBzb2lkUmh1bWJMaW5lLl9lbmQuaGVpZ2h0ID0gMDsKICAgIGVsbGlwc29pZFJodW1iTGluZS5faGVhZGluZyA9IGNhbGN1bGF0ZUhlYWRpbmcoCiAgICAgIGVsbGlwc29pZFJodW1iTGluZSwKICAgICAgc3RhcnQubG9uZ2l0dWRlLAogICAgICBzdGFydC5sYXRpdHVkZSwKICAgICAgZW5kLmxvbmdpdHVkZSwKICAgICAgZW5kLmxhdGl0dWRlCiAgICApOwogICAgZWxsaXBzb2lkUmh1bWJMaW5lLl9kaXN0YW5jZSA9IGNhbGN1bGF0ZUFyY0xlbmd0aCgKICAgICAgZWxsaXBzb2lkUmh1bWJMaW5lLAogICAgICBlbGxpcHNvaWQubWF4aW11bVJhZGl1cywKICAgICAgZWxsaXBzb2lkLm1pbmltdW1SYWRpdXMsCiAgICAgIHN0YXJ0LmxvbmdpdHVkZSwKICAgICAgc3RhcnQubGF0aXR1ZGUsCiAgICAgIGVuZC5sb25naXR1ZGUsCiAgICAgIGVuZC5sYXRpdHVkZQogICAgKTsKICB9CiAgZnVuY3Rpb24gaW50ZXJwb2xhdGVVc2luZ1N1cmZhY2VEaXN0YW5jZShzdGFydCwgaGVhZGluZywgZGlzdGFuY2UsIG1ham9yLCBlbGxpcHRpY2l0eSwgcmVzdWx0KSB7CiAgICBpZiAoZGlzdGFuY2UgPT09IDApIHsKICAgICAgcmV0dXJuIENhcnRvZ3JhcGhpY19kZWZhdWx0LmNsb25lKHN0YXJ0LCByZXN1bHQpOwogICAgfQogICAgY29uc3QgZWxsaXB0aWNpdHlTcXVhcmVkID0gZWxsaXB0aWNpdHkgKiBlbGxpcHRpY2l0eTsKICAgIGxldCBsb25naXR1ZGU7CiAgICBsZXQgbGF0aXR1ZGU7CiAgICBsZXQgZGVsdGFMb25naXR1ZGU7CiAgICBpZiAoTWF0aC5hYnMoTWF0aF9kZWZhdWx0LlBJX09WRVJfVFdPIC0gTWF0aC5hYnMoaGVhZGluZykpID4gTWF0aF9kZWZhdWx0LkVQU0lMT044KSB7CiAgICAgIGNvbnN0IE0xID0gY2FsY3VsYXRlTShlbGxpcHRpY2l0eSwgbWFqb3IsIHN0YXJ0LmxhdGl0dWRlKTsKICAgICAgY29uc3QgZGVsdGFNID0gZGlzdGFuY2UgKiBNYXRoLmNvcyhoZWFkaW5nKTsKICAgICAgY29uc3QgTTIgPSBNMSArIGRlbHRhTTsKICAgICAgbGF0aXR1ZGUgPSBjYWxjdWxhdGVJbnZlcnNlTShNMiwgZWxsaXB0aWNpdHksIG1ham9yKTsKICAgICAgaWYgKE1hdGguYWJzKGhlYWRpbmcpIDwgTWF0aF9kZWZhdWx0LkVQU0lMT04xMCkgewogICAgICAgIGxvbmdpdHVkZSA9IE1hdGhfZGVmYXVsdC5uZWdhdGl2ZVBpVG9QaShzdGFydC5sb25naXR1ZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHNpZ21hMSA9IGNhbGN1bGF0ZVNpZ21hKGVsbGlwdGljaXR5LCBzdGFydC5sYXRpdHVkZSk7CiAgICAgICAgY29uc3Qgc2lnbWEyID0gY2FsY3VsYXRlU2lnbWEoZWxsaXB0aWNpdHksIGxhdGl0dWRlKTsKICAgICAgICBkZWx0YUxvbmdpdHVkZSA9IE1hdGgudGFuKGhlYWRpbmcpICogKHNpZ21hMiAtIHNpZ21hMSk7CiAgICAgICAgbG9uZ2l0dWRlID0gTWF0aF9kZWZhdWx0Lm5lZ2F0aXZlUGlUb1BpKHN0YXJ0LmxvbmdpdHVkZSArIGRlbHRhTG9uZ2l0dWRlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbGF0aXR1ZGUgPSBzdGFydC5sYXRpdHVkZTsKICAgICAgbGV0IGxvY2FsUmFkOwogICAgICBpZiAoZWxsaXB0aWNpdHkgPT09IDApIHsKICAgICAgICBsb2NhbFJhZCA9IG1ham9yICogTWF0aC5jb3Moc3RhcnQubGF0aXR1ZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHNpblBoaSA9IE1hdGguc2luKHN0YXJ0LmxhdGl0dWRlKTsKICAgICAgICBsb2NhbFJhZCA9IG1ham9yICogTWF0aC5jb3Moc3RhcnQubGF0aXR1ZGUpIC8gTWF0aC5zcXJ0KDEgLSBlbGxpcHRpY2l0eVNxdWFyZWQgKiBzaW5QaGkgKiBzaW5QaGkpOwogICAgICB9CiAgICAgIGRlbHRhTG9uZ2l0dWRlID0gZGlzdGFuY2UgLyBsb2NhbFJhZDsKICAgICAgaWYgKGhlYWRpbmcgPiAwKSB7CiAgICAgICAgbG9uZ2l0dWRlID0gTWF0aF9kZWZhdWx0Lm5lZ2F0aXZlUGlUb1BpKHN0YXJ0LmxvbmdpdHVkZSArIGRlbHRhTG9uZ2l0dWRlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsb25naXR1ZGUgPSBNYXRoX2RlZmF1bHQubmVnYXRpdmVQaVRvUGkoc3RhcnQubG9uZ2l0dWRlIC0gZGVsdGFMb25naXR1ZGUpOwogICAgICB9CiAgICB9CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgcmVzdWx0LmxvbmdpdHVkZSA9IGxvbmdpdHVkZTsKICAgICAgcmVzdWx0LmxhdGl0dWRlID0gbGF0aXR1ZGU7CiAgICAgIHJlc3VsdC5oZWlnaHQgPSAwOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdChsb25naXR1ZGUsIGxhdGl0dWRlLCAwKTsKICB9CiAgZnVuY3Rpb24gRWxsaXBzb2lkUmh1bWJMaW5lKHN0YXJ0LCBlbmQsIGVsbGlwc29pZCkgewogICAgY29uc3QgZSA9IGVsbGlwc29pZCA/PyBFbGxpcHNvaWRfZGVmYXVsdC5kZWZhdWx0OwogICAgdGhpcy5fZWxsaXBzb2lkID0gZTsKICAgIHRoaXMuX3N0YXJ0ID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICB0aGlzLl9lbmQgPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgIHRoaXMuX2hlYWRpbmcgPSB2b2lkIDA7CiAgICB0aGlzLl9kaXN0YW5jZSA9IHZvaWQgMDsKICAgIHRoaXMuX2VsbGlwdGljaXR5ID0gdm9pZCAwOwogICAgdGhpcy5fZWxsaXB0aWNpdHlTcXVhcmVkID0gdm9pZCAwOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdChzdGFydCkgJiYgZGVmaW5lZF9kZWZhdWx0KGVuZCkpIHsKICAgICAgY29tcHV0ZVByb3BlcnRpZXModGhpcywgc3RhcnQsIGVuZCwgZSk7CiAgICB9CiAgfQogIHZhciBzY3JhdGNoQ2FydDEsIHNjcmF0Y2hDYXJ0MiwgRWxsaXBzb2lkUmh1bWJMaW5lX2RlZmF1bHQ7CiAgdmFyIGluaXRfRWxsaXBzb2lkUmh1bWJMaW5lID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9FbGxpcHNvaWRSaHVtYkxpbmUuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DYXJ0b2dyYXBoaWMoKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgc2NyYXRjaENhcnQxID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydDIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEVsbGlwc29pZFJodW1iTGluZS5wcm90b3R5cGUsIHsKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBlbGxpcHNvaWQuCiAgICAgICAgICogQG1lbWJlcm9mIEVsbGlwc29pZFJodW1iTGluZS5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7RWxsaXBzb2lkfQogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqLwogICAgICAgIGVsbGlwc29pZDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VsbGlwc29pZDsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIHN1cmZhY2UgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCBwb2ludAogICAgICAgICAqIEBtZW1iZXJvZiBFbGxpcHNvaWRSaHVtYkxpbmUucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKi8KICAgICAgICBzdXJmYWNlRGlzdGFuY2U6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiZGlzdGFuY2UiLCB0aGlzLl9kaXN0YW5jZSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kaXN0YW5jZTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGluaXRpYWwgcGxhbmV0b2RldGljIHBvaW50IG9uIHRoZSBwYXRoLgogICAgICAgICAqIEBtZW1iZXJvZiBFbGxpcHNvaWRSaHVtYkxpbmUucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge0NhcnRvZ3JhcGhpY30KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKi8KICAgICAgICBzdGFydDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0OwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZmluYWwgcGxhbmV0b2RldGljIHBvaW50IG9uIHRoZSBwYXRoLgogICAgICAgICAqIEBtZW1iZXJvZiBFbGxpcHNvaWRSaHVtYkxpbmUucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge0NhcnRvZ3JhcGhpY30KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKi8KICAgICAgICBlbmQ6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmQ7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBoZWFkaW5nIGZyb20gdGhlIHN0YXJ0IHBvaW50IHRvIHRoZSBlbmQgcG9pbnQuCiAgICAgICAgICogQG1lbWJlcm9mIEVsbGlwc29pZFJodW1iTGluZS5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqLwogICAgICAgIGhlYWRpbmc6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiZGlzdGFuY2UiLCB0aGlzLl9kaXN0YW5jZSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oZWFkaW5nOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIEVsbGlwc29pZFJodW1iTGluZS5mcm9tU3RhcnRIZWFkaW5nRGlzdGFuY2UgPSBmdW5jdGlvbihzdGFydCwgaGVhZGluZywgZGlzdGFuY2UsIGVsbGlwc29pZCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJzdGFydCIsIHN0YXJ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImhlYWRpbmciLCBoZWFkaW5nKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImRpc3RhbmNlIiwgZGlzdGFuY2UpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbigiZGlzdGFuY2UiLCBkaXN0YW5jZSwgMCk7CiAgICAgICAgY29uc3QgZSA9IGVsbGlwc29pZCA/PyBFbGxpcHNvaWRfZGVmYXVsdC5kZWZhdWx0OwogICAgICAgIGNvbnN0IG1ham9yID0gZS5tYXhpbXVtUmFkaXVzOwogICAgICAgIGNvbnN0IG1pbm9yID0gZS5taW5pbXVtUmFkaXVzOwogICAgICAgIGNvbnN0IG1ham9yU3F1YXJlZCA9IG1ham9yICogbWFqb3I7CiAgICAgICAgY29uc3QgbWlub3JTcXVhcmVkID0gbWlub3IgKiBtaW5vcjsKICAgICAgICBjb25zdCBlbGxpcHRpY2l0eSA9IE1hdGguc3FydCgobWFqb3JTcXVhcmVkIC0gbWlub3JTcXVhcmVkKSAvIG1ham9yU3F1YXJlZCk7CiAgICAgICAgaGVhZGluZyA9IE1hdGhfZGVmYXVsdC5uZWdhdGl2ZVBpVG9QaShoZWFkaW5nKTsKICAgICAgICBjb25zdCBlbmQgPSBpbnRlcnBvbGF0ZVVzaW5nU3VyZmFjZURpc3RhbmNlKAogICAgICAgICAgc3RhcnQsCiAgICAgICAgICBoZWFkaW5nLAogICAgICAgICAgZGlzdGFuY2UsCiAgICAgICAgICBlLm1heGltdW1SYWRpdXMsCiAgICAgICAgICBlbGxpcHRpY2l0eQogICAgICAgICk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSB8fCBkZWZpbmVkX2RlZmF1bHQoZWxsaXBzb2lkKSAmJiAhZWxsaXBzb2lkLmVxdWFscyhyZXN1bHQuZWxsaXBzb2lkKSkgewogICAgICAgICAgcmV0dXJuIG5ldyBFbGxpcHNvaWRSaHVtYkxpbmUoc3RhcnQsIGVuZCwgZSk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5zZXRFbmRQb2ludHMoc3RhcnQsIGVuZCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgRWxsaXBzb2lkUmh1bWJMaW5lLnByb3RvdHlwZS5zZXRFbmRQb2ludHMgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJzdGFydCIsIHN0YXJ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImVuZCIsIGVuZCk7CiAgICAgICAgY29tcHV0ZVByb3BlcnRpZXModGhpcywgc3RhcnQsIGVuZCwgdGhpcy5fZWxsaXBzb2lkKTsKICAgICAgfTsKICAgICAgRWxsaXBzb2lkUmh1bWJMaW5lLnByb3RvdHlwZS5pbnRlcnBvbGF0ZVVzaW5nRnJhY3Rpb24gPSBmdW5jdGlvbihmcmFjdGlvbiwgcmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJwb2xhdGVVc2luZ1N1cmZhY2VEaXN0YW5jZSgKICAgICAgICAgIGZyYWN0aW9uICogdGhpcy5fZGlzdGFuY2UsCiAgICAgICAgICByZXN1bHQKICAgICAgICApOwogICAgICB9OwogICAgICBFbGxpcHNvaWRSaHVtYkxpbmUucHJvdG90eXBlLmludGVycG9sYXRlVXNpbmdTdXJmYWNlRGlzdGFuY2UgPSBmdW5jdGlvbihkaXN0YW5jZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJkaXN0YW5jZSIsIGRpc3RhbmNlKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh0aGlzLl9kaXN0YW5jZSkgfHwgdGhpcy5fZGlzdGFuY2UgPT09IDApIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAiRWxsaXBzb2lkUmh1bWJMaW5lIG11c3QgaGF2ZSBkaXN0aW5jdCBzdGFydCBhbmQgZW5kIHNldC4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGVVc2luZ1N1cmZhY2VEaXN0YW5jZSgKICAgICAgICAgIHRoaXMuX3N0YXJ0LAogICAgICAgICAgdGhpcy5faGVhZGluZywKICAgICAgICAgIGRpc3RhbmNlLAogICAgICAgICAgdGhpcy5fZWxsaXBzb2lkLm1heGltdW1SYWRpdXMsCiAgICAgICAgICB0aGlzLl9lbGxpcHRpY2l0eSwKICAgICAgICAgIHJlc3VsdAogICAgICAgICk7CiAgICAgIH07CiAgICAgIEVsbGlwc29pZFJodW1iTGluZS5wcm90b3R5cGUuZmluZEludGVyc2VjdGlvbldpdGhMb25naXR1ZGUgPSBmdW5jdGlvbihpbnRlcnNlY3Rpb25Mb25naXR1ZGUsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigiaW50ZXJzZWN0aW9uTG9uZ2l0dWRlIiwgaW50ZXJzZWN0aW9uTG9uZ2l0dWRlKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh0aGlzLl9kaXN0YW5jZSkgfHwgdGhpcy5fZGlzdGFuY2UgPT09IDApIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAiRWxsaXBzb2lkUmh1bWJMaW5lIG11c3QgaGF2ZSBkaXN0aW5jdCBzdGFydCBhbmQgZW5kIHNldC4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCBlbGxpcHRpY2l0eSA9IHRoaXMuX2VsbGlwdGljaXR5OwogICAgICAgIGNvbnN0IGhlYWRpbmcgPSB0aGlzLl9oZWFkaW5nOwogICAgICAgIGNvbnN0IGFic0hlYWRpbmcgPSBNYXRoLmFicyhoZWFkaW5nKTsKICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuX3N0YXJ0OwogICAgICAgIGludGVyc2VjdGlvbkxvbmdpdHVkZSA9IE1hdGhfZGVmYXVsdC5uZWdhdGl2ZVBpVG9QaShpbnRlcnNlY3Rpb25Mb25naXR1ZGUpOwogICAgICAgIGlmIChNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgIE1hdGguYWJzKGludGVyc2VjdGlvbkxvbmdpdHVkZSksCiAgICAgICAgICBNYXRoLlBJLAogICAgICAgICAgTWF0aF9kZWZhdWx0LkVQU0lMT04xNAogICAgICAgICkpIHsKICAgICAgICAgIGludGVyc2VjdGlvbkxvbmdpdHVkZSA9IE1hdGhfZGVmYXVsdC5zaWduKHN0YXJ0LmxvbmdpdHVkZSkgKiBNYXRoLlBJOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgICB9CiAgICAgICAgaWYgKE1hdGguYWJzKE1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTyAtIGFic0hlYWRpbmcpIDw9IE1hdGhfZGVmYXVsdC5FUFNJTE9OOCkgewogICAgICAgICAgcmVzdWx0LmxvbmdpdHVkZSA9IGludGVyc2VjdGlvbkxvbmdpdHVkZTsKICAgICAgICAgIHJlc3VsdC5sYXRpdHVkZSA9IHN0YXJ0LmxhdGl0dWRlOwogICAgICAgICAgcmVzdWx0LmhlaWdodCA9IDA7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0gZWxzZSBpZiAoTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oCiAgICAgICAgICBNYXRoLmFicyhNYXRoX2RlZmF1bHQuUElfT1ZFUl9UV08gLSBhYnNIZWFkaW5nKSwKICAgICAgICAgIE1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTywKICAgICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9OOAogICAgICAgICkpIHsKICAgICAgICAgIGlmIChNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgICAgaW50ZXJzZWN0aW9uTG9uZ2l0dWRlLAogICAgICAgICAgICBzdGFydC5sb25naXR1ZGUsCiAgICAgICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9OMTIKICAgICAgICAgICkpIHsKICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdC5sb25naXR1ZGUgPSBpbnRlcnNlY3Rpb25Mb25naXR1ZGU7CiAgICAgICAgICByZXN1bHQubGF0aXR1ZGUgPSBNYXRoX2RlZmF1bHQuUElfT1ZFUl9UV08gKiBNYXRoX2RlZmF1bHQuc2lnbihNYXRoX2RlZmF1bHQuUElfT1ZFUl9UV08gLSBoZWFkaW5nKTsKICAgICAgICAgIHJlc3VsdC5oZWlnaHQgPSAwOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgY29uc3QgcGhpMSA9IHN0YXJ0LmxhdGl0dWRlOwogICAgICAgIGNvbnN0IGVTaW5QaGkxID0gZWxsaXB0aWNpdHkgKiBNYXRoLnNpbihwaGkxKTsKICAgICAgICBjb25zdCBsZWZ0Q29tcG9uZW50ID0gTWF0aC50YW4oMC41ICogKE1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTyArIHBoaTEpKSAqIE1hdGguZXhwKChpbnRlcnNlY3Rpb25Mb25naXR1ZGUgLSBzdGFydC5sb25naXR1ZGUpIC8gTWF0aC50YW4oaGVhZGluZykpOwogICAgICAgIGNvbnN0IGRlbm9taW5hdG9yID0gKDEgKyBlU2luUGhpMSkgLyAoMSAtIGVTaW5QaGkxKTsKICAgICAgICBsZXQgbmV3UGhpID0gc3RhcnQubGF0aXR1ZGU7CiAgICAgICAgbGV0IHBoaTsKICAgICAgICBkbyB7CiAgICAgICAgICBwaGkgPSBuZXdQaGk7CiAgICAgICAgICBjb25zdCBlU2luUGhpID0gZWxsaXB0aWNpdHkgKiBNYXRoLnNpbihwaGkpOwogICAgICAgICAgY29uc3QgbnVtZXJhdG9yID0gKDEgKyBlU2luUGhpKSAvICgxIC0gZVNpblBoaSk7CiAgICAgICAgICBuZXdQaGkgPSAyICogTWF0aC5hdGFuKAogICAgICAgICAgICBsZWZ0Q29tcG9uZW50ICogTWF0aC5wb3cobnVtZXJhdG9yIC8gZGVub21pbmF0b3IsIGVsbGlwdGljaXR5IC8gMikKICAgICAgICAgICkgLSBNYXRoX2RlZmF1bHQuUElfT1ZFUl9UV087CiAgICAgICAgfSB3aGlsZSAoIU1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKG5ld1BoaSwgcGhpLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjEyKSk7CiAgICAgICAgcmVzdWx0LmxvbmdpdHVkZSA9IGludGVyc2VjdGlvbkxvbmdpdHVkZTsKICAgICAgICByZXN1bHQubGF0aXR1ZGUgPSBuZXdQaGk7CiAgICAgICAgcmVzdWx0LmhlaWdodCA9IDA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgRWxsaXBzb2lkUmh1bWJMaW5lLnByb3RvdHlwZS5maW5kSW50ZXJzZWN0aW9uV2l0aExhdGl0dWRlID0gZnVuY3Rpb24oaW50ZXJzZWN0aW9uTGF0aXR1ZGUsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigiaW50ZXJzZWN0aW9uTGF0aXR1ZGUiLCBpbnRlcnNlY3Rpb25MYXRpdHVkZSk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodGhpcy5fZGlzdGFuY2UpIHx8IHRoaXMuX2Rpc3RhbmNlID09PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgIkVsbGlwc29pZFJodW1iTGluZSBtdXN0IGhhdmUgZGlzdGluY3Qgc3RhcnQgYW5kIGVuZCBzZXQuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZWxsaXB0aWNpdHkgPSB0aGlzLl9lbGxpcHRpY2l0eTsKICAgICAgICBjb25zdCBoZWFkaW5nID0gdGhpcy5faGVhZGluZzsKICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuX3N0YXJ0OwogICAgICAgIGlmIChNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgIE1hdGguYWJzKGhlYWRpbmcpLAogICAgICAgICAgTWF0aF9kZWZhdWx0LlBJX09WRVJfVFdPLAogICAgICAgICAgTWF0aF9kZWZhdWx0LkVQU0lMT044CiAgICAgICAgKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBzaWdtYTEgPSBjYWxjdWxhdGVTaWdtYShlbGxpcHRpY2l0eSwgc3RhcnQubGF0aXR1ZGUpOwogICAgICAgIGNvbnN0IHNpZ21hMiA9IGNhbGN1bGF0ZVNpZ21hKGVsbGlwdGljaXR5LCBpbnRlcnNlY3Rpb25MYXRpdHVkZSk7CiAgICAgICAgY29uc3QgZGVsdGFMb25naXR1ZGUgPSBNYXRoLnRhbihoZWFkaW5nKSAqIChzaWdtYTIgLSBzaWdtYTEpOwogICAgICAgIGNvbnN0IGxvbmdpdHVkZSA9IE1hdGhfZGVmYXVsdC5uZWdhdGl2ZVBpVG9QaShzdGFydC5sb25naXR1ZGUgKyBkZWx0YUxvbmdpdHVkZSk7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQubG9uZ2l0dWRlID0gbG9uZ2l0dWRlOwogICAgICAgICAgcmVzdWx0LmxhdGl0dWRlID0gaW50ZXJzZWN0aW9uTGF0aXR1ZGU7CiAgICAgICAgICByZXN1bHQuaGVpZ2h0ID0gMDsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQobG9uZ2l0dWRlLCBpbnRlcnNlY3Rpb25MYXRpdHVkZSwgMCk7CiAgICAgIH07CiAgICAgIEVsbGlwc29pZFJodW1iTGluZV9kZWZhdWx0ID0gRWxsaXBzb2lkUmh1bWJMaW5lOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUG9seWdvbkhpZXJhcmNoeS5qcwogIGZ1bmN0aW9uIFBvbHlnb25IaWVyYXJjaHkocG9zaXRpb25zLCBob2xlcykgewogICAgdGhpcy5wb3NpdGlvbnMgPSBkZWZpbmVkX2RlZmF1bHQocG9zaXRpb25zKSA/IHBvc2l0aW9ucyA6IFtdOwogICAgdGhpcy5ob2xlcyA9IGRlZmluZWRfZGVmYXVsdChob2xlcykgPyBob2xlcyA6IFtdOwogIH0KICB2YXIgUG9seWdvbkhpZXJhcmNoeV9kZWZhdWx0OwogIHZhciBpbml0X1BvbHlnb25IaWVyYXJjaHkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1BvbHlnb25IaWVyYXJjaHkuanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgUG9seWdvbkhpZXJhcmNoeV9kZWZhdWx0ID0gUG9seWdvbkhpZXJhcmNoeTsKICAgIH0KICB9KTsKCiAgLy8gbm9kZV9tb2R1bGVzL2VhcmN1dC9zcmMvZWFyY3V0LmpzCiAgZnVuY3Rpb24gZWFyY3V0KGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0gPSAyKSB7CiAgICBjb25zdCBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aDsKICAgIGNvbnN0IG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoOwogICAgbGV0IG91dGVyTm9kZSA9IGxpbmtlZExpc3QoZGF0YSwgMCwgb3V0ZXJMZW4sIGRpbSwgdHJ1ZSk7CiAgICBjb25zdCB0cmlhbmdsZXMgPSBbXTsKICAgIGlmICghb3V0ZXJOb2RlIHx8IG91dGVyTm9kZS5uZXh0ID09PSBvdXRlck5vZGUucHJldikgcmV0dXJuIHRyaWFuZ2xlczsKICAgIGxldCBtaW5YLCBtaW5ZLCBpbnZTaXplOwogICAgaWYgKGhhc0hvbGVzKSBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pOwogICAgaWYgKGRhdGEubGVuZ3RoID4gODAgKiBkaW0pIHsKICAgICAgbWluWCA9IGRhdGFbMF07CiAgICAgIG1pblkgPSBkYXRhWzFdOwogICAgICBsZXQgbWF4WCA9IG1pblg7CiAgICAgIGxldCBtYXhZID0gbWluWTsKICAgICAgZm9yIChsZXQgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSkgewogICAgICAgIGNvbnN0IHggPSBkYXRhW2ldOwogICAgICAgIGNvbnN0IHkgPSBkYXRhW2kgKyAxXTsKICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4OwogICAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHk7CiAgICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geDsKICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5OwogICAgICB9CiAgICAgIGludlNpemUgPSBNYXRoLm1heChtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpOwogICAgICBpbnZTaXplID0gaW52U2l6ZSAhPT0gMCA/IDMyNzY3IC8gaW52U2l6ZSA6IDA7CiAgICB9CiAgICBlYXJjdXRMaW5rZWQob3V0ZXJOb2RlLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMCk7CiAgICByZXR1cm4gdHJpYW5nbGVzOwogIH0KICBmdW5jdGlvbiBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgY2xvY2t3aXNlKSB7CiAgICBsZXQgbGFzdDsKICAgIGlmIChjbG9ja3dpc2UgPT09IHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSA+IDApIHsKICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSAvIGRpbSB8IDAsIGRhdGFbaV0sIGRhdGFbaSArIDFdLCBsYXN0KTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAobGV0IGkgPSBlbmQgLSBkaW07IGkgPj0gc3RhcnQ7IGkgLT0gZGltKSBsYXN0ID0gaW5zZXJ0Tm9kZShpIC8gZGltIHwgMCwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpOwogICAgfQogICAgaWYgKGxhc3QgJiYgZXF1YWxzKGxhc3QsIGxhc3QubmV4dCkpIHsKICAgICAgcmVtb3ZlTm9kZShsYXN0KTsKICAgICAgbGFzdCA9IGxhc3QubmV4dDsKICAgIH0KICAgIHJldHVybiBsYXN0OwogIH0KICBmdW5jdGlvbiBmaWx0ZXJQb2ludHMoc3RhcnQsIGVuZCkgewogICAgaWYgKCFzdGFydCkgcmV0dXJuIHN0YXJ0OwogICAgaWYgKCFlbmQpIGVuZCA9IHN0YXJ0OwogICAgbGV0IHAgPSBzdGFydCwgYWdhaW47CiAgICBkbyB7CiAgICAgIGFnYWluID0gZmFsc2U7CiAgICAgIGlmICghcC5zdGVpbmVyICYmIChlcXVhbHMocCwgcC5uZXh0KSB8fCBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA9PT0gMCkpIHsKICAgICAgICByZW1vdmVOb2RlKHApOwogICAgICAgIHAgPSBlbmQgPSBwLnByZXY7CiAgICAgICAgaWYgKHAgPT09IHAubmV4dCkgYnJlYWs7CiAgICAgICAgYWdhaW4gPSB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHAgPSBwLm5leHQ7CiAgICAgIH0KICAgIH0gd2hpbGUgKGFnYWluIHx8IHAgIT09IGVuZCk7CiAgICByZXR1cm4gZW5kOwogIH0KICBmdW5jdGlvbiBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcykgewogICAgaWYgKCFlYXIpIHJldHVybjsKICAgIGlmICghcGFzcyAmJiBpbnZTaXplKSBpbmRleEN1cnZlKGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSk7CiAgICBsZXQgc3RvcCA9IGVhcjsKICAgIHdoaWxlIChlYXIucHJldiAhPT0gZWFyLm5leHQpIHsKICAgICAgY29uc3QgcHJldiA9IGVhci5wcmV2OwogICAgICBjb25zdCBuZXh0ID0gZWFyLm5leHQ7CiAgICAgIGlmIChpbnZTaXplID8gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSA6IGlzRWFyKGVhcikpIHsKICAgICAgICB0cmlhbmdsZXMucHVzaChwcmV2LmksIGVhci5pLCBuZXh0LmkpOwogICAgICAgIHJlbW92ZU5vZGUoZWFyKTsKICAgICAgICBlYXIgPSBuZXh0Lm5leHQ7CiAgICAgICAgc3RvcCA9IG5leHQubmV4dDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBlYXIgPSBuZXh0OwogICAgICBpZiAoZWFyID09PSBzdG9wKSB7CiAgICAgICAgaWYgKCFwYXNzKSB7CiAgICAgICAgICBlYXJjdXRMaW5rZWQoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAxKTsKICAgICAgICB9IGVsc2UgaWYgKHBhc3MgPT09IDEpIHsKICAgICAgICAgIGVhciA9IGN1cmVMb2NhbEludGVyc2VjdGlvbnMoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcyk7CiAgICAgICAgICBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMik7CiAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAyKSB7CiAgICAgICAgICBzcGxpdEVhcmN1dChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gaXNFYXIoZWFyKSB7CiAgICBjb25zdCBhMyA9IGVhci5wcmV2LCBiID0gZWFyLCBjID0gZWFyLm5leHQ7CiAgICBpZiAoYXJlYShhMywgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgYXggPSBhMy54LCBieCA9IGIueCwgY3ggPSBjLngsIGF5ID0gYTMueSwgYnkgPSBiLnksIGN5ID0gYy55OwogICAgY29uc3QgeDAgPSBNYXRoLm1pbihheCwgYngsIGN4KSwgeTAgPSBNYXRoLm1pbihheSwgYnksIGN5KSwgeDEgPSBNYXRoLm1heChheCwgYngsIGN4KSwgeTEgPSBNYXRoLm1heChheSwgYnksIGN5KTsKICAgIGxldCBwID0gYy5uZXh0OwogICAgd2hpbGUgKHAgIT09IGEzKSB7CiAgICAgIGlmIChwLnggPj0geDAgJiYgcC54IDw9IHgxICYmIHAueSA+PSB5MCAmJiBwLnkgPD0geTEgJiYgcG9pbnRJblRyaWFuZ2xlRXhjZXB0Rmlyc3QoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcC54LCBwLnkpICYmIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTsKICAgICAgcCA9IHAubmV4dDsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBmdW5jdGlvbiBpc0Vhckhhc2hlZChlYXIsIG1pblgsIG1pblksIGludlNpemUpIHsKICAgIGNvbnN0IGEzID0gZWFyLnByZXYsIGIgPSBlYXIsIGMgPSBlYXIubmV4dDsKICAgIGlmIChhcmVhKGEzLCBiLCBjKSA+PSAwKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBheCA9IGEzLngsIGJ4ID0gYi54LCBjeCA9IGMueCwgYXkgPSBhMy55LCBieSA9IGIueSwgY3kgPSBjLnk7CiAgICBjb25zdCB4MCA9IE1hdGgubWluKGF4LCBieCwgY3gpLCB5MCA9IE1hdGgubWluKGF5LCBieSwgY3kpLCB4MSA9IE1hdGgubWF4KGF4LCBieCwgY3gpLCB5MSA9IE1hdGgubWF4KGF5LCBieSwgY3kpOwogICAgY29uc3QgbWluWiA9IHpPcmRlcih4MCwgeTAsIG1pblgsIG1pblksIGludlNpemUpLCBtYXhaID0gek9yZGVyKHgxLCB5MSwgbWluWCwgbWluWSwgaW52U2l6ZSk7CiAgICBsZXQgcCA9IGVhci5wcmV2WiwgbiA9IGVhci5uZXh0WjsKICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aICYmIG4gJiYgbi56IDw9IG1heFopIHsKICAgICAgaWYgKHAueCA+PSB4MCAmJiBwLnggPD0geDEgJiYgcC55ID49IHkwICYmIHAueSA8PSB5MSAmJiBwICE9PSBhMyAmJiBwICE9PSBjICYmIHBvaW50SW5UcmlhbmdsZUV4Y2VwdEZpcnN0KGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHAueCwgcC55KSAmJiBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7CiAgICAgIHAgPSBwLnByZXZaOwogICAgICBpZiAobi54ID49IHgwICYmIG4ueCA8PSB4MSAmJiBuLnkgPj0geTAgJiYgbi55IDw9IHkxICYmIG4gIT09IGEzICYmIG4gIT09IGMgJiYgcG9pbnRJblRyaWFuZ2xlRXhjZXB0Rmlyc3QoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgbi54LCBuLnkpICYmIGFyZWEobi5wcmV2LCBuLCBuLm5leHQpID49IDApIHJldHVybiBmYWxzZTsKICAgICAgbiA9IG4ubmV4dFo7CiAgICB9CiAgICB3aGlsZSAocCAmJiBwLnogPj0gbWluWikgewogICAgICBpZiAocC54ID49IHgwICYmIHAueCA8PSB4MSAmJiBwLnkgPj0geTAgJiYgcC55IDw9IHkxICYmIHAgIT09IGEzICYmIHAgIT09IGMgJiYgcG9pbnRJblRyaWFuZ2xlRXhjZXB0Rmlyc3QoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcC54LCBwLnkpICYmIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTsKICAgICAgcCA9IHAucHJldlo7CiAgICB9CiAgICB3aGlsZSAobiAmJiBuLnogPD0gbWF4WikgewogICAgICBpZiAobi54ID49IHgwICYmIG4ueCA8PSB4MSAmJiBuLnkgPj0geTAgJiYgbi55IDw9IHkxICYmIG4gIT09IGEzICYmIG4gIT09IGMgJiYgcG9pbnRJblRyaWFuZ2xlRXhjZXB0Rmlyc3QoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgbi54LCBuLnkpICYmIGFyZWEobi5wcmV2LCBuLCBuLm5leHQpID49IDApIHJldHVybiBmYWxzZTsKICAgICAgbiA9IG4ubmV4dFo7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhzdGFydCwgdHJpYW5nbGVzKSB7CiAgICBsZXQgcCA9IHN0YXJ0OwogICAgZG8gewogICAgICBjb25zdCBhMyA9IHAucHJldiwgYiA9IHAubmV4dC5uZXh0OwogICAgICBpZiAoIWVxdWFscyhhMywgYikgJiYgaW50ZXJzZWN0cyhhMywgcCwgcC5uZXh0LCBiKSAmJiBsb2NhbGx5SW5zaWRlKGEzLCBiKSAmJiBsb2NhbGx5SW5zaWRlKGIsIGEzKSkgewogICAgICAgIHRyaWFuZ2xlcy5wdXNoKGEzLmksIHAuaSwgYi5pKTsKICAgICAgICByZW1vdmVOb2RlKHApOwogICAgICAgIHJlbW92ZU5vZGUocC5uZXh0KTsKICAgICAgICBwID0gc3RhcnQgPSBiOwogICAgICB9CiAgICAgIHAgPSBwLm5leHQ7CiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7CiAgICByZXR1cm4gZmlsdGVyUG9pbnRzKHApOwogIH0KICBmdW5jdGlvbiBzcGxpdEVhcmN1dChzdGFydCwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUpIHsKICAgIGxldCBhMyA9IHN0YXJ0OwogICAgZG8gewogICAgICBsZXQgYiA9IGEzLm5leHQubmV4dDsKICAgICAgd2hpbGUgKGIgIT09IGEzLnByZXYpIHsKICAgICAgICBpZiAoYTMuaSAhPT0gYi5pICYmIGlzVmFsaWREaWFnb25hbChhMywgYikpIHsKICAgICAgICAgIGxldCBjID0gc3BsaXRQb2x5Z29uKGEzLCBiKTsKICAgICAgICAgIGEzID0gZmlsdGVyUG9pbnRzKGEzLCBhMy5uZXh0KTsKICAgICAgICAgIGMgPSBmaWx0ZXJQb2ludHMoYywgYy5uZXh0KTsKICAgICAgICAgIGVhcmN1dExpbmtlZChhMywgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDApOwogICAgICAgICAgZWFyY3V0TGlua2VkKGMsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAwKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgYiA9IGIubmV4dDsKICAgICAgfQogICAgICBhMyA9IGEzLm5leHQ7CiAgICB9IHdoaWxlIChhMyAhPT0gc3RhcnQpOwogIH0KICBmdW5jdGlvbiBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pIHsKICAgIGNvbnN0IHF1ZXVlID0gW107CiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgY29uc3Qgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTsKICAgICAgY29uc3QgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDsKICAgICAgY29uc3QgbGlzdCA9IGxpbmtlZExpc3QoZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBmYWxzZSk7CiAgICAgIGlmIChsaXN0ID09PSBsaXN0Lm5leHQpIGxpc3Quc3RlaW5lciA9IHRydWU7CiAgICAgIHF1ZXVlLnB1c2goZ2V0TGVmdG1vc3QobGlzdCkpOwogICAgfQogICAgcXVldWUuc29ydChjb21wYXJlWFlTbG9wZSk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7CiAgICAgIG91dGVyTm9kZSA9IGVsaW1pbmF0ZUhvbGUocXVldWVbaV0sIG91dGVyTm9kZSk7CiAgICB9CiAgICByZXR1cm4gb3V0ZXJOb2RlOwogIH0KICBmdW5jdGlvbiBjb21wYXJlWFlTbG9wZShhMywgYikgewogICAgbGV0IHJlc3VsdCA9IGEzLnggLSBiLng7CiAgICBpZiAocmVzdWx0ID09PSAwKSB7CiAgICAgIHJlc3VsdCA9IGEzLnkgLSBiLnk7CiAgICAgIGlmIChyZXN1bHQgPT09IDApIHsKICAgICAgICBjb25zdCBhU2xvcGUgPSAoYTMubmV4dC55IC0gYTMueSkgLyAoYTMubmV4dC54IC0gYTMueCk7CiAgICAgICAgY29uc3QgYlNsb3BlID0gKGIubmV4dC55IC0gYi55KSAvIChiLm5leHQueCAtIGIueCk7CiAgICAgICAgcmVzdWx0ID0gYVNsb3BlIC0gYlNsb3BlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBmdW5jdGlvbiBlbGltaW5hdGVIb2xlKGhvbGUsIG91dGVyTm9kZSkgewogICAgY29uc3QgYnJpZGdlID0gZmluZEhvbGVCcmlkZ2UoaG9sZSwgb3V0ZXJOb2RlKTsKICAgIGlmICghYnJpZGdlKSB7CiAgICAgIHJldHVybiBvdXRlck5vZGU7CiAgICB9CiAgICBjb25zdCBicmlkZ2VSZXZlcnNlID0gc3BsaXRQb2x5Z29uKGJyaWRnZSwgaG9sZSk7CiAgICBmaWx0ZXJQb2ludHMoYnJpZGdlUmV2ZXJzZSwgYnJpZGdlUmV2ZXJzZS5uZXh0KTsKICAgIHJldHVybiBmaWx0ZXJQb2ludHMoYnJpZGdlLCBicmlkZ2UubmV4dCk7CiAgfQogIGZ1bmN0aW9uIGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSkgewogICAgbGV0IHAgPSBvdXRlck5vZGU7CiAgICBjb25zdCBoeCA9IGhvbGUueDsKICAgIGNvbnN0IGh5ID0gaG9sZS55OwogICAgbGV0IHF4ID0gLUluZmluaXR5OwogICAgbGV0IG07CiAgICBpZiAoZXF1YWxzKGhvbGUsIHApKSByZXR1cm4gcDsKICAgIGRvIHsKICAgICAgaWYgKGVxdWFscyhob2xlLCBwLm5leHQpKSByZXR1cm4gcC5uZXh0OwogICAgICBlbHNlIGlmIChoeSA8PSBwLnkgJiYgaHkgPj0gcC5uZXh0LnkgJiYgcC5uZXh0LnkgIT09IHAueSkgewogICAgICAgIGNvbnN0IHggPSBwLnggKyAoaHkgLSBwLnkpICogKHAubmV4dC54IC0gcC54KSAvIChwLm5leHQueSAtIHAueSk7CiAgICAgICAgaWYgKHggPD0gaHggJiYgeCA+IHF4KSB7CiAgICAgICAgICBxeCA9IHg7CiAgICAgICAgICBtID0gcC54IDwgcC5uZXh0LnggPyBwIDogcC5uZXh0OwogICAgICAgICAgaWYgKHggPT09IGh4KSByZXR1cm4gbTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcCA9IHAubmV4dDsKICAgIH0gd2hpbGUgKHAgIT09IG91dGVyTm9kZSk7CiAgICBpZiAoIW0pIHJldHVybiBudWxsOwogICAgY29uc3Qgc3RvcCA9IG07CiAgICBjb25zdCBteCA9IG0ueDsKICAgIGNvbnN0IG15ID0gbS55OwogICAgbGV0IHRhbk1pbiA9IEluZmluaXR5OwogICAgcCA9IG07CiAgICBkbyB7CiAgICAgIGlmIChoeCA+PSBwLnggJiYgcC54ID49IG14ICYmIGh4ICE9PSBwLnggJiYgcG9pbnRJblRyaWFuZ2xlKGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55KSkgewogICAgICAgIGNvbnN0IHRhbiA9IE1hdGguYWJzKGh5IC0gcC55KSAvIChoeCAtIHAueCk7CiAgICAgICAgaWYgKGxvY2FsbHlJbnNpZGUocCwgaG9sZSkgJiYgKHRhbiA8IHRhbk1pbiB8fCB0YW4gPT09IHRhbk1pbiAmJiAocC54ID4gbS54IHx8IHAueCA9PT0gbS54ICYmIHNlY3RvckNvbnRhaW5zU2VjdG9yKG0sIHApKSkpIHsKICAgICAgICAgIG0gPSBwOwogICAgICAgICAgdGFuTWluID0gdGFuOwogICAgICAgIH0KICAgICAgfQogICAgICBwID0gcC5uZXh0OwogICAgfSB3aGlsZSAocCAhPT0gc3RvcCk7CiAgICByZXR1cm4gbTsKICB9CiAgZnVuY3Rpb24gc2VjdG9yQ29udGFpbnNTZWN0b3IobSwgcCkgewogICAgcmV0dXJuIGFyZWEobS5wcmV2LCBtLCBwLnByZXYpIDwgMCAmJiBhcmVhKHAubmV4dCwgbSwgbS5uZXh0KSA8IDA7CiAgfQogIGZ1bmN0aW9uIGluZGV4Q3VydmUoc3RhcnQsIG1pblgsIG1pblksIGludlNpemUpIHsKICAgIGxldCBwID0gc3RhcnQ7CiAgICBkbyB7CiAgICAgIGlmIChwLnogPT09IDApIHAueiA9IHpPcmRlcihwLngsIHAueSwgbWluWCwgbWluWSwgaW52U2l6ZSk7CiAgICAgIHAucHJldlogPSBwLnByZXY7CiAgICAgIHAubmV4dFogPSBwLm5leHQ7CiAgICAgIHAgPSBwLm5leHQ7CiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7CiAgICBwLnByZXZaLm5leHRaID0gbnVsbDsKICAgIHAucHJldlogPSBudWxsOwogICAgc29ydExpbmtlZChwKTsKICB9CiAgZnVuY3Rpb24gc29ydExpbmtlZChsaXN0KSB7CiAgICBsZXQgbnVtTWVyZ2VzOwogICAgbGV0IGluU2l6ZSA9IDE7CiAgICBkbyB7CiAgICAgIGxldCBwID0gbGlzdDsKICAgICAgbGV0IGU7CiAgICAgIGxpc3QgPSBudWxsOwogICAgICBsZXQgdGFpbCA9IG51bGw7CiAgICAgIG51bU1lcmdlcyA9IDA7CiAgICAgIHdoaWxlIChwKSB7CiAgICAgICAgbnVtTWVyZ2VzKys7CiAgICAgICAgbGV0IHEgPSBwOwogICAgICAgIGxldCBwU2l6ZSA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpblNpemU7IGkrKykgewogICAgICAgICAgcFNpemUrKzsKICAgICAgICAgIHEgPSBxLm5leHRaOwogICAgICAgICAgaWYgKCFxKSBicmVhazsKICAgICAgICB9CiAgICAgICAgbGV0IHFTaXplID0gaW5TaXplOwogICAgICAgIHdoaWxlIChwU2l6ZSA+IDAgfHwgcVNpemUgPiAwICYmIHEpIHsKICAgICAgICAgIGlmIChwU2l6ZSAhPT0gMCAmJiAocVNpemUgPT09IDAgfHwgIXEgfHwgcC56IDw9IHEueikpIHsKICAgICAgICAgICAgZSA9IHA7CiAgICAgICAgICAgIHAgPSBwLm5leHRaOwogICAgICAgICAgICBwU2l6ZS0tOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZSA9IHE7CiAgICAgICAgICAgIHEgPSBxLm5leHRaOwogICAgICAgICAgICBxU2l6ZS0tOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRhaWwpIHRhaWwubmV4dFogPSBlOwogICAgICAgICAgZWxzZSBsaXN0ID0gZTsKICAgICAgICAgIGUucHJldlogPSB0YWlsOwogICAgICAgICAgdGFpbCA9IGU7CiAgICAgICAgfQogICAgICAgIHAgPSBxOwogICAgICB9CiAgICAgIHRhaWwubmV4dFogPSBudWxsOwogICAgICBpblNpemUgKj0gMjsKICAgIH0gd2hpbGUgKG51bU1lcmdlcyA+IDEpOwogICAgcmV0dXJuIGxpc3Q7CiAgfQogIGZ1bmN0aW9uIHpPcmRlcih4LCB5LCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7CiAgICB4ID0gKHggLSBtaW5YKSAqIGludlNpemUgfCAwOwogICAgeSA9ICh5IC0gbWluWSkgKiBpbnZTaXplIHwgMDsKICAgIHggPSAoeCB8IHggPDwgOCkgJiAxNjcxMTkzNTsKICAgIHggPSAoeCB8IHggPDwgNCkgJiAyNTI2NDUxMzU7CiAgICB4ID0gKHggfCB4IDw8IDIpICYgODU4OTkzNDU5OwogICAgeCA9ICh4IHwgeCA8PCAxKSAmIDE0MzE2NTU3NjU7CiAgICB5ID0gKHkgfCB5IDw8IDgpICYgMTY3MTE5MzU7CiAgICB5ID0gKHkgfCB5IDw8IDQpICYgMjUyNjQ1MTM1OwogICAgeSA9ICh5IHwgeSA8PCAyKSAmIDg1ODk5MzQ1OTsKICAgIHkgPSAoeSB8IHkgPDwgMSkgJiAxNDMxNjU1NzY1OwogICAgcmV0dXJuIHggfCB5IDw8IDE7CiAgfQogIGZ1bmN0aW9uIGdldExlZnRtb3N0KHN0YXJ0KSB7CiAgICBsZXQgcCA9IHN0YXJ0LCBsZWZ0bW9zdCA9IHN0YXJ0OwogICAgZG8gewogICAgICBpZiAocC54IDwgbGVmdG1vc3QueCB8fCBwLnggPT09IGxlZnRtb3N0LnggJiYgcC55IDwgbGVmdG1vc3QueSkgbGVmdG1vc3QgPSBwOwogICAgICBwID0gcC5uZXh0OwogICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpOwogICAgcmV0dXJuIGxlZnRtb3N0OwogIH0KICBmdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5KSB7CiAgICByZXR1cm4gKGN4IC0gcHgpICogKGF5IC0gcHkpID49IChheCAtIHB4KSAqIChjeSAtIHB5KSAmJiAoYXggLSBweCkgKiAoYnkgLSBweSkgPj0gKGJ4IC0gcHgpICogKGF5IC0gcHkpICYmIChieCAtIHB4KSAqIChjeSAtIHB5KSA+PSAoY3ggLSBweCkgKiAoYnkgLSBweSk7CiAgfQogIGZ1bmN0aW9uIHBvaW50SW5UcmlhbmdsZUV4Y2VwdEZpcnN0KGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHB4LCBweSkgewogICAgcmV0dXJuICEoYXggPT09IHB4ICYmIGF5ID09PSBweSkgJiYgcG9pbnRJblRyaWFuZ2xlKGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHB4LCBweSk7CiAgfQogIGZ1bmN0aW9uIGlzVmFsaWREaWFnb25hbChhMywgYikgewogICAgcmV0dXJuIGEzLm5leHQuaSAhPT0gYi5pICYmIGEzLnByZXYuaSAhPT0gYi5pICYmICFpbnRlcnNlY3RzUG9seWdvbihhMywgYikgJiYgLy8gZG9lc24ndCBpbnRlcnNlY3Qgb3RoZXIgZWRnZXMKICAgIChsb2NhbGx5SW5zaWRlKGEzLCBiKSAmJiBsb2NhbGx5SW5zaWRlKGIsIGEzKSAmJiBtaWRkbGVJbnNpZGUoYTMsIGIpICYmIC8vIGxvY2FsbHkgdmlzaWJsZQogICAgKGFyZWEoYTMucHJldiwgYTMsIGIucHJldikgfHwgYXJlYShhMywgYi5wcmV2LCBiKSkgfHwgLy8gZG9lcyBub3QgY3JlYXRlIG9wcG9zaXRlLWZhY2luZyBzZWN0b3JzCiAgICBlcXVhbHMoYTMsIGIpICYmIGFyZWEoYTMucHJldiwgYTMsIGEzLm5leHQpID4gMCAmJiBhcmVhKGIucHJldiwgYiwgYi5uZXh0KSA+IDApOwogIH0KICBmdW5jdGlvbiBhcmVhKHAsIHEsIHIpIHsKICAgIHJldHVybiAocS55IC0gcC55KSAqIChyLnggLSBxLngpIC0gKHEueCAtIHAueCkgKiAoci55IC0gcS55KTsKICB9CiAgZnVuY3Rpb24gZXF1YWxzKHAxLCBwMikgewogICAgcmV0dXJuIHAxLnggPT09IHAyLnggJiYgcDEueSA9PT0gcDIueTsKICB9CiAgZnVuY3Rpb24gaW50ZXJzZWN0cyhwMSwgcTEyLCBwMiwgcTIyKSB7CiAgICBjb25zdCBvMSA9IHNpZ24yKGFyZWEocDEsIHExMiwgcDIpKTsKICAgIGNvbnN0IG8yID0gc2lnbjIoYXJlYShwMSwgcTEyLCBxMjIpKTsKICAgIGNvbnN0IG8zID0gc2lnbjIoYXJlYShwMiwgcTIyLCBwMSkpOwogICAgY29uc3QgbzQgPSBzaWduMihhcmVhKHAyLCBxMjIsIHExMikpOwogICAgaWYgKG8xICE9PSBvMiAmJiBvMyAhPT0gbzQpIHJldHVybiB0cnVlOwogICAgaWYgKG8xID09PSAwICYmIG9uU2VnbWVudChwMSwgcDIsIHExMikpIHJldHVybiB0cnVlOwogICAgaWYgKG8yID09PSAwICYmIG9uU2VnbWVudChwMSwgcTIyLCBxMTIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvMyA9PT0gMCAmJiBvblNlZ21lbnQocDIsIHAxLCBxMjIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvNCA9PT0gMCAmJiBvblNlZ21lbnQocDIsIHExMiwgcTIyKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGZ1bmN0aW9uIG9uU2VnbWVudChwLCBxLCByKSB7CiAgICByZXR1cm4gcS54IDw9IE1hdGgubWF4KHAueCwgci54KSAmJiBxLnggPj0gTWF0aC5taW4ocC54LCByLngpICYmIHEueSA8PSBNYXRoLm1heChwLnksIHIueSkgJiYgcS55ID49IE1hdGgubWluKHAueSwgci55KTsKICB9CiAgZnVuY3Rpb24gc2lnbjIobnVtKSB7CiAgICByZXR1cm4gbnVtID4gMCA/IDEgOiBudW0gPCAwID8gLTEgOiAwOwogIH0KICBmdW5jdGlvbiBpbnRlcnNlY3RzUG9seWdvbihhMywgYikgewogICAgbGV0IHAgPSBhMzsKICAgIGRvIHsKICAgICAgaWYgKHAuaSAhPT0gYTMuaSAmJiBwLm5leHQuaSAhPT0gYTMuaSAmJiBwLmkgIT09IGIuaSAmJiBwLm5leHQuaSAhPT0gYi5pICYmIGludGVyc2VjdHMocCwgcC5uZXh0LCBhMywgYikpIHJldHVybiB0cnVlOwogICAgICBwID0gcC5uZXh0OwogICAgfSB3aGlsZSAocCAhPT0gYTMpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICBmdW5jdGlvbiBsb2NhbGx5SW5zaWRlKGEzLCBiKSB7CiAgICByZXR1cm4gYXJlYShhMy5wcmV2LCBhMywgYTMubmV4dCkgPCAwID8gYXJlYShhMywgYiwgYTMubmV4dCkgPj0gMCAmJiBhcmVhKGEzLCBhMy5wcmV2LCBiKSA+PSAwIDogYXJlYShhMywgYiwgYTMucHJldikgPCAwIHx8IGFyZWEoYTMsIGEzLm5leHQsIGIpIDwgMDsKICB9CiAgZnVuY3Rpb24gbWlkZGxlSW5zaWRlKGEzLCBiKSB7CiAgICBsZXQgcCA9IGEzOwogICAgbGV0IGluc2lkZSA9IGZhbHNlOwogICAgY29uc3QgcHggPSAoYTMueCArIGIueCkgLyAyOwogICAgY29uc3QgcHkgPSAoYTMueSArIGIueSkgLyAyOwogICAgZG8gewogICAgICBpZiAocC55ID4gcHkgIT09IHAubmV4dC55ID4gcHkgJiYgcC5uZXh0LnkgIT09IHAueSAmJiBweCA8IChwLm5leHQueCAtIHAueCkgKiAocHkgLSBwLnkpIC8gKHAubmV4dC55IC0gcC55KSArIHAueCkKICAgICAgICBpbnNpZGUgPSAhaW5zaWRlOwogICAgICBwID0gcC5uZXh0OwogICAgfSB3aGlsZSAocCAhPT0gYTMpOwogICAgcmV0dXJuIGluc2lkZTsKICB9CiAgZnVuY3Rpb24gc3BsaXRQb2x5Z29uKGEzLCBiKSB7CiAgICBjb25zdCBhMjIgPSBjcmVhdGVOb2RlKGEzLmksIGEzLngsIGEzLnkpLCBiMiA9IGNyZWF0ZU5vZGUoYi5pLCBiLngsIGIueSksIGFuID0gYTMubmV4dCwgYnAgPSBiLnByZXY7CiAgICBhMy5uZXh0ID0gYjsKICAgIGIucHJldiA9IGEzOwogICAgYTIyLm5leHQgPSBhbjsKICAgIGFuLnByZXYgPSBhMjI7CiAgICBiMi5uZXh0ID0gYTIyOwogICAgYTIyLnByZXYgPSBiMjsKICAgIGJwLm5leHQgPSBiMjsKICAgIGIyLnByZXYgPSBicDsKICAgIHJldHVybiBiMjsKICB9CiAgZnVuY3Rpb24gaW5zZXJ0Tm9kZShpLCB4LCB5LCBsYXN0KSB7CiAgICBjb25zdCBwID0gY3JlYXRlTm9kZShpLCB4LCB5KTsKICAgIGlmICghbGFzdCkgewogICAgICBwLnByZXYgPSBwOwogICAgICBwLm5leHQgPSBwOwogICAgfSBlbHNlIHsKICAgICAgcC5uZXh0ID0gbGFzdC5uZXh0OwogICAgICBwLnByZXYgPSBsYXN0OwogICAgICBsYXN0Lm5leHQucHJldiA9IHA7CiAgICAgIGxhc3QubmV4dCA9IHA7CiAgICB9CiAgICByZXR1cm4gcDsKICB9CiAgZnVuY3Rpb24gcmVtb3ZlTm9kZShwKSB7CiAgICBwLm5leHQucHJldiA9IHAucHJldjsKICAgIHAucHJldi5uZXh0ID0gcC5uZXh0OwogICAgaWYgKHAucHJldlopIHAucHJldloubmV4dFogPSBwLm5leHRaOwogICAgaWYgKHAubmV4dFopIHAubmV4dFoucHJldlogPSBwLnByZXZaOwogIH0KICBmdW5jdGlvbiBjcmVhdGVOb2RlKGksIHgsIHkpIHsKICAgIHJldHVybiB7CiAgICAgIGksCiAgICAgIC8vIHZlcnRleCBpbmRleCBpbiBjb29yZGluYXRlcyBhcnJheQogICAgICB4LAogICAgICB5LAogICAgICAvLyB2ZXJ0ZXggY29vcmRpbmF0ZXMKICAgICAgcHJldjogbnVsbCwKICAgICAgLy8gcHJldmlvdXMgYW5kIG5leHQgdmVydGV4IG5vZGVzIGluIGEgcG9seWdvbiByaW5nCiAgICAgIG5leHQ6IG51bGwsCiAgICAgIHo6IDAsCiAgICAgIC8vIHotb3JkZXIgY3VydmUgdmFsdWUKICAgICAgcHJldlo6IG51bGwsCiAgICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IG5vZGVzIGluIHotb3JkZXIKICAgICAgbmV4dFo6IG51bGwsCiAgICAgIHN0ZWluZXI6IGZhbHNlCiAgICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGVpbmVyIHBvaW50CiAgICB9OwogIH0KICBmdW5jdGlvbiBzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkgewogICAgbGV0IHN1bSA9IDA7CiAgICBmb3IgKGxldCBpID0gc3RhcnQsIGogPSBlbmQgLSBkaW07IGkgPCBlbmQ7IGkgKz0gZGltKSB7CiAgICAgIHN1bSArPSAoZGF0YVtqXSAtIGRhdGFbaV0pICogKGRhdGFbaSArIDFdICsgZGF0YVtqICsgMV0pOwogICAgICBqID0gaTsKICAgIH0KICAgIHJldHVybiBzdW07CiAgfQogIHZhciBpbml0X2VhcmN1dCA9IF9fZXNtKHsKICAgICJub2RlX21vZHVsZXMvZWFyY3V0L3NyYy9lYXJjdXQuanMiKCkgewogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvV2luZGluZ09yZGVyLmpzCiAgdmFyIFdpbmRpbmdPcmRlciwgV2luZGluZ09yZGVyX2RlZmF1bHQ7CiAgdmFyIGluaXRfV2luZGluZ09yZGVyID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9XaW5kaW5nT3JkZXIuanMiKCkgewogICAgICBpbml0X1dlYkdMQ29uc3RhbnRzKCk7CiAgICAgIFdpbmRpbmdPcmRlciA9IHsKICAgICAgICAvKioKICAgICAgICAgKiBWZXJ0aWNlcyBhcmUgaW4gY2xvY2t3aXNlIG9yZGVyLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBDTE9DS1dJU0U6IFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuQ1csCiAgICAgICAgLyoqCiAgICAgICAgICogVmVydGljZXMgYXJlIGluIGNvdW50ZXItY2xvY2t3aXNlIG9yZGVyLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBDT1VOVEVSX0NMT0NLV0lTRTogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5DQ1cKICAgICAgfTsKICAgICAgV2luZGluZ09yZGVyLnZhbGlkYXRlID0gZnVuY3Rpb24od2luZGluZ09yZGVyKSB7CiAgICAgICAgcmV0dXJuIHdpbmRpbmdPcmRlciA9PT0gV2luZGluZ09yZGVyLkNMT0NLV0lTRSB8fCB3aW5kaW5nT3JkZXIgPT09IFdpbmRpbmdPcmRlci5DT1VOVEVSX0NMT0NLV0lTRTsKICAgICAgfTsKICAgICAgV2luZGluZ09yZGVyX2RlZmF1bHQgPSBPYmplY3QuZnJlZXplKFdpbmRpbmdPcmRlcik7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Qb2x5Z29uUGlwZWxpbmUuanMKICB2YXIgc2NhbGVUb0dlb2RldGljSGVpZ2h0Tiwgc2NhbGVUb0dlb2RldGljSGVpZ2h0UCwgUG9seWdvblBpcGVsaW5lLCBzdWJkaXZpc2lvblYwU2NyYXRjaCwgc3ViZGl2aXNpb25WMVNjcmF0Y2gsIHN1YmRpdmlzaW9uVjJTY3JhdGNoLCBzdWJkaXZpc2lvblMwU2NyYXRjaCwgc3ViZGl2aXNpb25TMVNjcmF0Y2gsIHN1YmRpdmlzaW9uUzJTY3JhdGNoLCBzdWJkaXZpc2lvbk1pZFNjcmF0Y2gsIHN1YmRpdmlzaW9uVDBTY3JhdGNoLCBzdWJkaXZpc2lvblQxU2NyYXRjaCwgc3ViZGl2aXNpb25UMlNjcmF0Y2gsIHN1YmRpdmlzaW9uVGV4Y29vcmRNaWRTY3JhdGNoLCBzdWJkaXZpc2lvbkMwU2NyYXRjaCwgc3ViZGl2aXNpb25DMVNjcmF0Y2gsIHN1YmRpdmlzaW9uQzJTY3JhdGNoLCBzdWJkaXZpc2lvbkNhcnRvZ3JhcGhpY1NjcmF0Y2gsIFBvbHlnb25QaXBlbGluZV9kZWZhdWx0OwogIHZhciBpbml0X1BvbHlnb25QaXBlbGluZSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUG9seWdvblBpcGVsaW5lLmpzIigpIHsKICAgICAgaW5pdF9lYXJjdXQoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4yKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRvZ3JhcGhpYygpOwogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfQ29tcG9uZW50RGF0YXR5cGUoKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkUmh1bWJMaW5lKCk7CiAgICAgIGluaXRfR2VvbWV0cnkoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZSgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9QcmltaXRpdmVUeXBlKCk7CiAgICAgIGluaXRfV2luZGluZ09yZGVyKCk7CiAgICAgIHNjYWxlVG9HZW9kZXRpY0hlaWdodE4gPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjYWxlVG9HZW9kZXRpY0hlaWdodFAgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIFBvbHlnb25QaXBlbGluZSA9IHt9OwogICAgICBQb2x5Z29uUGlwZWxpbmUuY29tcHV0ZUFyZWEyRCA9IGZ1bmN0aW9uKHBvc2l0aW9ucykgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgicG9zaXRpb25zIiwgcG9zaXRpb25zKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygKICAgICAgICAgICJwb3NpdGlvbnMubGVuZ3RoIiwKICAgICAgICAgIHBvc2l0aW9ucy5sZW5ndGgsCiAgICAgICAgICAzCiAgICAgICAgKTsKICAgICAgICBjb25zdCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGxldCBhcmVhMiA9IDA7CiAgICAgICAgZm9yIChsZXQgaTAgPSBsZW5ndGggLSAxLCBpMSA9IDA7IGkxIDwgbGVuZ3RoOyBpMCA9IGkxKyspIHsKICAgICAgICAgIGNvbnN0IHYwMiA9IHBvc2l0aW9uc1tpMF07CiAgICAgICAgICBjb25zdCB2MTIgPSBwb3NpdGlvbnNbaTFdOwogICAgICAgICAgYXJlYTIgKz0gdjAyLnggKiB2MTIueSAtIHYxMi54ICogdjAyLnk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcmVhMiAqIDAuNTsKICAgICAgfTsKICAgICAgUG9seWdvblBpcGVsaW5lLmNvbXB1dGVXaW5kaW5nT3JkZXIyRCA9IGZ1bmN0aW9uKHBvc2l0aW9ucykgewogICAgICAgIGNvbnN0IGFyZWEyID0gUG9seWdvblBpcGVsaW5lLmNvbXB1dGVBcmVhMkQocG9zaXRpb25zKTsKICAgICAgICByZXR1cm4gYXJlYTIgPiAwID8gV2luZGluZ09yZGVyX2RlZmF1bHQuQ09VTlRFUl9DTE9DS1dJU0UgOiBXaW5kaW5nT3JkZXJfZGVmYXVsdC5DTE9DS1dJU0U7CiAgICAgIH07CiAgICAgIFBvbHlnb25QaXBlbGluZS50cmlhbmd1bGF0ZSA9IGZ1bmN0aW9uKHBvc2l0aW9ucywgaG9sZXMpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoInBvc2l0aW9ucyIsIHBvc2l0aW9ucyk7CiAgICAgICAgY29uc3QgZmxhdHRlbmVkUG9zaXRpb25zID0gQ2FydGVzaWFuMl9kZWZhdWx0LnBhY2tBcnJheShwb3NpdGlvbnMpOwogICAgICAgIHJldHVybiBlYXJjdXQoZmxhdHRlbmVkUG9zaXRpb25zLCBob2xlcywgMik7CiAgICAgIH07CiAgICAgIHN1YmRpdmlzaW9uVjBTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzdWJkaXZpc2lvblYxU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc3ViZGl2aXNpb25WMlNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHN1YmRpdmlzaW9uUzBTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzdWJkaXZpc2lvblMxU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc3ViZGl2aXNpb25TMlNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHN1YmRpdmlzaW9uTWlkU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc3ViZGl2aXNpb25UMFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KCk7CiAgICAgIHN1YmRpdmlzaW9uVDFTY3JhdGNoID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICBzdWJkaXZpc2lvblQyU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKTsKICAgICAgc3ViZGl2aXNpb25UZXhjb29yZE1pZFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KCk7CiAgICAgIFBvbHlnb25QaXBlbGluZS5jb21wdXRlU3ViZGl2aXNpb24gPSBmdW5jdGlvbihlbGxpcHNvaWQsIHBvc2l0aW9ucywgaW5kaWNlcywgdGV4Y29vcmRzLCBncmFudWxhcml0eSkgewogICAgICAgIGdyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHkgPz8gTWF0aF9kZWZhdWx0LlJBRElBTlNfUEVSX0RFR1JFRTsKICAgICAgICBjb25zdCBoYXNUZXhjb29yZHMgPSBkZWZpbmVkX2RlZmF1bHQodGV4Y29vcmRzKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImVsbGlwc29pZCIsIGVsbGlwc29pZCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJwb3NpdGlvbnMiLCBwb3NpdGlvbnMpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiaW5kaWNlcyIsIGluZGljZXMpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJpbmRpY2VzLmxlbmd0aCIsIGluZGljZXMubGVuZ3RoLCAzKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZXF1YWxzKCJpbmRpY2VzLmxlbmd0aCAlIDMiLCAiMCIsIGluZGljZXMubGVuZ3RoICUgMywgMCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuKCJncmFudWxhcml0eSIsIGdyYW51bGFyaXR5LCAwKTsKICAgICAgICBjb25zdCB0cmlhbmdsZXMgPSBpbmRpY2VzLnNsaWNlKDApOwogICAgICAgIGxldCBpOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgY29uc3Qgc3ViZGl2aWRlZFBvc2l0aW9ucyA9IG5ldyBBcnJheShsZW5ndGggKiAzKTsKICAgICAgICBjb25zdCBzdWJkaXZpZGVkVGV4Y29vcmRzID0gbmV3IEFycmF5KGxlbmd0aCAqIDIpOwogICAgICAgIGxldCBxID0gMDsKICAgICAgICBsZXQgcCA9IDA7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBpdGVtID0gcG9zaXRpb25zW2ldOwogICAgICAgICAgc3ViZGl2aWRlZFBvc2l0aW9uc1txKytdID0gaXRlbS54OwogICAgICAgICAgc3ViZGl2aWRlZFBvc2l0aW9uc1txKytdID0gaXRlbS55OwogICAgICAgICAgc3ViZGl2aWRlZFBvc2l0aW9uc1txKytdID0gaXRlbS56OwogICAgICAgICAgaWYgKGhhc1RleGNvb3JkcykgewogICAgICAgICAgICBjb25zdCB0ZXhjb29yZEl0ZW0gPSB0ZXhjb29yZHNbaV07CiAgICAgICAgICAgIHN1YmRpdmlkZWRUZXhjb29yZHNbcCsrXSA9IHRleGNvb3JkSXRlbS54OwogICAgICAgICAgICBzdWJkaXZpZGVkVGV4Y29vcmRzW3ArK10gPSB0ZXhjb29yZEl0ZW0ueTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3Qgc3ViZGl2aWRlZEluZGljZXMgPSBbXTsKICAgICAgICBjb25zdCBlZGdlcyA9IHt9OwogICAgICAgIGNvbnN0IHJhZGl1cyA9IGVsbGlwc29pZC5tYXhpbXVtUmFkaXVzOwogICAgICAgIGNvbnN0IG1pbkRpc3RhbmNlID0gTWF0aF9kZWZhdWx0LmNob3JkTGVuZ3RoKGdyYW51bGFyaXR5LCByYWRpdXMpOwogICAgICAgIGNvbnN0IG1pbkRpc3RhbmNlU3FyZCA9IG1pbkRpc3RhbmNlICogbWluRGlzdGFuY2U7CiAgICAgICAgd2hpbGUgKHRyaWFuZ2xlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICBjb25zdCBpMiA9IHRyaWFuZ2xlcy5wb3AoKTsKICAgICAgICAgIGNvbnN0IGkxID0gdHJpYW5nbGVzLnBvcCgpOwogICAgICAgICAgY29uc3QgaTAgPSB0cmlhbmdsZXMucG9wKCk7CiAgICAgICAgICBjb25zdCB2MDIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KAogICAgICAgICAgICBzdWJkaXZpZGVkUG9zaXRpb25zLAogICAgICAgICAgICBpMCAqIDMsCiAgICAgICAgICAgIHN1YmRpdmlzaW9uVjBTY3JhdGNoCiAgICAgICAgICApOwogICAgICAgICAgY29uc3QgdjEyID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheSgKICAgICAgICAgICAgc3ViZGl2aWRlZFBvc2l0aW9ucywKICAgICAgICAgICAgaTEgKiAzLAogICAgICAgICAgICBzdWJkaXZpc2lvblYxU2NyYXRjaAogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IHYyMiA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoCiAgICAgICAgICAgIHN1YmRpdmlkZWRQb3NpdGlvbnMsCiAgICAgICAgICAgIGkyICogMywKICAgICAgICAgICAgc3ViZGl2aXNpb25WMlNjcmF0Y2gKICAgICAgICAgICk7CiAgICAgICAgICBsZXQgdDAsIHQxLCB0MjsKICAgICAgICAgIGlmIChoYXNUZXhjb29yZHMpIHsKICAgICAgICAgICAgdDAgPSBDYXJ0ZXNpYW4yX2RlZmF1bHQuZnJvbUFycmF5KAogICAgICAgICAgICAgIHN1YmRpdmlkZWRUZXhjb29yZHMsCiAgICAgICAgICAgICAgaTAgKiAyLAogICAgICAgICAgICAgIHN1YmRpdmlzaW9uVDBTY3JhdGNoCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHQxID0gQ2FydGVzaWFuMl9kZWZhdWx0LmZyb21BcnJheSgKICAgICAgICAgICAgICBzdWJkaXZpZGVkVGV4Y29vcmRzLAogICAgICAgICAgICAgIGkxICogMiwKICAgICAgICAgICAgICBzdWJkaXZpc2lvblQxU2NyYXRjaAogICAgICAgICAgICApOwogICAgICAgICAgICB0MiA9IENhcnRlc2lhbjJfZGVmYXVsdC5mcm9tQXJyYXkoCiAgICAgICAgICAgICAgc3ViZGl2aWRlZFRleGNvb3JkcywKICAgICAgICAgICAgICBpMiAqIDIsCiAgICAgICAgICAgICAgc3ViZGl2aXNpb25UMlNjcmF0Y2gKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHMwID0gQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoCiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUodjAyLCBzdWJkaXZpc2lvblMwU2NyYXRjaCksCiAgICAgICAgICAgIHJhZGl1cywKICAgICAgICAgICAgc3ViZGl2aXNpb25TMFNjcmF0Y2gKICAgICAgICAgICk7CiAgICAgICAgICBjb25zdCBzMSA9IENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKAogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKHYxMiwgc3ViZGl2aXNpb25TMVNjcmF0Y2gpLAogICAgICAgICAgICByYWRpdXMsCiAgICAgICAgICAgIHN1YmRpdmlzaW9uUzFTY3JhdGNoCiAgICAgICAgICApOwogICAgICAgICAgY29uc3QgczIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcigKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSh2MjIsIHN1YmRpdmlzaW9uUzJTY3JhdGNoKSwKICAgICAgICAgICAgcmFkaXVzLAogICAgICAgICAgICBzdWJkaXZpc2lvblMyU2NyYXRjaAogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IGcwID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZVNxdWFyZWQoCiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChzMCwgczEsIHN1YmRpdmlzaW9uTWlkU2NyYXRjaCkKICAgICAgICAgICk7CiAgICAgICAgICBjb25zdCBnMSA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGVTcXVhcmVkKAogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoczEsIHMyLCBzdWJkaXZpc2lvbk1pZFNjcmF0Y2gpCiAgICAgICAgICApOwogICAgICAgICAgY29uc3QgZzIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlU3F1YXJlZCgKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KHMyLCBzMCwgc3ViZGl2aXNpb25NaWRTY3JhdGNoKQogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IG1heDMgPSBNYXRoLm1heChnMCwgZzEsIGcyKTsKICAgICAgICAgIGxldCBlZGdlOwogICAgICAgICAgbGV0IG1pZDsKICAgICAgICAgIGxldCBtaWRUZXhjb29yZDsKICAgICAgICAgIGlmIChtYXgzID4gbWluRGlzdGFuY2VTcXJkKSB7CiAgICAgICAgICAgIGlmIChnMCA9PT0gbWF4MykgewogICAgICAgICAgICAgIGVkZ2UgPSBgJHtNYXRoLm1pbihpMCwgaTEpfSAke01hdGgubWF4KGkwLCBpMSl9YDsKICAgICAgICAgICAgICBpID0gZWRnZXNbZWRnZV07CiAgICAgICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaSkpIHsKICAgICAgICAgICAgICAgIG1pZCA9IENhcnRlc2lhbjNfZGVmYXVsdC5hZGQodjAyLCB2MTIsIHN1YmRpdmlzaW9uTWlkU2NyYXRjaCk7CiAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihtaWQsIDAuNSwgbWlkKTsKICAgICAgICAgICAgICAgIHN1YmRpdmlkZWRQb3NpdGlvbnMucHVzaChtaWQueCwgbWlkLnksIG1pZC56KTsKICAgICAgICAgICAgICAgIGkgPSBzdWJkaXZpZGVkUG9zaXRpb25zLmxlbmd0aCAvIDMgLSAxOwogICAgICAgICAgICAgICAgZWRnZXNbZWRnZV0gPSBpOwogICAgICAgICAgICAgICAgaWYgKGhhc1RleGNvb3JkcykgewogICAgICAgICAgICAgICAgICBtaWRUZXhjb29yZCA9IENhcnRlc2lhbjJfZGVmYXVsdC5hZGQodDAsIHQxLCBzdWJkaXZpc2lvblRleGNvb3JkTWlkU2NyYXRjaCk7CiAgICAgICAgICAgICAgICAgIENhcnRlc2lhbjJfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKG1pZFRleGNvb3JkLCAwLjUsIG1pZFRleGNvb3JkKTsKICAgICAgICAgICAgICAgICAgc3ViZGl2aWRlZFRleGNvb3Jkcy5wdXNoKG1pZFRleGNvb3JkLngsIG1pZFRleGNvb3JkLnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0cmlhbmdsZXMucHVzaChpMCwgaSwgaTIpOwogICAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGksIGkxLCBpMik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZzEgPT09IG1heDMpIHsKICAgICAgICAgICAgICBlZGdlID0gYCR7TWF0aC5taW4oaTEsIGkyKX0gJHtNYXRoLm1heChpMSwgaTIpfWA7CiAgICAgICAgICAgICAgaSA9IGVkZ2VzW2VkZ2VdOwogICAgICAgICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGkpKSB7CiAgICAgICAgICAgICAgICBtaWQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHYxMiwgdjIyLCBzdWJkaXZpc2lvbk1pZFNjcmF0Y2gpOwogICAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIobWlkLCAwLjUsIG1pZCk7CiAgICAgICAgICAgICAgICBzdWJkaXZpZGVkUG9zaXRpb25zLnB1c2gobWlkLngsIG1pZC55LCBtaWQueik7CiAgICAgICAgICAgICAgICBpID0gc3ViZGl2aWRlZFBvc2l0aW9ucy5sZW5ndGggLyAzIC0gMTsKICAgICAgICAgICAgICAgIGVkZ2VzW2VkZ2VdID0gaTsKICAgICAgICAgICAgICAgIGlmIChoYXNUZXhjb29yZHMpIHsKICAgICAgICAgICAgICAgICAgbWlkVGV4Y29vcmQgPSBDYXJ0ZXNpYW4yX2RlZmF1bHQuYWRkKHQxLCB0Miwgc3ViZGl2aXNpb25UZXhjb29yZE1pZFNjcmF0Y2gpOwogICAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4yX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihtaWRUZXhjb29yZCwgMC41LCBtaWRUZXhjb29yZCk7CiAgICAgICAgICAgICAgICAgIHN1YmRpdmlkZWRUZXhjb29yZHMucHVzaChtaWRUZXhjb29yZC54LCBtaWRUZXhjb29yZC55KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goaTEsIGksIGkwKTsKICAgICAgICAgICAgICB0cmlhbmdsZXMucHVzaChpLCBpMiwgaTApOwogICAgICAgICAgICB9IGVsc2UgaWYgKGcyID09PSBtYXgzKSB7CiAgICAgICAgICAgICAgZWRnZSA9IGAke01hdGgubWluKGkyLCBpMCl9ICR7TWF0aC5tYXgoaTIsIGkwKX1gOwogICAgICAgICAgICAgIGkgPSBlZGdlc1tlZGdlXTsKICAgICAgICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChpKSkgewogICAgICAgICAgICAgICAgbWlkID0gQ2FydGVzaWFuM19kZWZhdWx0LmFkZCh2MjIsIHYwMiwgc3ViZGl2aXNpb25NaWRTY3JhdGNoKTsKICAgICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKG1pZCwgMC41LCBtaWQpOwogICAgICAgICAgICAgICAgc3ViZGl2aWRlZFBvc2l0aW9ucy5wdXNoKG1pZC54LCBtaWQueSwgbWlkLnopOwogICAgICAgICAgICAgICAgaSA9IHN1YmRpdmlkZWRQb3NpdGlvbnMubGVuZ3RoIC8gMyAtIDE7CiAgICAgICAgICAgICAgICBlZGdlc1tlZGdlXSA9IGk7CiAgICAgICAgICAgICAgICBpZiAoaGFzVGV4Y29vcmRzKSB7CiAgICAgICAgICAgICAgICAgIG1pZFRleGNvb3JkID0gQ2FydGVzaWFuMl9kZWZhdWx0LmFkZCh0MiwgdDAsIHN1YmRpdmlzaW9uVGV4Y29vcmRNaWRTY3JhdGNoKTsKICAgICAgICAgICAgICAgICAgQ2FydGVzaWFuMl9kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIobWlkVGV4Y29vcmQsIDAuNSwgbWlkVGV4Y29vcmQpOwogICAgICAgICAgICAgICAgICBzdWJkaXZpZGVkVGV4Y29vcmRzLnB1c2gobWlkVGV4Y29vcmQueCwgbWlkVGV4Y29vcmQueSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGkyLCBpLCBpMSk7CiAgICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goaSwgaTAsIGkxKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3ViZGl2aWRlZEluZGljZXMucHVzaChpMCk7CiAgICAgICAgICAgIHN1YmRpdmlkZWRJbmRpY2VzLnB1c2goaTEpOwogICAgICAgICAgICBzdWJkaXZpZGVkSW5kaWNlcy5wdXNoKGkyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgZ2VvbWV0cnlPcHRpb25zID0gewogICAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgICBwb3NpdGlvbjogbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkRPVUJMRSwKICAgICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgICAgICAgIHZhbHVlczogc3ViZGl2aWRlZFBvc2l0aW9ucwogICAgICAgICAgICB9KQogICAgICAgICAgfSwKICAgICAgICAgIGluZGljZXM6IHN1YmRpdmlkZWRJbmRpY2VzLAogICAgICAgICAgcHJpbWl0aXZlVHlwZTogUHJpbWl0aXZlVHlwZV9kZWZhdWx0LlRSSUFOR0xFUwogICAgICAgIH07CiAgICAgICAgaWYgKGhhc1RleGNvb3JkcykgewogICAgICAgICAgZ2VvbWV0cnlPcHRpb25zLmF0dHJpYnV0ZXMuc3QgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAyLAogICAgICAgICAgICB2YWx1ZXM6IHN1YmRpdmlkZWRUZXhjb29yZHMKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IEdlb21ldHJ5X2RlZmF1bHQoZ2VvbWV0cnlPcHRpb25zKTsKICAgICAgfTsKICAgICAgc3ViZGl2aXNpb25DMFNjcmF0Y2ggPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgc3ViZGl2aXNpb25DMVNjcmF0Y2ggPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgc3ViZGl2aXNpb25DMlNjcmF0Y2ggPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgc3ViZGl2aXNpb25DYXJ0b2dyYXBoaWNTY3JhdGNoID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIFBvbHlnb25QaXBlbGluZS5jb21wdXRlUmh1bWJMaW5lU3ViZGl2aXNpb24gPSBmdW5jdGlvbihlbGxpcHNvaWQsIHBvc2l0aW9ucywgaW5kaWNlcywgdGV4Y29vcmRzLCBncmFudWxhcml0eSkgewogICAgICAgIGdyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHkgPz8gTWF0aF9kZWZhdWx0LlJBRElBTlNfUEVSX0RFR1JFRTsKICAgICAgICBjb25zdCBoYXNUZXhjb29yZHMgPSBkZWZpbmVkX2RlZmF1bHQodGV4Y29vcmRzKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImVsbGlwc29pZCIsIGVsbGlwc29pZCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJwb3NpdGlvbnMiLCBwb3NpdGlvbnMpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiaW5kaWNlcyIsIGluZGljZXMpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJpbmRpY2VzLmxlbmd0aCIsIGluZGljZXMubGVuZ3RoLCAzKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZXF1YWxzKCJpbmRpY2VzLmxlbmd0aCAlIDMiLCAiMCIsIGluZGljZXMubGVuZ3RoICUgMywgMCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuKCJncmFudWxhcml0eSIsIGdyYW51bGFyaXR5LCAwKTsKICAgICAgICBjb25zdCB0cmlhbmdsZXMgPSBpbmRpY2VzLnNsaWNlKDApOwogICAgICAgIGxldCBpOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgY29uc3Qgc3ViZGl2aWRlZFBvc2l0aW9ucyA9IG5ldyBBcnJheShsZW5ndGggKiAzKTsKICAgICAgICBjb25zdCBzdWJkaXZpZGVkVGV4Y29vcmRzID0gbmV3IEFycmF5KGxlbmd0aCAqIDIpOwogICAgICAgIGxldCBxID0gMDsKICAgICAgICBsZXQgcCA9IDA7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBpdGVtID0gcG9zaXRpb25zW2ldOwogICAgICAgICAgc3ViZGl2aWRlZFBvc2l0aW9uc1txKytdID0gaXRlbS54OwogICAgICAgICAgc3ViZGl2aWRlZFBvc2l0aW9uc1txKytdID0gaXRlbS55OwogICAgICAgICAgc3ViZGl2aWRlZFBvc2l0aW9uc1txKytdID0gaXRlbS56OwogICAgICAgICAgaWYgKGhhc1RleGNvb3JkcykgewogICAgICAgICAgICBjb25zdCB0ZXhjb29yZEl0ZW0gPSB0ZXhjb29yZHNbaV07CiAgICAgICAgICAgIHN1YmRpdmlkZWRUZXhjb29yZHNbcCsrXSA9IHRleGNvb3JkSXRlbS54OwogICAgICAgICAgICBzdWJkaXZpZGVkVGV4Y29vcmRzW3ArK10gPSB0ZXhjb29yZEl0ZW0ueTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3Qgc3ViZGl2aWRlZEluZGljZXMgPSBbXTsKICAgICAgICBjb25zdCBlZGdlcyA9IHt9OwogICAgICAgIGNvbnN0IHJhZGl1cyA9IGVsbGlwc29pZC5tYXhpbXVtUmFkaXVzOwogICAgICAgIGNvbnN0IG1pbkRpc3RhbmNlID0gTWF0aF9kZWZhdWx0LmNob3JkTGVuZ3RoKGdyYW51bGFyaXR5LCByYWRpdXMpOwogICAgICAgIGNvbnN0IHJodW1iMCA9IG5ldyBFbGxpcHNvaWRSaHVtYkxpbmVfZGVmYXVsdCh2b2lkIDAsIHZvaWQgMCwgZWxsaXBzb2lkKTsKICAgICAgICBjb25zdCByaHVtYjEgPSBuZXcgRWxsaXBzb2lkUmh1bWJMaW5lX2RlZmF1bHQodm9pZCAwLCB2b2lkIDAsIGVsbGlwc29pZCk7CiAgICAgICAgY29uc3Qgcmh1bWIyID0gbmV3IEVsbGlwc29pZFJodW1iTGluZV9kZWZhdWx0KHZvaWQgMCwgdm9pZCAwLCBlbGxpcHNvaWQpOwogICAgICAgIHdoaWxlICh0cmlhbmdsZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgY29uc3QgaTIgPSB0cmlhbmdsZXMucG9wKCk7CiAgICAgICAgICBjb25zdCBpMSA9IHRyaWFuZ2xlcy5wb3AoKTsKICAgICAgICAgIGNvbnN0IGkwID0gdHJpYW5nbGVzLnBvcCgpOwogICAgICAgICAgY29uc3QgdjAyID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheSgKICAgICAgICAgICAgc3ViZGl2aWRlZFBvc2l0aW9ucywKICAgICAgICAgICAgaTAgKiAzLAogICAgICAgICAgICBzdWJkaXZpc2lvblYwU2NyYXRjaAogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IHYxMiA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoCiAgICAgICAgICAgIHN1YmRpdmlkZWRQb3NpdGlvbnMsCiAgICAgICAgICAgIGkxICogMywKICAgICAgICAgICAgc3ViZGl2aXNpb25WMVNjcmF0Y2gKICAgICAgICAgICk7CiAgICAgICAgICBjb25zdCB2MjIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KAogICAgICAgICAgICBzdWJkaXZpZGVkUG9zaXRpb25zLAogICAgICAgICAgICBpMiAqIDMsCiAgICAgICAgICAgIHN1YmRpdmlzaW9uVjJTY3JhdGNoCiAgICAgICAgICApOwogICAgICAgICAgbGV0IHQwLCB0MSwgdDI7CiAgICAgICAgICBpZiAoaGFzVGV4Y29vcmRzKSB7CiAgICAgICAgICAgIHQwID0gQ2FydGVzaWFuMl9kZWZhdWx0LmZyb21BcnJheSgKICAgICAgICAgICAgICBzdWJkaXZpZGVkVGV4Y29vcmRzLAogICAgICAgICAgICAgIGkwICogMiwKICAgICAgICAgICAgICBzdWJkaXZpc2lvblQwU2NyYXRjaAogICAgICAgICAgICApOwogICAgICAgICAgICB0MSA9IENhcnRlc2lhbjJfZGVmYXVsdC5mcm9tQXJyYXkoCiAgICAgICAgICAgICAgc3ViZGl2aWRlZFRleGNvb3JkcywKICAgICAgICAgICAgICBpMSAqIDIsCiAgICAgICAgICAgICAgc3ViZGl2aXNpb25UMVNjcmF0Y2gKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdDIgPSBDYXJ0ZXNpYW4yX2RlZmF1bHQuZnJvbUFycmF5KAogICAgICAgICAgICAgIHN1YmRpdmlkZWRUZXhjb29yZHMsCiAgICAgICAgICAgICAgaTIgKiAyLAogICAgICAgICAgICAgIHN1YmRpdmlzaW9uVDJTY3JhdGNoCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBjMCA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh2MDIsIHN1YmRpdmlzaW9uQzBTY3JhdGNoKTsKICAgICAgICAgIGNvbnN0IGMxID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHYxMiwgc3ViZGl2aXNpb25DMVNjcmF0Y2gpOwogICAgICAgICAgY29uc3QgYzIgPSBlbGxpcHNvaWQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWModjIyLCBzdWJkaXZpc2lvbkMyU2NyYXRjaCk7CiAgICAgICAgICByaHVtYjAuc2V0RW5kUG9pbnRzKGMwLCBjMSk7CiAgICAgICAgICBjb25zdCBnMCA9IHJodW1iMC5zdXJmYWNlRGlzdGFuY2U7CiAgICAgICAgICByaHVtYjEuc2V0RW5kUG9pbnRzKGMxLCBjMik7CiAgICAgICAgICBjb25zdCBnMSA9IHJodW1iMS5zdXJmYWNlRGlzdGFuY2U7CiAgICAgICAgICByaHVtYjIuc2V0RW5kUG9pbnRzKGMyLCBjMCk7CiAgICAgICAgICBjb25zdCBnMiA9IHJodW1iMi5zdXJmYWNlRGlzdGFuY2U7CiAgICAgICAgICBjb25zdCBtYXgzID0gTWF0aC5tYXgoZzAsIGcxLCBnMik7CiAgICAgICAgICBsZXQgZWRnZTsKICAgICAgICAgIGxldCBtaWQ7CiAgICAgICAgICBsZXQgbWlkSGVpZ2h0OwogICAgICAgICAgbGV0IG1pZENhcnRlc2lhbjM7CiAgICAgICAgICBsZXQgbWlkVGV4Y29vcmQ7CiAgICAgICAgICBpZiAobWF4MyA+IG1pbkRpc3RhbmNlKSB7CiAgICAgICAgICAgIGlmIChnMCA9PT0gbWF4MykgewogICAgICAgICAgICAgIGVkZ2UgPSBgJHtNYXRoLm1pbihpMCwgaTEpfSAke01hdGgubWF4KGkwLCBpMSl9YDsKICAgICAgICAgICAgICBpID0gZWRnZXNbZWRnZV07CiAgICAgICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaSkpIHsKICAgICAgICAgICAgICAgIG1pZCA9IHJodW1iMC5pbnRlcnBvbGF0ZVVzaW5nRnJhY3Rpb24oCiAgICAgICAgICAgICAgICAgIDAuNSwKICAgICAgICAgICAgICAgICAgc3ViZGl2aXNpb25DYXJ0b2dyYXBoaWNTY3JhdGNoCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbWlkSGVpZ2h0ID0gKGMwLmhlaWdodCArIGMxLmhlaWdodCkgKiAwLjU7CiAgICAgICAgICAgICAgICBtaWRDYXJ0ZXNpYW4zID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21SYWRpYW5zKAogICAgICAgICAgICAgICAgICBtaWQubG9uZ2l0dWRlLAogICAgICAgICAgICAgICAgICBtaWQubGF0aXR1ZGUsCiAgICAgICAgICAgICAgICAgIG1pZEhlaWdodCwKICAgICAgICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICAgICAgICBzdWJkaXZpc2lvbk1pZFNjcmF0Y2gKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBzdWJkaXZpZGVkUG9zaXRpb25zLnB1c2goCiAgICAgICAgICAgICAgICAgIG1pZENhcnRlc2lhbjMueCwKICAgICAgICAgICAgICAgICAgbWlkQ2FydGVzaWFuMy55LAogICAgICAgICAgICAgICAgICBtaWRDYXJ0ZXNpYW4zLnoKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpID0gc3ViZGl2aWRlZFBvc2l0aW9ucy5sZW5ndGggLyAzIC0gMTsKICAgICAgICAgICAgICAgIGVkZ2VzW2VkZ2VdID0gaTsKICAgICAgICAgICAgICAgIGlmIChoYXNUZXhjb29yZHMpIHsKICAgICAgICAgICAgICAgICAgbWlkVGV4Y29vcmQgPSBDYXJ0ZXNpYW4yX2RlZmF1bHQuYWRkKHQwLCB0MSwgc3ViZGl2aXNpb25UZXhjb29yZE1pZFNjcmF0Y2gpOwogICAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4yX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihtaWRUZXhjb29yZCwgMC41LCBtaWRUZXhjb29yZCk7CiAgICAgICAgICAgICAgICAgIHN1YmRpdmlkZWRUZXhjb29yZHMucHVzaChtaWRUZXhjb29yZC54LCBtaWRUZXhjb29yZC55KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goaTAsIGksIGkyKTsKICAgICAgICAgICAgICB0cmlhbmdsZXMucHVzaChpLCBpMSwgaTIpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGcxID09PSBtYXgzKSB7CiAgICAgICAgICAgICAgZWRnZSA9IGAke01hdGgubWluKGkxLCBpMil9ICR7TWF0aC5tYXgoaTEsIGkyKX1gOwogICAgICAgICAgICAgIGkgPSBlZGdlc1tlZGdlXTsKICAgICAgICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChpKSkgewogICAgICAgICAgICAgICAgbWlkID0gcmh1bWIxLmludGVycG9sYXRlVXNpbmdGcmFjdGlvbigKICAgICAgICAgICAgICAgICAgMC41LAogICAgICAgICAgICAgICAgICBzdWJkaXZpc2lvbkNhcnRvZ3JhcGhpY1NjcmF0Y2gKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBtaWRIZWlnaHQgPSAoYzEuaGVpZ2h0ICsgYzIuaGVpZ2h0KSAqIDAuNTsKICAgICAgICAgICAgICAgIG1pZENhcnRlc2lhbjMgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbVJhZGlhbnMoCiAgICAgICAgICAgICAgICAgIG1pZC5sb25naXR1ZGUsCiAgICAgICAgICAgICAgICAgIG1pZC5sYXRpdHVkZSwKICAgICAgICAgICAgICAgICAgbWlkSGVpZ2h0LAogICAgICAgICAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICAgICAgICAgIHN1YmRpdmlzaW9uTWlkU2NyYXRjaAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHN1YmRpdmlkZWRQb3NpdGlvbnMucHVzaCgKICAgICAgICAgICAgICAgICAgbWlkQ2FydGVzaWFuMy54LAogICAgICAgICAgICAgICAgICBtaWRDYXJ0ZXNpYW4zLnksCiAgICAgICAgICAgICAgICAgIG1pZENhcnRlc2lhbjMuegogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGkgPSBzdWJkaXZpZGVkUG9zaXRpb25zLmxlbmd0aCAvIDMgLSAxOwogICAgICAgICAgICAgICAgZWRnZXNbZWRnZV0gPSBpOwogICAgICAgICAgICAgICAgaWYgKGhhc1RleGNvb3JkcykgewogICAgICAgICAgICAgICAgICBtaWRUZXhjb29yZCA9IENhcnRlc2lhbjJfZGVmYXVsdC5hZGQodDEsIHQyLCBzdWJkaXZpc2lvblRleGNvb3JkTWlkU2NyYXRjaCk7CiAgICAgICAgICAgICAgICAgIENhcnRlc2lhbjJfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKG1pZFRleGNvb3JkLCAwLjUsIG1pZFRleGNvb3JkKTsKICAgICAgICAgICAgICAgICAgc3ViZGl2aWRlZFRleGNvb3Jkcy5wdXNoKG1pZFRleGNvb3JkLngsIG1pZFRleGNvb3JkLnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0cmlhbmdsZXMucHVzaChpMSwgaSwgaTApOwogICAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGksIGkyLCBpMCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZzIgPT09IG1heDMpIHsKICAgICAgICAgICAgICBlZGdlID0gYCR7TWF0aC5taW4oaTIsIGkwKX0gJHtNYXRoLm1heChpMiwgaTApfWA7CiAgICAgICAgICAgICAgaSA9IGVkZ2VzW2VkZ2VdOwogICAgICAgICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGkpKSB7CiAgICAgICAgICAgICAgICBtaWQgPSByaHVtYjIuaW50ZXJwb2xhdGVVc2luZ0ZyYWN0aW9uKAogICAgICAgICAgICAgICAgICAwLjUsCiAgICAgICAgICAgICAgICAgIHN1YmRpdmlzaW9uQ2FydG9ncmFwaGljU2NyYXRjaAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG1pZEhlaWdodCA9IChjMi5oZWlnaHQgKyBjMC5oZWlnaHQpICogMC41OwogICAgICAgICAgICAgICAgbWlkQ2FydGVzaWFuMyA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tUmFkaWFucygKICAgICAgICAgICAgICAgICAgbWlkLmxvbmdpdHVkZSwKICAgICAgICAgICAgICAgICAgbWlkLmxhdGl0dWRlLAogICAgICAgICAgICAgICAgICBtaWRIZWlnaHQsCiAgICAgICAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgICAgICAgc3ViZGl2aXNpb25NaWRTY3JhdGNoCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgc3ViZGl2aWRlZFBvc2l0aW9ucy5wdXNoKAogICAgICAgICAgICAgICAgICBtaWRDYXJ0ZXNpYW4zLngsCiAgICAgICAgICAgICAgICAgIG1pZENhcnRlc2lhbjMueSwKICAgICAgICAgICAgICAgICAgbWlkQ2FydGVzaWFuMy56CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaSA9IHN1YmRpdmlkZWRQb3NpdGlvbnMubGVuZ3RoIC8gMyAtIDE7CiAgICAgICAgICAgICAgICBlZGdlc1tlZGdlXSA9IGk7CiAgICAgICAgICAgICAgICBpZiAoaGFzVGV4Y29vcmRzKSB7CiAgICAgICAgICAgICAgICAgIG1pZFRleGNvb3JkID0gQ2FydGVzaWFuMl9kZWZhdWx0LmFkZCh0MiwgdDAsIHN1YmRpdmlzaW9uVGV4Y29vcmRNaWRTY3JhdGNoKTsKICAgICAgICAgICAgICAgICAgQ2FydGVzaWFuMl9kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIobWlkVGV4Y29vcmQsIDAuNSwgbWlkVGV4Y29vcmQpOwogICAgICAgICAgICAgICAgICBzdWJkaXZpZGVkVGV4Y29vcmRzLnB1c2gobWlkVGV4Y29vcmQueCwgbWlkVGV4Y29vcmQueSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGkyLCBpLCBpMSk7CiAgICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goaSwgaTAsIGkxKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3ViZGl2aWRlZEluZGljZXMucHVzaChpMCk7CiAgICAgICAgICAgIHN1YmRpdmlkZWRJbmRpY2VzLnB1c2goaTEpOwogICAgICAgICAgICBzdWJkaXZpZGVkSW5kaWNlcy5wdXNoKGkyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgZ2VvbWV0cnlPcHRpb25zID0gewogICAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgICBwb3NpdGlvbjogbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkRPVUJMRSwKICAgICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgICAgICAgIHZhbHVlczogc3ViZGl2aWRlZFBvc2l0aW9ucwogICAgICAgICAgICB9KQogICAgICAgICAgfSwKICAgICAgICAgIGluZGljZXM6IHN1YmRpdmlkZWRJbmRpY2VzLAogICAgICAgICAgcHJpbWl0aXZlVHlwZTogUHJpbWl0aXZlVHlwZV9kZWZhdWx0LlRSSUFOR0xFUwogICAgICAgIH07CiAgICAgICAgaWYgKGhhc1RleGNvb3JkcykgewogICAgICAgICAgZ2VvbWV0cnlPcHRpb25zLmF0dHJpYnV0ZXMuc3QgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAyLAogICAgICAgICAgICB2YWx1ZXM6IHN1YmRpdmlkZWRUZXhjb29yZHMKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IEdlb21ldHJ5X2RlZmF1bHQoZ2VvbWV0cnlPcHRpb25zKTsKICAgICAgfTsKICAgICAgUG9seWdvblBpcGVsaW5lLnNjYWxlVG9HZW9kZXRpY0hlaWdodCA9IGZ1bmN0aW9uKHBvc2l0aW9ucywgaGVpZ2h0LCBlbGxpcHNvaWQsIHNjYWxlVG9TdXJmYWNlNCkgewogICAgICAgIGVsbGlwc29pZCA9IGVsbGlwc29pZCA/PyBFbGxpcHNvaWRfZGVmYXVsdC5kZWZhdWx0OwogICAgICAgIGxldCBuID0gc2NhbGVUb0dlb2RldGljSGVpZ2h0TjsKICAgICAgICBsZXQgcCA9IHNjYWxlVG9HZW9kZXRpY0hlaWdodFA7CiAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0ID8/IDA7CiAgICAgICAgc2NhbGVUb1N1cmZhY2U0ID0gc2NhbGVUb1N1cmZhY2U0ID8/IHRydWU7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChwb3NpdGlvbnMpKSB7CiAgICAgICAgICBjb25zdCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMykgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KHBvc2l0aW9ucywgaSwgcCk7CiAgICAgICAgICAgIGlmIChzY2FsZVRvU3VyZmFjZTQpIHsKICAgICAgICAgICAgICBwID0gZWxsaXBzb2lkLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UocCwgcCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGhlaWdodCAhPT0gMCkgewogICAgICAgICAgICAgIG4gPSBlbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKHAsIG4pOwogICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKG4sIGhlaWdodCwgbik7CiAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChwLCBuLCBwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwb3NpdGlvbnNbaV0gPSBwLng7CiAgICAgICAgICAgIHBvc2l0aW9uc1tpICsgMV0gPSBwLnk7CiAgICAgICAgICAgIHBvc2l0aW9uc1tpICsgMl0gPSBwLno7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwb3NpdGlvbnM7CiAgICAgIH07CiAgICAgIFBvbHlnb25QaXBlbGluZV9kZWZhdWx0ID0gUG9seWdvblBpcGVsaW5lOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUXVldWUuanMKICBmdW5jdGlvbiBRdWV1ZSgpIHsKICAgIHRoaXMuX2FycmF5ID0gW107CiAgICB0aGlzLl9vZmZzZXQgPSAwOwogICAgdGhpcy5fbGVuZ3RoID0gMDsKICB9CiAgdmFyIFF1ZXVlX2RlZmF1bHQ7CiAgdmFyIGluaXRfUXVldWUgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1F1ZXVlLmpzIigpIHsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUXVldWUucHJvdG90eXBlLCB7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGxlbmd0aCBvZiB0aGUgcXVldWUuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgUXVldWUucHJvdG90eXBlCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqLwogICAgICAgIGxlbmd0aDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xlbmd0aDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBRdWV1ZS5wcm90b3R5cGUuZW5xdWV1ZSA9IGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICB0aGlzLl9hcnJheS5wdXNoKGl0ZW0pOwogICAgICAgIHRoaXMuX2xlbmd0aCsrOwogICAgICB9OwogICAgICBRdWV1ZS5wcm90b3R5cGUuZGVxdWV1ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGFycmF5ID0gdGhpcy5fYXJyYXk7CiAgICAgICAgbGV0IG9mZnNldCA9IHRoaXMuX29mZnNldDsKICAgICAgICBjb25zdCBpdGVtID0gYXJyYXlbb2Zmc2V0XTsKICAgICAgICBhcnJheVtvZmZzZXRdID0gdm9pZCAwOwogICAgICAgIG9mZnNldCsrOwogICAgICAgIGlmIChvZmZzZXQgPiAxMCAmJiBvZmZzZXQgKiAyID4gYXJyYXkubGVuZ3RoKSB7CiAgICAgICAgICB0aGlzLl9hcnJheSA9IGFycmF5LnNsaWNlKG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgPSAwOwogICAgICAgIH0KICAgICAgICB0aGlzLl9vZmZzZXQgPSBvZmZzZXQ7CiAgICAgICAgdGhpcy5fbGVuZ3RoLS07CiAgICAgICAgcmV0dXJuIGl0ZW07CiAgICAgIH07CiAgICAgIFF1ZXVlLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuX2xlbmd0aCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2FycmF5W3RoaXMuX29mZnNldF07CiAgICAgIH07CiAgICAgIFF1ZXVlLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICByZXR1cm4gdGhpcy5fYXJyYXkuaW5kZXhPZihpdGVtKSAhPT0gLTE7CiAgICAgIH07CiAgICAgIFF1ZXVlLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2FycmF5Lmxlbmd0aCA9IHRoaXMuX29mZnNldCA9IHRoaXMuX2xlbmd0aCA9IDA7CiAgICAgIH07CiAgICAgIFF1ZXVlLnByb3RvdHlwZS5zb3J0ID0gZnVuY3Rpb24oY29tcGFyZUZ1bmN0aW9uKSB7CiAgICAgICAgaWYgKHRoaXMuX29mZnNldCA+IDApIHsKICAgICAgICAgIHRoaXMuX2FycmF5ID0gdGhpcy5fYXJyYXkuc2xpY2UodGhpcy5fb2Zmc2V0KTsKICAgICAgICAgIHRoaXMuX29mZnNldCA9IDA7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2FycmF5LnNvcnQoY29tcGFyZUZ1bmN0aW9uKTsKICAgICAgfTsKICAgICAgUXVldWVfZGVmYXVsdCA9IFF1ZXVlOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUG9seWdvbkdlb21ldHJ5TGlicmFyeS5qcwogIGZ1bmN0aW9uIGdldFBvaW50QXREaXN0YW5jZTJEKHAwLCBwMSwgZGlzdGFuY2UsIGxlbmd0aCkgewogICAgQ2FydGVzaWFuMl9kZWZhdWx0LnN1YnRyYWN0KHAxLCBwMCwgZGlzdGFuY2UyRFNjcmF0Y2gpOwogICAgQ2FydGVzaWFuMl9kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoCiAgICAgIGRpc3RhbmNlMkRTY3JhdGNoLAogICAgICBkaXN0YW5jZSAvIGxlbmd0aCwKICAgICAgZGlzdGFuY2UyRFNjcmF0Y2gKICAgICk7CiAgICBDYXJ0ZXNpYW4yX2RlZmF1bHQuYWRkKHAwLCBkaXN0YW5jZTJEU2NyYXRjaCwgZGlzdGFuY2UyRFNjcmF0Y2gpOwogICAgcmV0dXJuIFtkaXN0YW5jZTJEU2NyYXRjaC54LCBkaXN0YW5jZTJEU2NyYXRjaC55XTsKICB9CiAgZnVuY3Rpb24gZ2V0UG9pbnRBdERpc3RhbmNlKHAwLCBwMSwgZGlzdGFuY2UsIGxlbmd0aCkgewogICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KHAxLCBwMCwgZGlzdGFuY2VTY3JhdGNoNCk7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcigKICAgICAgZGlzdGFuY2VTY3JhdGNoNCwKICAgICAgZGlzdGFuY2UgLyBsZW5ndGgsCiAgICAgIGRpc3RhbmNlU2NyYXRjaDQKICAgICk7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHAwLCBkaXN0YW5jZVNjcmF0Y2g0LCBkaXN0YW5jZVNjcmF0Y2g0KTsKICAgIHJldHVybiBbZGlzdGFuY2VTY3JhdGNoNC54LCBkaXN0YW5jZVNjcmF0Y2g0LnksIGRpc3RhbmNlU2NyYXRjaDQuel07CiAgfQogIGZ1bmN0aW9uIGNvbXB1dGVFcXVhdG9ySW50ZXJzZWN0aW9uUmh1bWIoc3RhcnQsIGVuZCwgZWxsaXBzb2lkKSB7CiAgICBjb25zdCBjMCA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhzdGFydCwgc2NyYXRjaENhcnRvZ3JhcGhpYzApOwogICAgY29uc3QgYzEgPSBlbGxpcHNvaWQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoZW5kLCBzY3JhdGNoQ2FydG9ncmFwaGljMSk7CiAgICBpZiAoTWF0aC5zaWduKGMwLmxhdGl0dWRlKSA9PT0gTWF0aC5zaWduKGMxLmxhdGl0dWRlKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBzY3JhdGNoUmh1bWJMaW5lLnNldEVuZFBvaW50cyhjMCwgYzEpOwogICAgY29uc3QgaW50ZXJzZWN0aW9uID0gc2NyYXRjaFJodW1iTGluZS5maW5kSW50ZXJzZWN0aW9uV2l0aExhdGl0dWRlKAogICAgICAwLAogICAgICBzY3JhdGNoUmh1bWJJbnRlcnNlY3Rpb24KICAgICk7CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChpbnRlcnNlY3Rpb24pKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBtaW5Mb25naXR1ZGUgPSBNYXRoLm1pbihjMC5sb25naXR1ZGUsIGMxLmxvbmdpdHVkZSk7CiAgICBsZXQgbWF4TG9uZ2l0dWRlID0gTWF0aC5tYXgoYzAubG9uZ2l0dWRlLCBjMS5sb25naXR1ZGUpOwogICAgaWYgKE1hdGguYWJzKG1heExvbmdpdHVkZSAtIG1pbkxvbmdpdHVkZSkgPiBNYXRoX2RlZmF1bHQuUEkpIHsKICAgICAgY29uc3Qgc3dhcDIgPSBtaW5Mb25naXR1ZGU7CiAgICAgIG1pbkxvbmdpdHVkZSA9IG1heExvbmdpdHVkZTsKICAgICAgbWF4TG9uZ2l0dWRlID0gc3dhcDI7CiAgICB9CiAgICBpZiAoaW50ZXJzZWN0aW9uLmxvbmdpdHVkZSA8IG1pbkxvbmdpdHVkZSB8fCBpbnRlcnNlY3Rpb24ubG9uZ2l0dWRlID4gbWF4TG9uZ2l0dWRlKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHJldHVybiBlbGxpcHNvaWQuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oaW50ZXJzZWN0aW9uKTsKICB9CiAgZnVuY3Rpb24gY29tcHV0ZUVxdWF0b3JJbnRlcnNlY3Rpb24oc3RhcnQsIGVuZCwgZWxsaXBzb2lkLCBhcmNUeXBlKSB7CiAgICBpZiAoYXJjVHlwZSA9PT0gQXJjVHlwZV9kZWZhdWx0LlJIVU1CKSB7CiAgICAgIHJldHVybiBjb21wdXRlRXF1YXRvckludGVyc2VjdGlvblJodW1iKHN0YXJ0LCBlbmQsIGVsbGlwc29pZCk7CiAgICB9CiAgICBjb25zdCBpbnRlcnNlY3Rpb24gPSBJbnRlcnNlY3Rpb25UZXN0c19kZWZhdWx0LmxpbmVTZWdtZW50UGxhbmUoCiAgICAgIHN0YXJ0LAogICAgICBlbmQsCiAgICAgIFBsYW5lX2RlZmF1bHQuT1JJR0lOX1hZX1BMQU5FCiAgICApOwogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaW50ZXJzZWN0aW9uKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICByZXR1cm4gZWxsaXBzb2lkLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoaW50ZXJzZWN0aW9uLCBpbnRlcnNlY3Rpb24pOwogIH0KICBmdW5jdGlvbiBjb21wdXRlRWRnZXNPblBsYW5lKHBvc2l0aW9ucywgZWxsaXBzb2lkLCBhcmNUeXBlKSB7CiAgICBjb25zdCBlZGdlc09uUGxhbmUgPSBbXTsKICAgIGxldCBzdGFydFBvaW50LCBlbmRQb2ludCwgdHlwZSwgbmV4dCwgaW50ZXJzZWN0aW9uLCBpID0gMDsKICAgIHdoaWxlIChpIDwgcG9zaXRpb25zLmxlbmd0aCkgewogICAgICBzdGFydFBvaW50ID0gcG9zaXRpb25zW2ldOwogICAgICBlbmRQb2ludCA9IHBvc2l0aW9uc1soaSArIDEpICUgcG9zaXRpb25zLmxlbmd0aF07CiAgICAgIHR5cGUgPSBNYXRoX2RlZmF1bHQuc2lnbihzdGFydFBvaW50LnopOwogICAgICBuZXh0ID0gTWF0aF9kZWZhdWx0LnNpZ24oZW5kUG9pbnQueik7CiAgICAgIGNvbnN0IGdldExvbmdpdHVkZSA9IChwb3NpdGlvbikgPT4gewogICAgICAgIGNvbnN0IGNhcnRvZ3JhcGhpYzIgPSBlbGxpcHNvaWQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoCiAgICAgICAgICBwb3NpdGlvbiwKICAgICAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWMzCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gY2FydG9ncmFwaGljMi5sb25naXR1ZGU7CiAgICAgIH07CiAgICAgIGlmICh0eXBlID09PSAwKSB7CiAgICAgICAgZWRnZXNPblBsYW5lLnB1c2goewogICAgICAgICAgcG9zaXRpb246IGksCiAgICAgICAgICB0eXBlLAogICAgICAgICAgdmlzaXRlZDogZmFsc2UsCiAgICAgICAgICBuZXh0LAogICAgICAgICAgdGhldGE6IGdldExvbmdpdHVkZShzdGFydFBvaW50KQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKG5leHQgIT09IDApIHsKICAgICAgICBpbnRlcnNlY3Rpb24gPSBjb21wdXRlRXF1YXRvckludGVyc2VjdGlvbigKICAgICAgICAgIHN0YXJ0UG9pbnQsCiAgICAgICAgICBlbmRQb2ludCwKICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgIGFyY1R5cGUKICAgICAgICApOwogICAgICAgICsraTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChpbnRlcnNlY3Rpb24pKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgcG9zaXRpb25zLnNwbGljZShpLCAwLCBpbnRlcnNlY3Rpb24pOwogICAgICAgIGVkZ2VzT25QbGFuZS5wdXNoKHsKICAgICAgICAgIHBvc2l0aW9uOiBpLAogICAgICAgICAgdHlwZSwKICAgICAgICAgIHZpc2l0ZWQ6IGZhbHNlLAogICAgICAgICAgbmV4dCwKICAgICAgICAgIHRoZXRhOiBnZXRMb25naXR1ZGUoaW50ZXJzZWN0aW9uKQogICAgICAgIH0pOwogICAgICB9CiAgICAgICsraTsKICAgIH0KICAgIHJldHVybiBlZGdlc09uUGxhbmU7CiAgfQogIGZ1bmN0aW9uIHdpcmVQb2x5Z29uKHBvbHlnb25zLCBwb2x5Z29uSW5kZXgsIHBvc2l0aW9ucywgZWRnZXNPblBsYW5lLCB0b0RlbGV0ZSwgc3RhcnRJbmRleCwgYWJvdmVQbGFuZSkgewogICAgY29uc3QgcG9seWdvbjIgPSBbXTsKICAgIGxldCBpID0gc3RhcnRJbmRleDsKICAgIGNvbnN0IGdldE1hdGNoaW5nRWRnZSA9IChpMikgPT4gKGVkZ2UpID0+IGVkZ2UucG9zaXRpb24gPT09IGkyOwogICAgY29uc3QgcG9seWdvbnNUb1dpcmUgPSBbXTsKICAgIGRvIHsKICAgICAgY29uc3QgcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07CiAgICAgIHBvbHlnb24yLnB1c2gocG9zaXRpb24pOwogICAgICBjb25zdCBlZGdlSW5kZXggPSBlZGdlc09uUGxhbmUuZmluZEluZGV4KGdldE1hdGNoaW5nRWRnZShpKSk7CiAgICAgIGNvbnN0IGVkZ2UgPSBlZGdlc09uUGxhbmVbZWRnZUluZGV4XTsKICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZWRnZSkpIHsKICAgICAgICArK2k7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgeyB2aXNpdGVkOiBoYXNCZWVuVmlzaXRlZCwgdHlwZSwgbmV4dCB9ID0gZWRnZTsKICAgICAgZWRnZS52aXNpdGVkID0gdHJ1ZTsKICAgICAgaWYgKHR5cGUgPT09IDApIHsKICAgICAgICBpZiAobmV4dCA9PT0gMCkgewogICAgICAgICAgY29uc3QgcHJldmlvdXNFZGdlID0gZWRnZXNPblBsYW5lW2VkZ2VJbmRleCAtIChhYm92ZVBsYW5lID8gMSA6IC0xKV07CiAgICAgICAgICBpZiAocHJldmlvdXNFZGdlPy5wb3NpdGlvbiA9PT0gaSArIDEpIHsKICAgICAgICAgICAgcHJldmlvdXNFZGdlLnZpc2l0ZWQgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgKytpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFoYXNCZWVuVmlzaXRlZCAmJiBhYm92ZVBsYW5lICYmIG5leHQgPiAwIHx8IHN0YXJ0SW5kZXggPT09IGkgJiYgIWFib3ZlUGxhbmUgJiYgbmV4dCA8IDApIHsKICAgICAgICAgICsraTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBmb2xsb3dFZGdlID0gYWJvdmVQbGFuZSA/IHR5cGUgPj0gMCA6IHR5cGUgPD0gMDsKICAgICAgaWYgKCFmb2xsb3dFZGdlKSB7CiAgICAgICAgKytpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghaGFzQmVlblZpc2l0ZWQpIHsKICAgICAgICBwb2x5Z29uc1RvV2lyZS5wdXNoKGkpOwogICAgICB9CiAgICAgIGNvbnN0IG5leHRFZGdlSW5kZXggPSBlZGdlSW5kZXggKyAoYWJvdmVQbGFuZSA/IDEgOiAtMSk7CiAgICAgIGNvbnN0IG5leHRFZGdlID0gZWRnZXNPblBsYW5lW25leHRFZGdlSW5kZXhdOwogICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChuZXh0RWRnZSkpIHsKICAgICAgICArK2k7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaSA9IG5leHRFZGdlLnBvc2l0aW9uOwogICAgfSB3aGlsZSAoaSA8IHBvc2l0aW9ucy5sZW5ndGggJiYgaSA+PSAwICYmIGkgIT09IHN0YXJ0SW5kZXggJiYgcG9seWdvbjIubGVuZ3RoIDwgcG9zaXRpb25zLmxlbmd0aCk7CiAgICBwb2x5Z29ucy5zcGxpY2UocG9seWdvbkluZGV4LCB0b0RlbGV0ZSwgcG9seWdvbjIpOwogICAgZm9yIChjb25zdCBpbmRleCBvZiBwb2x5Z29uc1RvV2lyZSkgewogICAgICBwb2x5Z29uSW5kZXggPSB3aXJlUG9seWdvbigKICAgICAgICBwb2x5Z29ucywKICAgICAgICArK3BvbHlnb25JbmRleCwKICAgICAgICBwb3NpdGlvbnMsCiAgICAgICAgZWRnZXNPblBsYW5lLAogICAgICAgIDAsCiAgICAgICAgaW5kZXgsCiAgICAgICAgIWFib3ZlUGxhbmUKICAgICAgKTsKICAgIH0KICAgIHJldHVybiBwb2x5Z29uSW5kZXg7CiAgfQogIHZhciBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5LCBkaXN0YW5jZTJEU2NyYXRjaCwgZGlzdGFuY2VTY3JhdGNoNCwgc2NyYXRjaENhcnRvZ3JhcGhpYzAsIHNjcmF0Y2hDYXJ0b2dyYXBoaWMxLCBzY3JhdGNoQ2FydG9ncmFwaGljMjIsIHNjcmF0Y2hDYXJ0ZXNpYW4wLCBzY3JhdGNoUmh1bWJMaW5lLCBzY2FsZVRvR2VvZGV0aWNIZWlnaHROMSwgc2NhbGVUb0dlb2RldGljSGVpZ2h0TjIsIHNjYWxlVG9HZW9kZXRpY0hlaWdodFAxLCBzY2FsZVRvR2VvZGV0aWNIZWlnaHRQMiwgc2NyYXRjaFJodW1iSW50ZXJzZWN0aW9uLCBzY3JhdGNoQ2FydG9ncmFwaGljMywgY29tcHV0ZUJvdW5kaW5nUmVjdGFuZ2xlQ2FydGVzaWFuMiwgY29tcHV0ZUJvdW5kaW5nUmVjdGFuZ2xlQ2FydGVzaWFuMywgY29tcHV0ZUJvdW5kaW5nUmVjdGFuZ2xlUXVhdGVybmlvbiwgY29tcHV0ZUJvdW5kaW5nUmVjdGFuZ2xlTWF0cml4MywgY29tcHV0ZVdhbGxUZXhjb29yZHNTdWJkaXZpZGVkLCBjb21wdXRlV2FsbEluZGljZXNTdWJkaXZpZGVkLCBwMVNjcmF0Y2gyLCBwMlNjcmF0Y2gyLCBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfUG9seWdvbkdlb21ldHJ5TGlicmFyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUG9seWdvbkdlb21ldHJ5TGlicmFyeS5qcyIoKSB7CiAgICAgIGluaXRfQXJjVHlwZSgpOwogICAgICBpbml0X2FycmF5UmVtb3ZlRHVwbGljYXRlcygpOwogICAgICBpbml0X0NhcnRlc2lhbjIoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2FydG9ncmFwaGljKCk7CiAgICAgIGluaXRfQ29tcG9uZW50RGF0YXR5cGUoKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkUmh1bWJMaW5lKCk7CiAgICAgIGluaXRfR2VvbWV0cnkoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlcygpOwogICAgICBpbml0X0dlb21ldHJ5UGlwZWxpbmUoKTsKICAgICAgaW5pdF9JbmRleERhdGF0eXBlKCk7CiAgICAgIGluaXRfSW50ZXJzZWN0aW9uVGVzdHMoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGluaXRfTWF0cml4MygpOwogICAgICBpbml0X1BsYW5lKCk7CiAgICAgIGluaXRfUG9seWdvbkhpZXJhcmNoeSgpOwogICAgICBpbml0X1BvbHlnb25QaXBlbGluZSgpOwogICAgICBpbml0X1ByaW1pdGl2ZVR5cGUoKTsKICAgICAgaW5pdF9RdWF0ZXJuaW9uKCk7CiAgICAgIGluaXRfUXVldWUoKTsKICAgICAgaW5pdF9XaW5kaW5nT3JkZXIoKTsKICAgICAgUG9seWdvbkdlb21ldHJ5TGlicmFyeSA9IHt9OwogICAgICBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5LmNvbXB1dGVIaWVyYXJjaHlQYWNrZWRMZW5ndGggPSBmdW5jdGlvbihwb2x5Z29uSGllcmFyY2h5LCBDYXJ0ZXNpYW5YKSB7CiAgICAgICAgbGV0IG51bUNvbXBvbmVudHMgPSAwOwogICAgICAgIGNvbnN0IHN0YWNrID0gW3BvbHlnb25IaWVyYXJjaHldOwogICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CiAgICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGhpZXJhcmNoeSkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBudW1Db21wb25lbnRzICs9IDI7CiAgICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBoaWVyYXJjaHkucG9zaXRpb25zOwogICAgICAgICAgY29uc3QgaG9sZXMgPSBoaWVyYXJjaHkuaG9sZXM7CiAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHBvc2l0aW9ucykgJiYgcG9zaXRpb25zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbnVtQ29tcG9uZW50cyArPSBwb3NpdGlvbnMubGVuZ3RoICogQ2FydGVzaWFuWC5wYWNrZWRMZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGhvbGVzKSkgewogICAgICAgICAgICBjb25zdCBsZW5ndGggPSBob2xlcy5sZW5ndGg7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICBzdGFjay5wdXNoKGhvbGVzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVtQ29tcG9uZW50czsKICAgICAgfTsKICAgICAgUG9seWdvbkdlb21ldHJ5TGlicmFyeS5wYWNrUG9seWdvbkhpZXJhcmNoeSA9IGZ1bmN0aW9uKHBvbHlnb25IaWVyYXJjaHksIGFycmF5LCBzdGFydGluZ0luZGV4LCBDYXJ0ZXNpYW5YKSB7CiAgICAgICAgY29uc3Qgc3RhY2sgPSBbcG9seWdvbkhpZXJhcmNoeV07CiAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaGllcmFyY2h5KSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IGhpZXJhcmNoeS5wb3NpdGlvbnM7CiAgICAgICAgICBjb25zdCBob2xlcyA9IGhpZXJhcmNoeS5ob2xlczsKICAgICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSBkZWZpbmVkX2RlZmF1bHQocG9zaXRpb25zKSA/IHBvc2l0aW9ucy5sZW5ndGggOiAwOwogICAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IGRlZmluZWRfZGVmYXVsdChob2xlcykgPyBob2xlcy5sZW5ndGggOiAwOwogICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChwb3NpdGlvbnMpKSB7CiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uc0xlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zTGVuZ3RoOyArK2ksIHN0YXJ0aW5nSW5kZXggKz0gQ2FydGVzaWFuWC5wYWNrZWRMZW5ndGgpIHsKICAgICAgICAgICAgICBDYXJ0ZXNpYW5YLnBhY2socG9zaXRpb25zW2ldLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoaG9sZXMpKSB7CiAgICAgICAgICAgIGNvbnN0IGhvbGVzTGVuZ3RoID0gaG9sZXMubGVuZ3RoOwogICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGhvbGVzTGVuZ3RoOyArK2opIHsKICAgICAgICAgICAgICBzdGFjay5wdXNoKGhvbGVzW2pdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RhcnRpbmdJbmRleDsKICAgICAgfTsKICAgICAgUG9seWdvbkdlb21ldHJ5TGlicmFyeS51bnBhY2tQb2x5Z29uSGllcmFyY2h5ID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIENhcnRlc2lhblgpIHsKICAgICAgICBjb25zdCBwb3NpdGlvbnNMZW5ndGggPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IGhvbGVzTGVuZ3RoID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgQXJyYXkocG9zaXRpb25zTGVuZ3RoKTsKICAgICAgICBjb25zdCBob2xlcyA9IGhvbGVzTGVuZ3RoID4gMCA/IG5ldyBBcnJheShob2xlc0xlbmd0aCkgOiB2b2lkIDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnNMZW5ndGg7ICsraSwgc3RhcnRpbmdJbmRleCArPSBDYXJ0ZXNpYW5YLnBhY2tlZExlbmd0aCkgewogICAgICAgICAgcG9zaXRpb25zW2ldID0gQ2FydGVzaWFuWC51bnBhY2soYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGhvbGVzTGVuZ3RoOyArK2opIHsKICAgICAgICAgIGhvbGVzW2pdID0gUG9seWdvbkdlb21ldHJ5TGlicmFyeS51bnBhY2tQb2x5Z29uSGllcmFyY2h5KAogICAgICAgICAgICBhcnJheSwKICAgICAgICAgICAgc3RhcnRpbmdJbmRleCwKICAgICAgICAgICAgQ2FydGVzaWFuWAogICAgICAgICAgKTsKICAgICAgICAgIHN0YXJ0aW5nSW5kZXggPSBob2xlc1tqXS5zdGFydGluZ0luZGV4OwogICAgICAgICAgZGVsZXRlIGhvbGVzW2pdLnN0YXJ0aW5nSW5kZXg7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICBwb3NpdGlvbnMsCiAgICAgICAgICBob2xlcywKICAgICAgICAgIHN0YXJ0aW5nSW5kZXgKICAgICAgICB9OwogICAgICB9OwogICAgICBkaXN0YW5jZTJEU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKTsKICAgICAgZGlzdGFuY2VTY3JhdGNoNCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgUG9seWdvbkdlb21ldHJ5TGlicmFyeS5zdWJkaXZpZGVMaW5lQ291bnQgPSBmdW5jdGlvbihwMCwgcDEsIG1pbkRpc3RhbmNlKSB7CiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZGlzdGFuY2UocDAsIHAxKTsKICAgICAgICBjb25zdCBuID0gZGlzdGFuY2UgLyBtaW5EaXN0YW5jZTsKICAgICAgICBjb25zdCBjb3VudERpdmlkZSA9IE1hdGgubWF4KDAsIE1hdGguY2VpbChNYXRoX2RlZmF1bHQubG9nMihuKSkpOwogICAgICAgIHJldHVybiBNYXRoLnBvdygyLCBjb3VudERpdmlkZSk7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWMwID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWMxID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWMyMiA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydGVzaWFuMCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFJodW1iTGluZSA9IG5ldyBFbGxpcHNvaWRSaHVtYkxpbmVfZGVmYXVsdCgpOwogICAgICBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5LnN1YmRpdmlkZVJodW1iTGluZUNvdW50ID0gZnVuY3Rpb24oZWxsaXBzb2lkLCBwMCwgcDEsIG1pbkRpc3RhbmNlKSB7CiAgICAgICAgY29uc3QgYzAgPSBlbGxpcHNvaWQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMocDAsIHNjcmF0Y2hDYXJ0b2dyYXBoaWMwKTsKICAgICAgICBjb25zdCBjMSA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhwMSwgc2NyYXRjaENhcnRvZ3JhcGhpYzEpOwogICAgICAgIGNvbnN0IHJodW1iID0gbmV3IEVsbGlwc29pZFJodW1iTGluZV9kZWZhdWx0KGMwLCBjMSwgZWxsaXBzb2lkKTsKICAgICAgICBjb25zdCBuID0gcmh1bWIuc3VyZmFjZURpc3RhbmNlIC8gbWluRGlzdGFuY2U7CiAgICAgICAgY29uc3QgY291bnREaXZpZGUgPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoTWF0aF9kZWZhdWx0LmxvZzIobikpKTsKICAgICAgICByZXR1cm4gTWF0aC5wb3coMiwgY291bnREaXZpZGUpOwogICAgICB9OwogICAgICBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5LnN1YmRpdmlkZVRleGNvb3JkTGluZSA9IGZ1bmN0aW9uKHQwLCB0MSwgcDAsIHAxLCBtaW5EaXN0YW5jZSwgcmVzdWx0KSB7CiAgICAgICAgY29uc3Qgc3ViZGl2aXNpb25zID0gUG9seWdvbkdlb21ldHJ5TGlicmFyeS5zdWJkaXZpZGVMaW5lQ291bnQoCiAgICAgICAgICBwMCwKICAgICAgICAgIHAxLAogICAgICAgICAgbWluRGlzdGFuY2UKICAgICAgICApOwogICAgICAgIGNvbnN0IGxlbmd0aDJEID0gQ2FydGVzaWFuMl9kZWZhdWx0LmRpc3RhbmNlKHQwLCB0MSk7CiAgICAgICAgY29uc3QgZGlzdGFuY2VCZXR3ZWVuQ29vcmRzID0gbGVuZ3RoMkQgLyBzdWJkaXZpc2lvbnM7CiAgICAgICAgY29uc3QgdGV4Y29vcmRzID0gcmVzdWx0OwogICAgICAgIHRleGNvb3Jkcy5sZW5ndGggPSBzdWJkaXZpc2lvbnMgKiAyOwogICAgICAgIGxldCBpbmRleCA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJkaXZpc2lvbnM7IGkrKykgewogICAgICAgICAgY29uc3QgdCA9IGdldFBvaW50QXREaXN0YW5jZTJEKHQwLCB0MSwgaSAqIGRpc3RhbmNlQmV0d2VlbkNvb3JkcywgbGVuZ3RoMkQpOwogICAgICAgICAgdGV4Y29vcmRzW2luZGV4KytdID0gdFswXTsKICAgICAgICAgIHRleGNvb3Jkc1tpbmRleCsrXSA9IHRbMV07CiAgICAgICAgfQogICAgICAgIHJldHVybiB0ZXhjb29yZHM7CiAgICAgIH07CiAgICAgIFBvbHlnb25HZW9tZXRyeUxpYnJhcnkuc3ViZGl2aWRlTGluZSA9IGZ1bmN0aW9uKHAwLCBwMSwgbWluRGlzdGFuY2UsIHJlc3VsdCkgewogICAgICAgIGNvbnN0IG51bVZlcnRpY2VzID0gUG9seWdvbkdlb21ldHJ5TGlicmFyeS5zdWJkaXZpZGVMaW5lQ291bnQoCiAgICAgICAgICBwMCwKICAgICAgICAgIHAxLAogICAgICAgICAgbWluRGlzdGFuY2UKICAgICAgICApOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IENhcnRlc2lhbjNfZGVmYXVsdC5kaXN0YW5jZShwMCwgcDEpOwogICAgICAgIGNvbnN0IGRpc3RhbmNlQmV0d2VlblZlcnRpY2VzID0gbGVuZ3RoIC8gbnVtVmVydGljZXM7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gW107CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHJlc3VsdDsKICAgICAgICBwb3NpdGlvbnMubGVuZ3RoID0gbnVtVmVydGljZXMgKiAzOwogICAgICAgIGxldCBpbmRleCA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1WZXJ0aWNlczsgaSsrKSB7CiAgICAgICAgICBjb25zdCBwID0gZ2V0UG9pbnRBdERpc3RhbmNlKHAwLCBwMSwgaSAqIGRpc3RhbmNlQmV0d2VlblZlcnRpY2VzLCBsZW5ndGgpOwogICAgICAgICAgcG9zaXRpb25zW2luZGV4KytdID0gcFswXTsKICAgICAgICAgIHBvc2l0aW9uc1tpbmRleCsrXSA9IHBbMV07CiAgICAgICAgICBwb3NpdGlvbnNbaW5kZXgrK10gPSBwWzJdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcG9zaXRpb25zOwogICAgICB9OwogICAgICBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5LnN1YmRpdmlkZVRleGNvb3JkUmh1bWJMaW5lID0gZnVuY3Rpb24odDAsIHQxLCBlbGxpcHNvaWQsIHAwLCBwMSwgbWluRGlzdGFuY2UsIHJlc3VsdCkgewogICAgICAgIGNvbnN0IGMwID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHAwLCBzY3JhdGNoQ2FydG9ncmFwaGljMCk7CiAgICAgICAgY29uc3QgYzEgPSBlbGxpcHNvaWQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMocDEsIHNjcmF0Y2hDYXJ0b2dyYXBoaWMxKTsKICAgICAgICBzY3JhdGNoUmh1bWJMaW5lLnNldEVuZFBvaW50cyhjMCwgYzEpOwogICAgICAgIGNvbnN0IG4gPSBzY3JhdGNoUmh1bWJMaW5lLnN1cmZhY2VEaXN0YW5jZSAvIG1pbkRpc3RhbmNlOwogICAgICAgIGNvbnN0IGNvdW50RGl2aWRlID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKE1hdGhfZGVmYXVsdC5sb2cyKG4pKSk7CiAgICAgICAgY29uc3Qgc3ViZGl2aXNpb25zID0gTWF0aC5wb3coMiwgY291bnREaXZpZGUpOwogICAgICAgIGNvbnN0IGxlbmd0aDJEID0gQ2FydGVzaWFuMl9kZWZhdWx0LmRpc3RhbmNlKHQwLCB0MSk7CiAgICAgICAgY29uc3QgZGlzdGFuY2VCZXR3ZWVuQ29vcmRzID0gbGVuZ3RoMkQgLyBzdWJkaXZpc2lvbnM7CiAgICAgICAgY29uc3QgdGV4Y29vcmRzID0gcmVzdWx0OwogICAgICAgIHRleGNvb3Jkcy5sZW5ndGggPSBzdWJkaXZpc2lvbnMgKiAyOwogICAgICAgIGxldCBpbmRleCA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJkaXZpc2lvbnM7IGkrKykgewogICAgICAgICAgY29uc3QgdCA9IGdldFBvaW50QXREaXN0YW5jZTJEKHQwLCB0MSwgaSAqIGRpc3RhbmNlQmV0d2VlbkNvb3JkcywgbGVuZ3RoMkQpOwogICAgICAgICAgdGV4Y29vcmRzW2luZGV4KytdID0gdFswXTsKICAgICAgICAgIHRleGNvb3Jkc1tpbmRleCsrXSA9IHRbMV07CiAgICAgICAgfQogICAgICAgIHJldHVybiB0ZXhjb29yZHM7CiAgICAgIH07CiAgICAgIFBvbHlnb25HZW9tZXRyeUxpYnJhcnkuc3ViZGl2aWRlUmh1bWJMaW5lID0gZnVuY3Rpb24oZWxsaXBzb2lkLCBwMCwgcDEsIG1pbkRpc3RhbmNlLCByZXN1bHQpIHsKICAgICAgICBjb25zdCBjMCA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhwMCwgc2NyYXRjaENhcnRvZ3JhcGhpYzApOwogICAgICAgIGNvbnN0IGMxID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHAxLCBzY3JhdGNoQ2FydG9ncmFwaGljMSk7CiAgICAgICAgY29uc3Qgcmh1bWIgPSBuZXcgRWxsaXBzb2lkUmh1bWJMaW5lX2RlZmF1bHQoYzAsIGMxLCBlbGxpcHNvaWQpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IFtdOwogICAgICAgIH0KICAgICAgICBpZiAocmh1bWIuc3VyZmFjZURpc3RhbmNlIDw9IG1pbkRpc3RhbmNlKSB7CiAgICAgICAgICByZXN1bHQubGVuZ3RoID0gMzsKICAgICAgICAgIHJlc3VsdFswXSA9IHAwLng7CiAgICAgICAgICByZXN1bHRbMV0gPSBwMC55OwogICAgICAgICAgcmVzdWx0WzJdID0gcDAuejsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG4gPSByaHVtYi5zdXJmYWNlRGlzdGFuY2UgLyBtaW5EaXN0YW5jZTsKICAgICAgICBjb25zdCBjb3VudERpdmlkZSA9IE1hdGgubWF4KDAsIE1hdGguY2VpbChNYXRoX2RlZmF1bHQubG9nMihuKSkpOwogICAgICAgIGNvbnN0IG51bVZlcnRpY2VzID0gTWF0aC5wb3coMiwgY291bnREaXZpZGUpOwogICAgICAgIGNvbnN0IGRpc3RhbmNlQmV0d2VlblZlcnRpY2VzID0gcmh1bWIuc3VyZmFjZURpc3RhbmNlIC8gbnVtVmVydGljZXM7CiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gcmVzdWx0OwogICAgICAgIHBvc2l0aW9ucy5sZW5ndGggPSBudW1WZXJ0aWNlcyAqIDM7CiAgICAgICAgbGV0IGluZGV4ID0gMDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVZlcnRpY2VzOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGMgPSByaHVtYi5pbnRlcnBvbGF0ZVVzaW5nU3VyZmFjZURpc3RhbmNlKAogICAgICAgICAgICBpICogZGlzdGFuY2VCZXR3ZWVuVmVydGljZXMsCiAgICAgICAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWMyMgogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IHAgPSBlbGxpcHNvaWQuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oYywgc2NyYXRjaENhcnRlc2lhbjApOwogICAgICAgICAgcG9zaXRpb25zW2luZGV4KytdID0gcC54OwogICAgICAgICAgcG9zaXRpb25zW2luZGV4KytdID0gcC55OwogICAgICAgICAgcG9zaXRpb25zW2luZGV4KytdID0gcC56OwogICAgICAgIH0KICAgICAgICByZXR1cm4gcG9zaXRpb25zOwogICAgICB9OwogICAgICBzY2FsZVRvR2VvZGV0aWNIZWlnaHROMSA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NhbGVUb0dlb2RldGljSGVpZ2h0TjIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjYWxlVG9HZW9kZXRpY0hlaWdodFAxID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY2FsZVRvR2VvZGV0aWNIZWlnaHRQMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgUG9seWdvbkdlb21ldHJ5TGlicmFyeS5zY2FsZVRvR2VvZGV0aWNIZWlnaHRFeHRydWRlZCA9IGZ1bmN0aW9uKGdlb21ldHJ5LCBtYXhIZWlnaHQsIG1pbkhlaWdodCwgZWxsaXBzb2lkLCBwZXJQb3NpdGlvbkhlaWdodCkgewogICAgICAgIGVsbGlwc29pZCA9IGVsbGlwc29pZCA/PyBFbGxpcHNvaWRfZGVmYXVsdC5kZWZhdWx0OwogICAgICAgIGNvbnN0IG4xID0gc2NhbGVUb0dlb2RldGljSGVpZ2h0TjE7CiAgICAgICAgbGV0IG4yID0gc2NhbGVUb0dlb2RldGljSGVpZ2h0TjI7CiAgICAgICAgY29uc3QgcCA9IHNjYWxlVG9HZW9kZXRpY0hlaWdodFAxOwogICAgICAgIGxldCBwMiA9IHNjYWxlVG9HZW9kZXRpY0hlaWdodFAyOwogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoZ2VvbWV0cnkpICYmIGRlZmluZWRfZGVmYXVsdChnZW9tZXRyeS5hdHRyaWJ1dGVzKSAmJiBkZWZpbmVkX2RlZmF1bHQoZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbikpIHsKICAgICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzOwogICAgICAgICAgY29uc3QgbGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aCAvIDI7CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAzKSB7CiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkocG9zaXRpb25zLCBpLCBwKTsKICAgICAgICAgICAgZWxsaXBzb2lkLmdlb2RldGljU3VyZmFjZU5vcm1hbChwLCBuMSk7CiAgICAgICAgICAgIHAyID0gZWxsaXBzb2lkLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UocCwgcDIpOwogICAgICAgICAgICBuMiA9IENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKG4xLCBtaW5IZWlnaHQsIG4yKTsKICAgICAgICAgICAgbjIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHAyLCBuMiwgbjIpOwogICAgICAgICAgICBwb3NpdGlvbnNbaSArIGxlbmd0aF0gPSBuMi54OwogICAgICAgICAgICBwb3NpdGlvbnNbaSArIDEgKyBsZW5ndGhdID0gbjIueTsKICAgICAgICAgICAgcG9zaXRpb25zW2kgKyAyICsgbGVuZ3RoXSA9IG4yLno7CiAgICAgICAgICAgIGlmIChwZXJQb3NpdGlvbkhlaWdodCkgewogICAgICAgICAgICAgIHAyID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKHAsIHAyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuMiA9IENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKG4xLCBtYXhIZWlnaHQsIG4yKTsKICAgICAgICAgICAgbjIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHAyLCBuMiwgbjIpOwogICAgICAgICAgICBwb3NpdGlvbnNbaV0gPSBuMi54OwogICAgICAgICAgICBwb3NpdGlvbnNbaSArIDFdID0gbjIueTsKICAgICAgICAgICAgcG9zaXRpb25zW2kgKyAyXSA9IG4yLno7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBnZW9tZXRyeTsKICAgICAgfTsKICAgICAgUG9seWdvbkdlb21ldHJ5TGlicmFyeS5wb2x5Z29uT3V0bGluZXNGcm9tSGllcmFyY2h5ID0gZnVuY3Rpb24ocG9seWdvbkhpZXJhcmNoeSwgc2NhbGVUb0VsbGlwc29pZFN1cmZhY2UsIGVsbGlwc29pZCkgewogICAgICAgIGNvbnN0IHBvbHlnb25zID0gW107CiAgICAgICAgY29uc3QgcXVldWUgPSBuZXcgUXVldWVfZGVmYXVsdCgpOwogICAgICAgIHF1ZXVlLmVucXVldWUocG9seWdvbkhpZXJhcmNoeSk7CiAgICAgICAgbGV0IGk7CiAgICAgICAgbGV0IGo7CiAgICAgICAgbGV0IGxlbmd0aDsKICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICBjb25zdCBvdXRlck5vZGUgPSBxdWV1ZS5kZXF1ZXVlKCk7CiAgICAgICAgICBsZXQgb3V0ZXJSaW5nID0gb3V0ZXJOb2RlLnBvc2l0aW9uczsKICAgICAgICAgIGlmIChzY2FsZVRvRWxsaXBzb2lkU3VyZmFjZSkgewogICAgICAgICAgICBsZW5ndGggPSBvdXRlclJpbmcubGVuZ3RoOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBlbGxpcHNvaWQuc2NhbGVUb0dlb2RldGljU3VyZmFjZShvdXRlclJpbmdbaV0sIG91dGVyUmluZ1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG91dGVyUmluZyA9IGFycmF5UmVtb3ZlRHVwbGljYXRlc19kZWZhdWx0KAogICAgICAgICAgICBvdXRlclJpbmcsCiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5lcXVhbHNFcHNpbG9uLAogICAgICAgICAgICB0cnVlCiAgICAgICAgICApOwogICAgICAgICAgaWYgKG91dGVyUmluZy5sZW5ndGggPCAzKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgbnVtQ2hpbGRyZW4gPSBvdXRlck5vZGUuaG9sZXMgPyBvdXRlck5vZGUuaG9sZXMubGVuZ3RoIDogMDsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1DaGlsZHJlbjsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IGhvbGUgPSBvdXRlck5vZGUuaG9sZXNbaV07CiAgICAgICAgICAgIGxldCBob2xlUG9zaXRpb25zID0gaG9sZS5wb3NpdGlvbnM7CiAgICAgICAgICAgIGlmIChzY2FsZVRvRWxsaXBzb2lkU3VyZmFjZSkgewogICAgICAgICAgICAgIGxlbmd0aCA9IGhvbGVQb3NpdGlvbnMubGVuZ3RoOwogICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGg7ICsraikgewogICAgICAgICAgICAgICAgZWxsaXBzb2lkLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoaG9sZVBvc2l0aW9uc1tqXSwgaG9sZVBvc2l0aW9uc1tqXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGhvbGVQb3NpdGlvbnMgPSBhcnJheVJlbW92ZUR1cGxpY2F0ZXNfZGVmYXVsdCgKICAgICAgICAgICAgICBob2xlUG9zaXRpb25zLAogICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5lcXVhbHNFcHNpbG9uLAogICAgICAgICAgICAgIHRydWUKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKGhvbGVQb3NpdGlvbnMubGVuZ3RoIDwgMykgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBvbHlnb25zLnB1c2goaG9sZVBvc2l0aW9ucyk7CiAgICAgICAgICAgIGxldCBudW1HcmFuZGNoaWxkcmVuID0gMDsKICAgICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChob2xlLmhvbGVzKSkgewogICAgICAgICAgICAgIG51bUdyYW5kY2hpbGRyZW4gPSBob2xlLmhvbGVzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtR3JhbmRjaGlsZHJlbjsgaisrKSB7CiAgICAgICAgICAgICAgcXVldWUuZW5xdWV1ZShob2xlLmhvbGVzW2pdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcG9seWdvbnMucHVzaChvdXRlclJpbmcpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcG9seWdvbnM7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hSaHVtYkludGVyc2VjdGlvbiA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydG9ncmFwaGljMyA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5LnNwbGl0UG9seWdvbnNPbkVxdWF0b3IgPSBmdW5jdGlvbihvdXRlclJpbmdzLCBlbGxpcHNvaWQsIGFyY1R5cGUsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IFtdOwogICAgICAgIH0KICAgICAgICByZXN1bHQuc3BsaWNlKDAsIDAsIC4uLm91dGVyUmluZ3MpOwogICAgICAgIHJlc3VsdC5sZW5ndGggPSBvdXRlclJpbmdzLmxlbmd0aDsKICAgICAgICBsZXQgY3VycmVudFBvbHlnb24gPSAwOwogICAgICAgIHdoaWxlIChjdXJyZW50UG9seWdvbiA8IHJlc3VsdC5sZW5ndGgpIHsKICAgICAgICAgIGNvbnN0IG91dGVyUmluZyA9IHJlc3VsdFtjdXJyZW50UG9seWdvbl07CiAgICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBvdXRlclJpbmcuc2xpY2UoKTsKICAgICAgICAgIGlmIChvdXRlclJpbmcubGVuZ3RoIDwgMykgewogICAgICAgICAgICByZXN1bHRbY3VycmVudFBvbHlnb25dID0gcG9zaXRpb25zOwogICAgICAgICAgICArK2N1cnJlbnRQb2x5Z29uOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGVkZ2VzT25QbGFuZSA9IGNvbXB1dGVFZGdlc09uUGxhbmUocG9zaXRpb25zLCBlbGxpcHNvaWQsIGFyY1R5cGUpOwogICAgICAgICAgaWYgKHBvc2l0aW9ucy5sZW5ndGggPT09IG91dGVyUmluZy5sZW5ndGggfHwgZWRnZXNPblBsYW5lLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgIHJlc3VsdFtjdXJyZW50UG9seWdvbl0gPSBwb3NpdGlvbnM7CiAgICAgICAgICAgICsrY3VycmVudFBvbHlnb247CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgZWRnZXNPblBsYW5lLnNvcnQoKGEzLCBiKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBhMy50aGV0YSAtIGIudGhldGE7CiAgICAgICAgICB9KTsKICAgICAgICAgIGNvbnN0IG5vcnRoID0gcG9zaXRpb25zWzBdLnogPj0gMDsKICAgICAgICAgIGN1cnJlbnRQb2x5Z29uID0gd2lyZVBvbHlnb24oCiAgICAgICAgICAgIHJlc3VsdCwKICAgICAgICAgICAgY3VycmVudFBvbHlnb24sCiAgICAgICAgICAgIHBvc2l0aW9ucywKICAgICAgICAgICAgZWRnZXNPblBsYW5lLAogICAgICAgICAgICAxLAogICAgICAgICAgICAwLAogICAgICAgICAgICBub3J0aAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgUG9seWdvbkdlb21ldHJ5TGlicmFyeS5wb2x5Z29uc0Zyb21IaWVyYXJjaHkgPSBmdW5jdGlvbihwb2x5Z29uSGllcmFyY2h5LCBrZWVwRHVwbGljYXRlcywgcHJvamVjdFBvaW50c1RvMkQsIHNjYWxlVG9FbGxpcHNvaWRTdXJmYWNlLCBlbGxpcHNvaWQsIHNwbGl0UG9seWdvbnMpIHsKICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSBbXTsKICAgICAgICBjb25zdCBwb2x5Z29ucyA9IFtdOwogICAgICAgIGNvbnN0IHF1ZXVlID0gbmV3IFF1ZXVlX2RlZmF1bHQoKTsKICAgICAgICBxdWV1ZS5lbnF1ZXVlKHBvbHlnb25IaWVyYXJjaHkpOwogICAgICAgIGxldCBzcGxpdCA9IGRlZmluZWRfZGVmYXVsdChzcGxpdFBvbHlnb25zKTsKICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICBjb25zdCBvdXRlck5vZGUgPSBxdWV1ZS5kZXF1ZXVlKCk7CiAgICAgICAgICBsZXQgb3V0ZXJSaW5nID0gb3V0ZXJOb2RlLnBvc2l0aW9uczsKICAgICAgICAgIGNvbnN0IGhvbGVzID0gb3V0ZXJOb2RlLmhvbGVzOwogICAgICAgICAgbGV0IGk7CiAgICAgICAgICBsZXQgbGVuZ3RoOwogICAgICAgICAgaWYgKHNjYWxlVG9FbGxpcHNvaWRTdXJmYWNlKSB7CiAgICAgICAgICAgIGxlbmd0aCA9IG91dGVyUmluZy5sZW5ndGg7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGVsbGlwc29pZC5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKG91dGVyUmluZ1tpXSwgb3V0ZXJSaW5nW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCFrZWVwRHVwbGljYXRlcykgewogICAgICAgICAgICBvdXRlclJpbmcgPSBhcnJheVJlbW92ZUR1cGxpY2F0ZXNfZGVmYXVsdCgKICAgICAgICAgICAgICBvdXRlclJpbmcsCiAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24sCiAgICAgICAgICAgICAgdHJ1ZQogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG91dGVyUmluZy5sZW5ndGggPCAzKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgbGV0IHBvc2l0aW9uczJEID0gcHJvamVjdFBvaW50c1RvMkQob3V0ZXJSaW5nKTsKICAgICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHBvc2l0aW9uczJEKSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGhvbGVJbmRpY2VzID0gW107CiAgICAgICAgICBsZXQgb3JpZ2luYWxXaW5kaW5nT3JkZXIgPSBQb2x5Z29uUGlwZWxpbmVfZGVmYXVsdC5jb21wdXRlV2luZGluZ09yZGVyMkQocG9zaXRpb25zMkQpOwogICAgICAgICAgaWYgKG9yaWdpbmFsV2luZGluZ09yZGVyID09PSBXaW5kaW5nT3JkZXJfZGVmYXVsdC5DTE9DS1dJU0UpIHsKICAgICAgICAgICAgcG9zaXRpb25zMkQucmV2ZXJzZSgpOwogICAgICAgICAgICBvdXRlclJpbmcgPSBvdXRlclJpbmcuc2xpY2UoKS5yZXZlcnNlKCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3BsaXQpIHsKICAgICAgICAgICAgc3BsaXQgPSBmYWxzZTsKICAgICAgICAgICAgbGV0IHBvbHlnb25zMiA9IFtvdXRlclJpbmddOwogICAgICAgICAgICBwb2x5Z29uczIgPSBzcGxpdFBvbHlnb25zKHBvbHlnb25zMiwgcG9seWdvbnMyKTsKICAgICAgICAgICAgaWYgKHBvbHlnb25zMi5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgZm9yIChjb25zdCBwb3NpdGlvbnMyIG9mIHBvbHlnb25zMikgewogICAgICAgICAgICAgICAgcXVldWUuZW5xdWV1ZShuZXcgUG9seWdvbkhpZXJhcmNoeV9kZWZhdWx0KHBvc2l0aW9uczIsIGhvbGVzKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgcG9zaXRpb25zID0gb3V0ZXJSaW5nLnNsaWNlKCk7CiAgICAgICAgICBjb25zdCBudW1DaGlsZHJlbiA9IGRlZmluZWRfZGVmYXVsdChob2xlcykgPyBob2xlcy5sZW5ndGggOiAwOwogICAgICAgICAgY29uc3QgcG9seWdvbkhvbGVzID0gW107CiAgICAgICAgICBsZXQgajsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1DaGlsZHJlbjsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IGhvbGUgPSBob2xlc1tpXTsKICAgICAgICAgICAgbGV0IGhvbGVQb3NpdGlvbnMgPSBob2xlLnBvc2l0aW9uczsKICAgICAgICAgICAgaWYgKHNjYWxlVG9FbGxpcHNvaWRTdXJmYWNlKSB7CiAgICAgICAgICAgICAgbGVuZ3RoID0gaG9sZVBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbmd0aDsgKytqKSB7CiAgICAgICAgICAgICAgICBlbGxpcHNvaWQuc2NhbGVUb0dlb2RldGljU3VyZmFjZShob2xlUG9zaXRpb25zW2pdLCBob2xlUG9zaXRpb25zW2pdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFrZWVwRHVwbGljYXRlcykgewogICAgICAgICAgICAgIGhvbGVQb3NpdGlvbnMgPSBhcnJheVJlbW92ZUR1cGxpY2F0ZXNfZGVmYXVsdCgKICAgICAgICAgICAgICAgIGhvbGVQb3NpdGlvbnMsCiAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuZXF1YWxzRXBzaWxvbiwKICAgICAgICAgICAgICAgIHRydWUKICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChob2xlUG9zaXRpb25zLmxlbmd0aCA8IDMpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBob2xlUG9zaXRpb25zMkQgPSBwcm9qZWN0UG9pbnRzVG8yRChob2xlUG9zaXRpb25zKTsKICAgICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaG9sZVBvc2l0aW9uczJEKSkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9yaWdpbmFsV2luZGluZ09yZGVyID0gUG9seWdvblBpcGVsaW5lX2RlZmF1bHQuY29tcHV0ZVdpbmRpbmdPcmRlcjJEKGhvbGVQb3NpdGlvbnMyRCk7CiAgICAgICAgICAgIGlmIChvcmlnaW5hbFdpbmRpbmdPcmRlciA9PT0gV2luZGluZ09yZGVyX2RlZmF1bHQuQ0xPQ0tXSVNFKSB7CiAgICAgICAgICAgICAgaG9sZVBvc2l0aW9uczJELnJldmVyc2UoKTsKICAgICAgICAgICAgICBob2xlUG9zaXRpb25zID0gaG9sZVBvc2l0aW9ucy5zbGljZSgpLnJldmVyc2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwb2x5Z29uSG9sZXMucHVzaChob2xlUG9zaXRpb25zKTsKICAgICAgICAgICAgaG9sZUluZGljZXMucHVzaChwb3NpdGlvbnMubGVuZ3RoKTsKICAgICAgICAgICAgcG9zaXRpb25zID0gcG9zaXRpb25zLmNvbmNhdChob2xlUG9zaXRpb25zKTsKICAgICAgICAgICAgcG9zaXRpb25zMkQgPSBwb3NpdGlvbnMyRC5jb25jYXQoaG9sZVBvc2l0aW9uczJEKTsKICAgICAgICAgICAgbGV0IG51bUdyYW5kY2hpbGRyZW4gPSAwOwogICAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGhvbGUuaG9sZXMpKSB7CiAgICAgICAgICAgICAgbnVtR3JhbmRjaGlsZHJlbiA9IGhvbGUuaG9sZXMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1HcmFuZGNoaWxkcmVuOyBqKyspIHsKICAgICAgICAgICAgICBxdWV1ZS5lbnF1ZXVlKGhvbGUuaG9sZXNbal0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBoaWVyYXJjaHkucHVzaCh7CiAgICAgICAgICAgIG91dGVyUmluZywKICAgICAgICAgICAgaG9sZXM6IHBvbHlnb25Ib2xlcwogICAgICAgICAgfSk7CiAgICAgICAgICBwb2x5Z29ucy5wdXNoKHsKICAgICAgICAgICAgcG9zaXRpb25zLAogICAgICAgICAgICBwb3NpdGlvbnMyRCwKICAgICAgICAgICAgaG9sZXM6IGhvbGVJbmRpY2VzCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGhpZXJhcmNoeSwKICAgICAgICAgIHBvbHlnb25zCiAgICAgICAgfTsKICAgICAgfTsKICAgICAgY29tcHV0ZUJvdW5kaW5nUmVjdGFuZ2xlQ2FydGVzaWFuMiA9IG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKTsKICAgICAgY29tcHV0ZUJvdW5kaW5nUmVjdGFuZ2xlQ2FydGVzaWFuMyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgY29tcHV0ZUJvdW5kaW5nUmVjdGFuZ2xlUXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uX2RlZmF1bHQoKTsKICAgICAgY29tcHV0ZUJvdW5kaW5nUmVjdGFuZ2xlTWF0cml4MyA9IG5ldyBNYXRyaXgzX2RlZmF1bHQoKTsKICAgICAgUG9seWdvbkdlb21ldHJ5TGlicmFyeS5jb21wdXRlQm91bmRpbmdSZWN0YW5nbGUgPSBmdW5jdGlvbihwbGFuZU5vcm1hbCwgcHJvamVjdFBvaW50VG8yRCwgcG9zaXRpb25zLCBhbmdsZSwgcmVzdWx0KSB7CiAgICAgICAgY29uc3Qgcm90YXRpb24gPSBRdWF0ZXJuaW9uX2RlZmF1bHQuZnJvbUF4aXNBbmdsZSgKICAgICAgICAgIHBsYW5lTm9ybWFsLAogICAgICAgICAgYW5nbGUsCiAgICAgICAgICBjb21wdXRlQm91bmRpbmdSZWN0YW5nbGVRdWF0ZXJuaW9uCiAgICAgICAgKTsKICAgICAgICBjb25zdCB0ZXh0dXJlTWF0cml4ID0gTWF0cml4M19kZWZhdWx0LmZyb21RdWF0ZXJuaW9uKAogICAgICAgICAgcm90YXRpb24sCiAgICAgICAgICBjb21wdXRlQm91bmRpbmdSZWN0YW5nbGVNYXRyaXgzCiAgICAgICAgKTsKICAgICAgICBsZXQgbWluWCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgICBsZXQgbWF4WCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTsKICAgICAgICBsZXQgbWluWSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgICBsZXQgbWF4WSA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTsKICAgICAgICBjb25zdCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgIGNvbnN0IHAgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoCiAgICAgICAgICAgIHBvc2l0aW9uc1tpXSwKICAgICAgICAgICAgY29tcHV0ZUJvdW5kaW5nUmVjdGFuZ2xlQ2FydGVzaWFuMwogICAgICAgICAgKTsKICAgICAgICAgIE1hdHJpeDNfZGVmYXVsdC5tdWx0aXBseUJ5VmVjdG9yKHRleHR1cmVNYXRyaXgsIHAsIHApOwogICAgICAgICAgY29uc3Qgc3QgPSBwcm9qZWN0UG9pbnRUbzJEKHAsIGNvbXB1dGVCb3VuZGluZ1JlY3RhbmdsZUNhcnRlc2lhbjIpOwogICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChzdCkpIHsKICAgICAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIHN0LngpOwogICAgICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgc3QueCk7CiAgICAgICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBzdC55KTsKICAgICAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHN0LnkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXN1bHQueCA9IG1pblg7CiAgICAgICAgcmVzdWx0LnkgPSBtaW5ZOwogICAgICAgIHJlc3VsdC53aWR0aCA9IG1heFggLSBtaW5YOwogICAgICAgIHJlc3VsdC5oZWlnaHQgPSBtYXhZIC0gbWluWTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5LmNyZWF0ZUdlb21ldHJ5RnJvbVBvc2l0aW9ucyA9IGZ1bmN0aW9uKGVsbGlwc29pZCwgcG9seWdvbjIsIHRleHR1cmVDb29yZGluYXRlcywgZ3JhbnVsYXJpdHksIHBlclBvc2l0aW9uSGVpZ2h0LCB2ZXJ0ZXhGb3JtYXQsIGFyY1R5cGUpIHsKICAgICAgICBsZXQgaW5kaWNlcyA9IFBvbHlnb25QaXBlbGluZV9kZWZhdWx0LnRyaWFuZ3VsYXRlKHBvbHlnb24yLnBvc2l0aW9uczJELCBwb2x5Z29uMi5ob2xlcyk7CiAgICAgICAgaWYgKGluZGljZXMubGVuZ3RoIDwgMykgewogICAgICAgICAgaW5kaWNlcyA9IFswLCAxLCAyXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gcG9seWdvbjIucG9zaXRpb25zOwogICAgICAgIGNvbnN0IGhhc1RleGNvb3JkcyA9IGRlZmluZWRfZGVmYXVsdCh0ZXh0dXJlQ29vcmRpbmF0ZXMpOwogICAgICAgIGNvbnN0IHRleGNvb3JkcyA9IGhhc1RleGNvb3JkcyA/IHRleHR1cmVDb29yZGluYXRlcy5wb3NpdGlvbnMgOiB2b2lkIDA7CiAgICAgICAgaWYgKHBlclBvc2l0aW9uSGVpZ2h0KSB7CiAgICAgICAgICBjb25zdCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgICAgY29uc3QgZmxhdHRlbmVkUG9zaXRpb25zID0gbmV3IEFycmF5KGxlbmd0aCAqIDMpOwogICAgICAgICAgbGV0IGluZGV4ID0gMDsKICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgcCA9IHBvc2l0aW9uc1tpXTsKICAgICAgICAgICAgZmxhdHRlbmVkUG9zaXRpb25zW2luZGV4KytdID0gcC54OwogICAgICAgICAgICBmbGF0dGVuZWRQb3NpdGlvbnNbaW5kZXgrK10gPSBwLnk7CiAgICAgICAgICAgIGZsYXR0ZW5lZFBvc2l0aW9uc1tpbmRleCsrXSA9IHAuejsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGdlb21ldHJ5T3B0aW9ucyA9IHsKICAgICAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgICAgIHBvc2l0aW9uOiBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5ET1VCTEUsCiAgICAgICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgICAgICAgICAgdmFsdWVzOiBmbGF0dGVuZWRQb3NpdGlvbnMKICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9LAogICAgICAgICAgICBpbmRpY2VzLAogICAgICAgICAgICBwcmltaXRpdmVUeXBlOiBQcmltaXRpdmVUeXBlX2RlZmF1bHQuVFJJQU5HTEVTCiAgICAgICAgICB9OwogICAgICAgICAgaWYgKGhhc1RleGNvb3JkcykgewogICAgICAgICAgICBnZW9tZXRyeU9wdGlvbnMuYXR0cmlidXRlcy5zdCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5GTE9BVCwKICAgICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAyLAogICAgICAgICAgICAgIHZhbHVlczogQ2FydGVzaWFuMl9kZWZhdWx0LnBhY2tBcnJheSh0ZXhjb29yZHMpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cnlfZGVmYXVsdChnZW9tZXRyeU9wdGlvbnMpOwogICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5ub3JtYWwpIHsKICAgICAgICAgICAgcmV0dXJuIEdlb21ldHJ5UGlwZWxpbmVfZGVmYXVsdC5jb21wdXRlTm9ybWFsKGdlb21ldHJ5KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBnZW9tZXRyeTsKICAgICAgICB9CiAgICAgICAgaWYgKGFyY1R5cGUgPT09IEFyY1R5cGVfZGVmYXVsdC5HRU9ERVNJQykgewogICAgICAgICAgcmV0dXJuIFBvbHlnb25QaXBlbGluZV9kZWZhdWx0LmNvbXB1dGVTdWJkaXZpc2lvbigKICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICBwb3NpdGlvbnMsCiAgICAgICAgICAgIGluZGljZXMsCiAgICAgICAgICAgIHRleGNvb3JkcywKICAgICAgICAgICAgZ3JhbnVsYXJpdHkKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIGlmIChhcmNUeXBlID09PSBBcmNUeXBlX2RlZmF1bHQuUkhVTUIpIHsKICAgICAgICAgIHJldHVybiBQb2x5Z29uUGlwZWxpbmVfZGVmYXVsdC5jb21wdXRlUmh1bWJMaW5lU3ViZGl2aXNpb24oCiAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgcG9zaXRpb25zLAogICAgICAgICAgICBpbmRpY2VzLAogICAgICAgICAgICB0ZXhjb29yZHMsCiAgICAgICAgICAgIGdyYW51bGFyaXR5CiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgY29tcHV0ZVdhbGxUZXhjb29yZHNTdWJkaXZpZGVkID0gW107CiAgICAgIGNvbXB1dGVXYWxsSW5kaWNlc1N1YmRpdmlkZWQgPSBbXTsKICAgICAgcDFTY3JhdGNoMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgcDJTY3JhdGNoMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgUG9seWdvbkdlb21ldHJ5TGlicmFyeS5jb21wdXRlV2FsbEdlb21ldHJ5ID0gZnVuY3Rpb24ocG9zaXRpb25zLCB0ZXh0dXJlQ29vcmRpbmF0ZXMsIGVsbGlwc29pZCwgZ3JhbnVsYXJpdHksIHBlclBvc2l0aW9uSGVpZ2h0LCBhcmNUeXBlKSB7CiAgICAgICAgbGV0IGVkZ2VQb3NpdGlvbnM7CiAgICAgICAgbGV0IHRvcEVkZ2VMZW5ndGg7CiAgICAgICAgbGV0IGk7CiAgICAgICAgbGV0IHAxOwogICAgICAgIGxldCBwMjsKICAgICAgICBsZXQgdDE7CiAgICAgICAgbGV0IHQyOwogICAgICAgIGxldCBlZGdlVGV4Y29vcmRzOwogICAgICAgIGxldCB0b3BFZGdlVGV4Y29vcmRMZW5ndGg7CiAgICAgICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgbGV0IGluZGV4ID0gMDsKICAgICAgICBsZXQgdGV4dHVyZUluZGV4ID0gMDsKICAgICAgICBjb25zdCBoYXNUZXhjb29yZHMgPSBkZWZpbmVkX2RlZmF1bHQodGV4dHVyZUNvb3JkaW5hdGVzKTsKICAgICAgICBjb25zdCB0ZXhjb29yZHMgPSBoYXNUZXhjb29yZHMgPyB0ZXh0dXJlQ29vcmRpbmF0ZXMucG9zaXRpb25zIDogdm9pZCAwOwogICAgICAgIGlmICghcGVyUG9zaXRpb25IZWlnaHQpIHsKICAgICAgICAgIGNvbnN0IG1pbkRpc3RhbmNlID0gTWF0aF9kZWZhdWx0LmNob3JkTGVuZ3RoKAogICAgICAgICAgICBncmFudWxhcml0eSwKICAgICAgICAgICAgZWxsaXBzb2lkLm1heGltdW1SYWRpdXMKICAgICAgICAgICk7CiAgICAgICAgICBsZXQgbnVtVmVydGljZXMgPSAwOwogICAgICAgICAgaWYgKGFyY1R5cGUgPT09IEFyY1R5cGVfZGVmYXVsdC5HRU9ERVNJQykgewogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBudW1WZXJ0aWNlcyArPSBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5LnN1YmRpdmlkZUxpbmVDb3VudCgKICAgICAgICAgICAgICAgIHBvc2l0aW9uc1tpXSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uc1soaSArIDEpICUgbGVuZ3RoXSwKICAgICAgICAgICAgICAgIG1pbkRpc3RhbmNlCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChhcmNUeXBlID09PSBBcmNUeXBlX2RlZmF1bHQuUkhVTUIpIHsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbnVtVmVydGljZXMgKz0gUG9seWdvbkdlb21ldHJ5TGlicmFyeS5zdWJkaXZpZGVSaHVtYkxpbmVDb3VudCgKICAgICAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgICAgIHBvc2l0aW9uc1tpXSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uc1soaSArIDEpICUgbGVuZ3RoXSwKICAgICAgICAgICAgICAgIG1pbkRpc3RhbmNlCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdG9wRWRnZUxlbmd0aCA9IChudW1WZXJ0aWNlcyArIGxlbmd0aCkgKiAzOwogICAgICAgICAgZWRnZVBvc2l0aW9ucyA9IG5ldyBBcnJheSh0b3BFZGdlTGVuZ3RoICogMik7CiAgICAgICAgICBpZiAoaGFzVGV4Y29vcmRzKSB7CiAgICAgICAgICAgIHRvcEVkZ2VUZXhjb29yZExlbmd0aCA9IChudW1WZXJ0aWNlcyArIGxlbmd0aCkgKiAyOwogICAgICAgICAgICBlZGdlVGV4Y29vcmRzID0gbmV3IEFycmF5KHRvcEVkZ2VUZXhjb29yZExlbmd0aCAqIDIpOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHAxID0gcG9zaXRpb25zW2ldOwogICAgICAgICAgICBwMiA9IHBvc2l0aW9uc1soaSArIDEpICUgbGVuZ3RoXTsKICAgICAgICAgICAgbGV0IHRlbXBQb3NpdGlvbnM7CiAgICAgICAgICAgIGxldCB0ZW1wVGV4Y29vcmRzOwogICAgICAgICAgICBpZiAoaGFzVGV4Y29vcmRzKSB7CiAgICAgICAgICAgICAgdDEgPSB0ZXhjb29yZHNbaV07CiAgICAgICAgICAgICAgdDIgPSB0ZXhjb29yZHNbKGkgKyAxKSAlIGxlbmd0aF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFyY1R5cGUgPT09IEFyY1R5cGVfZGVmYXVsdC5HRU9ERVNJQykgewogICAgICAgICAgICAgIHRlbXBQb3NpdGlvbnMgPSBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5LnN1YmRpdmlkZUxpbmUoCiAgICAgICAgICAgICAgICBwMSwKICAgICAgICAgICAgICAgIHAyLAogICAgICAgICAgICAgICAgbWluRGlzdGFuY2UsCiAgICAgICAgICAgICAgICBjb21wdXRlV2FsbEluZGljZXNTdWJkaXZpZGVkCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICBpZiAoaGFzVGV4Y29vcmRzKSB7CiAgICAgICAgICAgICAgICB0ZW1wVGV4Y29vcmRzID0gUG9seWdvbkdlb21ldHJ5TGlicmFyeS5zdWJkaXZpZGVUZXhjb29yZExpbmUoCiAgICAgICAgICAgICAgICAgIHQxLAogICAgICAgICAgICAgICAgICB0MiwKICAgICAgICAgICAgICAgICAgcDEsCiAgICAgICAgICAgICAgICAgIHAyLAogICAgICAgICAgICAgICAgICBtaW5EaXN0YW5jZSwKICAgICAgICAgICAgICAgICAgY29tcHV0ZVdhbGxUZXhjb29yZHNTdWJkaXZpZGVkCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChhcmNUeXBlID09PSBBcmNUeXBlX2RlZmF1bHQuUkhVTUIpIHsKICAgICAgICAgICAgICB0ZW1wUG9zaXRpb25zID0gUG9seWdvbkdlb21ldHJ5TGlicmFyeS5zdWJkaXZpZGVSaHVtYkxpbmUoCiAgICAgICAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICAgICAgICBwMSwKICAgICAgICAgICAgICAgIHAyLAogICAgICAgICAgICAgICAgbWluRGlzdGFuY2UsCiAgICAgICAgICAgICAgICBjb21wdXRlV2FsbEluZGljZXNTdWJkaXZpZGVkCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICBpZiAoaGFzVGV4Y29vcmRzKSB7CiAgICAgICAgICAgICAgICB0ZW1wVGV4Y29vcmRzID0gUG9seWdvbkdlb21ldHJ5TGlicmFyeS5zdWJkaXZpZGVUZXhjb29yZFJodW1iTGluZSgKICAgICAgICAgICAgICAgICAgdDEsCiAgICAgICAgICAgICAgICAgIHQyLAogICAgICAgICAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICAgICAgICAgIHAxLAogICAgICAgICAgICAgICAgICBwMiwKICAgICAgICAgICAgICAgICAgbWluRGlzdGFuY2UsCiAgICAgICAgICAgICAgICAgIGNvbXB1dGVXYWxsVGV4Y29vcmRzU3ViZGl2aWRlZAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgdGVtcFBvc2l0aW9uc0xlbmd0aCA9IHRlbXBQb3NpdGlvbnMubGVuZ3RoOwogICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRlbXBQb3NpdGlvbnNMZW5ndGg7ICsraiwgKytpbmRleCkgewogICAgICAgICAgICAgIGVkZ2VQb3NpdGlvbnNbaW5kZXhdID0gdGVtcFBvc2l0aW9uc1tqXTsKICAgICAgICAgICAgICBlZGdlUG9zaXRpb25zW2luZGV4ICsgdG9wRWRnZUxlbmd0aF0gPSB0ZW1wUG9zaXRpb25zW2pdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVkZ2VQb3NpdGlvbnNbaW5kZXhdID0gcDIueDsKICAgICAgICAgICAgZWRnZVBvc2l0aW9uc1tpbmRleCArIHRvcEVkZ2VMZW5ndGhdID0gcDIueDsKICAgICAgICAgICAgKytpbmRleDsKICAgICAgICAgICAgZWRnZVBvc2l0aW9uc1tpbmRleF0gPSBwMi55OwogICAgICAgICAgICBlZGdlUG9zaXRpb25zW2luZGV4ICsgdG9wRWRnZUxlbmd0aF0gPSBwMi55OwogICAgICAgICAgICArK2luZGV4OwogICAgICAgICAgICBlZGdlUG9zaXRpb25zW2luZGV4XSA9IHAyLno7CiAgICAgICAgICAgIGVkZ2VQb3NpdGlvbnNbaW5kZXggKyB0b3BFZGdlTGVuZ3RoXSA9IHAyLno7CiAgICAgICAgICAgICsraW5kZXg7CiAgICAgICAgICAgIGlmIChoYXNUZXhjb29yZHMpIHsKICAgICAgICAgICAgICBjb25zdCB0ZW1wVGV4Y29vcmRzTGVuZ3RoID0gdGVtcFRleGNvb3Jkcy5sZW5ndGg7CiAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB0ZW1wVGV4Y29vcmRzTGVuZ3RoOyArK2ssICsrdGV4dHVyZUluZGV4KSB7CiAgICAgICAgICAgICAgICBlZGdlVGV4Y29vcmRzW3RleHR1cmVJbmRleF0gPSB0ZW1wVGV4Y29vcmRzW2tdOwogICAgICAgICAgICAgICAgZWRnZVRleGNvb3Jkc1t0ZXh0dXJlSW5kZXggKyB0b3BFZGdlVGV4Y29vcmRMZW5ndGhdID0gdGVtcFRleGNvb3Jkc1trXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWRnZVRleGNvb3Jkc1t0ZXh0dXJlSW5kZXhdID0gdDIueDsKICAgICAgICAgICAgICBlZGdlVGV4Y29vcmRzW3RleHR1cmVJbmRleCArIHRvcEVkZ2VUZXhjb29yZExlbmd0aF0gPSB0Mi54OwogICAgICAgICAgICAgICsrdGV4dHVyZUluZGV4OwogICAgICAgICAgICAgIGVkZ2VUZXhjb29yZHNbdGV4dHVyZUluZGV4XSA9IHQyLnk7CiAgICAgICAgICAgICAgZWRnZVRleGNvb3Jkc1t0ZXh0dXJlSW5kZXggKyB0b3BFZGdlVGV4Y29vcmRMZW5ndGhdID0gdDIueTsKICAgICAgICAgICAgICArK3RleHR1cmVJbmRleDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0b3BFZGdlTGVuZ3RoID0gbGVuZ3RoICogMyAqIDI7CiAgICAgICAgICBlZGdlUG9zaXRpb25zID0gbmV3IEFycmF5KHRvcEVkZ2VMZW5ndGggKiAyKTsKICAgICAgICAgIGlmIChoYXNUZXhjb29yZHMpIHsKICAgICAgICAgICAgdG9wRWRnZVRleGNvb3JkTGVuZ3RoID0gbGVuZ3RoICogMiAqIDI7CiAgICAgICAgICAgIGVkZ2VUZXhjb29yZHMgPSBuZXcgQXJyYXkodG9wRWRnZVRleGNvb3JkTGVuZ3RoICogMik7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgcDEgPSBwb3NpdGlvbnNbaV07CiAgICAgICAgICAgIHAyID0gcG9zaXRpb25zWyhpICsgMSkgJSBsZW5ndGhdOwogICAgICAgICAgICBlZGdlUG9zaXRpb25zW2luZGV4XSA9IGVkZ2VQb3NpdGlvbnNbaW5kZXggKyB0b3BFZGdlTGVuZ3RoXSA9IHAxLng7CiAgICAgICAgICAgICsraW5kZXg7CiAgICAgICAgICAgIGVkZ2VQb3NpdGlvbnNbaW5kZXhdID0gZWRnZVBvc2l0aW9uc1tpbmRleCArIHRvcEVkZ2VMZW5ndGhdID0gcDEueTsKICAgICAgICAgICAgKytpbmRleDsKICAgICAgICAgICAgZWRnZVBvc2l0aW9uc1tpbmRleF0gPSBlZGdlUG9zaXRpb25zW2luZGV4ICsgdG9wRWRnZUxlbmd0aF0gPSBwMS56OwogICAgICAgICAgICArK2luZGV4OwogICAgICAgICAgICBlZGdlUG9zaXRpb25zW2luZGV4XSA9IGVkZ2VQb3NpdGlvbnNbaW5kZXggKyB0b3BFZGdlTGVuZ3RoXSA9IHAyLng7CiAgICAgICAgICAgICsraW5kZXg7CiAgICAgICAgICAgIGVkZ2VQb3NpdGlvbnNbaW5kZXhdID0gZWRnZVBvc2l0aW9uc1tpbmRleCArIHRvcEVkZ2VMZW5ndGhdID0gcDIueTsKICAgICAgICAgICAgKytpbmRleDsKICAgICAgICAgICAgZWRnZVBvc2l0aW9uc1tpbmRleF0gPSBlZGdlUG9zaXRpb25zW2luZGV4ICsgdG9wRWRnZUxlbmd0aF0gPSBwMi56OwogICAgICAgICAgICArK2luZGV4OwogICAgICAgICAgICBpZiAoaGFzVGV4Y29vcmRzKSB7CiAgICAgICAgICAgICAgdDEgPSB0ZXhjb29yZHNbaV07CiAgICAgICAgICAgICAgdDIgPSB0ZXhjb29yZHNbKGkgKyAxKSAlIGxlbmd0aF07CiAgICAgICAgICAgICAgZWRnZVRleGNvb3Jkc1t0ZXh0dXJlSW5kZXhdID0gZWRnZVRleGNvb3Jkc1t0ZXh0dXJlSW5kZXggKyB0b3BFZGdlVGV4Y29vcmRMZW5ndGhdID0gdDEueDsKICAgICAgICAgICAgICArK3RleHR1cmVJbmRleDsKICAgICAgICAgICAgICBlZGdlVGV4Y29vcmRzW3RleHR1cmVJbmRleF0gPSBlZGdlVGV4Y29vcmRzW3RleHR1cmVJbmRleCArIHRvcEVkZ2VUZXhjb29yZExlbmd0aF0gPSB0MS55OwogICAgICAgICAgICAgICsrdGV4dHVyZUluZGV4OwogICAgICAgICAgICAgIGVkZ2VUZXhjb29yZHNbdGV4dHVyZUluZGV4XSA9IGVkZ2VUZXhjb29yZHNbdGV4dHVyZUluZGV4ICsgdG9wRWRnZVRleGNvb3JkTGVuZ3RoXSA9IHQyLng7CiAgICAgICAgICAgICAgKyt0ZXh0dXJlSW5kZXg7CiAgICAgICAgICAgICAgZWRnZVRleGNvb3Jkc1t0ZXh0dXJlSW5kZXhdID0gZWRnZVRleGNvb3Jkc1t0ZXh0dXJlSW5kZXggKyB0b3BFZGdlVGV4Y29vcmRMZW5ndGhdID0gdDIueTsKICAgICAgICAgICAgICArK3RleHR1cmVJbmRleDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBlZGdlUG9zaXRpb25zLmxlbmd0aDsKICAgICAgICBjb25zdCBpbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkoCiAgICAgICAgICBsZW5ndGggLyAzLAogICAgICAgICAgbGVuZ3RoIC0gcG9zaXRpb25zLmxlbmd0aCAqIDYKICAgICAgICApOwogICAgICAgIGxldCBlZGdlSW5kZXggPSAwOwogICAgICAgIGxlbmd0aCAvPSA2OwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgVUwgPSBpOwogICAgICAgICAgY29uc3QgVVIgPSBVTCArIDE7CiAgICAgICAgICBjb25zdCBMTCA9IFVMICsgbGVuZ3RoOwogICAgICAgICAgY29uc3QgTFIgPSBMTCArIDE7CiAgICAgICAgICBwMSA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoZWRnZVBvc2l0aW9ucywgVUwgKiAzLCBwMVNjcmF0Y2gyKTsKICAgICAgICAgIHAyID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShlZGdlUG9zaXRpb25zLCBVUiAqIDMsIHAyU2NyYXRjaDIpOwogICAgICAgICAgaWYgKENhcnRlc2lhbjNfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgICBwMSwKICAgICAgICAgICAgcDIsCiAgICAgICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9OMTAsCiAgICAgICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9OMTAKICAgICAgICAgICkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpbmRpY2VzW2VkZ2VJbmRleCsrXSA9IFVMOwogICAgICAgICAgaW5kaWNlc1tlZGdlSW5kZXgrK10gPSBMTDsKICAgICAgICAgIGluZGljZXNbZWRnZUluZGV4KytdID0gVVI7CiAgICAgICAgICBpbmRpY2VzW2VkZ2VJbmRleCsrXSA9IFVSOwogICAgICAgICAgaW5kaWNlc1tlZGdlSW5kZXgrK10gPSBMTDsKICAgICAgICAgIGluZGljZXNbZWRnZUluZGV4KytdID0gTFI7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGdlb21ldHJ5T3B0aW9ucyA9IHsKICAgICAgICAgIGF0dHJpYnV0ZXM6IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZXNfZGVmYXVsdCh7CiAgICAgICAgICAgIHBvc2l0aW9uOiBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRE9VQkxFLAogICAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgICAgICAgdmFsdWVzOiBlZGdlUG9zaXRpb25zCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9KSwKICAgICAgICAgIGluZGljZXMsCiAgICAgICAgICBwcmltaXRpdmVUeXBlOiBQcmltaXRpdmVUeXBlX2RlZmF1bHQuVFJJQU5HTEVTCiAgICAgICAgfTsKICAgICAgICBpZiAoaGFzVGV4Y29vcmRzKSB7CiAgICAgICAgICBnZW9tZXRyeU9wdGlvbnMuYXR0cmlidXRlcy5zdCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDIsCiAgICAgICAgICAgIHZhbHVlczogZWRnZVRleGNvb3JkcwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IEdlb21ldHJ5X2RlZmF1bHQoZ2VvbWV0cnlPcHRpb25zKTsKICAgICAgICByZXR1cm4gZ2VvbWV0cnk7CiAgICAgIH07CiAgICAgIFBvbHlnb25HZW9tZXRyeUxpYnJhcnlfZGVmYXVsdCA9IFBvbHlnb25HZW9tZXRyeUxpYnJhcnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Db3BsYW5hclBvbHlnb25HZW9tZXRyeS5qcwogIGZ1bmN0aW9uIGNyZWF0ZUdlb21ldHJ5RnJvbVBvbHlnb24ocG9seWdvbjIsIHZlcnRleEZvcm1hdCwgYm91bmRpbmdSZWN0YW5nbGUsIHN0Um90YXRpb24sIGhhcmRjb2RlZFRleHR1cmVDb29yZGluYXRlcywgcHJvamVjdFBvaW50VG8yRCwgbm9ybWFsMiwgdGFuZ2VudCwgYml0YW5nZW50KSB7CiAgICBjb25zdCBwb3NpdGlvbnMgPSBwb2x5Z29uMi5wb3NpdGlvbnM7CiAgICBsZXQgaW5kaWNlcyA9IFBvbHlnb25QaXBlbGluZV9kZWZhdWx0LnRyaWFuZ3VsYXRlKHBvbHlnb24yLnBvc2l0aW9uczJELCBwb2x5Z29uMi5ob2xlcyk7CiAgICBpZiAoaW5kaWNlcy5sZW5ndGggPCAzKSB7CiAgICAgIGluZGljZXMgPSBbMCwgMSwgMl07CiAgICB9CiAgICBjb25zdCBuZXdJbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkoCiAgICAgIHBvc2l0aW9ucy5sZW5ndGgsCiAgICAgIGluZGljZXMubGVuZ3RoCiAgICApOwogICAgbmV3SW5kaWNlcy5zZXQoaW5kaWNlcyk7CiAgICBsZXQgdGV4dHVyZU1hdHJpeCA9IHRleHR1cmVNYXRyaXhTY3JhdGNoMjsKICAgIGlmIChzdFJvdGF0aW9uICE9PSAwKSB7CiAgICAgIGxldCByb3RhdGlvbiA9IFF1YXRlcm5pb25fZGVmYXVsdC5mcm9tQXhpc0FuZ2xlKAogICAgICAgIG5vcm1hbDIsCiAgICAgICAgc3RSb3RhdGlvbiwKICAgICAgICBxdWF0ZXJuaW9uU2NyYXRjaDIKICAgICAgKTsKICAgICAgdGV4dHVyZU1hdHJpeCA9IE1hdHJpeDNfZGVmYXVsdC5mcm9tUXVhdGVybmlvbihyb3RhdGlvbiwgdGV4dHVyZU1hdHJpeCk7CiAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQudGFuZ2VudCB8fCB2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgICAgcm90YXRpb24gPSBRdWF0ZXJuaW9uX2RlZmF1bHQuZnJvbUF4aXNBbmdsZSgKICAgICAgICAgIG5vcm1hbDIsCiAgICAgICAgICAtc3RSb3RhdGlvbiwKICAgICAgICAgIHF1YXRlcm5pb25TY3JhdGNoMgogICAgICAgICk7CiAgICAgICAgY29uc3QgdGFuZ2VudFJvdGF0aW9uID0gTWF0cml4M19kZWZhdWx0LmZyb21RdWF0ZXJuaW9uKAogICAgICAgICAgcm90YXRpb24sCiAgICAgICAgICB0YW5nZW50Um90YXRpb25TY3JhdGNoCiAgICAgICAgKTsKICAgICAgICB0YW5nZW50ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgICAgIE1hdHJpeDNfZGVmYXVsdC5tdWx0aXBseUJ5VmVjdG9yKHRhbmdlbnRSb3RhdGlvbiwgdGFuZ2VudCwgdGFuZ2VudCksCiAgICAgICAgICB0YW5nZW50CiAgICAgICAgKTsKICAgICAgICBpZiAodmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgewogICAgICAgICAgYml0YW5nZW50ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKG5vcm1hbDIsIHRhbmdlbnQsIGJpdGFuZ2VudCksCiAgICAgICAgICAgIGJpdGFuZ2VudAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRleHR1cmVNYXRyaXggPSBNYXRyaXgzX2RlZmF1bHQuY2xvbmUoTWF0cml4M19kZWZhdWx0LklERU5USVRZLCB0ZXh0dXJlTWF0cml4KTsKICAgIH0KICAgIGNvbnN0IHN0T3JpZ2luID0gdGV4dHVyZUNvb3JkaW5hdGVzT3JpZ2luOwogICAgaWYgKHZlcnRleEZvcm1hdC5zdCkgewogICAgICBzdE9yaWdpbi54ID0gYm91bmRpbmdSZWN0YW5nbGUueDsKICAgICAgc3RPcmlnaW4ueSA9IGJvdW5kaW5nUmVjdGFuZ2xlLnk7CiAgICB9CiAgICBjb25zdCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgY29uc3Qgc2l6ZSA9IGxlbmd0aCAqIDM7CiAgICBjb25zdCBmbGF0UG9zaXRpb25zID0gbmV3IEZsb2F0NjRBcnJheShzaXplKTsKICAgIGNvbnN0IG5vcm1hbHMgPSB2ZXJ0ZXhGb3JtYXQubm9ybWFsID8gbmV3IEZsb2F0MzJBcnJheShzaXplKSA6IHZvaWQgMDsKICAgIGNvbnN0IHRhbmdlbnRzID0gdmVydGV4Rm9ybWF0LnRhbmdlbnQgPyBuZXcgRmxvYXQzMkFycmF5KHNpemUpIDogdm9pZCAwOwogICAgY29uc3QgYml0YW5nZW50cyA9IHZlcnRleEZvcm1hdC5iaXRhbmdlbnQgPyBuZXcgRmxvYXQzMkFycmF5KHNpemUpIDogdm9pZCAwOwogICAgY29uc3QgdGV4dHVyZUNvb3JkaW5hdGVzID0gdmVydGV4Rm9ybWF0LnN0ID8gbmV3IEZsb2F0MzJBcnJheShsZW5ndGggKiAyKSA6IHZvaWQgMDsKICAgIGxldCBwb3NpdGlvbkluZGV4ID0gMDsKICAgIGxldCBub3JtYWxJbmRleCA9IDA7CiAgICBsZXQgYml0YW5nZW50SW5kZXggPSAwOwogICAgbGV0IHRhbmdlbnRJbmRleCA9IDA7CiAgICBsZXQgc3RJbmRleCA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IHBvc2l0aW9uID0gcG9zaXRpb25zW2ldOwogICAgICBmbGF0UG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSBwb3NpdGlvbi54OwogICAgICBmbGF0UG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSBwb3NpdGlvbi55OwogICAgICBmbGF0UG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSBwb3NpdGlvbi56OwogICAgICBpZiAodmVydGV4Rm9ybWF0LnN0KSB7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChoYXJkY29kZWRUZXh0dXJlQ29vcmRpbmF0ZXMpICYmIGhhcmRjb2RlZFRleHR1cmVDb29yZGluYXRlcy5wb3NpdGlvbnMubGVuZ3RoID09PSBsZW5ndGgpIHsKICAgICAgICAgIHRleHR1cmVDb29yZGluYXRlc1tzdEluZGV4KytdID0gaGFyZGNvZGVkVGV4dHVyZUNvb3JkaW5hdGVzLnBvc2l0aW9uc1tpXS54OwogICAgICAgICAgdGV4dHVyZUNvb3JkaW5hdGVzW3N0SW5kZXgrK10gPSBoYXJkY29kZWRUZXh0dXJlQ29vcmRpbmF0ZXMucG9zaXRpb25zW2ldLnk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IHAgPSBNYXRyaXgzX2RlZmF1bHQubXVsdGlwbHlCeVZlY3RvcigKICAgICAgICAgICAgdGV4dHVyZU1hdHJpeCwKICAgICAgICAgICAgcG9zaXRpb24sCiAgICAgICAgICAgIHNjcmF0Y2hQb3NpdGlvbgogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IHN0ID0gcHJvamVjdFBvaW50VG8yRChwLCBzdFNjcmF0Y2gpOwogICAgICAgICAgQ2FydGVzaWFuMl9kZWZhdWx0LnN1YnRyYWN0KHN0LCBzdE9yaWdpbiwgc3QpOwogICAgICAgICAgY29uc3Qgc3R4ID0gTWF0aF9kZWZhdWx0LmNsYW1wKHN0LnggLyBib3VuZGluZ1JlY3RhbmdsZS53aWR0aCwgMCwgMSk7CiAgICAgICAgICBjb25zdCBzdHkgPSBNYXRoX2RlZmF1bHQuY2xhbXAoc3QueSAvIGJvdW5kaW5nUmVjdGFuZ2xlLmhlaWdodCwgMCwgMSk7CiAgICAgICAgICB0ZXh0dXJlQ29vcmRpbmF0ZXNbc3RJbmRleCsrXSA9IHN0eDsKICAgICAgICAgIHRleHR1cmVDb29yZGluYXRlc1tzdEluZGV4KytdID0gc3R5OwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCkgewogICAgICAgIG5vcm1hbHNbbm9ybWFsSW5kZXgrK10gPSBub3JtYWwyLng7CiAgICAgICAgbm9ybWFsc1tub3JtYWxJbmRleCsrXSA9IG5vcm1hbDIueTsKICAgICAgICBub3JtYWxzW25vcm1hbEluZGV4KytdID0gbm9ybWFsMi56OwogICAgICB9CiAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQudGFuZ2VudCkgewogICAgICAgIHRhbmdlbnRzW3RhbmdlbnRJbmRleCsrXSA9IHRhbmdlbnQueDsKICAgICAgICB0YW5nZW50c1t0YW5nZW50SW5kZXgrK10gPSB0YW5nZW50Lnk7CiAgICAgICAgdGFuZ2VudHNbdGFuZ2VudEluZGV4KytdID0gdGFuZ2VudC56OwogICAgICB9CiAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgICAgYml0YW5nZW50c1tiaXRhbmdlbnRJbmRleCsrXSA9IGJpdGFuZ2VudC54OwogICAgICAgIGJpdGFuZ2VudHNbYml0YW5nZW50SW5kZXgrK10gPSBiaXRhbmdlbnQueTsKICAgICAgICBiaXRhbmdlbnRzW2JpdGFuZ2VudEluZGV4KytdID0gYml0YW5nZW50Lno7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVzX2RlZmF1bHQoKTsKICAgIGlmICh2ZXJ0ZXhGb3JtYXQucG9zaXRpb24pIHsKICAgICAgYXR0cmlidXRlcy5wb3NpdGlvbiA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5ET1VCTEUsCiAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICB2YWx1ZXM6IGZsYXRQb3NpdGlvbnMKICAgICAgfSk7CiAgICB9CiAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCkgewogICAgICBhdHRyaWJ1dGVzLm5vcm1hbCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5GTE9BVCwKICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgIHZhbHVlczogbm9ybWFscwogICAgICB9KTsKICAgIH0KICAgIGlmICh2ZXJ0ZXhGb3JtYXQudGFuZ2VudCkgewogICAgICBhdHRyaWJ1dGVzLnRhbmdlbnQgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICB2YWx1ZXM6IHRhbmdlbnRzCiAgICAgIH0pOwogICAgfQogICAgaWYgKHZlcnRleEZvcm1hdC5iaXRhbmdlbnQpIHsKICAgICAgYXR0cmlidXRlcy5iaXRhbmdlbnQgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICB2YWx1ZXM6IGJpdGFuZ2VudHMKICAgICAgfSk7CiAgICB9CiAgICBpZiAodmVydGV4Rm9ybWF0LnN0KSB7CiAgICAgIGF0dHJpYnV0ZXMuc3QgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMiwKICAgICAgICB2YWx1ZXM6IHRleHR1cmVDb29yZGluYXRlcwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBuZXcgR2VvbWV0cnlfZGVmYXVsdCh7CiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIGluZGljZXM6IG5ld0luZGljZXMsCiAgICAgIHByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5UUklBTkdMRVMKICAgIH0pOwogIH0KICBmdW5jdGlvbiBDb3BsYW5hclBvbHlnb25HZW9tZXRyeShvcHRpb25zKSB7CiAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICBjb25zdCBwb2x5Z29uSGllcmFyY2h5ID0gb3B0aW9ucy5wb2x5Z29uSGllcmFyY2h5OwogICAgY29uc3QgdGV4dHVyZUNvb3JkaW5hdGVzID0gb3B0aW9ucy50ZXh0dXJlQ29vcmRpbmF0ZXM7CiAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoIm9wdGlvbnMucG9seWdvbkhpZXJhcmNoeSIsIHBvbHlnb25IaWVyYXJjaHkpOwogICAgY29uc3QgdmVydGV4Rm9ybWF0ID0gb3B0aW9ucy52ZXJ0ZXhGb3JtYXQgPz8gVmVydGV4Rm9ybWF0X2RlZmF1bHQuREVGQVVMVDsKICAgIHRoaXMuX3ZlcnRleEZvcm1hdCA9IFZlcnRleEZvcm1hdF9kZWZhdWx0LmNsb25lKHZlcnRleEZvcm1hdCk7CiAgICB0aGlzLl9wb2x5Z29uSGllcmFyY2h5ID0gcG9seWdvbkhpZXJhcmNoeTsKICAgIHRoaXMuX3N0Um90YXRpb24gPSBvcHRpb25zLnN0Um90YXRpb24gPz8gMDsKICAgIHRoaXMuX2VsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKG9wdGlvbnMuZWxsaXBzb2lkID8/IEVsbGlwc29pZF9kZWZhdWx0LmRlZmF1bHQpOwogICAgdGhpcy5fd29ya2VyTmFtZSA9ICJjcmVhdGVDb3BsYW5hclBvbHlnb25HZW9tZXRyeSI7CiAgICB0aGlzLl90ZXh0dXJlQ29vcmRpbmF0ZXMgPSB0ZXh0dXJlQ29vcmRpbmF0ZXM7CiAgICB0aGlzLnBhY2tlZExlbmd0aCA9IFBvbHlnb25HZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5jb21wdXRlSGllcmFyY2h5UGFja2VkTGVuZ3RoKAogICAgICBwb2x5Z29uSGllcmFyY2h5LAogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQKICAgICkgKyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyAoZGVmaW5lZF9kZWZhdWx0KHRleHR1cmVDb29yZGluYXRlcykgPyBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuY29tcHV0ZUhpZXJhcmNoeVBhY2tlZExlbmd0aCgKICAgICAgdGV4dHVyZUNvb3JkaW5hdGVzLAogICAgICBDYXJ0ZXNpYW4yX2RlZmF1bHQKICAgICkgOiAxKSArIDI7CiAgfQogIHZhciBzY3JhdGNoUG9zaXRpb24sIHNjcmF0Y2hCUiwgc3RTY3JhdGNoLCB0ZXh0dXJlQ29vcmRpbmF0ZXNPcmlnaW4sIHNjcmF0Y2hOb3JtYWw0LCBzY3JhdGNoVGFuZ2VudDIsIHNjcmF0Y2hCaXRhbmdlbnQyLCBjZW50ZXJTY3JhdGNoLCBheGlzMVNjcmF0Y2gsIGF4aXMyU2NyYXRjaCwgcXVhdGVybmlvblNjcmF0Y2gyLCB0ZXh0dXJlTWF0cml4U2NyYXRjaDIsIHRhbmdlbnRSb3RhdGlvblNjcmF0Y2gsIHN1cmZhY2VOb3JtYWxTY3JhdGNoLCBzY3JhdGNoRWxsaXBzb2lkMywgc2NyYXRjaFZlcnRleEZvcm1hdDMsIHNjcmF0Y2hPcHRpb25zNywgQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9Db3BsYW5hclBvbHlnb25HZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X2FycmF5UmVtb3ZlRHVwbGljYXRlcygpOwogICAgICBpbml0X0JvdW5kaW5nUmVjdGFuZ2xlKCk7CiAgICAgIGluaXRfQm91bmRpbmdTcGhlcmUoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4yKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfQ29tcG9uZW50RGF0YXR5cGUoKTsKICAgICAgaW5pdF9Db3BsYW5hclBvbHlnb25HZW9tZXRyeUxpYnJhcnkoKTsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfR2VvbWV0cnkoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlcygpOwogICAgICBpbml0X0dlb21ldHJ5SW5zdGFuY2UoKTsKICAgICAgaW5pdF9HZW9tZXRyeVBpcGVsaW5lKCk7CiAgICAgIGluaXRfSW5kZXhEYXRhdHlwZSgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9NYXRyaXgzKCk7CiAgICAgIGluaXRfUG9seWdvbkdlb21ldHJ5TGlicmFyeSgpOwogICAgICBpbml0X1BvbHlnb25QaXBlbGluZSgpOwogICAgICBpbml0X1ByaW1pdGl2ZVR5cGUoKTsKICAgICAgaW5pdF9RdWF0ZXJuaW9uKCk7CiAgICAgIGluaXRfVmVydGV4Rm9ybWF0KCk7CiAgICAgIHNjcmF0Y2hQb3NpdGlvbiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaEJSID0gbmV3IEJvdW5kaW5nUmVjdGFuZ2xlX2RlZmF1bHQoKTsKICAgICAgc3RTY3JhdGNoID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICB0ZXh0dXJlQ29vcmRpbmF0ZXNPcmlnaW4gPSBuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hOb3JtYWw0ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoVGFuZ2VudDIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hCaXRhbmdlbnQyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjZW50ZXJTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBheGlzMVNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGF4aXMyU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgcXVhdGVybmlvblNjcmF0Y2gyID0gbmV3IFF1YXRlcm5pb25fZGVmYXVsdCgpOwogICAgICB0ZXh0dXJlTWF0cml4U2NyYXRjaDIgPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgIHRhbmdlbnRSb3RhdGlvblNjcmF0Y2ggPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgIHN1cmZhY2VOb3JtYWxTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBDb3BsYW5hclBvbHlnb25HZW9tZXRyeS5mcm9tUG9zaXRpb25zID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoIm9wdGlvbnMucG9zaXRpb25zIiwgb3B0aW9ucy5wb3NpdGlvbnMpOwogICAgICAgIGNvbnN0IG5ld09wdGlvbnMgPSB7CiAgICAgICAgICBwb2x5Z29uSGllcmFyY2h5OiB7CiAgICAgICAgICAgIHBvc2l0aW9uczogb3B0aW9ucy5wb3NpdGlvbnMKICAgICAgICAgIH0sCiAgICAgICAgICB2ZXJ0ZXhGb3JtYXQ6IG9wdGlvbnMudmVydGV4Rm9ybWF0LAogICAgICAgICAgc3RSb3RhdGlvbjogb3B0aW9ucy5zdFJvdGF0aW9uLAogICAgICAgICAgZWxsaXBzb2lkOiBvcHRpb25zLmVsbGlwc29pZCwKICAgICAgICAgIHRleHR1cmVDb29yZGluYXRlczogb3B0aW9ucy50ZXh0dXJlQ29vcmRpbmF0ZXMKICAgICAgICB9OwogICAgICAgIHJldHVybiBuZXcgQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnkobmV3T3B0aW9ucyk7CiAgICAgIH07CiAgICAgIENvcGxhbmFyUG9seWdvbkdlb21ldHJ5LnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBzdGFydGluZ0luZGV4ID0gUG9seWdvbkdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LnBhY2tQb2x5Z29uSGllcmFyY2h5KAogICAgICAgICAgdmFsdWUuX3BvbHlnb25IaWVyYXJjaHksCiAgICAgICAgICBhcnJheSwKICAgICAgICAgIHN0YXJ0aW5nSW5kZXgsCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQKICAgICAgICApOwogICAgICAgIEVsbGlwc29pZF9kZWZhdWx0LnBhY2sodmFsdWUuX2VsbGlwc29pZCwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gRWxsaXBzb2lkX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIFZlcnRleEZvcm1hdF9kZWZhdWx0LnBhY2sodmFsdWUuX3ZlcnRleEZvcm1hdCwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gVmVydGV4Rm9ybWF0X2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5fc3RSb3RhdGlvbjsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHZhbHVlLl90ZXh0dXJlQ29vcmRpbmF0ZXMpKSB7CiAgICAgICAgICBzdGFydGluZ0luZGV4ID0gUG9seWdvbkdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LnBhY2tQb2x5Z29uSGllcmFyY2h5KAogICAgICAgICAgICB2YWx1ZS5fdGV4dHVyZUNvb3JkaW5hdGVzLAogICAgICAgICAgICBhcnJheSwKICAgICAgICAgICAgc3RhcnRpbmdJbmRleCwKICAgICAgICAgICAgQ2FydGVzaWFuMl9kZWZhdWx0CiAgICAgICAgICApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gLTE7CiAgICAgICAgfQogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5wYWNrZWRMZW5ndGg7CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9OwogICAgICBzY3JhdGNoRWxsaXBzb2lkMyA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKEVsbGlwc29pZF9kZWZhdWx0LlVOSVRfU1BIRVJFKTsKICAgICAgc2NyYXRjaFZlcnRleEZvcm1hdDMgPSBuZXcgVmVydGV4Rm9ybWF0X2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaE9wdGlvbnM3ID0gewogICAgICAgIHBvbHlnb25IaWVyYXJjaHk6IHt9CiAgICAgIH07CiAgICAgIENvcGxhbmFyUG9seWdvbkdlb21ldHJ5LnVucGFjayA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydGluZ0luZGV4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgY29uc3QgcG9seWdvbkhpZXJhcmNoeSA9IFBvbHlnb25HZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC51bnBhY2tQb2x5Z29uSGllcmFyY2h5KAogICAgICAgICAgYXJyYXksCiAgICAgICAgICBzdGFydGluZ0luZGV4LAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0CiAgICAgICAgKTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gcG9seWdvbkhpZXJhcmNoeS5zdGFydGluZ0luZGV4OwogICAgICAgIGRlbGV0ZSBwb2x5Z29uSGllcmFyY2h5LnN0YXJ0aW5nSW5kZXg7CiAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQudW5wYWNrKGFycmF5LCBzdGFydGluZ0luZGV4LCBzY3JhdGNoRWxsaXBzb2lkMyk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgY29uc3QgdmVydGV4Rm9ybWF0ID0gVmVydGV4Rm9ybWF0X2RlZmF1bHQudW5wYWNrKAogICAgICAgICAgYXJyYXksCiAgICAgICAgICBzdGFydGluZ0luZGV4LAogICAgICAgICAgc2NyYXRjaFZlcnRleEZvcm1hdDMKICAgICAgICApOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gVmVydGV4Rm9ybWF0X2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGNvbnN0IHN0Um90YXRpb24gPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IHRleHR1cmVDb29yZGluYXRlcyA9IGFycmF5W3N0YXJ0aW5nSW5kZXhdID09PSAtMSA/IHZvaWQgMCA6IFBvbHlnb25HZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC51bnBhY2tQb2x5Z29uSGllcmFyY2h5KAogICAgICAgICAgYXJyYXksCiAgICAgICAgICBzdGFydGluZ0luZGV4LAogICAgICAgICAgQ2FydGVzaWFuMl9kZWZhdWx0CiAgICAgICAgKTsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHRleHR1cmVDb29yZGluYXRlcykpIHsKICAgICAgICAgIHN0YXJ0aW5nSW5kZXggPSB0ZXh0dXJlQ29vcmRpbmF0ZXMuc3RhcnRpbmdJbmRleDsKICAgICAgICAgIGRlbGV0ZSB0ZXh0dXJlQ29vcmRpbmF0ZXMuc3RhcnRpbmdJbmRleDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhcnRpbmdJbmRleCsrOwogICAgICAgIH0KICAgICAgICBjb25zdCBwYWNrZWRMZW5ndGggPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBDb3BsYW5hclBvbHlnb25HZW9tZXRyeShzY3JhdGNoT3B0aW9uczcpOwogICAgICAgIH0KICAgICAgICByZXN1bHQuX3BvbHlnb25IaWVyYXJjaHkgPSBwb2x5Z29uSGllcmFyY2h5OwogICAgICAgIHJlc3VsdC5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUoZWxsaXBzb2lkLCByZXN1bHQuX2VsbGlwc29pZCk7CiAgICAgICAgcmVzdWx0Ll92ZXJ0ZXhGb3JtYXQgPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5jbG9uZSh2ZXJ0ZXhGb3JtYXQsIHJlc3VsdC5fdmVydGV4Rm9ybWF0KTsKICAgICAgICByZXN1bHQuX3N0Um90YXRpb24gPSBzdFJvdGF0aW9uOwogICAgICAgIHJlc3VsdC5fdGV4dHVyZUNvb3JkaW5hdGVzID0gdGV4dHVyZUNvb3JkaW5hdGVzOwogICAgICAgIHJlc3VsdC5wYWNrZWRMZW5ndGggPSBwYWNrZWRMZW5ndGg7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnkuY3JlYXRlR2VvbWV0cnkgPSBmdW5jdGlvbihwb2x5Z29uR2VvbWV0cnkpIHsKICAgICAgICBjb25zdCB2ZXJ0ZXhGb3JtYXQgPSBwb2x5Z29uR2VvbWV0cnkuX3ZlcnRleEZvcm1hdDsKICAgICAgICBjb25zdCBwb2x5Z29uSGllcmFyY2h5ID0gcG9seWdvbkdlb21ldHJ5Ll9wb2x5Z29uSGllcmFyY2h5OwogICAgICAgIGNvbnN0IHN0Um90YXRpb24gPSBwb2x5Z29uR2VvbWV0cnkuX3N0Um90YXRpb247CiAgICAgICAgY29uc3QgdGV4dHVyZUNvb3JkaW5hdGVzID0gcG9seWdvbkdlb21ldHJ5Ll90ZXh0dXJlQ29vcmRpbmF0ZXM7CiAgICAgICAgY29uc3QgaGFzVGV4dHVyZUNvb3JkaW5hdGVzID0gZGVmaW5lZF9kZWZhdWx0KHRleHR1cmVDb29yZGluYXRlcyk7CiAgICAgICAgbGV0IG91dGVyUG9zaXRpb25zID0gcG9seWdvbkhpZXJhcmNoeS5wb3NpdGlvbnM7CiAgICAgICAgb3V0ZXJQb3NpdGlvbnMgPSBhcnJheVJlbW92ZUR1cGxpY2F0ZXNfZGVmYXVsdCgKICAgICAgICAgIG91dGVyUG9zaXRpb25zLAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24sCiAgICAgICAgICB0cnVlCiAgICAgICAgKTsKICAgICAgICBpZiAob3V0ZXJQb3NpdGlvbnMubGVuZ3RoIDwgMykgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsZXQgbm9ybWFsMiA9IHNjcmF0Y2hOb3JtYWw0OwogICAgICAgIGxldCB0YW5nZW50ID0gc2NyYXRjaFRhbmdlbnQyOwogICAgICAgIGxldCBiaXRhbmdlbnQgPSBzY3JhdGNoQml0YW5nZW50MjsKICAgICAgICBsZXQgYXhpczEgPSBheGlzMVNjcmF0Y2g7CiAgICAgICAgY29uc3QgYXhpczIgPSBheGlzMlNjcmF0Y2g7CiAgICAgICAgY29uc3QgdmFsaWRHZW9tZXRyeSA9IENvcGxhbmFyUG9seWdvbkdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmNvbXB1dGVQcm9qZWN0VG8yREFyZ3VtZW50cygKICAgICAgICAgIG91dGVyUG9zaXRpb25zLAogICAgICAgICAgY2VudGVyU2NyYXRjaCwKICAgICAgICAgIGF4aXMxLAogICAgICAgICAgYXhpczIKICAgICAgICApOwogICAgICAgIGlmICghdmFsaWRHZW9tZXRyeSkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgbm9ybWFsMiA9IENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhheGlzMSwgYXhpczIsIG5vcm1hbDIpOwogICAgICAgIG5vcm1hbDIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKG5vcm1hbDIsIG5vcm1hbDIpOwogICAgICAgIGlmICghQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24oCiAgICAgICAgICBjZW50ZXJTY3JhdGNoLAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8sCiAgICAgICAgICBNYXRoX2RlZmF1bHQuRVBTSUxPTjYKICAgICAgICApKSB7CiAgICAgICAgICBjb25zdCBzdXJmYWNlTm9ybWFsID0gcG9seWdvbkdlb21ldHJ5Ll9lbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKAogICAgICAgICAgICBjZW50ZXJTY3JhdGNoLAogICAgICAgICAgICBzdXJmYWNlTm9ybWFsU2NyYXRjaAogICAgICAgICAgKTsKICAgICAgICAgIGlmIChDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KG5vcm1hbDIsIHN1cmZhY2VOb3JtYWwpIDwgMCkgewogICAgICAgICAgICBub3JtYWwyID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZShub3JtYWwyLCBub3JtYWwyKTsKICAgICAgICAgICAgYXhpczEgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKGF4aXMxLCBheGlzMSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHByb2plY3RQb2ludHMgPSBDb3BsYW5hclBvbHlnb25HZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5jcmVhdGVQcm9qZWN0UG9pbnRzVG8yREZ1bmN0aW9uKAogICAgICAgICAgY2VudGVyU2NyYXRjaCwKICAgICAgICAgIGF4aXMxLAogICAgICAgICAgYXhpczIKICAgICAgICApOwogICAgICAgIGNvbnN0IHByb2plY3RQb2ludCA9IENvcGxhbmFyUG9seWdvbkdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmNyZWF0ZVByb2plY3RQb2ludFRvMkRGdW5jdGlvbigKICAgICAgICAgIGNlbnRlclNjcmF0Y2gsCiAgICAgICAgICBheGlzMSwKICAgICAgICAgIGF4aXMyCiAgICAgICAgKTsKICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnRhbmdlbnQpIHsKICAgICAgICAgIHRhbmdlbnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoYXhpczEsIHRhbmdlbnQpOwogICAgICAgIH0KICAgICAgICBpZiAodmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgewogICAgICAgICAgYml0YW5nZW50ID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGF4aXMyLCBiaXRhbmdlbnQpOwogICAgICAgIH0KICAgICAgICBjb25zdCByZXN1bHRzID0gUG9seWdvbkdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LnBvbHlnb25zRnJvbUhpZXJhcmNoeSgKICAgICAgICAgIHBvbHlnb25IaWVyYXJjaHksCiAgICAgICAgICBoYXNUZXh0dXJlQ29vcmRpbmF0ZXMsCiAgICAgICAgICBwcm9qZWN0UG9pbnRzLAogICAgICAgICAgZmFsc2UKICAgICAgICApOwogICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IHJlc3VsdHMuaGllcmFyY2h5OwogICAgICAgIGNvbnN0IHBvbHlnb25zID0gcmVzdWx0cy5wb2x5Z29uczsKICAgICAgICBjb25zdCBkdW1teUZ1bmN0aW9uID0gZnVuY3Rpb24oaWRlbnRpdHkpIHsKICAgICAgICAgIHJldHVybiBpZGVudGl0eTsKICAgICAgICB9OwogICAgICAgIGNvbnN0IHRleHR1cmVDb29yZGluYXRlUG9seWdvbnMgPSBoYXNUZXh0dXJlQ29vcmRpbmF0ZXMgPyBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQucG9seWdvbnNGcm9tSGllcmFyY2h5KAogICAgICAgICAgdGV4dHVyZUNvb3JkaW5hdGVzLAogICAgICAgICAgdHJ1ZSwKICAgICAgICAgIGR1bW15RnVuY3Rpb24sCiAgICAgICAgICBmYWxzZQogICAgICAgICkucG9seWdvbnMgOiB2b2lkIDA7CiAgICAgICAgaWYgKGhpZXJhcmNoeS5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgb3V0ZXJQb3NpdGlvbnMgPSBoaWVyYXJjaHlbMF0ub3V0ZXJSaW5nOwogICAgICAgIGNvbnN0IGJvdW5kaW5nU3BoZXJlID0gQm91bmRpbmdTcGhlcmVfZGVmYXVsdC5mcm9tUG9pbnRzKG91dGVyUG9zaXRpb25zKTsKICAgICAgICBjb25zdCBib3VuZGluZ1JlY3RhbmdsZSA9IFBvbHlnb25HZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5jb21wdXRlQm91bmRpbmdSZWN0YW5nbGUoCiAgICAgICAgICBub3JtYWwyLAogICAgICAgICAgcHJvamVjdFBvaW50LAogICAgICAgICAgb3V0ZXJQb3NpdGlvbnMsCiAgICAgICAgICBzdFJvdGF0aW9uLAogICAgICAgICAgc2NyYXRjaEJSCiAgICAgICAgKTsKICAgICAgICBjb25zdCBnZW9tZXRyaWVzID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5Z29ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgZ2VvbWV0cnlJbnN0YW5jZSA9IG5ldyBHZW9tZXRyeUluc3RhbmNlX2RlZmF1bHQoewogICAgICAgICAgICBnZW9tZXRyeTogY3JlYXRlR2VvbWV0cnlGcm9tUG9seWdvbigKICAgICAgICAgICAgICBwb2x5Z29uc1tpXSwKICAgICAgICAgICAgICB2ZXJ0ZXhGb3JtYXQsCiAgICAgICAgICAgICAgYm91bmRpbmdSZWN0YW5nbGUsCiAgICAgICAgICAgICAgc3RSb3RhdGlvbiwKICAgICAgICAgICAgICBoYXNUZXh0dXJlQ29vcmRpbmF0ZXMgPyB0ZXh0dXJlQ29vcmRpbmF0ZVBvbHlnb25zW2ldIDogdm9pZCAwLAogICAgICAgICAgICAgIHByb2plY3RQb2ludCwKICAgICAgICAgICAgICBub3JtYWwyLAogICAgICAgICAgICAgIHRhbmdlbnQsCiAgICAgICAgICAgICAgYml0YW5nZW50CiAgICAgICAgICAgICkKICAgICAgICAgIH0pOwogICAgICAgICAgZ2VvbWV0cmllcy5wdXNoKGdlb21ldHJ5SW5zdGFuY2UpOwogICAgICAgIH0KICAgICAgICBjb25zdCBnZW9tZXRyeSA9IEdlb21ldHJ5UGlwZWxpbmVfZGVmYXVsdC5jb21iaW5lSW5zdGFuY2VzKGdlb21ldHJpZXMpWzBdOwogICAgICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzID0gbmV3IEZsb2F0NjRBcnJheSgKICAgICAgICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzCiAgICAgICAgKTsKICAgICAgICBnZW9tZXRyeS5pbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkoCiAgICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGggLyAzLAogICAgICAgICAgZ2VvbWV0cnkuaW5kaWNlcwogICAgICAgICk7CiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7CiAgICAgICAgaWYgKCF2ZXJ0ZXhGb3JtYXQucG9zaXRpb24pIHsKICAgICAgICAgIGRlbGV0ZSBhdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IEdlb21ldHJ5X2RlZmF1bHQoewogICAgICAgICAgYXR0cmlidXRlcywKICAgICAgICAgIGluZGljZXM6IGdlb21ldHJ5LmluZGljZXMsCiAgICAgICAgICBwcmltaXRpdmVUeXBlOiBnZW9tZXRyeS5wcmltaXRpdmVUeXBlLAogICAgICAgICAgYm91bmRpbmdTcGhlcmUKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnlfZGVmYXVsdCA9IENvcGxhbmFyUG9seWdvbkdlb21ldHJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnkuanMKICB2YXIgY3JlYXRlQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnlfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGNyZWF0ZUNvcGxhbmFyUG9seWdvbkdlb21ldHJ5X2V4cG9ydHMsIHsKICAgIGRlZmF1bHQ6ICgpID0+IGNyZWF0ZUNvcGxhbmFyUG9seWdvbkdlb21ldHJ5X2RlZmF1bHQKICB9KTsKICBmdW5jdGlvbiBjcmVhdGVDb3BsYW5hclBvbHlnb25HZW9tZXRyeShwb2x5Z29uR2VvbWV0cnksIG9mZnNldCkgewogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvZmZzZXQpKSB7CiAgICAgIHBvbHlnb25HZW9tZXRyeSA9IENvcGxhbmFyUG9seWdvbkdlb21ldHJ5X2RlZmF1bHQudW5wYWNrKHBvbHlnb25HZW9tZXRyeSwgb2Zmc2V0KTsKICAgIH0KICAgIHJldHVybiBDb3BsYW5hclBvbHlnb25HZW9tZXRyeV9kZWZhdWx0LmNyZWF0ZUdlb21ldHJ5KHBvbHlnb25HZW9tZXRyeSk7CiAgfQogIHZhciBjcmVhdGVDb3BsYW5hclBvbHlnb25HZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X2NyZWF0ZUNvcGxhbmFyUG9seWdvbkdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVDb3BsYW5hclBvbHlnb25HZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnkoKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGNyZWF0ZUNvcGxhbmFyUG9seWdvbkdlb21ldHJ5X2RlZmF1bHQgPSBjcmVhdGVDb3BsYW5hclBvbHlnb25HZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NvcGxhbmFyUG9seWdvbk91dGxpbmVHZW9tZXRyeS5qcwogIGZ1bmN0aW9uIGNyZWF0ZUdlb21ldHJ5RnJvbVBvc2l0aW9ucyhwb3NpdGlvbnMpIHsKICAgIGNvbnN0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICBjb25zdCBmbGF0UG9zaXRpb25zID0gbmV3IEZsb2F0NjRBcnJheShsZW5ndGggKiAzKTsKICAgIGNvbnN0IGluZGljZXMgPSBJbmRleERhdGF0eXBlX2RlZmF1bHQuY3JlYXRlVHlwZWRBcnJheShsZW5ndGgsIGxlbmd0aCAqIDIpOwogICAgbGV0IHBvc2l0aW9uSW5kZXggPSAwOwogICAgbGV0IGluZGV4ID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07CiAgICAgIGZsYXRQb3NpdGlvbnNbcG9zaXRpb25JbmRleCsrXSA9IHBvc2l0aW9uLng7CiAgICAgIGZsYXRQb3NpdGlvbnNbcG9zaXRpb25JbmRleCsrXSA9IHBvc2l0aW9uLnk7CiAgICAgIGZsYXRQb3NpdGlvbnNbcG9zaXRpb25JbmRleCsrXSA9IHBvc2l0aW9uLno7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSBpOwogICAgICBpbmRpY2VzW2luZGV4KytdID0gKGkgKyAxKSAlIGxlbmd0aDsKICAgIH0KICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVzX2RlZmF1bHQoewogICAgICBwb3NpdGlvbjogbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkRPVUJMRSwKICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgIHZhbHVlczogZmxhdFBvc2l0aW9ucwogICAgICB9KQogICAgfSk7CiAgICByZXR1cm4gbmV3IEdlb21ldHJ5X2RlZmF1bHQoewogICAgICBhdHRyaWJ1dGVzLAogICAgICBpbmRpY2VzLAogICAgICBwcmltaXRpdmVUeXBlOiBQcmltaXRpdmVUeXBlX2RlZmF1bHQuTElORVMKICAgIH0pOwogIH0KICBmdW5jdGlvbiBDb3BsYW5hclBvbHlnb25PdXRsaW5lR2VvbWV0cnkob3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgPz8gRnJvemVuX2RlZmF1bHQuRU1QVFlfT0JKRUNUOwogICAgY29uc3QgcG9seWdvbkhpZXJhcmNoeSA9IG9wdGlvbnMucG9seWdvbkhpZXJhcmNoeTsKICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgib3B0aW9ucy5wb2x5Z29uSGllcmFyY2h5IiwgcG9seWdvbkhpZXJhcmNoeSk7CiAgICB0aGlzLl9wb2x5Z29uSGllcmFyY2h5ID0gcG9seWdvbkhpZXJhcmNoeTsKICAgIHRoaXMuX3dvcmtlck5hbWUgPSAiY3JlYXRlQ29wbGFuYXJQb2x5Z29uT3V0bGluZUdlb21ldHJ5IjsKICAgIHRoaXMucGFja2VkTGVuZ3RoID0gUG9seWdvbkdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmNvbXB1dGVIaWVyYXJjaHlQYWNrZWRMZW5ndGgoCiAgICAgIHBvbHlnb25IaWVyYXJjaHksCiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdAogICAgKSArIDE7CiAgfQogIHZhciBzY3JhdGNoT3B0aW9uczgsIENvcGxhbmFyUG9seWdvbk91dGxpbmVHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X0NvcGxhbmFyUG9seWdvbk91dGxpbmVHZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ29wbGFuYXJQb2x5Z29uT3V0bGluZUdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9hcnJheVJlbW92ZUR1cGxpY2F0ZXMoKTsKICAgICAgaW5pdF9Cb3VuZGluZ1NwaGVyZSgpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X0NvbXBvbmVudERhdGF0eXBlKCk7CiAgICAgIGluaXRfQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5KCk7CiAgICAgIGluaXRfRnJvemVuKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0dlb21ldHJ5KCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGUoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZXMoKTsKICAgICAgaW5pdF9HZW9tZXRyeUluc3RhbmNlKCk7CiAgICAgIGluaXRfR2VvbWV0cnlQaXBlbGluZSgpOwogICAgICBpbml0X0luZGV4RGF0YXR5cGUoKTsKICAgICAgaW5pdF9Qb2x5Z29uR2VvbWV0cnlMaWJyYXJ5KCk7CiAgICAgIGluaXRfUHJpbWl0aXZlVHlwZSgpOwogICAgICBDb3BsYW5hclBvbHlnb25PdXRsaW5lR2VvbWV0cnkuZnJvbVBvc2l0aW9ucyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJvcHRpb25zLnBvc2l0aW9ucyIsIG9wdGlvbnMucG9zaXRpb25zKTsKICAgICAgICBjb25zdCBuZXdPcHRpb25zID0gewogICAgICAgICAgcG9seWdvbkhpZXJhcmNoeTogewogICAgICAgICAgICBwb3NpdGlvbnM6IG9wdGlvbnMucG9zaXRpb25zCiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gbmV3IENvcGxhbmFyUG9seWdvbk91dGxpbmVHZW9tZXRyeShuZXdPcHRpb25zKTsKICAgICAgfTsKICAgICAgQ29wbGFuYXJQb2x5Z29uT3V0bGluZUdlb21ldHJ5LnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBzdGFydGluZ0luZGV4ID0gUG9seWdvbkdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LnBhY2tQb2x5Z29uSGllcmFyY2h5KAogICAgICAgICAgdmFsdWUuX3BvbHlnb25IaWVyYXJjaHksCiAgICAgICAgICBhcnJheSwKICAgICAgICAgIHN0YXJ0aW5nSW5kZXgsCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQKICAgICAgICApOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXhdID0gdmFsdWUucGFja2VkTGVuZ3RoOwogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfTsKICAgICAgc2NyYXRjaE9wdGlvbnM4ID0gewogICAgICAgIHBvbHlnb25IaWVyYXJjaHk6IHt9CiAgICAgIH07CiAgICAgIENvcGxhbmFyUG9seWdvbk91dGxpbmVHZW9tZXRyeS51bnBhY2sgPSBmdW5jdGlvbihhcnJheSwgc3RhcnRpbmdJbmRleCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGNvbnN0IHBvbHlnb25IaWVyYXJjaHkgPSBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQudW5wYWNrUG9seWdvbkhpZXJhcmNoeSgKICAgICAgICAgIGFycmF5LAogICAgICAgICAgc3RhcnRpbmdJbmRleCwKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdAogICAgICAgICk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHBvbHlnb25IaWVyYXJjaHkuc3RhcnRpbmdJbmRleDsKICAgICAgICBkZWxldGUgcG9seWdvbkhpZXJhcmNoeS5zdGFydGluZ0luZGV4OwogICAgICAgIGNvbnN0IHBhY2tlZExlbmd0aCA9IGFycmF5W3N0YXJ0aW5nSW5kZXhdOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBDb3BsYW5hclBvbHlnb25PdXRsaW5lR2VvbWV0cnkoc2NyYXRjaE9wdGlvbnM4KTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0Ll9wb2x5Z29uSGllcmFyY2h5ID0gcG9seWdvbkhpZXJhcmNoeTsKICAgICAgICByZXN1bHQucGFja2VkTGVuZ3RoID0gcGFja2VkTGVuZ3RoOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENvcGxhbmFyUG9seWdvbk91dGxpbmVHZW9tZXRyeS5jcmVhdGVHZW9tZXRyeSA9IGZ1bmN0aW9uKHBvbHlnb25HZW9tZXRyeSkgewogICAgICAgIGNvbnN0IHBvbHlnb25IaWVyYXJjaHkgPSBwb2x5Z29uR2VvbWV0cnkuX3BvbHlnb25IaWVyYXJjaHk7CiAgICAgICAgbGV0IG91dGVyUG9zaXRpb25zID0gcG9seWdvbkhpZXJhcmNoeS5wb3NpdGlvbnM7CiAgICAgICAgb3V0ZXJQb3NpdGlvbnMgPSBhcnJheVJlbW92ZUR1cGxpY2F0ZXNfZGVmYXVsdCgKICAgICAgICAgIG91dGVyUG9zaXRpb25zLAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24sCiAgICAgICAgICB0cnVlCiAgICAgICAgKTsKICAgICAgICBpZiAob3V0ZXJQb3NpdGlvbnMubGVuZ3RoIDwgMykgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBpc1ZhbGlkID0gQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQudmFsaWRPdXRsaW5lKG91dGVyUG9zaXRpb25zKTsKICAgICAgICBpZiAoIWlzVmFsaWQpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBvbHlnb25zID0gUG9seWdvbkdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LnBvbHlnb25PdXRsaW5lc0Zyb21IaWVyYXJjaHkoCiAgICAgICAgICBwb2x5Z29uSGllcmFyY2h5LAogICAgICAgICAgZmFsc2UKICAgICAgICApOwogICAgICAgIGlmIChwb2x5Z29ucy5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGdlb21ldHJpZXMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBnZW9tZXRyeUluc3RhbmNlID0gbmV3IEdlb21ldHJ5SW5zdGFuY2VfZGVmYXVsdCh7CiAgICAgICAgICAgIGdlb21ldHJ5OiBjcmVhdGVHZW9tZXRyeUZyb21Qb3NpdGlvbnMocG9seWdvbnNbaV0pCiAgICAgICAgICB9KTsKICAgICAgICAgIGdlb21ldHJpZXMucHVzaChnZW9tZXRyeUluc3RhbmNlKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBHZW9tZXRyeVBpcGVsaW5lX2RlZmF1bHQuY29tYmluZUluc3RhbmNlcyhnZW9tZXRyaWVzKVswXTsKICAgICAgICBjb25zdCBib3VuZGluZ1NwaGVyZSA9IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQuZnJvbVBvaW50cyhwb2x5Z29uSGllcmFyY2h5LnBvc2l0aW9ucyk7CiAgICAgICAgcmV0dXJuIG5ldyBHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgICAgIGF0dHJpYnV0ZXM6IGdlb21ldHJ5LmF0dHJpYnV0ZXMsCiAgICAgICAgICBpbmRpY2VzOiBnZW9tZXRyeS5pbmRpY2VzLAogICAgICAgICAgcHJpbWl0aXZlVHlwZTogZ2VvbWV0cnkucHJpbWl0aXZlVHlwZSwKICAgICAgICAgIGJvdW5kaW5nU3BoZXJlCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIENvcGxhbmFyUG9seWdvbk91dGxpbmVHZW9tZXRyeV9kZWZhdWx0ID0gQ29wbGFuYXJQb2x5Z29uT3V0bGluZUdlb21ldHJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlQ29wbGFuYXJQb2x5Z29uT3V0bGluZUdlb21ldHJ5LmpzCiAgdmFyIGNyZWF0ZUNvcGxhbmFyUG9seWdvbk91dGxpbmVHZW9tZXRyeV9leHBvcnRzID0ge307CiAgX19leHBvcnQoY3JlYXRlQ29wbGFuYXJQb2x5Z29uT3V0bGluZUdlb21ldHJ5X2V4cG9ydHMsIHsKICAgIGRlZmF1bHQ6ICgpID0+IGNyZWF0ZUNvcGxhbmFyUG9seWdvbk91dGxpbmVHZW9tZXRyeV9kZWZhdWx0CiAgfSk7CiAgZnVuY3Rpb24gY3JlYXRlQ29wbGFuYXJQb2x5Z29uT3V0bGluZUdlb21ldHJ5KHBvbHlnb25HZW9tZXRyeSwgb2Zmc2V0KSB7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG9mZnNldCkpIHsKICAgICAgcG9seWdvbkdlb21ldHJ5ID0gQ29wbGFuYXJQb2x5Z29uT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQudW5wYWNrKAogICAgICAgIHBvbHlnb25HZW9tZXRyeSwKICAgICAgICBvZmZzZXQKICAgICAgKTsKICAgIH0KICAgIHBvbHlnb25HZW9tZXRyeS5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUocG9seWdvbkdlb21ldHJ5Ll9lbGxpcHNvaWQpOwogICAgcmV0dXJuIENvcGxhbmFyUG9seWdvbk91dGxpbmVHZW9tZXRyeV9kZWZhdWx0LmNyZWF0ZUdlb21ldHJ5KHBvbHlnb25HZW9tZXRyeSk7CiAgfQogIHZhciBjcmVhdGVDb3BsYW5hclBvbHlnb25PdXRsaW5lR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9jcmVhdGVDb3BsYW5hclBvbHlnb25PdXRsaW5lR2VvbWV0cnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZUNvcGxhbmFyUG9seWdvbk91dGxpbmVHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfQ29wbGFuYXJQb2x5Z29uT3V0bGluZUdlb21ldHJ5KCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBjcmVhdGVDb3BsYW5hclBvbHlnb25PdXRsaW5lR2VvbWV0cnlfZGVmYXVsdCA9IGNyZWF0ZUNvcGxhbmFyUG9seWdvbk91dGxpbmVHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0Nvcm5lclR5cGUuanMKICB2YXIgQ29ybmVyVHlwZSwgQ29ybmVyVHlwZV9kZWZhdWx0OwogIHZhciBpbml0X0Nvcm5lclR5cGUgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0Nvcm5lclR5cGUuanMiKCkgewogICAgICBDb3JuZXJUeXBlID0gewogICAgICAgIC8qKgogICAgICAgICAqIDxpbWcgc3JjPSJJbWFnZXMvQ29ybmVyVHlwZVJvdW5kZWQucG5nIiBzdHlsZT0idmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHdpZHRoPSIxODYiIGhlaWdodD0iMTg5IiAvPgogICAgICAgICAqCiAgICAgICAgICogQ29ybmVyIGhhcyBhIHNtb290aCBlZGdlLgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgUk9VTkRFRDogMCwKICAgICAgICAvKioKICAgICAgICAgKiA8aW1nIHNyYz0iSW1hZ2VzL0Nvcm5lclR5cGVNaXRlcmVkLnBuZyIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiB3aWR0aD0iMTg2IiBoZWlnaHQ9IjE4OSIgLz4KICAgICAgICAgKgogICAgICAgICAqIENvcm5lciBwb2ludCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIGFkamFjZW50IGVkZ2VzLgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgTUlURVJFRDogMSwKICAgICAgICAvKioKICAgICAgICAgKiA8aW1nIHNyYz0iSW1hZ2VzL0Nvcm5lclR5cGVCZXZlbGVkLnBuZyIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiB3aWR0aD0iMTg2IiBoZWlnaHQ9IjE4OSIgLz4KICAgICAgICAgKgogICAgICAgICAqIENvcm5lciBpcyBjbGlwcGVkLgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgQkVWRUxFRDogMgogICAgICB9OwogICAgICBDb3JuZXJUeXBlX2RlZmF1bHQgPSBPYmplY3QuZnJlZXplKENvcm5lclR5cGUpOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvRWxsaXBzb2lkR2VvZGVzaWMuanMKICBmdW5jdGlvbiBzZXRDb25zdGFudHMoZWxsaXBzb2lkR2VvZGVzaWMyKSB7CiAgICBjb25zdCB1U3F1YXJlZCA9IGVsbGlwc29pZEdlb2Rlc2ljMi5fdVNxdWFyZWQ7CiAgICBjb25zdCBhMyA9IGVsbGlwc29pZEdlb2Rlc2ljMi5fZWxsaXBzb2lkLm1heGltdW1SYWRpdXM7CiAgICBjb25zdCBiID0gZWxsaXBzb2lkR2VvZGVzaWMyLl9lbGxpcHNvaWQubWluaW11bVJhZGl1czsKICAgIGNvbnN0IGYgPSAoYTMgLSBiKSAvIGEzOwogICAgY29uc3QgY29zaW5lSGVhZGluZyA9IE1hdGguY29zKGVsbGlwc29pZEdlb2Rlc2ljMi5fc3RhcnRIZWFkaW5nKTsKICAgIGNvbnN0IHNpbmVIZWFkaW5nID0gTWF0aC5zaW4oZWxsaXBzb2lkR2VvZGVzaWMyLl9zdGFydEhlYWRpbmcpOwogICAgY29uc3QgdGFuVSA9ICgxIC0gZikgKiBNYXRoLnRhbihlbGxpcHNvaWRHZW9kZXNpYzIuX3N0YXJ0LmxhdGl0dWRlKTsKICAgIGNvbnN0IGNvc2luZVUgPSAxIC8gTWF0aC5zcXJ0KDEgKyB0YW5VICogdGFuVSk7CiAgICBjb25zdCBzaW5lVSA9IGNvc2luZVUgKiB0YW5VOwogICAgY29uc3Qgc2lnbWEgPSBNYXRoLmF0YW4yKHRhblUsIGNvc2luZUhlYWRpbmcpOwogICAgY29uc3Qgc2luZUFscGhhID0gY29zaW5lVSAqIHNpbmVIZWFkaW5nOwogICAgY29uc3Qgc2luZVNxdWFyZWRBbHBoYSA9IHNpbmVBbHBoYSAqIHNpbmVBbHBoYTsKICAgIGNvbnN0IGNvc2luZVNxdWFyZWRBbHBoYSA9IDEgLSBzaW5lU3F1YXJlZEFscGhhOwogICAgY29uc3QgY29zaW5lQWxwaGEgPSBNYXRoLnNxcnQoY29zaW5lU3F1YXJlZEFscGhhKTsKICAgIGNvbnN0IHUyT3ZlcjQgPSB1U3F1YXJlZCAvIDQ7CiAgICBjb25zdCB1NE92ZXIxNiA9IHUyT3ZlcjQgKiB1Mk92ZXI0OwogICAgY29uc3QgdTZPdmVyNjQgPSB1NE92ZXIxNiAqIHUyT3ZlcjQ7CiAgICBjb25zdCB1OE92ZXIyNTYgPSB1NE92ZXIxNiAqIHU0T3ZlcjE2OwogICAgY29uc3QgYTAgPSAxICsgdTJPdmVyNCAtIDMgKiB1NE92ZXIxNiAvIDQgKyA1ICogdTZPdmVyNjQgLyA0IC0gMTc1ICogdThPdmVyMjU2IC8gNjQ7CiAgICBjb25zdCBhMSA9IDEgLSB1Mk92ZXI0ICsgMTUgKiB1NE92ZXIxNiAvIDggLSAzNSAqIHU2T3ZlcjY0IC8gODsKICAgIGNvbnN0IGEyMiA9IDEgLSAzICogdTJPdmVyNCArIDM1ICogdTRPdmVyMTYgLyA0OwogICAgY29uc3QgYTMyID0gMSAtIDUgKiB1Mk92ZXI0OwogICAgY29uc3QgZGlzdGFuY2VSYXRpbyA9IGEwICogc2lnbWEgLSBhMSAqIE1hdGguc2luKDIgKiBzaWdtYSkgKiB1Mk92ZXI0IC8gMiAtIGEyMiAqIE1hdGguc2luKDQgKiBzaWdtYSkgKiB1NE92ZXIxNiAvIDE2IC0gYTMyICogTWF0aC5zaW4oNiAqIHNpZ21hKSAqIHU2T3ZlcjY0IC8gNDggLSBNYXRoLnNpbig4ICogc2lnbWEpICogNSAqIHU4T3ZlcjI1NiAvIDUxMjsKICAgIGNvbnN0IGNvbnN0YW50cyA9IGVsbGlwc29pZEdlb2Rlc2ljMi5fY29uc3RhbnRzOwogICAgY29uc3RhbnRzLmEgPSBhMzsKICAgIGNvbnN0YW50cy5iID0gYjsKICAgIGNvbnN0YW50cy5mID0gZjsKICAgIGNvbnN0YW50cy5jb3NpbmVIZWFkaW5nID0gY29zaW5lSGVhZGluZzsKICAgIGNvbnN0YW50cy5zaW5lSGVhZGluZyA9IHNpbmVIZWFkaW5nOwogICAgY29uc3RhbnRzLnRhblUgPSB0YW5VOwogICAgY29uc3RhbnRzLmNvc2luZVUgPSBjb3NpbmVVOwogICAgY29uc3RhbnRzLnNpbmVVID0gc2luZVU7CiAgICBjb25zdGFudHMuc2lnbWEgPSBzaWdtYTsKICAgIGNvbnN0YW50cy5zaW5lQWxwaGEgPSBzaW5lQWxwaGE7CiAgICBjb25zdGFudHMuc2luZVNxdWFyZWRBbHBoYSA9IHNpbmVTcXVhcmVkQWxwaGE7CiAgICBjb25zdGFudHMuY29zaW5lU3F1YXJlZEFscGhhID0gY29zaW5lU3F1YXJlZEFscGhhOwogICAgY29uc3RhbnRzLmNvc2luZUFscGhhID0gY29zaW5lQWxwaGE7CiAgICBjb25zdGFudHMudTJPdmVyNCA9IHUyT3ZlcjQ7CiAgICBjb25zdGFudHMudTRPdmVyMTYgPSB1NE92ZXIxNjsKICAgIGNvbnN0YW50cy51Nk92ZXI2NCA9IHU2T3ZlcjY0OwogICAgY29uc3RhbnRzLnU4T3ZlcjI1NiA9IHU4T3ZlcjI1NjsKICAgIGNvbnN0YW50cy5hMCA9IGEwOwogICAgY29uc3RhbnRzLmExID0gYTE7CiAgICBjb25zdGFudHMuYTIgPSBhMjI7CiAgICBjb25zdGFudHMuYTMgPSBhMzI7CiAgICBjb25zdGFudHMuZGlzdGFuY2VSYXRpbyA9IGRpc3RhbmNlUmF0aW87CiAgfQogIGZ1bmN0aW9uIGNvbXB1dGVDKGYsIGNvc2luZVNxdWFyZWRBbHBoYSkgewogICAgcmV0dXJuIGYgKiBjb3NpbmVTcXVhcmVkQWxwaGEgKiAoNCArIGYgKiAoNCAtIDMgKiBjb3NpbmVTcXVhcmVkQWxwaGEpKSAvIDE2OwogIH0KICBmdW5jdGlvbiBjb21wdXRlRGVsdGFMYW1iZGEoZiwgc2luZUFscGhhLCBjb3NpbmVTcXVhcmVkQWxwaGEsIHNpZ21hLCBzaW5lU2lnbWEsIGNvc2luZVNpZ21hLCBjb3NpbmVUd2ljZVNpZ21hTWlkcG9pbnQpIHsKICAgIGNvbnN0IEMgPSBjb21wdXRlQyhmLCBjb3NpbmVTcXVhcmVkQWxwaGEpOwogICAgcmV0dXJuICgxIC0gQykgKiBmICogc2luZUFscGhhICogKHNpZ21hICsgQyAqIHNpbmVTaWdtYSAqIChjb3NpbmVUd2ljZVNpZ21hTWlkcG9pbnQgKyBDICogY29zaW5lU2lnbWEgKiAoMiAqIGNvc2luZVR3aWNlU2lnbWFNaWRwb2ludCAqIGNvc2luZVR3aWNlU2lnbWFNaWRwb2ludCAtIDEpKSk7CiAgfQogIGZ1bmN0aW9uIHZpbmNlbnR5SW52ZXJzZUZvcm11bGEoZWxsaXBzb2lkR2VvZGVzaWMyLCBtYWpvciwgbWlub3IsIGZpcnN0TG9uZ2l0dWRlLCBmaXJzdExhdGl0dWRlLCBzZWNvbmRMb25naXR1ZGUsIHNlY29uZExhdGl0dWRlKSB7CiAgICBjb25zdCBlZmYgPSAobWFqb3IgLSBtaW5vcikgLyBtYWpvcjsKICAgIGNvbnN0IGwgPSBzZWNvbmRMb25naXR1ZGUgLSBmaXJzdExvbmdpdHVkZTsKICAgIGNvbnN0IHUxMiA9IE1hdGguYXRhbigoMSAtIGVmZikgKiBNYXRoLnRhbihmaXJzdExhdGl0dWRlKSk7CiAgICBjb25zdCB1MjIgPSBNYXRoLmF0YW4oKDEgLSBlZmYpICogTWF0aC50YW4oc2Vjb25kTGF0aXR1ZGUpKTsKICAgIGNvbnN0IGNvc2luZVUxID0gTWF0aC5jb3ModTEyKTsKICAgIGNvbnN0IHNpbmVVMSA9IE1hdGguc2luKHUxMik7CiAgICBjb25zdCBjb3NpbmVVMiA9IE1hdGguY29zKHUyMik7CiAgICBjb25zdCBzaW5lVTIgPSBNYXRoLnNpbih1MjIpOwogICAgY29uc3QgY2MgPSBjb3NpbmVVMSAqIGNvc2luZVUyOwogICAgY29uc3QgY3MgPSBjb3NpbmVVMSAqIHNpbmVVMjsKICAgIGNvbnN0IHNzID0gc2luZVUxICogc2luZVUyOwogICAgY29uc3Qgc2MgPSBzaW5lVTEgKiBjb3NpbmVVMjsKICAgIGxldCBsYW1iZGEgPSBsOwogICAgbGV0IGxhbWJkYURvdCA9IE1hdGhfZGVmYXVsdC5UV09fUEk7CiAgICBsZXQgY29zaW5lTGFtYmRhID0gTWF0aC5jb3MobGFtYmRhKTsKICAgIGxldCBzaW5lTGFtYmRhID0gTWF0aC5zaW4obGFtYmRhKTsKICAgIGxldCBzaWdtYTsKICAgIGxldCBjb3NpbmVTaWdtYTsKICAgIGxldCBzaW5lU2lnbWE7CiAgICBsZXQgY29zaW5lU3F1YXJlZEFscGhhOwogICAgbGV0IGNvc2luZVR3aWNlU2lnbWFNaWRwb2ludDsKICAgIGRvIHsKICAgICAgY29zaW5lTGFtYmRhID0gTWF0aC5jb3MobGFtYmRhKTsKICAgICAgc2luZUxhbWJkYSA9IE1hdGguc2luKGxhbWJkYSk7CiAgICAgIGNvbnN0IHRlbXAgPSBjcyAtIHNjICogY29zaW5lTGFtYmRhOwogICAgICBzaW5lU2lnbWEgPSBNYXRoLnNxcnQoCiAgICAgICAgY29zaW5lVTIgKiBjb3NpbmVVMiAqIHNpbmVMYW1iZGEgKiBzaW5lTGFtYmRhICsgdGVtcCAqIHRlbXAKICAgICAgKTsKICAgICAgY29zaW5lU2lnbWEgPSBzcyArIGNjICogY29zaW5lTGFtYmRhOwogICAgICBzaWdtYSA9IE1hdGguYXRhbjIoc2luZVNpZ21hLCBjb3NpbmVTaWdtYSk7CiAgICAgIGxldCBzaW5lQWxwaGE7CiAgICAgIGlmIChzaW5lU2lnbWEgPT09IDApIHsKICAgICAgICBzaW5lQWxwaGEgPSAwOwogICAgICAgIGNvc2luZVNxdWFyZWRBbHBoYSA9IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2luZUFscGhhID0gY2MgKiBzaW5lTGFtYmRhIC8gc2luZVNpZ21hOwogICAgICAgIGNvc2luZVNxdWFyZWRBbHBoYSA9IDEgLSBzaW5lQWxwaGEgKiBzaW5lQWxwaGE7CiAgICAgIH0KICAgICAgbGFtYmRhRG90ID0gbGFtYmRhOwogICAgICBjb3NpbmVUd2ljZVNpZ21hTWlkcG9pbnQgPSBjb3NpbmVTaWdtYSAtIDIgKiBzcyAvIGNvc2luZVNxdWFyZWRBbHBoYTsKICAgICAgaWYgKCFpc0Zpbml0ZShjb3NpbmVUd2ljZVNpZ21hTWlkcG9pbnQpKSB7CiAgICAgICAgY29zaW5lVHdpY2VTaWdtYU1pZHBvaW50ID0gMDsKICAgICAgfQogICAgICBsYW1iZGEgPSBsICsgY29tcHV0ZURlbHRhTGFtYmRhKAogICAgICAgIGVmZiwKICAgICAgICBzaW5lQWxwaGEsCiAgICAgICAgY29zaW5lU3F1YXJlZEFscGhhLAogICAgICAgIHNpZ21hLAogICAgICAgIHNpbmVTaWdtYSwKICAgICAgICBjb3NpbmVTaWdtYSwKICAgICAgICBjb3NpbmVUd2ljZVNpZ21hTWlkcG9pbnQKICAgICAgKTsKICAgIH0gd2hpbGUgKE1hdGguYWJzKGxhbWJkYSAtIGxhbWJkYURvdCkgPiBNYXRoX2RlZmF1bHQuRVBTSUxPTjEyKTsKICAgIGNvbnN0IHVTcXVhcmVkID0gY29zaW5lU3F1YXJlZEFscGhhICogKG1ham9yICogbWFqb3IgLSBtaW5vciAqIG1pbm9yKSAvIChtaW5vciAqIG1pbm9yKTsKICAgIGNvbnN0IEEgPSAxICsgdVNxdWFyZWQgKiAoNDA5NiArIHVTcXVhcmVkICogKHVTcXVhcmVkICogKDMyMCAtIDE3NSAqIHVTcXVhcmVkKSAtIDc2OCkpIC8gMTYzODQ7CiAgICBjb25zdCBCID0gdVNxdWFyZWQgKiAoMjU2ICsgdVNxdWFyZWQgKiAodVNxdWFyZWQgKiAoNzQgLSA0NyAqIHVTcXVhcmVkKSAtIDEyOCkpIC8gMTAyNDsKICAgIGNvbnN0IGNvc2luZVNxdWFyZWRUd2ljZVNpZ21hTWlkcG9pbnQgPSBjb3NpbmVUd2ljZVNpZ21hTWlkcG9pbnQgKiBjb3NpbmVUd2ljZVNpZ21hTWlkcG9pbnQ7CiAgICBjb25zdCBkZWx0YVNpZ21hID0gQiAqIHNpbmVTaWdtYSAqIChjb3NpbmVUd2ljZVNpZ21hTWlkcG9pbnQgKyBCICogKGNvc2luZVNpZ21hICogKDIgKiBjb3NpbmVTcXVhcmVkVHdpY2VTaWdtYU1pZHBvaW50IC0gMSkgLSBCICogY29zaW5lVHdpY2VTaWdtYU1pZHBvaW50ICogKDQgKiBzaW5lU2lnbWEgKiBzaW5lU2lnbWEgLSAzKSAqICg0ICogY29zaW5lU3F1YXJlZFR3aWNlU2lnbWFNaWRwb2ludCAtIDMpIC8gNikgLyA0KTsKICAgIGNvbnN0IGRpc3RhbmNlID0gbWlub3IgKiBBICogKHNpZ21hIC0gZGVsdGFTaWdtYSk7CiAgICBjb25zdCBzdGFydEhlYWRpbmcgPSBNYXRoLmF0YW4yKAogICAgICBjb3NpbmVVMiAqIHNpbmVMYW1iZGEsCiAgICAgIGNzIC0gc2MgKiBjb3NpbmVMYW1iZGEKICAgICk7CiAgICBjb25zdCBlbmRIZWFkaW5nID0gTWF0aC5hdGFuMihjb3NpbmVVMSAqIHNpbmVMYW1iZGEsIGNzICogY29zaW5lTGFtYmRhIC0gc2MpOwogICAgZWxsaXBzb2lkR2VvZGVzaWMyLl9kaXN0YW5jZSA9IGRpc3RhbmNlOwogICAgZWxsaXBzb2lkR2VvZGVzaWMyLl9zdGFydEhlYWRpbmcgPSBzdGFydEhlYWRpbmc7CiAgICBlbGxpcHNvaWRHZW9kZXNpYzIuX2VuZEhlYWRpbmcgPSBlbmRIZWFkaW5nOwogICAgZWxsaXBzb2lkR2VvZGVzaWMyLl91U3F1YXJlZCA9IHVTcXVhcmVkOwogIH0KICBmdW5jdGlvbiBjb21wdXRlUHJvcGVydGllczIoZWxsaXBzb2lkR2VvZGVzaWMyLCBzdGFydCwgZW5kLCBlbGxpcHNvaWQpIHsKICAgIGNvbnN0IGZpcnN0Q2FydGVzaWFuID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKHN0YXJ0LCBzY3JhdGNoQ2FydDIyKSwKICAgICAgc2NyYXRjaENhcnQxMgogICAgKTsKICAgIGNvbnN0IGxhc3RDYXJ0ZXNpYW4gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKAogICAgICBlbGxpcHNvaWQuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oZW5kLCBzY3JhdGNoQ2FydDIyKSwKICAgICAgc2NyYXRjaENhcnQyMgogICAgKTsKICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKAogICAgICAidmFsdWUiLAogICAgICBNYXRoLmFicygKICAgICAgICBNYXRoLmFicyhDYXJ0ZXNpYW4zX2RlZmF1bHQuYW5nbGVCZXR3ZWVuKGZpcnN0Q2FydGVzaWFuLCBsYXN0Q2FydGVzaWFuKSkgLSBNYXRoLlBJCiAgICAgICksCiAgICAgIDAuMDEyNQogICAgKTsKICAgIHZpbmNlbnR5SW52ZXJzZUZvcm11bGEoCiAgICAgIGVsbGlwc29pZEdlb2Rlc2ljMiwKICAgICAgZWxsaXBzb2lkLm1heGltdW1SYWRpdXMsCiAgICAgIGVsbGlwc29pZC5taW5pbXVtUmFkaXVzLAogICAgICBzdGFydC5sb25naXR1ZGUsCiAgICAgIHN0YXJ0LmxhdGl0dWRlLAogICAgICBlbmQubG9uZ2l0dWRlLAogICAgICBlbmQubGF0aXR1ZGUKICAgICk7CiAgICBlbGxpcHNvaWRHZW9kZXNpYzIuX3N0YXJ0ID0gQ2FydG9ncmFwaGljX2RlZmF1bHQuY2xvbmUoCiAgICAgIHN0YXJ0LAogICAgICBlbGxpcHNvaWRHZW9kZXNpYzIuX3N0YXJ0CiAgICApOwogICAgZWxsaXBzb2lkR2VvZGVzaWMyLl9lbmQgPSBDYXJ0b2dyYXBoaWNfZGVmYXVsdC5jbG9uZShlbmQsIGVsbGlwc29pZEdlb2Rlc2ljMi5fZW5kKTsKICAgIGVsbGlwc29pZEdlb2Rlc2ljMi5fc3RhcnQuaGVpZ2h0ID0gMDsKICAgIGVsbGlwc29pZEdlb2Rlc2ljMi5fZW5kLmhlaWdodCA9IDA7CiAgICBzZXRDb25zdGFudHMoZWxsaXBzb2lkR2VvZGVzaWMyKTsKICB9CiAgZnVuY3Rpb24gRWxsaXBzb2lkR2VvZGVzaWMoc3RhcnQsIGVuZCwgZWxsaXBzb2lkKSB7CiAgICBjb25zdCBlID0gZWxsaXBzb2lkID8/IEVsbGlwc29pZF9kZWZhdWx0LmRlZmF1bHQ7CiAgICB0aGlzLl9lbGxpcHNvaWQgPSBlOwogICAgdGhpcy5fc3RhcnQgPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgIHRoaXMuX2VuZCA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgdGhpcy5fY29uc3RhbnRzID0ge307CiAgICB0aGlzLl9zdGFydEhlYWRpbmcgPSB2b2lkIDA7CiAgICB0aGlzLl9lbmRIZWFkaW5nID0gdm9pZCAwOwogICAgdGhpcy5fZGlzdGFuY2UgPSB2b2lkIDA7CiAgICB0aGlzLl91U3F1YXJlZCA9IHZvaWQgMDsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoc3RhcnQpICYmIGRlZmluZWRfZGVmYXVsdChlbmQpKSB7CiAgICAgIGNvbXB1dGVQcm9wZXJ0aWVzMih0aGlzLCBzdGFydCwgZW5kLCBlKTsKICAgIH0KICB9CiAgdmFyIHNjcmF0Y2hDYXJ0MTIsIHNjcmF0Y2hDYXJ0MjIsIEVsbGlwc29pZEdlb2Rlc2ljX2RlZmF1bHQ7CiAgdmFyIGluaXRfRWxsaXBzb2lkR2VvZGVzaWMgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0VsbGlwc29pZEdlb2Rlc2ljLmpzIigpIHsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2FydG9ncmFwaGljKCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBzY3JhdGNoQ2FydDEyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydDIyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhFbGxpcHNvaWRHZW9kZXNpYy5wcm90b3R5cGUsIHsKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBlbGxpcHNvaWQuCiAgICAgICAgICogQG1lbWJlcm9mIEVsbGlwc29pZEdlb2Rlc2ljLnByb3RvdHlwZQogICAgICAgICAqIEB0eXBlIHtFbGxpcHNvaWR9CiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICovCiAgICAgICAgZWxsaXBzb2lkOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxsaXBzb2lkOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgc3VyZmFjZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHBvaW50CiAgICAgICAgICogQG1lbWJlcm9mIEVsbGlwc29pZEdlb2Rlc2ljLnByb3RvdHlwZQogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICovCiAgICAgICAgc3VyZmFjZURpc3RhbmNlOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImRpc3RhbmNlIiwgdGhpcy5fZGlzdGFuY2UpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fZGlzdGFuY2U7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBpbml0aWFsIHBsYW5ldG9kZXRpYyBwb2ludCBvbiB0aGUgcGF0aC4KICAgICAgICAgKiBAbWVtYmVyb2YgRWxsaXBzb2lkR2VvZGVzaWMucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge0NhcnRvZ3JhcGhpY30KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKi8KICAgICAgICBzdGFydDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0OwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZmluYWwgcGxhbmV0b2RldGljIHBvaW50IG9uIHRoZSBwYXRoLgogICAgICAgICAqIEBtZW1iZXJvZiBFbGxpcHNvaWRHZW9kZXNpYy5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7Q2FydG9ncmFwaGljfQogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqLwogICAgICAgIGVuZDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VuZDsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGhlYWRpbmcgYXQgdGhlIGluaXRpYWwgcG9pbnQuCiAgICAgICAgICogQG1lbWJlcm9mIEVsbGlwc29pZEdlb2Rlc2ljLnByb3RvdHlwZQogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICovCiAgICAgICAgc3RhcnRIZWFkaW5nOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImRpc3RhbmNlIiwgdGhpcy5fZGlzdGFuY2UpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhcnRIZWFkaW5nOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgaGVhZGluZyBhdCB0aGUgZmluYWwgcG9pbnQuCiAgICAgICAgICogQG1lbWJlcm9mIEVsbGlwc29pZEdlb2Rlc2ljLnByb3RvdHlwZQogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICovCiAgICAgICAgZW5kSGVhZGluZzogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJkaXN0YW5jZSIsIHRoaXMuX2Rpc3RhbmNlKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VuZEhlYWRpbmc7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgRWxsaXBzb2lkR2VvZGVzaWMucHJvdG90eXBlLnNldEVuZFBvaW50cyA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoInN0YXJ0Iiwgc3RhcnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiZW5kIiwgZW5kKTsKICAgICAgICBjb21wdXRlUHJvcGVydGllczIodGhpcywgc3RhcnQsIGVuZCwgdGhpcy5fZWxsaXBzb2lkKTsKICAgICAgfTsKICAgICAgRWxsaXBzb2lkR2VvZGVzaWMucHJvdG90eXBlLmludGVycG9sYXRlVXNpbmdGcmFjdGlvbiA9IGZ1bmN0aW9uKGZyYWN0aW9uLCByZXN1bHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZVVzaW5nU3VyZmFjZURpc3RhbmNlKAogICAgICAgICAgdGhpcy5fZGlzdGFuY2UgKiBmcmFjdGlvbiwKICAgICAgICAgIHJlc3VsdAogICAgICAgICk7CiAgICAgIH07CiAgICAgIEVsbGlwc29pZEdlb2Rlc2ljLnByb3RvdHlwZS5pbnRlcnBvbGF0ZVVzaW5nU3VyZmFjZURpc3RhbmNlID0gZnVuY3Rpb24oZGlzdGFuY2UsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiZGlzdGFuY2UiLCB0aGlzLl9kaXN0YW5jZSk7CiAgICAgICAgY29uc3QgY29uc3RhbnRzID0gdGhpcy5fY29uc3RhbnRzOwogICAgICAgIGNvbnN0IHMgPSBjb25zdGFudHMuZGlzdGFuY2VSYXRpbyArIGRpc3RhbmNlIC8gY29uc3RhbnRzLmI7CiAgICAgICAgY29uc3QgY29zaW5lMlMgPSBNYXRoLmNvcygyICogcyk7CiAgICAgICAgY29uc3QgY29zaW5lNFMgPSBNYXRoLmNvcyg0ICogcyk7CiAgICAgICAgY29uc3QgY29zaW5lNlMgPSBNYXRoLmNvcyg2ICogcyk7CiAgICAgICAgY29uc3Qgc2luZTJTID0gTWF0aC5zaW4oMiAqIHMpOwogICAgICAgIGNvbnN0IHNpbmU0UyA9IE1hdGguc2luKDQgKiBzKTsKICAgICAgICBjb25zdCBzaW5lNlMgPSBNYXRoLnNpbig2ICogcyk7CiAgICAgICAgY29uc3Qgc2luZThTID0gTWF0aC5zaW4oOCAqIHMpOwogICAgICAgIGNvbnN0IHMyID0gcyAqIHM7CiAgICAgICAgY29uc3QgczMgPSBzICogczI7CiAgICAgICAgY29uc3QgdThPdmVyMjU2ID0gY29uc3RhbnRzLnU4T3ZlcjI1NjsKICAgICAgICBjb25zdCB1Mk92ZXI0ID0gY29uc3RhbnRzLnUyT3ZlcjQ7CiAgICAgICAgY29uc3QgdTZPdmVyNjQgPSBjb25zdGFudHMudTZPdmVyNjQ7CiAgICAgICAgY29uc3QgdTRPdmVyMTYgPSBjb25zdGFudHMudTRPdmVyMTY7CiAgICAgICAgbGV0IHNpZ21hID0gMiAqIHMzICogdThPdmVyMjU2ICogY29zaW5lMlMgLyAzICsgcyAqICgxIC0gdTJPdmVyNCArIDcgKiB1NE92ZXIxNiAvIDQgLSAxNSAqIHU2T3ZlcjY0IC8gNCArIDU3OSAqIHU4T3ZlcjI1NiAvIDY0IC0gKHU0T3ZlcjE2IC0gMTUgKiB1Nk92ZXI2NCAvIDQgKyAxODcgKiB1OE92ZXIyNTYgLyAxNikgKiBjb3NpbmUyUyAtICg1ICogdTZPdmVyNjQgLyA0IC0gMTE1ICogdThPdmVyMjU2IC8gMTYpICogY29zaW5lNFMgLSAyOSAqIHU4T3ZlcjI1NiAqIGNvc2luZTZTIC8gMTYpICsgKHUyT3ZlcjQgLyAyIC0gdTRPdmVyMTYgKyA3MSAqIHU2T3ZlcjY0IC8gMzIgLSA4NSAqIHU4T3ZlcjI1NiAvIDE2KSAqIHNpbmUyUyArICg1ICogdTRPdmVyMTYgLyAxNiAtIDUgKiB1Nk92ZXI2NCAvIDQgKyAzODMgKiB1OE92ZXIyNTYgLyA5NikgKiBzaW5lNFMgLSBzMiAqICgodTZPdmVyNjQgLSAxMSAqIHU4T3ZlcjI1NiAvIDIpICogc2luZTJTICsgNSAqIHU4T3ZlcjI1NiAqIHNpbmU0UyAvIDIpICsgKDI5ICogdTZPdmVyNjQgLyA5NiAtIDI5ICogdThPdmVyMjU2IC8gMTYpICogc2luZTZTICsgNTM5ICogdThPdmVyMjU2ICogc2luZThTIC8gMTUzNjsKICAgICAgICBjb25zdCB0aGV0YSA9IE1hdGguYXNpbihNYXRoLnNpbihzaWdtYSkgKiBjb25zdGFudHMuY29zaW5lQWxwaGEpOwogICAgICAgIGNvbnN0IGxhdGl0dWRlID0gTWF0aC5hdGFuKGNvbnN0YW50cy5hIC8gY29uc3RhbnRzLmIgKiBNYXRoLnRhbih0aGV0YSkpOwogICAgICAgIHNpZ21hID0gc2lnbWEgLSBjb25zdGFudHMuc2lnbWE7CiAgICAgICAgY29uc3QgY29zaW5lVHdpY2VTaWdtYU1pZHBvaW50ID0gTWF0aC5jb3MoMiAqIGNvbnN0YW50cy5zaWdtYSArIHNpZ21hKTsKICAgICAgICBjb25zdCBzaW5lU2lnbWEgPSBNYXRoLnNpbihzaWdtYSk7CiAgICAgICAgY29uc3QgY29zaW5lU2lnbWEgPSBNYXRoLmNvcyhzaWdtYSk7CiAgICAgICAgY29uc3QgY2MgPSBjb25zdGFudHMuY29zaW5lVSAqIGNvc2luZVNpZ21hOwogICAgICAgIGNvbnN0IHNzID0gY29uc3RhbnRzLnNpbmVVICogc2luZVNpZ21hOwogICAgICAgIGNvbnN0IGxhbWJkYSA9IE1hdGguYXRhbjIoCiAgICAgICAgICBzaW5lU2lnbWEgKiBjb25zdGFudHMuc2luZUhlYWRpbmcsCiAgICAgICAgICBjYyAtIHNzICogY29uc3RhbnRzLmNvc2luZUhlYWRpbmcKICAgICAgICApOwogICAgICAgIGNvbnN0IGwgPSBsYW1iZGEgLSBjb21wdXRlRGVsdGFMYW1iZGEoCiAgICAgICAgICBjb25zdGFudHMuZiwKICAgICAgICAgIGNvbnN0YW50cy5zaW5lQWxwaGEsCiAgICAgICAgICBjb25zdGFudHMuY29zaW5lU3F1YXJlZEFscGhhLAogICAgICAgICAgc2lnbWEsCiAgICAgICAgICBzaW5lU2lnbWEsCiAgICAgICAgICBjb3NpbmVTaWdtYSwKICAgICAgICAgIGNvc2luZVR3aWNlU2lnbWFNaWRwb2ludAogICAgICAgICk7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQubG9uZ2l0dWRlID0gdGhpcy5fc3RhcnQubG9uZ2l0dWRlICsgbDsKICAgICAgICAgIHJlc3VsdC5sYXRpdHVkZSA9IGxhdGl0dWRlOwogICAgICAgICAgcmVzdWx0LmhlaWdodCA9IDA7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KHRoaXMuX3N0YXJ0LmxvbmdpdHVkZSArIGwsIGxhdGl0dWRlLCAwKTsKICAgICAgfTsKICAgICAgRWxsaXBzb2lkR2VvZGVzaWNfZGVmYXVsdCA9IEVsbGlwc29pZEdlb2Rlc2ljOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUG9seWxpbmVQaXBlbGluZS5qcwogIGZ1bmN0aW9uIHN1YmRpdmlkZUhlaWdodHMobnVtUG9pbnRzLCBoMCwgaDEpIHsKICAgIGNvbnN0IGhlaWdodHMgPSBzdWJkaXZpZGVIZWlnaHRzU2NyYXRjaEFycmF5OwogICAgaGVpZ2h0cy5sZW5ndGggPSBudW1Qb2ludHM7CiAgICBsZXQgaTsKICAgIGlmIChoMCA9PT0gaDEpIHsKICAgICAgZm9yIChpID0gMDsgaSA8IG51bVBvaW50czsgaSsrKSB7CiAgICAgICAgaGVpZ2h0c1tpXSA9IGgwOwogICAgICB9CiAgICAgIHJldHVybiBoZWlnaHRzOwogICAgfQogICAgY29uc3QgZEhlaWdodCA9IGgxIC0gaDA7CiAgICBjb25zdCBoZWlnaHRQZXJWZXJ0ZXggPSBkSGVpZ2h0IC8gbnVtUG9pbnRzOwogICAgZm9yIChpID0gMDsgaSA8IG51bVBvaW50czsgaSsrKSB7CiAgICAgIGNvbnN0IGggPSBoMCArIGkgKiBoZWlnaHRQZXJWZXJ0ZXg7CiAgICAgIGhlaWdodHNbaV0gPSBoOwogICAgfQogICAgcmV0dXJuIGhlaWdodHM7CiAgfQogIGZ1bmN0aW9uIGdlbmVyYXRlQ2FydGVzaWFuQXJjKHAwLCBwMSwgbWluRGlzdGFuY2UsIGVsbGlwc29pZCwgaDAsIGgxLCBhcnJheSwgb2Zmc2V0KSB7CiAgICBjb25zdCBmaXJzdCA9IGVsbGlwc29pZC5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKHAwLCBzY2FsZUZpcnN0KTsKICAgIGNvbnN0IGxhc3QgPSBlbGxpcHNvaWQuc2NhbGVUb0dlb2RldGljU3VyZmFjZShwMSwgc2NhbGVMYXN0KTsKICAgIGNvbnN0IG51bVBvaW50cyA9IFBvbHlsaW5lUGlwZWxpbmUubnVtYmVyT2ZQb2ludHMocDAsIHAxLCBtaW5EaXN0YW5jZSk7CiAgICBjb25zdCBzdGFydCA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhmaXJzdCwgY2FydG8xKTsKICAgIGNvbnN0IGVuZCA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhsYXN0LCBjYXJ0bzIpOwogICAgY29uc3QgaGVpZ2h0cyA9IHN1YmRpdmlkZUhlaWdodHMobnVtUG9pbnRzLCBoMCwgaDEpOwogICAgZWxsaXBzb2lkR2VvZGVzaWMuc2V0RW5kUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgY29uc3Qgc3VyZmFjZURpc3RhbmNlQmV0d2VlblBvaW50cyA9IGVsbGlwc29pZEdlb2Rlc2ljLnN1cmZhY2VEaXN0YW5jZSAvIG51bVBvaW50czsKICAgIGxldCBpbmRleCA9IG9mZnNldDsKICAgIHN0YXJ0LmhlaWdodCA9IGgwOwogICAgbGV0IGNhcnQgPSBlbGxpcHNvaWQuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oc3RhcnQsIGNhcnRlc2lhbik7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayhjYXJ0LCBhcnJheSwgaW5kZXgpOwogICAgaW5kZXggKz0gMzsKICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbnVtUG9pbnRzOyBpKyspIHsKICAgICAgY29uc3QgY2FydG8gPSBlbGxpcHNvaWRHZW9kZXNpYy5pbnRlcnBvbGF0ZVVzaW5nU3VyZmFjZURpc3RhbmNlKAogICAgICAgIGkgKiBzdXJmYWNlRGlzdGFuY2VCZXR3ZWVuUG9pbnRzLAogICAgICAgIGNhcnRvMgogICAgICApOwogICAgICBjYXJ0by5oZWlnaHQgPSBoZWlnaHRzW2ldOwogICAgICBjYXJ0ID0gZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGNhcnRvLCBjYXJ0ZXNpYW4pOwogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayhjYXJ0LCBhcnJheSwgaW5kZXgpOwogICAgICBpbmRleCArPSAzOwogICAgfQogICAgcmV0dXJuIGluZGV4OwogIH0KICBmdW5jdGlvbiBnZW5lcmF0ZUNhcnRlc2lhblJodW1iQXJjKHAwLCBwMSwgZ3JhbnVsYXJpdHksIGVsbGlwc29pZCwgaDAsIGgxLCBhcnJheSwgb2Zmc2V0KSB7CiAgICBjb25zdCBzdGFydCA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhwMCwgY2FydG8xKTsKICAgIGNvbnN0IGVuZCA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhwMSwgY2FydG8yKTsKICAgIGNvbnN0IG51bVBvaW50cyA9IFBvbHlsaW5lUGlwZWxpbmUubnVtYmVyT2ZQb2ludHNSaHVtYkxpbmUoCiAgICAgIHN0YXJ0LAogICAgICBlbmQsCiAgICAgIGdyYW51bGFyaXR5CiAgICApOwogICAgc3RhcnQuaGVpZ2h0ID0gMDsKICAgIGVuZC5oZWlnaHQgPSAwOwogICAgY29uc3QgaGVpZ2h0cyA9IHN1YmRpdmlkZUhlaWdodHMobnVtUG9pbnRzLCBoMCwgaDEpOwogICAgaWYgKCFlbGxpcHNvaWRSaHVtYi5lbGxpcHNvaWQuZXF1YWxzKGVsbGlwc29pZCkpIHsKICAgICAgZWxsaXBzb2lkUmh1bWIgPSBuZXcgRWxsaXBzb2lkUmh1bWJMaW5lX2RlZmF1bHQodm9pZCAwLCB2b2lkIDAsIGVsbGlwc29pZCk7CiAgICB9CiAgICBlbGxpcHNvaWRSaHVtYi5zZXRFbmRQb2ludHMoc3RhcnQsIGVuZCk7CiAgICBjb25zdCBzdXJmYWNlRGlzdGFuY2VCZXR3ZWVuUG9pbnRzID0gZWxsaXBzb2lkUmh1bWIuc3VyZmFjZURpc3RhbmNlIC8gbnVtUG9pbnRzOwogICAgbGV0IGluZGV4ID0gb2Zmc2V0OwogICAgc3RhcnQuaGVpZ2h0ID0gaDA7CiAgICBsZXQgY2FydCA9IGVsbGlwc29pZC5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihzdGFydCwgY2FydGVzaWFuKTsKICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKGNhcnQsIGFycmF5LCBpbmRleCk7CiAgICBpbmRleCArPSAzOwogICAgZm9yIChsZXQgaSA9IDE7IGkgPCBudW1Qb2ludHM7IGkrKykgewogICAgICBjb25zdCBjYXJ0byA9IGVsbGlwc29pZFJodW1iLmludGVycG9sYXRlVXNpbmdTdXJmYWNlRGlzdGFuY2UoCiAgICAgICAgaSAqIHN1cmZhY2VEaXN0YW5jZUJldHdlZW5Qb2ludHMsCiAgICAgICAgY2FydG8yCiAgICAgICk7CiAgICAgIGNhcnRvLmhlaWdodCA9IGhlaWdodHNbaV07CiAgICAgIGNhcnQgPSBlbGxpcHNvaWQuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oY2FydG8sIGNhcnRlc2lhbik7CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKGNhcnQsIGFycmF5LCBpbmRleCk7CiAgICAgIGluZGV4ICs9IDM7CiAgICB9CiAgICByZXR1cm4gaW5kZXg7CiAgfQogIHZhciBQb2x5bGluZVBpcGVsaW5lLCBjYXJ0b1NjcmF0Y2gsIHdyYXBMb25naXR1ZGVJbnZlcnNNYXRyaXgsIHdyYXBMb25naXR1ZGVPcmlnaW4sIHdyYXBMb25naXR1ZGVYWk5vcm1hbCwgd3JhcExvbmdpdHVkZVhaUGxhbmUsIHdyYXBMb25naXR1ZGVZWk5vcm1hbCwgd3JhcExvbmdpdHVkZVlaUGxhbmUsIHdyYXBMb25naXR1ZGVJbnRlcnNlY3Rpb24sIHdyYXBMb25naXR1ZGVPZmZzZXQsIHN1YmRpdmlkZUhlaWdodHNTY3JhdGNoQXJyYXksIGNhcnRvMSwgY2FydG8yLCBjYXJ0ZXNpYW4sIHNjYWxlRmlyc3QsIHNjYWxlTGFzdCwgZWxsaXBzb2lkR2VvZGVzaWMsIGVsbGlwc29pZFJodW1iLCBzY3JhdGNoQ2FydG9ncmFwaGljMDIsIHNjcmF0Y2hDYXJ0b2dyYXBoaWMxMiwgUG9seWxpbmVQaXBlbGluZV9kZWZhdWx0OwogIHZhciBpbml0X1BvbHlsaW5lUGlwZWxpbmUgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1BvbHlsaW5lUGlwZWxpbmUuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DYXJ0b2dyYXBoaWMoKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9FbGxpcHNvaWRHZW9kZXNpYygpOwogICAgICBpbml0X0VsbGlwc29pZFJodW1iTGluZSgpOwogICAgICBpbml0X0ludGVyc2VjdGlvblRlc3RzKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBpbml0X01hdHJpeDQoKTsKICAgICAgaW5pdF9QbGFuZSgpOwogICAgICBQb2x5bGluZVBpcGVsaW5lID0ge307CiAgICAgIFBvbHlsaW5lUGlwZWxpbmUubnVtYmVyT2ZQb2ludHMgPSBmdW5jdGlvbihwMCwgcDEsIG1pbkRpc3RhbmNlKSB7CiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZGlzdGFuY2UocDAsIHAxKTsKICAgICAgICByZXR1cm4gTWF0aC5jZWlsKGRpc3RhbmNlIC8gbWluRGlzdGFuY2UpOwogICAgICB9OwogICAgICBQb2x5bGluZVBpcGVsaW5lLm51bWJlck9mUG9pbnRzUmh1bWJMaW5lID0gZnVuY3Rpb24ocDAsIHAxLCBncmFudWxhcml0eSkgewogICAgICAgIGNvbnN0IHJhZGlhbnNEaXN0YW5jZVNxdWFyZWQgPSBNYXRoLnBvdyhwMC5sb25naXR1ZGUgLSBwMS5sb25naXR1ZGUsIDIpICsgTWF0aC5wb3cocDAubGF0aXR1ZGUgLSBwMS5sYXRpdHVkZSwgMik7CiAgICAgICAgcmV0dXJuIE1hdGgubWF4KAogICAgICAgICAgMSwKICAgICAgICAgIE1hdGguY2VpbChNYXRoLnNxcnQocmFkaWFuc0Rpc3RhbmNlU3F1YXJlZCAvIChncmFudWxhcml0eSAqIGdyYW51bGFyaXR5KSkpCiAgICAgICAgKTsKICAgICAgfTsKICAgICAgY2FydG9TY3JhdGNoID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIFBvbHlsaW5lUGlwZWxpbmUuZXh0cmFjdEhlaWdodHMgPSBmdW5jdGlvbihwb3NpdGlvbnMsIGVsbGlwc29pZCkgewogICAgICAgIGNvbnN0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgY29uc3QgaGVpZ2h0cyA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHAgPSBwb3NpdGlvbnNbaV07CiAgICAgICAgICBoZWlnaHRzW2ldID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHAsIGNhcnRvU2NyYXRjaCkuaGVpZ2h0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gaGVpZ2h0czsKICAgICAgfTsKICAgICAgd3JhcExvbmdpdHVkZUludmVyc01hdHJpeCA9IG5ldyBNYXRyaXg0X2RlZmF1bHQoKTsKICAgICAgd3JhcExvbmdpdHVkZU9yaWdpbiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgd3JhcExvbmdpdHVkZVhaTm9ybWFsID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICB3cmFwTG9uZ2l0dWRlWFpQbGFuZSA9IG5ldyBQbGFuZV9kZWZhdWx0KENhcnRlc2lhbjNfZGVmYXVsdC5VTklUX1gsIDApOwogICAgICB3cmFwTG9uZ2l0dWRlWVpOb3JtYWwgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHdyYXBMb25naXR1ZGVZWlBsYW5lID0gbmV3IFBsYW5lX2RlZmF1bHQoQ2FydGVzaWFuM19kZWZhdWx0LlVOSVRfWCwgMCk7CiAgICAgIHdyYXBMb25naXR1ZGVJbnRlcnNlY3Rpb24gPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHdyYXBMb25naXR1ZGVPZmZzZXQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHN1YmRpdmlkZUhlaWdodHNTY3JhdGNoQXJyYXkgPSBbXTsKICAgICAgY2FydG8xID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIGNhcnRvMiA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBjYXJ0ZXNpYW4gPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjYWxlRmlyc3QgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjYWxlTGFzdCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgZWxsaXBzb2lkR2VvZGVzaWMgPSBuZXcgRWxsaXBzb2lkR2VvZGVzaWNfZGVmYXVsdCgpOwogICAgICBlbGxpcHNvaWRSaHVtYiA9IG5ldyBFbGxpcHNvaWRSaHVtYkxpbmVfZGVmYXVsdCgpOwogICAgICBQb2x5bGluZVBpcGVsaW5lLndyYXBMb25naXR1ZGUgPSBmdW5jdGlvbihwb3NpdGlvbnMsIG1vZGVsTWF0cml4KSB7CiAgICAgICAgY29uc3QgY2FydGVzaWFucyA9IFtdOwogICAgICAgIGNvbnN0IHNlZ21lbnRzID0gW107CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChwb3NpdGlvbnMpICYmIHBvc2l0aW9ucy5sZW5ndGggPiAwKSB7CiAgICAgICAgICBtb2RlbE1hdHJpeCA9IG1vZGVsTWF0cml4ID8/IE1hdHJpeDRfZGVmYXVsdC5JREVOVElUWTsKICAgICAgICAgIGNvbnN0IGludmVyc2VNb2RlbE1hdHJpeCA9IE1hdHJpeDRfZGVmYXVsdC5pbnZlcnNlVHJhbnNmb3JtYXRpb24oCiAgICAgICAgICAgIG1vZGVsTWF0cml4LAogICAgICAgICAgICB3cmFwTG9uZ2l0dWRlSW52ZXJzTWF0cml4CiAgICAgICAgICApOwogICAgICAgICAgY29uc3Qgb3JpZ2luID0gTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5QnlQb2ludCgKICAgICAgICAgICAgaW52ZXJzZU1vZGVsTWF0cml4LAogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTywKICAgICAgICAgICAgd3JhcExvbmdpdHVkZU9yaWdpbgogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IHh6Tm9ybWFsID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgICAgICAgTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5QnlQb2ludEFzVmVjdG9yKAogICAgICAgICAgICAgIGludmVyc2VNb2RlbE1hdHJpeCwKICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9ZLAogICAgICAgICAgICAgIHdyYXBMb25naXR1ZGVYWk5vcm1hbAogICAgICAgICAgICApLAogICAgICAgICAgICB3cmFwTG9uZ2l0dWRlWFpOb3JtYWwKICAgICAgICAgICk7CiAgICAgICAgICBjb25zdCB4elBsYW5lMiA9IFBsYW5lX2RlZmF1bHQuZnJvbVBvaW50Tm9ybWFsKAogICAgICAgICAgICBvcmlnaW4sCiAgICAgICAgICAgIHh6Tm9ybWFsLAogICAgICAgICAgICB3cmFwTG9uZ2l0dWRlWFpQbGFuZQogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IHl6Tm9ybWFsID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgICAgICAgTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5QnlQb2ludEFzVmVjdG9yKAogICAgICAgICAgICAgIGludmVyc2VNb2RlbE1hdHJpeCwKICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9YLAogICAgICAgICAgICAgIHdyYXBMb25naXR1ZGVZWk5vcm1hbAogICAgICAgICAgICApLAogICAgICAgICAgICB3cmFwTG9uZ2l0dWRlWVpOb3JtYWwKICAgICAgICAgICk7CiAgICAgICAgICBjb25zdCB5elBsYW5lID0gUGxhbmVfZGVmYXVsdC5mcm9tUG9pbnROb3JtYWwoCiAgICAgICAgICAgIG9yaWdpbiwKICAgICAgICAgICAgeXpOb3JtYWwsCiAgICAgICAgICAgIHdyYXBMb25naXR1ZGVZWlBsYW5lCiAgICAgICAgICApOwogICAgICAgICAgbGV0IGNvdW50ID0gMTsKICAgICAgICAgIGNhcnRlc2lhbnMucHVzaChDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUocG9zaXRpb25zWzBdKSk7CiAgICAgICAgICBsZXQgcHJldiA9IGNhcnRlc2lhbnNbMF07CiAgICAgICAgICBjb25zdCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgICBjb25zdCBjdXIgPSBwb3NpdGlvbnNbaV07CiAgICAgICAgICAgIGlmIChQbGFuZV9kZWZhdWx0LmdldFBvaW50RGlzdGFuY2UoeXpQbGFuZSwgcHJldikgPCAwIHx8IFBsYW5lX2RlZmF1bHQuZ2V0UG9pbnREaXN0YW5jZSh5elBsYW5lLCBjdXIpIDwgMCkgewogICAgICAgICAgICAgIGNvbnN0IGludGVyc2VjdGlvbiA9IEludGVyc2VjdGlvblRlc3RzX2RlZmF1bHQubGluZVNlZ21lbnRQbGFuZSgKICAgICAgICAgICAgICAgIHByZXYsCiAgICAgICAgICAgICAgICBjdXIsCiAgICAgICAgICAgICAgICB4elBsYW5lMiwKICAgICAgICAgICAgICAgIHdyYXBMb25naXR1ZGVJbnRlcnNlY3Rpb24KICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoaW50ZXJzZWN0aW9uKSkgewogICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoCiAgICAgICAgICAgICAgICAgIHh6Tm9ybWFsLAogICAgICAgICAgICAgICAgICA1ZS05LAogICAgICAgICAgICAgICAgICB3cmFwTG9uZ2l0dWRlT2Zmc2V0CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKFBsYW5lX2RlZmF1bHQuZ2V0UG9pbnREaXN0YW5jZSh4elBsYW5lMiwgcHJldikgPCAwKSB7CiAgICAgICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5uZWdhdGUob2Zmc2V0LCBvZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FydGVzaWFucy5wdXNoKAogICAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGludGVyc2VjdGlvbiwgb2Zmc2V0LCBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCkpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgc2VnbWVudHMucHVzaChjb3VudCArIDEpOwogICAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZShvZmZzZXQsIG9mZnNldCk7CiAgICAgICAgICAgICAgICBjYXJ0ZXNpYW5zLnB1c2goCiAgICAgICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoaW50ZXJzZWN0aW9uLCBvZmZzZXQsIG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBjb3VudCA9IDE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhcnRlc2lhbnMucHVzaChDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUocG9zaXRpb25zW2ldKSk7CiAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgIHByZXYgPSBjdXI7CiAgICAgICAgICB9CiAgICAgICAgICBzZWdtZW50cy5wdXNoKGNvdW50KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHBvc2l0aW9uczogY2FydGVzaWFucywKICAgICAgICAgIGxlbmd0aHM6IHNlZ21lbnRzCiAgICAgICAgfTsKICAgICAgfTsKICAgICAgUG9seWxpbmVQaXBlbGluZS5nZW5lcmF0ZUFyYyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChvcHRpb25zKSkgewogICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgIH0KICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBvcHRpb25zLnBvc2l0aW9uczsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwb3NpdGlvbnMpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgib3B0aW9ucy5wb3NpdGlvbnMgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gb3B0aW9ucy5lbGxpcHNvaWQgPz8gRWxsaXBzb2lkX2RlZmF1bHQuZGVmYXVsdDsKICAgICAgICBsZXQgaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgPz8gMDsKICAgICAgICBjb25zdCBoYXNIZWlnaHRBcnJheSA9IEFycmF5LmlzQXJyYXkoaGVpZ2h0KTsKICAgICAgICBpZiAobGVuZ3RoIDwgMSkgewogICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSAxKSB7CiAgICAgICAgICBjb25zdCBwID0gZWxsaXBzb2lkLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UocG9zaXRpb25zWzBdLCBzY2FsZUZpcnN0KTsKICAgICAgICAgIGhlaWdodCA9IGhhc0hlaWdodEFycmF5ID8gaGVpZ2h0WzBdIDogaGVpZ2h0OwogICAgICAgICAgaWYgKGhlaWdodCAhPT0gMCkgewogICAgICAgICAgICBjb25zdCBuID0gZWxsaXBzb2lkLmdlb2RldGljU3VyZmFjZU5vcm1hbChwLCBjYXJ0ZXNpYW4pOwogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihuLCBoZWlnaHQsIG4pOwogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHAsIG4sIHApOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIFtwLngsIHAueSwgcC56XTsKICAgICAgICB9CiAgICAgICAgbGV0IG1pbkRpc3RhbmNlID0gb3B0aW9ucy5taW5EaXN0YW5jZTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChtaW5EaXN0YW5jZSkpIHsKICAgICAgICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gb3B0aW9ucy5ncmFudWxhcml0eSA/PyBNYXRoX2RlZmF1bHQuUkFESUFOU19QRVJfREVHUkVFOwogICAgICAgICAgbWluRGlzdGFuY2UgPSBNYXRoX2RlZmF1bHQuY2hvcmRMZW5ndGgoZ3JhbnVsYXJpdHksIGVsbGlwc29pZC5tYXhpbXVtUmFkaXVzKTsKICAgICAgICB9CiAgICAgICAgbGV0IG51bVBvaW50cyA9IDA7CiAgICAgICAgbGV0IGk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgbnVtUG9pbnRzICs9IFBvbHlsaW5lUGlwZWxpbmUubnVtYmVyT2ZQb2ludHMoCiAgICAgICAgICAgIHBvc2l0aW9uc1tpXSwKICAgICAgICAgICAgcG9zaXRpb25zW2kgKyAxXSwKICAgICAgICAgICAgbWluRGlzdGFuY2UKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGFycmF5TGVuZ3RoID0gKG51bVBvaW50cyArIDEpICogMzsKICAgICAgICBjb25zdCBuZXdQb3NpdGlvbnMgPSBuZXcgQXJyYXkoYXJyYXlMZW5ndGgpOwogICAgICAgIGxldCBvZmZzZXQgPSAwOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggLSAxOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHAwID0gcG9zaXRpb25zW2ldOwogICAgICAgICAgY29uc3QgcDEgPSBwb3NpdGlvbnNbaSArIDFdOwogICAgICAgICAgY29uc3QgaDAgPSBoYXNIZWlnaHRBcnJheSA/IGhlaWdodFtpXSA6IGhlaWdodDsKICAgICAgICAgIGNvbnN0IGgxID0gaGFzSGVpZ2h0QXJyYXkgPyBoZWlnaHRbaSArIDFdIDogaGVpZ2h0OwogICAgICAgICAgb2Zmc2V0ID0gZ2VuZXJhdGVDYXJ0ZXNpYW5BcmMoCiAgICAgICAgICAgIHAwLAogICAgICAgICAgICBwMSwKICAgICAgICAgICAgbWluRGlzdGFuY2UsCiAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgaDAsCiAgICAgICAgICAgIGgxLAogICAgICAgICAgICBuZXdQb3NpdGlvbnMsCiAgICAgICAgICAgIG9mZnNldAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgc3ViZGl2aWRlSGVpZ2h0c1NjcmF0Y2hBcnJheS5sZW5ndGggPSAwOwogICAgICAgIGNvbnN0IGxhc3RQb2ludCA9IHBvc2l0aW9uc1tsZW5ndGggLSAxXTsKICAgICAgICBjb25zdCBjYXJ0byA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhsYXN0UG9pbnQsIGNhcnRvMSk7CiAgICAgICAgY2FydG8uaGVpZ2h0ID0gaGFzSGVpZ2h0QXJyYXkgPyBoZWlnaHRbbGVuZ3RoIC0gMV0gOiBoZWlnaHQ7CiAgICAgICAgY29uc3QgY2FydCA9IGVsbGlwc29pZC5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihjYXJ0bywgY2FydGVzaWFuKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayhjYXJ0LCBuZXdQb3NpdGlvbnMsIGFycmF5TGVuZ3RoIC0gMyk7CiAgICAgICAgcmV0dXJuIG5ld1Bvc2l0aW9uczsKICAgICAgfTsKICAgICAgc2NyYXRjaENhcnRvZ3JhcGhpYzAyID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWMxMiA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBQb2x5bGluZVBpcGVsaW5lLmdlbmVyYXRlUmh1bWJBcmMgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQob3B0aW9ucykpIHsKICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gb3B0aW9ucy5wb3NpdGlvbnM7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocG9zaXRpb25zKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm9wdGlvbnMucG9zaXRpb25zIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGNvbnN0IGVsbGlwc29pZCA9IG9wdGlvbnMuZWxsaXBzb2lkID8/IEVsbGlwc29pZF9kZWZhdWx0LmRlZmF1bHQ7CiAgICAgICAgbGV0IGhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0ID8/IDA7CiAgICAgICAgY29uc3QgaGFzSGVpZ2h0QXJyYXkgPSBBcnJheS5pc0FycmF5KGhlaWdodCk7CiAgICAgICAgaWYgKGxlbmd0aCA8IDEpIHsKICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gMSkgewogICAgICAgICAgY29uc3QgcCA9IGVsbGlwc29pZC5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKHBvc2l0aW9uc1swXSwgc2NhbGVGaXJzdCk7CiAgICAgICAgICBoZWlnaHQgPSBoYXNIZWlnaHRBcnJheSA/IGhlaWdodFswXSA6IGhlaWdodDsKICAgICAgICAgIGlmIChoZWlnaHQgIT09IDApIHsKICAgICAgICAgICAgY29uc3QgbiA9IGVsbGlwc29pZC5nZW9kZXRpY1N1cmZhY2VOb3JtYWwocCwgY2FydGVzaWFuKTsKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIobiwgaGVpZ2h0LCBuKTsKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChwLCBuLCBwKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBbcC54LCBwLnksIHAuel07CiAgICAgICAgfQogICAgICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gb3B0aW9ucy5ncmFudWxhcml0eSA/PyBNYXRoX2RlZmF1bHQuUkFESUFOU19QRVJfREVHUkVFOwogICAgICAgIGxldCBudW1Qb2ludHMgPSAwOwogICAgICAgIGxldCBpOwogICAgICAgIGxldCBjMCA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYygKICAgICAgICAgIHBvc2l0aW9uc1swXSwKICAgICAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWMwMgogICAgICAgICk7CiAgICAgICAgbGV0IGMxOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggLSAxOyBpKyspIHsKICAgICAgICAgIGMxID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKAogICAgICAgICAgICBwb3NpdGlvbnNbaSArIDFdLAogICAgICAgICAgICBzY3JhdGNoQ2FydG9ncmFwaGljMTIKICAgICAgICAgICk7CiAgICAgICAgICBudW1Qb2ludHMgKz0gUG9seWxpbmVQaXBlbGluZS5udW1iZXJPZlBvaW50c1JodW1iTGluZShjMCwgYzEsIGdyYW51bGFyaXR5KTsKICAgICAgICAgIGMwID0gQ2FydG9ncmFwaGljX2RlZmF1bHQuY2xvbmUoYzEsIHNjcmF0Y2hDYXJ0b2dyYXBoaWMwMik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGFycmF5TGVuZ3RoID0gKG51bVBvaW50cyArIDEpICogMzsKICAgICAgICBjb25zdCBuZXdQb3NpdGlvbnMgPSBuZXcgQXJyYXkoYXJyYXlMZW5ndGgpOwogICAgICAgIGxldCBvZmZzZXQgPSAwOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggLSAxOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHAwID0gcG9zaXRpb25zW2ldOwogICAgICAgICAgY29uc3QgcDEgPSBwb3NpdGlvbnNbaSArIDFdOwogICAgICAgICAgY29uc3QgaDAgPSBoYXNIZWlnaHRBcnJheSA/IGhlaWdodFtpXSA6IGhlaWdodDsKICAgICAgICAgIGNvbnN0IGgxID0gaGFzSGVpZ2h0QXJyYXkgPyBoZWlnaHRbaSArIDFdIDogaGVpZ2h0OwogICAgICAgICAgb2Zmc2V0ID0gZ2VuZXJhdGVDYXJ0ZXNpYW5SaHVtYkFyYygKICAgICAgICAgICAgcDAsCiAgICAgICAgICAgIHAxLAogICAgICAgICAgICBncmFudWxhcml0eSwKICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICBoMCwKICAgICAgICAgICAgaDEsCiAgICAgICAgICAgIG5ld1Bvc2l0aW9ucywKICAgICAgICAgICAgb2Zmc2V0CiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBzdWJkaXZpZGVIZWlnaHRzU2NyYXRjaEFycmF5Lmxlbmd0aCA9IDA7CiAgICAgICAgY29uc3QgbGFzdFBvaW50ID0gcG9zaXRpb25zW2xlbmd0aCAtIDFdOwogICAgICAgIGNvbnN0IGNhcnRvID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKGxhc3RQb2ludCwgY2FydG8xKTsKICAgICAgICBjYXJ0by5oZWlnaHQgPSBoYXNIZWlnaHRBcnJheSA/IGhlaWdodFtsZW5ndGggLSAxXSA6IGhlaWdodDsKICAgICAgICBjb25zdCBjYXJ0ID0gZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGNhcnRvLCBjYXJ0ZXNpYW4pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKGNhcnQsIG5ld1Bvc2l0aW9ucywgYXJyYXlMZW5ndGggLSAzKTsKICAgICAgICByZXR1cm4gbmV3UG9zaXRpb25zOwogICAgICB9OwogICAgICBQb2x5bGluZVBpcGVsaW5lLmdlbmVyYXRlQ2FydGVzaWFuQXJjID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIGNvbnN0IG51bWJlckFycmF5ID0gUG9seWxpbmVQaXBlbGluZS5nZW5lcmF0ZUFyYyhvcHRpb25zKTsKICAgICAgICBjb25zdCBzaXplID0gbnVtYmVyQXJyYXkubGVuZ3RoIC8gMzsKICAgICAgICBjb25zdCBuZXdQb3NpdGlvbnMgPSBuZXcgQXJyYXkoc2l6ZSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgIG5ld1Bvc2l0aW9uc1tpXSA9IENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2sobnVtYmVyQXJyYXksIGkgKiAzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ld1Bvc2l0aW9uczsKICAgICAgfTsKICAgICAgUG9seWxpbmVQaXBlbGluZS5nZW5lcmF0ZUNhcnRlc2lhblJodW1iQXJjID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIGNvbnN0IG51bWJlckFycmF5ID0gUG9seWxpbmVQaXBlbGluZS5nZW5lcmF0ZVJodW1iQXJjKG9wdGlvbnMpOwogICAgICAgIGNvbnN0IHNpemUgPSBudW1iZXJBcnJheS5sZW5ndGggLyAzOwogICAgICAgIGNvbnN0IG5ld1Bvc2l0aW9ucyA9IG5ldyBBcnJheShzaXplKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICAgbmV3UG9zaXRpb25zW2ldID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjayhudW1iZXJBcnJheSwgaSAqIDMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3UG9zaXRpb25zOwogICAgICB9OwogICAgICBQb2x5bGluZVBpcGVsaW5lX2RlZmF1bHQgPSBQb2x5bGluZVBpcGVsaW5lOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvb25lVGltZVdhcm5pbmcuanMKICBmdW5jdGlvbiBvbmVUaW1lV2FybmluZyhpZGVudGlmaWVyLCBtZXNzYWdlKSB7CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChpZGVudGlmaWVyKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiaWRlbnRpZmllciBpcyByZXF1aXJlZC4iKTsKICAgIH0KICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHdhcm5pbmdzW2lkZW50aWZpZXJdKSkgewogICAgICB3YXJuaW5nc1tpZGVudGlmaWVyXSA9IHRydWU7CiAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlID8/IGlkZW50aWZpZXIpOwogICAgfQogIH0KICB2YXIgd2FybmluZ3MsIG9uZVRpbWVXYXJuaW5nX2RlZmF1bHQ7CiAgdmFyIGluaXRfb25lVGltZVdhcm5pbmcgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL29uZVRpbWVXYXJuaW5nLmpzIigpIHsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgd2FybmluZ3MgPSB7fTsKICAgICAgb25lVGltZVdhcm5pbmcuZ2VvbWV0cnlPdXRsaW5lcyA9ICJFbnRpdHkgZ2VvbWV0cnkgb3V0bGluZXMgYXJlIHVuc3VwcG9ydGVkIG9uIHRlcnJhaW4uIE91dGxpbmVzIHdpbGwgYmUgZGlzYWJsZWQuIFRvIGVuYWJsZSBvdXRsaW5lcywgZGlzYWJsZSBnZW9tZXRyeSB0ZXJyYWluIGNsYW1waW5nIGJ5IGV4cGxpY2l0bHkgc2V0dGluZyBoZWlnaHQgdG8gMC4iOwogICAgICBvbmVUaW1lV2FybmluZy5nZW9tZXRyeVpJbmRleCA9ICJFbnRpdHkgZ2VvbWV0cnkgd2l0aCB6SW5kZXggYXJlIHVuc3VwcG9ydGVkIHdoZW4gaGVpZ2h0IG9yIGV4dHJ1ZGVkSGVpZ2h0IGFyZSBkZWZpbmVkLiAgekluZGV4IHdpbGwgYmUgaWdub3JlZCI7CiAgICAgIG9uZVRpbWVXYXJuaW5nLmdlb21ldHJ5SGVpZ2h0UmVmZXJlbmNlID0gIkVudGl0eSBjb3JyaWRvciwgZWxsaXBzZSwgcG9seWdvbiBvciByZWN0YW5nbGUgd2l0aCBoZWlnaHRSZWZlcmVuY2UgbXVzdCBhbHNvIGhhdmUgYSBkZWZpbmVkIGhlaWdodC4gIGhlaWdodFJlZmVyZW5jZSB3aWxsIGJlIGlnbm9yZWQiOwogICAgICBvbmVUaW1lV2FybmluZy5nZW9tZXRyeUV4dHJ1ZGVkSGVpZ2h0UmVmZXJlbmNlID0gIkVudGl0eSBjb3JyaWRvciwgZWxsaXBzZSwgcG9seWdvbiBvciByZWN0YW5nbGUgd2l0aCBleHRydWRlZEhlaWdodFJlZmVyZW5jZSBtdXN0IGFsc28gaGF2ZSBhIGRlZmluZWQgZXh0cnVkZWRIZWlnaHQuICBleHRydWRlZEhlaWdodFJlZmVyZW5jZSB3aWxsIGJlIGlnbm9yZWQiOwogICAgICBvbmVUaW1lV2FybmluZ19kZWZhdWx0ID0gb25lVGltZVdhcm5pbmc7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Qb2x5bGluZVZvbHVtZUdlb21ldHJ5TGlicmFyeS5qcwogIGZ1bmN0aW9uIHNjYWxlVG9TdXJmYWNlKHBvc2l0aW9ucywgZWxsaXBzb2lkKSB7CiAgICBjb25zdCBoZWlnaHRzID0gbmV3IEFycmF5KHBvc2l0aW9ucy5sZW5ndGgpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgcG9zID0gcG9zaXRpb25zW2ldOwogICAgICBjYXJ0b2dyYXBoaWMgPSBlbGxpcHNvaWQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMocG9zLCBjYXJ0b2dyYXBoaWMpOwogICAgICBoZWlnaHRzW2ldID0gY2FydG9ncmFwaGljLmhlaWdodDsKICAgICAgcG9zaXRpb25zW2ldID0gZWxsaXBzb2lkLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UocG9zLCBwb3MpOwogICAgfQogICAgcmV0dXJuIGhlaWdodHM7CiAgfQogIGZ1bmN0aW9uIHN1YmRpdmlkZUhlaWdodHMyKHBvaW50cywgaDAsIGgxLCBncmFudWxhcml0eSkgewogICAgY29uc3QgcDAgPSBwb2ludHNbMF07CiAgICBjb25zdCBwMSA9IHBvaW50c1sxXTsKICAgIGNvbnN0IGFuZ2xlQmV0d2VlbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5hbmdsZUJldHdlZW4ocDAsIHAxKTsKICAgIGNvbnN0IG51bVBvaW50cyA9IE1hdGguY2VpbChhbmdsZUJldHdlZW4gLyBncmFudWxhcml0eSk7CiAgICBjb25zdCBoZWlnaHRzID0gbmV3IEFycmF5KG51bVBvaW50cyk7CiAgICBsZXQgaTsKICAgIGlmIChoMCA9PT0gaDEpIHsKICAgICAgZm9yIChpID0gMDsgaSA8IG51bVBvaW50czsgaSsrKSB7CiAgICAgICAgaGVpZ2h0c1tpXSA9IGgwOwogICAgICB9CiAgICAgIGhlaWdodHMucHVzaChoMSk7CiAgICAgIHJldHVybiBoZWlnaHRzOwogICAgfQogICAgY29uc3QgZEhlaWdodCA9IGgxIC0gaDA7CiAgICBjb25zdCBoZWlnaHRQZXJWZXJ0ZXggPSBkSGVpZ2h0IC8gbnVtUG9pbnRzOwogICAgZm9yIChpID0gMTsgaSA8IG51bVBvaW50czsgaSsrKSB7CiAgICAgIGNvbnN0IGggPSBoMCArIGkgKiBoZWlnaHRQZXJWZXJ0ZXg7CiAgICAgIGhlaWdodHNbaV0gPSBoOwogICAgfQogICAgaGVpZ2h0c1swXSA9IGgwOwogICAgaGVpZ2h0cy5wdXNoKGgxKTsKICAgIHJldHVybiBoZWlnaHRzOwogIH0KICBmdW5jdGlvbiBjb21wdXRlUm90YXRpb25BbmdsZShzdGFydCwgZW5kLCBwb3NpdGlvbiwgZWxsaXBzb2lkKSB7CiAgICBjb25zdCB0YW5nZW50UGxhbmUgPSBuZXcgRWxsaXBzb2lkVGFuZ2VudFBsYW5lX2RlZmF1bHQocG9zaXRpb24sIGVsbGlwc29pZCk7CiAgICBjb25zdCBuZXh0ID0gdGFuZ2VudFBsYW5lLnByb2plY3RQb2ludE9udG9QbGFuZSgKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChwb3NpdGlvbiwgc3RhcnQsIG5leHRTY3JhdGNoKSwKICAgICAgbmV4dFNjcmF0Y2gKICAgICk7CiAgICBjb25zdCBwcmV2ID0gdGFuZ2VudFBsYW5lLnByb2plY3RQb2ludE9udG9QbGFuZSgKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChwb3NpdGlvbiwgZW5kLCBwcmV2U2NyYXRjaCksCiAgICAgIHByZXZTY3JhdGNoCiAgICApOwogICAgY29uc3QgYW5nbGUgPSBDYXJ0ZXNpYW4yX2RlZmF1bHQuYW5nbGVCZXR3ZWVuKG5leHQsIHByZXYpOwogICAgcmV0dXJuIHByZXYueCAqIG5leHQueSAtIHByZXYueSAqIG5leHQueCA+PSAwID8gLWFuZ2xlIDogYW5nbGU7CiAgfQogIGZ1bmN0aW9uIGFkZFBvc2l0aW9uKGNlbnRlciwgbGVmdCwgc2hhcGUsIGZpbmFsUG9zaXRpb25zLCBlbGxpcHNvaWQsIGhlaWdodCwgeFNjYWxhciwgcmVwZWF0KSB7CiAgICBsZXQgd2VzdCA9IHdlc3RTY3JhdGNoOwogICAgbGV0IGZpbmFsUG9zaXRpb24gPSBmaW5hbFBvc1NjcmF0Y2g7CiAgICB0cmFuc2Zvcm0gPSBUcmFuc2Zvcm1zX2RlZmF1bHQuZWFzdE5vcnRoVXBUb0ZpeGVkRnJhbWUoY2VudGVyLCBlbGxpcHNvaWQsIHRyYW5zZm9ybSk7CiAgICB3ZXN0ID0gTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5QnlQb2ludEFzVmVjdG9yKHRyYW5zZm9ybSwgbmVnYXRpdmVYLCB3ZXN0KTsKICAgIHdlc3QgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKHdlc3QsIHdlc3QpOwogICAgY29uc3QgYW5nbGUgPSBjb21wdXRlUm90YXRpb25BbmdsZSh3ZXN0LCBsZWZ0LCBjZW50ZXIsIGVsbGlwc29pZCk7CiAgICByb3RhdGlvblogPSBNYXRyaXgzX2RlZmF1bHQuZnJvbVJvdGF0aW9uWihhbmdsZSwgcm90YXRpb25aKTsKICAgIGhlaWdodENhcnRlc2lhbi56ID0gaGVpZ2h0OwogICAgdHJhbnNmb3JtID0gTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5VHJhbnNmb3JtYXRpb24oCiAgICAgIHRyYW5zZm9ybSwKICAgICAgTWF0cml4NF9kZWZhdWx0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uKHJvdGF0aW9uWiwgaGVpZ2h0Q2FydGVzaWFuLCB0cmFuc2xhdGlvbiksCiAgICAgIHRyYW5zZm9ybQogICAgKTsKICAgIGNvbnN0IHNjYWxlID0gc2NhbGVNYXRyaXg7CiAgICBzY2FsZVswXSA9IHhTY2FsYXI7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlcGVhdDsgaisrKSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hhcGUubGVuZ3RoOyBpICs9IDMpIHsKICAgICAgICBmaW5hbFBvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShzaGFwZSwgaSwgZmluYWxQb3NpdGlvbik7CiAgICAgICAgZmluYWxQb3NpdGlvbiA9IE1hdHJpeDNfZGVmYXVsdC5tdWx0aXBseUJ5VmVjdG9yKAogICAgICAgICAgc2NhbGUsCiAgICAgICAgICBmaW5hbFBvc2l0aW9uLAogICAgICAgICAgZmluYWxQb3NpdGlvbgogICAgICAgICk7CiAgICAgICAgZmluYWxQb3NpdGlvbiA9IE1hdHJpeDRfZGVmYXVsdC5tdWx0aXBseUJ5UG9pbnQoCiAgICAgICAgICB0cmFuc2Zvcm0sCiAgICAgICAgICBmaW5hbFBvc2l0aW9uLAogICAgICAgICAgZmluYWxQb3NpdGlvbgogICAgICAgICk7CiAgICAgICAgZmluYWxQb3NpdGlvbnMucHVzaChmaW5hbFBvc2l0aW9uLngsIGZpbmFsUG9zaXRpb24ueSwgZmluYWxQb3NpdGlvbi56KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZpbmFsUG9zaXRpb25zOwogIH0KICBmdW5jdGlvbiBhZGRQb3NpdGlvbnMoY2VudGVycywgbGVmdCwgc2hhcGUsIGZpbmFsUG9zaXRpb25zLCBlbGxpcHNvaWQsIGhlaWdodHMsIHhTY2FsYXIpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2VudGVycy5sZW5ndGg7IGkgKz0gMykgewogICAgICBjb25zdCBjZW50ZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KGNlbnRlcnMsIGksIGNlbnRlclNjcmF0Y2gyKTsKICAgICAgZmluYWxQb3NpdGlvbnMgPSBhZGRQb3NpdGlvbigKICAgICAgICBjZW50ZXIsCiAgICAgICAgbGVmdCwKICAgICAgICBzaGFwZSwKICAgICAgICBmaW5hbFBvc2l0aW9ucywKICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgaGVpZ2h0c1tpIC8gM10sCiAgICAgICAgeFNjYWxhciwKICAgICAgICAxCiAgICAgICk7CiAgICB9CiAgICByZXR1cm4gZmluYWxQb3NpdGlvbnM7CiAgfQogIGZ1bmN0aW9uIGNvbnZlcnRTaGFwZVRvM0REdXBsaWNhdGUoc2hhcGUyRCwgYm91bmRpbmdSZWN0YW5nbGUpIHsKICAgIGNvbnN0IGxlbmd0aCA9IHNoYXBlMkQubGVuZ3RoOwogICAgY29uc3Qgc2hhcGUgPSBuZXcgQXJyYXkobGVuZ3RoICogNik7CiAgICBsZXQgaW5kZXggPSAwOwogICAgY29uc3QgeE9mZnNldCA9IGJvdW5kaW5nUmVjdGFuZ2xlLnggKyBib3VuZGluZ1JlY3RhbmdsZS53aWR0aCAvIDI7CiAgICBjb25zdCB5T2Zmc2V0ID0gYm91bmRpbmdSZWN0YW5nbGUueSArIGJvdW5kaW5nUmVjdGFuZ2xlLmhlaWdodCAvIDI7CiAgICBsZXQgcG9pbnQgPSBzaGFwZTJEWzBdOwogICAgc2hhcGVbaW5kZXgrK10gPSBwb2ludC54IC0geE9mZnNldDsKICAgIHNoYXBlW2luZGV4KytdID0gMDsKICAgIHNoYXBlW2luZGV4KytdID0gcG9pbnQueSAtIHlPZmZzZXQ7CiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHBvaW50ID0gc2hhcGUyRFtpXTsKICAgICAgY29uc3QgeCA9IHBvaW50LnggLSB4T2Zmc2V0OwogICAgICBjb25zdCB6ID0gcG9pbnQueSAtIHlPZmZzZXQ7CiAgICAgIHNoYXBlW2luZGV4KytdID0geDsKICAgICAgc2hhcGVbaW5kZXgrK10gPSAwOwogICAgICBzaGFwZVtpbmRleCsrXSA9IHo7CiAgICAgIHNoYXBlW2luZGV4KytdID0geDsKICAgICAgc2hhcGVbaW5kZXgrK10gPSAwOwogICAgICBzaGFwZVtpbmRleCsrXSA9IHo7CiAgICB9CiAgICBwb2ludCA9IHNoYXBlMkRbMF07CiAgICBzaGFwZVtpbmRleCsrXSA9IHBvaW50LnggLSB4T2Zmc2V0OwogICAgc2hhcGVbaW5kZXgrK10gPSAwOwogICAgc2hhcGVbaW5kZXgrK10gPSBwb2ludC55IC0geU9mZnNldDsKICAgIHJldHVybiBzaGFwZTsKICB9CiAgZnVuY3Rpb24gY29udmVydFNoYXBlVG8zRChzaGFwZTJELCBib3VuZGluZ1JlY3RhbmdsZSkgewogICAgY29uc3QgbGVuZ3RoID0gc2hhcGUyRC5sZW5ndGg7CiAgICBjb25zdCBzaGFwZSA9IG5ldyBBcnJheShsZW5ndGggKiAzKTsKICAgIGxldCBpbmRleCA9IDA7CiAgICBjb25zdCB4T2Zmc2V0ID0gYm91bmRpbmdSZWN0YW5nbGUueCArIGJvdW5kaW5nUmVjdGFuZ2xlLndpZHRoIC8gMjsKICAgIGNvbnN0IHlPZmZzZXQgPSBib3VuZGluZ1JlY3RhbmdsZS55ICsgYm91bmRpbmdSZWN0YW5nbGUuaGVpZ2h0IC8gMjsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgc2hhcGVbaW5kZXgrK10gPSBzaGFwZTJEW2ldLnggLSB4T2Zmc2V0OwogICAgICBzaGFwZVtpbmRleCsrXSA9IDA7CiAgICAgIHNoYXBlW2luZGV4KytdID0gc2hhcGUyRFtpXS55IC0geU9mZnNldDsKICAgIH0KICAgIHJldHVybiBzaGFwZTsKICB9CiAgZnVuY3Rpb24gY29tcHV0ZVJvdW5kQ29ybmVyKHBpdm90LCBzdGFydFBvaW50LCBlbmRQb2ludCwgY29ybmVyVHlwZSwgbGVmdElzT3V0c2lkZSwgZWxsaXBzb2lkLCBmaW5hbFBvc2l0aW9ucywgc2hhcGUsIGhlaWdodCwgZHVwbGljYXRlUG9pbnRzKSB7CiAgICBjb25zdCBhbmdsZSA9IENhcnRlc2lhbjNfZGVmYXVsdC5hbmdsZUJldHdlZW4oCiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChzdGFydFBvaW50LCBwaXZvdCwgc2NyYXRjaDEpLAogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoZW5kUG9pbnQsIHBpdm90LCBzY3JhdGNoMikKICAgICk7CiAgICBjb25zdCBncmFudWxhcml0eSA9IGNvcm5lclR5cGUgPT09IENvcm5lclR5cGVfZGVmYXVsdC5CRVZFTEVEID8gMCA6IE1hdGguY2VpbChhbmdsZSAvIE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoNSkpOwogICAgbGV0IG07CiAgICBpZiAobGVmdElzT3V0c2lkZSkgewogICAgICBtID0gTWF0cml4M19kZWZhdWx0LmZyb21RdWF0ZXJuaW9uKAogICAgICAgIFF1YXRlcm5pb25fZGVmYXVsdC5mcm9tQXhpc0FuZ2xlKAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZShwaXZvdCwgc2NyYXRjaDEpLAogICAgICAgICAgYW5nbGUgLyAoZ3JhbnVsYXJpdHkgKyAxKSwKICAgICAgICAgIHF1YXRlcmlvbgogICAgICAgICksCiAgICAgICAgcm90TWF0cml4CiAgICAgICk7CiAgICB9IGVsc2UgewogICAgICBtID0gTWF0cml4M19kZWZhdWx0LmZyb21RdWF0ZXJuaW9uKAogICAgICAgIFF1YXRlcm5pb25fZGVmYXVsdC5mcm9tQXhpc0FuZ2xlKHBpdm90LCBhbmdsZSAvIChncmFudWxhcml0eSArIDEpLCBxdWF0ZXJpb24pLAogICAgICAgIHJvdE1hdHJpeAogICAgICApOwogICAgfQogICAgbGV0IGxlZnQ7CiAgICBsZXQgc3VyZmFjZVBvaW50OwogICAgc3RhcnRQb2ludCA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShzdGFydFBvaW50LCBzdGFydFBvaW50U2NyYXRjaCk7CiAgICBpZiAoZ3JhbnVsYXJpdHkgPiAwKSB7CiAgICAgIGNvbnN0IHJlcGVhdCA9IGR1cGxpY2F0ZVBvaW50cyA/IDIgOiAxOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyYW51bGFyaXR5OyBpKyspIHsKICAgICAgICBzdGFydFBvaW50ID0gTWF0cml4M19kZWZhdWx0Lm11bHRpcGx5QnlWZWN0b3IobSwgc3RhcnRQb2ludCwgc3RhcnRQb2ludCk7CiAgICAgICAgbGVmdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChzdGFydFBvaW50LCBwaXZvdCwgc2NyYXRjaDEpOwogICAgICAgIGxlZnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKGxlZnQsIGxlZnQpOwogICAgICAgIGlmICghbGVmdElzT3V0c2lkZSkgewogICAgICAgICAgbGVmdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5uZWdhdGUobGVmdCwgbGVmdCk7CiAgICAgICAgfQogICAgICAgIHN1cmZhY2VQb2ludCA9IGVsbGlwc29pZC5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKHN0YXJ0UG9pbnQsIHNjcmF0Y2gyKTsKICAgICAgICBmaW5hbFBvc2l0aW9ucyA9IGFkZFBvc2l0aW9uKAogICAgICAgICAgc3VyZmFjZVBvaW50LAogICAgICAgICAgbGVmdCwKICAgICAgICAgIHNoYXBlLAogICAgICAgICAgZmluYWxQb3NpdGlvbnMsCiAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICBoZWlnaHQsCiAgICAgICAgICAxLAogICAgICAgICAgcmVwZWF0CiAgICAgICAgKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbGVmdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChzdGFydFBvaW50LCBwaXZvdCwgc2NyYXRjaDEpOwogICAgICBsZWZ0ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShsZWZ0LCBsZWZ0KTsKICAgICAgaWYgKCFsZWZ0SXNPdXRzaWRlKSB7CiAgICAgICAgbGVmdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5uZWdhdGUobGVmdCwgbGVmdCk7CiAgICAgIH0KICAgICAgc3VyZmFjZVBvaW50ID0gZWxsaXBzb2lkLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2Uoc3RhcnRQb2ludCwgc2NyYXRjaDIpOwogICAgICBmaW5hbFBvc2l0aW9ucyA9IGFkZFBvc2l0aW9uKAogICAgICAgIHN1cmZhY2VQb2ludCwKICAgICAgICBsZWZ0LAogICAgICAgIHNoYXBlLAogICAgICAgIGZpbmFsUG9zaXRpb25zLAogICAgICAgIGVsbGlwc29pZCwKICAgICAgICBoZWlnaHQsCiAgICAgICAgMSwKICAgICAgICAxCiAgICAgICk7CiAgICAgIGVuZFBvaW50ID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGVuZFBvaW50LCBzdGFydFBvaW50U2NyYXRjaCk7CiAgICAgIGxlZnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoZW5kUG9pbnQsIHBpdm90LCBzY3JhdGNoMSk7CiAgICAgIGxlZnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKGxlZnQsIGxlZnQpOwogICAgICBpZiAoIWxlZnRJc091dHNpZGUpIHsKICAgICAgICBsZWZ0ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZShsZWZ0LCBsZWZ0KTsKICAgICAgfQogICAgICBzdXJmYWNlUG9pbnQgPSBlbGxpcHNvaWQuc2NhbGVUb0dlb2RldGljU3VyZmFjZShlbmRQb2ludCwgc2NyYXRjaDIpOwogICAgICBmaW5hbFBvc2l0aW9ucyA9IGFkZFBvc2l0aW9uKAogICAgICAgIHN1cmZhY2VQb2ludCwKICAgICAgICBsZWZ0LAogICAgICAgIHNoYXBlLAogICAgICAgIGZpbmFsUG9zaXRpb25zLAogICAgICAgIGVsbGlwc29pZCwKICAgICAgICBoZWlnaHQsCiAgICAgICAgMSwKICAgICAgICAxCiAgICAgICk7CiAgICB9CiAgICByZXR1cm4gZmluYWxQb3NpdGlvbnM7CiAgfQogIHZhciBzY3JhdGNoMkFycmF5LCBzY3JhdGNoQ2FydGVzaWFuMTYsIHNjcmF0Y2hDYXJ0ZXNpYW4yNiwgc2NyYXRjaENhcnRlc2lhbjM3LCBzY3JhdGNoQ2FydGVzaWFuNDMsIHNjcmF0Y2hDYXJ0ZXNpYW41Miwgc2NyYXRjaENhcnRlc2lhbjYyLCBzY3JhdGNoQ2FydGVzaWFuNywgc2NyYXRjaENhcnRlc2lhbjgsIHNjcmF0Y2hDYXJ0ZXNpYW45LCBzY3JhdGNoMSwgc2NyYXRjaDIsIFBvbHlsaW5lVm9sdW1lR2VvbWV0cnlMaWJyYXJ5LCBjYXJ0b2dyYXBoaWMsIG5leHRTY3JhdGNoLCBwcmV2U2NyYXRjaCwgbmVnYXRpdmVYLCB0cmFuc2Zvcm0sIHRyYW5zbGF0aW9uLCByb3RhdGlvblosIHNjYWxlTWF0cml4LCB3ZXN0U2NyYXRjaCwgZmluYWxQb3NTY3JhdGNoLCBoZWlnaHRDYXJ0ZXNpYW4sIGNlbnRlclNjcmF0Y2gyLCBxdWF0ZXJpb24sIHN0YXJ0UG9pbnRTY3JhdGNoLCByb3RNYXRyaXgsIHNjcmF0Y2hGb3J3YXJkUHJvamVjdGlvbiwgc2NyYXRjaEJhY2t3YXJkUHJvamVjdGlvbiwgUG9seWxpbmVWb2x1bWVHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdDsKICB2YXIgaW5pdF9Qb2x5bGluZVZvbHVtZUdlb21ldHJ5TGlicmFyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUG9seWxpbmVWb2x1bWVHZW9tZXRyeUxpYnJhcnkuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjIoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuNCgpOwogICAgICBpbml0X0NhcnRvZ3JhcGhpYygpOwogICAgICBpbml0X0Nvcm5lclR5cGUoKTsKICAgICAgaW5pdF9FbGxpcHNvaWRUYW5nZW50UGxhbmUoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGluaXRfTWF0cml4MygpOwogICAgICBpbml0X01hdHJpeDQoKTsKICAgICAgaW5pdF9Qb2x5bGluZVBpcGVsaW5lKCk7CiAgICAgIGluaXRfUXVhdGVybmlvbigpOwogICAgICBpbml0X1RyYW5zZm9ybXMoKTsKICAgICAgaW5pdF9vbmVUaW1lV2FybmluZygpOwogICAgICBzY3JhdGNoMkFycmF5ID0gW25ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKSwgbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpXTsKICAgICAgc2NyYXRjaENhcnRlc2lhbjE2ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydGVzaWFuMjYgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zNyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaENhcnRlc2lhbjQzID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydGVzaWFuNTIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW42MiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaENhcnRlc2lhbjcgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW44ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydGVzaWFuOSA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaDEgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2gyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBQb2x5bGluZVZvbHVtZUdlb21ldHJ5TGlicmFyeSA9IHt9OwogICAgICBjYXJ0b2dyYXBoaWMgPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgbmV4dFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHByZXZTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBuZWdhdGl2ZVggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KC0xLCAwLCAwKTsKICAgICAgdHJhbnNmb3JtID0gbmV3IE1hdHJpeDRfZGVmYXVsdCgpOwogICAgICB0cmFuc2xhdGlvbiA9IG5ldyBNYXRyaXg0X2RlZmF1bHQoKTsKICAgICAgcm90YXRpb25aID0gbmV3IE1hdHJpeDNfZGVmYXVsdCgpOwogICAgICBzY2FsZU1hdHJpeCA9IE1hdHJpeDNfZGVmYXVsdC5JREVOVElUWS5jbG9uZSgpOwogICAgICB3ZXN0U2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgZmluYWxQb3NTY3JhdGNoID0gbmV3IENhcnRlc2lhbjRfZGVmYXVsdCgpOwogICAgICBoZWlnaHRDYXJ0ZXNpYW4gPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGNlbnRlclNjcmF0Y2gyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBxdWF0ZXJpb24gPSBuZXcgUXVhdGVybmlvbl9kZWZhdWx0KCk7CiAgICAgIHN0YXJ0UG9pbnRTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICByb3RNYXRyaXggPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgIFBvbHlsaW5lVm9sdW1lR2VvbWV0cnlMaWJyYXJ5LnJlbW92ZUR1cGxpY2F0ZXNGcm9tU2hhcGUgPSBmdW5jdGlvbihzaGFwZVBvc2l0aW9ucykgewogICAgICAgIGNvbnN0IGxlbmd0aCA9IHNoYXBlUG9zaXRpb25zLmxlbmd0aDsKICAgICAgICBjb25zdCBjbGVhbmVkUG9zaXRpb25zID0gW107CiAgICAgICAgZm9yIChsZXQgaTAgPSBsZW5ndGggLSAxLCBpMSA9IDA7IGkxIDwgbGVuZ3RoOyBpMCA9IGkxKyspIHsKICAgICAgICAgIGNvbnN0IHYwMiA9IHNoYXBlUG9zaXRpb25zW2kwXTsKICAgICAgICAgIGNvbnN0IHYxMiA9IHNoYXBlUG9zaXRpb25zW2kxXTsKICAgICAgICAgIGlmICghQ2FydGVzaWFuMl9kZWZhdWx0LmVxdWFscyh2MDIsIHYxMikpIHsKICAgICAgICAgICAgY2xlYW5lZFBvc2l0aW9ucy5wdXNoKHYxMik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjbGVhbmVkUG9zaXRpb25zOwogICAgICB9OwogICAgICBQb2x5bGluZVZvbHVtZUdlb21ldHJ5TGlicmFyeS5hbmdsZUlzR3JlYXRlclRoYW5QaSA9IGZ1bmN0aW9uKGZvcndhcmQsIGJhY2t3YXJkLCBwb3NpdGlvbiwgZWxsaXBzb2lkKSB7CiAgICAgICAgY29uc3QgdGFuZ2VudFBsYW5lID0gbmV3IEVsbGlwc29pZFRhbmdlbnRQbGFuZV9kZWZhdWx0KHBvc2l0aW9uLCBlbGxpcHNvaWQpOwogICAgICAgIGNvbnN0IG5leHQgPSB0YW5nZW50UGxhbmUucHJvamVjdFBvaW50T250b1BsYW5lKAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChwb3NpdGlvbiwgZm9yd2FyZCwgbmV4dFNjcmF0Y2gpLAogICAgICAgICAgbmV4dFNjcmF0Y2gKICAgICAgICApOwogICAgICAgIGNvbnN0IHByZXYgPSB0YW5nZW50UGxhbmUucHJvamVjdFBvaW50T250b1BsYW5lKAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChwb3NpdGlvbiwgYmFja3dhcmQsIHByZXZTY3JhdGNoKSwKICAgICAgICAgIHByZXZTY3JhdGNoCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gcHJldi54ICogbmV4dC55IC0gcHJldi55ICogbmV4dC54ID49IDA7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hGb3J3YXJkUHJvamVjdGlvbiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaEJhY2t3YXJkUHJvamVjdGlvbiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgUG9seWxpbmVWb2x1bWVHZW9tZXRyeUxpYnJhcnkuY29tcHV0ZVBvc2l0aW9ucyA9IGZ1bmN0aW9uKHBvc2l0aW9ucywgc2hhcGUyRCwgYm91bmRpbmdSZWN0YW5nbGUsIGdlb21ldHJ5LCBkdXBsaWNhdGVQb2ludHMpIHsKICAgICAgICBjb25zdCBlbGxpcHNvaWQgPSBnZW9tZXRyeS5fZWxsaXBzb2lkOwogICAgICAgIGNvbnN0IGhlaWdodHMgPSBzY2FsZVRvU3VyZmFjZShwb3NpdGlvbnMsIGVsbGlwc29pZCk7CiAgICAgICAgY29uc3QgZ3JhbnVsYXJpdHkgPSBnZW9tZXRyeS5fZ3JhbnVsYXJpdHk7CiAgICAgICAgY29uc3QgY29ybmVyVHlwZSA9IGdlb21ldHJ5Ll9jb3JuZXJUeXBlOwogICAgICAgIGNvbnN0IHNoYXBlRm9yU2lkZXMgPSBkdXBsaWNhdGVQb2ludHMgPyBjb252ZXJ0U2hhcGVUbzNERHVwbGljYXRlKHNoYXBlMkQsIGJvdW5kaW5nUmVjdGFuZ2xlKSA6IGNvbnZlcnRTaGFwZVRvM0Qoc2hhcGUyRCwgYm91bmRpbmdSZWN0YW5nbGUpOwogICAgICAgIGNvbnN0IHNoYXBlRm9yRW5kcyA9IGR1cGxpY2F0ZVBvaW50cyA/IGNvbnZlcnRTaGFwZVRvM0Qoc2hhcGUyRCwgYm91bmRpbmdSZWN0YW5nbGUpIDogdm9pZCAwOwogICAgICAgIGNvbnN0IGhlaWdodE9mZnNldCA9IGJvdW5kaW5nUmVjdGFuZ2xlLmhlaWdodCAvIDI7CiAgICAgICAgY29uc3Qgd2lkdGggPSBib3VuZGluZ1JlY3RhbmdsZS53aWR0aCAvIDI7CiAgICAgICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgbGV0IGZpbmFsUG9zaXRpb25zID0gW107CiAgICAgICAgbGV0IGVuZHMgPSBkdXBsaWNhdGVQb2ludHMgPyBbXSA6IHZvaWQgMDsKICAgICAgICBsZXQgZm9yd2FyZCA9IHNjcmF0Y2hDYXJ0ZXNpYW4xNjsKICAgICAgICBsZXQgYmFja3dhcmQgPSBzY3JhdGNoQ2FydGVzaWFuMjY7CiAgICAgICAgbGV0IGNvcm5lckRpcmVjdGlvbiA9IHNjcmF0Y2hDYXJ0ZXNpYW4zNzsKICAgICAgICBsZXQgc3VyZmFjZU5vcm1hbCA9IHNjcmF0Y2hDYXJ0ZXNpYW40MzsKICAgICAgICBsZXQgcGl2b3QgPSBzY3JhdGNoQ2FydGVzaWFuNTI7CiAgICAgICAgbGV0IHN0YXJ0ID0gc2NyYXRjaENhcnRlc2lhbjYyOwogICAgICAgIGxldCBlbmQgPSBzY3JhdGNoQ2FydGVzaWFuNzsKICAgICAgICBsZXQgbGVmdCA9IHNjcmF0Y2hDYXJ0ZXNpYW44OwogICAgICAgIGxldCBwcmV2aW91c1Bvc2l0aW9uID0gc2NyYXRjaENhcnRlc2lhbjk7CiAgICAgICAgbGV0IHBvc2l0aW9uID0gcG9zaXRpb25zWzBdOwogICAgICAgIGxldCBuZXh0UG9zaXRpb24gPSBwb3NpdGlvbnNbMV07CiAgICAgICAgc3VyZmFjZU5vcm1hbCA9IGVsbGlwc29pZC5nZW9kZXRpY1N1cmZhY2VOb3JtYWwocG9zaXRpb24sIHN1cmZhY2VOb3JtYWwpOwogICAgICAgIGZvcndhcmQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QobmV4dFBvc2l0aW9uLCBwb3NpdGlvbiwgZm9yd2FyZCk7CiAgICAgICAgZm9yd2FyZCA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoZm9yd2FyZCwgZm9yd2FyZCk7CiAgICAgICAgbGVmdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhzdXJmYWNlTm9ybWFsLCBmb3J3YXJkLCBsZWZ0KTsKICAgICAgICBsZWZ0ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShsZWZ0LCBsZWZ0KTsKICAgICAgICBsZXQgaDAgPSBoZWlnaHRzWzBdOwogICAgICAgIGxldCBoMSA9IGhlaWdodHNbMV07CiAgICAgICAgaWYgKGR1cGxpY2F0ZVBvaW50cykgewogICAgICAgICAgZW5kcyA9IGFkZFBvc2l0aW9uKAogICAgICAgICAgICBwb3NpdGlvbiwKICAgICAgICAgICAgbGVmdCwKICAgICAgICAgICAgc2hhcGVGb3JFbmRzLAogICAgICAgICAgICBlbmRzLAogICAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICAgIGgwICsgaGVpZ2h0T2Zmc2V0LAogICAgICAgICAgICAxLAogICAgICAgICAgICAxCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBwcmV2aW91c1Bvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKHBvc2l0aW9uLCBwcmV2aW91c1Bvc2l0aW9uKTsKICAgICAgICBwb3NpdGlvbiA9IG5leHRQb3NpdGlvbjsKICAgICAgICBiYWNrd2FyZCA9IENhcnRlc2lhbjNfZGVmYXVsdC5uZWdhdGUoZm9yd2FyZCwgYmFja3dhcmQpOwogICAgICAgIGxldCBzdWJkaXZpZGVkSGVpZ2h0czsKICAgICAgICBsZXQgc3ViZGl2aWRlZFBvc2l0aW9uczsKICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgY29uc3QgcmVwZWF0ID0gZHVwbGljYXRlUG9pbnRzID8gMiA6IDE7CiAgICAgICAgICBuZXh0UG9zaXRpb24gPSBwb3NpdGlvbnNbaSArIDFdOwogICAgICAgICAgaWYgKHBvc2l0aW9uLmVxdWFscyhuZXh0UG9zaXRpb24pKSB7CiAgICAgICAgICAgIG9uZVRpbWVXYXJuaW5nX2RlZmF1bHQoCiAgICAgICAgICAgICAgIlBvc2l0aW9ucyBhcmUgdG9vIGNsb3NlIGFuZCBhcmUgY29uc2lkZXJlZCBlcXVpdmFsZW50IHdpdGggcm91bmRpbmcgZXJyb3IuIgogICAgICAgICAgICApOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGZvcndhcmQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QobmV4dFBvc2l0aW9uLCBwb3NpdGlvbiwgZm9yd2FyZCk7CiAgICAgICAgICBmb3J3YXJkID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShmb3J3YXJkLCBmb3J3YXJkKTsKICAgICAgICAgIHN1cmZhY2VOb3JtYWwgPSBlbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKHBvc2l0aW9uLCBzdXJmYWNlTm9ybWFsKTsKICAgICAgICAgIGNvbnN0IGZvcndhcmRQcm9qZWN0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoCiAgICAgICAgICAgIHN1cmZhY2VOb3JtYWwsCiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoZm9yd2FyZCwgc3VyZmFjZU5vcm1hbCksCiAgICAgICAgICAgIHNjcmF0Y2hGb3J3YXJkUHJvamVjdGlvbgogICAgICAgICAgKTsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChmb3J3YXJkLCBmb3J3YXJkUHJvamVjdGlvbiwgZm9yd2FyZFByb2plY3Rpb24pOwogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShmb3J3YXJkUHJvamVjdGlvbiwgZm9yd2FyZFByb2plY3Rpb24pOwogICAgICAgICAgY29uc3QgYmFja3dhcmRQcm9qZWN0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoCiAgICAgICAgICAgIHN1cmZhY2VOb3JtYWwsCiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoYmFja3dhcmQsIHN1cmZhY2VOb3JtYWwpLAogICAgICAgICAgICBzY3JhdGNoQmFja3dhcmRQcm9qZWN0aW9uCiAgICAgICAgICApOwogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KGJhY2t3YXJkLCBiYWNrd2FyZFByb2plY3Rpb24sIGJhY2t3YXJkUHJvamVjdGlvbik7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKGJhY2t3YXJkUHJvamVjdGlvbiwgYmFja3dhcmRQcm9qZWN0aW9uKTsKICAgICAgICAgIGNvbnN0IGRvQ29ybmVyID0gIU1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgICBNYXRoLmFicyhDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KGZvcndhcmRQcm9qZWN0aW9uLCBiYWNrd2FyZFByb2plY3Rpb24pKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgTWF0aF9kZWZhdWx0LkVQU0lMT043CiAgICAgICAgICApOwogICAgICAgICAgaWYgKGRvQ29ybmVyKSB7CiAgICAgICAgICAgIGNvcm5lckRpcmVjdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoZm9yd2FyZCwgYmFja3dhcmQsIGNvcm5lckRpcmVjdGlvbik7CiAgICAgICAgICAgIGNvcm5lckRpcmVjdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoY29ybmVyRGlyZWN0aW9uLCBjb3JuZXJEaXJlY3Rpb24pOwogICAgICAgICAgICBjb3JuZXJEaXJlY3Rpb24gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3MoCiAgICAgICAgICAgICAgY29ybmVyRGlyZWN0aW9uLAogICAgICAgICAgICAgIHN1cmZhY2VOb3JtYWwsCiAgICAgICAgICAgICAgY29ybmVyRGlyZWN0aW9uCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNvcm5lckRpcmVjdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcygKICAgICAgICAgICAgICBzdXJmYWNlTm9ybWFsLAogICAgICAgICAgICAgIGNvcm5lckRpcmVjdGlvbiwKICAgICAgICAgICAgICBjb3JuZXJEaXJlY3Rpb24KICAgICAgICAgICAgKTsKICAgICAgICAgICAgY29ybmVyRGlyZWN0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShjb3JuZXJEaXJlY3Rpb24sIGNvcm5lckRpcmVjdGlvbik7CiAgICAgICAgICAgIGNvbnN0IHNjYWxhciA9IDEgLyBNYXRoLm1heCgKICAgICAgICAgICAgICAwLjI1LAogICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUoCiAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3MoY29ybmVyRGlyZWN0aW9uLCBiYWNrd2FyZCwgc2NyYXRjaDEpCiAgICAgICAgICAgICAgKQogICAgICAgICAgICApOwogICAgICAgICAgICBjb25zdCBsZWZ0SXNPdXRzaWRlID0gUG9seWxpbmVWb2x1bWVHZW9tZXRyeUxpYnJhcnkuYW5nbGVJc0dyZWF0ZXJUaGFuUGkoCiAgICAgICAgICAgICAgZm9yd2FyZCwKICAgICAgICAgICAgICBiYWNrd2FyZCwKICAgICAgICAgICAgICBwb3NpdGlvbiwKICAgICAgICAgICAgICBlbGxpcHNvaWQKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKGxlZnRJc091dHNpZGUpIHsKICAgICAgICAgICAgICBwaXZvdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoCiAgICAgICAgICAgICAgICBwb3NpdGlvbiwKICAgICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKAogICAgICAgICAgICAgICAgICBjb3JuZXJEaXJlY3Rpb24sCiAgICAgICAgICAgICAgICAgIHNjYWxhciAqIHdpZHRoLAogICAgICAgICAgICAgICAgICBjb3JuZXJEaXJlY3Rpb24KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBwaXZvdAogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgc3RhcnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKAogICAgICAgICAgICAgICAgcGl2b3QsCiAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihsZWZ0LCB3aWR0aCwgc3RhcnQpLAogICAgICAgICAgICAgICAgc3RhcnQKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIHNjcmF0Y2gyQXJyYXlbMF0gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUocHJldmlvdXNQb3NpdGlvbiwgc2NyYXRjaDJBcnJheVswXSk7CiAgICAgICAgICAgICAgc2NyYXRjaDJBcnJheVsxXSA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShzdGFydCwgc2NyYXRjaDJBcnJheVsxXSk7CiAgICAgICAgICAgICAgc3ViZGl2aWRlZEhlaWdodHMgPSBzdWJkaXZpZGVIZWlnaHRzMigKICAgICAgICAgICAgICAgIHNjcmF0Y2gyQXJyYXksCiAgICAgICAgICAgICAgICBoMCArIGhlaWdodE9mZnNldCwKICAgICAgICAgICAgICAgIGgxICsgaGVpZ2h0T2Zmc2V0LAogICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHkKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIHN1YmRpdmlkZWRQb3NpdGlvbnMgPSBQb2x5bGluZVBpcGVsaW5lX2RlZmF1bHQuZ2VuZXJhdGVBcmMoewogICAgICAgICAgICAgICAgcG9zaXRpb25zOiBzY3JhdGNoMkFycmF5LAogICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHksCiAgICAgICAgICAgICAgICBlbGxpcHNvaWQKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBmaW5hbFBvc2l0aW9ucyA9IGFkZFBvc2l0aW9ucygKICAgICAgICAgICAgICAgIHN1YmRpdmlkZWRQb3NpdGlvbnMsCiAgICAgICAgICAgICAgICBsZWZ0LAogICAgICAgICAgICAgICAgc2hhcGVGb3JTaWRlcywKICAgICAgICAgICAgICAgIGZpbmFsUG9zaXRpb25zLAogICAgICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICAgICAgc3ViZGl2aWRlZEhlaWdodHMsCiAgICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICBsZWZ0ID0gQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKHN1cmZhY2VOb3JtYWwsIGZvcndhcmQsIGxlZnQpOwogICAgICAgICAgICAgIGxlZnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKGxlZnQsIGxlZnQpOwogICAgICAgICAgICAgIGVuZCA9IENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoCiAgICAgICAgICAgICAgICBwaXZvdCwKICAgICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKGxlZnQsIHdpZHRoLCBlbmQpLAogICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICBpZiAoY29ybmVyVHlwZSA9PT0gQ29ybmVyVHlwZV9kZWZhdWx0LlJPVU5ERUQgfHwgY29ybmVyVHlwZSA9PT0gQ29ybmVyVHlwZV9kZWZhdWx0LkJFVkVMRUQpIHsKICAgICAgICAgICAgICAgIGNvbXB1dGVSb3VuZENvcm5lcigKICAgICAgICAgICAgICAgICAgcGl2b3QsCiAgICAgICAgICAgICAgICAgIHN0YXJ0LAogICAgICAgICAgICAgICAgICBlbmQsCiAgICAgICAgICAgICAgICAgIGNvcm5lclR5cGUsCiAgICAgICAgICAgICAgICAgIGxlZnRJc091dHNpZGUsCiAgICAgICAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgICAgICAgZmluYWxQb3NpdGlvbnMsCiAgICAgICAgICAgICAgICAgIHNoYXBlRm9yU2lkZXMsCiAgICAgICAgICAgICAgICAgIGgxICsgaGVpZ2h0T2Zmc2V0LAogICAgICAgICAgICAgICAgICBkdXBsaWNhdGVQb2ludHMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvcm5lckRpcmVjdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5uZWdhdGUoY29ybmVyRGlyZWN0aW9uLCBjb3JuZXJEaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgZmluYWxQb3NpdGlvbnMgPSBhZGRQb3NpdGlvbigKICAgICAgICAgICAgICAgICAgcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgIGNvcm5lckRpcmVjdGlvbiwKICAgICAgICAgICAgICAgICAgc2hhcGVGb3JTaWRlcywKICAgICAgICAgICAgICAgICAgZmluYWxQb3NpdGlvbnMsCiAgICAgICAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgICAgICAgaDEgKyBoZWlnaHRPZmZzZXQsCiAgICAgICAgICAgICAgICAgIHNjYWxhciwKICAgICAgICAgICAgICAgICAgcmVwZWF0CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwcmV2aW91c1Bvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGVuZCwgcHJldmlvdXNQb3NpdGlvbik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcGl2b3QgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKAogICAgICAgICAgICAgICAgcG9zaXRpb24sCiAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcigKICAgICAgICAgICAgICAgICAgY29ybmVyRGlyZWN0aW9uLAogICAgICAgICAgICAgICAgICBzY2FsYXIgKiB3aWR0aCwKICAgICAgICAgICAgICAgICAgY29ybmVyRGlyZWN0aW9uCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgcGl2b3QKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIHN0YXJ0ID0gQ2FydGVzaWFuM19kZWZhdWx0LmFkZCgKICAgICAgICAgICAgICAgIHBpdm90LAogICAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIobGVmdCwgLXdpZHRoLCBzdGFydCksCiAgICAgICAgICAgICAgICBzdGFydAogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgc2NyYXRjaDJBcnJheVswXSA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShwcmV2aW91c1Bvc2l0aW9uLCBzY3JhdGNoMkFycmF5WzBdKTsKICAgICAgICAgICAgICBzY3JhdGNoMkFycmF5WzFdID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKHN0YXJ0LCBzY3JhdGNoMkFycmF5WzFdKTsKICAgICAgICAgICAgICBzdWJkaXZpZGVkSGVpZ2h0cyA9IHN1YmRpdmlkZUhlaWdodHMyKAogICAgICAgICAgICAgICAgc2NyYXRjaDJBcnJheSwKICAgICAgICAgICAgICAgIGgwICsgaGVpZ2h0T2Zmc2V0LAogICAgICAgICAgICAgICAgaDEgKyBoZWlnaHRPZmZzZXQsCiAgICAgICAgICAgICAgICBncmFudWxhcml0eQogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgc3ViZGl2aWRlZFBvc2l0aW9ucyA9IFBvbHlsaW5lUGlwZWxpbmVfZGVmYXVsdC5nZW5lcmF0ZUFyYyh7CiAgICAgICAgICAgICAgICBwb3NpdGlvbnM6IHNjcmF0Y2gyQXJyYXksCiAgICAgICAgICAgICAgICBncmFudWxhcml0eSwKICAgICAgICAgICAgICAgIGVsbGlwc29pZAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGZpbmFsUG9zaXRpb25zID0gYWRkUG9zaXRpb25zKAogICAgICAgICAgICAgICAgc3ViZGl2aWRlZFBvc2l0aW9ucywKICAgICAgICAgICAgICAgIGxlZnQsCiAgICAgICAgICAgICAgICBzaGFwZUZvclNpZGVzLAogICAgICAgICAgICAgICAgZmluYWxQb3NpdGlvbnMsCiAgICAgICAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICAgICAgICBzdWJkaXZpZGVkSGVpZ2h0cywKICAgICAgICAgICAgICAgIDEKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIGxlZnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3Moc3VyZmFjZU5vcm1hbCwgZm9yd2FyZCwgbGVmdCk7CiAgICAgICAgICAgICAgbGVmdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUobGVmdCwgbGVmdCk7CiAgICAgICAgICAgICAgZW5kID0gQ2FydGVzaWFuM19kZWZhdWx0LmFkZCgKICAgICAgICAgICAgICAgIHBpdm90LAogICAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIobGVmdCwgLXdpZHRoLCBlbmQpLAogICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICBpZiAoY29ybmVyVHlwZSA9PT0gQ29ybmVyVHlwZV9kZWZhdWx0LlJPVU5ERUQgfHwgY29ybmVyVHlwZSA9PT0gQ29ybmVyVHlwZV9kZWZhdWx0LkJFVkVMRUQpIHsKICAgICAgICAgICAgICAgIGNvbXB1dGVSb3VuZENvcm5lcigKICAgICAgICAgICAgICAgICAgcGl2b3QsCiAgICAgICAgICAgICAgICAgIHN0YXJ0LAogICAgICAgICAgICAgICAgICBlbmQsCiAgICAgICAgICAgICAgICAgIGNvcm5lclR5cGUsCiAgICAgICAgICAgICAgICAgIGxlZnRJc091dHNpZGUsCiAgICAgICAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgICAgICAgZmluYWxQb3NpdGlvbnMsCiAgICAgICAgICAgICAgICAgIHNoYXBlRm9yU2lkZXMsCiAgICAgICAgICAgICAgICAgIGgxICsgaGVpZ2h0T2Zmc2V0LAogICAgICAgICAgICAgICAgICBkdXBsaWNhdGVQb2ludHMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZpbmFsUG9zaXRpb25zID0gYWRkUG9zaXRpb24oCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLAogICAgICAgICAgICAgICAgICBjb3JuZXJEaXJlY3Rpb24sCiAgICAgICAgICAgICAgICAgIHNoYXBlRm9yU2lkZXMsCiAgICAgICAgICAgICAgICAgIGZpbmFsUG9zaXRpb25zLAogICAgICAgICAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICAgICAgICAgIGgxICsgaGVpZ2h0T2Zmc2V0LAogICAgICAgICAgICAgICAgICBzY2FsYXIsCiAgICAgICAgICAgICAgICAgIHJlcGVhdAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcHJldmlvdXNQb3NpdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShlbmQsIHByZXZpb3VzUG9zaXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJhY2t3YXJkID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZShmb3J3YXJkLCBiYWNrd2FyZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmaW5hbFBvc2l0aW9ucyA9IGFkZFBvc2l0aW9uKAogICAgICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sCiAgICAgICAgICAgICAgbGVmdCwKICAgICAgICAgICAgICBzaGFwZUZvclNpZGVzLAogICAgICAgICAgICAgIGZpbmFsUG9zaXRpb25zLAogICAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgICBoMCArIGhlaWdodE9mZnNldCwKICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgIDEKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHJldmlvdXNQb3NpdGlvbiA9IHBvc2l0aW9uOwogICAgICAgICAgfQogICAgICAgICAgaDAgPSBoMTsKICAgICAgICAgIGgxID0gaGVpZ2h0c1tpICsgMV07CiAgICAgICAgICBwb3NpdGlvbiA9IG5leHRQb3NpdGlvbjsKICAgICAgICB9CiAgICAgICAgc2NyYXRjaDJBcnJheVswXSA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShwcmV2aW91c1Bvc2l0aW9uLCBzY3JhdGNoMkFycmF5WzBdKTsKICAgICAgICBzY3JhdGNoMkFycmF5WzFdID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKHBvc2l0aW9uLCBzY3JhdGNoMkFycmF5WzFdKTsKICAgICAgICBzdWJkaXZpZGVkSGVpZ2h0cyA9IHN1YmRpdmlkZUhlaWdodHMyKAogICAgICAgICAgc2NyYXRjaDJBcnJheSwKICAgICAgICAgIGgwICsgaGVpZ2h0T2Zmc2V0LAogICAgICAgICAgaDEgKyBoZWlnaHRPZmZzZXQsCiAgICAgICAgICBncmFudWxhcml0eQogICAgICAgICk7CiAgICAgICAgc3ViZGl2aWRlZFBvc2l0aW9ucyA9IFBvbHlsaW5lUGlwZWxpbmVfZGVmYXVsdC5nZW5lcmF0ZUFyYyh7CiAgICAgICAgICBwb3NpdGlvbnM6IHNjcmF0Y2gyQXJyYXksCiAgICAgICAgICBncmFudWxhcml0eSwKICAgICAgICAgIGVsbGlwc29pZAogICAgICAgIH0pOwogICAgICAgIGZpbmFsUG9zaXRpb25zID0gYWRkUG9zaXRpb25zKAogICAgICAgICAgc3ViZGl2aWRlZFBvc2l0aW9ucywKICAgICAgICAgIGxlZnQsCiAgICAgICAgICBzaGFwZUZvclNpZGVzLAogICAgICAgICAgZmluYWxQb3NpdGlvbnMsCiAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICBzdWJkaXZpZGVkSGVpZ2h0cywKICAgICAgICAgIDEKICAgICAgICApOwogICAgICAgIGlmIChkdXBsaWNhdGVQb2ludHMpIHsKICAgICAgICAgIGVuZHMgPSBhZGRQb3NpdGlvbigKICAgICAgICAgICAgcG9zaXRpb24sCiAgICAgICAgICAgIGxlZnQsCiAgICAgICAgICAgIHNoYXBlRm9yRW5kcywKICAgICAgICAgICAgZW5kcywKICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICBoMSArIGhlaWdodE9mZnNldCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbGVuZ3RoID0gZmluYWxQb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGNvbnN0IHBvc0xlbmd0aCA9IGR1cGxpY2F0ZVBvaW50cyA/IGxlbmd0aCArIGVuZHMubGVuZ3RoIDogbGVuZ3RoOwogICAgICAgIGNvbnN0IGNvbWJpbmVkUG9zaXRpb25zID0gbmV3IEZsb2F0NjRBcnJheShwb3NMZW5ndGgpOwogICAgICAgIGNvbWJpbmVkUG9zaXRpb25zLnNldChmaW5hbFBvc2l0aW9ucyk7CiAgICAgICAgaWYgKGR1cGxpY2F0ZVBvaW50cykgewogICAgICAgICAgY29tYmluZWRQb3NpdGlvbnMuc2V0KGVuZHMsIGxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb21iaW5lZFBvc2l0aW9uczsKICAgICAgfTsKICAgICAgUG9seWxpbmVWb2x1bWVHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdCA9IFBvbHlsaW5lVm9sdW1lR2VvbWV0cnlMaWJyYXJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ29ycmlkb3JHZW9tZXRyeUxpYnJhcnkuanMKICBmdW5jdGlvbiBjb21wdXRlUm91bmRDb3JuZXIyKGNvcm5lclBvaW50LCBzdGFydFBvaW50LCBlbmRQb2ludCwgY29ybmVyVHlwZSwgbGVmdElzT3V0c2lkZSkgewogICAgY29uc3QgYW5nbGUgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYW5nbGVCZXR3ZWVuKAogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3Qoc3RhcnRQb2ludCwgY29ybmVyUG9pbnQsIHNjcmF0Y2gxMiksCiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChlbmRQb2ludCwgY29ybmVyUG9pbnQsIHNjcmF0Y2gyMikKICAgICk7CiAgICBjb25zdCBncmFudWxhcml0eSA9IGNvcm5lclR5cGUgPT09IENvcm5lclR5cGVfZGVmYXVsdC5CRVZFTEVEID8gMSA6IE1hdGguY2VpbChhbmdsZSAvIE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoNSkpICsgMTsKICAgIGNvbnN0IHNpemUgPSBncmFudWxhcml0eSAqIDM7CiAgICBjb25zdCBhcnJheSA9IG5ldyBBcnJheShzaXplKTsKICAgIGFycmF5W3NpemUgLSAzXSA9IGVuZFBvaW50Lng7CiAgICBhcnJheVtzaXplIC0gMl0gPSBlbmRQb2ludC55OwogICAgYXJyYXlbc2l6ZSAtIDFdID0gZW5kUG9pbnQuejsKICAgIGxldCBtOwogICAgaWYgKGxlZnRJc091dHNpZGUpIHsKICAgICAgbSA9IE1hdHJpeDNfZGVmYXVsdC5mcm9tUXVhdGVybmlvbigKICAgICAgICBRdWF0ZXJuaW9uX2RlZmF1bHQuZnJvbUF4aXNBbmdsZSgKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5uZWdhdGUoY29ybmVyUG9pbnQsIHNjcmF0Y2gxMiksCiAgICAgICAgICBhbmdsZSAvIGdyYW51bGFyaXR5LAogICAgICAgICAgcXVhdGVyaW9uMgogICAgICAgICksCiAgICAgICAgcm90TWF0cml4MgogICAgICApOwogICAgfSBlbHNlIHsKICAgICAgbSA9IE1hdHJpeDNfZGVmYXVsdC5mcm9tUXVhdGVybmlvbigKICAgICAgICBRdWF0ZXJuaW9uX2RlZmF1bHQuZnJvbUF4aXNBbmdsZShjb3JuZXJQb2ludCwgYW5nbGUgLyBncmFudWxhcml0eSwgcXVhdGVyaW9uMiksCiAgICAgICAgcm90TWF0cml4MgogICAgICApOwogICAgfQogICAgbGV0IGluZGV4ID0gMDsKICAgIHN0YXJ0UG9pbnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoc3RhcnRQb2ludCwgc2NyYXRjaDEyKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JhbnVsYXJpdHk7IGkrKykgewogICAgICBzdGFydFBvaW50ID0gTWF0cml4M19kZWZhdWx0Lm11bHRpcGx5QnlWZWN0b3IobSwgc3RhcnRQb2ludCwgc3RhcnRQb2ludCk7CiAgICAgIGFycmF5W2luZGV4KytdID0gc3RhcnRQb2ludC54OwogICAgICBhcnJheVtpbmRleCsrXSA9IHN0YXJ0UG9pbnQueTsKICAgICAgYXJyYXlbaW5kZXgrK10gPSBzdGFydFBvaW50Lno7CiAgICB9CiAgICByZXR1cm4gYXJyYXk7CiAgfQogIGZ1bmN0aW9uIGFkZEVuZENhcHMoY2FsY3VsYXRlZFBvc2l0aW9ucykgewogICAgbGV0IGNvcm5lclBvaW50ID0gY2FydGVzaWFuMTsKICAgIGxldCBzdGFydFBvaW50ID0gY2FydGVzaWFuMjsKICAgIGxldCBlbmRQb2ludCA9IGNhcnRlc2lhbjM7CiAgICBsZXQgbGVmdEVkZ2UgPSBjYWxjdWxhdGVkUG9zaXRpb25zWzFdOwogICAgc3RhcnRQb2ludCA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoCiAgICAgIGNhbGN1bGF0ZWRQb3NpdGlvbnNbMV0sCiAgICAgIGxlZnRFZGdlLmxlbmd0aCAtIDMsCiAgICAgIHN0YXJ0UG9pbnQKICAgICk7CiAgICBlbmRQb2ludCA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoY2FsY3VsYXRlZFBvc2l0aW9uc1swXSwgMCwgZW5kUG9pbnQpOwogICAgY29ybmVyUG9pbnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWlkcG9pbnQoc3RhcnRQb2ludCwgZW5kUG9pbnQsIGNvcm5lclBvaW50KTsKICAgIGNvbnN0IGZpcnN0RW5kQ2FwID0gY29tcHV0ZVJvdW5kQ29ybmVyMigKICAgICAgY29ybmVyUG9pbnQsCiAgICAgIHN0YXJ0UG9pbnQsCiAgICAgIGVuZFBvaW50LAogICAgICBDb3JuZXJUeXBlX2RlZmF1bHQuUk9VTkRFRCwKICAgICAgZmFsc2UKICAgICk7CiAgICBjb25zdCBsZW5ndGggPSBjYWxjdWxhdGVkUG9zaXRpb25zLmxlbmd0aCAtIDE7CiAgICBjb25zdCByaWdodEVkZ2UgPSBjYWxjdWxhdGVkUG9zaXRpb25zW2xlbmd0aCAtIDFdOwogICAgbGVmdEVkZ2UgPSBjYWxjdWxhdGVkUG9zaXRpb25zW2xlbmd0aF07CiAgICBzdGFydFBvaW50ID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheSgKICAgICAgcmlnaHRFZGdlLAogICAgICByaWdodEVkZ2UubGVuZ3RoIC0gMywKICAgICAgc3RhcnRQb2ludAogICAgKTsKICAgIGVuZFBvaW50ID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShsZWZ0RWRnZSwgMCwgZW5kUG9pbnQpOwogICAgY29ybmVyUG9pbnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubWlkcG9pbnQoc3RhcnRQb2ludCwgZW5kUG9pbnQsIGNvcm5lclBvaW50KTsKICAgIGNvbnN0IGxhc3RFbmRDYXAgPSBjb21wdXRlUm91bmRDb3JuZXIyKAogICAgICBjb3JuZXJQb2ludCwKICAgICAgc3RhcnRQb2ludCwKICAgICAgZW5kUG9pbnQsCiAgICAgIENvcm5lclR5cGVfZGVmYXVsdC5ST1VOREVELAogICAgICBmYWxzZQogICAgKTsKICAgIHJldHVybiBbZmlyc3RFbmRDYXAsIGxhc3RFbmRDYXBdOwogIH0KICBmdW5jdGlvbiBjb21wdXRlTWl0ZXJlZENvcm5lcihwb3NpdGlvbiwgbGVmdENvcm5lckRpcmVjdGlvbiwgbGFzdFBvaW50LCBsZWZ0SXNPdXRzaWRlKSB7CiAgICBsZXQgY29ybmVyUG9pbnQgPSBzY3JhdGNoMTI7CiAgICBpZiAobGVmdElzT3V0c2lkZSkgewogICAgICBjb3JuZXJQb2ludCA9IENhcnRlc2lhbjNfZGVmYXVsdC5hZGQocG9zaXRpb24sIGxlZnRDb3JuZXJEaXJlY3Rpb24sIGNvcm5lclBvaW50KTsKICAgIH0gZWxzZSB7CiAgICAgIGxlZnRDb3JuZXJEaXJlY3Rpb24gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKAogICAgICAgIGxlZnRDb3JuZXJEaXJlY3Rpb24sCiAgICAgICAgbGVmdENvcm5lckRpcmVjdGlvbgogICAgICApOwogICAgICBjb3JuZXJQb2ludCA9IENhcnRlc2lhbjNfZGVmYXVsdC5hZGQocG9zaXRpb24sIGxlZnRDb3JuZXJEaXJlY3Rpb24sIGNvcm5lclBvaW50KTsKICAgIH0KICAgIHJldHVybiBbCiAgICAgIGNvcm5lclBvaW50LngsCiAgICAgIGNvcm5lclBvaW50LnksCiAgICAgIGNvcm5lclBvaW50LnosCiAgICAgIGxhc3RQb2ludC54LAogICAgICBsYXN0UG9pbnQueSwKICAgICAgbGFzdFBvaW50LnoKICAgIF07CiAgfQogIGZ1bmN0aW9uIGFkZFNoaWZ0ZWRQb3NpdGlvbnMocG9zaXRpb25zLCBsZWZ0LCBzY2FsYXIsIGNhbGN1bGF0ZWRQb3NpdGlvbnMpIHsKICAgIGNvbnN0IHJpZ2h0UG9zaXRpb25zID0gbmV3IEFycmF5KHBvc2l0aW9ucy5sZW5ndGgpOwogICAgY29uc3QgbGVmdFBvc2l0aW9ucyA9IG5ldyBBcnJheShwb3NpdGlvbnMubGVuZ3RoKTsKICAgIGNvbnN0IHNjYWxlZExlZnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihsZWZ0LCBzY2FsYXIsIHNjcmF0Y2gxMik7CiAgICBjb25zdCBzY2FsZWRSaWdodCA9IENhcnRlc2lhbjNfZGVmYXVsdC5uZWdhdGUoc2NhbGVkTGVmdCwgc2NyYXRjaDIyKTsKICAgIGxldCByaWdodEluZGV4ID0gMDsKICAgIGxldCBsZWZ0SW5kZXggPSBwb3NpdGlvbnMubGVuZ3RoIC0gMTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSArPSAzKSB7CiAgICAgIGNvbnN0IHBvcyA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkocG9zaXRpb25zLCBpLCBzY3JhdGNoMyk7CiAgICAgIGNvbnN0IHJpZ2h0UG9zID0gQ2FydGVzaWFuM19kZWZhdWx0LmFkZChwb3MsIHNjYWxlZFJpZ2h0LCBzY3JhdGNoNCk7CiAgICAgIHJpZ2h0UG9zaXRpb25zW3JpZ2h0SW5kZXgrK10gPSByaWdodFBvcy54OwogICAgICByaWdodFBvc2l0aW9uc1tyaWdodEluZGV4KytdID0gcmlnaHRQb3MueTsKICAgICAgcmlnaHRQb3NpdGlvbnNbcmlnaHRJbmRleCsrXSA9IHJpZ2h0UG9zLno7CiAgICAgIGNvbnN0IGxlZnRQb3MgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHBvcywgc2NhbGVkTGVmdCwgc2NyYXRjaDQpOwogICAgICBsZWZ0UG9zaXRpb25zW2xlZnRJbmRleC0tXSA9IGxlZnRQb3MuejsKICAgICAgbGVmdFBvc2l0aW9uc1tsZWZ0SW5kZXgtLV0gPSBsZWZ0UG9zLnk7CiAgICAgIGxlZnRQb3NpdGlvbnNbbGVmdEluZGV4LS1dID0gbGVmdFBvcy54OwogICAgfQogICAgY2FsY3VsYXRlZFBvc2l0aW9ucy5wdXNoKHJpZ2h0UG9zaXRpb25zLCBsZWZ0UG9zaXRpb25zKTsKICAgIHJldHVybiBjYWxjdWxhdGVkUG9zaXRpb25zOwogIH0KICB2YXIgQ29ycmlkb3JHZW9tZXRyeUxpYnJhcnksIHNjcmF0Y2gxMiwgc2NyYXRjaDIyLCBzY3JhdGNoMywgc2NyYXRjaDQsIHNjYWxlQXJyYXkyLCBjYXJ0ZXNpYW4xLCBjYXJ0ZXNpYW4yLCBjYXJ0ZXNpYW4zLCBjYXJ0ZXNpYW40LCBjYXJ0ZXNpYW41LCBjYXJ0ZXNpYW42LCBjYXJ0ZXNpYW43LCBjYXJ0ZXNpYW44LCBjYXJ0ZXNpYW45LCBjYXJ0ZXNpYW4xMCwgcXVhdGVyaW9uMiwgcm90TWF0cml4Miwgc2NyYXRjaEZvcndhcmRQcm9qZWN0aW9uMiwgc2NyYXRjaEJhY2t3YXJkUHJvamVjdGlvbjIsIENvcnJpZG9yR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfQ29ycmlkb3JHZW9tZXRyeUxpYnJhcnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NvcnJpZG9yR2VvbWV0cnlMaWJyYXJ5LmpzIigpIHsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ29ybmVyVHlwZSgpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGluaXRfTWF0cml4MygpOwogICAgICBpbml0X1BvbHlsaW5lUGlwZWxpbmUoKTsKICAgICAgaW5pdF9Qb2x5bGluZVZvbHVtZUdlb21ldHJ5TGlicmFyeSgpOwogICAgICBpbml0X1F1YXRlcm5pb24oKTsKICAgICAgQ29ycmlkb3JHZW9tZXRyeUxpYnJhcnkgPSB7fTsKICAgICAgc2NyYXRjaDEyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoMjIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2gzID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoNCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NhbGVBcnJheTIgPSBbbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpLCBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCldOwogICAgICBjYXJ0ZXNpYW4xID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYXJ0ZXNpYW4yID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYXJ0ZXNpYW4zID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYXJ0ZXNpYW40ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYXJ0ZXNpYW41ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYXJ0ZXNpYW42ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYXJ0ZXNpYW43ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYXJ0ZXNpYW44ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYXJ0ZXNpYW45ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYXJ0ZXNpYW4xMCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgcXVhdGVyaW9uMiA9IG5ldyBRdWF0ZXJuaW9uX2RlZmF1bHQoKTsKICAgICAgcm90TWF0cml4MiA9IG5ldyBNYXRyaXgzX2RlZmF1bHQoKTsKICAgICAgQ29ycmlkb3JHZW9tZXRyeUxpYnJhcnkuYWRkQXR0cmlidXRlID0gZnVuY3Rpb24oYXR0cmlidXRlLCB2YWx1ZSwgZnJvbnQsIGJhY2spIHsKICAgICAgICBjb25zdCB4ID0gdmFsdWUueDsKICAgICAgICBjb25zdCB5ID0gdmFsdWUueTsKICAgICAgICBjb25zdCB6ID0gdmFsdWUuejsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGZyb250KSkgewogICAgICAgICAgYXR0cmlidXRlW2Zyb250XSA9IHg7CiAgICAgICAgICBhdHRyaWJ1dGVbZnJvbnQgKyAxXSA9IHk7CiAgICAgICAgICBhdHRyaWJ1dGVbZnJvbnQgKyAyXSA9IHo7CiAgICAgICAgfQogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoYmFjaykpIHsKICAgICAgICAgIGF0dHJpYnV0ZVtiYWNrXSA9IHo7CiAgICAgICAgICBhdHRyaWJ1dGVbYmFjayAtIDFdID0geTsKICAgICAgICAgIGF0dHJpYnV0ZVtiYWNrIC0gMl0gPSB4OwogICAgICAgIH0KICAgICAgfTsKICAgICAgc2NyYXRjaEZvcndhcmRQcm9qZWN0aW9uMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaEJhY2t3YXJkUHJvamVjdGlvbjIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIENvcnJpZG9yR2VvbWV0cnlMaWJyYXJ5LmNvbXB1dGVQb3NpdGlvbnMgPSBmdW5jdGlvbihwYXJhbXMpIHsKICAgICAgICBjb25zdCBncmFudWxhcml0eSA9IHBhcmFtcy5ncmFudWxhcml0eTsKICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBwYXJhbXMucG9zaXRpb25zOwogICAgICAgIGNvbnN0IGVsbGlwc29pZCA9IHBhcmFtcy5lbGxpcHNvaWQ7CiAgICAgICAgY29uc3Qgd2lkdGggPSBwYXJhbXMud2lkdGggLyAyOwogICAgICAgIGNvbnN0IGNvcm5lclR5cGUgPSBwYXJhbXMuY29ybmVyVHlwZTsKICAgICAgICBjb25zdCBzYXZlQXR0cmlidXRlcyA9IHBhcmFtcy5zYXZlQXR0cmlidXRlczsKICAgICAgICBsZXQgbm9ybWFsMiA9IGNhcnRlc2lhbjE7CiAgICAgICAgbGV0IGZvcndhcmQgPSBjYXJ0ZXNpYW4yOwogICAgICAgIGxldCBiYWNrd2FyZCA9IGNhcnRlc2lhbjM7CiAgICAgICAgbGV0IGxlZnQgPSBjYXJ0ZXNpYW40OwogICAgICAgIGxldCBjb3JuZXJEaXJlY3Rpb24gPSBjYXJ0ZXNpYW41OwogICAgICAgIGxldCBzdGFydFBvaW50ID0gY2FydGVzaWFuNjsKICAgICAgICBsZXQgcHJldmlvdXNQb3MgPSBjYXJ0ZXNpYW43OwogICAgICAgIGxldCByaWdodFBvcyA9IGNhcnRlc2lhbjg7CiAgICAgICAgbGV0IGxlZnRQb3MgPSBjYXJ0ZXNpYW45OwogICAgICAgIGxldCBjZW50ZXIgPSBjYXJ0ZXNpYW4xMDsKICAgICAgICBsZXQgY2FsY3VsYXRlZFBvc2l0aW9ucyA9IFtdOwogICAgICAgIGNvbnN0IGNhbGN1bGF0ZWRMZWZ0cyA9IHNhdmVBdHRyaWJ1dGVzID8gW10gOiB2b2lkIDA7CiAgICAgICAgY29uc3QgY2FsY3VsYXRlZE5vcm1hbHMgPSBzYXZlQXR0cmlidXRlcyA/IFtdIDogdm9pZCAwOwogICAgICAgIGxldCBwb3NpdGlvbiA9IHBvc2l0aW9uc1swXTsKICAgICAgICBsZXQgbmV4dFBvc2l0aW9uID0gcG9zaXRpb25zWzFdOwogICAgICAgIGZvcndhcmQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KG5leHRQb3NpdGlvbiwgcG9zaXRpb24sIGZvcndhcmQpLAogICAgICAgICAgZm9yd2FyZAogICAgICAgICk7CiAgICAgICAgbm9ybWFsMiA9IGVsbGlwc29pZC5nZW9kZXRpY1N1cmZhY2VOb3JtYWwocG9zaXRpb24sIG5vcm1hbDIpOwogICAgICAgIGxlZnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhub3JtYWwyLCBmb3J3YXJkLCBsZWZ0KSwgbGVmdCk7CiAgICAgICAgaWYgKHNhdmVBdHRyaWJ1dGVzKSB7CiAgICAgICAgICBjYWxjdWxhdGVkTGVmdHMucHVzaChsZWZ0LngsIGxlZnQueSwgbGVmdC56KTsKICAgICAgICAgIGNhbGN1bGF0ZWROb3JtYWxzLnB1c2gobm9ybWFsMi54LCBub3JtYWwyLnksIG5vcm1hbDIueik7CiAgICAgICAgfQogICAgICAgIHByZXZpb3VzUG9zID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKHBvc2l0aW9uLCBwcmV2aW91c1Bvcyk7CiAgICAgICAgcG9zaXRpb24gPSBuZXh0UG9zaXRpb247CiAgICAgICAgYmFja3dhcmQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKGZvcndhcmQsIGJhY2t3YXJkKTsKICAgICAgICBsZXQgc3ViZGl2aWRlZFBvc2l0aW9uczsKICAgICAgICBjb25zdCBjb3JuZXJzID0gW107CiAgICAgICAgbGV0IGk7CiAgICAgICAgY29uc3QgbGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aDsKICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICBub3JtYWwyID0gZWxsaXBzb2lkLmdlb2RldGljU3VyZmFjZU5vcm1hbChwb3NpdGlvbiwgbm9ybWFsMik7CiAgICAgICAgICBuZXh0UG9zaXRpb24gPSBwb3NpdGlvbnNbaSArIDFdOwogICAgICAgICAgZm9yd2FyZCA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoCiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChuZXh0UG9zaXRpb24sIHBvc2l0aW9uLCBmb3J3YXJkKSwKICAgICAgICAgICAgZm9yd2FyZAogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IGZvcndhcmRQcm9qZWN0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoCiAgICAgICAgICAgIG5vcm1hbDIsCiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoZm9yd2FyZCwgbm9ybWFsMiksCiAgICAgICAgICAgIHNjcmF0Y2hGb3J3YXJkUHJvamVjdGlvbjIKICAgICAgICAgICk7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoZm9yd2FyZCwgZm9yd2FyZFByb2plY3Rpb24sIGZvcndhcmRQcm9qZWN0aW9uKTsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoZm9yd2FyZFByb2plY3Rpb24sIGZvcndhcmRQcm9qZWN0aW9uKTsKICAgICAgICAgIGNvbnN0IGJhY2t3YXJkUHJvamVjdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKAogICAgICAgICAgICBub3JtYWwyLAogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KGJhY2t3YXJkLCBub3JtYWwyKSwKICAgICAgICAgICAgc2NyYXRjaEJhY2t3YXJkUHJvamVjdGlvbjIKICAgICAgICAgICk7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoYmFja3dhcmQsIGJhY2t3YXJkUHJvamVjdGlvbiwgYmFja3dhcmRQcm9qZWN0aW9uKTsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoYmFja3dhcmRQcm9qZWN0aW9uLCBiYWNrd2FyZFByb2plY3Rpb24pOwogICAgICAgICAgY29uc3QgZG9Db3JuZXIgPSAhTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oCiAgICAgICAgICAgIE1hdGguYWJzKENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoZm9yd2FyZFByb2plY3Rpb24sIGJhY2t3YXJkUHJvamVjdGlvbikpLAogICAgICAgICAgICAxLAogICAgICAgICAgICBNYXRoX2RlZmF1bHQuRVBTSUxPTjcKICAgICAgICAgICk7CiAgICAgICAgICBpZiAoZG9Db3JuZXIpIHsKICAgICAgICAgICAgY29ybmVyRGlyZWN0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGZvcndhcmQsIGJhY2t3YXJkLCBjb3JuZXJEaXJlY3Rpb24pLAogICAgICAgICAgICAgIGNvcm5lckRpcmVjdGlvbgogICAgICAgICAgICApOwogICAgICAgICAgICBjb3JuZXJEaXJlY3Rpb24gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3MoCiAgICAgICAgICAgICAgY29ybmVyRGlyZWN0aW9uLAogICAgICAgICAgICAgIG5vcm1hbDIsCiAgICAgICAgICAgICAgY29ybmVyRGlyZWN0aW9uCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNvcm5lckRpcmVjdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcygKICAgICAgICAgICAgICBub3JtYWwyLAogICAgICAgICAgICAgIGNvcm5lckRpcmVjdGlvbiwKICAgICAgICAgICAgICBjb3JuZXJEaXJlY3Rpb24KICAgICAgICAgICAgKTsKICAgICAgICAgICAgY29ybmVyRGlyZWN0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShjb3JuZXJEaXJlY3Rpb24sIGNvcm5lckRpcmVjdGlvbik7CiAgICAgICAgICAgIGNvbnN0IHNjYWxhciA9IHdpZHRoIC8gTWF0aC5tYXgoCiAgICAgICAgICAgICAgMC4yNSwKICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubWFnbml0dWRlKAogICAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKGNvcm5lckRpcmVjdGlvbiwgYmFja3dhcmQsIHNjcmF0Y2gxMikKICAgICAgICAgICAgICApCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNvbnN0IGxlZnRJc091dHNpZGUgPSBQb2x5bGluZVZvbHVtZUdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmFuZ2xlSXNHcmVhdGVyVGhhblBpKAogICAgICAgICAgICAgIGZvcndhcmQsCiAgICAgICAgICAgICAgYmFja3dhcmQsCiAgICAgICAgICAgICAgcG9zaXRpb24sCiAgICAgICAgICAgICAgZWxsaXBzb2lkCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNvcm5lckRpcmVjdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKAogICAgICAgICAgICAgIGNvcm5lckRpcmVjdGlvbiwKICAgICAgICAgICAgICBzY2FsYXIsCiAgICAgICAgICAgICAgY29ybmVyRGlyZWN0aW9uCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmIChsZWZ0SXNPdXRzaWRlKSB7CiAgICAgICAgICAgICAgcmlnaHRQb3MgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHBvc2l0aW9uLCBjb3JuZXJEaXJlY3Rpb24sIHJpZ2h0UG9zKTsKICAgICAgICAgICAgICBjZW50ZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKAogICAgICAgICAgICAgICAgcmlnaHRQb3MsCiAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihsZWZ0LCB3aWR0aCwgY2VudGVyKSwKICAgICAgICAgICAgICAgIGNlbnRlcgogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgbGVmdFBvcyA9IENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoCiAgICAgICAgICAgICAgICByaWdodFBvcywKICAgICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKGxlZnQsIHdpZHRoICogMiwgbGVmdFBvcyksCiAgICAgICAgICAgICAgICBsZWZ0UG9zCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICBzY2FsZUFycmF5MlswXSA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShwcmV2aW91c1Bvcywgc2NhbGVBcnJheTJbMF0pOwogICAgICAgICAgICAgIHNjYWxlQXJyYXkyWzFdID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGNlbnRlciwgc2NhbGVBcnJheTJbMV0pOwogICAgICAgICAgICAgIHN1YmRpdmlkZWRQb3NpdGlvbnMgPSBQb2x5bGluZVBpcGVsaW5lX2RlZmF1bHQuZ2VuZXJhdGVBcmMoewogICAgICAgICAgICAgICAgcG9zaXRpb25zOiBzY2FsZUFycmF5MiwKICAgICAgICAgICAgICAgIGdyYW51bGFyaXR5LAogICAgICAgICAgICAgICAgZWxsaXBzb2lkCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgY2FsY3VsYXRlZFBvc2l0aW9ucyA9IGFkZFNoaWZ0ZWRQb3NpdGlvbnMoCiAgICAgICAgICAgICAgICBzdWJkaXZpZGVkUG9zaXRpb25zLAogICAgICAgICAgICAgICAgbGVmdCwKICAgICAgICAgICAgICAgIHdpZHRoLAogICAgICAgICAgICAgICAgY2FsY3VsYXRlZFBvc2l0aW9ucwogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgaWYgKHNhdmVBdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgICBjYWxjdWxhdGVkTGVmdHMucHVzaChsZWZ0LngsIGxlZnQueSwgbGVmdC56KTsKICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWROb3JtYWxzLnB1c2gobm9ybWFsMi54LCBub3JtYWwyLnksIG5vcm1hbDIueik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN0YXJ0UG9pbnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUobGVmdFBvcywgc3RhcnRQb2ludCk7CiAgICAgICAgICAgICAgbGVmdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoCiAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3Mobm9ybWFsMiwgZm9yd2FyZCwgbGVmdCksCiAgICAgICAgICAgICAgICBsZWZ0CiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICBsZWZ0UG9zID0gQ2FydGVzaWFuM19kZWZhdWx0LmFkZCgKICAgICAgICAgICAgICAgIHJpZ2h0UG9zLAogICAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIobGVmdCwgd2lkdGggKiAyLCBsZWZ0UG9zKSwKICAgICAgICAgICAgICAgIGxlZnRQb3MKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIHByZXZpb3VzUG9zID0gQ2FydGVzaWFuM19kZWZhdWx0LmFkZCgKICAgICAgICAgICAgICAgIHJpZ2h0UG9zLAogICAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIobGVmdCwgd2lkdGgsIHByZXZpb3VzUG9zKSwKICAgICAgICAgICAgICAgIHByZXZpb3VzUG9zCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICBpZiAoY29ybmVyVHlwZSA9PT0gQ29ybmVyVHlwZV9kZWZhdWx0LlJPVU5ERUQgfHwgY29ybmVyVHlwZSA9PT0gQ29ybmVyVHlwZV9kZWZhdWx0LkJFVkVMRUQpIHsKICAgICAgICAgICAgICAgIGNvcm5lcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgIGxlZnRQb3NpdGlvbnM6IGNvbXB1dGVSb3VuZENvcm5lcjIoCiAgICAgICAgICAgICAgICAgICAgcmlnaHRQb3MsCiAgICAgICAgICAgICAgICAgICAgc3RhcnRQb2ludCwKICAgICAgICAgICAgICAgICAgICBsZWZ0UG9zLAogICAgICAgICAgICAgICAgICAgIGNvcm5lclR5cGUsCiAgICAgICAgICAgICAgICAgICAgbGVmdElzT3V0c2lkZQogICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29ybmVycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgbGVmdFBvc2l0aW9uczogY29tcHV0ZU1pdGVyZWRDb3JuZXIoCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZShjb3JuZXJEaXJlY3Rpb24sIGNvcm5lckRpcmVjdGlvbiksCiAgICAgICAgICAgICAgICAgICAgbGVmdFBvcywKICAgICAgICAgICAgICAgICAgICBsZWZ0SXNPdXRzaWRlCiAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBsZWZ0UG9zID0gQ2FydGVzaWFuM19kZWZhdWx0LmFkZChwb3NpdGlvbiwgY29ybmVyRGlyZWN0aW9uLCBsZWZ0UG9zKTsKICAgICAgICAgICAgICBjZW50ZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKAogICAgICAgICAgICAgICAgbGVmdFBvcywKICAgICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5uZWdhdGUoCiAgICAgICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKGxlZnQsIHdpZHRoLCBjZW50ZXIpLAogICAgICAgICAgICAgICAgICBjZW50ZXIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBjZW50ZXIKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIHJpZ2h0UG9zID0gQ2FydGVzaWFuM19kZWZhdWx0LmFkZCgKICAgICAgICAgICAgICAgIGxlZnRQb3MsCiAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKAogICAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihsZWZ0LCB3aWR0aCAqIDIsIHJpZ2h0UG9zKSwKICAgICAgICAgICAgICAgICAgcmlnaHRQb3MKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICByaWdodFBvcwogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgc2NhbGVBcnJheTJbMF0gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUocHJldmlvdXNQb3MsIHNjYWxlQXJyYXkyWzBdKTsKICAgICAgICAgICAgICBzY2FsZUFycmF5MlsxXSA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShjZW50ZXIsIHNjYWxlQXJyYXkyWzFdKTsKICAgICAgICAgICAgICBzdWJkaXZpZGVkUG9zaXRpb25zID0gUG9seWxpbmVQaXBlbGluZV9kZWZhdWx0LmdlbmVyYXRlQXJjKHsKICAgICAgICAgICAgICAgIHBvc2l0aW9uczogc2NhbGVBcnJheTIsCiAgICAgICAgICAgICAgICBncmFudWxhcml0eSwKICAgICAgICAgICAgICAgIGVsbGlwc29pZAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGNhbGN1bGF0ZWRQb3NpdGlvbnMgPSBhZGRTaGlmdGVkUG9zaXRpb25zKAogICAgICAgICAgICAgICAgc3ViZGl2aWRlZFBvc2l0aW9ucywKICAgICAgICAgICAgICAgIGxlZnQsCiAgICAgICAgICAgICAgICB3aWR0aCwKICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRQb3NpdGlvbnMKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIGlmIChzYXZlQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgY2FsY3VsYXRlZExlZnRzLnB1c2gobGVmdC54LCBsZWZ0LnksIGxlZnQueik7CiAgICAgICAgICAgICAgICBjYWxjdWxhdGVkTm9ybWFscy5wdXNoKG5vcm1hbDIueCwgbm9ybWFsMi55LCBub3JtYWwyLnopOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdGFydFBvaW50ID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKHJpZ2h0UG9zLCBzdGFydFBvaW50KTsKICAgICAgICAgICAgICBsZWZ0ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhub3JtYWwyLCBmb3J3YXJkLCBsZWZ0KSwKICAgICAgICAgICAgICAgIGxlZnQKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIHJpZ2h0UG9zID0gQ2FydGVzaWFuM19kZWZhdWx0LmFkZCgKICAgICAgICAgICAgICAgIGxlZnRQb3MsCiAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKAogICAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihsZWZ0LCB3aWR0aCAqIDIsIHJpZ2h0UG9zKSwKICAgICAgICAgICAgICAgICAgcmlnaHRQb3MKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICByaWdodFBvcwogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgcHJldmlvdXNQb3MgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKAogICAgICAgICAgICAgICAgbGVmdFBvcywKICAgICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5uZWdhdGUoCiAgICAgICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKGxlZnQsIHdpZHRoLCBwcmV2aW91c1BvcyksCiAgICAgICAgICAgICAgICAgIHByZXZpb3VzUG9zCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgcHJldmlvdXNQb3MKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIGlmIChjb3JuZXJUeXBlID09PSBDb3JuZXJUeXBlX2RlZmF1bHQuUk9VTkRFRCB8fCBjb3JuZXJUeXBlID09PSBDb3JuZXJUeXBlX2RlZmF1bHQuQkVWRUxFRCkgewogICAgICAgICAgICAgICAgY29ybmVycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgcmlnaHRQb3NpdGlvbnM6IGNvbXB1dGVSb3VuZENvcm5lcjIoCiAgICAgICAgICAgICAgICAgICAgbGVmdFBvcywKICAgICAgICAgICAgICAgICAgICBzdGFydFBvaW50LAogICAgICAgICAgICAgICAgICAgIHJpZ2h0UG9zLAogICAgICAgICAgICAgICAgICAgIGNvcm5lclR5cGUsCiAgICAgICAgICAgICAgICAgICAgbGVmdElzT3V0c2lkZQogICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29ybmVycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgcmlnaHRQb3NpdGlvbnM6IGNvbXB1dGVNaXRlcmVkQ29ybmVyKAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgIGNvcm5lckRpcmVjdGlvbiwKICAgICAgICAgICAgICAgICAgICByaWdodFBvcywKICAgICAgICAgICAgICAgICAgICBsZWZ0SXNPdXRzaWRlCiAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBiYWNrd2FyZCA9IENhcnRlc2lhbjNfZGVmYXVsdC5uZWdhdGUoZm9yd2FyZCwgYmFja3dhcmQpOwogICAgICAgICAgfQogICAgICAgICAgcG9zaXRpb24gPSBuZXh0UG9zaXRpb247CiAgICAgICAgfQogICAgICAgIG5vcm1hbDIgPSBlbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKHBvc2l0aW9uLCBub3JtYWwyKTsKICAgICAgICBzY2FsZUFycmF5MlswXSA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShwcmV2aW91c1Bvcywgc2NhbGVBcnJheTJbMF0pOwogICAgICAgIHNjYWxlQXJyYXkyWzFdID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKHBvc2l0aW9uLCBzY2FsZUFycmF5MlsxXSk7CiAgICAgICAgc3ViZGl2aWRlZFBvc2l0aW9ucyA9IFBvbHlsaW5lUGlwZWxpbmVfZGVmYXVsdC5nZW5lcmF0ZUFyYyh7CiAgICAgICAgICBwb3NpdGlvbnM6IHNjYWxlQXJyYXkyLAogICAgICAgICAgZ3JhbnVsYXJpdHksCiAgICAgICAgICBlbGxpcHNvaWQKICAgICAgICB9KTsKICAgICAgICBjYWxjdWxhdGVkUG9zaXRpb25zID0gYWRkU2hpZnRlZFBvc2l0aW9ucygKICAgICAgICAgIHN1YmRpdmlkZWRQb3NpdGlvbnMsCiAgICAgICAgICBsZWZ0LAogICAgICAgICAgd2lkdGgsCiAgICAgICAgICBjYWxjdWxhdGVkUG9zaXRpb25zCiAgICAgICAgKTsKICAgICAgICBpZiAoc2F2ZUF0dHJpYnV0ZXMpIHsKICAgICAgICAgIGNhbGN1bGF0ZWRMZWZ0cy5wdXNoKGxlZnQueCwgbGVmdC55LCBsZWZ0LnopOwogICAgICAgICAgY2FsY3VsYXRlZE5vcm1hbHMucHVzaChub3JtYWwyLngsIG5vcm1hbDIueSwgbm9ybWFsMi56KTsKICAgICAgICB9CiAgICAgICAgbGV0IGVuZFBvc2l0aW9uczsKICAgICAgICBpZiAoY29ybmVyVHlwZSA9PT0gQ29ybmVyVHlwZV9kZWZhdWx0LlJPVU5ERUQpIHsKICAgICAgICAgIGVuZFBvc2l0aW9ucyA9IGFkZEVuZENhcHMoY2FsY3VsYXRlZFBvc2l0aW9ucyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICBwb3NpdGlvbnM6IGNhbGN1bGF0ZWRQb3NpdGlvbnMsCiAgICAgICAgICBjb3JuZXJzLAogICAgICAgICAgbGVmdHM6IGNhbGN1bGF0ZWRMZWZ0cywKICAgICAgICAgIG5vcm1hbHM6IGNhbGN1bGF0ZWROb3JtYWxzLAogICAgICAgICAgZW5kUG9zaXRpb25zCiAgICAgICAgfTsKICAgICAgfTsKICAgICAgQ29ycmlkb3JHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdCA9IENvcnJpZG9yR2VvbWV0cnlMaWJyYXJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ29ycmlkb3JHZW9tZXRyeS5qcwogIGZ1bmN0aW9uIHNjYWxlVG9TdXJmYWNlMihwb3NpdGlvbnMsIGVsbGlwc29pZCkgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgcG9zaXRpb25zW2ldID0gZWxsaXBzb2lkLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UocG9zaXRpb25zW2ldLCBwb3NpdGlvbnNbaV0pOwogICAgfQogICAgcmV0dXJuIHBvc2l0aW9uczsKICB9CiAgZnVuY3Rpb24gYWRkTm9ybWFscyhhdHRyLCBub3JtYWwyLCBsZWZ0LCBmcm9udCwgYmFjaywgdmVydGV4Rm9ybWF0KSB7CiAgICBjb25zdCBub3JtYWxzID0gYXR0ci5ub3JtYWxzOwogICAgY29uc3QgdGFuZ2VudHMgPSBhdHRyLnRhbmdlbnRzOwogICAgY29uc3QgYml0YW5nZW50cyA9IGF0dHIuYml0YW5nZW50czsKICAgIGNvbnN0IGZvcndhcmQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKAogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3MobGVmdCwgbm9ybWFsMiwgc2NyYXRjaDEzKSwKICAgICAgc2NyYXRjaDEzCiAgICApOwogICAgaWYgKHZlcnRleEZvcm1hdC5ub3JtYWwpIHsKICAgICAgQ29ycmlkb3JHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5hZGRBdHRyaWJ1dGUobm9ybWFscywgbm9ybWFsMiwgZnJvbnQsIGJhY2spOwogICAgfQogICAgaWYgKHZlcnRleEZvcm1hdC50YW5nZW50KSB7CiAgICAgIENvcnJpZG9yR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuYWRkQXR0cmlidXRlKHRhbmdlbnRzLCBmb3J3YXJkLCBmcm9udCwgYmFjayk7CiAgICB9CiAgICBpZiAodmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgewogICAgICBDb3JyaWRvckdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmFkZEF0dHJpYnV0ZShiaXRhbmdlbnRzLCBsZWZ0LCBmcm9udCwgYmFjayk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGNvbWJpbmUyKGNvbXB1dGVkUG9zaXRpb25zLCB2ZXJ0ZXhGb3JtYXQsIGVsbGlwc29pZCkgewogICAgY29uc3QgcG9zaXRpb25zID0gY29tcHV0ZWRQb3NpdGlvbnMucG9zaXRpb25zOwogICAgY29uc3QgY29ybmVycyA9IGNvbXB1dGVkUG9zaXRpb25zLmNvcm5lcnM7CiAgICBjb25zdCBlbmRQb3NpdGlvbnMgPSBjb21wdXRlZFBvc2l0aW9ucy5lbmRQb3NpdGlvbnM7CiAgICBjb25zdCBjb21wdXRlZExlZnRzID0gY29tcHV0ZWRQb3NpdGlvbnMubGVmdHM7CiAgICBjb25zdCBjb21wdXRlZE5vcm1hbHMgPSBjb21wdXRlZFBvc2l0aW9ucy5ub3JtYWxzOwogICAgY29uc3QgYXR0cmlidXRlcyA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZXNfZGVmYXVsdCgpOwogICAgbGV0IGNvcm5lcjsKICAgIGxldCBsZWZ0Q291bnQgPSAwOwogICAgbGV0IHJpZ2h0Q291bnQgPSAwOwogICAgbGV0IGk7CiAgICBsZXQgaW5kaWNlc0xlbmd0aCA9IDA7CiAgICBsZXQgbGVuZ3RoOwogICAgZm9yIChpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkgKz0gMikgewogICAgICBsZW5ndGggPSBwb3NpdGlvbnNbaV0ubGVuZ3RoIC0gMzsKICAgICAgbGVmdENvdW50ICs9IGxlbmd0aDsKICAgICAgaW5kaWNlc0xlbmd0aCArPSBsZW5ndGggKiAyOwogICAgICByaWdodENvdW50ICs9IHBvc2l0aW9uc1tpICsgMV0ubGVuZ3RoIC0gMzsKICAgIH0KICAgIGxlZnRDb3VudCArPSAzOwogICAgcmlnaHRDb3VudCArPSAzOwogICAgZm9yIChpID0gMDsgaSA8IGNvcm5lcnMubGVuZ3RoOyBpKyspIHsKICAgICAgY29ybmVyID0gY29ybmVyc1tpXTsKICAgICAgY29uc3QgbGVmdFNpZGUgPSBjb3JuZXJzW2ldLmxlZnRQb3NpdGlvbnM7CiAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQobGVmdFNpZGUpKSB7CiAgICAgICAgbGVuZ3RoID0gbGVmdFNpZGUubGVuZ3RoOwogICAgICAgIGxlZnRDb3VudCArPSBsZW5ndGg7CiAgICAgICAgaW5kaWNlc0xlbmd0aCArPSBsZW5ndGg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGVuZ3RoID0gY29ybmVyc1tpXS5yaWdodFBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgcmlnaHRDb3VudCArPSBsZW5ndGg7CiAgICAgICAgaW5kaWNlc0xlbmd0aCArPSBsZW5ndGg7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGFkZEVuZFBvc2l0aW9ucyA9IGRlZmluZWRfZGVmYXVsdChlbmRQb3NpdGlvbnMpOwogICAgbGV0IGVuZFBvc2l0aW9uTGVuZ3RoOwogICAgaWYgKGFkZEVuZFBvc2l0aW9ucykgewogICAgICBlbmRQb3NpdGlvbkxlbmd0aCA9IGVuZFBvc2l0aW9uc1swXS5sZW5ndGggLSAzOwogICAgICBsZWZ0Q291bnQgKz0gZW5kUG9zaXRpb25MZW5ndGg7CiAgICAgIHJpZ2h0Q291bnQgKz0gZW5kUG9zaXRpb25MZW5ndGg7CiAgICAgIGVuZFBvc2l0aW9uTGVuZ3RoIC89IDM7CiAgICAgIGluZGljZXNMZW5ndGggKz0gZW5kUG9zaXRpb25MZW5ndGggKiA2OwogICAgfQogICAgY29uc3Qgc2l6ZSA9IGxlZnRDb3VudCArIHJpZ2h0Q291bnQ7CiAgICBjb25zdCBmaW5hbFBvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSk7CiAgICBjb25zdCBub3JtYWxzID0gdmVydGV4Rm9ybWF0Lm5vcm1hbCA/IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSkgOiB2b2lkIDA7CiAgICBjb25zdCB0YW5nZW50cyA9IHZlcnRleEZvcm1hdC50YW5nZW50ID8gbmV3IEZsb2F0MzJBcnJheShzaXplKSA6IHZvaWQgMDsKICAgIGNvbnN0IGJpdGFuZ2VudHMgPSB2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50ID8gbmV3IEZsb2F0MzJBcnJheShzaXplKSA6IHZvaWQgMDsKICAgIGNvbnN0IGF0dHIgPSB7CiAgICAgIG5vcm1hbHMsCiAgICAgIHRhbmdlbnRzLAogICAgICBiaXRhbmdlbnRzCiAgICB9OwogICAgbGV0IGZyb250ID0gMDsKICAgIGxldCBiYWNrID0gc2l6ZSAtIDE7CiAgICBsZXQgVUwsIExMLCBVUiwgTFI7CiAgICBsZXQgbm9ybWFsMiA9IGNhcnRlc2lhbjEyOwogICAgbGV0IGxlZnQgPSBjYXJ0ZXNpYW4yMjsKICAgIGxldCByaWdodFBvcywgbGVmdFBvczsKICAgIGNvbnN0IGhhbGZMZW5ndGggPSBlbmRQb3NpdGlvbkxlbmd0aCAvIDI7CiAgICBjb25zdCBpbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkoc2l6ZSAvIDMsIGluZGljZXNMZW5ndGgpOwogICAgbGV0IGluZGV4ID0gMDsKICAgIGlmIChhZGRFbmRQb3NpdGlvbnMpIHsKICAgICAgbGVmdFBvcyA9IGNhcnRlc2lhbjMyOwogICAgICByaWdodFBvcyA9IGNhcnRlc2lhbjQyOwogICAgICBjb25zdCBmaXJzdEVuZFBvc2l0aW9ucyA9IGVuZFBvc2l0aW9uc1swXTsKICAgICAgbm9ybWFsMiA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoY29tcHV0ZWROb3JtYWxzLCAwLCBub3JtYWwyKTsKICAgICAgbGVmdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoY29tcHV0ZWRMZWZ0cywgMCwgbGVmdCk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBoYWxmTGVuZ3RoOyBpKyspIHsKICAgICAgICBsZWZ0UG9zID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheSgKICAgICAgICAgIGZpcnN0RW5kUG9zaXRpb25zLAogICAgICAgICAgKGhhbGZMZW5ndGggLSAxIC0gaSkgKiAzLAogICAgICAgICAgbGVmdFBvcwogICAgICAgICk7CiAgICAgICAgcmlnaHRQb3MgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KAogICAgICAgICAgZmlyc3RFbmRQb3NpdGlvbnMsCiAgICAgICAgICAoaGFsZkxlbmd0aCArIGkpICogMywKICAgICAgICAgIHJpZ2h0UG9zCiAgICAgICAgKTsKICAgICAgICBDb3JyaWRvckdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmFkZEF0dHJpYnV0ZShmaW5hbFBvc2l0aW9ucywgcmlnaHRQb3MsIGZyb250KTsKICAgICAgICBDb3JyaWRvckdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmFkZEF0dHJpYnV0ZSgKICAgICAgICAgIGZpbmFsUG9zaXRpb25zLAogICAgICAgICAgbGVmdFBvcywKICAgICAgICAgIHZvaWQgMCwKICAgICAgICAgIGJhY2sKICAgICAgICApOwogICAgICAgIGFkZE5vcm1hbHMoYXR0ciwgbm9ybWFsMiwgbGVmdCwgZnJvbnQsIGJhY2ssIHZlcnRleEZvcm1hdCk7CiAgICAgICAgTEwgPSBmcm9udCAvIDM7CiAgICAgICAgTFIgPSBMTCArIDE7CiAgICAgICAgVUwgPSAoYmFjayAtIDIpIC8gMzsKICAgICAgICBVUiA9IFVMIC0gMTsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gVUw7CiAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IExMOwogICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBVUjsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gVVI7CiAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IExMOwogICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBMUjsKICAgICAgICBmcm9udCArPSAzOwogICAgICAgIGJhY2sgLT0gMzsKICAgICAgfQogICAgfQogICAgbGV0IHBvc0luZGV4ID0gMDsKICAgIGxldCBjb21wSW5kZXggPSAwOwogICAgbGV0IHJpZ2h0RWRnZSA9IHBvc2l0aW9uc1twb3NJbmRleCsrXTsKICAgIGxldCBsZWZ0RWRnZSA9IHBvc2l0aW9uc1twb3NJbmRleCsrXTsKICAgIGZpbmFsUG9zaXRpb25zLnNldChyaWdodEVkZ2UsIGZyb250KTsKICAgIGZpbmFsUG9zaXRpb25zLnNldChsZWZ0RWRnZSwgYmFjayAtIGxlZnRFZGdlLmxlbmd0aCArIDEpOwogICAgbGVmdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoY29tcHV0ZWRMZWZ0cywgY29tcEluZGV4LCBsZWZ0KTsKICAgIGxldCByaWdodE5vcm1hbDsKICAgIGxldCBsZWZ0Tm9ybWFsOwogICAgbGVuZ3RoID0gbGVmdEVkZ2UubGVuZ3RoIC0gMzsKICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMykgewogICAgICByaWdodE5vcm1hbCA9IGVsbGlwc29pZC5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoCiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShyaWdodEVkZ2UsIGksIHNjcmF0Y2gxMyksCiAgICAgICAgc2NyYXRjaDEzCiAgICAgICk7CiAgICAgIGxlZnROb3JtYWwgPSBlbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKAogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkobGVmdEVkZ2UsIGxlbmd0aCAtIGksIHNjcmF0Y2gyMyksCiAgICAgICAgc2NyYXRjaDIzCiAgICAgICk7CiAgICAgIG5vcm1hbDIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKAogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQocmlnaHROb3JtYWwsIGxlZnROb3JtYWwsIG5vcm1hbDIpLAogICAgICAgIG5vcm1hbDIKICAgICAgKTsKICAgICAgYWRkTm9ybWFscyhhdHRyLCBub3JtYWwyLCBsZWZ0LCBmcm9udCwgYmFjaywgdmVydGV4Rm9ybWF0KTsKICAgICAgTEwgPSBmcm9udCAvIDM7CiAgICAgIExSID0gTEwgKyAxOwogICAgICBVTCA9IChiYWNrIC0gMikgLyAzOwogICAgICBVUiA9IFVMIC0gMTsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IFVMOwogICAgICBpbmRpY2VzW2luZGV4KytdID0gTEw7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSBVUjsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IFVSOwogICAgICBpbmRpY2VzW2luZGV4KytdID0gTEw7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSBMUjsKICAgICAgZnJvbnQgKz0gMzsKICAgICAgYmFjayAtPSAzOwogICAgfQogICAgcmlnaHROb3JtYWwgPSBlbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKAogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KHJpZ2h0RWRnZSwgbGVuZ3RoLCBzY3JhdGNoMTMpLAogICAgICBzY3JhdGNoMTMKICAgICk7CiAgICBsZWZ0Tm9ybWFsID0gZWxsaXBzb2lkLmdlb2RldGljU3VyZmFjZU5vcm1hbCgKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShsZWZ0RWRnZSwgbGVuZ3RoLCBzY3JhdGNoMjMpLAogICAgICBzY3JhdGNoMjMKICAgICk7CiAgICBub3JtYWwyID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChyaWdodE5vcm1hbCwgbGVmdE5vcm1hbCwgbm9ybWFsMiksCiAgICAgIG5vcm1hbDIKICAgICk7CiAgICBjb21wSW5kZXggKz0gMzsKICAgIGZvciAoaSA9IDA7IGkgPCBjb3JuZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBqOwogICAgICBjb3JuZXIgPSBjb3JuZXJzW2ldOwogICAgICBjb25zdCBsID0gY29ybmVyLmxlZnRQb3NpdGlvbnM7CiAgICAgIGNvbnN0IHIgPSBjb3JuZXIucmlnaHRQb3NpdGlvbnM7CiAgICAgIGxldCBwaXZvdDsKICAgICAgbGV0IHN0YXJ0OwogICAgICBsZXQgb3V0c2lkZVBvaW50ID0gY2FydGVzaWFuNjI7CiAgICAgIGxldCBwcmV2aW91c1BvaW50ID0gY2FydGVzaWFuMzI7CiAgICAgIGxldCBuZXh0UG9pbnQgPSBjYXJ0ZXNpYW40MjsKICAgICAgbm9ybWFsMiA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoY29tcHV0ZWROb3JtYWxzLCBjb21wSW5kZXgsIG5vcm1hbDIpOwogICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGwpKSB7CiAgICAgICAgYWRkTm9ybWFscyhhdHRyLCBub3JtYWwyLCBsZWZ0LCB2b2lkIDAsIGJhY2ssIHZlcnRleEZvcm1hdCk7CiAgICAgICAgYmFjayAtPSAzOwogICAgICAgIHBpdm90ID0gTFI7CiAgICAgICAgc3RhcnQgPSBVUjsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgbC5sZW5ndGggLyAzOyBqKyspIHsKICAgICAgICAgIG91dHNpZGVQb2ludCA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkobCwgaiAqIDMsIG91dHNpZGVQb2ludCk7CiAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gcGl2b3Q7CiAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gc3RhcnQgLSBqIC0gMTsKICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBzdGFydCAtIGo7CiAgICAgICAgICBDb3JyaWRvckdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmFkZEF0dHJpYnV0ZSgKICAgICAgICAgICAgZmluYWxQb3NpdGlvbnMsCiAgICAgICAgICAgIG91dHNpZGVQb2ludCwKICAgICAgICAgICAgdm9pZCAwLAogICAgICAgICAgICBiYWNrCiAgICAgICAgICApOwogICAgICAgICAgcHJldmlvdXNQb2ludCA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoCiAgICAgICAgICAgIGZpbmFsUG9zaXRpb25zLAogICAgICAgICAgICAoc3RhcnQgLSBqIC0gMSkgKiAzLAogICAgICAgICAgICBwcmV2aW91c1BvaW50CiAgICAgICAgICApOwogICAgICAgICAgbmV4dFBvaW50ID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShmaW5hbFBvc2l0aW9ucywgcGl2b3QgKiAzLCBuZXh0UG9pbnQpOwogICAgICAgICAgbGVmdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoCiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChwcmV2aW91c1BvaW50LCBuZXh0UG9pbnQsIGxlZnQpLAogICAgICAgICAgICBsZWZ0CiAgICAgICAgICApOwogICAgICAgICAgYWRkTm9ybWFscyhhdHRyLCBub3JtYWwyLCBsZWZ0LCB2b2lkIDAsIGJhY2ssIHZlcnRleEZvcm1hdCk7CiAgICAgICAgICBiYWNrIC09IDM7CiAgICAgICAgfQogICAgICAgIG91dHNpZGVQb2ludCA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoCiAgICAgICAgICBmaW5hbFBvc2l0aW9ucywKICAgICAgICAgIHBpdm90ICogMywKICAgICAgICAgIG91dHNpZGVQb2ludAogICAgICAgICk7CiAgICAgICAgcHJldmlvdXNQb2ludCA9IENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdCgKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoZmluYWxQb3NpdGlvbnMsIHN0YXJ0ICogMywgcHJldmlvdXNQb2ludCksCiAgICAgICAgICBvdXRzaWRlUG9pbnQsCiAgICAgICAgICBwcmV2aW91c1BvaW50CiAgICAgICAgKTsKICAgICAgICBuZXh0UG9pbnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KGZpbmFsUG9zaXRpb25zLCAoc3RhcnQgLSBqKSAqIDMsIG5leHRQb2ludCksCiAgICAgICAgICBvdXRzaWRlUG9pbnQsCiAgICAgICAgICBuZXh0UG9pbnQKICAgICAgICApOwogICAgICAgIGxlZnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChwcmV2aW91c1BvaW50LCBuZXh0UG9pbnQsIGxlZnQpLAogICAgICAgICAgbGVmdAogICAgICAgICk7CiAgICAgICAgYWRkTm9ybWFscyhhdHRyLCBub3JtYWwyLCBsZWZ0LCBmcm9udCwgdm9pZCAwLCB2ZXJ0ZXhGb3JtYXQpOwogICAgICAgIGZyb250ICs9IDM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWRkTm9ybWFscyhhdHRyLCBub3JtYWwyLCBsZWZ0LCBmcm9udCwgdm9pZCAwLCB2ZXJ0ZXhGb3JtYXQpOwogICAgICAgIGZyb250ICs9IDM7CiAgICAgICAgcGl2b3QgPSBVUjsKICAgICAgICBzdGFydCA9IExSOwogICAgICAgIGZvciAoaiA9IDA7IGogPCByLmxlbmd0aCAvIDM7IGorKykgewogICAgICAgICAgb3V0c2lkZVBvaW50ID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShyLCBqICogMywgb3V0c2lkZVBvaW50KTsKICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBwaXZvdDsKICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBzdGFydCArIGo7CiAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gc3RhcnQgKyBqICsgMTsKICAgICAgICAgIENvcnJpZG9yR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuYWRkQXR0cmlidXRlKAogICAgICAgICAgICBmaW5hbFBvc2l0aW9ucywKICAgICAgICAgICAgb3V0c2lkZVBvaW50LAogICAgICAgICAgICBmcm9udAogICAgICAgICAgKTsKICAgICAgICAgIHByZXZpb3VzUG9pbnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KAogICAgICAgICAgICBmaW5hbFBvc2l0aW9ucywKICAgICAgICAgICAgcGl2b3QgKiAzLAogICAgICAgICAgICBwcmV2aW91c1BvaW50CiAgICAgICAgICApOwogICAgICAgICAgbmV4dFBvaW50ID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheSgKICAgICAgICAgICAgZmluYWxQb3NpdGlvbnMsCiAgICAgICAgICAgIChzdGFydCArIGopICogMywKICAgICAgICAgICAgbmV4dFBvaW50CiAgICAgICAgICApOwogICAgICAgICAgbGVmdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoCiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChwcmV2aW91c1BvaW50LCBuZXh0UG9pbnQsIGxlZnQpLAogICAgICAgICAgICBsZWZ0CiAgICAgICAgICApOwogICAgICAgICAgYWRkTm9ybWFscyhhdHRyLCBub3JtYWwyLCBsZWZ0LCBmcm9udCwgdm9pZCAwLCB2ZXJ0ZXhGb3JtYXQpOwogICAgICAgICAgZnJvbnQgKz0gMzsKICAgICAgICB9CiAgICAgICAgb3V0c2lkZVBvaW50ID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheSgKICAgICAgICAgIGZpbmFsUG9zaXRpb25zLAogICAgICAgICAgcGl2b3QgKiAzLAogICAgICAgICAgb3V0c2lkZVBvaW50CiAgICAgICAgKTsKICAgICAgICBwcmV2aW91c1BvaW50ID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShmaW5hbFBvc2l0aW9ucywgKHN0YXJ0ICsgaikgKiAzLCBwcmV2aW91c1BvaW50KSwKICAgICAgICAgIG91dHNpZGVQb2ludCwKICAgICAgICAgIHByZXZpb3VzUG9pbnQKICAgICAgICApOwogICAgICAgIG5leHRQb2ludCA9IENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdCgKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoZmluYWxQb3NpdGlvbnMsIHN0YXJ0ICogMywgbmV4dFBvaW50KSwKICAgICAgICAgIG91dHNpZGVQb2ludCwKICAgICAgICAgIG5leHRQb2ludAogICAgICAgICk7CiAgICAgICAgbGVmdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKENhcnRlc2lhbjNfZGVmYXVsdC5hZGQobmV4dFBvaW50LCBwcmV2aW91c1BvaW50LCBsZWZ0KSwgbGVmdCksCiAgICAgICAgICBsZWZ0CiAgICAgICAgKTsKICAgICAgICBhZGROb3JtYWxzKGF0dHIsIG5vcm1hbDIsIGxlZnQsIHZvaWQgMCwgYmFjaywgdmVydGV4Rm9ybWF0KTsKICAgICAgICBiYWNrIC09IDM7CiAgICAgIH0KICAgICAgcmlnaHRFZGdlID0gcG9zaXRpb25zW3Bvc0luZGV4KytdOwogICAgICBsZWZ0RWRnZSA9IHBvc2l0aW9uc1twb3NJbmRleCsrXTsKICAgICAgcmlnaHRFZGdlLnNwbGljZSgwLCAzKTsKICAgICAgbGVmdEVkZ2Uuc3BsaWNlKGxlZnRFZGdlLmxlbmd0aCAtIDMsIDMpOwogICAgICBmaW5hbFBvc2l0aW9ucy5zZXQocmlnaHRFZGdlLCBmcm9udCk7CiAgICAgIGZpbmFsUG9zaXRpb25zLnNldChsZWZ0RWRnZSwgYmFjayAtIGxlZnRFZGdlLmxlbmd0aCArIDEpOwogICAgICBsZW5ndGggPSBsZWZ0RWRnZS5sZW5ndGggLSAzOwogICAgICBjb21wSW5kZXggKz0gMzsKICAgICAgbGVmdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoY29tcHV0ZWRMZWZ0cywgY29tcEluZGV4LCBsZWZ0KTsKICAgICAgZm9yIChqID0gMDsgaiA8IGxlZnRFZGdlLmxlbmd0aDsgaiArPSAzKSB7CiAgICAgICAgcmlnaHROb3JtYWwgPSBlbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShyaWdodEVkZ2UsIGosIHNjcmF0Y2gxMyksCiAgICAgICAgICBzY3JhdGNoMTMKICAgICAgICApOwogICAgICAgIGxlZnROb3JtYWwgPSBlbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShsZWZ0RWRnZSwgbGVuZ3RoIC0gaiwgc2NyYXRjaDIzKSwKICAgICAgICAgIHNjcmF0Y2gyMwogICAgICAgICk7CiAgICAgICAgbm9ybWFsMiA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHJpZ2h0Tm9ybWFsLCBsZWZ0Tm9ybWFsLCBub3JtYWwyKSwKICAgICAgICAgIG5vcm1hbDIKICAgICAgICApOwogICAgICAgIGFkZE5vcm1hbHMoYXR0ciwgbm9ybWFsMiwgbGVmdCwgZnJvbnQsIGJhY2ssIHZlcnRleEZvcm1hdCk7CiAgICAgICAgTFIgPSBmcm9udCAvIDM7CiAgICAgICAgTEwgPSBMUiAtIDE7CiAgICAgICAgVVIgPSAoYmFjayAtIDIpIC8gMzsKICAgICAgICBVTCA9IFVSICsgMTsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gVUw7CiAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IExMOwogICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBVUjsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gVVI7CiAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IExMOwogICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBMUjsKICAgICAgICBmcm9udCArPSAzOwogICAgICAgIGJhY2sgLT0gMzsKICAgICAgfQogICAgICBmcm9udCAtPSAzOwogICAgICBiYWNrICs9IDM7CiAgICB9CiAgICBub3JtYWwyID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheSgKICAgICAgY29tcHV0ZWROb3JtYWxzLAogICAgICBjb21wdXRlZE5vcm1hbHMubGVuZ3RoIC0gMywKICAgICAgbm9ybWFsMgogICAgKTsKICAgIGFkZE5vcm1hbHMoYXR0ciwgbm9ybWFsMiwgbGVmdCwgZnJvbnQsIGJhY2ssIHZlcnRleEZvcm1hdCk7CiAgICBpZiAoYWRkRW5kUG9zaXRpb25zKSB7CiAgICAgIGZyb250ICs9IDM7CiAgICAgIGJhY2sgLT0gMzsKICAgICAgbGVmdFBvcyA9IGNhcnRlc2lhbjMyOwogICAgICByaWdodFBvcyA9IGNhcnRlc2lhbjQyOwogICAgICBjb25zdCBsYXN0RW5kUG9zaXRpb25zID0gZW5kUG9zaXRpb25zWzFdOwogICAgICBmb3IgKGkgPSAwOyBpIDwgaGFsZkxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGVmdFBvcyA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoCiAgICAgICAgICBsYXN0RW5kUG9zaXRpb25zLAogICAgICAgICAgKGVuZFBvc2l0aW9uTGVuZ3RoIC0gaSAtIDEpICogMywKICAgICAgICAgIGxlZnRQb3MKICAgICAgICApOwogICAgICAgIHJpZ2h0UG9zID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShsYXN0RW5kUG9zaXRpb25zLCBpICogMywgcmlnaHRQb3MpOwogICAgICAgIENvcnJpZG9yR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuYWRkQXR0cmlidXRlKAogICAgICAgICAgZmluYWxQb3NpdGlvbnMsCiAgICAgICAgICBsZWZ0UG9zLAogICAgICAgICAgdm9pZCAwLAogICAgICAgICAgYmFjawogICAgICAgICk7CiAgICAgICAgQ29ycmlkb3JHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5hZGRBdHRyaWJ1dGUoZmluYWxQb3NpdGlvbnMsIHJpZ2h0UG9zLCBmcm9udCk7CiAgICAgICAgYWRkTm9ybWFscyhhdHRyLCBub3JtYWwyLCBsZWZ0LCBmcm9udCwgYmFjaywgdmVydGV4Rm9ybWF0KTsKICAgICAgICBMUiA9IGZyb250IC8gMzsKICAgICAgICBMTCA9IExSIC0gMTsKICAgICAgICBVUiA9IChiYWNrIC0gMikgLyAzOwogICAgICAgIFVMID0gVVIgKyAxOwogICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBVTDsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gTEw7CiAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IFVSOwogICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBVUjsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gTEw7CiAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IExSOwogICAgICAgIGZyb250ICs9IDM7CiAgICAgICAgYmFjayAtPSAzOwogICAgICB9CiAgICB9CiAgICBhdHRyaWJ1dGVzLnBvc2l0aW9uID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5ET1VCTEUsCiAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgIHZhbHVlczogZmluYWxQb3NpdGlvbnMKICAgIH0pOwogICAgaWYgKHZlcnRleEZvcm1hdC5zdCkgewogICAgICBjb25zdCBzdCA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSAvIDMgKiAyKTsKICAgICAgbGV0IHJpZ2h0U3Q7CiAgICAgIGxldCBsZWZ0U3Q7CiAgICAgIGxldCBzdEluZGV4ID0gMDsKICAgICAgaWYgKGFkZEVuZFBvc2l0aW9ucykgewogICAgICAgIGxlZnRDb3VudCAvPSAzOwogICAgICAgIHJpZ2h0Q291bnQgLz0gMzsKICAgICAgICBjb25zdCB0aGV0YSA9IE1hdGguUEkgLyAoZW5kUG9zaXRpb25MZW5ndGggKyAxKTsKICAgICAgICBsZWZ0U3QgPSAxIC8gKGxlZnRDb3VudCAtIGVuZFBvc2l0aW9uTGVuZ3RoICsgMSk7CiAgICAgICAgcmlnaHRTdCA9IDEgLyAocmlnaHRDb3VudCAtIGVuZFBvc2l0aW9uTGVuZ3RoICsgMSk7CiAgICAgICAgbGV0IGEzOwogICAgICAgIGNvbnN0IGhhbGZFbmRQb3MgPSBlbmRQb3NpdGlvbkxlbmd0aCAvIDI7CiAgICAgICAgZm9yIChpID0gaGFsZkVuZFBvcyArIDE7IGkgPCBlbmRQb3NpdGlvbkxlbmd0aCArIDE7IGkrKykgewogICAgICAgICAgYTMgPSBNYXRoX2RlZmF1bHQuUElfT1ZFUl9UV08gKyB0aGV0YSAqIGk7CiAgICAgICAgICBzdFtzdEluZGV4KytdID0gcmlnaHRTdCAqICgxICsgTWF0aC5jb3MoYTMpKTsKICAgICAgICAgIHN0W3N0SW5kZXgrK10gPSAwLjUgKiAoMSArIE1hdGguc2luKGEzKSk7CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IDE7IGkgPCByaWdodENvdW50IC0gZW5kUG9zaXRpb25MZW5ndGggKyAxOyBpKyspIHsKICAgICAgICAgIHN0W3N0SW5kZXgrK10gPSBpICogcmlnaHRTdDsKICAgICAgICAgIHN0W3N0SW5kZXgrK10gPSAwOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSBlbmRQb3NpdGlvbkxlbmd0aDsgaSA+IGhhbGZFbmRQb3M7IGktLSkgewogICAgICAgICAgYTMgPSBNYXRoX2RlZmF1bHQuUElfT1ZFUl9UV08gLSBpICogdGhldGE7CiAgICAgICAgICBzdFtzdEluZGV4KytdID0gMSAtIHJpZ2h0U3QgKiAoMSArIE1hdGguY29zKGEzKSk7CiAgICAgICAgICBzdFtzdEluZGV4KytdID0gMC41ICogKDEgKyBNYXRoLnNpbihhMykpOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSBoYWxmRW5kUG9zOyBpID4gMDsgaS0tKSB7CiAgICAgICAgICBhMyA9IE1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTyAtIHRoZXRhICogaTsKICAgICAgICAgIHN0W3N0SW5kZXgrK10gPSAxIC0gbGVmdFN0ICogKDEgKyBNYXRoLmNvcyhhMykpOwogICAgICAgICAgc3Rbc3RJbmRleCsrXSA9IDAuNSAqICgxICsgTWF0aC5zaW4oYTMpKTsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gbGVmdENvdW50IC0gZW5kUG9zaXRpb25MZW5ndGg7IGkgPiAwOyBpLS0pIHsKICAgICAgICAgIHN0W3N0SW5kZXgrK10gPSBpICogbGVmdFN0OwogICAgICAgICAgc3Rbc3RJbmRleCsrXSA9IDE7CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IDE7IGkgPCBoYWxmRW5kUG9zICsgMTsgaSsrKSB7CiAgICAgICAgICBhMyA9IE1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTyArIHRoZXRhICogaTsKICAgICAgICAgIHN0W3N0SW5kZXgrK10gPSBsZWZ0U3QgKiAoMSArIE1hdGguY29zKGEzKSk7CiAgICAgICAgICBzdFtzdEluZGV4KytdID0gMC41ICogKDEgKyBNYXRoLnNpbihhMykpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBsZWZ0Q291bnQgLz0gMzsKICAgICAgICByaWdodENvdW50IC89IDM7CiAgICAgICAgbGVmdFN0ID0gMSAvIChsZWZ0Q291bnQgLSAxKTsKICAgICAgICByaWdodFN0ID0gMSAvIChyaWdodENvdW50IC0gMSk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHJpZ2h0Q291bnQ7IGkrKykgewogICAgICAgICAgc3Rbc3RJbmRleCsrXSA9IGkgKiByaWdodFN0OwogICAgICAgICAgc3Rbc3RJbmRleCsrXSA9IDA7CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IGxlZnRDb3VudDsgaSA+IDA7IGktLSkgewogICAgICAgICAgc3Rbc3RJbmRleCsrXSA9IChpIC0gMSkgKiBsZWZ0U3Q7CiAgICAgICAgICBzdFtzdEluZGV4KytdID0gMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYXR0cmlidXRlcy5zdCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5GTE9BVCwKICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAyLAogICAgICAgIHZhbHVlczogc3QKICAgICAgfSk7CiAgICB9CiAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCkgewogICAgICBhdHRyaWJ1dGVzLm5vcm1hbCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5GTE9BVCwKICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgIHZhbHVlczogYXR0ci5ub3JtYWxzCiAgICAgIH0pOwogICAgfQogICAgaWYgKHZlcnRleEZvcm1hdC50YW5nZW50KSB7CiAgICAgIGF0dHJpYnV0ZXMudGFuZ2VudCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5GTE9BVCwKICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgIHZhbHVlczogYXR0ci50YW5nZW50cwogICAgICB9KTsKICAgIH0KICAgIGlmICh2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgIGF0dHJpYnV0ZXMuYml0YW5nZW50ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgdmFsdWVzOiBhdHRyLmJpdGFuZ2VudHMKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gewogICAgICBhdHRyaWJ1dGVzLAogICAgICBpbmRpY2VzCiAgICB9OwogIH0KICBmdW5jdGlvbiBleHRydWRlZEF0dHJpYnV0ZXMoYXR0cmlidXRlcywgdmVydGV4Rm9ybWF0KSB7CiAgICBpZiAoIXZlcnRleEZvcm1hdC5ub3JtYWwgJiYgIXZlcnRleEZvcm1hdC50YW5nZW50ICYmICF2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50ICYmICF2ZXJ0ZXhGb3JtYXQuc3QpIHsKICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7CiAgICB9CiAgICBjb25zdCBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlczsKICAgIGxldCB0b3BOb3JtYWxzOwogICAgbGV0IHRvcEJpdGFuZ2VudHM7CiAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCB8fCB2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgIHRvcE5vcm1hbHMgPSBhdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZXM7CiAgICAgIHRvcEJpdGFuZ2VudHMgPSBhdHRyaWJ1dGVzLmJpdGFuZ2VudC52YWx1ZXM7CiAgICB9CiAgICBjb25zdCBzaXplID0gYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoIC8gMTg7CiAgICBjb25zdCB0aHJlZVNpemUgPSBzaXplICogMzsKICAgIGNvbnN0IHR3b1NpemUgPSBzaXplICogMjsKICAgIGNvbnN0IHNpeFNpemUgPSB0aHJlZVNpemUgKiAyOwogICAgbGV0IGk7CiAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCB8fCB2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50IHx8IHZlcnRleEZvcm1hdC50YW5nZW50KSB7CiAgICAgIGNvbnN0IG5vcm1hbHMgPSB2ZXJ0ZXhGb3JtYXQubm9ybWFsID8gbmV3IEZsb2F0MzJBcnJheSh0aHJlZVNpemUgKiA2KSA6IHZvaWQgMDsKICAgICAgY29uc3QgdGFuZ2VudHMgPSB2ZXJ0ZXhGb3JtYXQudGFuZ2VudCA/IG5ldyBGbG9hdDMyQXJyYXkodGhyZWVTaXplICogNikgOiB2b2lkIDA7CiAgICAgIGNvbnN0IGJpdGFuZ2VudHMgPSB2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50ID8gbmV3IEZsb2F0MzJBcnJheSh0aHJlZVNpemUgKiA2KSA6IHZvaWQgMDsKICAgICAgbGV0IHRvcFBvc2l0aW9uID0gY2FydGVzaWFuMTI7CiAgICAgIGxldCBib3R0b21Qb3NpdGlvbiA9IGNhcnRlc2lhbjIyOwogICAgICBsZXQgcHJldmlvdXNQb3NpdGlvbiA9IGNhcnRlc2lhbjMyOwogICAgICBsZXQgbm9ybWFsMiA9IGNhcnRlc2lhbjQyOwogICAgICBsZXQgdGFuZ2VudCA9IGNhcnRlc2lhbjUyOwogICAgICBsZXQgYml0YW5nZW50ID0gY2FydGVzaWFuNjI7CiAgICAgIGxldCBhdHRySW5kZXggPSBzaXhTaXplOwogICAgICBmb3IgKGkgPSAwOyBpIDwgdGhyZWVTaXplOyBpICs9IDMpIHsKICAgICAgICBjb25zdCBhdHRySW5kZXhPZmZzZXQgPSBhdHRySW5kZXggKyBzaXhTaXplOwogICAgICAgIHRvcFBvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShwb3NpdGlvbnMsIGksIHRvcFBvc2l0aW9uKTsKICAgICAgICBib3R0b21Qb3NpdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoCiAgICAgICAgICBwb3NpdGlvbnMsCiAgICAgICAgICBpICsgdGhyZWVTaXplLAogICAgICAgICAgYm90dG9tUG9zaXRpb24KICAgICAgICApOwogICAgICAgIHByZXZpb3VzUG9zaXRpb24gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KAogICAgICAgICAgcG9zaXRpb25zLAogICAgICAgICAgKGkgKyAzKSAlIHRocmVlU2l6ZSwKICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24KICAgICAgICApOwogICAgICAgIGJvdHRvbVBvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KAogICAgICAgICAgYm90dG9tUG9zaXRpb24sCiAgICAgICAgICB0b3BQb3NpdGlvbiwKICAgICAgICAgIGJvdHRvbVBvc2l0aW9uCiAgICAgICAgKTsKICAgICAgICBwcmV2aW91c1Bvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KAogICAgICAgICAgcHJldmlvdXNQb3NpdGlvbiwKICAgICAgICAgIHRvcFBvc2l0aW9uLAogICAgICAgICAgcHJldmlvdXNQb3NpdGlvbgogICAgICAgICk7CiAgICAgICAgbm9ybWFsMiA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3MoYm90dG9tUG9zaXRpb24sIHByZXZpb3VzUG9zaXRpb24sIG5vcm1hbDIpLAogICAgICAgICAgbm9ybWFsMgogICAgICAgICk7CiAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5ub3JtYWwpIHsKICAgICAgICAgIENvcnJpZG9yR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuYWRkQXR0cmlidXRlKG5vcm1hbHMsIG5vcm1hbDIsIGF0dHJJbmRleE9mZnNldCk7CiAgICAgICAgICBDb3JyaWRvckdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmFkZEF0dHJpYnV0ZSgKICAgICAgICAgICAgbm9ybWFscywKICAgICAgICAgICAgbm9ybWFsMiwKICAgICAgICAgICAgYXR0ckluZGV4T2Zmc2V0ICsgMwogICAgICAgICAgKTsKICAgICAgICAgIENvcnJpZG9yR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuYWRkQXR0cmlidXRlKG5vcm1hbHMsIG5vcm1hbDIsIGF0dHJJbmRleCk7CiAgICAgICAgICBDb3JyaWRvckdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmFkZEF0dHJpYnV0ZShub3JtYWxzLCBub3JtYWwyLCBhdHRySW5kZXggKyAzKTsKICAgICAgICB9CiAgICAgICAgaWYgKHZlcnRleEZvcm1hdC50YW5nZW50IHx8IHZlcnRleEZvcm1hdC5iaXRhbmdlbnQpIHsKICAgICAgICAgIGJpdGFuZ2VudCA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkodG9wTm9ybWFscywgaSwgYml0YW5nZW50KTsKICAgICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgICAgICAgIENvcnJpZG9yR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuYWRkQXR0cmlidXRlKAogICAgICAgICAgICAgIGJpdGFuZ2VudHMsCiAgICAgICAgICAgICAgYml0YW5nZW50LAogICAgICAgICAgICAgIGF0dHJJbmRleE9mZnNldAogICAgICAgICAgICApOwogICAgICAgICAgICBDb3JyaWRvckdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmFkZEF0dHJpYnV0ZSgKICAgICAgICAgICAgICBiaXRhbmdlbnRzLAogICAgICAgICAgICAgIGJpdGFuZ2VudCwKICAgICAgICAgICAgICBhdHRySW5kZXhPZmZzZXQgKyAzCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIENvcnJpZG9yR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuYWRkQXR0cmlidXRlKAogICAgICAgICAgICAgIGJpdGFuZ2VudHMsCiAgICAgICAgICAgICAgYml0YW5nZW50LAogICAgICAgICAgICAgIGF0dHJJbmRleAogICAgICAgICAgICApOwogICAgICAgICAgICBDb3JyaWRvckdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmFkZEF0dHJpYnV0ZSgKICAgICAgICAgICAgICBiaXRhbmdlbnRzLAogICAgICAgICAgICAgIGJpdGFuZ2VudCwKICAgICAgICAgICAgICBhdHRySW5kZXggKyAzCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnRhbmdlbnQpIHsKICAgICAgICAgICAgdGFuZ2VudCA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoCiAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKGJpdGFuZ2VudCwgbm9ybWFsMiwgdGFuZ2VudCksCiAgICAgICAgICAgICAgdGFuZ2VudAogICAgICAgICAgICApOwogICAgICAgICAgICBDb3JyaWRvckdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmFkZEF0dHJpYnV0ZSgKICAgICAgICAgICAgICB0YW5nZW50cywKICAgICAgICAgICAgICB0YW5nZW50LAogICAgICAgICAgICAgIGF0dHJJbmRleE9mZnNldAogICAgICAgICAgICApOwogICAgICAgICAgICBDb3JyaWRvckdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmFkZEF0dHJpYnV0ZSgKICAgICAgICAgICAgICB0YW5nZW50cywKICAgICAgICAgICAgICB0YW5nZW50LAogICAgICAgICAgICAgIGF0dHJJbmRleE9mZnNldCArIDMKICAgICAgICAgICAgKTsKICAgICAgICAgICAgQ29ycmlkb3JHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5hZGRBdHRyaWJ1dGUodGFuZ2VudHMsIHRhbmdlbnQsIGF0dHJJbmRleCk7CiAgICAgICAgICAgIENvcnJpZG9yR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuYWRkQXR0cmlidXRlKAogICAgICAgICAgICAgIHRhbmdlbnRzLAogICAgICAgICAgICAgIHRhbmdlbnQsCiAgICAgICAgICAgICAgYXR0ckluZGV4ICsgMwogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBhdHRySW5kZXggKz0gNjsKICAgICAgfQogICAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCkgewogICAgICAgIG5vcm1hbHMuc2V0KHRvcE5vcm1hbHMpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aHJlZVNpemU7IGkgKz0gMykgewogICAgICAgICAgbm9ybWFsc1tpICsgdGhyZWVTaXplXSA9IC10b3BOb3JtYWxzW2ldOwogICAgICAgICAgbm9ybWFsc1tpICsgdGhyZWVTaXplICsgMV0gPSAtdG9wTm9ybWFsc1tpICsgMV07CiAgICAgICAgICBub3JtYWxzW2kgKyB0aHJlZVNpemUgKyAyXSA9IC10b3BOb3JtYWxzW2kgKyAyXTsKICAgICAgICB9CiAgICAgICAgYXR0cmlidXRlcy5ub3JtYWwudmFsdWVzID0gbm9ybWFsczsKICAgICAgfSBlbHNlIHsKICAgICAgICBhdHRyaWJ1dGVzLm5vcm1hbCA9IHZvaWQgMDsKICAgICAgfQogICAgICBpZiAodmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgewogICAgICAgIGJpdGFuZ2VudHMuc2V0KHRvcEJpdGFuZ2VudHMpOwogICAgICAgIGJpdGFuZ2VudHMuc2V0KHRvcEJpdGFuZ2VudHMsIHRocmVlU2l6ZSk7CiAgICAgICAgYXR0cmlidXRlcy5iaXRhbmdlbnQudmFsdWVzID0gYml0YW5nZW50czsKICAgICAgfSBlbHNlIHsKICAgICAgICBhdHRyaWJ1dGVzLmJpdGFuZ2VudCA9IHZvaWQgMDsKICAgICAgfQogICAgICBpZiAodmVydGV4Rm9ybWF0LnRhbmdlbnQpIHsKICAgICAgICBjb25zdCB0b3BUYW5nZW50cyA9IGF0dHJpYnV0ZXMudGFuZ2VudC52YWx1ZXM7CiAgICAgICAgdGFuZ2VudHMuc2V0KHRvcFRhbmdlbnRzKTsKICAgICAgICB0YW5nZW50cy5zZXQodG9wVGFuZ2VudHMsIHRocmVlU2l6ZSk7CiAgICAgICAgYXR0cmlidXRlcy50YW5nZW50LnZhbHVlcyA9IHRhbmdlbnRzOwogICAgICB9CiAgICB9CiAgICBpZiAodmVydGV4Rm9ybWF0LnN0KSB7CiAgICAgIGNvbnN0IHRvcFN0ID0gYXR0cmlidXRlcy5zdC52YWx1ZXM7CiAgICAgIGNvbnN0IHN0ID0gbmV3IEZsb2F0MzJBcnJheSh0d29TaXplICogNik7CiAgICAgIHN0LnNldCh0b3BTdCk7CiAgICAgIHN0LnNldCh0b3BTdCwgdHdvU2l6ZSk7CiAgICAgIGxldCBpbmRleCA9IHR3b1NpemUgKiAyOwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDI7IGorKykgewogICAgICAgIHN0W2luZGV4KytdID0gdG9wU3RbMF07CiAgICAgICAgc3RbaW5kZXgrK10gPSB0b3BTdFsxXTsKICAgICAgICBmb3IgKGkgPSAyOyBpIDwgdHdvU2l6ZTsgaSArPSAyKSB7CiAgICAgICAgICBjb25zdCBzID0gdG9wU3RbaV07CiAgICAgICAgICBjb25zdCB0ID0gdG9wU3RbaSArIDFdOwogICAgICAgICAgc3RbaW5kZXgrK10gPSBzOwogICAgICAgICAgc3RbaW5kZXgrK10gPSB0OwogICAgICAgICAgc3RbaW5kZXgrK10gPSBzOwogICAgICAgICAgc3RbaW5kZXgrK10gPSB0OwogICAgICAgIH0KICAgICAgICBzdFtpbmRleCsrXSA9IHRvcFN0WzBdOwogICAgICAgIHN0W2luZGV4KytdID0gdG9wU3RbMV07CiAgICAgIH0KICAgICAgYXR0cmlidXRlcy5zdC52YWx1ZXMgPSBzdDsKICAgIH0KICAgIHJldHVybiBhdHRyaWJ1dGVzOwogIH0KICBmdW5jdGlvbiBhZGRXYWxsUG9zaXRpb25zKHBvc2l0aW9ucywgaW5kZXgsIHdhbGxQb3NpdGlvbnMpIHsKICAgIHdhbGxQb3NpdGlvbnNbaW5kZXgrK10gPSBwb3NpdGlvbnNbMF07CiAgICB3YWxsUG9zaXRpb25zW2luZGV4KytdID0gcG9zaXRpb25zWzFdOwogICAgd2FsbFBvc2l0aW9uc1tpbmRleCsrXSA9IHBvc2l0aW9uc1syXTsKICAgIGZvciAobGV0IGkgPSAzOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSArPSAzKSB7CiAgICAgIGNvbnN0IHggPSBwb3NpdGlvbnNbaV07CiAgICAgIGNvbnN0IHkgPSBwb3NpdGlvbnNbaSArIDFdOwogICAgICBjb25zdCB6ID0gcG9zaXRpb25zW2kgKyAyXTsKICAgICAgd2FsbFBvc2l0aW9uc1tpbmRleCsrXSA9IHg7CiAgICAgIHdhbGxQb3NpdGlvbnNbaW5kZXgrK10gPSB5OwogICAgICB3YWxsUG9zaXRpb25zW2luZGV4KytdID0gejsKICAgICAgd2FsbFBvc2l0aW9uc1tpbmRleCsrXSA9IHg7CiAgICAgIHdhbGxQb3NpdGlvbnNbaW5kZXgrK10gPSB5OwogICAgICB3YWxsUG9zaXRpb25zW2luZGV4KytdID0gejsKICAgIH0KICAgIHdhbGxQb3NpdGlvbnNbaW5kZXgrK10gPSBwb3NpdGlvbnNbMF07CiAgICB3YWxsUG9zaXRpb25zW2luZGV4KytdID0gcG9zaXRpb25zWzFdOwogICAgd2FsbFBvc2l0aW9uc1tpbmRleCsrXSA9IHBvc2l0aW9uc1syXTsKICAgIHJldHVybiB3YWxsUG9zaXRpb25zOwogIH0KICBmdW5jdGlvbiBjb21wdXRlUG9zaXRpb25zRXh0cnVkZWQocGFyYW1zLCB2ZXJ0ZXhGb3JtYXQpIHsKICAgIGNvbnN0IHRvcFZlcnRleEZvcm1hdCA9IG5ldyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdCh7CiAgICAgIHBvc2l0aW9uOiB2ZXJ0ZXhGb3JtYXQucG9zaXRpb24sCiAgICAgIG5vcm1hbDogdmVydGV4Rm9ybWF0Lm5vcm1hbCB8fCB2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50IHx8IHBhcmFtcy5zaGFkb3dWb2x1bWUsCiAgICAgIHRhbmdlbnQ6IHZlcnRleEZvcm1hdC50YW5nZW50LAogICAgICBiaXRhbmdlbnQ6IHZlcnRleEZvcm1hdC5ub3JtYWwgfHwgdmVydGV4Rm9ybWF0LmJpdGFuZ2VudCwKICAgICAgc3Q6IHZlcnRleEZvcm1hdC5zdAogICAgfSk7CiAgICBjb25zdCBlbGxpcHNvaWQgPSBwYXJhbXMuZWxsaXBzb2lkOwogICAgY29uc3QgY29tcHV0ZWRQb3NpdGlvbnMgPSBDb3JyaWRvckdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmNvbXB1dGVQb3NpdGlvbnMocGFyYW1zKTsKICAgIGNvbnN0IGF0dHIgPSBjb21iaW5lMihjb21wdXRlZFBvc2l0aW9ucywgdG9wVmVydGV4Rm9ybWF0LCBlbGxpcHNvaWQpOwogICAgY29uc3QgaGVpZ2h0ID0gcGFyYW1zLmhlaWdodDsKICAgIGNvbnN0IGV4dHJ1ZGVkSGVpZ2h0ID0gcGFyYW1zLmV4dHJ1ZGVkSGVpZ2h0OwogICAgbGV0IGF0dHJpYnV0ZXMgPSBhdHRyLmF0dHJpYnV0ZXM7CiAgICBjb25zdCBpbmRpY2VzID0gYXR0ci5pbmRpY2VzOwogICAgbGV0IHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzOwogICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICBjb25zdCBuZXdQb3NpdGlvbnMgPSBuZXcgRmxvYXQ2NEFycmF5KGxlbmd0aCAqIDYpOwogICAgbGV0IGV4dHJ1ZGVkUG9zaXRpb25zID0gbmV3IEZsb2F0NjRBcnJheShsZW5ndGgpOwogICAgZXh0cnVkZWRQb3NpdGlvbnMuc2V0KHBvc2l0aW9ucyk7CiAgICBsZXQgd2FsbFBvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkobGVuZ3RoICogNCk7CiAgICBwb3NpdGlvbnMgPSBQb2x5Z29uUGlwZWxpbmVfZGVmYXVsdC5zY2FsZVRvR2VvZGV0aWNIZWlnaHQoCiAgICAgIHBvc2l0aW9ucywKICAgICAgaGVpZ2h0LAogICAgICBlbGxpcHNvaWQKICAgICk7CiAgICB3YWxsUG9zaXRpb25zID0gYWRkV2FsbFBvc2l0aW9ucyhwb3NpdGlvbnMsIDAsIHdhbGxQb3NpdGlvbnMpOwogICAgZXh0cnVkZWRQb3NpdGlvbnMgPSBQb2x5Z29uUGlwZWxpbmVfZGVmYXVsdC5zY2FsZVRvR2VvZGV0aWNIZWlnaHQoCiAgICAgIGV4dHJ1ZGVkUG9zaXRpb25zLAogICAgICBleHRydWRlZEhlaWdodCwKICAgICAgZWxsaXBzb2lkCiAgICApOwogICAgd2FsbFBvc2l0aW9ucyA9IGFkZFdhbGxQb3NpdGlvbnMoCiAgICAgIGV4dHJ1ZGVkUG9zaXRpb25zLAogICAgICBsZW5ndGggKiAyLAogICAgICB3YWxsUG9zaXRpb25zCiAgICApOwogICAgbmV3UG9zaXRpb25zLnNldChwb3NpdGlvbnMpOwogICAgbmV3UG9zaXRpb25zLnNldChleHRydWRlZFBvc2l0aW9ucywgbGVuZ3RoKTsKICAgIG5ld1Bvc2l0aW9ucy5zZXQod2FsbFBvc2l0aW9ucywgbGVuZ3RoICogMik7CiAgICBhdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyA9IG5ld1Bvc2l0aW9uczsKICAgIGF0dHJpYnV0ZXMgPSBleHRydWRlZEF0dHJpYnV0ZXMoYXR0cmlidXRlcywgdmVydGV4Rm9ybWF0KTsKICAgIGxldCBpOwogICAgY29uc3Qgc2l6ZSA9IGxlbmd0aCAvIDM7CiAgICBpZiAocGFyYW1zLnNoYWRvd1ZvbHVtZSkgewogICAgICBjb25zdCB0b3BOb3JtYWxzID0gYXR0cmlidXRlcy5ub3JtYWwudmFsdWVzOwogICAgICBsZW5ndGggPSB0b3BOb3JtYWxzLmxlbmd0aDsKICAgICAgbGV0IGV4dHJ1ZGVOb3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheShsZW5ndGggKiA2KTsKICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgdG9wTm9ybWFsc1tpXSA9IC10b3BOb3JtYWxzW2ldOwogICAgICB9CiAgICAgIGV4dHJ1ZGVOb3JtYWxzLnNldCh0b3BOb3JtYWxzLCBsZW5ndGgpOwogICAgICBleHRydWRlTm9ybWFscyA9IGFkZFdhbGxQb3NpdGlvbnModG9wTm9ybWFscywgbGVuZ3RoICogNCwgZXh0cnVkZU5vcm1hbHMpOwogICAgICBhdHRyaWJ1dGVzLmV4dHJ1ZGVEaXJlY3Rpb24gPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICB2YWx1ZXM6IGV4dHJ1ZGVOb3JtYWxzCiAgICAgIH0pOwogICAgICBpZiAoIXZlcnRleEZvcm1hdC5ub3JtYWwpIHsKICAgICAgICBhdHRyaWJ1dGVzLm5vcm1hbCA9IHZvaWQgMDsKICAgICAgfQogICAgfQogICAgaWYgKGRlZmluZWRfZGVmYXVsdChwYXJhbXMub2Zmc2V0QXR0cmlidXRlKSkgewogICAgICBsZXQgYXBwbHlPZmZzZXQgPSBuZXcgVWludDhBcnJheShzaXplICogNik7CiAgICAgIGlmIChwYXJhbXMub2Zmc2V0QXR0cmlidXRlID09PSBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZV9kZWZhdWx0LlRPUCkgewogICAgICAgIGFwcGx5T2Zmc2V0ID0gYXBwbHlPZmZzZXQuZmlsbCgxLCAwLCBzaXplKS5maWxsKDEsIHNpemUgKiAyLCBzaXplICogNCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgYXBwbHlPZmZzZXRWYWx1ZSA9IHBhcmFtcy5vZmZzZXRBdHRyaWJ1dGUgPT09IEdlb21ldHJ5T2Zmc2V0QXR0cmlidXRlX2RlZmF1bHQuTk9ORSA/IDAgOiAxOwogICAgICAgIGFwcGx5T2Zmc2V0ID0gYXBwbHlPZmZzZXQuZmlsbChhcHBseU9mZnNldFZhbHVlKTsKICAgICAgfQogICAgICBhdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LlVOU0lHTkVEX0JZVEUsCiAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMSwKICAgICAgICB2YWx1ZXM6IGFwcGx5T2Zmc2V0CiAgICAgIH0pOwogICAgfQogICAgY29uc3QgaUxlbmd0aCA9IGluZGljZXMubGVuZ3RoOwogICAgY29uc3QgdHdvU2l6ZSA9IHNpemUgKyBzaXplOwogICAgY29uc3QgbmV3SW5kaWNlcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KAogICAgICBuZXdQb3NpdGlvbnMubGVuZ3RoIC8gMywKICAgICAgaUxlbmd0aCAqIDIgKyB0d29TaXplICogMwogICAgKTsKICAgIG5ld0luZGljZXMuc2V0KGluZGljZXMpOwogICAgbGV0IGluZGV4ID0gaUxlbmd0aDsKICAgIGZvciAoaSA9IDA7IGkgPCBpTGVuZ3RoOyBpICs9IDMpIHsKICAgICAgY29uc3QgdjAyID0gaW5kaWNlc1tpXTsKICAgICAgY29uc3QgdjEyID0gaW5kaWNlc1tpICsgMV07CiAgICAgIGNvbnN0IHYyMiA9IGluZGljZXNbaSArIDJdOwogICAgICBuZXdJbmRpY2VzW2luZGV4KytdID0gdjIyICsgc2l6ZTsKICAgICAgbmV3SW5kaWNlc1tpbmRleCsrXSA9IHYxMiArIHNpemU7CiAgICAgIG5ld0luZGljZXNbaW5kZXgrK10gPSB2MDIgKyBzaXplOwogICAgfQogICAgbGV0IFVMLCBMTCwgVVIsIExSOwogICAgZm9yIChpID0gMDsgaSA8IHR3b1NpemU7IGkgKz0gMikgewogICAgICBVTCA9IGkgKyB0d29TaXplOwogICAgICBMTCA9IFVMICsgdHdvU2l6ZTsKICAgICAgVVIgPSBVTCArIDE7CiAgICAgIExSID0gTEwgKyAxOwogICAgICBuZXdJbmRpY2VzW2luZGV4KytdID0gVUw7CiAgICAgIG5ld0luZGljZXNbaW5kZXgrK10gPSBMTDsKICAgICAgbmV3SW5kaWNlc1tpbmRleCsrXSA9IFVSOwogICAgICBuZXdJbmRpY2VzW2luZGV4KytdID0gVVI7CiAgICAgIG5ld0luZGljZXNbaW5kZXgrK10gPSBMTDsKICAgICAgbmV3SW5kaWNlc1tpbmRleCsrXSA9IExSOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgYXR0cmlidXRlcywKICAgICAgaW5kaWNlczogbmV3SW5kaWNlcwogICAgfTsKICB9CiAgZnVuY3Rpb24gY29tcHV0ZU9mZnNldFBvaW50cyhwb3NpdGlvbjEsIHBvc2l0aW9uMiwgZWxsaXBzb2lkLCBoYWxmV2lkdGgsIG1pbjMsIG1heDMpIHsKICAgIGNvbnN0IGRpcmVjdGlvbjIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoCiAgICAgIHBvc2l0aW9uMiwKICAgICAgcG9zaXRpb24xLAogICAgICBzY3JhdGNoQ2FydGVzaWFuMTcKICAgICk7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKGRpcmVjdGlvbjIsIGRpcmVjdGlvbjIpOwogICAgY29uc3Qgbm9ybWFsMiA9IGVsbGlwc29pZC5nZW9kZXRpY1N1cmZhY2VOb3JtYWwocG9zaXRpb24xLCBzY3JhdGNoQ2FydGVzaWFuMjcpOwogICAgY29uc3Qgb2Zmc2V0RGlyZWN0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKAogICAgICBkaXJlY3Rpb24yLAogICAgICBub3JtYWwyLAogICAgICBzY3JhdGNoQ2FydGVzaWFuMTcKICAgICk7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihvZmZzZXREaXJlY3Rpb24sIGhhbGZXaWR0aCwgb2Zmc2V0RGlyZWN0aW9uKTsKICAgIGxldCBtaW5MYXQgPSBtaW4zLmxhdGl0dWRlOwogICAgbGV0IG1pbkxvbiA9IG1pbjMubG9uZ2l0dWRlOwogICAgbGV0IG1heExhdCA9IG1heDMubGF0aXR1ZGU7CiAgICBsZXQgbWF4TG9uID0gbWF4My5sb25naXR1ZGU7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHBvc2l0aW9uMSwgb2Zmc2V0RGlyZWN0aW9uLCBzY3JhdGNoQ2FydGVzaWFuMjcpOwogICAgZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHNjcmF0Y2hDYXJ0ZXNpYW4yNywgc2NyYXRjaENhcnRvZ3JhcGhpYzQpOwogICAgbGV0IGxhdCA9IHNjcmF0Y2hDYXJ0b2dyYXBoaWM0LmxhdGl0dWRlOwogICAgbGV0IGxvbiA9IHNjcmF0Y2hDYXJ0b2dyYXBoaWM0LmxvbmdpdHVkZTsKICAgIG1pbkxhdCA9IE1hdGgubWluKG1pbkxhdCwgbGF0KTsKICAgIG1pbkxvbiA9IE1hdGgubWluKG1pbkxvbiwgbG9uKTsKICAgIG1heExhdCA9IE1hdGgubWF4KG1heExhdCwgbGF0KTsKICAgIG1heExvbiA9IE1hdGgubWF4KG1heExvbiwgbG9uKTsKICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChwb3NpdGlvbjEsIG9mZnNldERpcmVjdGlvbiwgc2NyYXRjaENhcnRlc2lhbjI3KTsKICAgIGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhzY3JhdGNoQ2FydGVzaWFuMjcsIHNjcmF0Y2hDYXJ0b2dyYXBoaWM0KTsKICAgIGxhdCA9IHNjcmF0Y2hDYXJ0b2dyYXBoaWM0LmxhdGl0dWRlOwogICAgbG9uID0gc2NyYXRjaENhcnRvZ3JhcGhpYzQubG9uZ2l0dWRlOwogICAgbWluTGF0ID0gTWF0aC5taW4obWluTGF0LCBsYXQpOwogICAgbWluTG9uID0gTWF0aC5taW4obWluTG9uLCBsb24pOwogICAgbWF4TGF0ID0gTWF0aC5tYXgobWF4TGF0LCBsYXQpOwogICAgbWF4TG9uID0gTWF0aC5tYXgobWF4TG9uLCBsb24pOwogICAgbWluMy5sYXRpdHVkZSA9IG1pbkxhdDsKICAgIG1pbjMubG9uZ2l0dWRlID0gbWluTG9uOwogICAgbWF4My5sYXRpdHVkZSA9IG1heExhdDsKICAgIG1heDMubG9uZ2l0dWRlID0gbWF4TG9uOwogIH0KICBmdW5jdGlvbiBjb21wdXRlUmVjdGFuZ2xlMihwb3NpdGlvbnMsIGVsbGlwc29pZCwgd2lkdGgsIGNvcm5lclR5cGUsIHJlc3VsdCkgewogICAgcG9zaXRpb25zID0gc2NhbGVUb1N1cmZhY2UyKHBvc2l0aW9ucywgZWxsaXBzb2lkKTsKICAgIGNvbnN0IGNsZWFuUG9zaXRpb25zID0gYXJyYXlSZW1vdmVEdXBsaWNhdGVzX2RlZmF1bHQoCiAgICAgIHBvc2l0aW9ucywKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24KICAgICk7CiAgICBjb25zdCBsZW5ndGggPSBjbGVhblBvc2l0aW9ucy5sZW5ndGg7CiAgICBpZiAobGVuZ3RoIDwgMiB8fCB3aWR0aCA8PSAwKSB7CiAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlX2RlZmF1bHQoKTsKICAgIH0KICAgIGNvbnN0IGhhbGZXaWR0aCA9IHdpZHRoICogMC41OwogICAgc2NyYXRjaENhcnRvZ3JhcGhpY01pbi5sYXRpdHVkZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWNNaW4ubG9uZ2l0dWRlID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgc2NyYXRjaENhcnRvZ3JhcGhpY01heC5sYXRpdHVkZSA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTsKICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWNNYXgubG9uZ2l0dWRlID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOwogICAgbGV0IGxhdCwgbG9uOwogICAgaWYgKGNvcm5lclR5cGUgPT09IENvcm5lclR5cGVfZGVmYXVsdC5ST1VOREVEKSB7CiAgICAgIGNvbnN0IGZpcnN0ID0gY2xlYW5Qb3NpdGlvbnNbMF07CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChmaXJzdCwgY2xlYW5Qb3NpdGlvbnNbMV0sIHNjcmF0Y2hDYXJ0ZXNpYW5PZmZzZXQpOwogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKHNjcmF0Y2hDYXJ0ZXNpYW5PZmZzZXQsIHNjcmF0Y2hDYXJ0ZXNpYW5PZmZzZXQpOwogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcigKICAgICAgICBzY3JhdGNoQ2FydGVzaWFuT2Zmc2V0LAogICAgICAgIGhhbGZXaWR0aCwKICAgICAgICBzY3JhdGNoQ2FydGVzaWFuT2Zmc2V0CiAgICAgICk7CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoZmlyc3QsIHNjcmF0Y2hDYXJ0ZXNpYW5PZmZzZXQsIHNjcmF0Y2hDYXJ0ZXNpYW5FbmRzKTsKICAgICAgZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKAogICAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW5FbmRzLAogICAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWM0CiAgICAgICk7CiAgICAgIGxhdCA9IHNjcmF0Y2hDYXJ0b2dyYXBoaWM0LmxhdGl0dWRlOwogICAgICBsb24gPSBzY3JhdGNoQ2FydG9ncmFwaGljNC5sb25naXR1ZGU7CiAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWNNaW4ubGF0aXR1ZGUgPSBNYXRoLm1pbigKICAgICAgICBzY3JhdGNoQ2FydG9ncmFwaGljTWluLmxhdGl0dWRlLAogICAgICAgIGxhdAogICAgICApOwogICAgICBzY3JhdGNoQ2FydG9ncmFwaGljTWluLmxvbmdpdHVkZSA9IE1hdGgubWluKAogICAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWNNaW4ubG9uZ2l0dWRlLAogICAgICAgIGxvbgogICAgICApOwogICAgICBzY3JhdGNoQ2FydG9ncmFwaGljTWF4LmxhdGl0dWRlID0gTWF0aC5tYXgoCiAgICAgICAgc2NyYXRjaENhcnRvZ3JhcGhpY01heC5sYXRpdHVkZSwKICAgICAgICBsYXQKICAgICAgKTsKICAgICAgc2NyYXRjaENhcnRvZ3JhcGhpY01heC5sb25naXR1ZGUgPSBNYXRoLm1heCgKICAgICAgICBzY3JhdGNoQ2FydG9ncmFwaGljTWF4LmxvbmdpdHVkZSwKICAgICAgICBsb24KICAgICAgKTsKICAgIH0KICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoIC0gMTsgKytpKSB7CiAgICAgIGNvbXB1dGVPZmZzZXRQb2ludHMoCiAgICAgICAgY2xlYW5Qb3NpdGlvbnNbaV0sCiAgICAgICAgY2xlYW5Qb3NpdGlvbnNbaSArIDFdLAogICAgICAgIGVsbGlwc29pZCwKICAgICAgICBoYWxmV2lkdGgsCiAgICAgICAgc2NyYXRjaENhcnRvZ3JhcGhpY01pbiwKICAgICAgICBzY3JhdGNoQ2FydG9ncmFwaGljTWF4CiAgICAgICk7CiAgICB9CiAgICBjb25zdCBsYXN0ID0gY2xlYW5Qb3NpdGlvbnNbbGVuZ3RoIC0gMV07CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QobGFzdCwgY2xlYW5Qb3NpdGlvbnNbbGVuZ3RoIC0gMl0sIHNjcmF0Y2hDYXJ0ZXNpYW5PZmZzZXQpOwogICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShzY3JhdGNoQ2FydGVzaWFuT2Zmc2V0LCBzY3JhdGNoQ2FydGVzaWFuT2Zmc2V0KTsKICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKAogICAgICBzY3JhdGNoQ2FydGVzaWFuT2Zmc2V0LAogICAgICBoYWxmV2lkdGgsCiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW5PZmZzZXQKICAgICk7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGxhc3QsIHNjcmF0Y2hDYXJ0ZXNpYW5PZmZzZXQsIHNjcmF0Y2hDYXJ0ZXNpYW5FbmRzKTsKICAgIGNvbXB1dGVPZmZzZXRQb2ludHMoCiAgICAgIGxhc3QsCiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW5FbmRzLAogICAgICBlbGxpcHNvaWQsCiAgICAgIGhhbGZXaWR0aCwKICAgICAgc2NyYXRjaENhcnRvZ3JhcGhpY01pbiwKICAgICAgc2NyYXRjaENhcnRvZ3JhcGhpY01heAogICAgKTsKICAgIGlmIChjb3JuZXJUeXBlID09PSBDb3JuZXJUeXBlX2RlZmF1bHQuUk9VTkRFRCkgewogICAgICBlbGxpcHNvaWQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoCiAgICAgICAgc2NyYXRjaENhcnRlc2lhbkVuZHMsCiAgICAgICAgc2NyYXRjaENhcnRvZ3JhcGhpYzQKICAgICAgKTsKICAgICAgbGF0ID0gc2NyYXRjaENhcnRvZ3JhcGhpYzQubGF0aXR1ZGU7CiAgICAgIGxvbiA9IHNjcmF0Y2hDYXJ0b2dyYXBoaWM0LmxvbmdpdHVkZTsKICAgICAgc2NyYXRjaENhcnRvZ3JhcGhpY01pbi5sYXRpdHVkZSA9IE1hdGgubWluKAogICAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWNNaW4ubGF0aXR1ZGUsCiAgICAgICAgbGF0CiAgICAgICk7CiAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWNNaW4ubG9uZ2l0dWRlID0gTWF0aC5taW4oCiAgICAgICAgc2NyYXRjaENhcnRvZ3JhcGhpY01pbi5sb25naXR1ZGUsCiAgICAgICAgbG9uCiAgICAgICk7CiAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWNNYXgubGF0aXR1ZGUgPSBNYXRoLm1heCgKICAgICAgICBzY3JhdGNoQ2FydG9ncmFwaGljTWF4LmxhdGl0dWRlLAogICAgICAgIGxhdAogICAgICApOwogICAgICBzY3JhdGNoQ2FydG9ncmFwaGljTWF4LmxvbmdpdHVkZSA9IE1hdGgubWF4KAogICAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWNNYXgubG9uZ2l0dWRlLAogICAgICAgIGxvbgogICAgICApOwogICAgfQogICAgY29uc3QgcmVjdGFuZ2xlID0gZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkgPyByZXN1bHQgOiBuZXcgUmVjdGFuZ2xlX2RlZmF1bHQoKTsKICAgIHJlY3RhbmdsZS5ub3J0aCA9IHNjcmF0Y2hDYXJ0b2dyYXBoaWNNYXgubGF0aXR1ZGU7CiAgICByZWN0YW5nbGUuc291dGggPSBzY3JhdGNoQ2FydG9ncmFwaGljTWluLmxhdGl0dWRlOwogICAgcmVjdGFuZ2xlLmVhc3QgPSBzY3JhdGNoQ2FydG9ncmFwaGljTWF4LmxvbmdpdHVkZTsKICAgIHJlY3RhbmdsZS53ZXN0ID0gc2NyYXRjaENhcnRvZ3JhcGhpY01pbi5sb25naXR1ZGU7CiAgICByZXR1cm4gcmVjdGFuZ2xlOwogIH0KICBmdW5jdGlvbiBDb3JyaWRvckdlb21ldHJ5KG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IG9wdGlvbnMucG9zaXRpb25zOwogICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoOwogICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJvcHRpb25zLnBvc2l0aW9ucyIsIHBvc2l0aW9ucyk7CiAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoIm9wdGlvbnMud2lkdGgiLCB3aWR0aCk7CiAgICBjb25zdCBoZWlnaHQgPSBvcHRpb25zLmhlaWdodCA/PyAwOwogICAgY29uc3QgZXh0cnVkZWRIZWlnaHQgPSBvcHRpb25zLmV4dHJ1ZGVkSGVpZ2h0ID8/IGhlaWdodDsKICAgIHRoaXMuX3Bvc2l0aW9ucyA9IHBvc2l0aW9uczsKICAgIHRoaXMuX2VsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKG9wdGlvbnMuZWxsaXBzb2lkID8/IEVsbGlwc29pZF9kZWZhdWx0LmRlZmF1bHQpOwogICAgdGhpcy5fdmVydGV4Rm9ybWF0ID0gVmVydGV4Rm9ybWF0X2RlZmF1bHQuY2xvbmUoCiAgICAgIG9wdGlvbnMudmVydGV4Rm9ybWF0ID8/IFZlcnRleEZvcm1hdF9kZWZhdWx0LkRFRkFVTFQKICAgICk7CiAgICB0aGlzLl93aWR0aCA9IHdpZHRoOwogICAgdGhpcy5faGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCBleHRydWRlZEhlaWdodCk7CiAgICB0aGlzLl9leHRydWRlZEhlaWdodCA9IE1hdGgubWluKGhlaWdodCwgZXh0cnVkZWRIZWlnaHQpOwogICAgdGhpcy5fY29ybmVyVHlwZSA9IG9wdGlvbnMuY29ybmVyVHlwZSA/PyBDb3JuZXJUeXBlX2RlZmF1bHQuUk9VTkRFRDsKICAgIHRoaXMuX2dyYW51bGFyaXR5ID0gb3B0aW9ucy5ncmFudWxhcml0eSA/PyBNYXRoX2RlZmF1bHQuUkFESUFOU19QRVJfREVHUkVFOwogICAgdGhpcy5fc2hhZG93Vm9sdW1lID0gb3B0aW9ucy5zaGFkb3dWb2x1bWUgPz8gZmFsc2U7CiAgICB0aGlzLl93b3JrZXJOYW1lID0gImNyZWF0ZUNvcnJpZG9yR2VvbWV0cnkiOwogICAgdGhpcy5fb2Zmc2V0QXR0cmlidXRlID0gb3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGU7CiAgICB0aGlzLl9yZWN0YW5nbGUgPSB2b2lkIDA7CiAgICB0aGlzLnBhY2tlZExlbmd0aCA9IDEgKyBwb3NpdGlvbnMubGVuZ3RoICogQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aCArIEVsbGlwc29pZF9kZWZhdWx0LnBhY2tlZExlbmd0aCArIFZlcnRleEZvcm1hdF9kZWZhdWx0LnBhY2tlZExlbmd0aCArIDc7CiAgfQogIHZhciBjYXJ0ZXNpYW4xMiwgY2FydGVzaWFuMjIsIGNhcnRlc2lhbjMyLCBjYXJ0ZXNpYW40MiwgY2FydGVzaWFuNTIsIGNhcnRlc2lhbjYyLCBzY3JhdGNoMTMsIHNjcmF0Y2gyMywgc2NyYXRjaENhcnRlc2lhbjE3LCBzY3JhdGNoQ2FydGVzaWFuMjcsIHNjcmF0Y2hDYXJ0b2dyYXBoaWM0LCBzY3JhdGNoQ2FydGVzaWFuT2Zmc2V0LCBzY3JhdGNoQ2FydGVzaWFuRW5kcywgc2NyYXRjaENhcnRvZ3JhcGhpY01pbiwgc2NyYXRjaENhcnRvZ3JhcGhpY01heCwgc2NyYXRjaEVsbGlwc29pZDQsIHNjcmF0Y2hWZXJ0ZXhGb3JtYXQ0LCBzY3JhdGNoT3B0aW9uczksIENvcnJpZG9yR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9Db3JyaWRvckdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Db3JyaWRvckdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9hcnJheVJlbW92ZUR1cGxpY2F0ZXMoKTsKICAgICAgaW5pdF9Cb3VuZGluZ1NwaGVyZSgpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DYXJ0b2dyYXBoaWMoKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X0NvbXBvbmVudERhdGF0eXBlKCk7CiAgICAgIGluaXRfQ29ybmVyVHlwZSgpOwogICAgICBpbml0X0NvcnJpZG9yR2VvbWV0cnlMaWJyYXJ5KCk7CiAgICAgIGluaXRfRnJvemVuKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X0dlb21ldHJ5KCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGUoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZXMoKTsKICAgICAgaW5pdF9HZW9tZXRyeU9mZnNldEF0dHJpYnV0ZSgpOwogICAgICBpbml0X0luZGV4RGF0YXR5cGUoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGluaXRfUG9seWdvblBpcGVsaW5lKCk7CiAgICAgIGluaXRfUHJpbWl0aXZlVHlwZSgpOwogICAgICBpbml0X1JlY3RhbmdsZSgpOwogICAgICBpbml0X1ZlcnRleEZvcm1hdCgpOwogICAgICBjYXJ0ZXNpYW4xMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgY2FydGVzaWFuMjIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGNhcnRlc2lhbjMyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYXJ0ZXNpYW40MiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgY2FydGVzaWFuNTIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGNhcnRlc2lhbjYyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoMTMgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2gyMyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaENhcnRlc2lhbjE3ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydGVzaWFuMjcgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWM0ID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW5PZmZzZXQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW5FbmRzID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydG9ncmFwaGljTWluID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWNNYXggPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgQ29ycmlkb3JHZW9tZXRyeS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gdmFsdWUuX3Bvc2l0aW9uczsKICAgICAgICBjb25zdCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSBsZW5ndGg7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSwgc3RhcnRpbmdJbmRleCArPSBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoKSB7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayhwb3NpdGlvbnNbaV0sIGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICB9CiAgICAgICAgRWxsaXBzb2lkX2RlZmF1bHQucGFjayh2YWx1ZS5fZWxsaXBzb2lkLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgVmVydGV4Rm9ybWF0X2RlZmF1bHQucGFjayh2YWx1ZS5fdmVydGV4Rm9ybWF0LCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl93aWR0aDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX2hlaWdodDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX2V4dHJ1ZGVkSGVpZ2h0OwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5fY29ybmVyVHlwZTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX2dyYW51bGFyaXR5OwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5fc2hhZG93Vm9sdW1lID8gMSA6IDA7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleF0gPSB2YWx1ZS5fb2Zmc2V0QXR0cmlidXRlID8/IC0xOwogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfTsKICAgICAgc2NyYXRjaEVsbGlwc29pZDQgPSBFbGxpcHNvaWRfZGVmYXVsdC5jbG9uZShFbGxpcHNvaWRfZGVmYXVsdC5VTklUX1NQSEVSRSk7CiAgICAgIHNjcmF0Y2hWZXJ0ZXhGb3JtYXQ0ID0gbmV3IFZlcnRleEZvcm1hdF9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hPcHRpb25zOSA9IHsKICAgICAgICBwb3NpdGlvbnM6IHZvaWQgMCwKICAgICAgICBlbGxpcHNvaWQ6IHNjcmF0Y2hFbGxpcHNvaWQ0LAogICAgICAgIHZlcnRleEZvcm1hdDogc2NyYXRjaFZlcnRleEZvcm1hdDQsCiAgICAgICAgd2lkdGg6IHZvaWQgMCwKICAgICAgICBoZWlnaHQ6IHZvaWQgMCwKICAgICAgICBleHRydWRlZEhlaWdodDogdm9pZCAwLAogICAgICAgIGNvcm5lclR5cGU6IHZvaWQgMCwKICAgICAgICBncmFudWxhcml0eTogdm9pZCAwLAogICAgICAgIHNoYWRvd1ZvbHVtZTogdm9pZCAwLAogICAgICAgIG9mZnNldEF0dHJpYnV0ZTogdm9pZCAwCiAgICAgIH07CiAgICAgIENvcnJpZG9yR2VvbWV0cnkudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBjb25zdCBsZW5ndGggPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2ksIHN0YXJ0aW5nSW5kZXggKz0gQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aCkgewogICAgICAgICAgcG9zaXRpb25zW2ldID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LnVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCwgc2NyYXRjaEVsbGlwc29pZDQpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gRWxsaXBzb2lkX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGNvbnN0IHZlcnRleEZvcm1hdCA9IFZlcnRleEZvcm1hdF9kZWZhdWx0LnVucGFjaygKICAgICAgICAgIGFycmF5LAogICAgICAgICAgc3RhcnRpbmdJbmRleCwKICAgICAgICAgIHNjcmF0Y2hWZXJ0ZXhGb3JtYXQ0CiAgICAgICAgKTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IFZlcnRleEZvcm1hdF9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBjb25zdCB3aWR0aCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgaGVpZ2h0ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBleHRydWRlZEhlaWdodCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgY29ybmVyVHlwZSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgZ3JhbnVsYXJpdHkgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IHNoYWRvd1ZvbHVtZSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPT09IDE7CiAgICAgICAgY29uc3Qgb2Zmc2V0QXR0cmlidXRlID0gYXJyYXlbc3RhcnRpbmdJbmRleF07CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgc2NyYXRjaE9wdGlvbnM5LnBvc2l0aW9ucyA9IHBvc2l0aW9uczsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zOS53aWR0aCA9IHdpZHRoOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnM5LmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zOS5leHRydWRlZEhlaWdodCA9IGV4dHJ1ZGVkSGVpZ2h0OwogICAgICAgICAgc2NyYXRjaE9wdGlvbnM5LmNvcm5lclR5cGUgPSBjb3JuZXJUeXBlOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnM5LmdyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHk7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczkuc2hhZG93Vm9sdW1lID0gc2hhZG93Vm9sdW1lOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnM5Lm9mZnNldEF0dHJpYnV0ZSA9IG9mZnNldEF0dHJpYnV0ZSA9PT0gLTEgPyB2b2lkIDAgOiBvZmZzZXRBdHRyaWJ1dGU7CiAgICAgICAgICByZXR1cm4gbmV3IENvcnJpZG9yR2VvbWV0cnkoc2NyYXRjaE9wdGlvbnM5KTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0Ll9wb3NpdGlvbnMgPSBwb3NpdGlvbnM7CiAgICAgICAgcmVzdWx0Ll9lbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC5jbG9uZShlbGxpcHNvaWQsIHJlc3VsdC5fZWxsaXBzb2lkKTsKICAgICAgICByZXN1bHQuX3ZlcnRleEZvcm1hdCA9IFZlcnRleEZvcm1hdF9kZWZhdWx0LmNsb25lKHZlcnRleEZvcm1hdCwgcmVzdWx0Ll92ZXJ0ZXhGb3JtYXQpOwogICAgICAgIHJlc3VsdC5fd2lkdGggPSB3aWR0aDsKICAgICAgICByZXN1bHQuX2hlaWdodCA9IGhlaWdodDsKICAgICAgICByZXN1bHQuX2V4dHJ1ZGVkSGVpZ2h0ID0gZXh0cnVkZWRIZWlnaHQ7CiAgICAgICAgcmVzdWx0Ll9jb3JuZXJUeXBlID0gY29ybmVyVHlwZTsKICAgICAgICByZXN1bHQuX2dyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHk7CiAgICAgICAgcmVzdWx0Ll9zaGFkb3dWb2x1bWUgPSBzaGFkb3dWb2x1bWU7CiAgICAgICAgcmVzdWx0Ll9vZmZzZXRBdHRyaWJ1dGUgPSBvZmZzZXRBdHRyaWJ1dGUgPT09IC0xID8gdm9pZCAwIDogb2Zmc2V0QXR0cmlidXRlOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENvcnJpZG9yR2VvbWV0cnkuY29tcHV0ZVJlY3RhbmdsZSA9IGZ1bmN0aW9uKG9wdGlvbnMsIHJlc3VsdCkgewogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBvcHRpb25zLnBvc2l0aW9uczsKICAgICAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGg7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJvcHRpb25zLnBvc2l0aW9ucyIsIHBvc2l0aW9ucyk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJvcHRpb25zLndpZHRoIiwgd2lkdGgpOwogICAgICAgIGNvbnN0IGVsbGlwc29pZCA9IG9wdGlvbnMuZWxsaXBzb2lkID8/IEVsbGlwc29pZF9kZWZhdWx0LmRlZmF1bHQ7CiAgICAgICAgY29uc3QgY29ybmVyVHlwZSA9IG9wdGlvbnMuY29ybmVyVHlwZSA/PyBDb3JuZXJUeXBlX2RlZmF1bHQuUk9VTkRFRDsKICAgICAgICByZXR1cm4gY29tcHV0ZVJlY3RhbmdsZTIocG9zaXRpb25zLCBlbGxpcHNvaWQsIHdpZHRoLCBjb3JuZXJUeXBlLCByZXN1bHQpOwogICAgICB9OwogICAgICBDb3JyaWRvckdlb21ldHJ5LmNyZWF0ZUdlb21ldHJ5ID0gZnVuY3Rpb24oY29ycmlkb3JHZW9tZXRyeSkgewogICAgICAgIGxldCBwb3NpdGlvbnMgPSBjb3JyaWRvckdlb21ldHJ5Ll9wb3NpdGlvbnM7CiAgICAgICAgY29uc3Qgd2lkdGggPSBjb3JyaWRvckdlb21ldHJ5Ll93aWR0aDsKICAgICAgICBjb25zdCBlbGxpcHNvaWQgPSBjb3JyaWRvckdlb21ldHJ5Ll9lbGxpcHNvaWQ7CiAgICAgICAgcG9zaXRpb25zID0gc2NhbGVUb1N1cmZhY2UyKHBvc2l0aW9ucywgZWxsaXBzb2lkKTsKICAgICAgICBjb25zdCBjbGVhblBvc2l0aW9ucyA9IGFycmF5UmVtb3ZlRHVwbGljYXRlc19kZWZhdWx0KAogICAgICAgICAgcG9zaXRpb25zLAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24KICAgICAgICApOwogICAgICAgIGlmIChjbGVhblBvc2l0aW9ucy5sZW5ndGggPCAyIHx8IHdpZHRoIDw9IDApIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgaGVpZ2h0ID0gY29ycmlkb3JHZW9tZXRyeS5faGVpZ2h0OwogICAgICAgIGNvbnN0IGV4dHJ1ZGVkSGVpZ2h0ID0gY29ycmlkb3JHZW9tZXRyeS5fZXh0cnVkZWRIZWlnaHQ7CiAgICAgICAgY29uc3QgZXh0cnVkZSA9ICFNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgIGhlaWdodCwKICAgICAgICAgIGV4dHJ1ZGVkSGVpZ2h0LAogICAgICAgICAgMCwKICAgICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9OMgogICAgICAgICk7CiAgICAgICAgY29uc3QgdmVydGV4Rm9ybWF0ID0gY29ycmlkb3JHZW9tZXRyeS5fdmVydGV4Rm9ybWF0OwogICAgICAgIGNvbnN0IHBhcmFtcyA9IHsKICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgIHBvc2l0aW9uczogY2xlYW5Qb3NpdGlvbnMsCiAgICAgICAgICB3aWR0aCwKICAgICAgICAgIGNvcm5lclR5cGU6IGNvcnJpZG9yR2VvbWV0cnkuX2Nvcm5lclR5cGUsCiAgICAgICAgICBncmFudWxhcml0eTogY29ycmlkb3JHZW9tZXRyeS5fZ3JhbnVsYXJpdHksCiAgICAgICAgICBzYXZlQXR0cmlidXRlczogdHJ1ZQogICAgICAgIH07CiAgICAgICAgbGV0IGF0dHI7CiAgICAgICAgaWYgKGV4dHJ1ZGUpIHsKICAgICAgICAgIHBhcmFtcy5oZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgICBwYXJhbXMuZXh0cnVkZWRIZWlnaHQgPSBleHRydWRlZEhlaWdodDsKICAgICAgICAgIHBhcmFtcy5zaGFkb3dWb2x1bWUgPSBjb3JyaWRvckdlb21ldHJ5Ll9zaGFkb3dWb2x1bWU7CiAgICAgICAgICBwYXJhbXMub2Zmc2V0QXR0cmlidXRlID0gY29ycmlkb3JHZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlOwogICAgICAgICAgYXR0ciA9IGNvbXB1dGVQb3NpdGlvbnNFeHRydWRlZChwYXJhbXMsIHZlcnRleEZvcm1hdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGNvbXB1dGVkUG9zaXRpb25zID0gQ29ycmlkb3JHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5jb21wdXRlUG9zaXRpb25zKHBhcmFtcyk7CiAgICAgICAgICBhdHRyID0gY29tYmluZTIoY29tcHV0ZWRQb3NpdGlvbnMsIHZlcnRleEZvcm1hdCwgZWxsaXBzb2lkKTsKICAgICAgICAgIGF0dHIuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMgPSBQb2x5Z29uUGlwZWxpbmVfZGVmYXVsdC5zY2FsZVRvR2VvZGV0aWNIZWlnaHQoCiAgICAgICAgICAgIGF0dHIuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsCiAgICAgICAgICAgIGhlaWdodCwKICAgICAgICAgICAgZWxsaXBzb2lkCiAgICAgICAgICApOwogICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChjb3JyaWRvckdlb21ldHJ5Ll9vZmZzZXRBdHRyaWJ1dGUpKSB7CiAgICAgICAgICAgIGNvbnN0IGFwcGx5T2Zmc2V0VmFsdWUgPSBjb3JyaWRvckdlb21ldHJ5Ll9vZmZzZXRBdHRyaWJ1dGUgPT09IEdlb21ldHJ5T2Zmc2V0QXR0cmlidXRlX2RlZmF1bHQuTk9ORSA/IDAgOiAxOwogICAgICAgICAgICBjb25zdCBsZW5ndGggPSBhdHRyLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLmxlbmd0aDsKICAgICAgICAgICAgY29uc3QgYXBwbHlPZmZzZXQgPSBuZXcgVWludDhBcnJheShsZW5ndGggLyAzKS5maWxsKGFwcGx5T2Zmc2V0VmFsdWUpOwogICAgICAgICAgICBhdHRyLmF0dHJpYnV0ZXMuYXBwbHlPZmZzZXQgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuVU5TSUdORURfQllURSwKICAgICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAxLAogICAgICAgICAgICAgIHZhbHVlczogYXBwbHlPZmZzZXQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBhdHRyLmF0dHJpYnV0ZXM7CiAgICAgICAgY29uc3QgYm91bmRpbmdTcGhlcmUgPSBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LmZyb21WZXJ0aWNlcygKICAgICAgICAgIGF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLAogICAgICAgICAgdm9pZCAwLAogICAgICAgICAgMwogICAgICAgICk7CiAgICAgICAgaWYgKCF2ZXJ0ZXhGb3JtYXQucG9zaXRpb24pIHsKICAgICAgICAgIGF0dHIuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMgPSB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgR2VvbWV0cnlfZGVmYXVsdCh7CiAgICAgICAgICBhdHRyaWJ1dGVzLAogICAgICAgICAgaW5kaWNlczogYXR0ci5pbmRpY2VzLAogICAgICAgICAgcHJpbWl0aXZlVHlwZTogUHJpbWl0aXZlVHlwZV9kZWZhdWx0LlRSSUFOR0xFUywKICAgICAgICAgIGJvdW5kaW5nU3BoZXJlLAogICAgICAgICAgb2Zmc2V0QXR0cmlidXRlOiBjb3JyaWRvckdlb21ldHJ5Ll9vZmZzZXRBdHRyaWJ1dGUKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgQ29ycmlkb3JHZW9tZXRyeS5jcmVhdGVTaGFkb3dWb2x1bWUgPSBmdW5jdGlvbihjb3JyaWRvckdlb21ldHJ5LCBtaW5IZWlnaHRGdW5jLCBtYXhIZWlnaHRGdW5jKSB7CiAgICAgICAgY29uc3QgZ3JhbnVsYXJpdHkgPSBjb3JyaWRvckdlb21ldHJ5Ll9ncmFudWxhcml0eTsKICAgICAgICBjb25zdCBlbGxpcHNvaWQgPSBjb3JyaWRvckdlb21ldHJ5Ll9lbGxpcHNvaWQ7CiAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gbWluSGVpZ2h0RnVuYyhncmFudWxhcml0eSwgZWxsaXBzb2lkKTsKICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSBtYXhIZWlnaHRGdW5jKGdyYW51bGFyaXR5LCBlbGxpcHNvaWQpOwogICAgICAgIHJldHVybiBuZXcgQ29ycmlkb3JHZW9tZXRyeSh7CiAgICAgICAgICBwb3NpdGlvbnM6IGNvcnJpZG9yR2VvbWV0cnkuX3Bvc2l0aW9ucywKICAgICAgICAgIHdpZHRoOiBjb3JyaWRvckdlb21ldHJ5Ll93aWR0aCwKICAgICAgICAgIGNvcm5lclR5cGU6IGNvcnJpZG9yR2VvbWV0cnkuX2Nvcm5lclR5cGUsCiAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICBncmFudWxhcml0eSwKICAgICAgICAgIGV4dHJ1ZGVkSGVpZ2h0OiBtaW5IZWlnaHQsCiAgICAgICAgICBoZWlnaHQ6IG1heEhlaWdodCwKICAgICAgICAgIHZlcnRleEZvcm1hdDogVmVydGV4Rm9ybWF0X2RlZmF1bHQuUE9TSVRJT05fT05MWSwKICAgICAgICAgIHNoYWRvd1ZvbHVtZTogdHJ1ZQogICAgICAgIH0pOwogICAgICB9OwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDb3JyaWRvckdlb21ldHJ5LnByb3RvdHlwZSwgewogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICovCiAgICAgICAgcmVjdGFuZ2xlOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh0aGlzLl9yZWN0YW5nbGUpKSB7CiAgICAgICAgICAgICAgdGhpcy5fcmVjdGFuZ2xlID0gY29tcHV0ZVJlY3RhbmdsZTIoCiAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvbnMsCiAgICAgICAgICAgICAgICB0aGlzLl9lbGxpcHNvaWQsCiAgICAgICAgICAgICAgICB0aGlzLl93aWR0aCwKICAgICAgICAgICAgICAgIHRoaXMuX2Nvcm5lclR5cGUKICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWN0YW5nbGU7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBGb3IgcmVtYXBwaW5nIHRleHR1cmUgY29vcmRpbmF0ZXMgd2hlbiByZW5kZXJpbmcgQ29ycmlkb3JHZW9tZXRyaWVzIGFzIEdyb3VuZFByaW1pdGl2ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBDb3JyaWRvcnMgZG9uJ3Qgc3VwcG9ydCBzdFJvdGF0aW9uLAogICAgICAgICAqIHNvIGp1c3QgcmV0dXJuIHRoZSBjb3JuZXJzIG9mIHRoZSBvcmlnaW5hbCBzeXN0ZW0uCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICB0ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gWzAsIDAsIDAsIDEsIDEsIDBdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIENvcnJpZG9yR2VvbWV0cnlfZGVmYXVsdCA9IENvcnJpZG9yR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVDb3JyaWRvckdlb21ldHJ5LmpzCiAgdmFyIGNyZWF0ZUNvcnJpZG9yR2VvbWV0cnlfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGNyZWF0ZUNvcnJpZG9yR2VvbWV0cnlfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gY3JlYXRlQ29ycmlkb3JHZW9tZXRyeV9kZWZhdWx0CiAgfSk7CiAgZnVuY3Rpb24gY3JlYXRlQ29ycmlkb3JHZW9tZXRyeShjb3JyaWRvckdlb21ldHJ5LCBvZmZzZXQpIHsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQob2Zmc2V0KSkgewogICAgICBjb3JyaWRvckdlb21ldHJ5ID0gQ29ycmlkb3JHZW9tZXRyeV9kZWZhdWx0LnVucGFjayhjb3JyaWRvckdlb21ldHJ5LCBvZmZzZXQpOwogICAgfQogICAgY29ycmlkb3JHZW9tZXRyeS5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUoY29ycmlkb3JHZW9tZXRyeS5fZWxsaXBzb2lkKTsKICAgIHJldHVybiBDb3JyaWRvckdlb21ldHJ5X2RlZmF1bHQuY3JlYXRlR2VvbWV0cnkoY29ycmlkb3JHZW9tZXRyeSk7CiAgfQogIHZhciBjcmVhdGVDb3JyaWRvckdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfY3JlYXRlQ29ycmlkb3JHZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlQ29ycmlkb3JHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfQ29ycmlkb3JHZW9tZXRyeSgpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgY3JlYXRlQ29ycmlkb3JHZW9tZXRyeV9kZWZhdWx0ID0gY3JlYXRlQ29ycmlkb3JHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NvcnJpZG9yT3V0bGluZUdlb21ldHJ5LmpzCiAgZnVuY3Rpb24gc2NhbGVUb1N1cmZhY2UzKHBvc2l0aW9ucywgZWxsaXBzb2lkKSB7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICBwb3NpdGlvbnNbaV0gPSBlbGxpcHNvaWQuc2NhbGVUb0dlb2RldGljU3VyZmFjZShwb3NpdGlvbnNbaV0sIHBvc2l0aW9uc1tpXSk7CiAgICB9CiAgICByZXR1cm4gcG9zaXRpb25zOwogIH0KICBmdW5jdGlvbiBjb21iaW5lMyhjb21wdXRlZFBvc2l0aW9ucywgY29ybmVyVHlwZSkgewogICAgY29uc3Qgd2FsbEluZGljZXMgPSBbXTsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IGNvbXB1dGVkUG9zaXRpb25zLnBvc2l0aW9uczsKICAgIGNvbnN0IGNvcm5lcnMgPSBjb21wdXRlZFBvc2l0aW9ucy5jb3JuZXJzOwogICAgY29uc3QgZW5kUG9zaXRpb25zID0gY29tcHV0ZWRQb3NpdGlvbnMuZW5kUG9zaXRpb25zOwogICAgY29uc3QgYXR0cmlidXRlcyA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZXNfZGVmYXVsdCgpOwogICAgbGV0IGNvcm5lcjsKICAgIGxldCBsZWZ0Q291bnQgPSAwOwogICAgbGV0IHJpZ2h0Q291bnQgPSAwOwogICAgbGV0IGk7CiAgICBsZXQgaW5kaWNlc0xlbmd0aCA9IDA7CiAgICBsZXQgbGVuZ3RoOwogICAgZm9yIChpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkgKz0gMikgewogICAgICBsZW5ndGggPSBwb3NpdGlvbnNbaV0ubGVuZ3RoIC0gMzsKICAgICAgbGVmdENvdW50ICs9IGxlbmd0aDsKICAgICAgaW5kaWNlc0xlbmd0aCArPSBsZW5ndGggLyAzICogNDsKICAgICAgcmlnaHRDb3VudCArPSBwb3NpdGlvbnNbaSArIDFdLmxlbmd0aCAtIDM7CiAgICB9CiAgICBsZWZ0Q291bnQgKz0gMzsKICAgIHJpZ2h0Q291bnQgKz0gMzsKICAgIGZvciAoaSA9IDA7IGkgPCBjb3JuZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvcm5lciA9IGNvcm5lcnNbaV07CiAgICAgIGNvbnN0IGxlZnRTaWRlID0gY29ybmVyc1tpXS5sZWZ0UG9zaXRpb25zOwogICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGxlZnRTaWRlKSkgewogICAgICAgIGxlbmd0aCA9IGxlZnRTaWRlLmxlbmd0aDsKICAgICAgICBsZWZ0Q291bnQgKz0gbGVuZ3RoOwogICAgICAgIGluZGljZXNMZW5ndGggKz0gbGVuZ3RoIC8gMyAqIDI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGVuZ3RoID0gY29ybmVyc1tpXS5yaWdodFBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgcmlnaHRDb3VudCArPSBsZW5ndGg7CiAgICAgICAgaW5kaWNlc0xlbmd0aCArPSBsZW5ndGggLyAzICogMjsKICAgICAgfQogICAgfQogICAgY29uc3QgYWRkRW5kUG9zaXRpb25zID0gZGVmaW5lZF9kZWZhdWx0KGVuZFBvc2l0aW9ucyk7CiAgICBsZXQgZW5kUG9zaXRpb25MZW5ndGg7CiAgICBpZiAoYWRkRW5kUG9zaXRpb25zKSB7CiAgICAgIGVuZFBvc2l0aW9uTGVuZ3RoID0gZW5kUG9zaXRpb25zWzBdLmxlbmd0aCAtIDM7CiAgICAgIGxlZnRDb3VudCArPSBlbmRQb3NpdGlvbkxlbmd0aDsKICAgICAgcmlnaHRDb3VudCArPSBlbmRQb3NpdGlvbkxlbmd0aDsKICAgICAgZW5kUG9zaXRpb25MZW5ndGggLz0gMzsKICAgICAgaW5kaWNlc0xlbmd0aCArPSBlbmRQb3NpdGlvbkxlbmd0aCAqIDQ7CiAgICB9CiAgICBjb25zdCBzaXplID0gbGVmdENvdW50ICsgcmlnaHRDb3VudDsKICAgIGNvbnN0IGZpbmFsUG9zaXRpb25zID0gbmV3IEZsb2F0NjRBcnJheShzaXplKTsKICAgIGxldCBmcm9udCA9IDA7CiAgICBsZXQgYmFjayA9IHNpemUgLSAxOwogICAgbGV0IFVMLCBMTCwgVVIsIExSOwogICAgbGV0IHJpZ2h0UG9zLCBsZWZ0UG9zOwogICAgY29uc3QgaGFsZkxlbmd0aCA9IGVuZFBvc2l0aW9uTGVuZ3RoIC8gMjsKICAgIGNvbnN0IGluZGljZXMgPSBJbmRleERhdGF0eXBlX2RlZmF1bHQuY3JlYXRlVHlwZWRBcnJheShzaXplIC8gMywgaW5kaWNlc0xlbmd0aCArIDQpOwogICAgbGV0IGluZGV4ID0gMDsKICAgIGluZGljZXNbaW5kZXgrK10gPSBmcm9udCAvIDM7CiAgICBpbmRpY2VzW2luZGV4KytdID0gKGJhY2sgLSAyKSAvIDM7CiAgICBpZiAoYWRkRW5kUG9zaXRpb25zKSB7CiAgICAgIHdhbGxJbmRpY2VzLnB1c2goZnJvbnQgLyAzKTsKICAgICAgbGVmdFBvcyA9IGNhcnRlc2lhbjEzOwogICAgICByaWdodFBvcyA9IGNhcnRlc2lhbjIzOwogICAgICBjb25zdCBmaXJzdEVuZFBvc2l0aW9ucyA9IGVuZFBvc2l0aW9uc1swXTsKICAgICAgZm9yIChpID0gMDsgaSA8IGhhbGZMZW5ndGg7IGkrKykgewogICAgICAgIGxlZnRQb3MgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KAogICAgICAgICAgZmlyc3RFbmRQb3NpdGlvbnMsCiAgICAgICAgICAoaGFsZkxlbmd0aCAtIDEgLSBpKSAqIDMsCiAgICAgICAgICBsZWZ0UG9zCiAgICAgICAgKTsKICAgICAgICByaWdodFBvcyA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoCiAgICAgICAgICBmaXJzdEVuZFBvc2l0aW9ucywKICAgICAgICAgIChoYWxmTGVuZ3RoICsgaSkgKiAzLAogICAgICAgICAgcmlnaHRQb3MKICAgICAgICApOwogICAgICAgIENvcnJpZG9yR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuYWRkQXR0cmlidXRlKGZpbmFsUG9zaXRpb25zLCByaWdodFBvcywgZnJvbnQpOwogICAgICAgIENvcnJpZG9yR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuYWRkQXR0cmlidXRlKAogICAgICAgICAgZmluYWxQb3NpdGlvbnMsCiAgICAgICAgICBsZWZ0UG9zLAogICAgICAgICAgdm9pZCAwLAogICAgICAgICAgYmFjawogICAgICAgICk7CiAgICAgICAgTEwgPSBmcm9udCAvIDM7CiAgICAgICAgTFIgPSBMTCArIDE7CiAgICAgICAgVUwgPSAoYmFjayAtIDIpIC8gMzsKICAgICAgICBVUiA9IFVMIC0gMTsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gVUw7CiAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IFVSOwogICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBMTDsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gTFI7CiAgICAgICAgZnJvbnQgKz0gMzsKICAgICAgICBiYWNrIC09IDM7CiAgICAgIH0KICAgIH0KICAgIGxldCBwb3NJbmRleCA9IDA7CiAgICBsZXQgcmlnaHRFZGdlID0gcG9zaXRpb25zW3Bvc0luZGV4KytdOwogICAgbGV0IGxlZnRFZGdlID0gcG9zaXRpb25zW3Bvc0luZGV4KytdOwogICAgZmluYWxQb3NpdGlvbnMuc2V0KHJpZ2h0RWRnZSwgZnJvbnQpOwogICAgZmluYWxQb3NpdGlvbnMuc2V0KGxlZnRFZGdlLCBiYWNrIC0gbGVmdEVkZ2UubGVuZ3RoICsgMSk7CiAgICBsZW5ndGggPSBsZWZ0RWRnZS5sZW5ndGggLSAzOwogICAgd2FsbEluZGljZXMucHVzaChmcm9udCAvIDMsIChiYWNrIC0gMikgLyAzKTsKICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMykgewogICAgICBMTCA9IGZyb250IC8gMzsKICAgICAgTFIgPSBMTCArIDE7CiAgICAgIFVMID0gKGJhY2sgLSAyKSAvIDM7CiAgICAgIFVSID0gVUwgLSAxOwogICAgICBpbmRpY2VzW2luZGV4KytdID0gVUw7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSBVUjsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IExMOwogICAgICBpbmRpY2VzW2luZGV4KytdID0gTFI7CiAgICAgIGZyb250ICs9IDM7CiAgICAgIGJhY2sgLT0gMzsKICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBjb3JuZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBqOwogICAgICBjb3JuZXIgPSBjb3JuZXJzW2ldOwogICAgICBjb25zdCBsID0gY29ybmVyLmxlZnRQb3NpdGlvbnM7CiAgICAgIGNvbnN0IHIgPSBjb3JuZXIucmlnaHRQb3NpdGlvbnM7CiAgICAgIGxldCBzdGFydDsKICAgICAgbGV0IG91dHNpZGVQb2ludCA9IGNhcnRlc2lhbjMzOwogICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGwpKSB7CiAgICAgICAgYmFjayAtPSAzOwogICAgICAgIHN0YXJ0ID0gVVI7CiAgICAgICAgd2FsbEluZGljZXMucHVzaChMUik7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IGwubGVuZ3RoIC8gMzsgaisrKSB7CiAgICAgICAgICBvdXRzaWRlUG9pbnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KGwsIGogKiAzLCBvdXRzaWRlUG9pbnQpOwogICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IHN0YXJ0IC0gaiAtIDE7CiAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gc3RhcnQgLSBqOwogICAgICAgICAgQ29ycmlkb3JHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5hZGRBdHRyaWJ1dGUoCiAgICAgICAgICAgIGZpbmFsUG9zaXRpb25zLAogICAgICAgICAgICBvdXRzaWRlUG9pbnQsCiAgICAgICAgICAgIHZvaWQgMCwKICAgICAgICAgICAgYmFjawogICAgICAgICAgKTsKICAgICAgICAgIGJhY2sgLT0gMzsKICAgICAgICB9CiAgICAgICAgd2FsbEluZGljZXMucHVzaChzdGFydCAtIE1hdGguZmxvb3IobC5sZW5ndGggLyA2KSk7CiAgICAgICAgaWYgKGNvcm5lclR5cGUgPT09IENvcm5lclR5cGVfZGVmYXVsdC5CRVZFTEVEKSB7CiAgICAgICAgICB3YWxsSW5kaWNlcy5wdXNoKChiYWNrIC0gMikgLyAzICsgMSk7CiAgICAgICAgfQogICAgICAgIGZyb250ICs9IDM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZnJvbnQgKz0gMzsKICAgICAgICBzdGFydCA9IExSOwogICAgICAgIHdhbGxJbmRpY2VzLnB1c2goVVIpOwogICAgICAgIGZvciAoaiA9IDA7IGogPCByLmxlbmd0aCAvIDM7IGorKykgewogICAgICAgICAgb3V0c2lkZVBvaW50ID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShyLCBqICogMywgb3V0c2lkZVBvaW50KTsKICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBzdGFydCArIGo7CiAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gc3RhcnQgKyBqICsgMTsKICAgICAgICAgIENvcnJpZG9yR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuYWRkQXR0cmlidXRlKAogICAgICAgICAgICBmaW5hbFBvc2l0aW9ucywKICAgICAgICAgICAgb3V0c2lkZVBvaW50LAogICAgICAgICAgICBmcm9udAogICAgICAgICAgKTsKICAgICAgICAgIGZyb250ICs9IDM7CiAgICAgICAgfQogICAgICAgIHdhbGxJbmRpY2VzLnB1c2goc3RhcnQgKyBNYXRoLmZsb29yKHIubGVuZ3RoIC8gNikpOwogICAgICAgIGlmIChjb3JuZXJUeXBlID09PSBDb3JuZXJUeXBlX2RlZmF1bHQuQkVWRUxFRCkgewogICAgICAgICAgd2FsbEluZGljZXMucHVzaChmcm9udCAvIDMgLSAxKTsKICAgICAgICB9CiAgICAgICAgYmFjayAtPSAzOwogICAgICB9CiAgICAgIHJpZ2h0RWRnZSA9IHBvc2l0aW9uc1twb3NJbmRleCsrXTsKICAgICAgbGVmdEVkZ2UgPSBwb3NpdGlvbnNbcG9zSW5kZXgrK107CiAgICAgIHJpZ2h0RWRnZS5zcGxpY2UoMCwgMyk7CiAgICAgIGxlZnRFZGdlLnNwbGljZShsZWZ0RWRnZS5sZW5ndGggLSAzLCAzKTsKICAgICAgZmluYWxQb3NpdGlvbnMuc2V0KHJpZ2h0RWRnZSwgZnJvbnQpOwogICAgICBmaW5hbFBvc2l0aW9ucy5zZXQobGVmdEVkZ2UsIGJhY2sgLSBsZWZ0RWRnZS5sZW5ndGggKyAxKTsKICAgICAgbGVuZ3RoID0gbGVmdEVkZ2UubGVuZ3RoIC0gMzsKICAgICAgZm9yIChqID0gMDsgaiA8IGxlZnRFZGdlLmxlbmd0aDsgaiArPSAzKSB7CiAgICAgICAgTFIgPSBmcm9udCAvIDM7CiAgICAgICAgTEwgPSBMUiAtIDE7CiAgICAgICAgVVIgPSAoYmFjayAtIDIpIC8gMzsKICAgICAgICBVTCA9IFVSICsgMTsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gVUw7CiAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IFVSOwogICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBMTDsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gTFI7CiAgICAgICAgZnJvbnQgKz0gMzsKICAgICAgICBiYWNrIC09IDM7CiAgICAgIH0KICAgICAgZnJvbnQgLT0gMzsKICAgICAgYmFjayArPSAzOwogICAgICB3YWxsSW5kaWNlcy5wdXNoKGZyb250IC8gMywgKGJhY2sgLSAyKSAvIDMpOwogICAgfQogICAgaWYgKGFkZEVuZFBvc2l0aW9ucykgewogICAgICBmcm9udCArPSAzOwogICAgICBiYWNrIC09IDM7CiAgICAgIGxlZnRQb3MgPSBjYXJ0ZXNpYW4xMzsKICAgICAgcmlnaHRQb3MgPSBjYXJ0ZXNpYW4yMzsKICAgICAgY29uc3QgbGFzdEVuZFBvc2l0aW9ucyA9IGVuZFBvc2l0aW9uc1sxXTsKICAgICAgZm9yIChpID0gMDsgaSA8IGhhbGZMZW5ndGg7IGkrKykgewogICAgICAgIGxlZnRQb3MgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KAogICAgICAgICAgbGFzdEVuZFBvc2l0aW9ucywKICAgICAgICAgIChlbmRQb3NpdGlvbkxlbmd0aCAtIGkgLSAxKSAqIDMsCiAgICAgICAgICBsZWZ0UG9zCiAgICAgICAgKTsKICAgICAgICByaWdodFBvcyA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkobGFzdEVuZFBvc2l0aW9ucywgaSAqIDMsIHJpZ2h0UG9zKTsKICAgICAgICBDb3JyaWRvckdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmFkZEF0dHJpYnV0ZSgKICAgICAgICAgIGZpbmFsUG9zaXRpb25zLAogICAgICAgICAgbGVmdFBvcywKICAgICAgICAgIHZvaWQgMCwKICAgICAgICAgIGJhY2sKICAgICAgICApOwogICAgICAgIENvcnJpZG9yR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuYWRkQXR0cmlidXRlKGZpbmFsUG9zaXRpb25zLCByaWdodFBvcywgZnJvbnQpOwogICAgICAgIExSID0gZnJvbnQgLyAzOwogICAgICAgIExMID0gTFIgLSAxOwogICAgICAgIFVSID0gKGJhY2sgLSAyKSAvIDM7CiAgICAgICAgVUwgPSBVUiArIDE7CiAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IFVMOwogICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBVUjsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gTEw7CiAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IExSOwogICAgICAgIGZyb250ICs9IDM7CiAgICAgICAgYmFjayAtPSAzOwogICAgICB9CiAgICAgIHdhbGxJbmRpY2VzLnB1c2goZnJvbnQgLyAzKTsKICAgIH0gZWxzZSB7CiAgICAgIHdhbGxJbmRpY2VzLnB1c2goZnJvbnQgLyAzLCAoYmFjayAtIDIpIC8gMyk7CiAgICB9CiAgICBpbmRpY2VzW2luZGV4KytdID0gZnJvbnQgLyAzOwogICAgaW5kaWNlc1tpbmRleCsrXSA9IChiYWNrIC0gMikgLyAzOwogICAgYXR0cmlidXRlcy5wb3NpdGlvbiA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRE9VQkxFLAogICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICB2YWx1ZXM6IGZpbmFsUG9zaXRpb25zCiAgICB9KTsKICAgIHJldHVybiB7CiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIGluZGljZXMsCiAgICAgIHdhbGxJbmRpY2VzCiAgICB9OwogIH0KICBmdW5jdGlvbiBjb21wdXRlUG9zaXRpb25zRXh0cnVkZWQyKHBhcmFtcykgewogICAgY29uc3QgZWxsaXBzb2lkID0gcGFyYW1zLmVsbGlwc29pZDsKICAgIGNvbnN0IGNvbXB1dGVkUG9zaXRpb25zID0gQ29ycmlkb3JHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5jb21wdXRlUG9zaXRpb25zKHBhcmFtcyk7CiAgICBjb25zdCBhdHRyID0gY29tYmluZTMoY29tcHV0ZWRQb3NpdGlvbnMsIHBhcmFtcy5jb3JuZXJUeXBlKTsKICAgIGNvbnN0IHdhbGxJbmRpY2VzID0gYXR0ci53YWxsSW5kaWNlczsKICAgIGNvbnN0IGhlaWdodCA9IHBhcmFtcy5oZWlnaHQ7CiAgICBjb25zdCBleHRydWRlZEhlaWdodCA9IHBhcmFtcy5leHRydWRlZEhlaWdodDsKICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBhdHRyLmF0dHJpYnV0ZXM7CiAgICBjb25zdCBpbmRpY2VzID0gYXR0ci5pbmRpY2VzOwogICAgbGV0IHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzOwogICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICBsZXQgZXh0cnVkZWRQb3NpdGlvbnMgPSBuZXcgRmxvYXQ2NEFycmF5KGxlbmd0aCk7CiAgICBleHRydWRlZFBvc2l0aW9ucy5zZXQocG9zaXRpb25zKTsKICAgIGNvbnN0IG5ld1Bvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkobGVuZ3RoICogMik7CiAgICBwb3NpdGlvbnMgPSBQb2x5Z29uUGlwZWxpbmVfZGVmYXVsdC5zY2FsZVRvR2VvZGV0aWNIZWlnaHQoCiAgICAgIHBvc2l0aW9ucywKICAgICAgaGVpZ2h0LAogICAgICBlbGxpcHNvaWQKICAgICk7CiAgICBleHRydWRlZFBvc2l0aW9ucyA9IFBvbHlnb25QaXBlbGluZV9kZWZhdWx0LnNjYWxlVG9HZW9kZXRpY0hlaWdodCgKICAgICAgZXh0cnVkZWRQb3NpdGlvbnMsCiAgICAgIGV4dHJ1ZGVkSGVpZ2h0LAogICAgICBlbGxpcHNvaWQKICAgICk7CiAgICBuZXdQb3NpdGlvbnMuc2V0KHBvc2l0aW9ucyk7CiAgICBuZXdQb3NpdGlvbnMuc2V0KGV4dHJ1ZGVkUG9zaXRpb25zLCBsZW5ndGgpOwogICAgYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMgPSBuZXdQb3NpdGlvbnM7CiAgICBsZW5ndGggLz0gMzsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQocGFyYW1zLm9mZnNldEF0dHJpYnV0ZSkpIHsKICAgICAgbGV0IGFwcGx5T2Zmc2V0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoICogMik7CiAgICAgIGlmIChwYXJhbXMub2Zmc2V0QXR0cmlidXRlID09PSBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZV9kZWZhdWx0LlRPUCkgewogICAgICAgIGFwcGx5T2Zmc2V0ID0gYXBwbHlPZmZzZXQuZmlsbCgxLCAwLCBsZW5ndGgpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGFwcGx5T2Zmc2V0VmFsdWUgPSBwYXJhbXMub2Zmc2V0QXR0cmlidXRlID09PSBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZV9kZWZhdWx0Lk5PTkUgPyAwIDogMTsKICAgICAgICBhcHBseU9mZnNldCA9IGFwcGx5T2Zmc2V0LmZpbGwoYXBwbHlPZmZzZXRWYWx1ZSk7CiAgICAgIH0KICAgICAgYXR0cmlidXRlcy5hcHBseU9mZnNldCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5VTlNJR05FRF9CWVRFLAogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDEsCiAgICAgICAgdmFsdWVzOiBhcHBseU9mZnNldAogICAgICB9KTsKICAgIH0KICAgIGxldCBpOwogICAgY29uc3QgaUxlbmd0aCA9IGluZGljZXMubGVuZ3RoOwogICAgY29uc3QgbmV3SW5kaWNlcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KAogICAgICBuZXdQb3NpdGlvbnMubGVuZ3RoIC8gMywKICAgICAgKGlMZW5ndGggKyB3YWxsSW5kaWNlcy5sZW5ndGgpICogMgogICAgKTsKICAgIG5ld0luZGljZXMuc2V0KGluZGljZXMpOwogICAgbGV0IGluZGV4ID0gaUxlbmd0aDsKICAgIGZvciAoaSA9IDA7IGkgPCBpTGVuZ3RoOyBpICs9IDIpIHsKICAgICAgY29uc3QgdjAyID0gaW5kaWNlc1tpXTsKICAgICAgY29uc3QgdjEyID0gaW5kaWNlc1tpICsgMV07CiAgICAgIG5ld0luZGljZXNbaW5kZXgrK10gPSB2MDIgKyBsZW5ndGg7CiAgICAgIG5ld0luZGljZXNbaW5kZXgrK10gPSB2MTIgKyBsZW5ndGg7CiAgICB9CiAgICBsZXQgVUwsIExMOwogICAgZm9yIChpID0gMDsgaSA8IHdhbGxJbmRpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFVMID0gd2FsbEluZGljZXNbaV07CiAgICAgIExMID0gVUwgKyBsZW5ndGg7CiAgICAgIG5ld0luZGljZXNbaW5kZXgrK10gPSBVTDsKICAgICAgbmV3SW5kaWNlc1tpbmRleCsrXSA9IExMOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgYXR0cmlidXRlcywKICAgICAgaW5kaWNlczogbmV3SW5kaWNlcwogICAgfTsKICB9CiAgZnVuY3Rpb24gQ29ycmlkb3JPdXRsaW5lR2VvbWV0cnkob3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgPz8gRnJvemVuX2RlZmF1bHQuRU1QVFlfT0JKRUNUOwogICAgY29uc3QgcG9zaXRpb25zID0gb3B0aW9ucy5wb3NpdGlvbnM7CiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGg7CiAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm9wdGlvbnMucG9zaXRpb25zIiwgcG9zaXRpb25zKTsKICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigib3B0aW9ucy53aWR0aCIsIHdpZHRoKTsKICAgIGNvbnN0IGhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0ID8/IDA7CiAgICBjb25zdCBleHRydWRlZEhlaWdodCA9IG9wdGlvbnMuZXh0cnVkZWRIZWlnaHQgPz8gaGVpZ2h0OwogICAgdGhpcy5fcG9zaXRpb25zID0gcG9zaXRpb25zOwogICAgdGhpcy5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUob3B0aW9ucy5lbGxpcHNvaWQgPz8gRWxsaXBzb2lkX2RlZmF1bHQuZGVmYXVsdCk7CiAgICB0aGlzLl93aWR0aCA9IHdpZHRoOwogICAgdGhpcy5faGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCBleHRydWRlZEhlaWdodCk7CiAgICB0aGlzLl9leHRydWRlZEhlaWdodCA9IE1hdGgubWluKGhlaWdodCwgZXh0cnVkZWRIZWlnaHQpOwogICAgdGhpcy5fY29ybmVyVHlwZSA9IG9wdGlvbnMuY29ybmVyVHlwZSA/PyBDb3JuZXJUeXBlX2RlZmF1bHQuUk9VTkRFRDsKICAgIHRoaXMuX2dyYW51bGFyaXR5ID0gb3B0aW9ucy5ncmFudWxhcml0eSA/PyBNYXRoX2RlZmF1bHQuUkFESUFOU19QRVJfREVHUkVFOwogICAgdGhpcy5fb2Zmc2V0QXR0cmlidXRlID0gb3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGU7CiAgICB0aGlzLl93b3JrZXJOYW1lID0gImNyZWF0ZUNvcnJpZG9yT3V0bGluZUdlb21ldHJ5IjsKICAgIHRoaXMucGFja2VkTGVuZ3RoID0gMSArIHBvc2l0aW9ucy5sZW5ndGggKiBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoICsgRWxsaXBzb2lkX2RlZmF1bHQucGFja2VkTGVuZ3RoICsgNjsKICB9CiAgdmFyIGNhcnRlc2lhbjEzLCBjYXJ0ZXNpYW4yMywgY2FydGVzaWFuMzMsIHNjcmF0Y2hFbGxpcHNvaWQ1LCBzY3JhdGNoT3B0aW9uczEwLCBDb3JyaWRvck91dGxpbmVHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X0NvcnJpZG9yT3V0bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Db3JyaWRvck91dGxpbmVHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfYXJyYXlSZW1vdmVEdXBsaWNhdGVzKCk7CiAgICAgIGluaXRfQm91bmRpbmdTcGhlcmUoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9Db21wb25lbnREYXRhdHlwZSgpOwogICAgICBpbml0X0Nvcm5lclR5cGUoKTsKICAgICAgaW5pdF9Db3JyaWRvckdlb21ldHJ5TGlicmFyeSgpOwogICAgICBpbml0X0Zyb3plbigpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9HZW9tZXRyeSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlKCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGVzKCk7CiAgICAgIGluaXRfR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGUoKTsKICAgICAgaW5pdF9JbmRleERhdGF0eXBlKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBpbml0X1BvbHlnb25QaXBlbGluZSgpOwogICAgICBpbml0X1ByaW1pdGl2ZVR5cGUoKTsKICAgICAgY2FydGVzaWFuMTMgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGNhcnRlc2lhbjIzID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYXJ0ZXNpYW4zMyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgQ29ycmlkb3JPdXRsaW5lR2VvbWV0cnkucGFjayA9IGZ1bmN0aW9uKHZhbHVlLCBhcnJheSwgc3RhcnRpbmdJbmRleCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJhcnJheSIsIGFycmF5KTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHZhbHVlLl9wb3NpdGlvbnM7CiAgICAgICAgY29uc3QgbGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gbGVuZ3RoOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2ksIHN0YXJ0aW5nSW5kZXggKz0gQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aCkgewogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2socG9zaXRpb25zW2ldLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgfQogICAgICAgIEVsbGlwc29pZF9kZWZhdWx0LnBhY2sodmFsdWUuX2VsbGlwc29pZCwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gRWxsaXBzb2lkX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5fd2lkdGg7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9oZWlnaHQ7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9leHRydWRlZEhlaWdodDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX2Nvcm5lclR5cGU7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9ncmFudWxhcml0eTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4XSA9IHZhbHVlLl9vZmZzZXRBdHRyaWJ1dGUgPz8gLTE7CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9OwogICAgICBzY3JhdGNoRWxsaXBzb2lkNSA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKEVsbGlwc29pZF9kZWZhdWx0LlVOSVRfU1BIRVJFKTsKICAgICAgc2NyYXRjaE9wdGlvbnMxMCA9IHsKICAgICAgICBwb3NpdGlvbnM6IHZvaWQgMCwKICAgICAgICBlbGxpcHNvaWQ6IHNjcmF0Y2hFbGxpcHNvaWQ1LAogICAgICAgIHdpZHRoOiB2b2lkIDAsCiAgICAgICAgaGVpZ2h0OiB2b2lkIDAsCiAgICAgICAgZXh0cnVkZWRIZWlnaHQ6IHZvaWQgMCwKICAgICAgICBjb3JuZXJUeXBlOiB2b2lkIDAsCiAgICAgICAgZ3JhbnVsYXJpdHk6IHZvaWQgMCwKICAgICAgICBvZmZzZXRBdHRyaWJ1dGU6IHZvaWQgMAogICAgICB9OwogICAgICBDb3JyaWRvck91dGxpbmVHZW9tZXRyeS51bnBhY2sgPSBmdW5jdGlvbihhcnJheSwgc3RhcnRpbmdJbmRleCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJhcnJheSIsIGFycmF5KTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSwgc3RhcnRpbmdJbmRleCArPSBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoKSB7CiAgICAgICAgICBwb3NpdGlvbnNbaV0gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQudW5wYWNrKGFycmF5LCBzdGFydGluZ0luZGV4LCBzY3JhdGNoRWxsaXBzb2lkNSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgY29uc3Qgd2lkdGggPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IGhlaWdodCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgZXh0cnVkZWRIZWlnaHQgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IGNvcm5lclR5cGUgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBvZmZzZXRBdHRyaWJ1dGUgPSBhcnJheVtzdGFydGluZ0luZGV4XTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczEwLnBvc2l0aW9ucyA9IHBvc2l0aW9uczsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTAud2lkdGggPSB3aWR0aDsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTAuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxMC5leHRydWRlZEhlaWdodCA9IGV4dHJ1ZGVkSGVpZ2h0OwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxMC5jb3JuZXJUeXBlID0gY29ybmVyVHlwZTsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTAuZ3JhbnVsYXJpdHkgPSBncmFudWxhcml0eTsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTAub2Zmc2V0QXR0cmlidXRlID0gb2Zmc2V0QXR0cmlidXRlID09PSAtMSA/IHZvaWQgMCA6IG9mZnNldEF0dHJpYnV0ZTsKICAgICAgICAgIHJldHVybiBuZXcgQ29ycmlkb3JPdXRsaW5lR2VvbWV0cnkoc2NyYXRjaE9wdGlvbnMxMCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5fcG9zaXRpb25zID0gcG9zaXRpb25zOwogICAgICAgIHJlc3VsdC5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUoZWxsaXBzb2lkLCByZXN1bHQuX2VsbGlwc29pZCk7CiAgICAgICAgcmVzdWx0Ll93aWR0aCA9IHdpZHRoOwogICAgICAgIHJlc3VsdC5faGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgIHJlc3VsdC5fZXh0cnVkZWRIZWlnaHQgPSBleHRydWRlZEhlaWdodDsKICAgICAgICByZXN1bHQuX2Nvcm5lclR5cGUgPSBjb3JuZXJUeXBlOwogICAgICAgIHJlc3VsdC5fZ3JhbnVsYXJpdHkgPSBncmFudWxhcml0eTsKICAgICAgICByZXN1bHQuX29mZnNldEF0dHJpYnV0ZSA9IG9mZnNldEF0dHJpYnV0ZSA9PT0gLTEgPyB2b2lkIDAgOiBvZmZzZXRBdHRyaWJ1dGU7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ29ycmlkb3JPdXRsaW5lR2VvbWV0cnkuY3JlYXRlR2VvbWV0cnkgPSBmdW5jdGlvbihjb3JyaWRvck91dGxpbmVHZW9tZXRyeSkgewogICAgICAgIGxldCBwb3NpdGlvbnMgPSBjb3JyaWRvck91dGxpbmVHZW9tZXRyeS5fcG9zaXRpb25zOwogICAgICAgIGNvbnN0IHdpZHRoID0gY29ycmlkb3JPdXRsaW5lR2VvbWV0cnkuX3dpZHRoOwogICAgICAgIGNvbnN0IGVsbGlwc29pZCA9IGNvcnJpZG9yT3V0bGluZUdlb21ldHJ5Ll9lbGxpcHNvaWQ7CiAgICAgICAgcG9zaXRpb25zID0gc2NhbGVUb1N1cmZhY2UzKHBvc2l0aW9ucywgZWxsaXBzb2lkKTsKICAgICAgICBjb25zdCBjbGVhblBvc2l0aW9ucyA9IGFycmF5UmVtb3ZlRHVwbGljYXRlc19kZWZhdWx0KAogICAgICAgICAgcG9zaXRpb25zLAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24KICAgICAgICApOwogICAgICAgIGlmIChjbGVhblBvc2l0aW9ucy5sZW5ndGggPCAyIHx8IHdpZHRoIDw9IDApIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgaGVpZ2h0ID0gY29ycmlkb3JPdXRsaW5lR2VvbWV0cnkuX2hlaWdodDsKICAgICAgICBjb25zdCBleHRydWRlZEhlaWdodCA9IGNvcnJpZG9yT3V0bGluZUdlb21ldHJ5Ll9leHRydWRlZEhlaWdodDsKICAgICAgICBjb25zdCBleHRydWRlID0gIU1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgaGVpZ2h0LAogICAgICAgICAgZXh0cnVkZWRIZWlnaHQsCiAgICAgICAgICAwLAogICAgICAgICAgTWF0aF9kZWZhdWx0LkVQU0lMT04yCiAgICAgICAgKTsKICAgICAgICBjb25zdCBwYXJhbXMgPSB7CiAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICBwb3NpdGlvbnM6IGNsZWFuUG9zaXRpb25zLAogICAgICAgICAgd2lkdGgsCiAgICAgICAgICBjb3JuZXJUeXBlOiBjb3JyaWRvck91dGxpbmVHZW9tZXRyeS5fY29ybmVyVHlwZSwKICAgICAgICAgIGdyYW51bGFyaXR5OiBjb3JyaWRvck91dGxpbmVHZW9tZXRyeS5fZ3JhbnVsYXJpdHksCiAgICAgICAgICBzYXZlQXR0cmlidXRlczogZmFsc2UKICAgICAgICB9OwogICAgICAgIGxldCBhdHRyOwogICAgICAgIGlmIChleHRydWRlKSB7CiAgICAgICAgICBwYXJhbXMuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgICAgcGFyYW1zLmV4dHJ1ZGVkSGVpZ2h0ID0gZXh0cnVkZWRIZWlnaHQ7CiAgICAgICAgICBwYXJhbXMub2Zmc2V0QXR0cmlidXRlID0gY29ycmlkb3JPdXRsaW5lR2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZTsKICAgICAgICAgIGF0dHIgPSBjb21wdXRlUG9zaXRpb25zRXh0cnVkZWQyKHBhcmFtcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGNvbXB1dGVkUG9zaXRpb25zID0gQ29ycmlkb3JHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5jb21wdXRlUG9zaXRpb25zKHBhcmFtcyk7CiAgICAgICAgICBhdHRyID0gY29tYmluZTMoY29tcHV0ZWRQb3NpdGlvbnMsIHBhcmFtcy5jb3JuZXJUeXBlKTsKICAgICAgICAgIGF0dHIuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMgPSBQb2x5Z29uUGlwZWxpbmVfZGVmYXVsdC5zY2FsZVRvR2VvZGV0aWNIZWlnaHQoCiAgICAgICAgICAgIGF0dHIuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsCiAgICAgICAgICAgIGhlaWdodCwKICAgICAgICAgICAgZWxsaXBzb2lkCiAgICAgICAgICApOwogICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChjb3JyaWRvck91dGxpbmVHZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlKSkgewogICAgICAgICAgICBjb25zdCBsZW5ndGggPSBhdHRyLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLmxlbmd0aDsKICAgICAgICAgICAgY29uc3Qgb2Zmc2V0VmFsdWUgPSBjb3JyaWRvck91dGxpbmVHZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlID09PSBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZV9kZWZhdWx0Lk5PTkUgPyAwIDogMTsKICAgICAgICAgICAgY29uc3QgYXBwbHlPZmZzZXQgPSBuZXcgVWludDhBcnJheShsZW5ndGggLyAzKS5maWxsKG9mZnNldFZhbHVlKTsKICAgICAgICAgICAgYXR0ci5hdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LlVOU0lHTkVEX0JZVEUsCiAgICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMSwKICAgICAgICAgICAgICB2YWx1ZXM6IGFwcGx5T2Zmc2V0CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gYXR0ci5hdHRyaWJ1dGVzOwogICAgICAgIGNvbnN0IGJvdW5kaW5nU3BoZXJlID0gQm91bmRpbmdTcGhlcmVfZGVmYXVsdC5mcm9tVmVydGljZXMoCiAgICAgICAgICBhdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcywKICAgICAgICAgIHZvaWQgMCwKICAgICAgICAgIDMKICAgICAgICApOwogICAgICAgIHJldHVybiBuZXcgR2VvbWV0cnlfZGVmYXVsdCh7CiAgICAgICAgICBhdHRyaWJ1dGVzLAogICAgICAgICAgaW5kaWNlczogYXR0ci5pbmRpY2VzLAogICAgICAgICAgcHJpbWl0aXZlVHlwZTogUHJpbWl0aXZlVHlwZV9kZWZhdWx0LkxJTkVTLAogICAgICAgICAgYm91bmRpbmdTcGhlcmUsCiAgICAgICAgICBvZmZzZXRBdHRyaWJ1dGU6IGNvcnJpZG9yT3V0bGluZUdlb21ldHJ5Ll9vZmZzZXRBdHRyaWJ1dGUKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgQ29ycmlkb3JPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdCA9IENvcnJpZG9yT3V0bGluZUdlb21ldHJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlQ29ycmlkb3JPdXRsaW5lR2VvbWV0cnkuanMKICB2YXIgY3JlYXRlQ29ycmlkb3JPdXRsaW5lR2VvbWV0cnlfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGNyZWF0ZUNvcnJpZG9yT3V0bGluZUdlb21ldHJ5X2V4cG9ydHMsIHsKICAgIGRlZmF1bHQ6ICgpID0+IGNyZWF0ZUNvcnJpZG9yT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQKICB9KTsKICBmdW5jdGlvbiBjcmVhdGVDb3JyaWRvck91dGxpbmVHZW9tZXRyeShjb3JyaWRvck91dGxpbmVHZW9tZXRyeSwgb2Zmc2V0KSB7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG9mZnNldCkpIHsKICAgICAgY29ycmlkb3JPdXRsaW5lR2VvbWV0cnkgPSBDb3JyaWRvck91dGxpbmVHZW9tZXRyeV9kZWZhdWx0LnVucGFjaygKICAgICAgICBjb3JyaWRvck91dGxpbmVHZW9tZXRyeSwKICAgICAgICBvZmZzZXQKICAgICAgKTsKICAgIH0KICAgIGNvcnJpZG9yT3V0bGluZUdlb21ldHJ5Ll9lbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC5jbG9uZSgKICAgICAgY29ycmlkb3JPdXRsaW5lR2VvbWV0cnkuX2VsbGlwc29pZAogICAgKTsKICAgIHJldHVybiBDb3JyaWRvck91dGxpbmVHZW9tZXRyeV9kZWZhdWx0LmNyZWF0ZUdlb21ldHJ5KGNvcnJpZG9yT3V0bGluZUdlb21ldHJ5KTsKICB9CiAgdmFyIGNyZWF0ZUNvcnJpZG9yT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfY3JlYXRlQ29ycmlkb3JPdXRsaW5lR2VvbWV0cnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZUNvcnJpZG9yT3V0bGluZUdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9Db3JyaWRvck91dGxpbmVHZW9tZXRyeSgpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgY3JlYXRlQ29ycmlkb3JPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdCA9IGNyZWF0ZUNvcnJpZG9yT3V0bGluZUdlb21ldHJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ3lsaW5kZXJHZW9tZXRyeUxpYnJhcnkuanMKICB2YXIgQ3lsaW5kZXJHZW9tZXRyeUxpYnJhcnksIEN5bGluZGVyR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfQ3lsaW5kZXJHZW9tZXRyeUxpYnJhcnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0N5bGluZGVyR2VvbWV0cnlMaWJyYXJ5LmpzIigpIHsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIEN5bGluZGVyR2VvbWV0cnlMaWJyYXJ5ID0ge307CiAgICAgIEN5bGluZGVyR2VvbWV0cnlMaWJyYXJ5LmNvbXB1dGVQb3NpdGlvbnMgPSBmdW5jdGlvbihsZW5ndGgsIHRvcFJhZGl1cywgYm90dG9tUmFkaXVzLCBzbGljZXMsIGZpbGwpIHsKICAgICAgICBjb25zdCB0b3BaID0gbGVuZ3RoICogMC41OwogICAgICAgIGNvbnN0IGJvdHRvbVogPSAtdG9wWjsKICAgICAgICBjb25zdCB0d29TbGljZSA9IHNsaWNlcyArIHNsaWNlczsKICAgICAgICBjb25zdCBzaXplID0gZmlsbCA/IDIgKiB0d29TbGljZSA6IHR3b1NsaWNlOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSAqIDMpOwogICAgICAgIGxldCBpOwogICAgICAgIGxldCBpbmRleCA9IDA7CiAgICAgICAgbGV0IHRiSW5kZXggPSAwOwogICAgICAgIGNvbnN0IGJvdHRvbU9mZnNldCA9IGZpbGwgPyB0d29TbGljZSAqIDMgOiAwOwogICAgICAgIGNvbnN0IHRvcE9mZnNldCA9IGZpbGwgPyAodHdvU2xpY2UgKyBzbGljZXMpICogMyA6IHNsaWNlcyAqIDM7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHNsaWNlczsgaSsrKSB7CiAgICAgICAgICBjb25zdCBhbmdsZSA9IGkgLyBzbGljZXMgKiBNYXRoX2RlZmF1bHQuVFdPX1BJOwogICAgICAgICAgY29uc3QgeCA9IE1hdGguY29zKGFuZ2xlKTsKICAgICAgICAgIGNvbnN0IHkgPSBNYXRoLnNpbihhbmdsZSk7CiAgICAgICAgICBjb25zdCBib3R0b21YID0geCAqIGJvdHRvbVJhZGl1czsKICAgICAgICAgIGNvbnN0IGJvdHRvbVkgPSB5ICogYm90dG9tUmFkaXVzOwogICAgICAgICAgY29uc3QgdG9wWCA9IHggKiB0b3BSYWRpdXM7CiAgICAgICAgICBjb25zdCB0b3BZID0geSAqIHRvcFJhZGl1czsKICAgICAgICAgIHBvc2l0aW9uc1t0YkluZGV4ICsgYm90dG9tT2Zmc2V0XSA9IGJvdHRvbVg7CiAgICAgICAgICBwb3NpdGlvbnNbdGJJbmRleCArIGJvdHRvbU9mZnNldCArIDFdID0gYm90dG9tWTsKICAgICAgICAgIHBvc2l0aW9uc1t0YkluZGV4ICsgYm90dG9tT2Zmc2V0ICsgMl0gPSBib3R0b21aOwogICAgICAgICAgcG9zaXRpb25zW3RiSW5kZXggKyB0b3BPZmZzZXRdID0gdG9wWDsKICAgICAgICAgIHBvc2l0aW9uc1t0YkluZGV4ICsgdG9wT2Zmc2V0ICsgMV0gPSB0b3BZOwogICAgICAgICAgcG9zaXRpb25zW3RiSW5kZXggKyB0b3BPZmZzZXQgKyAyXSA9IHRvcFo7CiAgICAgICAgICB0YkluZGV4ICs9IDM7CiAgICAgICAgICBpZiAoZmlsbCkgewogICAgICAgICAgICBwb3NpdGlvbnNbaW5kZXgrK10gPSBib3R0b21YOwogICAgICAgICAgICBwb3NpdGlvbnNbaW5kZXgrK10gPSBib3R0b21ZOwogICAgICAgICAgICBwb3NpdGlvbnNbaW5kZXgrK10gPSBib3R0b21aOwogICAgICAgICAgICBwb3NpdGlvbnNbaW5kZXgrK10gPSB0b3BYOwogICAgICAgICAgICBwb3NpdGlvbnNbaW5kZXgrK10gPSB0b3BZOwogICAgICAgICAgICBwb3NpdGlvbnNbaW5kZXgrK10gPSB0b3BaOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcG9zaXRpb25zOwogICAgICB9OwogICAgICBDeWxpbmRlckdlb21ldHJ5TGlicmFyeV9kZWZhdWx0ID0gQ3lsaW5kZXJHZW9tZXRyeUxpYnJhcnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9DeWxpbmRlckdlb21ldHJ5LmpzCiAgZnVuY3Rpb24gQ3lsaW5kZXJHZW9tZXRyeShvcHRpb25zKSB7CiAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICBjb25zdCBsZW5ndGggPSBvcHRpb25zLmxlbmd0aDsKICAgIGNvbnN0IHRvcFJhZGl1cyA9IG9wdGlvbnMudG9wUmFkaXVzOwogICAgY29uc3QgYm90dG9tUmFkaXVzID0gb3B0aW9ucy5ib3R0b21SYWRpdXM7CiAgICBjb25zdCB2ZXJ0ZXhGb3JtYXQgPSBvcHRpb25zLnZlcnRleEZvcm1hdCA/PyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5ERUZBVUxUOwogICAgY29uc3Qgc2xpY2VzID0gb3B0aW9ucy5zbGljZXMgPz8gMTI4OwogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobGVuZ3RoKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgib3B0aW9ucy5sZW5ndGggbXVzdCBiZSBkZWZpbmVkLiIpOwogICAgfQogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodG9wUmFkaXVzKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgib3B0aW9ucy50b3BSYWRpdXMgbXVzdCBiZSBkZWZpbmVkLiIpOwogICAgfQogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYm90dG9tUmFkaXVzKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgib3B0aW9ucy5ib3R0b21SYWRpdXMgbXVzdCBiZSBkZWZpbmVkLiIpOwogICAgfQogICAgaWYgKHNsaWNlcyA8IDMpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgIm9wdGlvbnMuc2xpY2VzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDMuIgogICAgICApOwogICAgfQogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvcHRpb25zLm9mZnNldEF0dHJpYnV0ZSkgJiYgb3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGUgPT09IEdlb21ldHJ5T2Zmc2V0QXR0cmlidXRlX2RlZmF1bHQuVE9QKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICJHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZS5UT1AgaXMgbm90IGEgc3VwcG9ydGVkIG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlIGZvciB0aGlzIGdlb21ldHJ5LiIKICAgICAgKTsKICAgIH0KICAgIHRoaXMuX2xlbmd0aCA9IGxlbmd0aDsKICAgIHRoaXMuX3RvcFJhZGl1cyA9IHRvcFJhZGl1czsKICAgIHRoaXMuX2JvdHRvbVJhZGl1cyA9IGJvdHRvbVJhZGl1czsKICAgIHRoaXMuX3ZlcnRleEZvcm1hdCA9IFZlcnRleEZvcm1hdF9kZWZhdWx0LmNsb25lKHZlcnRleEZvcm1hdCk7CiAgICB0aGlzLl9zbGljZXMgPSBzbGljZXM7CiAgICB0aGlzLl9vZmZzZXRBdHRyaWJ1dGUgPSBvcHRpb25zLm9mZnNldEF0dHJpYnV0ZTsKICAgIHRoaXMuX3dvcmtlck5hbWUgPSAiY3JlYXRlQ3lsaW5kZXJHZW9tZXRyeSI7CiAgfQogIHZhciByYWRpdXNTY3JhdGNoLCBub3JtYWxTY3JhdGNoMywgYml0YW5nZW50U2NyYXRjaCwgdGFuZ2VudFNjcmF0Y2gsIHBvc2l0aW9uU2NyYXRjaCwgc2NyYXRjaFZlcnRleEZvcm1hdDUsIHNjcmF0Y2hPcHRpb25zMTEsIHVuaXRDeWxpbmRlckdlb21ldHJ5LCBDeWxpbmRlckdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfQ3lsaW5kZXJHZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ3lsaW5kZXJHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfQm91bmRpbmdTcGhlcmUoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4yKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NvbXBvbmVudERhdGF0eXBlKCk7CiAgICAgIGluaXRfQ3lsaW5kZXJHZW9tZXRyeUxpYnJhcnkoKTsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9HZW9tZXRyeSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlKCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGVzKCk7CiAgICAgIGluaXRfR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGUoKTsKICAgICAgaW5pdF9JbmRleERhdGF0eXBlKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBpbml0X1ByaW1pdGl2ZVR5cGUoKTsKICAgICAgaW5pdF9WZXJ0ZXhGb3JtYXQoKTsKICAgICAgcmFkaXVzU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKTsKICAgICAgbm9ybWFsU2NyYXRjaDMgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGJpdGFuZ2VudFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHRhbmdlbnRTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBwb3NpdGlvblNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIEN5bGluZGVyR2VvbWV0cnkucGFja2VkTGVuZ3RoID0gVmVydGV4Rm9ybWF0X2RlZmF1bHQucGFja2VkTGVuZ3RoICsgNTsKICAgICAgQ3lsaW5kZXJHZW9tZXRyeS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodmFsdWUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgidmFsdWUgaXMgcmVxdWlyZWQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYXJyYXkpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXJyYXkgaXMgcmVxdWlyZWQiKTsKICAgICAgICB9CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrKHZhbHVlLl92ZXJ0ZXhGb3JtYXQsIGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IFZlcnRleEZvcm1hdF9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX2xlbmd0aDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX3RvcFJhZGl1czsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX2JvdHRvbVJhZGl1czsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX3NsaWNlczsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4XSA9IHZhbHVlLl9vZmZzZXRBdHRyaWJ1dGUgPz8gLTE7CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9OwogICAgICBzY3JhdGNoVmVydGV4Rm9ybWF0NSA9IG5ldyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoT3B0aW9uczExID0gewogICAgICAgIHZlcnRleEZvcm1hdDogc2NyYXRjaFZlcnRleEZvcm1hdDUsCiAgICAgICAgbGVuZ3RoOiB2b2lkIDAsCiAgICAgICAgdG9wUmFkaXVzOiB2b2lkIDAsCiAgICAgICAgYm90dG9tUmFkaXVzOiB2b2lkIDAsCiAgICAgICAgc2xpY2VzOiB2b2lkIDAsCiAgICAgICAgb2Zmc2V0QXR0cmlidXRlOiB2b2lkIDAKICAgICAgfTsKICAgICAgQ3lsaW5kZXJHZW9tZXRyeS51bnBhY2sgPSBmdW5jdGlvbihhcnJheSwgc3RhcnRpbmdJbmRleCwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYXJyYXkpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXJyYXkgaXMgcmVxdWlyZWQiKTsKICAgICAgICB9CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBjb25zdCB2ZXJ0ZXhGb3JtYXQgPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC51bnBhY2soCiAgICAgICAgICBhcnJheSwKICAgICAgICAgIHN0YXJ0aW5nSW5kZXgsCiAgICAgICAgICBzY3JhdGNoVmVydGV4Rm9ybWF0NQogICAgICAgICk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgY29uc3QgbGVuZ3RoID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCB0b3BSYWRpdXMgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IGJvdHRvbVJhZGl1cyA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3Qgc2xpY2VzID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBvZmZzZXRBdHRyaWJ1dGUgPSBhcnJheVtzdGFydGluZ0luZGV4XTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczExLmxlbmd0aCA9IGxlbmd0aDsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTEudG9wUmFkaXVzID0gdG9wUmFkaXVzOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxMS5ib3R0b21SYWRpdXMgPSBib3R0b21SYWRpdXM7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczExLnNsaWNlcyA9IHNsaWNlczsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTEub2Zmc2V0QXR0cmlidXRlID0gb2Zmc2V0QXR0cmlidXRlID09PSAtMSA/IHZvaWQgMCA6IG9mZnNldEF0dHJpYnV0ZTsKICAgICAgICAgIHJldHVybiBuZXcgQ3lsaW5kZXJHZW9tZXRyeShzY3JhdGNoT3B0aW9uczExKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0Ll92ZXJ0ZXhGb3JtYXQgPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5jbG9uZSh2ZXJ0ZXhGb3JtYXQsIHJlc3VsdC5fdmVydGV4Rm9ybWF0KTsKICAgICAgICByZXN1bHQuX2xlbmd0aCA9IGxlbmd0aDsKICAgICAgICByZXN1bHQuX3RvcFJhZGl1cyA9IHRvcFJhZGl1czsKICAgICAgICByZXN1bHQuX2JvdHRvbVJhZGl1cyA9IGJvdHRvbVJhZGl1czsKICAgICAgICByZXN1bHQuX3NsaWNlcyA9IHNsaWNlczsKICAgICAgICByZXN1bHQuX29mZnNldEF0dHJpYnV0ZSA9IG9mZnNldEF0dHJpYnV0ZSA9PT0gLTEgPyB2b2lkIDAgOiBvZmZzZXRBdHRyaWJ1dGU7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ3lsaW5kZXJHZW9tZXRyeS5jcmVhdGVHZW9tZXRyeSA9IGZ1bmN0aW9uKGN5bGluZGVyR2VvbWV0cnkpIHsKICAgICAgICBsZXQgbGVuZ3RoID0gY3lsaW5kZXJHZW9tZXRyeS5fbGVuZ3RoOwogICAgICAgIGNvbnN0IHRvcFJhZGl1cyA9IGN5bGluZGVyR2VvbWV0cnkuX3RvcFJhZGl1czsKICAgICAgICBjb25zdCBib3R0b21SYWRpdXMgPSBjeWxpbmRlckdlb21ldHJ5Ll9ib3R0b21SYWRpdXM7CiAgICAgICAgY29uc3QgdmVydGV4Rm9ybWF0ID0gY3lsaW5kZXJHZW9tZXRyeS5fdmVydGV4Rm9ybWF0OwogICAgICAgIGNvbnN0IHNsaWNlcyA9IGN5bGluZGVyR2VvbWV0cnkuX3NsaWNlczsKICAgICAgICBpZiAobGVuZ3RoIDw9IDAgfHwgdG9wUmFkaXVzIDwgMCB8fCBib3R0b21SYWRpdXMgPCAwIHx8IHRvcFJhZGl1cyA9PT0gMCAmJiBib3R0b21SYWRpdXMgPT09IDApIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgdHdvU2xpY2VzID0gc2xpY2VzICsgc2xpY2VzOwogICAgICAgIGNvbnN0IHRocmVlU2xpY2VzID0gc2xpY2VzICsgdHdvU2xpY2VzOwogICAgICAgIGNvbnN0IG51bVZlcnRpY2VzID0gdHdvU2xpY2VzICsgdHdvU2xpY2VzOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IEN5bGluZGVyR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuY29tcHV0ZVBvc2l0aW9ucygKICAgICAgICAgIGxlbmd0aCwKICAgICAgICAgIHRvcFJhZGl1cywKICAgICAgICAgIGJvdHRvbVJhZGl1cywKICAgICAgICAgIHNsaWNlcywKICAgICAgICAgIHRydWUKICAgICAgICApOwogICAgICAgIGNvbnN0IHN0ID0gdmVydGV4Rm9ybWF0LnN0ID8gbmV3IEZsb2F0MzJBcnJheShudW1WZXJ0aWNlcyAqIDIpIDogdm9pZCAwOwogICAgICAgIGNvbnN0IG5vcm1hbHMgPSB2ZXJ0ZXhGb3JtYXQubm9ybWFsID8gbmV3IEZsb2F0MzJBcnJheShudW1WZXJ0aWNlcyAqIDMpIDogdm9pZCAwOwogICAgICAgIGNvbnN0IHRhbmdlbnRzID0gdmVydGV4Rm9ybWF0LnRhbmdlbnQgPyBuZXcgRmxvYXQzMkFycmF5KG51bVZlcnRpY2VzICogMykgOiB2b2lkIDA7CiAgICAgICAgY29uc3QgYml0YW5nZW50cyA9IHZlcnRleEZvcm1hdC5iaXRhbmdlbnQgPyBuZXcgRmxvYXQzMkFycmF5KG51bVZlcnRpY2VzICogMykgOiB2b2lkIDA7CiAgICAgICAgbGV0IGk7CiAgICAgICAgY29uc3QgY29tcHV0ZU5vcm1hbCA9IHZlcnRleEZvcm1hdC5ub3JtYWwgfHwgdmVydGV4Rm9ybWF0LnRhbmdlbnQgfHwgdmVydGV4Rm9ybWF0LmJpdGFuZ2VudDsKICAgICAgICBpZiAoY29tcHV0ZU5vcm1hbCkgewogICAgICAgICAgY29uc3QgY29tcHV0ZVRhbmdlbnQgPSB2ZXJ0ZXhGb3JtYXQudGFuZ2VudCB8fCB2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50OwogICAgICAgICAgbGV0IG5vcm1hbEluZGV4ID0gMDsKICAgICAgICAgIGxldCB0YW5nZW50SW5kZXggPSAwOwogICAgICAgICAgbGV0IGJpdGFuZ2VudEluZGV4ID0gMDsKICAgICAgICAgIGNvbnN0IHRoZXRhID0gTWF0aC5hdGFuMihib3R0b21SYWRpdXMgLSB0b3BSYWRpdXMsIGxlbmd0aCk7CiAgICAgICAgICBjb25zdCBub3JtYWwyID0gbm9ybWFsU2NyYXRjaDM7CiAgICAgICAgICBub3JtYWwyLnogPSBNYXRoLnNpbih0aGV0YSk7CiAgICAgICAgICBjb25zdCBub3JtYWxTY2FsZTIgPSBNYXRoLmNvcyh0aGV0YSk7CiAgICAgICAgICBsZXQgdGFuZ2VudCA9IHRhbmdlbnRTY3JhdGNoOwogICAgICAgICAgbGV0IGJpdGFuZ2VudCA9IGJpdGFuZ2VudFNjcmF0Y2g7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2xpY2VzOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgYW5nbGUgPSBpIC8gc2xpY2VzICogTWF0aF9kZWZhdWx0LlRXT19QSTsKICAgICAgICAgICAgY29uc3QgeCA9IG5vcm1hbFNjYWxlMiAqIE1hdGguY29zKGFuZ2xlKTsKICAgICAgICAgICAgY29uc3QgeSA9IG5vcm1hbFNjYWxlMiAqIE1hdGguc2luKGFuZ2xlKTsKICAgICAgICAgICAgaWYgKGNvbXB1dGVOb3JtYWwpIHsKICAgICAgICAgICAgICBub3JtYWwyLnggPSB4OwogICAgICAgICAgICAgIG5vcm1hbDIueSA9IHk7CiAgICAgICAgICAgICAgaWYgKGNvbXB1dGVUYW5nZW50KSB7CiAgICAgICAgICAgICAgICB0YW5nZW50ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKENhcnRlc2lhbjNfZGVmYXVsdC5VTklUX1osIG5vcm1hbDIsIHRhbmdlbnQpLAogICAgICAgICAgICAgICAgICB0YW5nZW50CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCkgewogICAgICAgICAgICAgICAgbm9ybWFsc1tub3JtYWxJbmRleCsrXSA9IG5vcm1hbDIueDsKICAgICAgICAgICAgICAgIG5vcm1hbHNbbm9ybWFsSW5kZXgrK10gPSBub3JtYWwyLnk7CiAgICAgICAgICAgICAgICBub3JtYWxzW25vcm1hbEluZGV4KytdID0gbm9ybWFsMi56OwogICAgICAgICAgICAgICAgbm9ybWFsc1tub3JtYWxJbmRleCsrXSA9IG5vcm1hbDIueDsKICAgICAgICAgICAgICAgIG5vcm1hbHNbbm9ybWFsSW5kZXgrK10gPSBub3JtYWwyLnk7CiAgICAgICAgICAgICAgICBub3JtYWxzW25vcm1hbEluZGV4KytdID0gbm9ybWFsMi56OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnRhbmdlbnQpIHsKICAgICAgICAgICAgICAgIHRhbmdlbnRzW3RhbmdlbnRJbmRleCsrXSA9IHRhbmdlbnQueDsKICAgICAgICAgICAgICAgIHRhbmdlbnRzW3RhbmdlbnRJbmRleCsrXSA9IHRhbmdlbnQueTsKICAgICAgICAgICAgICAgIHRhbmdlbnRzW3RhbmdlbnRJbmRleCsrXSA9IHRhbmdlbnQuejsKICAgICAgICAgICAgICAgIHRhbmdlbnRzW3RhbmdlbnRJbmRleCsrXSA9IHRhbmdlbnQueDsKICAgICAgICAgICAgICAgIHRhbmdlbnRzW3RhbmdlbnRJbmRleCsrXSA9IHRhbmdlbnQueTsKICAgICAgICAgICAgICAgIHRhbmdlbnRzW3RhbmdlbnRJbmRleCsrXSA9IHRhbmdlbnQuejsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5iaXRhbmdlbnQpIHsKICAgICAgICAgICAgICAgIGJpdGFuZ2VudCA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoCiAgICAgICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhub3JtYWwyLCB0YW5nZW50LCBiaXRhbmdlbnQpLAogICAgICAgICAgICAgICAgICBiaXRhbmdlbnQKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiaXRhbmdlbnRzW2JpdGFuZ2VudEluZGV4KytdID0gYml0YW5nZW50Lng7CiAgICAgICAgICAgICAgICBiaXRhbmdlbnRzW2JpdGFuZ2VudEluZGV4KytdID0gYml0YW5nZW50Lnk7CiAgICAgICAgICAgICAgICBiaXRhbmdlbnRzW2JpdGFuZ2VudEluZGV4KytdID0gYml0YW5nZW50Lno7CiAgICAgICAgICAgICAgICBiaXRhbmdlbnRzW2JpdGFuZ2VudEluZGV4KytdID0gYml0YW5nZW50Lng7CiAgICAgICAgICAgICAgICBiaXRhbmdlbnRzW2JpdGFuZ2VudEluZGV4KytdID0gYml0YW5nZW50Lnk7CiAgICAgICAgICAgICAgICBiaXRhbmdlbnRzW2JpdGFuZ2VudEluZGV4KytdID0gYml0YW5nZW50Lno7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2xpY2VzOyBpKyspIHsKICAgICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5ub3JtYWwpIHsKICAgICAgICAgICAgICBub3JtYWxzW25vcm1hbEluZGV4KytdID0gMDsKICAgICAgICAgICAgICBub3JtYWxzW25vcm1hbEluZGV4KytdID0gMDsKICAgICAgICAgICAgICBub3JtYWxzW25vcm1hbEluZGV4KytdID0gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC50YW5nZW50KSB7CiAgICAgICAgICAgICAgdGFuZ2VudHNbdGFuZ2VudEluZGV4KytdID0gMTsKICAgICAgICAgICAgICB0YW5nZW50c1t0YW5nZW50SW5kZXgrK10gPSAwOwogICAgICAgICAgICAgIHRhbmdlbnRzW3RhbmdlbnRJbmRleCsrXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5iaXRhbmdlbnQpIHsKICAgICAgICAgICAgICBiaXRhbmdlbnRzW2JpdGFuZ2VudEluZGV4KytdID0gMDsKICAgICAgICAgICAgICBiaXRhbmdlbnRzW2JpdGFuZ2VudEluZGV4KytdID0gLTE7CiAgICAgICAgICAgICAgYml0YW5nZW50c1tiaXRhbmdlbnRJbmRleCsrXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbGljZXM7IGkrKykgewogICAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCkgewogICAgICAgICAgICAgIG5vcm1hbHNbbm9ybWFsSW5kZXgrK10gPSAwOwogICAgICAgICAgICAgIG5vcm1hbHNbbm9ybWFsSW5kZXgrK10gPSAwOwogICAgICAgICAgICAgIG5vcm1hbHNbbm9ybWFsSW5kZXgrK10gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQudGFuZ2VudCkgewogICAgICAgICAgICAgIHRhbmdlbnRzW3RhbmdlbnRJbmRleCsrXSA9IDE7CiAgICAgICAgICAgICAgdGFuZ2VudHNbdGFuZ2VudEluZGV4KytdID0gMDsKICAgICAgICAgICAgICB0YW5nZW50c1t0YW5nZW50SW5kZXgrK10gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgICAgICAgICAgYml0YW5nZW50c1tiaXRhbmdlbnRJbmRleCsrXSA9IDA7CiAgICAgICAgICAgICAgYml0YW5nZW50c1tiaXRhbmdlbnRJbmRleCsrXSA9IDE7CiAgICAgICAgICAgICAgYml0YW5nZW50c1tiaXRhbmdlbnRJbmRleCsrXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgbnVtSW5kaWNlcyA9IDEyICogc2xpY2VzIC0gMTI7CiAgICAgICAgY29uc3QgaW5kaWNlcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KG51bVZlcnRpY2VzLCBudW1JbmRpY2VzKTsKICAgICAgICBsZXQgaW5kZXggPSAwOwogICAgICAgIGxldCBqID0gMDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2xpY2VzIC0gMTsgaSsrKSB7CiAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gajsKICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBqICsgMjsKICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBqICsgMzsKICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBqOwogICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGogKyAzOwogICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGogKyAxOwogICAgICAgICAgaiArPSAyOwogICAgICAgIH0KICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gdHdvU2xpY2VzIC0gMjsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gMDsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gMTsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gdHdvU2xpY2VzIC0gMjsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gMTsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gdHdvU2xpY2VzIC0gMTsKICAgICAgICBmb3IgKGkgPSAxOyBpIDwgc2xpY2VzIC0gMTsgaSsrKSB7CiAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gdHdvU2xpY2VzICsgaSArIDE7CiAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gdHdvU2xpY2VzICsgaTsKICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSB0d29TbGljZXM7CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IDE7IGkgPCBzbGljZXMgLSAxOyBpKyspIHsKICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSB0aHJlZVNsaWNlczsKICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSB0aHJlZVNsaWNlcyArIGk7CiAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gdGhyZWVTbGljZXMgKyBpICsgMTsKICAgICAgICB9CiAgICAgICAgbGV0IHRleHR1cmVDb29yZEluZGV4ID0gMDsKICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnN0KSB7CiAgICAgICAgICBjb25zdCByYWQgPSBNYXRoLm1heCh0b3BSYWRpdXMsIGJvdHRvbVJhZGl1cyk7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVmVydGljZXM7IGkrKykgewogICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkocG9zaXRpb25zLCBpICogMywgcG9zaXRpb25TY3JhdGNoKTsKICAgICAgICAgICAgc3RbdGV4dHVyZUNvb3JkSW5kZXgrK10gPSAocG9zaXRpb24ueCArIHJhZCkgLyAoMiAqIHJhZCk7CiAgICAgICAgICAgIHN0W3RleHR1cmVDb29yZEluZGV4KytdID0gKHBvc2l0aW9uLnkgKyByYWQpIC8gKDIgKiByYWQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlc19kZWZhdWx0KCk7CiAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5wb3NpdGlvbikgewogICAgICAgICAgYXR0cmlidXRlcy5wb3NpdGlvbiA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRE9VQkxFLAogICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgICAgICB2YWx1ZXM6IHBvc2l0aW9ucwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQubm9ybWFsKSB7CiAgICAgICAgICBhdHRyaWJ1dGVzLm5vcm1hbCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgICAgIHZhbHVlczogbm9ybWFscwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQudGFuZ2VudCkgewogICAgICAgICAgYXR0cmlidXRlcy50YW5nZW50ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5GTE9BVCwKICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgICAgdmFsdWVzOiB0YW5nZW50cwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgICAgICBhdHRyaWJ1dGVzLmJpdGFuZ2VudCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgICAgIHZhbHVlczogYml0YW5nZW50cwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuc3QpIHsKICAgICAgICAgIGF0dHJpYnV0ZXMuc3QgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAyLAogICAgICAgICAgICB2YWx1ZXM6IHN0CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmFkaXVzU2NyYXRjaC54ID0gbGVuZ3RoICogMC41OwogICAgICAgIHJhZGl1c1NjcmF0Y2gueSA9IE1hdGgubWF4KGJvdHRvbVJhZGl1cywgdG9wUmFkaXVzKTsKICAgICAgICBjb25zdCBib3VuZGluZ1NwaGVyZSA9IG5ldyBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0KAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8sCiAgICAgICAgICBDYXJ0ZXNpYW4yX2RlZmF1bHQubWFnbml0dWRlKHJhZGl1c1NjcmF0Y2gpCiAgICAgICAgKTsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGN5bGluZGVyR2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZSkpIHsKICAgICAgICAgIGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgICBjb25zdCBvZmZzZXRWYWx1ZSA9IGN5bGluZGVyR2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZSA9PT0gR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGVfZGVmYXVsdC5OT05FID8gMCA6IDE7CiAgICAgICAgICBjb25zdCBhcHBseU9mZnNldCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCAvIDMpLmZpbGwob2Zmc2V0VmFsdWUpOwogICAgICAgICAgYXR0cmlidXRlcy5hcHBseU9mZnNldCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuVU5TSUdORURfQllURSwKICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMSwKICAgICAgICAgICAgdmFsdWVzOiBhcHBseU9mZnNldAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgR2VvbWV0cnlfZGVmYXVsdCh7CiAgICAgICAgICBhdHRyaWJ1dGVzLAogICAgICAgICAgaW5kaWNlcywKICAgICAgICAgIHByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5UUklBTkdMRVMsCiAgICAgICAgICBib3VuZGluZ1NwaGVyZSwKICAgICAgICAgIG9mZnNldEF0dHJpYnV0ZTogY3lsaW5kZXJHZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIEN5bGluZGVyR2VvbWV0cnkuZ2V0VW5pdEN5bGluZGVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodW5pdEN5bGluZGVyR2VvbWV0cnkpKSB7CiAgICAgICAgICB1bml0Q3lsaW5kZXJHZW9tZXRyeSA9IEN5bGluZGVyR2VvbWV0cnkuY3JlYXRlR2VvbWV0cnkoCiAgICAgICAgICAgIG5ldyBDeWxpbmRlckdlb21ldHJ5KHsKICAgICAgICAgICAgICB0b3BSYWRpdXM6IDEsCiAgICAgICAgICAgICAgYm90dG9tUmFkaXVzOiAxLAogICAgICAgICAgICAgIGxlbmd0aDogMSwKICAgICAgICAgICAgICB2ZXJ0ZXhGb3JtYXQ6IFZlcnRleEZvcm1hdF9kZWZhdWx0LlBPU0lUSU9OX09OTFkKICAgICAgICAgICAgfSkKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1bml0Q3lsaW5kZXJHZW9tZXRyeTsKICAgICAgfTsKICAgICAgQ3lsaW5kZXJHZW9tZXRyeV9kZWZhdWx0ID0gQ3lsaW5kZXJHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZUN5bGluZGVyR2VvbWV0cnkuanMKICB2YXIgY3JlYXRlQ3lsaW5kZXJHZW9tZXRyeV9leHBvcnRzID0ge307CiAgX19leHBvcnQoY3JlYXRlQ3lsaW5kZXJHZW9tZXRyeV9leHBvcnRzLCB7CiAgICBkZWZhdWx0OiAoKSA9PiBjcmVhdGVDeWxpbmRlckdlb21ldHJ5X2RlZmF1bHQKICB9KTsKICBmdW5jdGlvbiBjcmVhdGVDeWxpbmRlckdlb21ldHJ5KGN5bGluZGVyR2VvbWV0cnksIG9mZnNldCkgewogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvZmZzZXQpKSB7CiAgICAgIGN5bGluZGVyR2VvbWV0cnkgPSBDeWxpbmRlckdlb21ldHJ5X2RlZmF1bHQudW5wYWNrKGN5bGluZGVyR2VvbWV0cnksIG9mZnNldCk7CiAgICB9CiAgICByZXR1cm4gQ3lsaW5kZXJHZW9tZXRyeV9kZWZhdWx0LmNyZWF0ZUdlb21ldHJ5KGN5bGluZGVyR2VvbWV0cnkpOwogIH0KICB2YXIgY3JlYXRlQ3lsaW5kZXJHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X2NyZWF0ZUN5bGluZGVyR2VvbWV0cnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZUN5bGluZGVyR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X0N5bGluZGVyR2VvbWV0cnkoKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGNyZWF0ZUN5bGluZGVyR2VvbWV0cnlfZGVmYXVsdCA9IGNyZWF0ZUN5bGluZGVyR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9DeWxpbmRlck91dGxpbmVHZW9tZXRyeS5qcwogIGZ1bmN0aW9uIEN5bGluZGVyT3V0bGluZUdlb21ldHJ5KG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgIGNvbnN0IGxlbmd0aCA9IG9wdGlvbnMubGVuZ3RoOwogICAgY29uc3QgdG9wUmFkaXVzID0gb3B0aW9ucy50b3BSYWRpdXM7CiAgICBjb25zdCBib3R0b21SYWRpdXMgPSBvcHRpb25zLmJvdHRvbVJhZGl1czsKICAgIGNvbnN0IHNsaWNlcyA9IG9wdGlvbnMuc2xpY2VzID8/IDEyODsKICAgIGNvbnN0IG51bWJlck9mVmVydGljYWxMaW5lcyA9IE1hdGgubWF4KAogICAgICBvcHRpb25zLm51bWJlck9mVmVydGljYWxMaW5lcyA/PyAxNiwKICAgICAgMAogICAgKTsKICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigib3B0aW9ucy5wb3NpdGlvbnMiLCBsZW5ndGgpOwogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJvcHRpb25zLnRvcFJhZGl1cyIsIHRvcFJhZGl1cyk7CiAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoIm9wdGlvbnMuYm90dG9tUmFkaXVzIiwgYm90dG9tUmFkaXVzKTsKICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJvcHRpb25zLnNsaWNlcyIsIHNsaWNlcywgMyk7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlKSAmJiBvcHRpb25zLm9mZnNldEF0dHJpYnV0ZSA9PT0gR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGVfZGVmYXVsdC5UT1ApIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgIkdlb21ldHJ5T2Zmc2V0QXR0cmlidXRlLlRPUCBpcyBub3QgYSBzdXBwb3J0ZWQgb3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGUgZm9yIHRoaXMgZ2VvbWV0cnkuIgogICAgICApOwogICAgfQogICAgdGhpcy5fbGVuZ3RoID0gbGVuZ3RoOwogICAgdGhpcy5fdG9wUmFkaXVzID0gdG9wUmFkaXVzOwogICAgdGhpcy5fYm90dG9tUmFkaXVzID0gYm90dG9tUmFkaXVzOwogICAgdGhpcy5fc2xpY2VzID0gc2xpY2VzOwogICAgdGhpcy5fbnVtYmVyT2ZWZXJ0aWNhbExpbmVzID0gbnVtYmVyT2ZWZXJ0aWNhbExpbmVzOwogICAgdGhpcy5fb2Zmc2V0QXR0cmlidXRlID0gb3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGU7CiAgICB0aGlzLl93b3JrZXJOYW1lID0gImNyZWF0ZUN5bGluZGVyT3V0bGluZUdlb21ldHJ5IjsKICB9CiAgdmFyIHJhZGl1c1NjcmF0Y2gyLCBzY3JhdGNoT3B0aW9uczEyLCBDeWxpbmRlck91dGxpbmVHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X0N5bGluZGVyT3V0bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9DeWxpbmRlck91dGxpbmVHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfQm91bmRpbmdTcGhlcmUoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4yKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfQ29tcG9uZW50RGF0YXR5cGUoKTsKICAgICAgaW5pdF9DeWxpbmRlckdlb21ldHJ5TGlicmFyeSgpOwogICAgICBpbml0X0Zyb3plbigpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X0dlb21ldHJ5KCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGUoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZXMoKTsKICAgICAgaW5pdF9HZW9tZXRyeU9mZnNldEF0dHJpYnV0ZSgpOwogICAgICBpbml0X0luZGV4RGF0YXR5cGUoKTsKICAgICAgaW5pdF9QcmltaXRpdmVUeXBlKCk7CiAgICAgIHJhZGl1c1NjcmF0Y2gyID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICBDeWxpbmRlck91dGxpbmVHZW9tZXRyeS5wYWNrZWRMZW5ndGggPSA2OwogICAgICBDeWxpbmRlck91dGxpbmVHZW9tZXRyeS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9sZW5ndGg7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl90b3BSYWRpdXM7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9ib3R0b21SYWRpdXM7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9zbGljZXM7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9udW1iZXJPZlZlcnRpY2FsTGluZXM7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleF0gPSB2YWx1ZS5fb2Zmc2V0QXR0cmlidXRlID8/IC0xOwogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfTsKICAgICAgc2NyYXRjaE9wdGlvbnMxMiA9IHsKICAgICAgICBsZW5ndGg6IHZvaWQgMCwKICAgICAgICB0b3BSYWRpdXM6IHZvaWQgMCwKICAgICAgICBib3R0b21SYWRpdXM6IHZvaWQgMCwKICAgICAgICBzbGljZXM6IHZvaWQgMCwKICAgICAgICBudW1iZXJPZlZlcnRpY2FsTGluZXM6IHZvaWQgMCwKICAgICAgICBvZmZzZXRBdHRyaWJ1dGU6IHZvaWQgMAogICAgICB9OwogICAgICBDeWxpbmRlck91dGxpbmVHZW9tZXRyeS51bnBhY2sgPSBmdW5jdGlvbihhcnJheSwgc3RhcnRpbmdJbmRleCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgdG9wUmFkaXVzID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBib3R0b21SYWRpdXMgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IHNsaWNlcyA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgbnVtYmVyT2ZWZXJ0aWNhbExpbmVzID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBvZmZzZXRBdHRyaWJ1dGUgPSBhcnJheVtzdGFydGluZ0luZGV4XTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczEyLmxlbmd0aCA9IGxlbmd0aDsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTIudG9wUmFkaXVzID0gdG9wUmFkaXVzOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxMi5ib3R0b21SYWRpdXMgPSBib3R0b21SYWRpdXM7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczEyLnNsaWNlcyA9IHNsaWNlczsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTIubnVtYmVyT2ZWZXJ0aWNhbExpbmVzID0gbnVtYmVyT2ZWZXJ0aWNhbExpbmVzOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxMi5vZmZzZXRBdHRyaWJ1dGUgPSBvZmZzZXRBdHRyaWJ1dGUgPT09IC0xID8gdm9pZCAwIDogb2Zmc2V0QXR0cmlidXRlOwogICAgICAgICAgcmV0dXJuIG5ldyBDeWxpbmRlck91dGxpbmVHZW9tZXRyeShzY3JhdGNoT3B0aW9uczEyKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0Ll9sZW5ndGggPSBsZW5ndGg7CiAgICAgICAgcmVzdWx0Ll90b3BSYWRpdXMgPSB0b3BSYWRpdXM7CiAgICAgICAgcmVzdWx0Ll9ib3R0b21SYWRpdXMgPSBib3R0b21SYWRpdXM7CiAgICAgICAgcmVzdWx0Ll9zbGljZXMgPSBzbGljZXM7CiAgICAgICAgcmVzdWx0Ll9udW1iZXJPZlZlcnRpY2FsTGluZXMgPSBudW1iZXJPZlZlcnRpY2FsTGluZXM7CiAgICAgICAgcmVzdWx0Ll9vZmZzZXRBdHRyaWJ1dGUgPSBvZmZzZXRBdHRyaWJ1dGUgPT09IC0xID8gdm9pZCAwIDogb2Zmc2V0QXR0cmlidXRlOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEN5bGluZGVyT3V0bGluZUdlb21ldHJ5LmNyZWF0ZUdlb21ldHJ5ID0gZnVuY3Rpb24oY3lsaW5kZXJHZW9tZXRyeSkgewogICAgICAgIGxldCBsZW5ndGggPSBjeWxpbmRlckdlb21ldHJ5Ll9sZW5ndGg7CiAgICAgICAgY29uc3QgdG9wUmFkaXVzID0gY3lsaW5kZXJHZW9tZXRyeS5fdG9wUmFkaXVzOwogICAgICAgIGNvbnN0IGJvdHRvbVJhZGl1cyA9IGN5bGluZGVyR2VvbWV0cnkuX2JvdHRvbVJhZGl1czsKICAgICAgICBjb25zdCBzbGljZXMgPSBjeWxpbmRlckdlb21ldHJ5Ll9zbGljZXM7CiAgICAgICAgY29uc3QgbnVtYmVyT2ZWZXJ0aWNhbExpbmVzID0gY3lsaW5kZXJHZW9tZXRyeS5fbnVtYmVyT2ZWZXJ0aWNhbExpbmVzOwogICAgICAgIGlmIChsZW5ndGggPD0gMCB8fCB0b3BSYWRpdXMgPCAwIHx8IGJvdHRvbVJhZGl1cyA8IDAgfHwgdG9wUmFkaXVzID09PSAwICYmIGJvdHRvbVJhZGl1cyA9PT0gMCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBudW1WZXJ0aWNlcyA9IHNsaWNlcyAqIDI7CiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gQ3lsaW5kZXJHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5jb21wdXRlUG9zaXRpb25zKAogICAgICAgICAgbGVuZ3RoLAogICAgICAgICAgdG9wUmFkaXVzLAogICAgICAgICAgYm90dG9tUmFkaXVzLAogICAgICAgICAgc2xpY2VzLAogICAgICAgICAgZmFsc2UKICAgICAgICApOwogICAgICAgIGxldCBudW1JbmRpY2VzID0gc2xpY2VzICogMjsKICAgICAgICBsZXQgbnVtU2lkZTsKICAgICAgICBpZiAobnVtYmVyT2ZWZXJ0aWNhbExpbmVzID4gMCkgewogICAgICAgICAgY29uc3QgbnVtU2lkZUxpbmVzID0gTWF0aC5taW4obnVtYmVyT2ZWZXJ0aWNhbExpbmVzLCBzbGljZXMpOwogICAgICAgICAgbnVtU2lkZSA9IE1hdGgucm91bmQoc2xpY2VzIC8gbnVtU2lkZUxpbmVzKTsKICAgICAgICAgIG51bUluZGljZXMgKz0gbnVtU2lkZUxpbmVzOwogICAgICAgIH0KICAgICAgICBjb25zdCBpbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkobnVtVmVydGljZXMsIG51bUluZGljZXMgKiAyKTsKICAgICAgICBsZXQgaW5kZXggPSAwOwogICAgICAgIGxldCBpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbGljZXMgLSAxOyBpKyspIHsKICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBpOwogICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGkgKyAxOwogICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGkgKyBzbGljZXM7CiAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gaSArIDEgKyBzbGljZXM7CiAgICAgICAgfQogICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBzbGljZXMgLSAxOwogICAgICAgIGluZGljZXNbaW5kZXgrK10gPSAwOwogICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBzbGljZXMgKyBzbGljZXMgLSAxOwogICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBzbGljZXM7CiAgICAgICAgaWYgKG51bWJlck9mVmVydGljYWxMaW5lcyA+IDApIHsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbGljZXM7IGkgKz0gbnVtU2lkZSkgewogICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gaTsKICAgICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGkgKyBzbGljZXM7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVzX2RlZmF1bHQoKTsKICAgICAgICBhdHRyaWJ1dGVzLnBvc2l0aW9uID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRE9VQkxFLAogICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgIHZhbHVlczogcG9zaXRpb25zCiAgICAgICAgfSk7CiAgICAgICAgcmFkaXVzU2NyYXRjaDIueCA9IGxlbmd0aCAqIDAuNTsKICAgICAgICByYWRpdXNTY3JhdGNoMi55ID0gTWF0aC5tYXgoYm90dG9tUmFkaXVzLCB0b3BSYWRpdXMpOwogICAgICAgIGNvbnN0IGJvdW5kaW5nU3BoZXJlID0gbmV3IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQoCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTywKICAgICAgICAgIENhcnRlc2lhbjJfZGVmYXVsdC5tYWduaXR1ZGUocmFkaXVzU2NyYXRjaDIpCiAgICAgICAgKTsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGN5bGluZGVyR2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZSkpIHsKICAgICAgICAgIGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgICBjb25zdCBvZmZzZXRWYWx1ZSA9IGN5bGluZGVyR2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZSA9PT0gR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGVfZGVmYXVsdC5OT05FID8gMCA6IDE7CiAgICAgICAgICBjb25zdCBhcHBseU9mZnNldCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCAvIDMpLmZpbGwob2Zmc2V0VmFsdWUpOwogICAgICAgICAgYXR0cmlidXRlcy5hcHBseU9mZnNldCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuVU5TSUdORURfQllURSwKICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMSwKICAgICAgICAgICAgdmFsdWVzOiBhcHBseU9mZnNldAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgR2VvbWV0cnlfZGVmYXVsdCh7CiAgICAgICAgICBhdHRyaWJ1dGVzLAogICAgICAgICAgaW5kaWNlcywKICAgICAgICAgIHByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5MSU5FUywKICAgICAgICAgIGJvdW5kaW5nU3BoZXJlLAogICAgICAgICAgb2Zmc2V0QXR0cmlidXRlOiBjeWxpbmRlckdlb21ldHJ5Ll9vZmZzZXRBdHRyaWJ1dGUKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgQ3lsaW5kZXJPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdCA9IEN5bGluZGVyT3V0bGluZUdlb21ldHJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlQ3lsaW5kZXJPdXRsaW5lR2VvbWV0cnkuanMKICB2YXIgY3JlYXRlQ3lsaW5kZXJPdXRsaW5lR2VvbWV0cnlfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGNyZWF0ZUN5bGluZGVyT3V0bGluZUdlb21ldHJ5X2V4cG9ydHMsIHsKICAgIGRlZmF1bHQ6ICgpID0+IGNyZWF0ZUN5bGluZGVyT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQKICB9KTsKICBmdW5jdGlvbiBjcmVhdGVDeWxpbmRlck91dGxpbmVHZW9tZXRyeShjeWxpbmRlckdlb21ldHJ5LCBvZmZzZXQpIHsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQob2Zmc2V0KSkgewogICAgICBjeWxpbmRlckdlb21ldHJ5ID0gQ3lsaW5kZXJPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdC51bnBhY2soY3lsaW5kZXJHZW9tZXRyeSwgb2Zmc2V0KTsKICAgIH0KICAgIHJldHVybiBDeWxpbmRlck91dGxpbmVHZW9tZXRyeV9kZWZhdWx0LmNyZWF0ZUdlb21ldHJ5KGN5bGluZGVyR2VvbWV0cnkpOwogIH0KICB2YXIgY3JlYXRlQ3lsaW5kZXJPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9jcmVhdGVDeWxpbmRlck91dGxpbmVHZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlQ3lsaW5kZXJPdXRsaW5lR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X0N5bGluZGVyT3V0bGluZUdlb21ldHJ5KCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBjcmVhdGVDeWxpbmRlck91dGxpbmVHZW9tZXRyeV9kZWZhdWx0ID0gY3JlYXRlQ3lsaW5kZXJPdXRsaW5lR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVFbGxpcHNlR2VvbWV0cnkuanMKICB2YXIgY3JlYXRlRWxsaXBzZUdlb21ldHJ5X2V4cG9ydHMgPSB7fTsKICBfX2V4cG9ydChjcmVhdGVFbGxpcHNlR2VvbWV0cnlfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gY3JlYXRlRWxsaXBzZUdlb21ldHJ5X2RlZmF1bHQKICB9KTsKICBmdW5jdGlvbiBjcmVhdGVFbGxpcHNlR2VvbWV0cnkoZWxsaXBzZUdlb21ldHJ5LCBvZmZzZXQpIHsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQob2Zmc2V0KSkgewogICAgICBlbGxpcHNlR2VvbWV0cnkgPSBFbGxpcHNlR2VvbWV0cnlfZGVmYXVsdC51bnBhY2soZWxsaXBzZUdlb21ldHJ5LCBvZmZzZXQpOwogICAgfQogICAgZWxsaXBzZUdlb21ldHJ5Ll9jZW50ZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoZWxsaXBzZUdlb21ldHJ5Ll9jZW50ZXIpOwogICAgZWxsaXBzZUdlb21ldHJ5Ll9lbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC5jbG9uZShlbGxpcHNlR2VvbWV0cnkuX2VsbGlwc29pZCk7CiAgICByZXR1cm4gRWxsaXBzZUdlb21ldHJ5X2RlZmF1bHQuY3JlYXRlR2VvbWV0cnkoZWxsaXBzZUdlb21ldHJ5KTsKICB9CiAgdmFyIGNyZWF0ZUVsbGlwc2VHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X2NyZWF0ZUVsbGlwc2VHZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlRWxsaXBzZUdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0VsbGlwc2VHZW9tZXRyeSgpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBjcmVhdGVFbGxpcHNlR2VvbWV0cnlfZGVmYXVsdCA9IGNyZWF0ZUVsbGlwc2VHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZUVsbGlwc2VPdXRsaW5lR2VvbWV0cnkuanMKICB2YXIgY3JlYXRlRWxsaXBzZU91dGxpbmVHZW9tZXRyeV9leHBvcnRzID0ge307CiAgX19leHBvcnQoY3JlYXRlRWxsaXBzZU91dGxpbmVHZW9tZXRyeV9leHBvcnRzLCB7CiAgICBkZWZhdWx0OiAoKSA9PiBjcmVhdGVFbGxpcHNlT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQKICB9KTsKICBmdW5jdGlvbiBjcmVhdGVFbGxpcHNlT3V0bGluZUdlb21ldHJ5KGVsbGlwc2VHZW9tZXRyeSwgb2Zmc2V0KSB7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG9mZnNldCkpIHsKICAgICAgZWxsaXBzZUdlb21ldHJ5ID0gRWxsaXBzZU91dGxpbmVHZW9tZXRyeV9kZWZhdWx0LnVucGFjayhlbGxpcHNlR2VvbWV0cnksIG9mZnNldCk7CiAgICB9CiAgICBlbGxpcHNlR2VvbWV0cnkuX2NlbnRlciA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShlbGxpcHNlR2VvbWV0cnkuX2NlbnRlcik7CiAgICBlbGxpcHNlR2VvbWV0cnkuX2VsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKGVsbGlwc2VHZW9tZXRyeS5fZWxsaXBzb2lkKTsKICAgIHJldHVybiBFbGxpcHNlT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQuY3JlYXRlR2VvbWV0cnkoZWxsaXBzZUdlb21ldHJ5KTsKICB9CiAgdmFyIGNyZWF0ZUVsbGlwc2VPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9jcmVhdGVFbGxpcHNlT3V0bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVFbGxpcHNlT3V0bGluZUdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0VsbGlwc2VPdXRsaW5lR2VvbWV0cnkoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgY3JlYXRlRWxsaXBzZU91dGxpbmVHZW9tZXRyeV9kZWZhdWx0ID0gY3JlYXRlRWxsaXBzZU91dGxpbmVHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0VsbGlwc29pZEdlb21ldHJ5LmpzCiAgZnVuY3Rpb24gRWxsaXBzb2lkR2VvbWV0cnkob3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgPz8gRnJvemVuX2RlZmF1bHQuRU1QVFlfT0JKRUNUOwogICAgY29uc3QgcmFkaWkgPSBvcHRpb25zLnJhZGlpID8/IGRlZmF1bHRSYWRpaTsKICAgIGNvbnN0IGlubmVyUmFkaWkgPSBvcHRpb25zLmlubmVyUmFkaWkgPz8gcmFkaWk7CiAgICBjb25zdCBtaW5pbXVtQ2xvY2sgPSBvcHRpb25zLm1pbmltdW1DbG9jayA/PyAwOwogICAgY29uc3QgbWF4aW11bUNsb2NrID0gb3B0aW9ucy5tYXhpbXVtQ2xvY2sgPz8gTWF0aF9kZWZhdWx0LlRXT19QSTsKICAgIGNvbnN0IG1pbmltdW1Db25lID0gb3B0aW9ucy5taW5pbXVtQ29uZSA/PyAwOwogICAgY29uc3QgbWF4aW11bUNvbmUgPSBvcHRpb25zLm1heGltdW1Db25lID8/IE1hdGhfZGVmYXVsdC5QSTsKICAgIGNvbnN0IHN0YWNrUGFydGl0aW9ucyA9IE1hdGgucm91bmQob3B0aW9ucy5zdGFja1BhcnRpdGlvbnMgPz8gNjQpOwogICAgY29uc3Qgc2xpY2VQYXJ0aXRpb25zID0gTWF0aC5yb3VuZChvcHRpb25zLnNsaWNlUGFydGl0aW9ucyA/PyA2NCk7CiAgICBjb25zdCB2ZXJ0ZXhGb3JtYXQgPSBvcHRpb25zLnZlcnRleEZvcm1hdCA/PyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5ERUZBVUxUOwogICAgaWYgKHNsaWNlUGFydGl0aW9ucyA8IDMpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgIm9wdGlvbnMuc2xpY2VQYXJ0aXRpb25zIGNhbm5vdCBiZSBsZXNzIHRoYW4gdGhyZWUuIgogICAgICApOwogICAgfQogICAgaWYgKHN0YWNrUGFydGl0aW9ucyA8IDMpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgIm9wdGlvbnMuc3RhY2tQYXJ0aXRpb25zIGNhbm5vdCBiZSBsZXNzIHRoYW4gdGhyZWUuIgogICAgICApOwogICAgfQogICAgdGhpcy5fcmFkaWkgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUocmFkaWkpOwogICAgdGhpcy5faW5uZXJSYWRpaSA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShpbm5lclJhZGlpKTsKICAgIHRoaXMuX21pbmltdW1DbG9jayA9IG1pbmltdW1DbG9jazsKICAgIHRoaXMuX21heGltdW1DbG9jayA9IG1heGltdW1DbG9jazsKICAgIHRoaXMuX21pbmltdW1Db25lID0gbWluaW11bUNvbmU7CiAgICB0aGlzLl9tYXhpbXVtQ29uZSA9IG1heGltdW1Db25lOwogICAgdGhpcy5fc3RhY2tQYXJ0aXRpb25zID0gc3RhY2tQYXJ0aXRpb25zOwogICAgdGhpcy5fc2xpY2VQYXJ0aXRpb25zID0gc2xpY2VQYXJ0aXRpb25zOwogICAgdGhpcy5fdmVydGV4Rm9ybWF0ID0gVmVydGV4Rm9ybWF0X2RlZmF1bHQuY2xvbmUodmVydGV4Rm9ybWF0KTsKICAgIHRoaXMuX29mZnNldEF0dHJpYnV0ZSA9IG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlOwogICAgdGhpcy5fd29ya2VyTmFtZSA9ICJjcmVhdGVFbGxpcHNvaWRHZW9tZXRyeSI7CiAgfQogIHZhciBzY3JhdGNoUG9zaXRpb24yLCBzY3JhdGNoTm9ybWFsNSwgc2NyYXRjaFRhbmdlbnQzLCBzY3JhdGNoQml0YW5nZW50Mywgc2NyYXRjaE5vcm1hbFNULCBkZWZhdWx0UmFkaWksIGNvcywgc2luLCBzY3JhdGNoUmFkaWksIHNjcmF0Y2hJbm5lclJhZGlpLCBzY3JhdGNoVmVydGV4Rm9ybWF0Niwgc2NyYXRjaE9wdGlvbnMxMywgdW5pdEVsbGlwc29pZEdlb21ldHJ5LCBFbGxpcHNvaWRHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X0VsbGlwc29pZEdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9FbGxpcHNvaWRHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfQm91bmRpbmdTcGhlcmUoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4yKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NvbXBvbmVudERhdGF0eXBlKCk7CiAgICAgIGluaXRfRnJvemVuKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfR2VvbWV0cnkoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlcygpOwogICAgICBpbml0X0dlb21ldHJ5T2Zmc2V0QXR0cmlidXRlKCk7CiAgICAgIGluaXRfSW5kZXhEYXRhdHlwZSgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9QcmltaXRpdmVUeXBlKCk7CiAgICAgIGluaXRfVmVydGV4Rm9ybWF0KCk7CiAgICAgIHNjcmF0Y2hQb3NpdGlvbjIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hOb3JtYWw1ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoVGFuZ2VudDMgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hCaXRhbmdlbnQzID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoTm9ybWFsU1QgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGRlZmF1bHRSYWRpaSA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoMSwgMSwgMSk7CiAgICAgIGNvcyA9IE1hdGguY29zOwogICAgICBzaW4gPSBNYXRoLnNpbjsKICAgICAgRWxsaXBzb2lkR2VvbWV0cnkucGFja2VkTGVuZ3RoID0gMiAqIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyA3OwogICAgICBFbGxpcHNvaWRHZW9tZXRyeS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodmFsdWUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgidmFsdWUgaXMgcmVxdWlyZWQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYXJyYXkpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXJyYXkgaXMgcmVxdWlyZWQiKTsKICAgICAgICB9CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayh2YWx1ZS5fcmFkaWksIGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2sodmFsdWUuX2lubmVyUmFkaWksIGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgVmVydGV4Rm9ybWF0X2RlZmF1bHQucGFjayh2YWx1ZS5fdmVydGV4Rm9ybWF0LCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9taW5pbXVtQ2xvY2s7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9tYXhpbXVtQ2xvY2s7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9taW5pbXVtQ29uZTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX21heGltdW1Db25lOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5fc3RhY2tQYXJ0aXRpb25zOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5fc2xpY2VQYXJ0aXRpb25zOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXhdID0gdmFsdWUuX29mZnNldEF0dHJpYnV0ZSA/PyAtMTsKICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hSYWRpaSA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaElubmVyUmFkaWkgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hWZXJ0ZXhGb3JtYXQ2ID0gbmV3IFZlcnRleEZvcm1hdF9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hPcHRpb25zMTMgPSB7CiAgICAgICAgcmFkaWk6IHNjcmF0Y2hSYWRpaSwKICAgICAgICBpbm5lclJhZGlpOiBzY3JhdGNoSW5uZXJSYWRpaSwKICAgICAgICB2ZXJ0ZXhGb3JtYXQ6IHNjcmF0Y2hWZXJ0ZXhGb3JtYXQ2LAogICAgICAgIG1pbmltdW1DbG9jazogdm9pZCAwLAogICAgICAgIG1heGltdW1DbG9jazogdm9pZCAwLAogICAgICAgIG1pbmltdW1Db25lOiB2b2lkIDAsCiAgICAgICAgbWF4aW11bUNvbmU6IHZvaWQgMCwKICAgICAgICBzdGFja1BhcnRpdGlvbnM6IHZvaWQgMCwKICAgICAgICBzbGljZVBhcnRpdGlvbnM6IHZvaWQgMCwKICAgICAgICBvZmZzZXRBdHRyaWJ1dGU6IHZvaWQgMAogICAgICB9OwogICAgICBFbGxpcHNvaWRHZW9tZXRyeS51bnBhY2sgPSBmdW5jdGlvbihhcnJheSwgc3RhcnRpbmdJbmRleCwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYXJyYXkpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXJyYXkgaXMgcmVxdWlyZWQiKTsKICAgICAgICB9CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBjb25zdCByYWRpaSA9IENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2soYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHNjcmF0Y2hSYWRpaSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGNvbnN0IGlubmVyUmFkaWkgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKGFycmF5LCBzdGFydGluZ0luZGV4LCBzY3JhdGNoSW5uZXJSYWRpaSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGNvbnN0IHZlcnRleEZvcm1hdCA9IFZlcnRleEZvcm1hdF9kZWZhdWx0LnVucGFjaygKICAgICAgICAgIGFycmF5LAogICAgICAgICAgc3RhcnRpbmdJbmRleCwKICAgICAgICAgIHNjcmF0Y2hWZXJ0ZXhGb3JtYXQ2CiAgICAgICAgKTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IFZlcnRleEZvcm1hdF9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBjb25zdCBtaW5pbXVtQ2xvY2sgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IG1heGltdW1DbG9jayA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgbWluaW11bUNvbmUgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IG1heGltdW1Db25lID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBzdGFja1BhcnRpdGlvbnMgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IHNsaWNlUGFydGl0aW9ucyA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3Qgb2Zmc2V0QXR0cmlidXRlID0gYXJyYXlbc3RhcnRpbmdJbmRleF07CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxMy5taW5pbXVtQ2xvY2sgPSBtaW5pbXVtQ2xvY2s7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczEzLm1heGltdW1DbG9jayA9IG1heGltdW1DbG9jazsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTMubWluaW11bUNvbmUgPSBtaW5pbXVtQ29uZTsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTMubWF4aW11bUNvbmUgPSBtYXhpbXVtQ29uZTsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTMuc3RhY2tQYXJ0aXRpb25zID0gc3RhY2tQYXJ0aXRpb25zOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxMy5zbGljZVBhcnRpdGlvbnMgPSBzbGljZVBhcnRpdGlvbnM7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczEzLm9mZnNldEF0dHJpYnV0ZSA9IG9mZnNldEF0dHJpYnV0ZSA9PT0gLTEgPyB2b2lkIDAgOiBvZmZzZXRBdHRyaWJ1dGU7CiAgICAgICAgICByZXR1cm4gbmV3IEVsbGlwc29pZEdlb21ldHJ5KHNjcmF0Y2hPcHRpb25zMTMpOwogICAgICAgIH0KICAgICAgICByZXN1bHQuX3JhZGlpID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKHJhZGlpLCByZXN1bHQuX3JhZGlpKTsKICAgICAgICByZXN1bHQuX2lubmVyUmFkaWkgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoaW5uZXJSYWRpaSwgcmVzdWx0Ll9pbm5lclJhZGlpKTsKICAgICAgICByZXN1bHQuX3ZlcnRleEZvcm1hdCA9IFZlcnRleEZvcm1hdF9kZWZhdWx0LmNsb25lKHZlcnRleEZvcm1hdCwgcmVzdWx0Ll92ZXJ0ZXhGb3JtYXQpOwogICAgICAgIHJlc3VsdC5fbWluaW11bUNsb2NrID0gbWluaW11bUNsb2NrOwogICAgICAgIHJlc3VsdC5fbWF4aW11bUNsb2NrID0gbWF4aW11bUNsb2NrOwogICAgICAgIHJlc3VsdC5fbWluaW11bUNvbmUgPSBtaW5pbXVtQ29uZTsKICAgICAgICByZXN1bHQuX21heGltdW1Db25lID0gbWF4aW11bUNvbmU7CiAgICAgICAgcmVzdWx0Ll9zdGFja1BhcnRpdGlvbnMgPSBzdGFja1BhcnRpdGlvbnM7CiAgICAgICAgcmVzdWx0Ll9zbGljZVBhcnRpdGlvbnMgPSBzbGljZVBhcnRpdGlvbnM7CiAgICAgICAgcmVzdWx0Ll9vZmZzZXRBdHRyaWJ1dGUgPSBvZmZzZXRBdHRyaWJ1dGUgPT09IC0xID8gdm9pZCAwIDogb2Zmc2V0QXR0cmlidXRlOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEVsbGlwc29pZEdlb21ldHJ5LmNyZWF0ZUdlb21ldHJ5ID0gZnVuY3Rpb24oZWxsaXBzb2lkR2VvbWV0cnkpIHsKICAgICAgICBjb25zdCByYWRpaSA9IGVsbGlwc29pZEdlb21ldHJ5Ll9yYWRpaTsKICAgICAgICBpZiAocmFkaWkueCA8PSAwIHx8IHJhZGlpLnkgPD0gMCB8fCByYWRpaS56IDw9IDApIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgaW5uZXJSYWRpaSA9IGVsbGlwc29pZEdlb21ldHJ5Ll9pbm5lclJhZGlpOwogICAgICAgIGlmIChpbm5lclJhZGlpLnggPD0gMCB8fCBpbm5lclJhZGlpLnkgPD0gMCB8fCBpbm5lclJhZGlpLnogPD0gMCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBtaW5pbXVtQ2xvY2sgPSBlbGxpcHNvaWRHZW9tZXRyeS5fbWluaW11bUNsb2NrOwogICAgICAgIGNvbnN0IG1heGltdW1DbG9jayA9IGVsbGlwc29pZEdlb21ldHJ5Ll9tYXhpbXVtQ2xvY2s7CiAgICAgICAgY29uc3QgbWluaW11bUNvbmUgPSBlbGxpcHNvaWRHZW9tZXRyeS5fbWluaW11bUNvbmU7CiAgICAgICAgY29uc3QgbWF4aW11bUNvbmUgPSBlbGxpcHNvaWRHZW9tZXRyeS5fbWF4aW11bUNvbmU7CiAgICAgICAgY29uc3QgdmVydGV4Rm9ybWF0ID0gZWxsaXBzb2lkR2VvbWV0cnkuX3ZlcnRleEZvcm1hdDsKICAgICAgICBsZXQgc2xpY2VQYXJ0aXRpb25zID0gZWxsaXBzb2lkR2VvbWV0cnkuX3NsaWNlUGFydGl0aW9ucyArIDE7CiAgICAgICAgbGV0IHN0YWNrUGFydGl0aW9ucyA9IGVsbGlwc29pZEdlb21ldHJ5Ll9zdGFja1BhcnRpdGlvbnMgKyAxOwogICAgICAgIHNsaWNlUGFydGl0aW9ucyA9IE1hdGgucm91bmQoCiAgICAgICAgICBzbGljZVBhcnRpdGlvbnMgKiBNYXRoLmFicyhtYXhpbXVtQ2xvY2sgLSBtaW5pbXVtQ2xvY2spIC8gTWF0aF9kZWZhdWx0LlRXT19QSQogICAgICAgICk7CiAgICAgICAgc3RhY2tQYXJ0aXRpb25zID0gTWF0aC5yb3VuZCgKICAgICAgICAgIHN0YWNrUGFydGl0aW9ucyAqIE1hdGguYWJzKG1heGltdW1Db25lIC0gbWluaW11bUNvbmUpIC8gTWF0aF9kZWZhdWx0LlBJCiAgICAgICAgKTsKICAgICAgICBpZiAoc2xpY2VQYXJ0aXRpb25zIDwgMikgewogICAgICAgICAgc2xpY2VQYXJ0aXRpb25zID0gMjsKICAgICAgICB9CiAgICAgICAgaWYgKHN0YWNrUGFydGl0aW9ucyA8IDIpIHsKICAgICAgICAgIHN0YWNrUGFydGl0aW9ucyA9IDI7CiAgICAgICAgfQogICAgICAgIGxldCBpOwogICAgICAgIGxldCBqOwogICAgICAgIGxldCBpbmRleCA9IDA7CiAgICAgICAgY29uc3QgcGhpcyA9IFttaW5pbXVtQ29uZV07CiAgICAgICAgY29uc3QgdGhldGFzID0gW21pbmltdW1DbG9ja107CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0YWNrUGFydGl0aW9uczsgaSsrKSB7CiAgICAgICAgICBwaGlzLnB1c2goCiAgICAgICAgICAgIG1pbmltdW1Db25lICsgaSAqIChtYXhpbXVtQ29uZSAtIG1pbmltdW1Db25lKSAvIChzdGFja1BhcnRpdGlvbnMgLSAxKQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcGhpcy5wdXNoKG1heGltdW1Db25lKTsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2xpY2VQYXJ0aXRpb25zOyBqKyspIHsKICAgICAgICAgIHRoZXRhcy5wdXNoKAogICAgICAgICAgICBtaW5pbXVtQ2xvY2sgKyBqICogKG1heGltdW1DbG9jayAtIG1pbmltdW1DbG9jaykgLyAoc2xpY2VQYXJ0aXRpb25zIC0gMSkKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHRoZXRhcy5wdXNoKG1heGltdW1DbG9jayk7CiAgICAgICAgY29uc3QgbnVtUGhpcyA9IHBoaXMubGVuZ3RoOwogICAgICAgIGNvbnN0IG51bVRoZXRhcyA9IHRoZXRhcy5sZW5ndGg7CiAgICAgICAgbGV0IGV4dHJhSW5kaWNlcyA9IDA7CiAgICAgICAgbGV0IHZlcnRleE11bHRpcGxpZXIgPSAxOwogICAgICAgIGNvbnN0IGhhc0lubmVyU3VyZmFjZSA9IGlubmVyUmFkaWkueCAhPT0gcmFkaWkueCB8fCBpbm5lclJhZGlpLnkgIT09IHJhZGlpLnkgfHwgaW5uZXJSYWRpaS56ICE9PSByYWRpaS56OwogICAgICAgIGxldCBpc1RvcE9wZW4gPSBmYWxzZTsKICAgICAgICBsZXQgaXNCb3RPcGVuID0gZmFsc2U7CiAgICAgICAgbGV0IGlzQ2xvY2tPcGVuID0gZmFsc2U7CiAgICAgICAgaWYgKGhhc0lubmVyU3VyZmFjZSkgewogICAgICAgICAgdmVydGV4TXVsdGlwbGllciA9IDI7CiAgICAgICAgICBpZiAobWluaW11bUNvbmUgPiAwKSB7CiAgICAgICAgICAgIGlzVG9wT3BlbiA9IHRydWU7CiAgICAgICAgICAgIGV4dHJhSW5kaWNlcyArPSBzbGljZVBhcnRpdGlvbnMgLSAxOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG1heGltdW1Db25lIDwgTWF0aC5QSSkgewogICAgICAgICAgICBpc0JvdE9wZW4gPSB0cnVlOwogICAgICAgICAgICBleHRyYUluZGljZXMgKz0gc2xpY2VQYXJ0aXRpb25zIC0gMTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICgobWF4aW11bUNsb2NrIC0gbWluaW11bUNsb2NrKSAlIE1hdGhfZGVmYXVsdC5UV09fUEkpIHsKICAgICAgICAgICAgaXNDbG9ja09wZW4gPSB0cnVlOwogICAgICAgICAgICBleHRyYUluZGljZXMgKz0gKHN0YWNrUGFydGl0aW9ucyAtIDEpICogMiArIDE7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBleHRyYUluZGljZXMgKz0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgdmVydGV4Q291bnQgPSBudW1UaGV0YXMgKiBudW1QaGlzICogdmVydGV4TXVsdGlwbGllcjsKICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQ2NEFycmF5KHZlcnRleENvdW50ICogMyk7CiAgICAgICAgY29uc3QgaXNJbm5lciA9IG5ldyBBcnJheSh2ZXJ0ZXhDb3VudCkuZmlsbChmYWxzZSk7CiAgICAgICAgY29uc3QgbmVnYXRlTm9ybWFsID0gbmV3IEFycmF5KHZlcnRleENvdW50KS5maWxsKGZhbHNlKTsKICAgICAgICBjb25zdCBpbmRleENvdW50ID0gc2xpY2VQYXJ0aXRpb25zICogc3RhY2tQYXJ0aXRpb25zICogdmVydGV4TXVsdGlwbGllcjsKICAgICAgICBjb25zdCBudW1JbmRpY2VzID0gNiAqIChpbmRleENvdW50ICsgZXh0cmFJbmRpY2VzICsgMSAtIChzbGljZVBhcnRpdGlvbnMgKyBzdGFja1BhcnRpdGlvbnMpICogdmVydGV4TXVsdGlwbGllcik7CiAgICAgICAgY29uc3QgaW5kaWNlcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KGluZGV4Q291bnQsIG51bUluZGljZXMpOwogICAgICAgIGNvbnN0IG5vcm1hbHMgPSB2ZXJ0ZXhGb3JtYXQubm9ybWFsID8gbmV3IEZsb2F0MzJBcnJheSh2ZXJ0ZXhDb3VudCAqIDMpIDogdm9pZCAwOwogICAgICAgIGNvbnN0IHRhbmdlbnRzID0gdmVydGV4Rm9ybWF0LnRhbmdlbnQgPyBuZXcgRmxvYXQzMkFycmF5KHZlcnRleENvdW50ICogMykgOiB2b2lkIDA7CiAgICAgICAgY29uc3QgYml0YW5nZW50cyA9IHZlcnRleEZvcm1hdC5iaXRhbmdlbnQgPyBuZXcgRmxvYXQzMkFycmF5KHZlcnRleENvdW50ICogMykgOiB2b2lkIDA7CiAgICAgICAgY29uc3Qgc3QgPSB2ZXJ0ZXhGb3JtYXQuc3QgPyBuZXcgRmxvYXQzMkFycmF5KHZlcnRleENvdW50ICogMikgOiB2b2lkIDA7CiAgICAgICAgY29uc3Qgc2luUGhpID0gbmV3IEFycmF5KG51bVBoaXMpOwogICAgICAgIGNvbnN0IGNvc1BoaSA9IG5ldyBBcnJheShudW1QaGlzKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUGhpczsgaSsrKSB7CiAgICAgICAgICBzaW5QaGlbaV0gPSBzaW4ocGhpc1tpXSk7CiAgICAgICAgICBjb3NQaGlbaV0gPSBjb3MocGhpc1tpXSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHNpblRoZXRhID0gbmV3IEFycmF5KG51bVRoZXRhcyk7CiAgICAgICAgY29uc3QgY29zVGhldGEgPSBuZXcgQXJyYXkobnVtVGhldGFzKTsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtVGhldGFzOyBqKyspIHsKICAgICAgICAgIGNvc1RoZXRhW2pdID0gY29zKHRoZXRhc1tqXSk7CiAgICAgICAgICBzaW5UaGV0YVtqXSA9IHNpbih0aGV0YXNbal0pOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUGhpczsgaSsrKSB7CiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtVGhldGFzOyBqKyspIHsKICAgICAgICAgICAgcG9zaXRpb25zW2luZGV4KytdID0gcmFkaWkueCAqIHNpblBoaVtpXSAqIGNvc1RoZXRhW2pdOwogICAgICAgICAgICBwb3NpdGlvbnNbaW5kZXgrK10gPSByYWRpaS55ICogc2luUGhpW2ldICogc2luVGhldGFbal07CiAgICAgICAgICAgIHBvc2l0aW9uc1tpbmRleCsrXSA9IHJhZGlpLnogKiBjb3NQaGlbaV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCB2ZXJ0ZXhJbmRleCA9IHZlcnRleENvdW50IC8gMjsKICAgICAgICBpZiAoaGFzSW5uZXJTdXJmYWNlKSB7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUGhpczsgaSsrKSB7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1UaGV0YXM7IGorKykgewogICAgICAgICAgICAgIHBvc2l0aW9uc1tpbmRleCsrXSA9IGlubmVyUmFkaWkueCAqIHNpblBoaVtpXSAqIGNvc1RoZXRhW2pdOwogICAgICAgICAgICAgIHBvc2l0aW9uc1tpbmRleCsrXSA9IGlubmVyUmFkaWkueSAqIHNpblBoaVtpXSAqIHNpblRoZXRhW2pdOwogICAgICAgICAgICAgIHBvc2l0aW9uc1tpbmRleCsrXSA9IGlubmVyUmFkaWkueiAqIGNvc1BoaVtpXTsKICAgICAgICAgICAgICBpc0lubmVyW3ZlcnRleEluZGV4XSA9IHRydWU7CiAgICAgICAgICAgICAgaWYgKGkgPiAwICYmIGkgIT09IG51bVBoaXMgLSAxICYmIGogIT09IDAgJiYgaiAhPT0gbnVtVGhldGFzIC0gMSkgewogICAgICAgICAgICAgICAgbmVnYXRlTm9ybWFsW3ZlcnRleEluZGV4XSA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZlcnRleEluZGV4Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaW5kZXggPSAwOwogICAgICAgIGxldCB0b3BPZmZzZXQ7CiAgICAgICAgbGV0IGJvdHRvbU9mZnNldDsKICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbnVtUGhpcyAtIDI7IGkrKykgewogICAgICAgICAgdG9wT2Zmc2V0ID0gaSAqIG51bVRoZXRhczsKICAgICAgICAgIGJvdHRvbU9mZnNldCA9IChpICsgMSkgKiBudW1UaGV0YXM7CiAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgbnVtVGhldGFzIC0gMjsgaisrKSB7CiAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBib3R0b21PZmZzZXQgKyBqOwogICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gYm90dG9tT2Zmc2V0ICsgaiArIDE7CiAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSB0b3BPZmZzZXQgKyBqICsgMTsKICAgICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGJvdHRvbU9mZnNldCArIGo7CiAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSB0b3BPZmZzZXQgKyBqICsgMTsKICAgICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IHRvcE9mZnNldCArIGo7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChoYXNJbm5lclN1cmZhY2UpIHsKICAgICAgICAgIGNvbnN0IG9mZnNldCA9IG51bVBoaXMgKiBudW1UaGV0YXM7CiAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbnVtUGhpcyAtIDI7IGkrKykgewogICAgICAgICAgICB0b3BPZmZzZXQgPSBvZmZzZXQgKyBpICogbnVtVGhldGFzOwogICAgICAgICAgICBib3R0b21PZmZzZXQgPSBvZmZzZXQgKyAoaSArIDEpICogbnVtVGhldGFzOwogICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgbnVtVGhldGFzIC0gMjsgaisrKSB7CiAgICAgICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGJvdHRvbU9mZnNldCArIGo7CiAgICAgICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IHRvcE9mZnNldCArIGo7CiAgICAgICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IHRvcE9mZnNldCArIGogKyAxOwogICAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBib3R0b21PZmZzZXQgKyBqOwogICAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSB0b3BPZmZzZXQgKyBqICsgMTsKICAgICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gYm90dG9tT2Zmc2V0ICsgaiArIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IG91dGVyT2Zmc2V0OwogICAgICAgIGxldCBpbm5lck9mZnNldDsKICAgICAgICBpZiAoaGFzSW5uZXJTdXJmYWNlKSB7CiAgICAgICAgICBpZiAoaXNUb3BPcGVuKSB7CiAgICAgICAgICAgIGlubmVyT2Zmc2V0ID0gbnVtUGhpcyAqIG51bVRoZXRhczsKICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IG51bVRoZXRhcyAtIDI7IGkrKykgewogICAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBpOwogICAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBpICsgMTsKICAgICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gaW5uZXJPZmZzZXQgKyBpICsgMTsKICAgICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gaTsKICAgICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gaW5uZXJPZmZzZXQgKyBpICsgMTsKICAgICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gaW5uZXJPZmZzZXQgKyBpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNCb3RPcGVuKSB7CiAgICAgICAgICAgIG91dGVyT2Zmc2V0ID0gbnVtUGhpcyAqIG51bVRoZXRhcyAtIG51bVRoZXRhczsKICAgICAgICAgICAgaW5uZXJPZmZzZXQgPSBudW1QaGlzICogbnVtVGhldGFzICogdmVydGV4TXVsdGlwbGllciAtIG51bVRoZXRhczsKICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IG51bVRoZXRhcyAtIDI7IGkrKykgewogICAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBvdXRlck9mZnNldCArIGkgKyAxOwogICAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBvdXRlck9mZnNldCArIGk7CiAgICAgICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGlubmVyT2Zmc2V0ICsgaTsKICAgICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gb3V0ZXJPZmZzZXQgKyBpICsgMTsKICAgICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gaW5uZXJPZmZzZXQgKyBpOwogICAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBpbm5lck9mZnNldCArIGkgKyAxOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc0Nsb2NrT3BlbikgewogICAgICAgICAgZm9yIChpID0gMTsgaSA8IG51bVBoaXMgLSAyOyBpKyspIHsKICAgICAgICAgICAgaW5uZXJPZmZzZXQgPSBudW1UaGV0YXMgKiBudW1QaGlzICsgbnVtVGhldGFzICogaTsKICAgICAgICAgICAgb3V0ZXJPZmZzZXQgPSBudW1UaGV0YXMgKiBpOwogICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gaW5uZXJPZmZzZXQ7CiAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBvdXRlck9mZnNldCArIG51bVRoZXRhczsKICAgICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IG91dGVyT2Zmc2V0OwogICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gaW5uZXJPZmZzZXQ7CiAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBpbm5lck9mZnNldCArIG51bVRoZXRhczsKICAgICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IG91dGVyT2Zmc2V0ICsgbnVtVGhldGFzOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChpID0gMTsgaSA8IG51bVBoaXMgLSAyOyBpKyspIHsKICAgICAgICAgICAgaW5uZXJPZmZzZXQgPSBudW1UaGV0YXMgKiBudW1QaGlzICsgbnVtVGhldGFzICogKGkgKyAxKSAtIDE7CiAgICAgICAgICAgIG91dGVyT2Zmc2V0ID0gbnVtVGhldGFzICogKGkgKyAxKSAtIDE7CiAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBvdXRlck9mZnNldCArIG51bVRoZXRhczsKICAgICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGlubmVyT2Zmc2V0OwogICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gb3V0ZXJPZmZzZXQ7CiAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBvdXRlck9mZnNldCArIG51bVRoZXRhczsKICAgICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGlubmVyT2Zmc2V0ICsgbnVtVGhldGFzOwogICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gaW5uZXJPZmZzZXQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVzX2RlZmF1bHQoKTsKICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnBvc2l0aW9uKSB7CiAgICAgICAgICBhdHRyaWJ1dGVzLnBvc2l0aW9uID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5ET1VCTEUsCiAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgICAgIHZhbHVlczogcG9zaXRpb25zCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgbGV0IHN0SW5kZXggPSAwOwogICAgICAgIGxldCBub3JtYWxJbmRleCA9IDA7CiAgICAgICAgbGV0IHRhbmdlbnRJbmRleCA9IDA7CiAgICAgICAgbGV0IGJpdGFuZ2VudEluZGV4ID0gMDsKICAgICAgICBjb25zdCB2ZXJ0ZXhDb3VudEhhbGYgPSB2ZXJ0ZXhDb3VudCAvIDI7CiAgICAgICAgbGV0IGVsbGlwc29pZDsKICAgICAgICBjb25zdCBlbGxpcHNvaWRPdXRlciA9IEVsbGlwc29pZF9kZWZhdWx0LmZyb21DYXJ0ZXNpYW4zKHJhZGlpKTsKICAgICAgICBjb25zdCBlbGxpcHNvaWRJbm5lciA9IEVsbGlwc29pZF9kZWZhdWx0LmZyb21DYXJ0ZXNpYW4zKGlubmVyUmFkaWkpOwogICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuc3QgfHwgdmVydGV4Rm9ybWF0Lm5vcm1hbCB8fCB2ZXJ0ZXhGb3JtYXQudGFuZ2VudCB8fCB2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKykgewogICAgICAgICAgICBlbGxpcHNvaWQgPSBpc0lubmVyW2ldID8gZWxsaXBzb2lkSW5uZXIgOiBlbGxpcHNvaWRPdXRlcjsKICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KHBvc2l0aW9ucywgaSAqIDMsIHNjcmF0Y2hQb3NpdGlvbjIpOwogICAgICAgICAgICBjb25zdCBub3JtYWwyID0gZWxsaXBzb2lkLmdlb2RldGljU3VyZmFjZU5vcm1hbChwb3NpdGlvbiwgc2NyYXRjaE5vcm1hbDUpOwogICAgICAgICAgICBpZiAobmVnYXRlTm9ybWFsW2ldKSB7CiAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZShub3JtYWwyLCBub3JtYWwyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnN0KSB7CiAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsU1QgPSBDYXJ0ZXNpYW4yX2RlZmF1bHQubmVnYXRlKG5vcm1hbDIsIHNjcmF0Y2hOb3JtYWxTVCk7CiAgICAgICAgICAgICAgc3Rbc3RJbmRleCsrXSA9IE1hdGguYXRhbjIobm9ybWFsU1QueSwgbm9ybWFsU1QueCkgLyBNYXRoX2RlZmF1bHQuVFdPX1BJICsgMC41OwogICAgICAgICAgICAgIHN0W3N0SW5kZXgrK10gPSBNYXRoLmFzaW4obm9ybWFsMi56KSAvIE1hdGguUEkgKyAwLjU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5ub3JtYWwpIHsKICAgICAgICAgICAgICBub3JtYWxzW25vcm1hbEluZGV4KytdID0gbm9ybWFsMi54OwogICAgICAgICAgICAgIG5vcm1hbHNbbm9ybWFsSW5kZXgrK10gPSBub3JtYWwyLnk7CiAgICAgICAgICAgICAgbm9ybWFsc1tub3JtYWxJbmRleCsrXSA9IG5vcm1hbDIuejsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnRhbmdlbnQgfHwgdmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgewogICAgICAgICAgICAgIGNvbnN0IHRhbmdlbnQgPSBzY3JhdGNoVGFuZ2VudDM7CiAgICAgICAgICAgICAgbGV0IHRhbmdldE9mZnNldCA9IDA7CiAgICAgICAgICAgICAgbGV0IHVuaXQ7CiAgICAgICAgICAgICAgaWYgKGlzSW5uZXJbaV0pIHsKICAgICAgICAgICAgICAgIHRhbmdldE9mZnNldCA9IHZlcnRleENvdW50SGFsZjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKCFpc1RvcE9wZW4gJiYgaSA+PSB0YW5nZXRPZmZzZXQgJiYgaSA8IHRhbmdldE9mZnNldCArIG51bVRoZXRhcyAqIDIpIHsKICAgICAgICAgICAgICAgIHVuaXQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9YOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1bml0ID0gQ2FydGVzaWFuM19kZWZhdWx0LlVOSVRfWjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKHVuaXQsIG5vcm1hbDIsIHRhbmdlbnQpOwogICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUodGFuZ2VudCwgdGFuZ2VudCk7CiAgICAgICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC50YW5nZW50KSB7CiAgICAgICAgICAgICAgICB0YW5nZW50c1t0YW5nZW50SW5kZXgrK10gPSB0YW5nZW50Lng7CiAgICAgICAgICAgICAgICB0YW5nZW50c1t0YW5nZW50SW5kZXgrK10gPSB0YW5nZW50Lnk7CiAgICAgICAgICAgICAgICB0YW5nZW50c1t0YW5nZW50SW5kZXgrK10gPSB0YW5nZW50Lno7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgICAgICAgICAgICBjb25zdCBiaXRhbmdlbnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3Mobm9ybWFsMiwgdGFuZ2VudCwgc2NyYXRjaEJpdGFuZ2VudDMpOwogICAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShiaXRhbmdlbnQsIGJpdGFuZ2VudCk7CiAgICAgICAgICAgICAgICBiaXRhbmdlbnRzW2JpdGFuZ2VudEluZGV4KytdID0gYml0YW5nZW50Lng7CiAgICAgICAgICAgICAgICBiaXRhbmdlbnRzW2JpdGFuZ2VudEluZGV4KytdID0gYml0YW5nZW50Lnk7CiAgICAgICAgICAgICAgICBiaXRhbmdlbnRzW2JpdGFuZ2VudEluZGV4KytdID0gYml0YW5nZW50Lno7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnN0KSB7CiAgICAgICAgICAgIGF0dHJpYnV0ZXMuc3QgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMiwKICAgICAgICAgICAgICB2YWx1ZXM6IHN0CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5ub3JtYWwpIHsKICAgICAgICAgICAgYXR0cmlidXRlcy5ub3JtYWwgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgICAgICB2YWx1ZXM6IG5vcm1hbHMKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnRhbmdlbnQpIHsKICAgICAgICAgICAgYXR0cmlidXRlcy50YW5nZW50ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgICAgICAgdmFsdWVzOiB0YW5nZW50cwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgICAgICAgIGF0dHJpYnV0ZXMuYml0YW5nZW50ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgICAgICAgdmFsdWVzOiBiaXRhbmdlbnRzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGVsbGlwc29pZEdlb21ldHJ5Ll9vZmZzZXRBdHRyaWJ1dGUpKSB7CiAgICAgICAgICBjb25zdCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgICAgY29uc3Qgb2Zmc2V0VmFsdWUgPSBlbGxpcHNvaWRHZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlID09PSBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZV9kZWZhdWx0Lk5PTkUgPyAwIDogMTsKICAgICAgICAgIGNvbnN0IGFwcGx5T2Zmc2V0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoIC8gMykuZmlsbChvZmZzZXRWYWx1ZSk7CiAgICAgICAgICBhdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5VTlNJR05FRF9CWVRFLAogICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAxLAogICAgICAgICAgICB2YWx1ZXM6IGFwcGx5T2Zmc2V0CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgICAgIGF0dHJpYnV0ZXMsCiAgICAgICAgICBpbmRpY2VzLAogICAgICAgICAgcHJpbWl0aXZlVHlwZTogUHJpbWl0aXZlVHlwZV9kZWZhdWx0LlRSSUFOR0xFUywKICAgICAgICAgIGJvdW5kaW5nU3BoZXJlOiBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LmZyb21FbGxpcHNvaWQoZWxsaXBzb2lkT3V0ZXIpLAogICAgICAgICAgb2Zmc2V0QXR0cmlidXRlOiBlbGxpcHNvaWRHZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIEVsbGlwc29pZEdlb21ldHJ5LmdldFVuaXRFbGxpcHNvaWQgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh1bml0RWxsaXBzb2lkR2VvbWV0cnkpKSB7CiAgICAgICAgICB1bml0RWxsaXBzb2lkR2VvbWV0cnkgPSBFbGxpcHNvaWRHZW9tZXRyeS5jcmVhdGVHZW9tZXRyeSgKICAgICAgICAgICAgbmV3IEVsbGlwc29pZEdlb21ldHJ5KHsKICAgICAgICAgICAgICByYWRpaTogbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgxLCAxLCAxKSwKICAgICAgICAgICAgICB2ZXJ0ZXhGb3JtYXQ6IFZlcnRleEZvcm1hdF9kZWZhdWx0LlBPU0lUSU9OX09OTFkKICAgICAgICAgICAgfSkKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1bml0RWxsaXBzb2lkR2VvbWV0cnk7CiAgICAgIH07CiAgICAgIEVsbGlwc29pZEdlb21ldHJ5X2RlZmF1bHQgPSBFbGxpcHNvaWRHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZUVsbGlwc29pZEdlb21ldHJ5LmpzCiAgdmFyIGNyZWF0ZUVsbGlwc29pZEdlb21ldHJ5X2V4cG9ydHMgPSB7fTsKICBfX2V4cG9ydChjcmVhdGVFbGxpcHNvaWRHZW9tZXRyeV9leHBvcnRzLCB7CiAgICBkZWZhdWx0OiAoKSA9PiBjcmVhdGVFbGxpcHNvaWRHZW9tZXRyeV9kZWZhdWx0CiAgfSk7CiAgZnVuY3Rpb24gY3JlYXRlRWxsaXBzb2lkR2VvbWV0cnkoZWxsaXBzb2lkR2VvbWV0cnksIG9mZnNldCkgewogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvZmZzZXQpKSB7CiAgICAgIGVsbGlwc29pZEdlb21ldHJ5ID0gRWxsaXBzb2lkR2VvbWV0cnlfZGVmYXVsdC51bnBhY2soZWxsaXBzb2lkR2VvbWV0cnksIG9mZnNldCk7CiAgICB9CiAgICByZXR1cm4gRWxsaXBzb2lkR2VvbWV0cnlfZGVmYXVsdC5jcmVhdGVHZW9tZXRyeShlbGxpcHNvaWRHZW9tZXRyeSk7CiAgfQogIHZhciBjcmVhdGVFbGxpcHNvaWRHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X2NyZWF0ZUVsbGlwc29pZEdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVFbGxpcHNvaWRHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0VsbGlwc29pZEdlb21ldHJ5KCk7CiAgICAgIGNyZWF0ZUVsbGlwc29pZEdlb21ldHJ5X2RlZmF1bHQgPSBjcmVhdGVFbGxpcHNvaWRHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0VsbGlwc29pZE91dGxpbmVHZW9tZXRyeS5qcwogIGZ1bmN0aW9uIEVsbGlwc29pZE91dGxpbmVHZW9tZXRyeShvcHRpb25zKSB7CiAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICBjb25zdCByYWRpaSA9IG9wdGlvbnMucmFkaWkgPz8gZGVmYXVsdFJhZGlpMjsKICAgIGNvbnN0IGlubmVyUmFkaWkgPSBvcHRpb25zLmlubmVyUmFkaWkgPz8gcmFkaWk7CiAgICBjb25zdCBtaW5pbXVtQ2xvY2sgPSBvcHRpb25zLm1pbmltdW1DbG9jayA/PyAwOwogICAgY29uc3QgbWF4aW11bUNsb2NrID0gb3B0aW9ucy5tYXhpbXVtQ2xvY2sgPz8gTWF0aF9kZWZhdWx0LlRXT19QSTsKICAgIGNvbnN0IG1pbmltdW1Db25lID0gb3B0aW9ucy5taW5pbXVtQ29uZSA/PyAwOwogICAgY29uc3QgbWF4aW11bUNvbmUgPSBvcHRpb25zLm1heGltdW1Db25lID8/IE1hdGhfZGVmYXVsdC5QSTsKICAgIGNvbnN0IHN0YWNrUGFydGl0aW9ucyA9IE1hdGgucm91bmQob3B0aW9ucy5zdGFja1BhcnRpdGlvbnMgPz8gMTApOwogICAgY29uc3Qgc2xpY2VQYXJ0aXRpb25zID0gTWF0aC5yb3VuZChvcHRpb25zLnNsaWNlUGFydGl0aW9ucyA/PyA4KTsKICAgIGNvbnN0IHN1YmRpdmlzaW9ucyA9IE1hdGgucm91bmQob3B0aW9ucy5zdWJkaXZpc2lvbnMgPz8gMTI4KTsKICAgIGlmIChzdGFja1BhcnRpdGlvbnMgPCAxKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJvcHRpb25zLnN0YWNrUGFydGl0aW9ucyBjYW5ub3QgYmUgbGVzcyB0aGFuIDEiKTsKICAgIH0KICAgIGlmIChzbGljZVBhcnRpdGlvbnMgPCAwKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJvcHRpb25zLnNsaWNlUGFydGl0aW9ucyBjYW5ub3QgYmUgbGVzcyB0aGFuIDAiKTsKICAgIH0KICAgIGlmIChzdWJkaXZpc2lvbnMgPCAwKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICJvcHRpb25zLnN1YmRpdmlzaW9ucyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLiIKICAgICAgKTsKICAgIH0KICAgIGlmIChkZWZpbmVkX2RlZmF1bHQob3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGUpICYmIG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlID09PSBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZV9kZWZhdWx0LlRPUCkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAiR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGUuVE9QIGlzIG5vdCBhIHN1cHBvcnRlZCBvcHRpb25zLm9mZnNldEF0dHJpYnV0ZSBmb3IgdGhpcyBnZW9tZXRyeS4iCiAgICAgICk7CiAgICB9CiAgICB0aGlzLl9yYWRpaSA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShyYWRpaSk7CiAgICB0aGlzLl9pbm5lclJhZGlpID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGlubmVyUmFkaWkpOwogICAgdGhpcy5fbWluaW11bUNsb2NrID0gbWluaW11bUNsb2NrOwogICAgdGhpcy5fbWF4aW11bUNsb2NrID0gbWF4aW11bUNsb2NrOwogICAgdGhpcy5fbWluaW11bUNvbmUgPSBtaW5pbXVtQ29uZTsKICAgIHRoaXMuX21heGltdW1Db25lID0gbWF4aW11bUNvbmU7CiAgICB0aGlzLl9zdGFja1BhcnRpdGlvbnMgPSBzdGFja1BhcnRpdGlvbnM7CiAgICB0aGlzLl9zbGljZVBhcnRpdGlvbnMgPSBzbGljZVBhcnRpdGlvbnM7CiAgICB0aGlzLl9zdWJkaXZpc2lvbnMgPSBzdWJkaXZpc2lvbnM7CiAgICB0aGlzLl9vZmZzZXRBdHRyaWJ1dGUgPSBvcHRpb25zLm9mZnNldEF0dHJpYnV0ZTsKICAgIHRoaXMuX3dvcmtlck5hbWUgPSAiY3JlYXRlRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5IjsKICB9CiAgdmFyIGRlZmF1bHRSYWRpaTIsIGNvczIsIHNpbjIsIHNjcmF0Y2hSYWRpaTIsIHNjcmF0Y2hJbm5lclJhZGlpMiwgc2NyYXRjaE9wdGlvbnMxNCwgRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9FbGxpcHNvaWRPdXRsaW5lR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X0JvdW5kaW5nU3BoZXJlKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NvbXBvbmVudERhdGF0eXBlKCk7CiAgICAgIGluaXRfRnJvemVuKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfR2VvbWV0cnkoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlcygpOwogICAgICBpbml0X0dlb21ldHJ5T2Zmc2V0QXR0cmlidXRlKCk7CiAgICAgIGluaXRfSW5kZXhEYXRhdHlwZSgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9QcmltaXRpdmVUeXBlKCk7CiAgICAgIGRlZmF1bHRSYWRpaTIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KDEsIDEsIDEpOwogICAgICBjb3MyID0gTWF0aC5jb3M7CiAgICAgIHNpbjIgPSBNYXRoLnNpbjsKICAgICAgRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5LnBhY2tlZExlbmd0aCA9IDIgKiBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoICsgODsKICAgICAgRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5LnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh2YWx1ZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJ2YWx1ZSBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhcnJheSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhcnJheSBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKHZhbHVlLl9yYWRpaSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayh2YWx1ZS5faW5uZXJSYWRpaSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX21pbmltdW1DbG9jazsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX21heGltdW1DbG9jazsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX21pbmltdW1Db25lOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5fbWF4aW11bUNvbmU7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9zdGFja1BhcnRpdGlvbnM7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9zbGljZVBhcnRpdGlvbnM7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9zdWJkaXZpc2lvbnM7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleF0gPSB2YWx1ZS5fb2Zmc2V0QXR0cmlidXRlID8/IC0xOwogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfTsKICAgICAgc2NyYXRjaFJhZGlpMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaElubmVyUmFkaWkyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoT3B0aW9uczE0ID0gewogICAgICAgIHJhZGlpOiBzY3JhdGNoUmFkaWkyLAogICAgICAgIGlubmVyUmFkaWk6IHNjcmF0Y2hJbm5lclJhZGlpMiwKICAgICAgICBtaW5pbXVtQ2xvY2s6IHZvaWQgMCwKICAgICAgICBtYXhpbXVtQ2xvY2s6IHZvaWQgMCwKICAgICAgICBtaW5pbXVtQ29uZTogdm9pZCAwLAogICAgICAgIG1heGltdW1Db25lOiB2b2lkIDAsCiAgICAgICAgc3RhY2tQYXJ0aXRpb25zOiB2b2lkIDAsCiAgICAgICAgc2xpY2VQYXJ0aXRpb25zOiB2b2lkIDAsCiAgICAgICAgc3ViZGl2aXNpb25zOiB2b2lkIDAsCiAgICAgICAgb2Zmc2V0QXR0cmlidXRlOiB2b2lkIDAKICAgICAgfTsKICAgICAgRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5LnVucGFjayA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydGluZ0luZGV4LCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhcnJheSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhcnJheSBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGNvbnN0IHJhZGlpID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCwgc2NyYXRjaFJhZGlpMik7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGNvbnN0IGlubmVyUmFkaWkgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKGFycmF5LCBzdGFydGluZ0luZGV4LCBzY3JhdGNoSW5uZXJSYWRpaTIpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBjb25zdCBtaW5pbXVtQ2xvY2sgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IG1heGltdW1DbG9jayA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgbWluaW11bUNvbmUgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IG1heGltdW1Db25lID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBzdGFja1BhcnRpdGlvbnMgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IHNsaWNlUGFydGl0aW9ucyA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3Qgc3ViZGl2aXNpb25zID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBvZmZzZXRBdHRyaWJ1dGUgPSBhcnJheVtzdGFydGluZ0luZGV4XTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczE0Lm1pbmltdW1DbG9jayA9IG1pbmltdW1DbG9jazsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTQubWF4aW11bUNsb2NrID0gbWF4aW11bUNsb2NrOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxNC5taW5pbXVtQ29uZSA9IG1pbmltdW1Db25lOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxNC5tYXhpbXVtQ29uZSA9IG1heGltdW1Db25lOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxNC5zdGFja1BhcnRpdGlvbnMgPSBzdGFja1BhcnRpdGlvbnM7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczE0LnNsaWNlUGFydGl0aW9ucyA9IHNsaWNlUGFydGl0aW9uczsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTQuc3ViZGl2aXNpb25zID0gc3ViZGl2aXNpb25zOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxNC5vZmZzZXRBdHRyaWJ1dGUgPSBvZmZzZXRBdHRyaWJ1dGUgPT09IC0xID8gdm9pZCAwIDogb2Zmc2V0QXR0cmlidXRlOwogICAgICAgICAgcmV0dXJuIG5ldyBFbGxpcHNvaWRPdXRsaW5lR2VvbWV0cnkoc2NyYXRjaE9wdGlvbnMxNCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5fcmFkaWkgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUocmFkaWksIHJlc3VsdC5fcmFkaWkpOwogICAgICAgIHJlc3VsdC5faW5uZXJSYWRpaSA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShpbm5lclJhZGlpLCByZXN1bHQuX2lubmVyUmFkaWkpOwogICAgICAgIHJlc3VsdC5fbWluaW11bUNsb2NrID0gbWluaW11bUNsb2NrOwogICAgICAgIHJlc3VsdC5fbWF4aW11bUNsb2NrID0gbWF4aW11bUNsb2NrOwogICAgICAgIHJlc3VsdC5fbWluaW11bUNvbmUgPSBtaW5pbXVtQ29uZTsKICAgICAgICByZXN1bHQuX21heGltdW1Db25lID0gbWF4aW11bUNvbmU7CiAgICAgICAgcmVzdWx0Ll9zdGFja1BhcnRpdGlvbnMgPSBzdGFja1BhcnRpdGlvbnM7CiAgICAgICAgcmVzdWx0Ll9zbGljZVBhcnRpdGlvbnMgPSBzbGljZVBhcnRpdGlvbnM7CiAgICAgICAgcmVzdWx0Ll9zdWJkaXZpc2lvbnMgPSBzdWJkaXZpc2lvbnM7CiAgICAgICAgcmVzdWx0Ll9vZmZzZXRBdHRyaWJ1dGUgPSBvZmZzZXRBdHRyaWJ1dGUgPT09IC0xID8gdm9pZCAwIDogb2Zmc2V0QXR0cmlidXRlOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEVsbGlwc29pZE91dGxpbmVHZW9tZXRyeS5jcmVhdGVHZW9tZXRyeSA9IGZ1bmN0aW9uKGVsbGlwc29pZEdlb21ldHJ5KSB7CiAgICAgICAgY29uc3QgcmFkaWkgPSBlbGxpcHNvaWRHZW9tZXRyeS5fcmFkaWk7CiAgICAgICAgaWYgKHJhZGlpLnggPD0gMCB8fCByYWRpaS55IDw9IDAgfHwgcmFkaWkueiA8PSAwKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IGlubmVyUmFkaWkgPSBlbGxpcHNvaWRHZW9tZXRyeS5faW5uZXJSYWRpaTsKICAgICAgICBpZiAoaW5uZXJSYWRpaS54IDw9IDAgfHwgaW5uZXJSYWRpaS55IDw9IDAgfHwgaW5uZXJSYWRpaS56IDw9IDApIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWluaW11bUNsb2NrID0gZWxsaXBzb2lkR2VvbWV0cnkuX21pbmltdW1DbG9jazsKICAgICAgICBjb25zdCBtYXhpbXVtQ2xvY2sgPSBlbGxpcHNvaWRHZW9tZXRyeS5fbWF4aW11bUNsb2NrOwogICAgICAgIGNvbnN0IG1pbmltdW1Db25lID0gZWxsaXBzb2lkR2VvbWV0cnkuX21pbmltdW1Db25lOwogICAgICAgIGNvbnN0IG1heGltdW1Db25lID0gZWxsaXBzb2lkR2VvbWV0cnkuX21heGltdW1Db25lOwogICAgICAgIGNvbnN0IHN1YmRpdmlzaW9ucyA9IGVsbGlwc29pZEdlb21ldHJ5Ll9zdWJkaXZpc2lvbnM7CiAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuZnJvbUNhcnRlc2lhbjMocmFkaWkpOwogICAgICAgIGxldCBzbGljZVBhcnRpdGlvbnMgPSBlbGxpcHNvaWRHZW9tZXRyeS5fc2xpY2VQYXJ0aXRpb25zICsgMTsKICAgICAgICBsZXQgc3RhY2tQYXJ0aXRpb25zID0gZWxsaXBzb2lkR2VvbWV0cnkuX3N0YWNrUGFydGl0aW9ucyArIDE7CiAgICAgICAgc2xpY2VQYXJ0aXRpb25zID0gTWF0aC5yb3VuZCgKICAgICAgICAgIHNsaWNlUGFydGl0aW9ucyAqIE1hdGguYWJzKG1heGltdW1DbG9jayAtIG1pbmltdW1DbG9jaykgLyBNYXRoX2RlZmF1bHQuVFdPX1BJCiAgICAgICAgKTsKICAgICAgICBzdGFja1BhcnRpdGlvbnMgPSBNYXRoLnJvdW5kKAogICAgICAgICAgc3RhY2tQYXJ0aXRpb25zICogTWF0aC5hYnMobWF4aW11bUNvbmUgLSBtaW5pbXVtQ29uZSkgLyBNYXRoX2RlZmF1bHQuUEkKICAgICAgICApOwogICAgICAgIGlmIChzbGljZVBhcnRpdGlvbnMgPCAyKSB7CiAgICAgICAgICBzbGljZVBhcnRpdGlvbnMgPSAyOwogICAgICAgIH0KICAgICAgICBpZiAoc3RhY2tQYXJ0aXRpb25zIDwgMikgewogICAgICAgICAgc3RhY2tQYXJ0aXRpb25zID0gMjsKICAgICAgICB9CiAgICAgICAgbGV0IGV4dHJhSW5kaWNlcyA9IDA7CiAgICAgICAgbGV0IHZlcnRleE11bHRpcGxpZXIgPSAxOwogICAgICAgIGNvbnN0IGhhc0lubmVyU3VyZmFjZSA9IGlubmVyUmFkaWkueCAhPT0gcmFkaWkueCB8fCBpbm5lclJhZGlpLnkgIT09IHJhZGlpLnkgfHwgaW5uZXJSYWRpaS56ICE9PSByYWRpaS56OwogICAgICAgIGxldCBpc1RvcE9wZW4gPSBmYWxzZTsKICAgICAgICBsZXQgaXNCb3RPcGVuID0gZmFsc2U7CiAgICAgICAgaWYgKGhhc0lubmVyU3VyZmFjZSkgewogICAgICAgICAgdmVydGV4TXVsdGlwbGllciA9IDI7CiAgICAgICAgICBpZiAobWluaW11bUNvbmUgPiAwKSB7CiAgICAgICAgICAgIGlzVG9wT3BlbiA9IHRydWU7CiAgICAgICAgICAgIGV4dHJhSW5kaWNlcyArPSBzbGljZVBhcnRpdGlvbnM7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobWF4aW11bUNvbmUgPCBNYXRoLlBJKSB7CiAgICAgICAgICAgIGlzQm90T3BlbiA9IHRydWU7CiAgICAgICAgICAgIGV4dHJhSW5kaWNlcyArPSBzbGljZVBhcnRpdGlvbnM7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHZlcnRleENvdW50ID0gc3ViZGl2aXNpb25zICogdmVydGV4TXVsdGlwbGllciAqIChzdGFja1BhcnRpdGlvbnMgKyBzbGljZVBhcnRpdGlvbnMpOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkodmVydGV4Q291bnQgKiAzKTsKICAgICAgICBjb25zdCBudW1JbmRpY2VzID0gMiAqICh2ZXJ0ZXhDb3VudCArIGV4dHJhSW5kaWNlcyAtIChzbGljZVBhcnRpdGlvbnMgKyBzdGFja1BhcnRpdGlvbnMpICogdmVydGV4TXVsdGlwbGllcik7CiAgICAgICAgY29uc3QgaW5kaWNlcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KHZlcnRleENvdW50LCBudW1JbmRpY2VzKTsKICAgICAgICBsZXQgaTsKICAgICAgICBsZXQgajsKICAgICAgICBsZXQgdGhldGE7CiAgICAgICAgbGV0IHBoaTsKICAgICAgICBsZXQgaW5kZXggPSAwOwogICAgICAgIGNvbnN0IHNpblBoaSA9IG5ldyBBcnJheShzdGFja1BhcnRpdGlvbnMpOwogICAgICAgIGNvbnN0IGNvc1BoaSA9IG5ldyBBcnJheShzdGFja1BhcnRpdGlvbnMpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdGFja1BhcnRpdGlvbnM7IGkrKykgewogICAgICAgICAgcGhpID0gbWluaW11bUNvbmUgKyBpICogKG1heGltdW1Db25lIC0gbWluaW11bUNvbmUpIC8gKHN0YWNrUGFydGl0aW9ucyAtIDEpOwogICAgICAgICAgc2luUGhpW2ldID0gc2luMihwaGkpOwogICAgICAgICAgY29zUGhpW2ldID0gY29zMihwaGkpOwogICAgICAgIH0KICAgICAgICBjb25zdCBzaW5UaGV0YSA9IG5ldyBBcnJheShzdWJkaXZpc2lvbnMpOwogICAgICAgIGNvbnN0IGNvc1RoZXRhID0gbmV3IEFycmF5KHN1YmRpdmlzaW9ucyk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHN1YmRpdmlzaW9uczsgaSsrKSB7CiAgICAgICAgICB0aGV0YSA9IG1pbmltdW1DbG9jayArIGkgKiAobWF4aW11bUNsb2NrIC0gbWluaW11bUNsb2NrKSAvIChzdWJkaXZpc2lvbnMgLSAxKTsKICAgICAgICAgIHNpblRoZXRhW2ldID0gc2luMih0aGV0YSk7CiAgICAgICAgICBjb3NUaGV0YVtpXSA9IGNvczIodGhldGEpOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RhY2tQYXJ0aXRpb25zOyBpKyspIHsKICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdWJkaXZpc2lvbnM7IGorKykgewogICAgICAgICAgICBwb3NpdGlvbnNbaW5kZXgrK10gPSByYWRpaS54ICogc2luUGhpW2ldICogY29zVGhldGFbal07CiAgICAgICAgICAgIHBvc2l0aW9uc1tpbmRleCsrXSA9IHJhZGlpLnkgKiBzaW5QaGlbaV0gKiBzaW5UaGV0YVtqXTsKICAgICAgICAgICAgcG9zaXRpb25zW2luZGV4KytdID0gcmFkaWkueiAqIGNvc1BoaVtpXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGhhc0lubmVyU3VyZmFjZSkgewogICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0YWNrUGFydGl0aW9uczsgaSsrKSB7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdWJkaXZpc2lvbnM7IGorKykgewogICAgICAgICAgICAgIHBvc2l0aW9uc1tpbmRleCsrXSA9IGlubmVyUmFkaWkueCAqIHNpblBoaVtpXSAqIGNvc1RoZXRhW2pdOwogICAgICAgICAgICAgIHBvc2l0aW9uc1tpbmRleCsrXSA9IGlubmVyUmFkaWkueSAqIHNpblBoaVtpXSAqIHNpblRoZXRhW2pdOwogICAgICAgICAgICAgIHBvc2l0aW9uc1tpbmRleCsrXSA9IGlubmVyUmFkaWkueiAqIGNvc1BoaVtpXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzaW5QaGkubGVuZ3RoID0gc3ViZGl2aXNpb25zOwogICAgICAgIGNvc1BoaS5sZW5ndGggPSBzdWJkaXZpc2lvbnM7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHN1YmRpdmlzaW9uczsgaSsrKSB7CiAgICAgICAgICBwaGkgPSBtaW5pbXVtQ29uZSArIGkgKiAobWF4aW11bUNvbmUgLSBtaW5pbXVtQ29uZSkgLyAoc3ViZGl2aXNpb25zIC0gMSk7CiAgICAgICAgICBzaW5QaGlbaV0gPSBzaW4yKHBoaSk7CiAgICAgICAgICBjb3NQaGlbaV0gPSBjb3MyKHBoaSk7CiAgICAgICAgfQogICAgICAgIHNpblRoZXRhLmxlbmd0aCA9IHNsaWNlUGFydGl0aW9uczsKICAgICAgICBjb3NUaGV0YS5sZW5ndGggPSBzbGljZVBhcnRpdGlvbnM7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHNsaWNlUGFydGl0aW9uczsgaSsrKSB7CiAgICAgICAgICB0aGV0YSA9IG1pbmltdW1DbG9jayArIGkgKiAobWF4aW11bUNsb2NrIC0gbWluaW11bUNsb2NrKSAvIChzbGljZVBhcnRpdGlvbnMgLSAxKTsKICAgICAgICAgIHNpblRoZXRhW2ldID0gc2luMih0aGV0YSk7CiAgICAgICAgICBjb3NUaGV0YVtpXSA9IGNvczIodGhldGEpOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3ViZGl2aXNpb25zOyBpKyspIHsKICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzbGljZVBhcnRpdGlvbnM7IGorKykgewogICAgICAgICAgICBwb3NpdGlvbnNbaW5kZXgrK10gPSByYWRpaS54ICogc2luUGhpW2ldICogY29zVGhldGFbal07CiAgICAgICAgICAgIHBvc2l0aW9uc1tpbmRleCsrXSA9IHJhZGlpLnkgKiBzaW5QaGlbaV0gKiBzaW5UaGV0YVtqXTsKICAgICAgICAgICAgcG9zaXRpb25zW2luZGV4KytdID0gcmFkaWkueiAqIGNvc1BoaVtpXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGhhc0lubmVyU3VyZmFjZSkgewogICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN1YmRpdmlzaW9uczsgaSsrKSB7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzbGljZVBhcnRpdGlvbnM7IGorKykgewogICAgICAgICAgICAgIHBvc2l0aW9uc1tpbmRleCsrXSA9IGlubmVyUmFkaWkueCAqIHNpblBoaVtpXSAqIGNvc1RoZXRhW2pdOwogICAgICAgICAgICAgIHBvc2l0aW9uc1tpbmRleCsrXSA9IGlubmVyUmFkaWkueSAqIHNpblBoaVtpXSAqIHNpblRoZXRhW2pdOwogICAgICAgICAgICAgIHBvc2l0aW9uc1tpbmRleCsrXSA9IGlubmVyUmFkaWkueiAqIGNvc1BoaVtpXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpbmRleCA9IDA7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0YWNrUGFydGl0aW9ucyAqIHZlcnRleE11bHRpcGxpZXI7IGkrKykgewogICAgICAgICAgY29uc3QgdG9wT2Zmc2V0ID0gaSAqIHN1YmRpdmlzaW9uczsKICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdWJkaXZpc2lvbnMgLSAxOyBqKyspIHsKICAgICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IHRvcE9mZnNldCArIGo7CiAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSB0b3BPZmZzZXQgKyBqICsgMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IG9mZnNldCA9IHN0YWNrUGFydGl0aW9ucyAqIHN1YmRpdmlzaW9ucyAqIHZlcnRleE11bHRpcGxpZXI7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHNsaWNlUGFydGl0aW9uczsgaSsrKSB7CiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc3ViZGl2aXNpb25zIC0gMTsgaisrKSB7CiAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBvZmZzZXQgKyBpICsgaiAqIHNsaWNlUGFydGl0aW9uczsKICAgICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IG9mZnNldCArIGkgKyAoaiArIDEpICogc2xpY2VQYXJ0aXRpb25zOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaGFzSW5uZXJTdXJmYWNlKSB7CiAgICAgICAgICBvZmZzZXQgPSBzdGFja1BhcnRpdGlvbnMgKiBzdWJkaXZpc2lvbnMgKiB2ZXJ0ZXhNdWx0aXBsaWVyICsgc2xpY2VQYXJ0aXRpb25zICogc3ViZGl2aXNpb25zOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNsaWNlUGFydGl0aW9uczsgaSsrKSB7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdWJkaXZpc2lvbnMgLSAxOyBqKyspIHsKICAgICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gb2Zmc2V0ICsgaSArIGogKiBzbGljZVBhcnRpdGlvbnM7CiAgICAgICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IG9mZnNldCArIGkgKyAoaiArIDEpICogc2xpY2VQYXJ0aXRpb25zOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChoYXNJbm5lclN1cmZhY2UpIHsKICAgICAgICAgIGxldCBvdXRlck9mZnNldCA9IHN0YWNrUGFydGl0aW9ucyAqIHN1YmRpdmlzaW9ucyAqIHZlcnRleE11bHRpcGxpZXI7CiAgICAgICAgICBsZXQgaW5uZXJPZmZzZXQgPSBvdXRlck9mZnNldCArIHN1YmRpdmlzaW9ucyAqIHNsaWNlUGFydGl0aW9uczsKICAgICAgICAgIGlmIChpc1RvcE9wZW4pIHsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNsaWNlUGFydGl0aW9uczsgaSsrKSB7CiAgICAgICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IG91dGVyT2Zmc2V0ICsgaTsKICAgICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gaW5uZXJPZmZzZXQgKyBpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNCb3RPcGVuKSB7CiAgICAgICAgICAgIG91dGVyT2Zmc2V0ICs9IHN1YmRpdmlzaW9ucyAqIHNsaWNlUGFydGl0aW9ucyAtIHNsaWNlUGFydGl0aW9uczsKICAgICAgICAgICAgaW5uZXJPZmZzZXQgKz0gc3ViZGl2aXNpb25zICogc2xpY2VQYXJ0aXRpb25zIC0gc2xpY2VQYXJ0aXRpb25zOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2xpY2VQYXJ0aXRpb25zOyBpKyspIHsKICAgICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gb3V0ZXJPZmZzZXQgKyBpOwogICAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBpbm5lck9mZnNldCArIGk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZXNfZGVmYXVsdCh7CiAgICAgICAgICBwb3NpdGlvbjogbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5ET1VCTEUsCiAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgICAgIHZhbHVlczogcG9zaXRpb25zCiAgICAgICAgICB9KQogICAgICAgIH0pOwogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoZWxsaXBzb2lkR2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZSkpIHsKICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgICBjb25zdCBvZmZzZXRWYWx1ZSA9IGVsbGlwc29pZEdlb21ldHJ5Ll9vZmZzZXRBdHRyaWJ1dGUgPT09IEdlb21ldHJ5T2Zmc2V0QXR0cmlidXRlX2RlZmF1bHQuTk9ORSA/IDAgOiAxOwogICAgICAgICAgY29uc3QgYXBwbHlPZmZzZXQgPSBuZXcgVWludDhBcnJheShsZW5ndGggLyAzKS5maWxsKG9mZnNldFZhbHVlKTsKICAgICAgICAgIGF0dHJpYnV0ZXMuYXBwbHlPZmZzZXQgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LlVOU0lHTkVEX0JZVEUsCiAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDEsCiAgICAgICAgICAgIHZhbHVlczogYXBwbHlPZmZzZXQKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IEdlb21ldHJ5X2RlZmF1bHQoewogICAgICAgICAgYXR0cmlidXRlcywKICAgICAgICAgIGluZGljZXMsCiAgICAgICAgICBwcmltaXRpdmVUeXBlOiBQcmltaXRpdmVUeXBlX2RlZmF1bHQuTElORVMsCiAgICAgICAgICBib3VuZGluZ1NwaGVyZTogQm91bmRpbmdTcGhlcmVfZGVmYXVsdC5mcm9tRWxsaXBzb2lkKGVsbGlwc29pZCksCiAgICAgICAgICBvZmZzZXRBdHRyaWJ1dGU6IGVsbGlwc29pZEdlb21ldHJ5Ll9vZmZzZXRBdHRyaWJ1dGUKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQgPSBFbGxpcHNvaWRPdXRsaW5lR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVFbGxpcHNvaWRPdXRsaW5lR2VvbWV0cnkuanMKICB2YXIgY3JlYXRlRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5X2V4cG9ydHMgPSB7fTsKICBfX2V4cG9ydChjcmVhdGVFbGxpcHNvaWRPdXRsaW5lR2VvbWV0cnlfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gY3JlYXRlRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQKICB9KTsKICBmdW5jdGlvbiBjcmVhdGVFbGxpcHNvaWRPdXRsaW5lR2VvbWV0cnkoZWxsaXBzb2lkR2VvbWV0cnksIG9mZnNldCkgewogICAgaWYgKGRlZmluZWRfZGVmYXVsdChlbGxpcHNvaWRHZW9tZXRyeS5idWZmZXIsIG9mZnNldCkpIHsKICAgICAgZWxsaXBzb2lkR2VvbWV0cnkgPSBFbGxpcHNvaWRPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdC51bnBhY2soCiAgICAgICAgZWxsaXBzb2lkR2VvbWV0cnksCiAgICAgICAgb2Zmc2V0CiAgICAgICk7CiAgICB9CiAgICByZXR1cm4gRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQuY3JlYXRlR2VvbWV0cnkoZWxsaXBzb2lkR2VvbWV0cnkpOwogIH0KICB2YXIgY3JlYXRlRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfY3JlYXRlRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVFbGxpcHNvaWRPdXRsaW5lR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9FbGxpcHNvaWRPdXRsaW5lR2VvbWV0cnkoKTsKICAgICAgY3JlYXRlRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQgPSBjcmVhdGVFbGxpcHNvaWRPdXRsaW5lR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9DdWxsaW5nVm9sdW1lLmpzCiAgZnVuY3Rpb24gQ3VsbGluZ1ZvbHVtZShwbGFuZXMpIHsKICAgIHRoaXMucGxhbmVzID0gcGxhbmVzID8/IFtdOwogIH0KICB2YXIgZmFjZXMsIHNjcmF0Y2hQbGFuZUNlbnRlciwgc2NyYXRjaFBsYW5lTm9ybWFsMiwgc2NyYXRjaFBsYW5lMiwgQ3VsbGluZ1ZvbHVtZV9kZWZhdWx0OwogIHZhciBpbml0X0N1bGxpbmdWb2x1bWUgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0N1bGxpbmdWb2x1bWUuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW40KCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfSW50ZXJzZWN0KCk7CiAgICAgIGluaXRfUGxhbmUoKTsKICAgICAgZmFjZXMgPSBbbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpLCBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCksIG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKV07CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9YLCBmYWNlc1swXSk7CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9ZLCBmYWNlc1sxXSk7CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9aLCBmYWNlc1syXSk7CiAgICAgIHNjcmF0Y2hQbGFuZUNlbnRlciA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFBsYW5lTm9ybWFsMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFBsYW5lMiA9IG5ldyBQbGFuZV9kZWZhdWx0KG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoMSwgMCwgMCksIDApOwogICAgICBDdWxsaW5nVm9sdW1lLmZyb21Cb3VuZGluZ1NwaGVyZSA9IGZ1bmN0aW9uKGJvdW5kaW5nU3BoZXJlLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChib3VuZGluZ1NwaGVyZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJib3VuZGluZ1NwaGVyZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IEN1bGxpbmdWb2x1bWUoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGVuZ3RoID0gZmFjZXMubGVuZ3RoOwogICAgICAgIGNvbnN0IHBsYW5lcyA9IHJlc3VsdC5wbGFuZXM7CiAgICAgICAgcGxhbmVzLmxlbmd0aCA9IDIgKiBsZW5ndGg7CiAgICAgICAgY29uc3QgY2VudGVyID0gYm91bmRpbmdTcGhlcmUuY2VudGVyOwogICAgICAgIGNvbnN0IHJhZGl1cyA9IGJvdW5kaW5nU3BoZXJlLnJhZGl1czsKICAgICAgICBsZXQgcGxhbmVJbmRleCA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgY29uc3QgZmFjZU5vcm1hbCA9IGZhY2VzW2ldOwogICAgICAgICAgbGV0IHBsYW5lMCA9IHBsYW5lc1twbGFuZUluZGV4XTsKICAgICAgICAgIGxldCBwbGFuZTEgPSBwbGFuZXNbcGxhbmVJbmRleCArIDFdOwogICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocGxhbmUwKSkgewogICAgICAgICAgICBwbGFuZTAgPSBwbGFuZXNbcGxhbmVJbmRleF0gPSBuZXcgQ2FydGVzaWFuNF9kZWZhdWx0KCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwbGFuZTEpKSB7CiAgICAgICAgICAgIHBsYW5lMSA9IHBsYW5lc1twbGFuZUluZGV4ICsgMV0gPSBuZXcgQ2FydGVzaWFuNF9kZWZhdWx0KCk7CiAgICAgICAgICB9CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihmYWNlTm9ybWFsLCAtcmFkaXVzLCBzY3JhdGNoUGxhbmVDZW50ZXIpOwogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChjZW50ZXIsIHNjcmF0Y2hQbGFuZUNlbnRlciwgc2NyYXRjaFBsYW5lQ2VudGVyKTsKICAgICAgICAgIHBsYW5lMC54ID0gZmFjZU5vcm1hbC54OwogICAgICAgICAgcGxhbmUwLnkgPSBmYWNlTm9ybWFsLnk7CiAgICAgICAgICBwbGFuZTAueiA9IGZhY2VOb3JtYWwuejsKICAgICAgICAgIHBsYW5lMC53ID0gLUNhcnRlc2lhbjNfZGVmYXVsdC5kb3QoZmFjZU5vcm1hbCwgc2NyYXRjaFBsYW5lQ2VudGVyKTsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKGZhY2VOb3JtYWwsIHJhZGl1cywgc2NyYXRjaFBsYW5lQ2VudGVyKTsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoY2VudGVyLCBzY3JhdGNoUGxhbmVDZW50ZXIsIHNjcmF0Y2hQbGFuZUNlbnRlcik7CiAgICAgICAgICBwbGFuZTEueCA9IC1mYWNlTm9ybWFsLng7CiAgICAgICAgICBwbGFuZTEueSA9IC1mYWNlTm9ybWFsLnk7CiAgICAgICAgICBwbGFuZTEueiA9IC1mYWNlTm9ybWFsLno7CiAgICAgICAgICBwbGFuZTEudyA9IC1DYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KAogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKGZhY2VOb3JtYWwsIHNjcmF0Y2hQbGFuZU5vcm1hbDIpLAogICAgICAgICAgICBzY3JhdGNoUGxhbmVDZW50ZXIKICAgICAgICAgICk7CiAgICAgICAgICBwbGFuZUluZGV4ICs9IDI7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEN1bGxpbmdWb2x1bWUucHJvdG90eXBlLmNvbXB1dGVWaXNpYmlsaXR5ID0gZnVuY3Rpb24oYm91bmRpbmdWb2x1bWUpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChib3VuZGluZ1ZvbHVtZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJib3VuZGluZ1ZvbHVtZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcGxhbmVzID0gdGhpcy5wbGFuZXM7CiAgICAgICAgbGV0IGludGVyc2VjdGluZyA9IGZhbHNlOwogICAgICAgIGZvciAobGV0IGsgPSAwLCBsZW4gPSBwbGFuZXMubGVuZ3RoOyBrIDwgbGVuOyArK2spIHsKICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJvdW5kaW5nVm9sdW1lLmludGVyc2VjdFBsYW5lKAogICAgICAgICAgICBQbGFuZV9kZWZhdWx0LmZyb21DYXJ0ZXNpYW40KHBsYW5lc1trXSwgc2NyYXRjaFBsYW5lMikKICAgICAgICAgICk7CiAgICAgICAgICBpZiAocmVzdWx0ID09PSBJbnRlcnNlY3RfZGVmYXVsdC5PVVRTSURFKSB7CiAgICAgICAgICAgIHJldHVybiBJbnRlcnNlY3RfZGVmYXVsdC5PVVRTSURFOwogICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT09IEludGVyc2VjdF9kZWZhdWx0LklOVEVSU0VDVElORykgewogICAgICAgICAgICBpbnRlcnNlY3RpbmcgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gaW50ZXJzZWN0aW5nID8gSW50ZXJzZWN0X2RlZmF1bHQuSU5URVJTRUNUSU5HIDogSW50ZXJzZWN0X2RlZmF1bHQuSU5TSURFOwogICAgICB9OwogICAgICBDdWxsaW5nVm9sdW1lLnByb3RvdHlwZS5jb21wdXRlVmlzaWJpbGl0eVdpdGhQbGFuZU1hc2sgPSBmdW5jdGlvbihib3VuZGluZ1ZvbHVtZSwgcGFyZW50UGxhbmVNYXNrKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYm91bmRpbmdWb2x1bWUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYm91bmRpbmdWb2x1bWUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHBhcmVudFBsYW5lTWFzaykpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJwYXJlbnRQbGFuZU1hc2sgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmIChwYXJlbnRQbGFuZU1hc2sgPT09IEN1bGxpbmdWb2x1bWUuTUFTS19PVVRTSURFIHx8IHBhcmVudFBsYW5lTWFzayA9PT0gQ3VsbGluZ1ZvbHVtZS5NQVNLX0lOU0lERSkgewogICAgICAgICAgcmV0dXJuIHBhcmVudFBsYW5lTWFzazsKICAgICAgICB9CiAgICAgICAgbGV0IG1hc2sgPSBDdWxsaW5nVm9sdW1lLk1BU0tfSU5TSURFOwogICAgICAgIGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVzOwogICAgICAgIGZvciAobGV0IGsgPSAwLCBsZW4gPSBwbGFuZXMubGVuZ3RoOyBrIDwgbGVuOyArK2spIHsKICAgICAgICAgIGNvbnN0IGZsYWcgPSBrIDwgMzEgPyAxIDw8IGsgOiAwOwogICAgICAgICAgaWYgKGsgPCAzMSAmJiAocGFyZW50UGxhbmVNYXNrICYgZmxhZykgPT09IDApIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCByZXN1bHQgPSBib3VuZGluZ1ZvbHVtZS5pbnRlcnNlY3RQbGFuZSgKICAgICAgICAgICAgUGxhbmVfZGVmYXVsdC5mcm9tQ2FydGVzaWFuNChwbGFuZXNba10sIHNjcmF0Y2hQbGFuZTIpCiAgICAgICAgICApOwogICAgICAgICAgaWYgKHJlc3VsdCA9PT0gSW50ZXJzZWN0X2RlZmF1bHQuT1VUU0lERSkgewogICAgICAgICAgICByZXR1cm4gQ3VsbGluZ1ZvbHVtZS5NQVNLX09VVFNJREU7CiAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gSW50ZXJzZWN0X2RlZmF1bHQuSU5URVJTRUNUSU5HKSB7CiAgICAgICAgICAgIG1hc2sgfD0gZmxhZzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1hc2s7CiAgICAgIH07CiAgICAgIEN1bGxpbmdWb2x1bWUuTUFTS19PVVRTSURFID0gNDI5NDk2NzI5NTsKICAgICAgQ3VsbGluZ1ZvbHVtZS5NQVNLX0lOU0lERSA9IDA7CiAgICAgIEN1bGxpbmdWb2x1bWUuTUFTS19JTkRFVEVSTUlOQVRFID0gMjE0NzQ4MzY0NzsKICAgICAgQ3VsbGluZ1ZvbHVtZV9kZWZhdWx0ID0gQ3VsbGluZ1ZvbHVtZTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL09ydGhvZ3JhcGhpY09mZkNlbnRlckZydXN0dW0uanMKICBmdW5jdGlvbiBPcnRob2dyYXBoaWNPZmZDZW50ZXJGcnVzdHVtKG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgIHRoaXMubGVmdCA9IG9wdGlvbnMubGVmdDsKICAgIHRoaXMuX2xlZnQgPSB2b2lkIDA7CiAgICB0aGlzLnJpZ2h0ID0gb3B0aW9ucy5yaWdodDsKICAgIHRoaXMuX3JpZ2h0ID0gdm9pZCAwOwogICAgdGhpcy50b3AgPSBvcHRpb25zLnRvcDsKICAgIHRoaXMuX3RvcCA9IHZvaWQgMDsKICAgIHRoaXMuYm90dG9tID0gb3B0aW9ucy5ib3R0b207CiAgICB0aGlzLl9ib3R0b20gPSB2b2lkIDA7CiAgICB0aGlzLm5lYXIgPSBvcHRpb25zLm5lYXIgPz8gMTsKICAgIHRoaXMuX25lYXIgPSB0aGlzLm5lYXI7CiAgICB0aGlzLmZhciA9IG9wdGlvbnMuZmFyID8/IDVlODsKICAgIHRoaXMuX2ZhciA9IHRoaXMuZmFyOwogICAgdGhpcy5fY3VsbGluZ1ZvbHVtZSA9IG5ldyBDdWxsaW5nVm9sdW1lX2RlZmF1bHQoKTsKICAgIHRoaXMuX29ydGhvZ3JhcGhpY01hdHJpeCA9IG5ldyBNYXRyaXg0X2RlZmF1bHQoKTsKICB9CiAgZnVuY3Rpb24gdXBkYXRlKGZydXN0dW0pIHsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGZydXN0dW0ucmlnaHQpIHx8ICFkZWZpbmVkX2RlZmF1bHQoZnJ1c3R1bS5sZWZ0KSB8fCAhZGVmaW5lZF9kZWZhdWx0KGZydXN0dW0udG9wKSB8fCAhZGVmaW5lZF9kZWZhdWx0KGZydXN0dW0uYm90dG9tKSB8fCAhZGVmaW5lZF9kZWZhdWx0KGZydXN0dW0ubmVhcikgfHwgIWRlZmluZWRfZGVmYXVsdChmcnVzdHVtLmZhcikpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgInJpZ2h0LCBsZWZ0LCB0b3AsIGJvdHRvbSwgbmVhciwgb3IgZmFyIHBhcmFtZXRlcnMgYXJlIG5vdCBzZXQuIgogICAgICApOwogICAgfQogICAgaWYgKGZydXN0dW0udG9wICE9PSBmcnVzdHVtLl90b3AgfHwgZnJ1c3R1bS5ib3R0b20gIT09IGZydXN0dW0uX2JvdHRvbSB8fCBmcnVzdHVtLmxlZnQgIT09IGZydXN0dW0uX2xlZnQgfHwgZnJ1c3R1bS5yaWdodCAhPT0gZnJ1c3R1bS5fcmlnaHQgfHwgZnJ1c3R1bS5uZWFyICE9PSBmcnVzdHVtLl9uZWFyIHx8IGZydXN0dW0uZmFyICE9PSBmcnVzdHVtLl9mYXIpIHsKICAgICAgaWYgKGZydXN0dW0ubGVmdCA+IGZydXN0dW0ucmlnaHQpIHsKICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgicmlnaHQgbXVzdCBiZSBncmVhdGVyIHRoYW4gbGVmdC4iKTsKICAgICAgfQogICAgICBpZiAoZnJ1c3R1bS5ib3R0b20gPiBmcnVzdHVtLnRvcCkgewogICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJ0b3AgbXVzdCBiZSBncmVhdGVyIHRoYW4gYm90dG9tLiIpOwogICAgICB9CiAgICAgIGlmIChmcnVzdHVtLm5lYXIgPD0gMCB8fCBmcnVzdHVtLm5lYXIgPiBmcnVzdHVtLmZhcikgewogICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgIm5lYXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyBhbmQgbGVzcyB0aGFuIGZhci4iCiAgICAgICAgKTsKICAgICAgfQogICAgICBmcnVzdHVtLl9sZWZ0ID0gZnJ1c3R1bS5sZWZ0OwogICAgICBmcnVzdHVtLl9yaWdodCA9IGZydXN0dW0ucmlnaHQ7CiAgICAgIGZydXN0dW0uX3RvcCA9IGZydXN0dW0udG9wOwogICAgICBmcnVzdHVtLl9ib3R0b20gPSBmcnVzdHVtLmJvdHRvbTsKICAgICAgZnJ1c3R1bS5fbmVhciA9IGZydXN0dW0ubmVhcjsKICAgICAgZnJ1c3R1bS5fZmFyID0gZnJ1c3R1bS5mYXI7CiAgICAgIGZydXN0dW0uX29ydGhvZ3JhcGhpY01hdHJpeCA9IE1hdHJpeDRfZGVmYXVsdC5jb21wdXRlT3J0aG9ncmFwaGljT2ZmQ2VudGVyKAogICAgICAgIGZydXN0dW0ubGVmdCwKICAgICAgICBmcnVzdHVtLnJpZ2h0LAogICAgICAgIGZydXN0dW0uYm90dG9tLAogICAgICAgIGZydXN0dW0udG9wLAogICAgICAgIGZydXN0dW0ubmVhciwKICAgICAgICBmcnVzdHVtLmZhciwKICAgICAgICBmcnVzdHVtLl9vcnRob2dyYXBoaWNNYXRyaXgKICAgICAgKTsKICAgIH0KICB9CiAgdmFyIGdldFBsYW5lc1JpZ2h0LCBnZXRQbGFuZXNOZWFyQ2VudGVyLCBnZXRQbGFuZXNQb2ludCwgbmVnYXRlU2NyYXRjaCwgT3J0aG9ncmFwaGljT2ZmQ2VudGVyRnJ1c3R1bV9kZWZhdWx0OwogIHZhciBpbml0X09ydGhvZ3JhcGhpY09mZkNlbnRlckZydXN0dW0gPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL09ydGhvZ3JhcGhpY09mZkNlbnRlckZydXN0dW0uanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW40KCk7CiAgICAgIGluaXRfQ3VsbGluZ1ZvbHVtZSgpOwogICAgICBpbml0X0Zyb3plbigpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9NYXRyaXg0KCk7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE9ydGhvZ3JhcGhpY09mZkNlbnRlckZydXN0dW0ucHJvdG90eXBlLCB7CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgb3J0aG9ncmFwaGljIHByb2plY3Rpb24gbWF0cml4IGNvbXB1dGVkIGZyb20gdGhlIHZpZXcgZnJ1c3R1bS4KICAgICAgICAgKiBAbWVtYmVyb2YgT3J0aG9ncmFwaGljT2ZmQ2VudGVyRnJ1c3R1bS5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7TWF0cml4NH0KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKi8KICAgICAgICBwcm9qZWN0aW9uTWF0cml4OiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB1cGRhdGUodGhpcyk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcnRob2dyYXBoaWNNYXRyaXg7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgZ2V0UGxhbmVzUmlnaHQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGdldFBsYW5lc05lYXJDZW50ZXIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGdldFBsYW5lc1BvaW50ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBuZWdhdGVTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBPcnRob2dyYXBoaWNPZmZDZW50ZXJGcnVzdHVtLnByb3RvdHlwZS5jb21wdXRlQ3VsbGluZ1ZvbHVtZSA9IGZ1bmN0aW9uKHBvc2l0aW9uLCBkaXJlY3Rpb24yLCB1cCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHBvc2l0aW9uKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInBvc2l0aW9uIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChkaXJlY3Rpb24yKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImRpcmVjdGlvbiBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodXApKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgidXAgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYW5lcyA9IHRoaXMuX2N1bGxpbmdWb2x1bWUucGxhbmVzOwogICAgICAgIGNvbnN0IHQgPSB0aGlzLnRvcDsKICAgICAgICBjb25zdCBiID0gdGhpcy5ib3R0b207CiAgICAgICAgY29uc3QgciA9IHRoaXMucmlnaHQ7CiAgICAgICAgY29uc3QgbCA9IHRoaXMubGVmdDsKICAgICAgICBjb25zdCBuID0gdGhpcy5uZWFyOwogICAgICAgIGNvbnN0IGYgPSB0aGlzLmZhcjsKICAgICAgICBjb25zdCByaWdodCA9IENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhkaXJlY3Rpb24yLCB1cCwgZ2V0UGxhbmVzUmlnaHQpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUocmlnaHQsIHJpZ2h0KTsKICAgICAgICBjb25zdCBuZWFyQ2VudGVyID0gZ2V0UGxhbmVzTmVhckNlbnRlcjsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihkaXJlY3Rpb24yLCBuLCBuZWFyQ2VudGVyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHBvc2l0aW9uLCBuZWFyQ2VudGVyLCBuZWFyQ2VudGVyKTsKICAgICAgICBjb25zdCBwb2ludCA9IGdldFBsYW5lc1BvaW50OwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKHJpZ2h0LCBsLCBwb2ludCk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChuZWFyQ2VudGVyLCBwb2ludCwgcG9pbnQpOwogICAgICAgIGxldCBwbGFuZSA9IHBsYW5lc1swXTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwbGFuZSkpIHsKICAgICAgICAgIHBsYW5lID0gcGxhbmVzWzBdID0gbmV3IENhcnRlc2lhbjRfZGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgICBwbGFuZS54ID0gcmlnaHQueDsKICAgICAgICBwbGFuZS55ID0gcmlnaHQueTsKICAgICAgICBwbGFuZS56ID0gcmlnaHQuejsKICAgICAgICBwbGFuZS53ID0gLUNhcnRlc2lhbjNfZGVmYXVsdC5kb3QocmlnaHQsIHBvaW50KTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihyaWdodCwgciwgcG9pbnQpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQobmVhckNlbnRlciwgcG9pbnQsIHBvaW50KTsKICAgICAgICBwbGFuZSA9IHBsYW5lc1sxXTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwbGFuZSkpIHsKICAgICAgICAgIHBsYW5lID0gcGxhbmVzWzFdID0gbmV3IENhcnRlc2lhbjRfZGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgICBwbGFuZS54ID0gLXJpZ2h0Lng7CiAgICAgICAgcGxhbmUueSA9IC1yaWdodC55OwogICAgICAgIHBsYW5lLnogPSAtcmlnaHQuejsKICAgICAgICBwbGFuZS53ID0gLUNhcnRlc2lhbjNfZGVmYXVsdC5kb3QoQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZShyaWdodCwgbmVnYXRlU2NyYXRjaCksIHBvaW50KTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcih1cCwgYiwgcG9pbnQpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQobmVhckNlbnRlciwgcG9pbnQsIHBvaW50KTsKICAgICAgICBwbGFuZSA9IHBsYW5lc1syXTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwbGFuZSkpIHsKICAgICAgICAgIHBsYW5lID0gcGxhbmVzWzJdID0gbmV3IENhcnRlc2lhbjRfZGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgICBwbGFuZS54ID0gdXAueDsKICAgICAgICBwbGFuZS55ID0gdXAueTsKICAgICAgICBwbGFuZS56ID0gdXAuejsKICAgICAgICBwbGFuZS53ID0gLUNhcnRlc2lhbjNfZGVmYXVsdC5kb3QodXAsIHBvaW50KTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcih1cCwgdCwgcG9pbnQpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQobmVhckNlbnRlciwgcG9pbnQsIHBvaW50KTsKICAgICAgICBwbGFuZSA9IHBsYW5lc1szXTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwbGFuZSkpIHsKICAgICAgICAgIHBsYW5lID0gcGxhbmVzWzNdID0gbmV3IENhcnRlc2lhbjRfZGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgICBwbGFuZS54ID0gLXVwLng7CiAgICAgICAgcGxhbmUueSA9IC11cC55OwogICAgICAgIHBsYW5lLnogPSAtdXAuejsKICAgICAgICBwbGFuZS53ID0gLUNhcnRlc2lhbjNfZGVmYXVsdC5kb3QoQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZSh1cCwgbmVnYXRlU2NyYXRjaCksIHBvaW50KTsKICAgICAgICBwbGFuZSA9IHBsYW5lc1s0XTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwbGFuZSkpIHsKICAgICAgICAgIHBsYW5lID0gcGxhbmVzWzRdID0gbmV3IENhcnRlc2lhbjRfZGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgICBwbGFuZS54ID0gZGlyZWN0aW9uMi54OwogICAgICAgIHBsYW5lLnkgPSBkaXJlY3Rpb24yLnk7CiAgICAgICAgcGxhbmUueiA9IGRpcmVjdGlvbjIuejsKICAgICAgICBwbGFuZS53ID0gLUNhcnRlc2lhbjNfZGVmYXVsdC5kb3QoZGlyZWN0aW9uMiwgbmVhckNlbnRlcik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoZGlyZWN0aW9uMiwgZiwgcG9pbnQpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQocG9zaXRpb24sIHBvaW50LCBwb2ludCk7CiAgICAgICAgcGxhbmUgPSBwbGFuZXNbNV07CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocGxhbmUpKSB7CiAgICAgICAgICBwbGFuZSA9IHBsYW5lc1s1XSA9IG5ldyBDYXJ0ZXNpYW40X2RlZmF1bHQoKTsKICAgICAgICB9CiAgICAgICAgcGxhbmUueCA9IC1kaXJlY3Rpb24yLng7CiAgICAgICAgcGxhbmUueSA9IC1kaXJlY3Rpb24yLnk7CiAgICAgICAgcGxhbmUueiA9IC1kaXJlY3Rpb24yLno7CiAgICAgICAgcGxhbmUudyA9IC1DYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KENhcnRlc2lhbjNfZGVmYXVsdC5uZWdhdGUoZGlyZWN0aW9uMiwgbmVnYXRlU2NyYXRjaCksIHBvaW50KTsKICAgICAgICByZXR1cm4gdGhpcy5fY3VsbGluZ1ZvbHVtZTsKICAgICAgfTsKICAgICAgT3J0aG9ncmFwaGljT2ZmQ2VudGVyRnJ1c3R1bS5wcm90b3R5cGUuZ2V0UGl4ZWxEaW1lbnNpb25zID0gZnVuY3Rpb24oZHJhd2luZ0J1ZmZlcldpZHRoLCBkcmF3aW5nQnVmZmVySGVpZ2h0LCBkaXN0YW5jZSwgcGl4ZWxSYXRpbywgcmVzdWx0KSB7CiAgICAgICAgdXBkYXRlKHRoaXMpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGRyYXdpbmdCdWZmZXJXaWR0aCkgfHwgIWRlZmluZWRfZGVmYXVsdChkcmF3aW5nQnVmZmVySGVpZ2h0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJCb3RoIGRyYXdpbmdCdWZmZXJXaWR0aCBhbmQgZHJhd2luZ0J1ZmZlckhlaWdodCBhcmUgcmVxdWlyZWQuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKGRyYXdpbmdCdWZmZXJXaWR0aCA8PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZHJhd2luZ0J1ZmZlcldpZHRoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7CiAgICAgICAgfQogICAgICAgIGlmIChkcmF3aW5nQnVmZmVySGVpZ2h0IDw9IDApIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJkcmF3aW5nQnVmZmVySGVpZ2h0IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGRpc3RhbmNlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImRpc3RhbmNlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwaXhlbFJhdGlvKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInBpeGVsUmF0aW8gaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmIChwaXhlbFJhdGlvIDw9IDApIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJwaXhlbFJhdGlvIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJBIHJlc3VsdCBvYmplY3QgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGZydXN0dW1XaWR0aCA9IHRoaXMucmlnaHQgLSB0aGlzLmxlZnQ7CiAgICAgICAgY29uc3QgZnJ1c3R1bUhlaWdodCA9IHRoaXMudG9wIC0gdGhpcy5ib3R0b207CiAgICAgICAgY29uc3QgcGl4ZWxXaWR0aCA9IHBpeGVsUmF0aW8gKiBmcnVzdHVtV2lkdGggLyBkcmF3aW5nQnVmZmVyV2lkdGg7CiAgICAgICAgY29uc3QgcGl4ZWxIZWlnaHQgPSBwaXhlbFJhdGlvICogZnJ1c3R1bUhlaWdodCAvIGRyYXdpbmdCdWZmZXJIZWlnaHQ7CiAgICAgICAgcmVzdWx0LnggPSBwaXhlbFdpZHRoOwogICAgICAgIHJlc3VsdC55ID0gcGl4ZWxIZWlnaHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgT3J0aG9ncmFwaGljT2ZmQ2VudGVyRnJ1c3R1bS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgT3J0aG9ncmFwaGljT2ZmQ2VudGVyRnJ1c3R1bSgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQubGVmdCA9IHRoaXMubGVmdDsKICAgICAgICByZXN1bHQucmlnaHQgPSB0aGlzLnJpZ2h0OwogICAgICAgIHJlc3VsdC50b3AgPSB0aGlzLnRvcDsKICAgICAgICByZXN1bHQuYm90dG9tID0gdGhpcy5ib3R0b207CiAgICAgICAgcmVzdWx0Lm5lYXIgPSB0aGlzLm5lYXI7CiAgICAgICAgcmVzdWx0LmZhciA9IHRoaXMuZmFyOwogICAgICAgIHJlc3VsdC5fbGVmdCA9IHZvaWQgMDsKICAgICAgICByZXN1bHQuX3JpZ2h0ID0gdm9pZCAwOwogICAgICAgIHJlc3VsdC5fdG9wID0gdm9pZCAwOwogICAgICAgIHJlc3VsdC5fYm90dG9tID0gdm9pZCAwOwogICAgICAgIHJlc3VsdC5fbmVhciA9IHZvaWQgMDsKICAgICAgICByZXN1bHQuX2ZhciA9IHZvaWQgMDsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBPcnRob2dyYXBoaWNPZmZDZW50ZXJGcnVzdHVtLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbihvdGhlcikgewogICAgICAgIHJldHVybiBkZWZpbmVkX2RlZmF1bHQob3RoZXIpICYmIG90aGVyIGluc3RhbmNlb2YgT3J0aG9ncmFwaGljT2ZmQ2VudGVyRnJ1c3R1bSAmJiB0aGlzLnJpZ2h0ID09PSBvdGhlci5yaWdodCAmJiB0aGlzLmxlZnQgPT09IG90aGVyLmxlZnQgJiYgdGhpcy50b3AgPT09IG90aGVyLnRvcCAmJiB0aGlzLmJvdHRvbSA9PT0gb3RoZXIuYm90dG9tICYmIHRoaXMubmVhciA9PT0gb3RoZXIubmVhciAmJiB0aGlzLmZhciA9PT0gb3RoZXIuZmFyOwogICAgICB9OwogICAgICBPcnRob2dyYXBoaWNPZmZDZW50ZXJGcnVzdHVtLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uID0gZnVuY3Rpb24ob3RoZXIsIHJlbGF0aXZlRXBzaWxvbiwgYWJzb2x1dGVFcHNpbG9uKSB7CiAgICAgICAgcmV0dXJuIG90aGVyID09PSB0aGlzIHx8IGRlZmluZWRfZGVmYXVsdChvdGhlcikgJiYgb3RoZXIgaW5zdGFuY2VvZiBPcnRob2dyYXBoaWNPZmZDZW50ZXJGcnVzdHVtICYmIE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgdGhpcy5yaWdodCwKICAgICAgICAgIG90aGVyLnJpZ2h0LAogICAgICAgICAgcmVsYXRpdmVFcHNpbG9uLAogICAgICAgICAgYWJzb2x1dGVFcHNpbG9uCiAgICAgICAgKSAmJiBNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgIHRoaXMubGVmdCwKICAgICAgICAgIG90aGVyLmxlZnQsCiAgICAgICAgICByZWxhdGl2ZUVwc2lsb24sCiAgICAgICAgICBhYnNvbHV0ZUVwc2lsb24KICAgICAgICApICYmIE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgdGhpcy50b3AsCiAgICAgICAgICBvdGhlci50b3AsCiAgICAgICAgICByZWxhdGl2ZUVwc2lsb24sCiAgICAgICAgICBhYnNvbHV0ZUVwc2lsb24KICAgICAgICApICYmIE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgdGhpcy5ib3R0b20sCiAgICAgICAgICBvdGhlci5ib3R0b20sCiAgICAgICAgICByZWxhdGl2ZUVwc2lsb24sCiAgICAgICAgICBhYnNvbHV0ZUVwc2lsb24KICAgICAgICApICYmIE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgdGhpcy5uZWFyLAogICAgICAgICAgb3RoZXIubmVhciwKICAgICAgICAgIHJlbGF0aXZlRXBzaWxvbiwKICAgICAgICAgIGFic29sdXRlRXBzaWxvbgogICAgICAgICkgJiYgTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oCiAgICAgICAgICB0aGlzLmZhciwKICAgICAgICAgIG90aGVyLmZhciwKICAgICAgICAgIHJlbGF0aXZlRXBzaWxvbiwKICAgICAgICAgIGFic29sdXRlRXBzaWxvbgogICAgICAgICk7CiAgICAgIH07CiAgICAgIE9ydGhvZ3JhcGhpY09mZkNlbnRlckZydXN0dW1fZGVmYXVsdCA9IE9ydGhvZ3JhcGhpY09mZkNlbnRlckZydXN0dW07CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9PcnRob2dyYXBoaWNGcnVzdHVtLmpzCiAgZnVuY3Rpb24gT3J0aG9ncmFwaGljRnJ1c3R1bShvcHRpb25zKSB7CiAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICB0aGlzLl9vZmZDZW50ZXJGcnVzdHVtID0gbmV3IE9ydGhvZ3JhcGhpY09mZkNlbnRlckZydXN0dW1fZGVmYXVsdCgpOwogICAgdGhpcy53aWR0aCA9IG9wdGlvbnMud2lkdGg7CiAgICB0aGlzLl93aWR0aCA9IHZvaWQgMDsKICAgIHRoaXMuYXNwZWN0UmF0aW8gPSBvcHRpb25zLmFzcGVjdFJhdGlvOwogICAgdGhpcy5fYXNwZWN0UmF0aW8gPSB2b2lkIDA7CiAgICB0aGlzLm5lYXIgPSBvcHRpb25zLm5lYXIgPz8gMTsKICAgIHRoaXMuX25lYXIgPSB0aGlzLm5lYXI7CiAgICB0aGlzLmZhciA9IG9wdGlvbnMuZmFyID8/IDVlODsKICAgIHRoaXMuX2ZhciA9IHRoaXMuZmFyOwogIH0KICBmdW5jdGlvbiB1cGRhdGUyKGZydXN0dW0pIHsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGZydXN0dW0ud2lkdGgpIHx8ICFkZWZpbmVkX2RlZmF1bHQoZnJ1c3R1bS5hc3BlY3RSYXRpbykgfHwgIWRlZmluZWRfZGVmYXVsdChmcnVzdHVtLm5lYXIpIHx8ICFkZWZpbmVkX2RlZmF1bHQoZnJ1c3R1bS5mYXIpKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICJ3aWR0aCwgYXNwZWN0UmF0aW8sIG5lYXIsIG9yIGZhciBwYXJhbWV0ZXJzIGFyZSBub3Qgc2V0LiIKICAgICAgKTsKICAgIH0KICAgIGNvbnN0IGYgPSBmcnVzdHVtLl9vZmZDZW50ZXJGcnVzdHVtOwogICAgaWYgKGZydXN0dW0ud2lkdGggIT09IGZydXN0dW0uX3dpZHRoIHx8IGZydXN0dW0uYXNwZWN0UmF0aW8gIT09IGZydXN0dW0uX2FzcGVjdFJhdGlvIHx8IGZydXN0dW0ubmVhciAhPT0gZnJ1c3R1bS5fbmVhciB8fCBmcnVzdHVtLmZhciAhPT0gZnJ1c3R1bS5fZmFyKSB7CiAgICAgIGlmIChmcnVzdHVtLmFzcGVjdFJhdGlvIDwgMCkgewogICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhc3BlY3RSYXRpbyBtdXN0IGJlIHBvc2l0aXZlLiIpOwogICAgICB9CiAgICAgIGlmIChmcnVzdHVtLm5lYXIgPCAwIHx8IGZydXN0dW0ubmVhciA+IGZydXN0dW0uZmFyKSB7CiAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAibmVhciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCBsZXNzIHRoYW4gZmFyLiIKICAgICAgICApOwogICAgICB9CiAgICAgIGZydXN0dW0uX2FzcGVjdFJhdGlvID0gZnJ1c3R1bS5hc3BlY3RSYXRpbzsKICAgICAgZnJ1c3R1bS5fd2lkdGggPSBmcnVzdHVtLndpZHRoOwogICAgICBmcnVzdHVtLl9uZWFyID0gZnJ1c3R1bS5uZWFyOwogICAgICBmcnVzdHVtLl9mYXIgPSBmcnVzdHVtLmZhcjsKICAgICAgY29uc3QgcmF0aW8gPSAxIC8gZnJ1c3R1bS5hc3BlY3RSYXRpbzsKICAgICAgZi5yaWdodCA9IGZydXN0dW0ud2lkdGggKiAwLjU7CiAgICAgIGYubGVmdCA9IC1mLnJpZ2h0OwogICAgICBmLnRvcCA9IHJhdGlvICogZi5yaWdodDsKICAgICAgZi5ib3R0b20gPSAtZi50b3A7CiAgICAgIGYubmVhciA9IGZydXN0dW0ubmVhcjsKICAgICAgZi5mYXIgPSBmcnVzdHVtLmZhcjsKICAgIH0KICB9CiAgdmFyIE9ydGhvZ3JhcGhpY0ZydXN0dW1fZGVmYXVsdDsKICB2YXIgaW5pdF9PcnRob2dyYXBoaWNGcnVzdHVtID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9PcnRob2dyYXBoaWNGcnVzdHVtLmpzIigpIHsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X0Zyb3plbigpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9PcnRob2dyYXBoaWNPZmZDZW50ZXJGcnVzdHVtKCk7CiAgICAgIE9ydGhvZ3JhcGhpY0ZydXN0dW0ucGFja2VkTGVuZ3RoID0gNDsKICAgICAgT3J0aG9ncmFwaGljRnJ1c3R1bS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLndpZHRoOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5hc3BlY3RSYXRpbzsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUubmVhcjsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4XSA9IHZhbHVlLmZhcjsKICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH07CiAgICAgIE9ydGhvZ3JhcGhpY0ZydXN0dW0udW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgT3J0aG9ncmFwaGljRnJ1c3R1bSgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQud2lkdGggPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdC5hc3BlY3RSYXRpbyA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0Lm5lYXIgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdC5mYXIgPSBhcnJheVtzdGFydGluZ0luZGV4XTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPcnRob2dyYXBoaWNGcnVzdHVtLnByb3RvdHlwZSwgewogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIG1hdHJpeCBjb21wdXRlZCBmcm9tIHRoZSB2aWV3IGZydXN0dW0uCiAgICAgICAgICogQG1lbWJlcm9mIE9ydGhvZ3JhcGhpY0ZydXN0dW0ucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge01hdHJpeDR9CiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICovCiAgICAgICAgcHJvamVjdGlvbk1hdHJpeDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdXBkYXRlMih0aGlzKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29mZkNlbnRlckZydXN0dW0ucHJvamVjdGlvbk1hdHJpeDsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIG1hdHJpeCBjb21wdXRlZCBmcm9tIHRoZSB2aWV3IGZydXN0dW0uCiAgICAgICAgICogQG1lbWJlcm9mIE9ydGhvZ3JhcGhpY0ZydXN0dW0ucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge09ydGhvZ3JhcGhpY09mZkNlbnRlckZydXN0dW19CiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBvZmZDZW50ZXJGcnVzdHVtOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB1cGRhdGUyKHRoaXMpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fb2ZmQ2VudGVyRnJ1c3R1bTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBPcnRob2dyYXBoaWNGcnVzdHVtLnByb3RvdHlwZS5jb21wdXRlQ3VsbGluZ1ZvbHVtZSA9IGZ1bmN0aW9uKHBvc2l0aW9uLCBkaXJlY3Rpb24yLCB1cCkgewogICAgICAgIHVwZGF0ZTIodGhpcyk7CiAgICAgICAgcmV0dXJuIHRoaXMuX29mZkNlbnRlckZydXN0dW0uY29tcHV0ZUN1bGxpbmdWb2x1bWUocG9zaXRpb24sIGRpcmVjdGlvbjIsIHVwKTsKICAgICAgfTsKICAgICAgT3J0aG9ncmFwaGljRnJ1c3R1bS5wcm90b3R5cGUuZ2V0UGl4ZWxEaW1lbnNpb25zID0gZnVuY3Rpb24oZHJhd2luZ0J1ZmZlcldpZHRoLCBkcmF3aW5nQnVmZmVySGVpZ2h0LCBkaXN0YW5jZSwgcGl4ZWxSYXRpbywgcmVzdWx0KSB7CiAgICAgICAgdXBkYXRlMih0aGlzKTsKICAgICAgICByZXR1cm4gdGhpcy5fb2ZmQ2VudGVyRnJ1c3R1bS5nZXRQaXhlbERpbWVuc2lvbnMoCiAgICAgICAgICBkcmF3aW5nQnVmZmVyV2lkdGgsCiAgICAgICAgICBkcmF3aW5nQnVmZmVySGVpZ2h0LAogICAgICAgICAgZGlzdGFuY2UsCiAgICAgICAgICBwaXhlbFJhdGlvLAogICAgICAgICAgcmVzdWx0CiAgICAgICAgKTsKICAgICAgfTsKICAgICAgT3J0aG9ncmFwaGljRnJ1c3R1bS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgT3J0aG9ncmFwaGljRnJ1c3R1bSgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQuYXNwZWN0UmF0aW8gPSB0aGlzLmFzcGVjdFJhdGlvOwogICAgICAgIHJlc3VsdC53aWR0aCA9IHRoaXMud2lkdGg7CiAgICAgICAgcmVzdWx0Lm5lYXIgPSB0aGlzLm5lYXI7CiAgICAgICAgcmVzdWx0LmZhciA9IHRoaXMuZmFyOwogICAgICAgIHJlc3VsdC5fYXNwZWN0UmF0aW8gPSB2b2lkIDA7CiAgICAgICAgcmVzdWx0Ll93aWR0aCA9IHZvaWQgMDsKICAgICAgICByZXN1bHQuX25lYXIgPSB2b2lkIDA7CiAgICAgICAgcmVzdWx0Ll9mYXIgPSB2b2lkIDA7CiAgICAgICAgdGhpcy5fb2ZmQ2VudGVyRnJ1c3R1bS5jbG9uZShyZXN1bHQuX29mZkNlbnRlckZydXN0dW0pOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE9ydGhvZ3JhcGhpY0ZydXN0dW0ucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uKG90aGVyKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQob3RoZXIpIHx8ICEob3RoZXIgaW5zdGFuY2VvZiBPcnRob2dyYXBoaWNGcnVzdHVtKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICB1cGRhdGUyKHRoaXMpOwogICAgICAgIHVwZGF0ZTIob3RoZXIpOwogICAgICAgIHJldHVybiB0aGlzLndpZHRoID09PSBvdGhlci53aWR0aCAmJiB0aGlzLmFzcGVjdFJhdGlvID09PSBvdGhlci5hc3BlY3RSYXRpbyAmJiB0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLmVxdWFscyhvdGhlci5fb2ZmQ2VudGVyRnJ1c3R1bSk7CiAgICAgIH07CiAgICAgIE9ydGhvZ3JhcGhpY0ZydXN0dW0ucHJvdG90eXBlLmVxdWFsc0Vwc2lsb24gPSBmdW5jdGlvbihvdGhlciwgcmVsYXRpdmVFcHNpbG9uLCBhYnNvbHV0ZUVwc2lsb24pIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChvdGhlcikgfHwgIShvdGhlciBpbnN0YW5jZW9mIE9ydGhvZ3JhcGhpY0ZydXN0dW0pKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZTIodGhpcyk7CiAgICAgICAgdXBkYXRlMihvdGhlcik7CiAgICAgICAgcmV0dXJuIE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgdGhpcy53aWR0aCwKICAgICAgICAgIG90aGVyLndpZHRoLAogICAgICAgICAgcmVsYXRpdmVFcHNpbG9uLAogICAgICAgICAgYWJzb2x1dGVFcHNpbG9uCiAgICAgICAgKSAmJiBNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgIHRoaXMuYXNwZWN0UmF0aW8sCiAgICAgICAgICBvdGhlci5hc3BlY3RSYXRpbywKICAgICAgICAgIHJlbGF0aXZlRXBzaWxvbiwKICAgICAgICAgIGFic29sdXRlRXBzaWxvbgogICAgICAgICkgJiYgdGhpcy5fb2ZmQ2VudGVyRnJ1c3R1bS5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgb3RoZXIuX29mZkNlbnRlckZydXN0dW0sCiAgICAgICAgICByZWxhdGl2ZUVwc2lsb24sCiAgICAgICAgICBhYnNvbHV0ZUVwc2lsb24KICAgICAgICApOwogICAgICB9OwogICAgICBPcnRob2dyYXBoaWNGcnVzdHVtX2RlZmF1bHQgPSBPcnRob2dyYXBoaWNGcnVzdHVtOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUGVyc3BlY3RpdmVPZmZDZW50ZXJGcnVzdHVtLmpzCiAgZnVuY3Rpb24gUGVyc3BlY3RpdmVPZmZDZW50ZXJGcnVzdHVtKG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgIHRoaXMubGVmdCA9IG9wdGlvbnMubGVmdDsKICAgIHRoaXMuX2xlZnQgPSB2b2lkIDA7CiAgICB0aGlzLnJpZ2h0ID0gb3B0aW9ucy5yaWdodDsKICAgIHRoaXMuX3JpZ2h0ID0gdm9pZCAwOwogICAgdGhpcy50b3AgPSBvcHRpb25zLnRvcDsKICAgIHRoaXMuX3RvcCA9IHZvaWQgMDsKICAgIHRoaXMuYm90dG9tID0gb3B0aW9ucy5ib3R0b207CiAgICB0aGlzLl9ib3R0b20gPSB2b2lkIDA7CiAgICB0aGlzLm5lYXIgPSBvcHRpb25zLm5lYXIgPz8gMTsKICAgIHRoaXMuX25lYXIgPSB0aGlzLm5lYXI7CiAgICB0aGlzLmZhciA9IG9wdGlvbnMuZmFyID8/IDVlODsKICAgIHRoaXMuX2ZhciA9IHRoaXMuZmFyOwogICAgdGhpcy5fY3VsbGluZ1ZvbHVtZSA9IG5ldyBDdWxsaW5nVm9sdW1lX2RlZmF1bHQoKTsKICAgIHRoaXMuX3BlcnNwZWN0aXZlTWF0cml4ID0gbmV3IE1hdHJpeDRfZGVmYXVsdCgpOwogICAgdGhpcy5faW5maW5pdGVQZXJzcGVjdGl2ZSA9IG5ldyBNYXRyaXg0X2RlZmF1bHQoKTsKICB9CiAgZnVuY3Rpb24gdXBkYXRlMyhmcnVzdHVtKSB7CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChmcnVzdHVtLnJpZ2h0KSB8fCAhZGVmaW5lZF9kZWZhdWx0KGZydXN0dW0ubGVmdCkgfHwgIWRlZmluZWRfZGVmYXVsdChmcnVzdHVtLnRvcCkgfHwgIWRlZmluZWRfZGVmYXVsdChmcnVzdHVtLmJvdHRvbSkgfHwgIWRlZmluZWRfZGVmYXVsdChmcnVzdHVtLm5lYXIpIHx8ICFkZWZpbmVkX2RlZmF1bHQoZnJ1c3R1bS5mYXIpKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICJyaWdodCwgbGVmdCwgdG9wLCBib3R0b20sIG5lYXIsIG9yIGZhciBwYXJhbWV0ZXJzIGFyZSBub3Qgc2V0LiIKICAgICAgKTsKICAgIH0KICAgIGNvbnN0IHsgdG9wLCBib3R0b20sIHJpZ2h0LCBsZWZ0LCBuZWFyLCBmYXIgfSA9IGZydXN0dW07CiAgICBjb25zdCBjaGFuZ2VkID0gdG9wICE9PSBmcnVzdHVtLl90b3AgfHwgYm90dG9tICE9PSBmcnVzdHVtLl9ib3R0b20gfHwgbGVmdCAhPT0gZnJ1c3R1bS5fbGVmdCB8fCByaWdodCAhPT0gZnJ1c3R1bS5fcmlnaHQgfHwgbmVhciAhPT0gZnJ1c3R1bS5fbmVhciB8fCBmYXIgIT09IGZydXN0dW0uX2ZhcjsKICAgIGlmICghY2hhbmdlZCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZnJ1c3R1bS5uZWFyIDw9IDAgfHwgZnJ1c3R1bS5uZWFyID4gZnJ1c3R1bS5mYXIpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgIm5lYXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyBhbmQgbGVzcyB0aGFuIGZhci4iCiAgICAgICk7CiAgICB9CiAgICBmcnVzdHVtLl9sZWZ0ID0gbGVmdDsKICAgIGZydXN0dW0uX3JpZ2h0ID0gcmlnaHQ7CiAgICBmcnVzdHVtLl90b3AgPSB0b3A7CiAgICBmcnVzdHVtLl9ib3R0b20gPSBib3R0b207CiAgICBmcnVzdHVtLl9uZWFyID0gbmVhcjsKICAgIGZydXN0dW0uX2ZhciA9IGZhcjsKICAgIGZydXN0dW0uX3BlcnNwZWN0aXZlTWF0cml4ID0gTWF0cml4NF9kZWZhdWx0LmNvbXB1dGVQZXJzcGVjdGl2ZU9mZkNlbnRlcigKICAgICAgbGVmdCwKICAgICAgcmlnaHQsCiAgICAgIGJvdHRvbSwKICAgICAgdG9wLAogICAgICBuZWFyLAogICAgICBmYXIsCiAgICAgIGZydXN0dW0uX3BlcnNwZWN0aXZlTWF0cml4CiAgICApOwogICAgZnJ1c3R1bS5faW5maW5pdGVQZXJzcGVjdGl2ZSA9IE1hdHJpeDRfZGVmYXVsdC5jb21wdXRlSW5maW5pdGVQZXJzcGVjdGl2ZU9mZkNlbnRlcigKICAgICAgbGVmdCwKICAgICAgcmlnaHQsCiAgICAgIGJvdHRvbSwKICAgICAgdG9wLAogICAgICBuZWFyLAogICAgICBmcnVzdHVtLl9pbmZpbml0ZVBlcnNwZWN0aXZlCiAgICApOwogIH0KICB2YXIgZ2V0UGxhbmVzUmlnaHQyLCBnZXRQbGFuZXNOZWFyQ2VudGVyMiwgZ2V0UGxhbmVzRmFyQ2VudGVyLCBnZXRQbGFuZXNOb3JtYWwsIFBlcnNwZWN0aXZlT2ZmQ2VudGVyRnJ1c3R1bV9kZWZhdWx0OwogIHZhciBpbml0X1BlcnNwZWN0aXZlT2ZmQ2VudGVyRnJ1c3R1bSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUGVyc3BlY3RpdmVPZmZDZW50ZXJGcnVzdHVtLmpzIigpIHsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuNCgpOwogICAgICBpbml0X0N1bGxpbmdWb2x1bWUoKTsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGluaXRfTWF0cml4NCgpOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhQZXJzcGVjdGl2ZU9mZkNlbnRlckZydXN0dW0ucHJvdG90eXBlLCB7CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggY29tcHV0ZWQgZnJvbSB0aGUgdmlldyBmcnVzdHVtLgogICAgICAgICAqIFRoZSBwcm9qZWN0aW9uIG1hdHJpeCB3aWxsIGJlIHJlY29tcHV0ZWQgaWYgYW55IGZydXN0dW0gcGFyYW1ldGVycyBoYXZlIGNoYW5nZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgUGVyc3BlY3RpdmVPZmZDZW50ZXJGcnVzdHVtLnByb3RvdHlwZQogICAgICAgICAqIEB0eXBlIHtNYXRyaXg0fQogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqCiAgICAgICAgICogQHNlZSBQZXJzcGVjdGl2ZU9mZkNlbnRlckZydXN0dW0jaW5maW5pdGVQcm9qZWN0aW9uTWF0cml4CiAgICAgICAgICovCiAgICAgICAgcHJvamVjdGlvbk1hdHJpeDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdXBkYXRlMyh0aGlzKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BlcnNwZWN0aXZlTWF0cml4OwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggY29tcHV0ZWQgZnJvbSB0aGUgdmlldyBmcnVzdHVtIHdpdGggYW4gaW5maW5pdGUgZmFyIHBsYW5lLgogICAgICAgICAqIEBtZW1iZXJvZiBQZXJzcGVjdGl2ZU9mZkNlbnRlckZydXN0dW0ucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge01hdHJpeDR9CiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIFBlcnNwZWN0aXZlT2ZmQ2VudGVyRnJ1c3R1bSNwcm9qZWN0aW9uTWF0cml4CiAgICAgICAgICovCiAgICAgICAgaW5maW5pdGVQcm9qZWN0aW9uTWF0cml4OiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB1cGRhdGUzKHRoaXMpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5faW5maW5pdGVQZXJzcGVjdGl2ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBnZXRQbGFuZXNSaWdodDIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGdldFBsYW5lc05lYXJDZW50ZXIyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBnZXRQbGFuZXNGYXJDZW50ZXIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGdldFBsYW5lc05vcm1hbCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgUGVyc3BlY3RpdmVPZmZDZW50ZXJGcnVzdHVtLnByb3RvdHlwZS5jb21wdXRlQ3VsbGluZ1ZvbHVtZSA9IGZ1bmN0aW9uKHBvc2l0aW9uLCBkaXJlY3Rpb24yLCB1cCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHBvc2l0aW9uKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInBvc2l0aW9uIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChkaXJlY3Rpb24yKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImRpcmVjdGlvbiBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodXApKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgidXAgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYW5lcyA9IHRoaXMuX2N1bGxpbmdWb2x1bWUucGxhbmVzOwogICAgICAgIGNvbnN0IHQgPSB0aGlzLnRvcDsKICAgICAgICBjb25zdCBiID0gdGhpcy5ib3R0b207CiAgICAgICAgY29uc3QgciA9IHRoaXMucmlnaHQ7CiAgICAgICAgY29uc3QgbCA9IHRoaXMubGVmdDsKICAgICAgICBjb25zdCBuID0gdGhpcy5uZWFyOwogICAgICAgIGNvbnN0IGYgPSB0aGlzLmZhcjsKICAgICAgICBjb25zdCByaWdodCA9IENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhkaXJlY3Rpb24yLCB1cCwgZ2V0UGxhbmVzUmlnaHQyKTsKICAgICAgICBjb25zdCBuZWFyQ2VudGVyID0gZ2V0UGxhbmVzTmVhckNlbnRlcjI7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoZGlyZWN0aW9uMiwgbiwgbmVhckNlbnRlcik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChwb3NpdGlvbiwgbmVhckNlbnRlciwgbmVhckNlbnRlcik7CiAgICAgICAgY29uc3QgZmFyQ2VudGVyID0gZ2V0UGxhbmVzRmFyQ2VudGVyOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKGRpcmVjdGlvbjIsIGYsIGZhckNlbnRlcik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChwb3NpdGlvbiwgZmFyQ2VudGVyLCBmYXJDZW50ZXIpOwogICAgICAgIGNvbnN0IG5vcm1hbDIgPSBnZXRQbGFuZXNOb3JtYWw7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIocmlnaHQsIGwsIG5vcm1hbDIpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQobmVhckNlbnRlciwgbm9ybWFsMiwgbm9ybWFsMik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KG5vcm1hbDIsIHBvc2l0aW9uLCBub3JtYWwyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKG5vcm1hbDIsIG5vcm1hbDIpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhub3JtYWwyLCB1cCwgbm9ybWFsMik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShub3JtYWwyLCBub3JtYWwyKTsKICAgICAgICBsZXQgcGxhbmUgPSBwbGFuZXNbMF07CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocGxhbmUpKSB7CiAgICAgICAgICBwbGFuZSA9IHBsYW5lc1swXSA9IG5ldyBDYXJ0ZXNpYW40X2RlZmF1bHQoKTsKICAgICAgICB9CiAgICAgICAgcGxhbmUueCA9IG5vcm1hbDIueDsKICAgICAgICBwbGFuZS55ID0gbm9ybWFsMi55OwogICAgICAgIHBsYW5lLnogPSBub3JtYWwyLno7CiAgICAgICAgcGxhbmUudyA9IC1DYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KG5vcm1hbDIsIHBvc2l0aW9uKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihyaWdodCwgciwgbm9ybWFsMik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChuZWFyQ2VudGVyLCBub3JtYWwyLCBub3JtYWwyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3Qobm9ybWFsMiwgcG9zaXRpb24sIG5vcm1hbDIpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyh1cCwgbm9ybWFsMiwgbm9ybWFsMik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShub3JtYWwyLCBub3JtYWwyKTsKICAgICAgICBwbGFuZSA9IHBsYW5lc1sxXTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwbGFuZSkpIHsKICAgICAgICAgIHBsYW5lID0gcGxhbmVzWzFdID0gbmV3IENhcnRlc2lhbjRfZGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgICBwbGFuZS54ID0gbm9ybWFsMi54OwogICAgICAgIHBsYW5lLnkgPSBub3JtYWwyLnk7CiAgICAgICAgcGxhbmUueiA9IG5vcm1hbDIuejsKICAgICAgICBwbGFuZS53ID0gLUNhcnRlc2lhbjNfZGVmYXVsdC5kb3Qobm9ybWFsMiwgcG9zaXRpb24pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKHVwLCBiLCBub3JtYWwyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKG5lYXJDZW50ZXIsIG5vcm1hbDIsIG5vcm1hbDIpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChub3JtYWwyLCBwb3NpdGlvbiwgbm9ybWFsMik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKHJpZ2h0LCBub3JtYWwyLCBub3JtYWwyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKG5vcm1hbDIsIG5vcm1hbDIpOwogICAgICAgIHBsYW5lID0gcGxhbmVzWzJdOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHBsYW5lKSkgewogICAgICAgICAgcGxhbmUgPSBwbGFuZXNbMl0gPSBuZXcgQ2FydGVzaWFuNF9kZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIHBsYW5lLnggPSBub3JtYWwyLng7CiAgICAgICAgcGxhbmUueSA9IG5vcm1hbDIueTsKICAgICAgICBwbGFuZS56ID0gbm9ybWFsMi56OwogICAgICAgIHBsYW5lLncgPSAtQ2FydGVzaWFuM19kZWZhdWx0LmRvdChub3JtYWwyLCBwb3NpdGlvbik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIodXAsIHQsIG5vcm1hbDIpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQobmVhckNlbnRlciwgbm9ybWFsMiwgbm9ybWFsMik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KG5vcm1hbDIsIHBvc2l0aW9uLCBub3JtYWwyKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3Mobm9ybWFsMiwgcmlnaHQsIG5vcm1hbDIpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUobm9ybWFsMiwgbm9ybWFsMik7CiAgICAgICAgcGxhbmUgPSBwbGFuZXNbM107CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocGxhbmUpKSB7CiAgICAgICAgICBwbGFuZSA9IHBsYW5lc1szXSA9IG5ldyBDYXJ0ZXNpYW40X2RlZmF1bHQoKTsKICAgICAgICB9CiAgICAgICAgcGxhbmUueCA9IG5vcm1hbDIueDsKICAgICAgICBwbGFuZS55ID0gbm9ybWFsMi55OwogICAgICAgIHBsYW5lLnogPSBub3JtYWwyLno7CiAgICAgICAgcGxhbmUudyA9IC1DYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KG5vcm1hbDIsIHBvc2l0aW9uKTsKICAgICAgICBwbGFuZSA9IHBsYW5lc1s0XTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwbGFuZSkpIHsKICAgICAgICAgIHBsYW5lID0gcGxhbmVzWzRdID0gbmV3IENhcnRlc2lhbjRfZGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgICBwbGFuZS54ID0gZGlyZWN0aW9uMi54OwogICAgICAgIHBsYW5lLnkgPSBkaXJlY3Rpb24yLnk7CiAgICAgICAgcGxhbmUueiA9IGRpcmVjdGlvbjIuejsKICAgICAgICBwbGFuZS53ID0gLUNhcnRlc2lhbjNfZGVmYXVsdC5kb3QoZGlyZWN0aW9uMiwgbmVhckNlbnRlcik7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZShkaXJlY3Rpb24yLCBub3JtYWwyKTsKICAgICAgICBwbGFuZSA9IHBsYW5lc1s1XTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwbGFuZSkpIHsKICAgICAgICAgIHBsYW5lID0gcGxhbmVzWzVdID0gbmV3IENhcnRlc2lhbjRfZGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgICBwbGFuZS54ID0gbm9ybWFsMi54OwogICAgICAgIHBsYW5lLnkgPSBub3JtYWwyLnk7CiAgICAgICAgcGxhbmUueiA9IG5vcm1hbDIuejsKICAgICAgICBwbGFuZS53ID0gLUNhcnRlc2lhbjNfZGVmYXVsdC5kb3Qobm9ybWFsMiwgZmFyQ2VudGVyKTsKICAgICAgICByZXR1cm4gdGhpcy5fY3VsbGluZ1ZvbHVtZTsKICAgICAgfTsKICAgICAgUGVyc3BlY3RpdmVPZmZDZW50ZXJGcnVzdHVtLnByb3RvdHlwZS5nZXRQaXhlbERpbWVuc2lvbnMgPSBmdW5jdGlvbihkcmF3aW5nQnVmZmVyV2lkdGgsIGRyYXdpbmdCdWZmZXJIZWlnaHQsIGRpc3RhbmNlLCBwaXhlbFJhdGlvLCByZXN1bHQpIHsKICAgICAgICB1cGRhdGUzKHRoaXMpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGRyYXdpbmdCdWZmZXJXaWR0aCkgfHwgIWRlZmluZWRfZGVmYXVsdChkcmF3aW5nQnVmZmVySGVpZ2h0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJCb3RoIGRyYXdpbmdCdWZmZXJXaWR0aCBhbmQgZHJhd2luZ0J1ZmZlckhlaWdodCBhcmUgcmVxdWlyZWQuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKGRyYXdpbmdCdWZmZXJXaWR0aCA8PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZHJhd2luZ0J1ZmZlcldpZHRoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7CiAgICAgICAgfQogICAgICAgIGlmIChkcmF3aW5nQnVmZmVySGVpZ2h0IDw9IDApIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJkcmF3aW5nQnVmZmVySGVpZ2h0IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGRpc3RhbmNlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImRpc3RhbmNlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwaXhlbFJhdGlvKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInBpeGVsUmF0aW8gaXMgcmVxdWlyZWQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBpeGVsUmF0aW8gPD0gMCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInBpeGVsUmF0aW8gbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIkEgcmVzdWx0IG9iamVjdCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaW52ZXJzZU5lYXIgPSAxIC8gdGhpcy5uZWFyOwogICAgICAgIGxldCB0YW5UaGV0YSA9IHRoaXMudG9wICogaW52ZXJzZU5lYXI7CiAgICAgICAgY29uc3QgcGl4ZWxIZWlnaHQgPSAyICogcGl4ZWxSYXRpbyAqIGRpc3RhbmNlICogdGFuVGhldGEgLyBkcmF3aW5nQnVmZmVySGVpZ2h0OwogICAgICAgIHRhblRoZXRhID0gdGhpcy5yaWdodCAqIGludmVyc2VOZWFyOwogICAgICAgIGNvbnN0IHBpeGVsV2lkdGggPSAyICogcGl4ZWxSYXRpbyAqIGRpc3RhbmNlICogdGFuVGhldGEgLyBkcmF3aW5nQnVmZmVyV2lkdGg7CiAgICAgICAgcmVzdWx0LnggPSBwaXhlbFdpZHRoOwogICAgICAgIHJlc3VsdC55ID0gcGl4ZWxIZWlnaHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgUGVyc3BlY3RpdmVPZmZDZW50ZXJGcnVzdHVtLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBQZXJzcGVjdGl2ZU9mZkNlbnRlckZydXN0dW0oKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnJpZ2h0ID0gdGhpcy5yaWdodDsKICAgICAgICByZXN1bHQubGVmdCA9IHRoaXMubGVmdDsKICAgICAgICByZXN1bHQudG9wID0gdGhpcy50b3A7CiAgICAgICAgcmVzdWx0LmJvdHRvbSA9IHRoaXMuYm90dG9tOwogICAgICAgIHJlc3VsdC5uZWFyID0gdGhpcy5uZWFyOwogICAgICAgIHJlc3VsdC5mYXIgPSB0aGlzLmZhcjsKICAgICAgICByZXN1bHQuX2xlZnQgPSB2b2lkIDA7CiAgICAgICAgcmVzdWx0Ll9yaWdodCA9IHZvaWQgMDsKICAgICAgICByZXN1bHQuX3RvcCA9IHZvaWQgMDsKICAgICAgICByZXN1bHQuX2JvdHRvbSA9IHZvaWQgMDsKICAgICAgICByZXN1bHQuX25lYXIgPSB2b2lkIDA7CiAgICAgICAgcmVzdWx0Ll9mYXIgPSB2b2lkIDA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgUGVyc3BlY3RpdmVPZmZDZW50ZXJGcnVzdHVtLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbihvdGhlcikgewogICAgICAgIHJldHVybiBkZWZpbmVkX2RlZmF1bHQob3RoZXIpICYmIG90aGVyIGluc3RhbmNlb2YgUGVyc3BlY3RpdmVPZmZDZW50ZXJGcnVzdHVtICYmIHRoaXMucmlnaHQgPT09IG90aGVyLnJpZ2h0ICYmIHRoaXMubGVmdCA9PT0gb3RoZXIubGVmdCAmJiB0aGlzLnRvcCA9PT0gb3RoZXIudG9wICYmIHRoaXMuYm90dG9tID09PSBvdGhlci5ib3R0b20gJiYgdGhpcy5uZWFyID09PSBvdGhlci5uZWFyICYmIHRoaXMuZmFyID09PSBvdGhlci5mYXI7CiAgICAgIH07CiAgICAgIFBlcnNwZWN0aXZlT2ZmQ2VudGVyRnJ1c3R1bS5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbiA9IGZ1bmN0aW9uKG90aGVyLCByZWxhdGl2ZUVwc2lsb24sIGFic29sdXRlRXBzaWxvbikgewogICAgICAgIHJldHVybiBvdGhlciA9PT0gdGhpcyB8fCBkZWZpbmVkX2RlZmF1bHQob3RoZXIpICYmIG90aGVyIGluc3RhbmNlb2YgUGVyc3BlY3RpdmVPZmZDZW50ZXJGcnVzdHVtICYmIE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgdGhpcy5yaWdodCwKICAgICAgICAgIG90aGVyLnJpZ2h0LAogICAgICAgICAgcmVsYXRpdmVFcHNpbG9uLAogICAgICAgICAgYWJzb2x1dGVFcHNpbG9uCiAgICAgICAgKSAmJiBNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgIHRoaXMubGVmdCwKICAgICAgICAgIG90aGVyLmxlZnQsCiAgICAgICAgICByZWxhdGl2ZUVwc2lsb24sCiAgICAgICAgICBhYnNvbHV0ZUVwc2lsb24KICAgICAgICApICYmIE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgdGhpcy50b3AsCiAgICAgICAgICBvdGhlci50b3AsCiAgICAgICAgICByZWxhdGl2ZUVwc2lsb24sCiAgICAgICAgICBhYnNvbHV0ZUVwc2lsb24KICAgICAgICApICYmIE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgdGhpcy5ib3R0b20sCiAgICAgICAgICBvdGhlci5ib3R0b20sCiAgICAgICAgICByZWxhdGl2ZUVwc2lsb24sCiAgICAgICAgICBhYnNvbHV0ZUVwc2lsb24KICAgICAgICApICYmIE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgdGhpcy5uZWFyLAogICAgICAgICAgb3RoZXIubmVhciwKICAgICAgICAgIHJlbGF0aXZlRXBzaWxvbiwKICAgICAgICAgIGFic29sdXRlRXBzaWxvbgogICAgICAgICkgJiYgTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oCiAgICAgICAgICB0aGlzLmZhciwKICAgICAgICAgIG90aGVyLmZhciwKICAgICAgICAgIHJlbGF0aXZlRXBzaWxvbiwKICAgICAgICAgIGFic29sdXRlRXBzaWxvbgogICAgICAgICk7CiAgICAgIH07CiAgICAgIFBlcnNwZWN0aXZlT2ZmQ2VudGVyRnJ1c3R1bV9kZWZhdWx0ID0gUGVyc3BlY3RpdmVPZmZDZW50ZXJGcnVzdHVtOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUGVyc3BlY3RpdmVGcnVzdHVtLmpzCiAgZnVuY3Rpb24gUGVyc3BlY3RpdmVGcnVzdHVtKG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgIHRoaXMuX29mZkNlbnRlckZydXN0dW0gPSBuZXcgUGVyc3BlY3RpdmVPZmZDZW50ZXJGcnVzdHVtX2RlZmF1bHQoKTsKICAgIHRoaXMuZm92ID0gb3B0aW9ucy5mb3Y7CiAgICB0aGlzLl9mb3YgPSB2b2lkIDA7CiAgICB0aGlzLl9mb3Z5ID0gdm9pZCAwOwogICAgdGhpcy5fc3NlRGVub21pbmF0b3IgPSB2b2lkIDA7CiAgICB0aGlzLmFzcGVjdFJhdGlvID0gb3B0aW9ucy5hc3BlY3RSYXRpbzsKICAgIHRoaXMuX2FzcGVjdFJhdGlvID0gdm9pZCAwOwogICAgdGhpcy5uZWFyID0gb3B0aW9ucy5uZWFyID8/IDE7CiAgICB0aGlzLl9uZWFyID0gdGhpcy5uZWFyOwogICAgdGhpcy5mYXIgPSBvcHRpb25zLmZhciA/PyA1ZTg7CiAgICB0aGlzLl9mYXIgPSB0aGlzLmZhcjsKICAgIHRoaXMueE9mZnNldCA9IG9wdGlvbnMueE9mZnNldCA/PyAwOwogICAgdGhpcy5feE9mZnNldCA9IHRoaXMueE9mZnNldDsKICAgIHRoaXMueU9mZnNldCA9IG9wdGlvbnMueU9mZnNldCA/PyAwOwogICAgdGhpcy5feU9mZnNldCA9IHRoaXMueU9mZnNldDsKICB9CiAgZnVuY3Rpb24gdXBkYXRlNChmcnVzdHVtKSB7CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChmcnVzdHVtLmZvdikgfHwgIWRlZmluZWRfZGVmYXVsdChmcnVzdHVtLmFzcGVjdFJhdGlvKSB8fCAhZGVmaW5lZF9kZWZhdWx0KGZydXN0dW0ubmVhcikgfHwgIWRlZmluZWRfZGVmYXVsdChmcnVzdHVtLmZhcikpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgImZvdiwgYXNwZWN0UmF0aW8sIG5lYXIsIG9yIGZhciBwYXJhbWV0ZXJzIGFyZSBub3Qgc2V0LiIKICAgICAgKTsKICAgIH0KICAgIGNvbnN0IGNoYW5nZWQgPSBmcnVzdHVtLmZvdiAhPT0gZnJ1c3R1bS5fZm92IHx8IGZydXN0dW0uYXNwZWN0UmF0aW8gIT09IGZydXN0dW0uX2FzcGVjdFJhdGlvIHx8IGZydXN0dW0ubmVhciAhPT0gZnJ1c3R1bS5fbmVhciB8fCBmcnVzdHVtLmZhciAhPT0gZnJ1c3R1bS5fZmFyIHx8IGZydXN0dW0ueE9mZnNldCAhPT0gZnJ1c3R1bS5feE9mZnNldCB8fCBmcnVzdHVtLnlPZmZzZXQgIT09IGZydXN0dW0uX3lPZmZzZXQ7CiAgICBpZiAoIWNoYW5nZWQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImZvdiIsIGZydXN0dW0uZm92LCAwKTsKICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbigiZm92IiwgZnJ1c3R1bS5mb3YsIE1hdGguUEkpOwogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoCiAgICAgICJhc3BlY3RSYXRpbyIsCiAgICAgIGZydXN0dW0uYXNwZWN0UmF0aW8sCiAgICAgIDAKICAgICk7CiAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygibmVhciIsIGZydXN0dW0ubmVhciwgMCk7CiAgICBpZiAoZnJ1c3R1bS5uZWFyID4gZnJ1c3R1bS5mYXIpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm5lYXIgbXVzdCBiZSBsZXNzIHRoYW4gZmFyLiIpOwogICAgfQogICAgZnJ1c3R1bS5fYXNwZWN0UmF0aW8gPSBmcnVzdHVtLmFzcGVjdFJhdGlvOwogICAgZnJ1c3R1bS5fZm92ID0gZnJ1c3R1bS5mb3Y7CiAgICBmcnVzdHVtLl9mb3Z5ID0gZnJ1c3R1bS5hc3BlY3RSYXRpbyA8PSAxID8gZnJ1c3R1bS5mb3YgOiBNYXRoLmF0YW4oTWF0aC50YW4oZnJ1c3R1bS5mb3YgKiAwLjUpIC8gZnJ1c3R1bS5hc3BlY3RSYXRpbykgKiAyOwogICAgZnJ1c3R1bS5fbmVhciA9IGZydXN0dW0ubmVhcjsKICAgIGZydXN0dW0uX2ZhciA9IGZydXN0dW0uZmFyOwogICAgZnJ1c3R1bS5fc3NlRGVub21pbmF0b3IgPSAyICogTWF0aC50YW4oMC41ICogZnJ1c3R1bS5fZm92eSk7CiAgICBmcnVzdHVtLl94T2Zmc2V0ID0gZnJ1c3R1bS54T2Zmc2V0OwogICAgZnJ1c3R1bS5feU9mZnNldCA9IGZydXN0dW0ueU9mZnNldDsKICAgIGNvbnN0IGYgPSBmcnVzdHVtLl9vZmZDZW50ZXJGcnVzdHVtOwogICAgZi50b3AgPSBmcnVzdHVtLm5lYXIgKiBNYXRoLnRhbigwLjUgKiBmcnVzdHVtLl9mb3Z5KTsKICAgIGYuYm90dG9tID0gLWYudG9wOwogICAgZi5yaWdodCA9IGZydXN0dW0uYXNwZWN0UmF0aW8gKiBmLnRvcDsKICAgIGYubGVmdCA9IC1mLnJpZ2h0OwogICAgZi5uZWFyID0gZnJ1c3R1bS5uZWFyOwogICAgZi5mYXIgPSBmcnVzdHVtLmZhcjsKICAgIGYucmlnaHQgKz0gZnJ1c3R1bS54T2Zmc2V0OwogICAgZi5sZWZ0ICs9IGZydXN0dW0ueE9mZnNldDsKICAgIGYudG9wICs9IGZydXN0dW0ueU9mZnNldDsKICAgIGYuYm90dG9tICs9IGZydXN0dW0ueU9mZnNldDsKICB9CiAgdmFyIFBlcnNwZWN0aXZlRnJ1c3R1bV9kZWZhdWx0OwogIHZhciBpbml0X1BlcnNwZWN0aXZlRnJ1c3R1bSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUGVyc3BlY3RpdmVGcnVzdHVtLmpzIigpIHsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X0Zyb3plbigpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9QZXJzcGVjdGl2ZU9mZkNlbnRlckZydXN0dW0oKTsKICAgICAgUGVyc3BlY3RpdmVGcnVzdHVtLnBhY2tlZExlbmd0aCA9IDY7CiAgICAgIFBlcnNwZWN0aXZlRnJ1c3R1bS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLmZvdjsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuYXNwZWN0UmF0aW87CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLm5lYXI7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLmZhcjsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUueE9mZnNldDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4XSA9IHZhbHVlLnlPZmZzZXQ7CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9OwogICAgICBQZXJzcGVjdGl2ZUZydXN0dW0udW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgUGVyc3BlY3RpdmVGcnVzdHVtKCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5mb3YgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdC5hc3BlY3RSYXRpbyA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0Lm5lYXIgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdC5mYXIgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdC54T2Zmc2V0ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICByZXN1bHQueU9mZnNldCA9IGFycmF5W3N0YXJ0aW5nSW5kZXhdOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFBlcnNwZWN0aXZlRnJ1c3R1bS5wcm90b3R5cGUsIHsKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeCBjb21wdXRlZCBmcm9tIHRoZSB2aWV3IGZydXN0dW0uCiAgICAgICAgICogSWYgbmVjZXNzYXJ5LCB0aGUgcHJvamVjdGlvbiBtYXRyaXggd2lsbCBiZSByZWNvbXB1dGVkLgogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIFBlcnNwZWN0aXZlRnJ1c3R1bS5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7TWF0cml4NH0KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKgogICAgICAgICAqIEBzZWUgUGVyc3BlY3RpdmVPZmZDZW50ZXJGcnVzdHVtI3Byb2plY3Rpb25NYXRyaXguCiAgICAgICAgICogQHNlZSBQZXJzcGVjdGl2ZUZydXN0dW0jaW5maW5pdGVQcm9qZWN0aW9uTWF0cml4CiAgICAgICAgICovCiAgICAgICAgcHJvamVjdGlvbk1hdHJpeDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdXBkYXRlNCh0aGlzKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29mZkNlbnRlckZydXN0dW0ucHJvamVjdGlvbk1hdHJpeDsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeCBjb21wdXRlZCBmcm9tIHRoZSB2aWV3IGZydXN0dW0gd2l0aCBhbiBpbmZpbml0ZSBmYXIgcGxhbmUuCiAgICAgICAgICogQG1lbWJlcm9mIFBlcnNwZWN0aXZlRnJ1c3R1bS5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7TWF0cml4NH0KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKgogICAgICAgICAqIEBzZWUgUGVyc3BlY3RpdmVGcnVzdHVtI3Byb2plY3Rpb25NYXRyaXgKICAgICAgICAgKi8KICAgICAgICBpbmZpbml0ZVByb2plY3Rpb25NYXRyaXg6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHVwZGF0ZTQodGhpcyk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLmluZmluaXRlUHJvamVjdGlvbk1hdHJpeDsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGFuZ2xlIG9mIHRoZSB2ZXJ0aWNhbCBmaWVsZCBvZiB2aWV3LCBpbiByYWRpYW5zLgogICAgICAgICAqIEBtZW1iZXJvZiBQZXJzcGVjdGl2ZUZydXN0dW0ucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge251bWJlcnx1bmRlZmluZWR9CiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICogQGRlZmF1bHQgdW5kZWZpbmVkCiAgICAgICAgICovCiAgICAgICAgZm92eTogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdXBkYXRlNCh0aGlzKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvdnk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIHNzZURlbm9taW5hdG9yOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB1cGRhdGU0KHRoaXMpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fc3NlRGVub21pbmF0b3I7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBtYXRyaXggY29tcHV0ZWQgZnJvbSB0aGUgdmlldyBmcnVzdHVtLgogICAgICAgICAqIEBtZW1iZXJvZiBQZXJzcGVjdGl2ZUZydXN0dW0ucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge1BlcnNwZWN0aXZlT2ZmQ2VudGVyRnJ1c3R1bX0KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIG9mZkNlbnRlckZydXN0dW06IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHVwZGF0ZTQodGhpcyk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vZmZDZW50ZXJGcnVzdHVtOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIFBlcnNwZWN0aXZlRnJ1c3R1bS5wcm90b3R5cGUuY29tcHV0ZUN1bGxpbmdWb2x1bWUgPSBmdW5jdGlvbihwb3NpdGlvbiwgZGlyZWN0aW9uMiwgdXApIHsKICAgICAgICB1cGRhdGU0KHRoaXMpOwogICAgICAgIHJldHVybiB0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLmNvbXB1dGVDdWxsaW5nVm9sdW1lKHBvc2l0aW9uLCBkaXJlY3Rpb24yLCB1cCk7CiAgICAgIH07CiAgICAgIFBlcnNwZWN0aXZlRnJ1c3R1bS5wcm90b3R5cGUuZ2V0UGl4ZWxEaW1lbnNpb25zID0gZnVuY3Rpb24oZHJhd2luZ0J1ZmZlcldpZHRoLCBkcmF3aW5nQnVmZmVySGVpZ2h0LCBkaXN0YW5jZSwgcGl4ZWxSYXRpbywgcmVzdWx0KSB7CiAgICAgICAgdXBkYXRlNCh0aGlzKTsKICAgICAgICByZXR1cm4gdGhpcy5fb2ZmQ2VudGVyRnJ1c3R1bS5nZXRQaXhlbERpbWVuc2lvbnMoCiAgICAgICAgICBkcmF3aW5nQnVmZmVyV2lkdGgsCiAgICAgICAgICBkcmF3aW5nQnVmZmVySGVpZ2h0LAogICAgICAgICAgZGlzdGFuY2UsCiAgICAgICAgICBwaXhlbFJhdGlvLAogICAgICAgICAgcmVzdWx0CiAgICAgICAgKTsKICAgICAgfTsKICAgICAgUGVyc3BlY3RpdmVGcnVzdHVtLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBQZXJzcGVjdGl2ZUZydXN0dW0oKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LmFzcGVjdFJhdGlvID0gdGhpcy5hc3BlY3RSYXRpbzsKICAgICAgICByZXN1bHQuZm92ID0gdGhpcy5mb3Y7CiAgICAgICAgcmVzdWx0Lm5lYXIgPSB0aGlzLm5lYXI7CiAgICAgICAgcmVzdWx0LmZhciA9IHRoaXMuZmFyOwogICAgICAgIHJlc3VsdC5fYXNwZWN0UmF0aW8gPSB2b2lkIDA7CiAgICAgICAgcmVzdWx0Ll9mb3YgPSB2b2lkIDA7CiAgICAgICAgcmVzdWx0Ll9uZWFyID0gdm9pZCAwOwogICAgICAgIHJlc3VsdC5fZmFyID0gdm9pZCAwOwogICAgICAgIHRoaXMuX29mZkNlbnRlckZydXN0dW0uY2xvbmUocmVzdWx0Ll9vZmZDZW50ZXJGcnVzdHVtKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBQZXJzcGVjdGl2ZUZydXN0dW0ucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uKG90aGVyKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQob3RoZXIpIHx8ICEob3RoZXIgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUZydXN0dW0pKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZTQodGhpcyk7CiAgICAgICAgdXBkYXRlNChvdGhlcik7CiAgICAgICAgcmV0dXJuIHRoaXMuZm92ID09PSBvdGhlci5mb3YgJiYgdGhpcy5hc3BlY3RSYXRpbyA9PT0gb3RoZXIuYXNwZWN0UmF0aW8gJiYgdGhpcy5fb2ZmQ2VudGVyRnJ1c3R1bS5lcXVhbHMob3RoZXIuX29mZkNlbnRlckZydXN0dW0pOwogICAgICB9OwogICAgICBQZXJzcGVjdGl2ZUZydXN0dW0ucHJvdG90eXBlLmVxdWFsc0Vwc2lsb24gPSBmdW5jdGlvbihvdGhlciwgcmVsYXRpdmVFcHNpbG9uLCBhYnNvbHV0ZUVwc2lsb24pIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChvdGhlcikgfHwgIShvdGhlciBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlRnJ1c3R1bSkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlNCh0aGlzKTsKICAgICAgICB1cGRhdGU0KG90aGVyKTsKICAgICAgICByZXR1cm4gTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oCiAgICAgICAgICB0aGlzLmZvdiwKICAgICAgICAgIG90aGVyLmZvdiwKICAgICAgICAgIHJlbGF0aXZlRXBzaWxvbiwKICAgICAgICAgIGFic29sdXRlRXBzaWxvbgogICAgICAgICkgJiYgTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oCiAgICAgICAgICB0aGlzLmFzcGVjdFJhdGlvLAogICAgICAgICAgb3RoZXIuYXNwZWN0UmF0aW8sCiAgICAgICAgICByZWxhdGl2ZUVwc2lsb24sCiAgICAgICAgICBhYnNvbHV0ZUVwc2lsb24KICAgICAgICApICYmIHRoaXMuX29mZkNlbnRlckZydXN0dW0uZXF1YWxzRXBzaWxvbigKICAgICAgICAgIG90aGVyLl9vZmZDZW50ZXJGcnVzdHVtLAogICAgICAgICAgcmVsYXRpdmVFcHNpbG9uLAogICAgICAgICAgYWJzb2x1dGVFcHNpbG9uCiAgICAgICAgKTsKICAgICAgfTsKICAgICAgUGVyc3BlY3RpdmVGcnVzdHVtX2RlZmF1bHQgPSBQZXJzcGVjdGl2ZUZydXN0dW07CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9GcnVzdHVtR2VvbWV0cnkuanMKICBmdW5jdGlvbiBGcnVzdHVtR2VvbWV0cnkob3B0aW9ucykgewogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJvcHRpb25zIiwgb3B0aW9ucyk7CiAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm9wdGlvbnMuZnJ1c3R1bSIsIG9wdGlvbnMuZnJ1c3R1bSk7CiAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm9wdGlvbnMub3JpZ2luIiwgb3B0aW9ucy5vcmlnaW4pOwogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJvcHRpb25zLm9yaWVudGF0aW9uIiwgb3B0aW9ucy5vcmllbnRhdGlvbik7CiAgICBjb25zdCBmcnVzdHVtID0gb3B0aW9ucy5mcnVzdHVtOwogICAgY29uc3Qgb3JpZW50YXRpb24gPSBvcHRpb25zLm9yaWVudGF0aW9uOwogICAgY29uc3Qgb3JpZ2luID0gb3B0aW9ucy5vcmlnaW47CiAgICBjb25zdCB2ZXJ0ZXhGb3JtYXQgPSBvcHRpb25zLnZlcnRleEZvcm1hdCA/PyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5ERUZBVUxUOwogICAgY29uc3QgZHJhd05lYXJQbGFuZSA9IG9wdGlvbnMuX2RyYXdOZWFyUGxhbmUgPz8gdHJ1ZTsKICAgIGxldCBmcnVzdHVtVHlwZTsKICAgIGxldCBmcnVzdHVtUGFja2VkTGVuZ3RoOwogICAgaWYgKGZydXN0dW0gaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUZydXN0dW1fZGVmYXVsdCkgewogICAgICBmcnVzdHVtVHlwZSA9IFBFUlNQRUNUSVZFOwogICAgICBmcnVzdHVtUGFja2VkTGVuZ3RoID0gUGVyc3BlY3RpdmVGcnVzdHVtX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgfSBlbHNlIGlmIChmcnVzdHVtIGluc3RhbmNlb2YgT3J0aG9ncmFwaGljRnJ1c3R1bV9kZWZhdWx0KSB7CiAgICAgIGZydXN0dW1UeXBlID0gT1JUSE9HUkFQSElDOwogICAgICBmcnVzdHVtUGFja2VkTGVuZ3RoID0gT3J0aG9ncmFwaGljRnJ1c3R1bV9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgIH0KICAgIHRoaXMuX2ZydXN0dW1UeXBlID0gZnJ1c3R1bVR5cGU7CiAgICB0aGlzLl9mcnVzdHVtID0gZnJ1c3R1bS5jbG9uZSgpOwogICAgdGhpcy5fb3JpZ2luID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKG9yaWdpbik7CiAgICB0aGlzLl9vcmllbnRhdGlvbiA9IFF1YXRlcm5pb25fZGVmYXVsdC5jbG9uZShvcmllbnRhdGlvbik7CiAgICB0aGlzLl9kcmF3TmVhclBsYW5lID0gZHJhd05lYXJQbGFuZTsKICAgIHRoaXMuX3ZlcnRleEZvcm1hdCA9IHZlcnRleEZvcm1hdDsKICAgIHRoaXMuX3dvcmtlck5hbWUgPSAiY3JlYXRlRnJ1c3R1bUdlb21ldHJ5IjsKICAgIHRoaXMucGFja2VkTGVuZ3RoID0gMiArIGZydXN0dW1QYWNrZWRMZW5ndGggKyBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoICsgUXVhdGVybmlvbl9kZWZhdWx0LnBhY2tlZExlbmd0aCArIFZlcnRleEZvcm1hdF9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICB9CiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlcyhvZmZzZXQsIG5vcm1hbHMsIHRhbmdlbnRzLCBiaXRhbmdlbnRzLCBzdCwgbm9ybWFsMiwgdGFuZ2VudCwgYml0YW5nZW50KSB7CiAgICBjb25zdCBzdE9mZnNldCA9IG9mZnNldCAvIDMgKiAyOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChub3JtYWxzKSkgewogICAgICAgIG5vcm1hbHNbb2Zmc2V0XSA9IG5vcm1hbDIueDsKICAgICAgICBub3JtYWxzW29mZnNldCArIDFdID0gbm9ybWFsMi55OwogICAgICAgIG5vcm1hbHNbb2Zmc2V0ICsgMl0gPSBub3JtYWwyLno7CiAgICAgIH0KICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdCh0YW5nZW50cykpIHsKICAgICAgICB0YW5nZW50c1tvZmZzZXRdID0gdGFuZ2VudC54OwogICAgICAgIHRhbmdlbnRzW29mZnNldCArIDFdID0gdGFuZ2VudC55OwogICAgICAgIHRhbmdlbnRzW29mZnNldCArIDJdID0gdGFuZ2VudC56OwogICAgICB9CiAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoYml0YW5nZW50cykpIHsKICAgICAgICBiaXRhbmdlbnRzW29mZnNldF0gPSBiaXRhbmdlbnQueDsKICAgICAgICBiaXRhbmdlbnRzW29mZnNldCArIDFdID0gYml0YW5nZW50Lnk7CiAgICAgICAgYml0YW5nZW50c1tvZmZzZXQgKyAyXSA9IGJpdGFuZ2VudC56OwogICAgICB9CiAgICAgIG9mZnNldCArPSAzOwogICAgfQogICAgc3Rbc3RPZmZzZXRdID0gMDsKICAgIHN0W3N0T2Zmc2V0ICsgMV0gPSAwOwogICAgc3Rbc3RPZmZzZXQgKyAyXSA9IDE7CiAgICBzdFtzdE9mZnNldCArIDNdID0gMDsKICAgIHN0W3N0T2Zmc2V0ICsgNF0gPSAxOwogICAgc3Rbc3RPZmZzZXQgKyA1XSA9IDE7CiAgICBzdFtzdE9mZnNldCArIDZdID0gMDsKICAgIHN0W3N0T2Zmc2V0ICsgN10gPSAxOwogIH0KICB2YXIgUEVSU1BFQ1RJVkUsIE9SVEhPR1JBUEhJQywgc2NyYXRjaFBhY2tQZXJzcGVjdGl2ZSwgc2NyYXRjaFBhY2tPcnRob2dyYXBoaWMsIHNjcmF0Y2hQYWNrUXVhdGVybmlvbiwgc2NyYXRjaFBhY2tvcmlnaW4sIHNjcmF0Y2hWZXJ0ZXhGb3JtYXQ3LCBzY3JhdGNoUm90YXRpb25NYXRyaXgyLCBzY3JhdGNoVmlld01hdHJpeCwgc2NyYXRjaEludmVyc2VNYXRyaXgsIHNjcmF0Y2hYRGlyZWN0aW9uLCBzY3JhdGNoWURpcmVjdGlvbiwgc2NyYXRjaFpEaXJlY3Rpb24sIHNjcmF0Y2hOZWdhdGl2ZVgsIHNjcmF0Y2hOZWdhdGl2ZVksIHNjcmF0Y2hOZWdhdGl2ZVosIGZydXN0dW1TcGxpdHMsIGZydXN0dW1Db3JuZXJzTkRDLCBzY3JhdGNoRnJ1c3R1bUNvcm5lcnMsIEZydXN0dW1HZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X0ZydXN0dW1HZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvRnJ1c3R1bUdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9Cb3VuZGluZ1NwaGVyZSgpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW40KCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9Db21wb25lbnREYXRhdHlwZSgpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9HZW9tZXRyeSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlKCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGVzKCk7CiAgICAgIGluaXRfTWF0cml4MygpOwogICAgICBpbml0X01hdHJpeDQoKTsKICAgICAgaW5pdF9PcnRob2dyYXBoaWNGcnVzdHVtKCk7CiAgICAgIGluaXRfUGVyc3BlY3RpdmVGcnVzdHVtKCk7CiAgICAgIGluaXRfUHJpbWl0aXZlVHlwZSgpOwogICAgICBpbml0X1F1YXRlcm5pb24oKTsKICAgICAgaW5pdF9WZXJ0ZXhGb3JtYXQoKTsKICAgICAgUEVSU1BFQ1RJVkUgPSAwOwogICAgICBPUlRIT0dSQVBISUMgPSAxOwogICAgICBGcnVzdHVtR2VvbWV0cnkucGFjayA9IGZ1bmN0aW9uKHZhbHVlLCBhcnJheSwgc3RhcnRpbmdJbmRleCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGNvbnN0IGZydXN0dW1UeXBlID0gdmFsdWUuX2ZydXN0dW1UeXBlOwogICAgICAgIGNvbnN0IGZydXN0dW0gPSB2YWx1ZS5fZnJ1c3R1bTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gZnJ1c3R1bVR5cGU7CiAgICAgICAgaWYgKGZydXN0dW1UeXBlID09PSBQRVJTUEVDVElWRSkgewogICAgICAgICAgUGVyc3BlY3RpdmVGcnVzdHVtX2RlZmF1bHQucGFjayhmcnVzdHVtLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgICBzdGFydGluZ0luZGV4ICs9IFBlcnNwZWN0aXZlRnJ1c3R1bV9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgT3J0aG9ncmFwaGljRnJ1c3R1bV9kZWZhdWx0LnBhY2soZnJ1c3R1bSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgICAgc3RhcnRpbmdJbmRleCArPSBPcnRob2dyYXBoaWNGcnVzdHVtX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIH0KICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayh2YWx1ZS5fb3JpZ2luLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIFF1YXRlcm5pb25fZGVmYXVsdC5wYWNrKHZhbHVlLl9vcmllbnRhdGlvbiwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gUXVhdGVybmlvbl9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrKHZhbHVlLl92ZXJ0ZXhGb3JtYXQsIGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IFZlcnRleEZvcm1hdF9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4XSA9IHZhbHVlLl9kcmF3TmVhclBsYW5lID8gMSA6IDA7CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9OwogICAgICBzY3JhdGNoUGFja1BlcnNwZWN0aXZlID0gbmV3IFBlcnNwZWN0aXZlRnJ1c3R1bV9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hQYWNrT3J0aG9ncmFwaGljID0gbmV3IE9ydGhvZ3JhcGhpY0ZydXN0dW1fZGVmYXVsdCgpOwogICAgICBzY3JhdGNoUGFja1F1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbl9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hQYWNrb3JpZ2luID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoVmVydGV4Rm9ybWF0NyA9IG5ldyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdCgpOwogICAgICBGcnVzdHVtR2VvbWV0cnkudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBjb25zdCBmcnVzdHVtVHlwZSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgbGV0IGZydXN0dW07CiAgICAgICAgaWYgKGZydXN0dW1UeXBlID09PSBQRVJTUEVDVElWRSkgewogICAgICAgICAgZnJ1c3R1bSA9IFBlcnNwZWN0aXZlRnJ1c3R1bV9kZWZhdWx0LnVucGFjaygKICAgICAgICAgICAgYXJyYXksCiAgICAgICAgICAgIHN0YXJ0aW5nSW5kZXgsCiAgICAgICAgICAgIHNjcmF0Y2hQYWNrUGVyc3BlY3RpdmUKICAgICAgICAgICk7CiAgICAgICAgICBzdGFydGluZ0luZGV4ICs9IFBlcnNwZWN0aXZlRnJ1c3R1bV9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZnJ1c3R1bSA9IE9ydGhvZ3JhcGhpY0ZydXN0dW1fZGVmYXVsdC51bnBhY2soCiAgICAgICAgICAgIGFycmF5LAogICAgICAgICAgICBzdGFydGluZ0luZGV4LAogICAgICAgICAgICBzY3JhdGNoUGFja09ydGhvZ3JhcGhpYwogICAgICAgICAgKTsKICAgICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gT3J0aG9ncmFwaGljRnJ1c3R1bV9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICB9CiAgICAgICAgY29uc3Qgb3JpZ2luID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCwgc2NyYXRjaFBhY2tvcmlnaW4pOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBjb25zdCBvcmllbnRhdGlvbiA9IFF1YXRlcm5pb25fZGVmYXVsdC51bnBhY2soCiAgICAgICAgICBhcnJheSwKICAgICAgICAgIHN0YXJ0aW5nSW5kZXgsCiAgICAgICAgICBzY3JhdGNoUGFja1F1YXRlcm5pb24KICAgICAgICApOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gUXVhdGVybmlvbl9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBjb25zdCB2ZXJ0ZXhGb3JtYXQgPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC51bnBhY2soCiAgICAgICAgICBhcnJheSwKICAgICAgICAgIHN0YXJ0aW5nSW5kZXgsCiAgICAgICAgICBzY3JhdGNoVmVydGV4Rm9ybWF0NwogICAgICAgICk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgY29uc3QgZHJhd05lYXJQbGFuZSA9IGFycmF5W3N0YXJ0aW5nSW5kZXhdID09PSAxOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgRnJ1c3R1bUdlb21ldHJ5KHsKICAgICAgICAgICAgZnJ1c3R1bSwKICAgICAgICAgICAgb3JpZ2luLAogICAgICAgICAgICBvcmllbnRhdGlvbiwKICAgICAgICAgICAgdmVydGV4Rm9ybWF0LAogICAgICAgICAgICBfZHJhd05lYXJQbGFuZTogZHJhd05lYXJQbGFuZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGZydXN0dW1SZXN1bHQgPSBmcnVzdHVtVHlwZSA9PT0gcmVzdWx0Ll9mcnVzdHVtVHlwZSA/IHJlc3VsdC5fZnJ1c3R1bSA6IHZvaWQgMDsKICAgICAgICByZXN1bHQuX2ZydXN0dW0gPSBmcnVzdHVtLmNsb25lKGZydXN0dW1SZXN1bHQpOwogICAgICAgIHJlc3VsdC5fZnJ1c3R1bVR5cGUgPSBmcnVzdHVtVHlwZTsKICAgICAgICByZXN1bHQuX29yaWdpbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShvcmlnaW4sIHJlc3VsdC5fb3JpZ2luKTsKICAgICAgICByZXN1bHQuX29yaWVudGF0aW9uID0gUXVhdGVybmlvbl9kZWZhdWx0LmNsb25lKG9yaWVudGF0aW9uLCByZXN1bHQuX29yaWVudGF0aW9uKTsKICAgICAgICByZXN1bHQuX3ZlcnRleEZvcm1hdCA9IFZlcnRleEZvcm1hdF9kZWZhdWx0LmNsb25lKHZlcnRleEZvcm1hdCwgcmVzdWx0Ll92ZXJ0ZXhGb3JtYXQpOwogICAgICAgIHJlc3VsdC5fZHJhd05lYXJQbGFuZSA9IGRyYXdOZWFyUGxhbmU7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgc2NyYXRjaFJvdGF0aW9uTWF0cml4MiA9IG5ldyBNYXRyaXgzX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFZpZXdNYXRyaXggPSBuZXcgTWF0cml4NF9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hJbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeDRfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoWERpcmVjdGlvbiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFlEaXJlY3Rpb24gPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2haRGlyZWN0aW9uID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoTmVnYXRpdmVYID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoTmVnYXRpdmVZID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoTmVnYXRpdmVaID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBmcnVzdHVtU3BsaXRzID0gbmV3IEFycmF5KDMpOwogICAgICBmcnVzdHVtQ29ybmVyc05EQyA9IG5ldyBBcnJheSg0KTsKICAgICAgZnJ1c3R1bUNvcm5lcnNORENbMF0gPSBuZXcgQ2FydGVzaWFuNF9kZWZhdWx0KC0xLCAtMSwgMSwgMSk7CiAgICAgIGZydXN0dW1Db3JuZXJzTkRDWzFdID0gbmV3IENhcnRlc2lhbjRfZGVmYXVsdCgxLCAtMSwgMSwgMSk7CiAgICAgIGZydXN0dW1Db3JuZXJzTkRDWzJdID0gbmV3IENhcnRlc2lhbjRfZGVmYXVsdCgxLCAxLCAxLCAxKTsKICAgICAgZnJ1c3R1bUNvcm5lcnNORENbM10gPSBuZXcgQ2FydGVzaWFuNF9kZWZhdWx0KC0xLCAxLCAxLCAxKTsKICAgICAgc2NyYXRjaEZydXN0dW1Db3JuZXJzID0gbmV3IEFycmF5KDQpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgIHNjcmF0Y2hGcnVzdHVtQ29ybmVyc1tpXSA9IG5ldyBDYXJ0ZXNpYW40X2RlZmF1bHQoKTsKICAgICAgfQogICAgICBGcnVzdHVtR2VvbWV0cnkuX2NvbXB1dGVOZWFyRmFyUGxhbmVzID0gZnVuY3Rpb24ob3JpZ2luLCBvcmllbnRhdGlvbiwgZnJ1c3R1bVR5cGUsIGZydXN0dW0sIHBvc2l0aW9ucywgeERpcmVjdGlvbiwgeURpcmVjdGlvbiwgekRpcmVjdGlvbikgewogICAgICAgIGNvbnN0IHJvdGF0aW9uTWF0cml4ID0gTWF0cml4M19kZWZhdWx0LmZyb21RdWF0ZXJuaW9uKAogICAgICAgICAgb3JpZW50YXRpb24sCiAgICAgICAgICBzY3JhdGNoUm90YXRpb25NYXRyaXgyCiAgICAgICAgKTsKICAgICAgICBsZXQgeCA9IHhEaXJlY3Rpb24gPz8gc2NyYXRjaFhEaXJlY3Rpb247CiAgICAgICAgbGV0IHkgPSB5RGlyZWN0aW9uID8/IHNjcmF0Y2hZRGlyZWN0aW9uOwogICAgICAgIGxldCB6ID0gekRpcmVjdGlvbiA/PyBzY3JhdGNoWkRpcmVjdGlvbjsKICAgICAgICB4ID0gTWF0cml4M19kZWZhdWx0LmdldENvbHVtbihyb3RhdGlvbk1hdHJpeCwgMCwgeCk7CiAgICAgICAgeSA9IE1hdHJpeDNfZGVmYXVsdC5nZXRDb2x1bW4ocm90YXRpb25NYXRyaXgsIDEsIHkpOwogICAgICAgIHogPSBNYXRyaXgzX2RlZmF1bHQuZ2V0Q29sdW1uKHJvdGF0aW9uTWF0cml4LCAyLCB6KTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKHgsIHgpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoeSwgeSk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSh6LCB6KTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKHgsIHgpOwogICAgICAgIGNvbnN0IHZpZXcgPSBNYXRyaXg0X2RlZmF1bHQuY29tcHV0ZVZpZXcob3JpZ2luLCB6LCB5LCB4LCBzY3JhdGNoVmlld01hdHJpeCk7CiAgICAgICAgbGV0IGludmVyc2VWaWV3OwogICAgICAgIGxldCBpbnZlcnNlVmlld1Byb2plY3Rpb247CiAgICAgICAgY29uc3QgcHJvamVjdGlvbiA9IGZydXN0dW0ucHJvamVjdGlvbk1hdHJpeDsKICAgICAgICBpZiAoZnJ1c3R1bVR5cGUgPT09IFBFUlNQRUNUSVZFKSB7CiAgICAgICAgICBjb25zdCB2aWV3UHJvamVjdGlvbiA9IE1hdHJpeDRfZGVmYXVsdC5tdWx0aXBseSgKICAgICAgICAgICAgcHJvamVjdGlvbiwKICAgICAgICAgICAgdmlldywKICAgICAgICAgICAgc2NyYXRjaEludmVyc2VNYXRyaXgKICAgICAgICAgICk7CiAgICAgICAgICBpbnZlcnNlVmlld1Byb2plY3Rpb24gPSBNYXRyaXg0X2RlZmF1bHQuaW52ZXJzZSgKICAgICAgICAgICAgdmlld1Byb2plY3Rpb24sCiAgICAgICAgICAgIHNjcmF0Y2hJbnZlcnNlTWF0cml4CiAgICAgICAgICApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbnZlcnNlVmlldyA9IE1hdHJpeDRfZGVmYXVsdC5pbnZlcnNlVHJhbnNmb3JtYXRpb24odmlldywgc2NyYXRjaEludmVyc2VNYXRyaXgpOwogICAgICAgIH0KICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGludmVyc2VWaWV3UHJvamVjdGlvbikpIHsKICAgICAgICAgIGZydXN0dW1TcGxpdHNbMF0gPSBmcnVzdHVtLm5lYXI7CiAgICAgICAgICBmcnVzdHVtU3BsaXRzWzFdID0gZnJ1c3R1bS5mYXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZydXN0dW1TcGxpdHNbMF0gPSAwOwogICAgICAgICAgZnJ1c3R1bVNwbGl0c1sxXSA9IGZydXN0dW0ubmVhcjsKICAgICAgICAgIGZydXN0dW1TcGxpdHNbMl0gPSBmcnVzdHVtLmZhcjsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgICAgIGxldCBjb3JuZXIgPSBDYXJ0ZXNpYW40X2RlZmF1bHQuY2xvbmUoCiAgICAgICAgICAgICAgZnJ1c3R1bUNvcm5lcnNORENbal0sCiAgICAgICAgICAgICAgc2NyYXRjaEZydXN0dW1Db3JuZXJzW2pdCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGludmVyc2VWaWV3UHJvamVjdGlvbikpIHsKICAgICAgICAgICAgICBjb25zdCBvZmZDZW50ZXJGcnVzdHVtID0gZnJ1c3R1bS5vZmZDZW50ZXJGcnVzdHVtOwogICAgICAgICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQob2ZmQ2VudGVyRnJ1c3R1bSkpIHsKICAgICAgICAgICAgICAgIGZydXN0dW0gPSBvZmZDZW50ZXJGcnVzdHVtOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb25zdCBuZWFyID0gZnJ1c3R1bVNwbGl0c1tpXTsKICAgICAgICAgICAgICBjb25zdCBmYXIgPSBmcnVzdHVtU3BsaXRzW2kgKyAxXTsKICAgICAgICAgICAgICBjb3JuZXIueCA9IChjb3JuZXIueCAqIChmcnVzdHVtLnJpZ2h0IC0gZnJ1c3R1bS5sZWZ0KSArIGZydXN0dW0ubGVmdCArIGZydXN0dW0ucmlnaHQpICogMC41OwogICAgICAgICAgICAgIGNvcm5lci55ID0gKGNvcm5lci55ICogKGZydXN0dW0udG9wIC0gZnJ1c3R1bS5ib3R0b20pICsgZnJ1c3R1bS5ib3R0b20gKyBmcnVzdHVtLnRvcCkgKiAwLjU7CiAgICAgICAgICAgICAgY29ybmVyLnogPSAoY29ybmVyLnogKiAobmVhciAtIGZhcikgLSBuZWFyIC0gZmFyKSAqIDAuNTsKICAgICAgICAgICAgICBjb3JuZXIudyA9IDE7CiAgICAgICAgICAgICAgTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5QnlWZWN0b3IoaW52ZXJzZVZpZXcsIGNvcm5lciwgY29ybmVyKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb3JuZXIgPSBNYXRyaXg0X2RlZmF1bHQubXVsdGlwbHlCeVZlY3RvcigKICAgICAgICAgICAgICAgIGludmVyc2VWaWV3UHJvamVjdGlvbiwKICAgICAgICAgICAgICAgIGNvcm5lciwKICAgICAgICAgICAgICAgIGNvcm5lcgogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgY29uc3QgdyA9IDEgLyBjb3JuZXIudzsKICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihjb3JuZXIsIHcsIGNvcm5lcik7CiAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KGNvcm5lciwgb3JpZ2luLCBjb3JuZXIpOwogICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoY29ybmVyLCBjb3JuZXIpOwogICAgICAgICAgICAgIGNvbnN0IGZhYyA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoeiwgY29ybmVyKTsKICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihjb3JuZXIsIGZydXN0dW1TcGxpdHNbaV0gLyBmYWMsIGNvcm5lcik7CiAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChjb3JuZXIsIG9yaWdpbiwgY29ybmVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwb3NpdGlvbnNbMTIgKiBpICsgaiAqIDNdID0gY29ybmVyLng7CiAgICAgICAgICAgIHBvc2l0aW9uc1sxMiAqIGkgKyBqICogMyArIDFdID0gY29ybmVyLnk7CiAgICAgICAgICAgIHBvc2l0aW9uc1sxMiAqIGkgKyBqICogMyArIDJdID0gY29ybmVyLno7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICBGcnVzdHVtR2VvbWV0cnkuY3JlYXRlR2VvbWV0cnkgPSBmdW5jdGlvbihmcnVzdHVtR2VvbWV0cnkpIHsKICAgICAgICBjb25zdCBmcnVzdHVtVHlwZSA9IGZydXN0dW1HZW9tZXRyeS5fZnJ1c3R1bVR5cGU7CiAgICAgICAgY29uc3QgZnJ1c3R1bSA9IGZydXN0dW1HZW9tZXRyeS5fZnJ1c3R1bTsKICAgICAgICBjb25zdCBvcmlnaW4gPSBmcnVzdHVtR2VvbWV0cnkuX29yaWdpbjsKICAgICAgICBjb25zdCBvcmllbnRhdGlvbiA9IGZydXN0dW1HZW9tZXRyeS5fb3JpZW50YXRpb247CiAgICAgICAgY29uc3QgZHJhd05lYXJQbGFuZSA9IGZydXN0dW1HZW9tZXRyeS5fZHJhd05lYXJQbGFuZTsKICAgICAgICBjb25zdCB2ZXJ0ZXhGb3JtYXQgPSBmcnVzdHVtR2VvbWV0cnkuX3ZlcnRleEZvcm1hdDsKICAgICAgICBjb25zdCBudW1iZXJPZlBsYW5lcyA9IGRyYXdOZWFyUGxhbmUgPyA2IDogNTsKICAgICAgICBsZXQgcG9zaXRpb25zID0gbmV3IEZsb2F0NjRBcnJheSgzICogNCAqIDYpOwogICAgICAgIEZydXN0dW1HZW9tZXRyeS5fY29tcHV0ZU5lYXJGYXJQbGFuZXMoCiAgICAgICAgICBvcmlnaW4sCiAgICAgICAgICBvcmllbnRhdGlvbiwKICAgICAgICAgIGZydXN0dW1UeXBlLAogICAgICAgICAgZnJ1c3R1bSwKICAgICAgICAgIHBvc2l0aW9ucwogICAgICAgICk7CiAgICAgICAgbGV0IG9mZnNldCA9IDMgKiA0ICogMjsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0XSA9IHBvc2l0aW9uc1szICogNF07CiAgICAgICAgcG9zaXRpb25zW29mZnNldCArIDFdID0gcG9zaXRpb25zWzMgKiA0ICsgMV07CiAgICAgICAgcG9zaXRpb25zW29mZnNldCArIDJdID0gcG9zaXRpb25zWzMgKiA0ICsgMl07CiAgICAgICAgcG9zaXRpb25zW29mZnNldCArIDNdID0gcG9zaXRpb25zWzBdOwogICAgICAgIHBvc2l0aW9uc1tvZmZzZXQgKyA0XSA9IHBvc2l0aW9uc1sxXTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgNV0gPSBwb3NpdGlvbnNbMl07CiAgICAgICAgcG9zaXRpb25zW29mZnNldCArIDZdID0gcG9zaXRpb25zWzMgKiAzXTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgN10gPSBwb3NpdGlvbnNbMyAqIDMgKyAxXTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgOF0gPSBwb3NpdGlvbnNbMyAqIDMgKyAyXTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgOV0gPSBwb3NpdGlvbnNbMyAqIDddOwogICAgICAgIHBvc2l0aW9uc1tvZmZzZXQgKyAxMF0gPSBwb3NpdGlvbnNbMyAqIDcgKyAxXTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgMTFdID0gcG9zaXRpb25zWzMgKiA3ICsgMl07CiAgICAgICAgb2Zmc2V0ICs9IDMgKiA0OwogICAgICAgIHBvc2l0aW9uc1tvZmZzZXRdID0gcG9zaXRpb25zWzMgKiA1XTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgMV0gPSBwb3NpdGlvbnNbMyAqIDUgKyAxXTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgMl0gPSBwb3NpdGlvbnNbMyAqIDUgKyAyXTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgM10gPSBwb3NpdGlvbnNbM107CiAgICAgICAgcG9zaXRpb25zW29mZnNldCArIDRdID0gcG9zaXRpb25zWzMgKyAxXTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgNV0gPSBwb3NpdGlvbnNbMyArIDJdOwogICAgICAgIHBvc2l0aW9uc1tvZmZzZXQgKyA2XSA9IHBvc2l0aW9uc1swXTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgN10gPSBwb3NpdGlvbnNbMV07CiAgICAgICAgcG9zaXRpb25zW29mZnNldCArIDhdID0gcG9zaXRpb25zWzJdOwogICAgICAgIHBvc2l0aW9uc1tvZmZzZXQgKyA5XSA9IHBvc2l0aW9uc1szICogNF07CiAgICAgICAgcG9zaXRpb25zW29mZnNldCArIDEwXSA9IHBvc2l0aW9uc1szICogNCArIDFdOwogICAgICAgIHBvc2l0aW9uc1tvZmZzZXQgKyAxMV0gPSBwb3NpdGlvbnNbMyAqIDQgKyAyXTsKICAgICAgICBvZmZzZXQgKz0gMyAqIDQ7CiAgICAgICAgcG9zaXRpb25zW29mZnNldF0gPSBwb3NpdGlvbnNbM107CiAgICAgICAgcG9zaXRpb25zW29mZnNldCArIDFdID0gcG9zaXRpb25zWzMgKyAxXTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgMl0gPSBwb3NpdGlvbnNbMyArIDJdOwogICAgICAgIHBvc2l0aW9uc1tvZmZzZXQgKyAzXSA9IHBvc2l0aW9uc1szICogNV07CiAgICAgICAgcG9zaXRpb25zW29mZnNldCArIDRdID0gcG9zaXRpb25zWzMgKiA1ICsgMV07CiAgICAgICAgcG9zaXRpb25zW29mZnNldCArIDVdID0gcG9zaXRpb25zWzMgKiA1ICsgMl07CiAgICAgICAgcG9zaXRpb25zW29mZnNldCArIDZdID0gcG9zaXRpb25zWzMgKiA2XTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgN10gPSBwb3NpdGlvbnNbMyAqIDYgKyAxXTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgOF0gPSBwb3NpdGlvbnNbMyAqIDYgKyAyXTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgOV0gPSBwb3NpdGlvbnNbMyAqIDJdOwogICAgICAgIHBvc2l0aW9uc1tvZmZzZXQgKyAxMF0gPSBwb3NpdGlvbnNbMyAqIDIgKyAxXTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgMTFdID0gcG9zaXRpb25zWzMgKiAyICsgMl07CiAgICAgICAgb2Zmc2V0ICs9IDMgKiA0OwogICAgICAgIHBvc2l0aW9uc1tvZmZzZXRdID0gcG9zaXRpb25zWzMgKiAyXTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgMV0gPSBwb3NpdGlvbnNbMyAqIDIgKyAxXTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgMl0gPSBwb3NpdGlvbnNbMyAqIDIgKyAyXTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgM10gPSBwb3NpdGlvbnNbMyAqIDZdOwogICAgICAgIHBvc2l0aW9uc1tvZmZzZXQgKyA0XSA9IHBvc2l0aW9uc1szICogNiArIDFdOwogICAgICAgIHBvc2l0aW9uc1tvZmZzZXQgKyA1XSA9IHBvc2l0aW9uc1szICogNiArIDJdOwogICAgICAgIHBvc2l0aW9uc1tvZmZzZXQgKyA2XSA9IHBvc2l0aW9uc1szICogN107CiAgICAgICAgcG9zaXRpb25zW29mZnNldCArIDddID0gcG9zaXRpb25zWzMgKiA3ICsgMV07CiAgICAgICAgcG9zaXRpb25zW29mZnNldCArIDhdID0gcG9zaXRpb25zWzMgKiA3ICsgMl07CiAgICAgICAgcG9zaXRpb25zW29mZnNldCArIDldID0gcG9zaXRpb25zWzMgKiAzXTsKICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgMTBdID0gcG9zaXRpb25zWzMgKiAzICsgMV07CiAgICAgICAgcG9zaXRpb25zW29mZnNldCArIDExXSA9IHBvc2l0aW9uc1szICogMyArIDJdOwogICAgICAgIGlmICghZHJhd05lYXJQbGFuZSkgewogICAgICAgICAgcG9zaXRpb25zID0gcG9zaXRpb25zLnN1YmFycmF5KDMgKiA0KTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZXNfZGVmYXVsdCh7CiAgICAgICAgICBwb3NpdGlvbjogbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5ET1VCTEUsCiAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgICAgIHZhbHVlczogcG9zaXRpb25zCiAgICAgICAgICB9KQogICAgICAgIH0pOwogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQodmVydGV4Rm9ybWF0Lm5vcm1hbCkgfHwgZGVmaW5lZF9kZWZhdWx0KHZlcnRleEZvcm1hdC50YW5nZW50KSB8fCBkZWZpbmVkX2RlZmF1bHQodmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgfHwgZGVmaW5lZF9kZWZhdWx0KHZlcnRleEZvcm1hdC5zdCkpIHsKICAgICAgICAgIGNvbnN0IG5vcm1hbHMgPSBkZWZpbmVkX2RlZmF1bHQodmVydGV4Rm9ybWF0Lm5vcm1hbCkgPyBuZXcgRmxvYXQzMkFycmF5KDMgKiA0ICogbnVtYmVyT2ZQbGFuZXMpIDogdm9pZCAwOwogICAgICAgICAgY29uc3QgdGFuZ2VudHMgPSBkZWZpbmVkX2RlZmF1bHQodmVydGV4Rm9ybWF0LnRhbmdlbnQpID8gbmV3IEZsb2F0MzJBcnJheSgzICogNCAqIG51bWJlck9mUGxhbmVzKSA6IHZvaWQgMDsKICAgICAgICAgIGNvbnN0IGJpdGFuZ2VudHMgPSBkZWZpbmVkX2RlZmF1bHQodmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgPyBuZXcgRmxvYXQzMkFycmF5KDMgKiA0ICogbnVtYmVyT2ZQbGFuZXMpIDogdm9pZCAwOwogICAgICAgICAgY29uc3Qgc3QgPSBkZWZpbmVkX2RlZmF1bHQodmVydGV4Rm9ybWF0LnN0KSA/IG5ldyBGbG9hdDMyQXJyYXkoMiAqIDQgKiBudW1iZXJPZlBsYW5lcykgOiB2b2lkIDA7CiAgICAgICAgICBjb25zdCB4ID0gc2NyYXRjaFhEaXJlY3Rpb247CiAgICAgICAgICBjb25zdCB5ID0gc2NyYXRjaFlEaXJlY3Rpb247CiAgICAgICAgICBjb25zdCB6ID0gc2NyYXRjaFpEaXJlY3Rpb247CiAgICAgICAgICBjb25zdCBuZWdhdGl2ZVgyID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5lZ2F0ZSh4LCBzY3JhdGNoTmVnYXRpdmVYKTsKICAgICAgICAgIGNvbnN0IG5lZ2F0aXZlWSA9IENhcnRlc2lhbjNfZGVmYXVsdC5uZWdhdGUoeSwgc2NyYXRjaE5lZ2F0aXZlWSk7CiAgICAgICAgICBjb25zdCBuZWdhdGl2ZVogPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKHosIHNjcmF0Y2hOZWdhdGl2ZVopOwogICAgICAgICAgb2Zmc2V0ID0gMDsKICAgICAgICAgIGlmIChkcmF3TmVhclBsYW5lKSB7CiAgICAgICAgICAgIGdldEF0dHJpYnV0ZXMob2Zmc2V0LCBub3JtYWxzLCB0YW5nZW50cywgYml0YW5nZW50cywgc3QsIG5lZ2F0aXZlWiwgeCwgeSk7CiAgICAgICAgICAgIG9mZnNldCArPSAzICogNDsKICAgICAgICAgIH0KICAgICAgICAgIGdldEF0dHJpYnV0ZXMob2Zmc2V0LCBub3JtYWxzLCB0YW5nZW50cywgYml0YW5nZW50cywgc3QsIHosIG5lZ2F0aXZlWDIsIHkpOwogICAgICAgICAgb2Zmc2V0ICs9IDMgKiA0OwogICAgICAgICAgZ2V0QXR0cmlidXRlcygKICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICBub3JtYWxzLAogICAgICAgICAgICB0YW5nZW50cywKICAgICAgICAgICAgYml0YW5nZW50cywKICAgICAgICAgICAgc3QsCiAgICAgICAgICAgIG5lZ2F0aXZlWDIsCiAgICAgICAgICAgIG5lZ2F0aXZlWiwKICAgICAgICAgICAgeQogICAgICAgICAgKTsKICAgICAgICAgIG9mZnNldCArPSAzICogNDsKICAgICAgICAgIGdldEF0dHJpYnV0ZXMoCiAgICAgICAgICAgIG9mZnNldCwKICAgICAgICAgICAgbm9ybWFscywKICAgICAgICAgICAgdGFuZ2VudHMsCiAgICAgICAgICAgIGJpdGFuZ2VudHMsCiAgICAgICAgICAgIHN0LAogICAgICAgICAgICBuZWdhdGl2ZVksCiAgICAgICAgICAgIG5lZ2F0aXZlWiwKICAgICAgICAgICAgbmVnYXRpdmVYMgogICAgICAgICAgKTsKICAgICAgICAgIG9mZnNldCArPSAzICogNDsKICAgICAgICAgIGdldEF0dHJpYnV0ZXMob2Zmc2V0LCBub3JtYWxzLCB0YW5nZW50cywgYml0YW5nZW50cywgc3QsIHgsIHosIHkpOwogICAgICAgICAgb2Zmc2V0ICs9IDMgKiA0OwogICAgICAgICAgZ2V0QXR0cmlidXRlcyhvZmZzZXQsIG5vcm1hbHMsIHRhbmdlbnRzLCBiaXRhbmdlbnRzLCBzdCwgeSwgeiwgbmVnYXRpdmVYMik7CiAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG5vcm1hbHMpKSB7CiAgICAgICAgICAgIGF0dHJpYnV0ZXMubm9ybWFsID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgICAgICAgdmFsdWVzOiBub3JtYWxzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdCh0YW5nZW50cykpIHsKICAgICAgICAgICAgYXR0cmlidXRlcy50YW5nZW50ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgICAgICAgdmFsdWVzOiB0YW5nZW50cwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoYml0YW5nZW50cykpIHsKICAgICAgICAgICAgYXR0cmlidXRlcy5iaXRhbmdlbnQgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgICAgICB2YWx1ZXM6IGJpdGFuZ2VudHMKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHN0KSkgewogICAgICAgICAgICBhdHRyaWJ1dGVzLnN0ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDIsCiAgICAgICAgICAgICAgdmFsdWVzOiBzdAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheSg2ICogbnVtYmVyT2ZQbGFuZXMpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZQbGFuZXM7ICsraSkgewogICAgICAgICAgY29uc3QgaW5kZXhPZmZzZXQgPSBpICogNjsKICAgICAgICAgIGNvbnN0IGluZGV4ID0gaSAqIDQ7CiAgICAgICAgICBpbmRpY2VzW2luZGV4T2Zmc2V0XSA9IGluZGV4OwogICAgICAgICAgaW5kaWNlc1tpbmRleE9mZnNldCArIDFdID0gaW5kZXggKyAxOwogICAgICAgICAgaW5kaWNlc1tpbmRleE9mZnNldCArIDJdID0gaW5kZXggKyAyOwogICAgICAgICAgaW5kaWNlc1tpbmRleE9mZnNldCArIDNdID0gaW5kZXg7CiAgICAgICAgICBpbmRpY2VzW2luZGV4T2Zmc2V0ICsgNF0gPSBpbmRleCArIDI7CiAgICAgICAgICBpbmRpY2VzW2luZGV4T2Zmc2V0ICsgNV0gPSBpbmRleCArIDM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgR2VvbWV0cnlfZGVmYXVsdCh7CiAgICAgICAgICBhdHRyaWJ1dGVzLAogICAgICAgICAgaW5kaWNlcywKICAgICAgICAgIHByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5UUklBTkdMRVMsCiAgICAgICAgICBib3VuZGluZ1NwaGVyZTogQm91bmRpbmdTcGhlcmVfZGVmYXVsdC5mcm9tVmVydGljZXMocG9zaXRpb25zKQogICAgICAgIH0pOwogICAgICB9OwogICAgICBGcnVzdHVtR2VvbWV0cnlfZGVmYXVsdCA9IEZydXN0dW1HZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZUZydXN0dW1HZW9tZXRyeS5qcwogIHZhciBjcmVhdGVGcnVzdHVtR2VvbWV0cnlfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGNyZWF0ZUZydXN0dW1HZW9tZXRyeV9leHBvcnRzLCB7CiAgICBkZWZhdWx0OiAoKSA9PiBjcmVhdGVGcnVzdHVtR2VvbWV0cnlfZGVmYXVsdAogIH0pOwogIGZ1bmN0aW9uIGNyZWF0ZUZydXN0dW1HZW9tZXRyeShmcnVzdHVtR2VvbWV0cnksIG9mZnNldCkgewogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvZmZzZXQpKSB7CiAgICAgIGZydXN0dW1HZW9tZXRyeSA9IEZydXN0dW1HZW9tZXRyeV9kZWZhdWx0LnVucGFjayhmcnVzdHVtR2VvbWV0cnksIG9mZnNldCk7CiAgICB9CiAgICByZXR1cm4gRnJ1c3R1bUdlb21ldHJ5X2RlZmF1bHQuY3JlYXRlR2VvbWV0cnkoZnJ1c3R1bUdlb21ldHJ5KTsKICB9CiAgdmFyIGNyZWF0ZUZydXN0dW1HZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X2NyZWF0ZUZydXN0dW1HZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlRnJ1c3R1bUdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRnJ1c3R1bUdlb21ldHJ5KCk7CiAgICAgIGNyZWF0ZUZydXN0dW1HZW9tZXRyeV9kZWZhdWx0ID0gY3JlYXRlRnJ1c3R1bUdlb21ldHJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvRnJ1c3R1bU91dGxpbmVHZW9tZXRyeS5qcwogIGZ1bmN0aW9uIEZydXN0dW1PdXRsaW5lR2VvbWV0cnkob3B0aW9ucykgewogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJvcHRpb25zIiwgb3B0aW9ucyk7CiAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm9wdGlvbnMuZnJ1c3R1bSIsIG9wdGlvbnMuZnJ1c3R1bSk7CiAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm9wdGlvbnMub3JpZ2luIiwgb3B0aW9ucy5vcmlnaW4pOwogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJvcHRpb25zLm9yaWVudGF0aW9uIiwgb3B0aW9ucy5vcmllbnRhdGlvbik7CiAgICBjb25zdCBmcnVzdHVtID0gb3B0aW9ucy5mcnVzdHVtOwogICAgY29uc3Qgb3JpZW50YXRpb24gPSBvcHRpb25zLm9yaWVudGF0aW9uOwogICAgY29uc3Qgb3JpZ2luID0gb3B0aW9ucy5vcmlnaW47CiAgICBjb25zdCBkcmF3TmVhclBsYW5lID0gb3B0aW9ucy5fZHJhd05lYXJQbGFuZSA/PyB0cnVlOwogICAgbGV0IGZydXN0dW1UeXBlOwogICAgbGV0IGZydXN0dW1QYWNrZWRMZW5ndGg7CiAgICBpZiAoZnJ1c3R1bSBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlRnJ1c3R1bV9kZWZhdWx0KSB7CiAgICAgIGZydXN0dW1UeXBlID0gUEVSU1BFQ1RJVkUyOwogICAgICBmcnVzdHVtUGFja2VkTGVuZ3RoID0gUGVyc3BlY3RpdmVGcnVzdHVtX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgfSBlbHNlIGlmIChmcnVzdHVtIGluc3RhbmNlb2YgT3J0aG9ncmFwaGljRnJ1c3R1bV9kZWZhdWx0KSB7CiAgICAgIGZydXN0dW1UeXBlID0gT1JUSE9HUkFQSElDMjsKICAgICAgZnJ1c3R1bVBhY2tlZExlbmd0aCA9IE9ydGhvZ3JhcGhpY0ZydXN0dW1fZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICB9CiAgICB0aGlzLl9mcnVzdHVtVHlwZSA9IGZydXN0dW1UeXBlOwogICAgdGhpcy5fZnJ1c3R1bSA9IGZydXN0dW0uY2xvbmUoKTsKICAgIHRoaXMuX29yaWdpbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShvcmlnaW4pOwogICAgdGhpcy5fb3JpZW50YXRpb24gPSBRdWF0ZXJuaW9uX2RlZmF1bHQuY2xvbmUob3JpZW50YXRpb24pOwogICAgdGhpcy5fZHJhd05lYXJQbGFuZSA9IGRyYXdOZWFyUGxhbmU7CiAgICB0aGlzLl93b3JrZXJOYW1lID0gImNyZWF0ZUZydXN0dW1PdXRsaW5lR2VvbWV0cnkiOwogICAgdGhpcy5wYWNrZWRMZW5ndGggPSAyICsgZnJ1c3R1bVBhY2tlZExlbmd0aCArIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyBRdWF0ZXJuaW9uX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogIH0KICB2YXIgUEVSU1BFQ1RJVkUyLCBPUlRIT0dSQVBISUMyLCBzY3JhdGNoUGFja1BlcnNwZWN0aXZlMiwgc2NyYXRjaFBhY2tPcnRob2dyYXBoaWMyLCBzY3JhdGNoUGFja1F1YXRlcm5pb24yLCBzY3JhdGNoUGFja29yaWdpbjIsIEZydXN0dW1PdXRsaW5lR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9GcnVzdHVtT3V0bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9GcnVzdHVtT3V0bGluZUdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9Cb3VuZGluZ1NwaGVyZSgpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X0NvbXBvbmVudERhdGF0eXBlKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0ZydXN0dW1HZW9tZXRyeSgpOwogICAgICBpbml0X0dlb21ldHJ5KCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGUoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZXMoKTsKICAgICAgaW5pdF9PcnRob2dyYXBoaWNGcnVzdHVtKCk7CiAgICAgIGluaXRfUGVyc3BlY3RpdmVGcnVzdHVtKCk7CiAgICAgIGluaXRfUHJpbWl0aXZlVHlwZSgpOwogICAgICBpbml0X1F1YXRlcm5pb24oKTsKICAgICAgUEVSU1BFQ1RJVkUyID0gMDsKICAgICAgT1JUSE9HUkFQSElDMiA9IDE7CiAgICAgIEZydXN0dW1PdXRsaW5lR2VvbWV0cnkucGFjayA9IGZ1bmN0aW9uKHZhbHVlLCBhcnJheSwgc3RhcnRpbmdJbmRleCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGNvbnN0IGZydXN0dW1UeXBlID0gdmFsdWUuX2ZydXN0dW1UeXBlOwogICAgICAgIGNvbnN0IGZydXN0dW0gPSB2YWx1ZS5fZnJ1c3R1bTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gZnJ1c3R1bVR5cGU7CiAgICAgICAgaWYgKGZydXN0dW1UeXBlID09PSBQRVJTUEVDVElWRTIpIHsKICAgICAgICAgIFBlcnNwZWN0aXZlRnJ1c3R1bV9kZWZhdWx0LnBhY2soZnJ1c3R1bSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgICAgc3RhcnRpbmdJbmRleCArPSBQZXJzcGVjdGl2ZUZydXN0dW1fZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIE9ydGhvZ3JhcGhpY0ZydXN0dW1fZGVmYXVsdC5wYWNrKGZydXN0dW0sIGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gT3J0aG9ncmFwaGljRnJ1c3R1bV9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICB9CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2sodmFsdWUuX29yaWdpbiwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBRdWF0ZXJuaW9uX2RlZmF1bHQucGFjayh2YWx1ZS5fb3JpZW50YXRpb24sIGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IFF1YXRlcm5pb25fZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleF0gPSB2YWx1ZS5fZHJhd05lYXJQbGFuZSA/IDEgOiAwOwogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfTsKICAgICAgc2NyYXRjaFBhY2tQZXJzcGVjdGl2ZTIgPSBuZXcgUGVyc3BlY3RpdmVGcnVzdHVtX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFBhY2tPcnRob2dyYXBoaWMyID0gbmV3IE9ydGhvZ3JhcGhpY0ZydXN0dW1fZGVmYXVsdCgpOwogICAgICBzY3JhdGNoUGFja1F1YXRlcm5pb24yID0gbmV3IFF1YXRlcm5pb25fZGVmYXVsdCgpOwogICAgICBzY3JhdGNoUGFja29yaWdpbjIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIEZydXN0dW1PdXRsaW5lR2VvbWV0cnkudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBjb25zdCBmcnVzdHVtVHlwZSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgbGV0IGZydXN0dW07CiAgICAgICAgaWYgKGZydXN0dW1UeXBlID09PSBQRVJTUEVDVElWRTIpIHsKICAgICAgICAgIGZydXN0dW0gPSBQZXJzcGVjdGl2ZUZydXN0dW1fZGVmYXVsdC51bnBhY2soCiAgICAgICAgICAgIGFycmF5LAogICAgICAgICAgICBzdGFydGluZ0luZGV4LAogICAgICAgICAgICBzY3JhdGNoUGFja1BlcnNwZWN0aXZlMgogICAgICAgICAgKTsKICAgICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gUGVyc3BlY3RpdmVGcnVzdHVtX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmcnVzdHVtID0gT3J0aG9ncmFwaGljRnJ1c3R1bV9kZWZhdWx0LnVucGFjaygKICAgICAgICAgICAgYXJyYXksCiAgICAgICAgICAgIHN0YXJ0aW5nSW5kZXgsCiAgICAgICAgICAgIHNjcmF0Y2hQYWNrT3J0aG9ncmFwaGljMgogICAgICAgICAgKTsKICAgICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gT3J0aG9ncmFwaGljRnJ1c3R1bV9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICB9CiAgICAgICAgY29uc3Qgb3JpZ2luID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCwgc2NyYXRjaFBhY2tvcmlnaW4yKTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgY29uc3Qgb3JpZW50YXRpb24gPSBRdWF0ZXJuaW9uX2RlZmF1bHQudW5wYWNrKAogICAgICAgICAgYXJyYXksCiAgICAgICAgICBzdGFydGluZ0luZGV4LAogICAgICAgICAgc2NyYXRjaFBhY2tRdWF0ZXJuaW9uMgogICAgICAgICk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBRdWF0ZXJuaW9uX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGNvbnN0IGRyYXdOZWFyUGxhbmUgPSBhcnJheVtzdGFydGluZ0luZGV4XSA9PT0gMTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IEZydXN0dW1PdXRsaW5lR2VvbWV0cnkoewogICAgICAgICAgICBmcnVzdHVtLAogICAgICAgICAgICBvcmlnaW4sCiAgICAgICAgICAgIG9yaWVudGF0aW9uLAogICAgICAgICAgICBfZHJhd05lYXJQbGFuZTogZHJhd05lYXJQbGFuZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGZydXN0dW1SZXN1bHQgPSBmcnVzdHVtVHlwZSA9PT0gcmVzdWx0Ll9mcnVzdHVtVHlwZSA/IHJlc3VsdC5fZnJ1c3R1bSA6IHZvaWQgMDsKICAgICAgICByZXN1bHQuX2ZydXN0dW0gPSBmcnVzdHVtLmNsb25lKGZydXN0dW1SZXN1bHQpOwogICAgICAgIHJlc3VsdC5fZnJ1c3R1bVR5cGUgPSBmcnVzdHVtVHlwZTsKICAgICAgICByZXN1bHQuX29yaWdpbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShvcmlnaW4sIHJlc3VsdC5fb3JpZ2luKTsKICAgICAgICByZXN1bHQuX29yaWVudGF0aW9uID0gUXVhdGVybmlvbl9kZWZhdWx0LmNsb25lKG9yaWVudGF0aW9uLCByZXN1bHQuX29yaWVudGF0aW9uKTsKICAgICAgICByZXN1bHQuX2RyYXdOZWFyUGxhbmUgPSBkcmF3TmVhclBsYW5lOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEZydXN0dW1PdXRsaW5lR2VvbWV0cnkuY3JlYXRlR2VvbWV0cnkgPSBmdW5jdGlvbihmcnVzdHVtR2VvbWV0cnkpIHsKICAgICAgICBjb25zdCBmcnVzdHVtVHlwZSA9IGZydXN0dW1HZW9tZXRyeS5fZnJ1c3R1bVR5cGU7CiAgICAgICAgY29uc3QgZnJ1c3R1bSA9IGZydXN0dW1HZW9tZXRyeS5fZnJ1c3R1bTsKICAgICAgICBjb25zdCBvcmlnaW4gPSBmcnVzdHVtR2VvbWV0cnkuX29yaWdpbjsKICAgICAgICBjb25zdCBvcmllbnRhdGlvbiA9IGZydXN0dW1HZW9tZXRyeS5fb3JpZW50YXRpb247CiAgICAgICAgY29uc3QgZHJhd05lYXJQbGFuZSA9IGZydXN0dW1HZW9tZXRyeS5fZHJhd05lYXJQbGFuZTsKICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQ2NEFycmF5KDMgKiA0ICogMik7CiAgICAgICAgRnJ1c3R1bUdlb21ldHJ5X2RlZmF1bHQuX2NvbXB1dGVOZWFyRmFyUGxhbmVzKAogICAgICAgICAgb3JpZ2luLAogICAgICAgICAgb3JpZW50YXRpb24sCiAgICAgICAgICBmcnVzdHVtVHlwZSwKICAgICAgICAgIGZydXN0dW0sCiAgICAgICAgICBwb3NpdGlvbnMKICAgICAgICApOwogICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVzX2RlZmF1bHQoewogICAgICAgICAgcG9zaXRpb246IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRE9VQkxFLAogICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgICAgICB2YWx1ZXM6IHBvc2l0aW9ucwogICAgICAgICAgfSkKICAgICAgICB9KTsKICAgICAgICBsZXQgb2Zmc2V0OwogICAgICAgIGxldCBpbmRleDsKICAgICAgICBjb25zdCBudW1iZXJPZlBsYW5lcyA9IGRyYXdOZWFyUGxhbmUgPyAyIDogMTsKICAgICAgICBjb25zdCBpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KDggKiAobnVtYmVyT2ZQbGFuZXMgKyAxKSk7CiAgICAgICAgbGV0IGkgPSBkcmF3TmVhclBsYW5lID8gMCA6IDE7CiAgICAgICAgZm9yICg7IGkgPCAyOyArK2kpIHsKICAgICAgICAgIG9mZnNldCA9IGRyYXdOZWFyUGxhbmUgPyBpICogOCA6IDA7CiAgICAgICAgICBpbmRleCA9IGkgKiA0OwogICAgICAgICAgaW5kaWNlc1tvZmZzZXRdID0gaW5kZXg7CiAgICAgICAgICBpbmRpY2VzW29mZnNldCArIDFdID0gaW5kZXggKyAxOwogICAgICAgICAgaW5kaWNlc1tvZmZzZXQgKyAyXSA9IGluZGV4ICsgMTsKICAgICAgICAgIGluZGljZXNbb2Zmc2V0ICsgM10gPSBpbmRleCArIDI7CiAgICAgICAgICBpbmRpY2VzW29mZnNldCArIDRdID0gaW5kZXggKyAyOwogICAgICAgICAgaW5kaWNlc1tvZmZzZXQgKyA1XSA9IGluZGV4ICsgMzsKICAgICAgICAgIGluZGljZXNbb2Zmc2V0ICsgNl0gPSBpbmRleCArIDM7CiAgICAgICAgICBpbmRpY2VzW29mZnNldCArIDddID0gaW5kZXg7CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICAgICAgIG9mZnNldCA9IChudW1iZXJPZlBsYW5lcyArIGkpICogODsKICAgICAgICAgIGluZGV4ID0gaSAqIDQ7CiAgICAgICAgICBpbmRpY2VzW29mZnNldF0gPSBpbmRleDsKICAgICAgICAgIGluZGljZXNbb2Zmc2V0ICsgMV0gPSBpbmRleCArIDQ7CiAgICAgICAgICBpbmRpY2VzW29mZnNldCArIDJdID0gaW5kZXggKyAxOwogICAgICAgICAgaW5kaWNlc1tvZmZzZXQgKyAzXSA9IGluZGV4ICsgNTsKICAgICAgICAgIGluZGljZXNbb2Zmc2V0ICsgNF0gPSBpbmRleCArIDI7CiAgICAgICAgICBpbmRpY2VzW29mZnNldCArIDVdID0gaW5kZXggKyA2OwogICAgICAgICAgaW5kaWNlc1tvZmZzZXQgKyA2XSA9IGluZGV4ICsgMzsKICAgICAgICAgIGluZGljZXNbb2Zmc2V0ICsgN10gPSBpbmRleCArIDc7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgR2VvbWV0cnlfZGVmYXVsdCh7CiAgICAgICAgICBhdHRyaWJ1dGVzLAogICAgICAgICAgaW5kaWNlcywKICAgICAgICAgIHByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5MSU5FUywKICAgICAgICAgIGJvdW5kaW5nU3BoZXJlOiBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LmZyb21WZXJ0aWNlcyhwb3NpdGlvbnMpCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIEZydXN0dW1PdXRsaW5lR2VvbWV0cnlfZGVmYXVsdCA9IEZydXN0dW1PdXRsaW5lR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVGcnVzdHVtT3V0bGluZUdlb21ldHJ5LmpzCiAgdmFyIGNyZWF0ZUZydXN0dW1PdXRsaW5lR2VvbWV0cnlfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGNyZWF0ZUZydXN0dW1PdXRsaW5lR2VvbWV0cnlfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gY3JlYXRlRnJ1c3R1bU91dGxpbmVHZW9tZXRyeV9kZWZhdWx0CiAgfSk7CiAgZnVuY3Rpb24gY3JlYXRlRnJ1c3R1bU91dGxpbmVHZW9tZXRyeShmcnVzdHVtR2VvbWV0cnksIG9mZnNldCkgewogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvZmZzZXQpKSB7CiAgICAgIGZydXN0dW1HZW9tZXRyeSA9IEZydXN0dW1PdXRsaW5lR2VvbWV0cnlfZGVmYXVsdC51bnBhY2soZnJ1c3R1bUdlb21ldHJ5LCBvZmZzZXQpOwogICAgfQogICAgcmV0dXJuIEZydXN0dW1PdXRsaW5lR2VvbWV0cnlfZGVmYXVsdC5jcmVhdGVHZW9tZXRyeShmcnVzdHVtR2VvbWV0cnkpOwogIH0KICB2YXIgY3JlYXRlRnJ1c3R1bU91dGxpbmVHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X2NyZWF0ZUZydXN0dW1PdXRsaW5lR2VvbWV0cnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZUZydXN0dW1PdXRsaW5lR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9GcnVzdHVtT3V0bGluZUdlb21ldHJ5KCk7CiAgICAgIGNyZWF0ZUZydXN0dW1PdXRsaW5lR2VvbWV0cnlfZGVmYXVsdCA9IGNyZWF0ZUZydXN0dW1PdXRsaW5lR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9HZW9ncmFwaGljVGlsaW5nU2NoZW1lLmpzCiAgZnVuY3Rpb24gR2VvZ3JhcGhpY1RpbGluZ1NjaGVtZShvcHRpb25zKSB7CiAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICB0aGlzLl9lbGxpcHNvaWQgPSBvcHRpb25zLmVsbGlwc29pZCA/PyBFbGxpcHNvaWRfZGVmYXVsdC5kZWZhdWx0OwogICAgdGhpcy5fcmVjdGFuZ2xlID0gb3B0aW9ucy5yZWN0YW5nbGUgPz8gUmVjdGFuZ2xlX2RlZmF1bHQuTUFYX1ZBTFVFOwogICAgdGhpcy5fcHJvamVjdGlvbiA9IG5ldyBHZW9ncmFwaGljUHJvamVjdGlvbl9kZWZhdWx0KHRoaXMuX2VsbGlwc29pZCk7CiAgICB0aGlzLl9udW1iZXJPZkxldmVsWmVyb1RpbGVzWCA9IG9wdGlvbnMubnVtYmVyT2ZMZXZlbFplcm9UaWxlc1ggPz8gMjsKICAgIHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNZID0gb3B0aW9ucy5udW1iZXJPZkxldmVsWmVyb1RpbGVzWSA/PyAxOwogIH0KICB2YXIgR2VvZ3JhcGhpY1RpbGluZ1NjaGVtZV9kZWZhdWx0OwogIHZhciBpbml0X0dlb2dyYXBoaWNUaWxpbmdTY2hlbWUgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0dlb2dyYXBoaWNUaWxpbmdTY2hlbWUuanMiKCkgewogICAgICBpbml0X0NhcnRlc2lhbjIoKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X0Zyb3plbigpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9HZW9ncmFwaGljUHJvamVjdGlvbigpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9SZWN0YW5nbGUoKTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoR2VvZ3JhcGhpY1RpbGluZ1NjaGVtZS5wcm90b3R5cGUsIHsKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBlbGxpcHNvaWQgdGhhdCBpcyB0aWxlZCBieSB0aGlzIHRpbGluZyBzY2hlbWUuCiAgICAgICAgICogQG1lbWJlcm9mIEdlb2dyYXBoaWNUaWxpbmdTY2hlbWUucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge0VsbGlwc29pZH0KICAgICAgICAgKi8KICAgICAgICBlbGxpcHNvaWQ6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbGxpcHNvaWQ7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSByZWN0YW5nbGUsIGluIHJhZGlhbnMsIGNvdmVyZWQgYnkgdGhpcyB0aWxpbmcgc2NoZW1lLgogICAgICAgICAqIEBtZW1iZXJvZiBHZW9ncmFwaGljVGlsaW5nU2NoZW1lLnByb3RvdHlwZQogICAgICAgICAqIEB0eXBlIHtSZWN0YW5nbGV9CiAgICAgICAgICovCiAgICAgICAgcmVjdGFuZ2xlOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVjdGFuZ2xlOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgbWFwIHByb2plY3Rpb24gdXNlZCBieSB0aGlzIHRpbGluZyBzY2hlbWUuCiAgICAgICAgICogQG1lbWJlcm9mIEdlb2dyYXBoaWNUaWxpbmdTY2hlbWUucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge01hcFByb2plY3Rpb259CiAgICAgICAgICovCiAgICAgICAgcHJvamVjdGlvbjogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2plY3Rpb247CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgR2VvZ3JhcGhpY1RpbGluZ1NjaGVtZS5wcm90b3R5cGUuZ2V0TnVtYmVyT2ZYVGlsZXNBdExldmVsID0gZnVuY3Rpb24obGV2ZWwpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZMZXZlbFplcm9UaWxlc1ggPDwgbGV2ZWw7CiAgICAgIH07CiAgICAgIEdlb2dyYXBoaWNUaWxpbmdTY2hlbWUucHJvdG90eXBlLmdldE51bWJlck9mWVRpbGVzQXRMZXZlbCA9IGZ1bmN0aW9uKGxldmVsKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNZIDw8IGxldmVsOwogICAgICB9OwogICAgICBHZW9ncmFwaGljVGlsaW5nU2NoZW1lLnByb3RvdHlwZS5yZWN0YW5nbGVUb05hdGl2ZVJlY3RhbmdsZSA9IGZ1bmN0aW9uKHJlY3RhbmdsZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJyZWN0YW5nbGUiLCByZWN0YW5nbGUpOwogICAgICAgIGNvbnN0IHdlc3QgPSBNYXRoX2RlZmF1bHQudG9EZWdyZWVzKHJlY3RhbmdsZS53ZXN0KTsKICAgICAgICBjb25zdCBzb3V0aCA9IE1hdGhfZGVmYXVsdC50b0RlZ3JlZXMocmVjdGFuZ2xlLnNvdXRoKTsKICAgICAgICBjb25zdCBlYXN0ID0gTWF0aF9kZWZhdWx0LnRvRGVncmVlcyhyZWN0YW5nbGUuZWFzdCk7CiAgICAgICAgY29uc3Qgbm9ydGggPSBNYXRoX2RlZmF1bHQudG9EZWdyZWVzKHJlY3RhbmdsZS5ub3J0aCk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGVfZGVmYXVsdCh3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQud2VzdCA9IHdlc3Q7CiAgICAgICAgcmVzdWx0LnNvdXRoID0gc291dGg7CiAgICAgICAgcmVzdWx0LmVhc3QgPSBlYXN0OwogICAgICAgIHJlc3VsdC5ub3J0aCA9IG5vcnRoOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEdlb2dyYXBoaWNUaWxpbmdTY2hlbWUucHJvdG90eXBlLnRpbGVYWVRvTmF0aXZlUmVjdGFuZ2xlID0gZnVuY3Rpb24oeCwgeSwgbGV2ZWwsIHJlc3VsdCkgewogICAgICAgIGNvbnN0IHJlY3RhbmdsZVJhZGlhbnMgPSB0aGlzLnRpbGVYWVRvUmVjdGFuZ2xlKHgsIHksIGxldmVsLCByZXN1bHQpOwogICAgICAgIHJlY3RhbmdsZVJhZGlhbnMud2VzdCA9IE1hdGhfZGVmYXVsdC50b0RlZ3JlZXMocmVjdGFuZ2xlUmFkaWFucy53ZXN0KTsKICAgICAgICByZWN0YW5nbGVSYWRpYW5zLnNvdXRoID0gTWF0aF9kZWZhdWx0LnRvRGVncmVlcyhyZWN0YW5nbGVSYWRpYW5zLnNvdXRoKTsKICAgICAgICByZWN0YW5nbGVSYWRpYW5zLmVhc3QgPSBNYXRoX2RlZmF1bHQudG9EZWdyZWVzKHJlY3RhbmdsZVJhZGlhbnMuZWFzdCk7CiAgICAgICAgcmVjdGFuZ2xlUmFkaWFucy5ub3J0aCA9IE1hdGhfZGVmYXVsdC50b0RlZ3JlZXMocmVjdGFuZ2xlUmFkaWFucy5ub3J0aCk7CiAgICAgICAgcmV0dXJuIHJlY3RhbmdsZVJhZGlhbnM7CiAgICAgIH07CiAgICAgIEdlb2dyYXBoaWNUaWxpbmdTY2hlbWUucHJvdG90eXBlLnRpbGVYWVRvUmVjdGFuZ2xlID0gZnVuY3Rpb24oeCwgeSwgbGV2ZWwsIHJlc3VsdCkgewogICAgICAgIGNvbnN0IHJlY3RhbmdsZSA9IHRoaXMuX3JlY3RhbmdsZTsKICAgICAgICBjb25zdCB4VGlsZXMgPSB0aGlzLmdldE51bWJlck9mWFRpbGVzQXRMZXZlbChsZXZlbCk7CiAgICAgICAgY29uc3QgeVRpbGVzID0gdGhpcy5nZXROdW1iZXJPZllUaWxlc0F0TGV2ZWwobGV2ZWwpOwogICAgICAgIGNvbnN0IHhUaWxlV2lkdGggPSByZWN0YW5nbGUud2lkdGggLyB4VGlsZXM7CiAgICAgICAgY29uc3Qgd2VzdCA9IHggKiB4VGlsZVdpZHRoICsgcmVjdGFuZ2xlLndlc3Q7CiAgICAgICAgY29uc3QgZWFzdCA9ICh4ICsgMSkgKiB4VGlsZVdpZHRoICsgcmVjdGFuZ2xlLndlc3Q7CiAgICAgICAgY29uc3QgeVRpbGVIZWlnaHQgPSByZWN0YW5nbGUuaGVpZ2h0IC8geVRpbGVzOwogICAgICAgIGNvbnN0IG5vcnRoID0gcmVjdGFuZ2xlLm5vcnRoIC0geSAqIHlUaWxlSGVpZ2h0OwogICAgICAgIGNvbnN0IHNvdXRoID0gcmVjdGFuZ2xlLm5vcnRoIC0gKHkgKyAxKSAqIHlUaWxlSGVpZ2h0OwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBSZWN0YW5nbGVfZGVmYXVsdCh3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQud2VzdCA9IHdlc3Q7CiAgICAgICAgcmVzdWx0LnNvdXRoID0gc291dGg7CiAgICAgICAgcmVzdWx0LmVhc3QgPSBlYXN0OwogICAgICAgIHJlc3VsdC5ub3J0aCA9IG5vcnRoOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIEdlb2dyYXBoaWNUaWxpbmdTY2hlbWUucHJvdG90eXBlLnBvc2l0aW9uVG9UaWxlWFkgPSBmdW5jdGlvbihwb3NpdGlvbiwgbGV2ZWwsIHJlc3VsdCkgewogICAgICAgIGNvbnN0IHJlY3RhbmdsZSA9IHRoaXMuX3JlY3RhbmdsZTsKICAgICAgICBpZiAoIVJlY3RhbmdsZV9kZWZhdWx0LmNvbnRhaW5zKHJlY3RhbmdsZSwgcG9zaXRpb24pKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBjb25zdCB4VGlsZXMgPSB0aGlzLmdldE51bWJlck9mWFRpbGVzQXRMZXZlbChsZXZlbCk7CiAgICAgICAgY29uc3QgeVRpbGVzID0gdGhpcy5nZXROdW1iZXJPZllUaWxlc0F0TGV2ZWwobGV2ZWwpOwogICAgICAgIGNvbnN0IHhUaWxlV2lkdGggPSByZWN0YW5nbGUud2lkdGggLyB4VGlsZXM7CiAgICAgICAgY29uc3QgeVRpbGVIZWlnaHQgPSByZWN0YW5nbGUuaGVpZ2h0IC8geVRpbGVzOwogICAgICAgIGxldCBsb25naXR1ZGUgPSBwb3NpdGlvbi5sb25naXR1ZGU7CiAgICAgICAgaWYgKHJlY3RhbmdsZS5lYXN0IDwgcmVjdGFuZ2xlLndlc3QpIHsKICAgICAgICAgIGxvbmdpdHVkZSArPSBNYXRoX2RlZmF1bHQuVFdPX1BJOwogICAgICAgIH0KICAgICAgICBsZXQgeFRpbGVDb29yZGluYXRlID0gKGxvbmdpdHVkZSAtIHJlY3RhbmdsZS53ZXN0KSAvIHhUaWxlV2lkdGggfCAwOwogICAgICAgIGlmICh4VGlsZUNvb3JkaW5hdGUgPj0geFRpbGVzKSB7CiAgICAgICAgICB4VGlsZUNvb3JkaW5hdGUgPSB4VGlsZXMgLSAxOwogICAgICAgIH0KICAgICAgICBsZXQgeVRpbGVDb29yZGluYXRlID0gKHJlY3RhbmdsZS5ub3J0aCAtIHBvc2l0aW9uLmxhdGl0dWRlKSAvIHlUaWxlSGVpZ2h0IHwgMDsKICAgICAgICBpZiAoeVRpbGVDb29yZGluYXRlID49IHlUaWxlcykgewogICAgICAgICAgeVRpbGVDb29yZGluYXRlID0geVRpbGVzIC0gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoeFRpbGVDb29yZGluYXRlLCB5VGlsZUNvb3JkaW5hdGUpOwogICAgICAgIH0KICAgICAgICByZXN1bHQueCA9IHhUaWxlQ29vcmRpbmF0ZTsKICAgICAgICByZXN1bHQueSA9IHlUaWxlQ29vcmRpbmF0ZTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBHZW9ncmFwaGljVGlsaW5nU2NoZW1lX2RlZmF1bHQgPSBHZW9ncmFwaGljVGlsaW5nU2NoZW1lOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQXBwcm94aW1hdGVUZXJyYWluSGVpZ2h0cy5qcwogIGZ1bmN0aW9uIGdldFRpbGVYWUxldmVsKHJlY3RhbmdsZSkgewogICAgQ2FydG9ncmFwaGljX2RlZmF1bHQuZnJvbVJhZGlhbnMoCiAgICAgIHJlY3RhbmdsZS5lYXN0LAogICAgICByZWN0YW5nbGUubm9ydGgsCiAgICAgIDAsCiAgICAgIHNjcmF0Y2hDb3JuZXJzWzBdCiAgICApOwogICAgQ2FydG9ncmFwaGljX2RlZmF1bHQuZnJvbVJhZGlhbnMoCiAgICAgIHJlY3RhbmdsZS53ZXN0LAogICAgICByZWN0YW5nbGUubm9ydGgsCiAgICAgIDAsCiAgICAgIHNjcmF0Y2hDb3JuZXJzWzFdCiAgICApOwogICAgQ2FydG9ncmFwaGljX2RlZmF1bHQuZnJvbVJhZGlhbnMoCiAgICAgIHJlY3RhbmdsZS5lYXN0LAogICAgICByZWN0YW5nbGUuc291dGgsCiAgICAgIDAsCiAgICAgIHNjcmF0Y2hDb3JuZXJzWzJdCiAgICApOwogICAgQ2FydG9ncmFwaGljX2RlZmF1bHQuZnJvbVJhZGlhbnMoCiAgICAgIHJlY3RhbmdsZS53ZXN0LAogICAgICByZWN0YW5nbGUuc291dGgsCiAgICAgIDAsCiAgICAgIHNjcmF0Y2hDb3JuZXJzWzNdCiAgICApOwogICAgbGV0IGxhc3RMZXZlbFggPSAwLCBsYXN0TGV2ZWxZID0gMDsKICAgIGxldCBjdXJyZW50WCA9IDAsIGN1cnJlbnRZID0gMDsKICAgIGNvbnN0IG1heExldmVsID0gQXBwcm94aW1hdGVUZXJyYWluSGVpZ2h0cy5fdGVycmFpbkhlaWdodHNNYXhMZXZlbDsKICAgIGxldCBpOwogICAgZm9yIChpID0gMDsgaSA8PSBtYXhMZXZlbDsgKytpKSB7CiAgICAgIGxldCBmYWlsZWQgPSBmYWxzZTsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA0OyArK2opIHsKICAgICAgICBjb25zdCBjb3JuZXIgPSBzY3JhdGNoQ29ybmVyc1tqXTsKICAgICAgICB0aWxpbmdTY2hlbWUucG9zaXRpb25Ub1RpbGVYWShjb3JuZXIsIGksIHNjcmF0Y2hUaWxlWFkpOwogICAgICAgIGlmIChqID09PSAwKSB7CiAgICAgICAgICBjdXJyZW50WCA9IHNjcmF0Y2hUaWxlWFkueDsKICAgICAgICAgIGN1cnJlbnRZID0gc2NyYXRjaFRpbGVYWS55OwogICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFggIT09IHNjcmF0Y2hUaWxlWFkueCB8fCBjdXJyZW50WSAhPT0gc2NyYXRjaFRpbGVYWS55KSB7CiAgICAgICAgICBmYWlsZWQgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChmYWlsZWQpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBsYXN0TGV2ZWxYID0gY3VycmVudFg7CiAgICAgIGxhc3RMZXZlbFkgPSBjdXJyZW50WTsKICAgIH0KICAgIGlmIChpID09PSAwKSB7CiAgICAgIHJldHVybiB2b2lkIDA7CiAgICB9CiAgICByZXR1cm4gewogICAgICB4OiBsYXN0TGV2ZWxYLAogICAgICB5OiBsYXN0TGV2ZWxZLAogICAgICBsZXZlbDogaSA+IG1heExldmVsID8gbWF4TGV2ZWwgOiBpIC0gMQogICAgfTsKICB9CiAgdmFyIHNjcmF0Y2hEaWFnb25hbENhcnRlc2lhbk5FLCBzY3JhdGNoRGlhZ29uYWxDYXJ0ZXNpYW5TVywgc2NyYXRjaERpYWdvbmFsQ2FydG9ncmFwaGljLCBzY3JhdGNoQ2VudGVyQ2FydGVzaWFuLCBzY3JhdGNoU3VyZmFjZUNhcnRlc2lhbiwgc2NyYXRjaEJvdW5kaW5nU3BoZXJlMiwgdGlsaW5nU2NoZW1lLCBzY3JhdGNoQ29ybmVycywgc2NyYXRjaFRpbGVYWSwgQXBwcm94aW1hdGVUZXJyYWluSGVpZ2h0cywgQXBwcm94aW1hdGVUZXJyYWluSGVpZ2h0c19kZWZhdWx0OwogIHZhciBpbml0X0FwcHJveGltYXRlVGVycmFpbkhlaWdodHMgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0FwcHJveGltYXRlVGVycmFpbkhlaWdodHMuanMiKCkgewogICAgICBpbml0X0JvdW5kaW5nU3BoZXJlKCk7CiAgICAgIGluaXRfYnVpbGRNb2R1bGVVcmwoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4yKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRvZ3JhcGhpYygpOwogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfR2VvZ3JhcGhpY1RpbGluZ1NjaGVtZSgpOwogICAgICBpbml0X1JlY3RhbmdsZSgpOwogICAgICBpbml0X1Jlc291cmNlKCk7CiAgICAgIHNjcmF0Y2hEaWFnb25hbENhcnRlc2lhbk5FID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoRGlhZ29uYWxDYXJ0ZXNpYW5TVyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaERpYWdvbmFsQ2FydG9ncmFwaGljID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDZW50ZXJDYXJ0ZXNpYW4gPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hTdXJmYWNlQ2FydGVzaWFuID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQm91bmRpbmdTcGhlcmUyID0gbmV3IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQoKTsKICAgICAgdGlsaW5nU2NoZW1lID0gbmV3IEdlb2dyYXBoaWNUaWxpbmdTY2hlbWVfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ29ybmVycyA9IFsKICAgICAgICBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKSwKICAgICAgICBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKSwKICAgICAgICBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKSwKICAgICAgICBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKQogICAgICBdOwogICAgICBzY3JhdGNoVGlsZVhZID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICBBcHByb3hpbWF0ZVRlcnJhaW5IZWlnaHRzID0ge307CiAgICAgIEFwcHJveGltYXRlVGVycmFpbkhlaWdodHMuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGxldCBpbml0UHJvbWlzZSA9IEFwcHJveGltYXRlVGVycmFpbkhlaWdodHMuX2luaXRQcm9taXNlOwogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoaW5pdFByb21pc2UpKSB7CiAgICAgICAgICByZXR1cm4gaW5pdFByb21pc2U7CiAgICAgICAgfQogICAgICAgIGluaXRQcm9taXNlID0gUmVzb3VyY2VfZGVmYXVsdC5mZXRjaEpzb24oCiAgICAgICAgICBidWlsZE1vZHVsZVVybF9kZWZhdWx0KCJBc3NldHMvYXBwcm94aW1hdGVUZXJyYWluSGVpZ2h0cy5qc29uIikKICAgICAgICApLnRoZW4oZnVuY3Rpb24oanNvbikgewogICAgICAgICAgQXBwcm94aW1hdGVUZXJyYWluSGVpZ2h0cy5fdGVycmFpbkhlaWdodHMgPSBqc29uOwogICAgICAgIH0pOwogICAgICAgIEFwcHJveGltYXRlVGVycmFpbkhlaWdodHMuX2luaXRQcm9taXNlID0gaW5pdFByb21pc2U7CiAgICAgICAgcmV0dXJuIGluaXRQcm9taXNlOwogICAgICB9OwogICAgICBBcHByb3hpbWF0ZVRlcnJhaW5IZWlnaHRzLmdldE1pbmltdW1NYXhpbXVtSGVpZ2h0cyA9IGZ1bmN0aW9uKHJlY3RhbmdsZSwgZWxsaXBzb2lkKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJyZWN0YW5nbGUiLCByZWN0YW5nbGUpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KEFwcHJveGltYXRlVGVycmFpbkhlaWdodHMuX3RlcnJhaW5IZWlnaHRzKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJZb3UgbXVzdCBjYWxsIEFwcHJveGltYXRlVGVycmFpbkhlaWdodHMuaW5pdGlhbGl6ZSBhbmQgd2FpdCBmb3IgdGhlIHByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgdXNpbmcgdGhpcyBmdW5jdGlvbiIKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsbGlwc29pZCA9IGVsbGlwc29pZCA/PyBFbGxpcHNvaWRfZGVmYXVsdC5kZWZhdWx0OwogICAgICAgIGNvbnN0IHh5TGV2ZWwgPSBnZXRUaWxlWFlMZXZlbChyZWN0YW5nbGUpOwogICAgICAgIGxldCBtaW5UZXJyYWluSGVpZ2h0ID0gQXBwcm94aW1hdGVUZXJyYWluSGVpZ2h0cy5fZGVmYXVsdE1pblRlcnJhaW5IZWlnaHQ7CiAgICAgICAgbGV0IG1heFRlcnJhaW5IZWlnaHQgPSBBcHByb3hpbWF0ZVRlcnJhaW5IZWlnaHRzLl9kZWZhdWx0TWF4VGVycmFpbkhlaWdodDsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHh5TGV2ZWwpKSB7CiAgICAgICAgICBjb25zdCBrZXkgPSBgJHt4eUxldmVsLmxldmVsfS0ke3h5TGV2ZWwueH0tJHt4eUxldmVsLnl9YDsKICAgICAgICAgIGNvbnN0IGhlaWdodHMgPSBBcHByb3hpbWF0ZVRlcnJhaW5IZWlnaHRzLl90ZXJyYWluSGVpZ2h0c1trZXldOwogICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChoZWlnaHRzKSkgewogICAgICAgICAgICBtaW5UZXJyYWluSGVpZ2h0ID0gaGVpZ2h0c1swXTsKICAgICAgICAgICAgbWF4VGVycmFpbkhlaWdodCA9IGhlaWdodHNbMV07CiAgICAgICAgICB9CiAgICAgICAgICBlbGxpcHNvaWQuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oCiAgICAgICAgICAgIFJlY3RhbmdsZV9kZWZhdWx0Lm5vcnRoZWFzdChyZWN0YW5nbGUsIHNjcmF0Y2hEaWFnb25hbENhcnRvZ3JhcGhpYyksCiAgICAgICAgICAgIHNjcmF0Y2hEaWFnb25hbENhcnRlc2lhbk5FCiAgICAgICAgICApOwogICAgICAgICAgZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKAogICAgICAgICAgICBSZWN0YW5nbGVfZGVmYXVsdC5zb3V0aHdlc3QocmVjdGFuZ2xlLCBzY3JhdGNoRGlhZ29uYWxDYXJ0b2dyYXBoaWMpLAogICAgICAgICAgICBzY3JhdGNoRGlhZ29uYWxDYXJ0ZXNpYW5TVwogICAgICAgICAgKTsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5taWRwb2ludCgKICAgICAgICAgICAgc2NyYXRjaERpYWdvbmFsQ2FydGVzaWFuU1csCiAgICAgICAgICAgIHNjcmF0Y2hEaWFnb25hbENhcnRlc2lhbk5FLAogICAgICAgICAgICBzY3JhdGNoQ2VudGVyQ2FydGVzaWFuCiAgICAgICAgICApOwogICAgICAgICAgY29uc3Qgc3VyZmFjZVBvc2l0aW9uID0gZWxsaXBzb2lkLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoCiAgICAgICAgICAgIHNjcmF0Y2hDZW50ZXJDYXJ0ZXNpYW4sCiAgICAgICAgICAgIHNjcmF0Y2hTdXJmYWNlQ2FydGVzaWFuCiAgICAgICAgICApOwogICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChzdXJmYWNlUG9zaXRpb24pKSB7CiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gQ2FydGVzaWFuM19kZWZhdWx0LmRpc3RhbmNlKAogICAgICAgICAgICAgIHNjcmF0Y2hDZW50ZXJDYXJ0ZXNpYW4sCiAgICAgICAgICAgICAgc3VyZmFjZVBvc2l0aW9uCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1pblRlcnJhaW5IZWlnaHQgPSBNYXRoLm1pbihtaW5UZXJyYWluSGVpZ2h0LCAtZGlzdGFuY2UpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWluVGVycmFpbkhlaWdodCA9IEFwcHJveGltYXRlVGVycmFpbkhlaWdodHMuX2RlZmF1bHRNaW5UZXJyYWluSGVpZ2h0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBtaW5UZXJyYWluSGVpZ2h0ID0gTWF0aC5tYXgoCiAgICAgICAgICBBcHByb3hpbWF0ZVRlcnJhaW5IZWlnaHRzLl9kZWZhdWx0TWluVGVycmFpbkhlaWdodCwKICAgICAgICAgIG1pblRlcnJhaW5IZWlnaHQKICAgICAgICApOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBtaW5pbXVtVGVycmFpbkhlaWdodDogbWluVGVycmFpbkhlaWdodCwKICAgICAgICAgIG1heGltdW1UZXJyYWluSGVpZ2h0OiBtYXhUZXJyYWluSGVpZ2h0CiAgICAgICAgfTsKICAgICAgfTsKICAgICAgQXBwcm94aW1hdGVUZXJyYWluSGVpZ2h0cy5nZXRCb3VuZGluZ1NwaGVyZSA9IGZ1bmN0aW9uKHJlY3RhbmdsZSwgZWxsaXBzb2lkKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJyZWN0YW5nbGUiLCByZWN0YW5nbGUpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KEFwcHJveGltYXRlVGVycmFpbkhlaWdodHMuX3RlcnJhaW5IZWlnaHRzKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJZb3UgbXVzdCBjYWxsIEFwcHJveGltYXRlVGVycmFpbkhlaWdodHMuaW5pdGlhbGl6ZSBhbmQgd2FpdCBmb3IgdGhlIHByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgdXNpbmcgdGhpcyBmdW5jdGlvbiIKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsbGlwc29pZCA9IGVsbGlwc29pZCA/PyBFbGxpcHNvaWRfZGVmYXVsdC5kZWZhdWx0OwogICAgICAgIGNvbnN0IHh5TGV2ZWwgPSBnZXRUaWxlWFlMZXZlbChyZWN0YW5nbGUpOwogICAgICAgIGxldCBtYXhUZXJyYWluSGVpZ2h0ID0gQXBwcm94aW1hdGVUZXJyYWluSGVpZ2h0cy5fZGVmYXVsdE1heFRlcnJhaW5IZWlnaHQ7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdCh4eUxldmVsKSkgewogICAgICAgICAgY29uc3Qga2V5ID0gYCR7eHlMZXZlbC5sZXZlbH0tJHt4eUxldmVsLnh9LSR7eHlMZXZlbC55fWA7CiAgICAgICAgICBjb25zdCBoZWlnaHRzID0gQXBwcm94aW1hdGVUZXJyYWluSGVpZ2h0cy5fdGVycmFpbkhlaWdodHNba2V5XTsKICAgICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoaGVpZ2h0cykpIHsKICAgICAgICAgICAgbWF4VGVycmFpbkhlaWdodCA9IGhlaWdodHNbMV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3VsdCA9IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQuZnJvbVJlY3RhbmdsZTNEKHJlY3RhbmdsZSwgZWxsaXBzb2lkLCAwKTsKICAgICAgICBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LmZyb21SZWN0YW5nbGUzRCgKICAgICAgICAgIHJlY3RhbmdsZSwKICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgIG1heFRlcnJhaW5IZWlnaHQsCiAgICAgICAgICBzY3JhdGNoQm91bmRpbmdTcGhlcmUyCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gQm91bmRpbmdTcGhlcmVfZGVmYXVsdC51bmlvbihyZXN1bHQsIHNjcmF0Y2hCb3VuZGluZ1NwaGVyZTIsIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIEFwcHJveGltYXRlVGVycmFpbkhlaWdodHMuX3RlcnJhaW5IZWlnaHRzTWF4TGV2ZWwgPSA2OwogICAgICBBcHByb3hpbWF0ZVRlcnJhaW5IZWlnaHRzLl9kZWZhdWx0TWF4VGVycmFpbkhlaWdodCA9IDllMzsKICAgICAgQXBwcm94aW1hdGVUZXJyYWluSGVpZ2h0cy5fZGVmYXVsdE1pblRlcnJhaW5IZWlnaHQgPSAtMWU1OwogICAgICBBcHByb3hpbWF0ZVRlcnJhaW5IZWlnaHRzLl90ZXJyYWluSGVpZ2h0cyA9IHZvaWQgMDsKICAgICAgQXBwcm94aW1hdGVUZXJyYWluSGVpZ2h0cy5faW5pdFByb21pc2UgPSB2b2lkIDA7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEFwcHJveGltYXRlVGVycmFpbkhlaWdodHMsIHsKICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSB0ZXJyYWluIGhlaWdodHMgYXJlIGluaXRpYWxpemVkIGFuZCByZWFkeSB0byB1c2UuIFRvIGluaXRpYWxpemUgdGhlIHRlcnJhaW4gaGVpZ2h0cywKICAgICAgICAgKiBjYWxsIHtAbGluayBBcHByb3hpbWF0ZVRlcnJhaW5IZWlnaHRzI2luaXRpYWxpemV9IGFuZCB3YWl0IGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byByZXNvbHZlLgogICAgICAgICAqIEB0eXBlIHtib29sZWFufQogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqIEBtZW1iZXJvZiBBcHByb3hpbWF0ZVRlcnJhaW5IZWlnaHRzCiAgICAgICAgICovCiAgICAgICAgaW5pdGlhbGl6ZWQ6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBkZWZpbmVkX2RlZmF1bHQoQXBwcm94aW1hdGVUZXJyYWluSGVpZ2h0cy5fdGVycmFpbkhlaWdodHMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIEFwcHJveGltYXRlVGVycmFpbkhlaWdodHNfZGVmYXVsdCA9IEFwcHJveGltYXRlVGVycmFpbkhlaWdodHM7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Hcm91bmRQb2x5bGluZUdlb21ldHJ5LmpzCiAgZnVuY3Rpb24gR3JvdW5kUG9seWxpbmVHZW9tZXRyeShvcHRpb25zKSB7CiAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICBjb25zdCBwb3NpdGlvbnMgPSBvcHRpb25zLnBvc2l0aW9uczsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHBvc2l0aW9ucykgfHwgcG9zaXRpb25zLmxlbmd0aCA8IDIpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIkF0IGxlYXN0IHR3byBwb3NpdGlvbnMgYXJlIHJlcXVpcmVkLiIpOwogICAgfQogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvcHRpb25zLmFyY1R5cGUpICYmIG9wdGlvbnMuYXJjVHlwZSAhPT0gQXJjVHlwZV9kZWZhdWx0LkdFT0RFU0lDICYmIG9wdGlvbnMuYXJjVHlwZSAhPT0gQXJjVHlwZV9kZWZhdWx0LlJIVU1CKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICJWYWxpZCBvcHRpb25zIGZvciBhcmNUeXBlIGFyZSBBcmNUeXBlLkdFT0RFU0lDIGFuZCBBcmNUeXBlLlJIVU1CLiIKICAgICAgKTsKICAgIH0KICAgIHRoaXMud2lkdGggPSBvcHRpb25zLndpZHRoID8/IDE7CiAgICB0aGlzLl9wb3NpdGlvbnMgPSBwb3NpdGlvbnM7CiAgICB0aGlzLmdyYW51bGFyaXR5ID0gb3B0aW9ucy5ncmFudWxhcml0eSA/PyA5OTk5OwogICAgdGhpcy5sb29wID0gb3B0aW9ucy5sb29wID8/IGZhbHNlOwogICAgdGhpcy5hcmNUeXBlID0gb3B0aW9ucy5hcmNUeXBlID8/IEFyY1R5cGVfZGVmYXVsdC5HRU9ERVNJQzsKICAgIHRoaXMuX2VsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmRlZmF1bHQ7CiAgICB0aGlzLl9wcm9qZWN0aW9uSW5kZXggPSAwOwogICAgdGhpcy5fd29ya2VyTmFtZSA9ICJjcmVhdGVHcm91bmRQb2x5bGluZUdlb21ldHJ5IjsKICAgIHRoaXMuX3NjZW5lM0RPbmx5ID0gZmFsc2U7CiAgfQogIGZ1bmN0aW9uIGNvbXB1dGVSaWdodE5vcm1hbChzdGFydCwgZW5kLCBtYXhIZWlnaHQsIGVsbGlwc29pZCwgcmVzdWx0KSB7CiAgICBjb25zdCBzdGFydEJvdHRvbSA9IGdldFBvc2l0aW9uKGVsbGlwc29pZCwgc3RhcnQsIDAsIGNhcnQzU2NyYXRjaDEpOwogICAgY29uc3Qgc3RhcnRUb3AgPSBnZXRQb3NpdGlvbihlbGxpcHNvaWQsIHN0YXJ0LCBtYXhIZWlnaHQsIGNhcnQzU2NyYXRjaDIpOwogICAgY29uc3QgZW5kQm90dG9tID0gZ2V0UG9zaXRpb24oZWxsaXBzb2lkLCBlbmQsIDAsIGNhcnQzU2NyYXRjaDMpOwogICAgY29uc3QgdXAgPSBkaXJlY3Rpb24oc3RhcnRUb3AsIHN0YXJ0Qm90dG9tLCBjYXJ0M1NjcmF0Y2gyKTsKICAgIGNvbnN0IGZvcndhcmQgPSBkaXJlY3Rpb24oZW5kQm90dG9tLCBzdGFydEJvdHRvbSwgY2FydDNTY3JhdGNoMyk7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3MoZm9yd2FyZCwgdXAsIHJlc3VsdCk7CiAgICByZXR1cm4gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShyZXN1bHQsIHJlc3VsdCk7CiAgfQogIGZ1bmN0aW9uIGludGVycG9sYXRlU2VnbWVudChzdGFydCwgZW5kLCBtaW5IZWlnaHQsIG1heEhlaWdodCwgZ3JhbnVsYXJpdHksIGFyY1R5cGUsIGVsbGlwc29pZCwgbm9ybWFsc0FycmF5LCBib3R0b21Qb3NpdGlvbnNBcnJheSwgdG9wUG9zaXRpb25zQXJyYXksIGNhcnRvZ3JhcGhpY3NBcnJheSkgewogICAgaWYgKGdyYW51bGFyaXR5ID09PSAwKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBlbGxpcHNvaWRMaW5lOwogICAgaWYgKGFyY1R5cGUgPT09IEFyY1R5cGVfZGVmYXVsdC5HRU9ERVNJQykgewogICAgICBlbGxpcHNvaWRMaW5lID0gbmV3IEVsbGlwc29pZEdlb2Rlc2ljX2RlZmF1bHQoc3RhcnQsIGVuZCwgZWxsaXBzb2lkKTsKICAgIH0gZWxzZSBpZiAoYXJjVHlwZSA9PT0gQXJjVHlwZV9kZWZhdWx0LlJIVU1CKSB7CiAgICAgIGVsbGlwc29pZExpbmUgPSBuZXcgRWxsaXBzb2lkUmh1bWJMaW5lX2RlZmF1bHQoc3RhcnQsIGVuZCwgZWxsaXBzb2lkKTsKICAgIH0KICAgIGNvbnN0IHN1cmZhY2VEaXN0YW5jZSA9IGVsbGlwc29pZExpbmUuc3VyZmFjZURpc3RhbmNlOwogICAgaWYgKHN1cmZhY2VEaXN0YW5jZSA8IGdyYW51bGFyaXR5KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGludGVycG9sYXRlZE5vcm1hbCA9IGNvbXB1dGVSaWdodE5vcm1hbCgKICAgICAgc3RhcnQsCiAgICAgIGVuZCwKICAgICAgbWF4SGVpZ2h0LAogICAgICBlbGxpcHNvaWQsCiAgICAgIGludGVycG9sYXRlZE5vcm1hbFNjcmF0Y2gKICAgICk7CiAgICBjb25zdCBzZWdtZW50cyA9IE1hdGguY2VpbChzdXJmYWNlRGlzdGFuY2UgLyBncmFudWxhcml0eSk7CiAgICBjb25zdCBpbnRlcnBvaW50RGlzdGFuY2UgPSBzdXJmYWNlRGlzdGFuY2UgLyBzZWdtZW50czsKICAgIGxldCBkaXN0YW5jZUZyb21TdGFydCA9IGludGVycG9pbnREaXN0YW5jZTsKICAgIGNvbnN0IHBvaW50c1RvQWRkID0gc2VnbWVudHMgLSAxOwogICAgbGV0IHBhY2tJbmRleCA9IG5vcm1hbHNBcnJheS5sZW5ndGg7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50c1RvQWRkOyBpKyspIHsKICAgICAgY29uc3QgaW50ZXJwb2xhdGVkQ2FydG9ncmFwaGljID0gZWxsaXBzb2lkTGluZS5pbnRlcnBvbGF0ZVVzaW5nU3VyZmFjZURpc3RhbmNlKAogICAgICAgIGRpc3RhbmNlRnJvbVN0YXJ0LAogICAgICAgIGludGVycG9sYXRlZENhcnRvZ3JhcGhpY1NjcmF0Y2gKICAgICAgKTsKICAgICAgY29uc3QgaW50ZXJwb2xhdGVkQm90dG9tID0gZ2V0UG9zaXRpb24oCiAgICAgICAgZWxsaXBzb2lkLAogICAgICAgIGludGVycG9sYXRlZENhcnRvZ3JhcGhpYywKICAgICAgICBtaW5IZWlnaHQsCiAgICAgICAgaW50ZXJwb2xhdGVkQm90dG9tU2NyYXRjaAogICAgICApOwogICAgICBjb25zdCBpbnRlcnBvbGF0ZWRUb3AgPSBnZXRQb3NpdGlvbigKICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgaW50ZXJwb2xhdGVkQ2FydG9ncmFwaGljLAogICAgICAgIG1heEhlaWdodCwKICAgICAgICBpbnRlcnBvbGF0ZWRUb3BTY3JhdGNoCiAgICAgICk7CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKGludGVycG9sYXRlZE5vcm1hbCwgbm9ybWFsc0FycmF5LCBwYWNrSW5kZXgpOwogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayhpbnRlcnBvbGF0ZWRCb3R0b20sIGJvdHRvbVBvc2l0aW9uc0FycmF5LCBwYWNrSW5kZXgpOwogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayhpbnRlcnBvbGF0ZWRUb3AsIHRvcFBvc2l0aW9uc0FycmF5LCBwYWNrSW5kZXgpOwogICAgICBjYXJ0b2dyYXBoaWNzQXJyYXkucHVzaChpbnRlcnBvbGF0ZWRDYXJ0b2dyYXBoaWMubGF0aXR1ZGUpOwogICAgICBjYXJ0b2dyYXBoaWNzQXJyYXkucHVzaChpbnRlcnBvbGF0ZWRDYXJ0b2dyYXBoaWMubG9uZ2l0dWRlKTsKICAgICAgcGFja0luZGV4ICs9IDM7CiAgICAgIGRpc3RhbmNlRnJvbVN0YXJ0ICs9IGludGVycG9pbnREaXN0YW5jZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZ2V0UG9zaXRpb24oZWxsaXBzb2lkLCBjYXJ0b2dyYXBoaWMyLCBoZWlnaHQsIHJlc3VsdCkgewogICAgQ2FydG9ncmFwaGljX2RlZmF1bHQuY2xvbmUoY2FydG9ncmFwaGljMiwgaGVpZ2h0bGVzc0NhcnRvZ3JhcGhpY1NjcmF0Y2gpOwogICAgaGVpZ2h0bGVzc0NhcnRvZ3JhcGhpY1NjcmF0Y2guaGVpZ2h0ID0gaGVpZ2h0OwogICAgcmV0dXJuIENhcnRvZ3JhcGhpY19kZWZhdWx0LnRvQ2FydGVzaWFuKAogICAgICBoZWlnaHRsZXNzQ2FydG9ncmFwaGljU2NyYXRjaCwKICAgICAgZWxsaXBzb2lkLAogICAgICByZXN1bHQKICAgICk7CiAgfQogIGZ1bmN0aW9uIGRpcmVjdGlvbih0YXJnZXQsIG9yaWdpbiwgcmVzdWx0KSB7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QodGFyZ2V0LCBvcmlnaW4sIHJlc3VsdCk7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKHJlc3VsdCwgcmVzdWx0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIHRhbmdlbnREaXJlY3Rpb24odGFyZ2V0LCBvcmlnaW4sIHVwLCByZXN1bHQpIHsKICAgIHJlc3VsdCA9IGRpcmVjdGlvbih0YXJnZXQsIG9yaWdpbiwgcmVzdWx0KTsKICAgIHJlc3VsdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhyZXN1bHQsIHVwLCByZXN1bHQpOwogICAgcmVzdWx0ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShyZXN1bHQsIHJlc3VsdCk7CiAgICByZXN1bHQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3ModXAsIHJlc3VsdCwgcmVzdWx0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIGNvbXB1dGVWZXJ0ZXhNaXRlck5vcm1hbChwcmV2aW91c0JvdHRvbSwgdmVydGV4Qm90dG9tLCB2ZXJ0ZXhUb3AsIG5leHRCb3R0b20sIHJlc3VsdCkgewogICAgY29uc3QgdXAgPSBkaXJlY3Rpb24odmVydGV4VG9wLCB2ZXJ0ZXhCb3R0b20sIHZlcnRleFVwU2NyYXRjaCk7CiAgICBjb25zdCB0b1ByZXZpb3VzID0gdGFuZ2VudERpcmVjdGlvbigKICAgICAgcHJldmlvdXNCb3R0b20sCiAgICAgIHZlcnRleEJvdHRvbSwKICAgICAgdXAsCiAgICAgIHRvUHJldmlvdXNTY3JhdGNoCiAgICApOwogICAgY29uc3QgdG9OZXh0ID0gdGFuZ2VudERpcmVjdGlvbihuZXh0Qm90dG9tLCB2ZXJ0ZXhCb3R0b20sIHVwLCB0b05leHRTY3JhdGNoKTsKICAgIGlmIChNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmRvdCh0b1ByZXZpb3VzLCB0b05leHQpLAogICAgICBjb3NpbmUxODAsCiAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9ONQogICAgKSkgewogICAgICByZXN1bHQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3ModXAsIHRvUHJldmlvdXMsIHJlc3VsdCk7CiAgICAgIHJlc3VsdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUocmVzdWx0LCByZXN1bHQpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmVzdWx0ID0gQ2FydGVzaWFuM19kZWZhdWx0LmFkZCh0b05leHQsIHRvUHJldmlvdXMsIHJlc3VsdCk7CiAgICByZXN1bHQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKHJlc3VsdCwgcmVzdWx0KTsKICAgIGNvbnN0IGZvcndhcmQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3ModXAsIHJlc3VsdCwgZm9yd2FyZFNjcmF0Y2gpOwogICAgaWYgKENhcnRlc2lhbjNfZGVmYXVsdC5kb3QodG9OZXh0LCBmb3J3YXJkKSA8IGNvc2luZTkwKSB7CiAgICAgIHJlc3VsdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5uZWdhdGUocmVzdWx0LCByZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgZnVuY3Rpb24gYnJlYWtNaXRlcihlbmRHZW9tZXRyeU5vcm1hbCwgc3RhcnRCb3R0b20sIGVuZEJvdHRvbSwgZW5kVG9wKSB7CiAgICBjb25zdCBsaW5lRGlyZWN0aW9uID0gZGlyZWN0aW9uKGVuZEJvdHRvbSwgc3RhcnRCb3R0b20sIGxpbmVEaXJlY3Rpb25TY3JhdGNoKTsKICAgIGNvbnN0IGRvdCA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3QobGluZURpcmVjdGlvbiwgZW5kR2VvbWV0cnlOb3JtYWwpOwogICAgaWYgKGRvdCA+IE1JVEVSX0JSRUFLX1NNQUxMIHx8IGRvdCA8IE1JVEVSX0JSRUFLX0xBUkdFKSB7CiAgICAgIGNvbnN0IHZlcnRleFVwID0gZGlyZWN0aW9uKGVuZFRvcCwgZW5kQm90dG9tLCB2ZXJ0ZXhVcFNjcmF0Y2gpOwogICAgICBjb25zdCBhbmdsZSA9IGRvdCA8IE1JVEVSX0JSRUFLX0xBUkdFID8gTWF0aF9kZWZhdWx0LlBJX09WRVJfVFdPIDogLU1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTzsKICAgICAgY29uc3QgcXVhdGVybmlvbiA9IFF1YXRlcm5pb25fZGVmYXVsdC5mcm9tQXhpc0FuZ2xlKAogICAgICAgIHZlcnRleFVwLAogICAgICAgIGFuZ2xlLAogICAgICAgIHF1YXRlcm5pb25TY3JhdGNoMwogICAgICApOwogICAgICBjb25zdCByb3RhdGlvbk1hdHJpeCA9IE1hdHJpeDNfZGVmYXVsdC5mcm9tUXVhdGVybmlvbihxdWF0ZXJuaW9uLCBtYXRyaXgzU2NyYXRjaCk7CiAgICAgIE1hdHJpeDNfZGVmYXVsdC5tdWx0aXBseUJ5VmVjdG9yKAogICAgICAgIHJvdGF0aW9uTWF0cml4LAogICAgICAgIGVuZEdlb21ldHJ5Tm9ybWFsLAogICAgICAgIGVuZEdlb21ldHJ5Tm9ybWFsCiAgICAgICk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICBmdW5jdGlvbiBwcm9qZWN0Tm9ybWFsKHByb2plY3Rpb24sIGNhcnRvZ3JhcGhpYzIsIG5vcm1hbDIsIHByb2plY3RlZFBvc2l0aW9uLCByZXN1bHQpIHsKICAgIGNvbnN0IHBvc2l0aW9uID0gQ2FydG9ncmFwaGljX2RlZmF1bHQudG9DYXJ0ZXNpYW4oCiAgICAgIGNhcnRvZ3JhcGhpYzIsCiAgICAgIHByb2plY3Rpb24uX2VsbGlwc29pZCwKICAgICAgbm9ybWFsU3RhcnRwb2ludFNjcmF0Y2gKICAgICk7CiAgICBsZXQgbm9ybWFsRW5kcG9pbnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHBvc2l0aW9uLCBub3JtYWwyLCBub3JtYWxFbmRwb2ludFNjcmF0Y2gpOwogICAgbGV0IGZsaXBOb3JtYWwgPSBmYWxzZTsKICAgIGNvbnN0IGVsbGlwc29pZCA9IHByb2plY3Rpb24uX2VsbGlwc29pZDsKICAgIGxldCBub3JtYWxFbmRwb2ludENhcnRvZ3JhcGhpYyA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYygKICAgICAgbm9ybWFsRW5kcG9pbnQsCiAgICAgIGVuZFBvc0NhcnRvZ3JhcGhpY1NjcmF0Y2gKICAgICk7CiAgICBpZiAoTWF0aC5hYnMoY2FydG9ncmFwaGljMi5sb25naXR1ZGUgLSBub3JtYWxFbmRwb2ludENhcnRvZ3JhcGhpYy5sb25naXR1ZGUpID4gTWF0aF9kZWZhdWx0LlBJX09WRVJfVFdPKSB7CiAgICAgIGZsaXBOb3JtYWwgPSB0cnVlOwogICAgICBub3JtYWxFbmRwb2ludCA9IENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdCgKICAgICAgICBwb3NpdGlvbiwKICAgICAgICBub3JtYWwyLAogICAgICAgIG5vcm1hbEVuZHBvaW50U2NyYXRjaAogICAgICApOwogICAgICBub3JtYWxFbmRwb2ludENhcnRvZ3JhcGhpYyA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYygKICAgICAgICBub3JtYWxFbmRwb2ludCwKICAgICAgICBlbmRQb3NDYXJ0b2dyYXBoaWNTY3JhdGNoCiAgICAgICk7CiAgICB9CiAgICBub3JtYWxFbmRwb2ludENhcnRvZ3JhcGhpYy5oZWlnaHQgPSAwOwogICAgY29uc3Qgbm9ybWFsRW5kcG9pbnRQcm9qZWN0ZWQgPSBwcm9qZWN0aW9uLnByb2plY3QoCiAgICAgIG5vcm1hbEVuZHBvaW50Q2FydG9ncmFwaGljLAogICAgICByZXN1bHQKICAgICk7CiAgICByZXN1bHQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoCiAgICAgIG5vcm1hbEVuZHBvaW50UHJvamVjdGVkLAogICAgICBwcm9qZWN0ZWRQb3NpdGlvbiwKICAgICAgcmVzdWx0CiAgICApOwogICAgcmVzdWx0LnogPSAwOwogICAgcmVzdWx0ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShyZXN1bHQsIHJlc3VsdCk7CiAgICBpZiAoZmxpcE5vcm1hbCkgewogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKHJlc3VsdCwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIGFkanVzdEhlaWdodHMoYm90dG9tLCB0b3AsIG1pbkhlaWdodCwgbWF4SGVpZ2h0LCBhZGp1c3RIZWlnaHRCb3R0b20sIGFkanVzdEhlaWdodFRvcCkgewogICAgY29uc3QgYWRqdXN0SGVpZ2h0Tm9ybWFsID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KAogICAgICB0b3AsCiAgICAgIGJvdHRvbSwKICAgICAgYWRqdXN0SGVpZ2h0Tm9ybWFsU2NyYXRjaAogICAgKTsKICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoYWRqdXN0SGVpZ2h0Tm9ybWFsLCBhZGp1c3RIZWlnaHROb3JtYWwpOwogICAgY29uc3QgZGlzdGFuY2VGb3JCb3R0b20gPSBtaW5IZWlnaHQgLSBXQUxMX0lOSVRJQUxfTUlOX0hFSUdIVDsKICAgIGxldCBhZGp1c3RIZWlnaHRPZmZzZXQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcigKICAgICAgYWRqdXN0SGVpZ2h0Tm9ybWFsLAogICAgICBkaXN0YW5jZUZvckJvdHRvbSwKICAgICAgYWRqdXN0SGVpZ2h0T2Zmc2V0U2NyYXRjaAogICAgKTsKICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoYm90dG9tLCBhZGp1c3RIZWlnaHRPZmZzZXQsIGFkanVzdEhlaWdodEJvdHRvbSk7CiAgICBjb25zdCBkaXN0YW5jZUZvclRvcCA9IG1heEhlaWdodCAtIFdBTExfSU5JVElBTF9NQVhfSEVJR0hUOwogICAgYWRqdXN0SGVpZ2h0T2Zmc2V0ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoCiAgICAgIGFkanVzdEhlaWdodE5vcm1hbCwKICAgICAgZGlzdGFuY2VGb3JUb3AsCiAgICAgIGFkanVzdEhlaWdodE9mZnNldFNjcmF0Y2gKICAgICk7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHRvcCwgYWRqdXN0SGVpZ2h0T2Zmc2V0LCBhZGp1c3RIZWlnaHRUb3ApOwogIH0KICBmdW5jdGlvbiBudWRnZVhaKHN0YXJ0LCBlbmQpIHsKICAgIGNvbnN0IHN0YXJ0VG9YWmRpc3RhbmNlID0gUGxhbmVfZGVmYXVsdC5nZXRQb2ludERpc3RhbmNlKFhaX1BMQU5FLCBzdGFydCk7CiAgICBjb25zdCBlbmRUb1haZGlzdGFuY2UgPSBQbGFuZV9kZWZhdWx0LmdldFBvaW50RGlzdGFuY2UoWFpfUExBTkUsIGVuZCk7CiAgICBsZXQgb2Zmc2V0ID0gbnVkZ2VEaXJlY3Rpb25TY3JhdGNoOwogICAgaWYgKE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKHN0YXJ0VG9YWmRpc3RhbmNlLCAwLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjIpKSB7CiAgICAgIG9mZnNldCA9IGRpcmVjdGlvbihlbmQsIHN0YXJ0LCBvZmZzZXQpOwogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcihvZmZzZXQsIE1hdGhfZGVmYXVsdC5FUFNJTE9OMiwgb2Zmc2V0KTsKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChzdGFydCwgb2Zmc2V0LCBzdGFydCk7CiAgICB9IGVsc2UgaWYgKE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKGVuZFRvWFpkaXN0YW5jZSwgMCwgTWF0aF9kZWZhdWx0LkVQU0lMT04yKSkgewogICAgICBvZmZzZXQgPSBkaXJlY3Rpb24oc3RhcnQsIGVuZCwgb2Zmc2V0KTsKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIob2Zmc2V0LCBNYXRoX2RlZmF1bHQuRVBTSUxPTjIsIG9mZnNldCk7CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoZW5kLCBvZmZzZXQsIGVuZCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIG51ZGdlQ2FydG9ncmFwaGljKHN0YXJ0LCBlbmQpIHsKICAgIGNvbnN0IGFic1N0YXJ0TG9uID0gTWF0aC5hYnMoc3RhcnQubG9uZ2l0dWRlKTsKICAgIGNvbnN0IGFic0VuZExvbiA9IE1hdGguYWJzKGVuZC5sb25naXR1ZGUpOwogICAgaWYgKE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKGFic1N0YXJ0TG9uLCBNYXRoX2RlZmF1bHQuUEksIE1hdGhfZGVmYXVsdC5FUFNJTE9OMTEpKSB7CiAgICAgIGNvbnN0IGVuZFNpZ24gPSBNYXRoX2RlZmF1bHQuc2lnbihlbmQubG9uZ2l0dWRlKTsKICAgICAgc3RhcnQubG9uZ2l0dWRlID0gZW5kU2lnbiAqIChhYnNTdGFydExvbiAtIE1hdGhfZGVmYXVsdC5FUFNJTE9OMTEpOwogICAgICByZXR1cm4gMTsKICAgIH0gZWxzZSBpZiAoTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oYWJzRW5kTG9uLCBNYXRoX2RlZmF1bHQuUEksIE1hdGhfZGVmYXVsdC5FUFNJTE9OMTEpKSB7CiAgICAgIGNvbnN0IHN0YXJ0U2lnbiA9IE1hdGhfZGVmYXVsdC5zaWduKHN0YXJ0LmxvbmdpdHVkZSk7CiAgICAgIGVuZC5sb25naXR1ZGUgPSBzdGFydFNpZ24gKiAoYWJzRW5kTG9uIC0gTWF0aF9kZWZhdWx0LkVQU0lMT04xMSk7CiAgICAgIHJldHVybiAyOwogICAgfQogICAgcmV0dXJuIDA7CiAgfQogIGZ1bmN0aW9uIGdlbmVyYXRlR2VvbWV0cnlBdHRyaWJ1dGVzKGxvb3AsIHByb2plY3Rpb24sIGJvdHRvbVBvc2l0aW9uc0FycmF5LCB0b3BQb3NpdGlvbnNBcnJheSwgbm9ybWFsc0FycmF5LCBjYXJ0b2dyYXBoaWNzQXJyYXksIGNvbXB1dGUyZEF0dHJpYnV0ZXMpIHsKICAgIGxldCBpOwogICAgbGV0IGluZGV4OwogICAgY29uc3QgZWxsaXBzb2lkID0gcHJvamVjdGlvbi5fZWxsaXBzb2lkOwogICAgY29uc3Qgc2VnbWVudENvdW50ID0gYm90dG9tUG9zaXRpb25zQXJyYXkubGVuZ3RoIC8gMyAtIDE7CiAgICBjb25zdCB2ZXJ0ZXhDb3VudCA9IHNlZ21lbnRDb3VudCAqIDg7CiAgICBjb25zdCBhcnJheVNpemVWZWM0ID0gdmVydGV4Q291bnQgKiA0OwogICAgY29uc3QgaW5kZXhDb3VudCA9IHNlZ21lbnRDb3VudCAqIDM2OwogICAgY29uc3QgaW5kaWNlcyA9IHZlcnRleENvdW50ID4gNjU1MzUgPyBuZXcgVWludDMyQXJyYXkoaW5kZXhDb3VudCkgOiBuZXcgVWludDE2QXJyYXkoaW5kZXhDb3VudCk7CiAgICBjb25zdCBwb3NpdGlvbnNBcnJheSA9IG5ldyBGbG9hdDY0QXJyYXkodmVydGV4Q291bnQgKiAzKTsKICAgIGNvbnN0IHN0YXJ0SGlBbmRGb3J3YXJkT2Zmc2V0WCA9IG5ldyBGbG9hdDMyQXJyYXkoYXJyYXlTaXplVmVjNCk7CiAgICBjb25zdCBzdGFydExvQW5kRm9yd2FyZE9mZnNldFkgPSBuZXcgRmxvYXQzMkFycmF5KGFycmF5U2l6ZVZlYzQpOwogICAgY29uc3Qgc3RhcnROb3JtYWxBbmRGb3J3YXJkT2Zmc2V0WiA9IG5ldyBGbG9hdDMyQXJyYXkoYXJyYXlTaXplVmVjNCk7CiAgICBjb25zdCBlbmROb3JtYWxBbmRUZXh0dXJlQ29vcmRpbmF0ZU5vcm1hbGl6YXRpb25YID0gbmV3IEZsb2F0MzJBcnJheSgKICAgICAgYXJyYXlTaXplVmVjNAogICAgKTsKICAgIGNvbnN0IHJpZ2h0Tm9ybWFsQW5kVGV4dHVyZUNvb3JkaW5hdGVOb3JtYWxpemF0aW9uWSA9IG5ldyBGbG9hdDMyQXJyYXkoCiAgICAgIGFycmF5U2l6ZVZlYzQKICAgICk7CiAgICBsZXQgc3RhcnRIaUxvMkQ7CiAgICBsZXQgb2Zmc2V0QW5kUmlnaHQyRDsKICAgIGxldCBzdGFydEVuZE5vcm1hbHMyRDsKICAgIGxldCB0ZXhjb29yZE5vcm1hbGl6YXRpb24yRDsKICAgIGlmIChjb21wdXRlMmRBdHRyaWJ1dGVzKSB7CiAgICAgIHN0YXJ0SGlMbzJEID0gbmV3IEZsb2F0MzJBcnJheShhcnJheVNpemVWZWM0KTsKICAgICAgb2Zmc2V0QW5kUmlnaHQyRCA9IG5ldyBGbG9hdDMyQXJyYXkoYXJyYXlTaXplVmVjNCk7CiAgICAgIHN0YXJ0RW5kTm9ybWFsczJEID0gbmV3IEZsb2F0MzJBcnJheShhcnJheVNpemVWZWM0KTsKICAgICAgdGV4Y29vcmROb3JtYWxpemF0aW9uMkQgPSBuZXcgRmxvYXQzMkFycmF5KHZlcnRleENvdW50ICogMik7CiAgICB9CiAgICBjb25zdCBjYXJ0b2dyYXBoaWNzTGVuZ3RoID0gY2FydG9ncmFwaGljc0FycmF5Lmxlbmd0aCAvIDI7CiAgICBsZXQgbGVuZ3RoMkQgPSAwOwogICAgY29uc3Qgc3RhcnRDYXJ0b2dyYXBoaWMgPSBzdGFydENhcnRvZ3JhcGhpY1NjcmF0Y2g7CiAgICBzdGFydENhcnRvZ3JhcGhpYy5oZWlnaHQgPSAwOwogICAgY29uc3QgZW5kQ2FydG9ncmFwaGljID0gZW5kQ2FydG9ncmFwaGljU2NyYXRjaDsKICAgIGVuZENhcnRvZ3JhcGhpYy5oZWlnaHQgPSAwOwogICAgbGV0IHNlZ21lbnRTdGFydENhcnRlc2lhbiA9IHNlZ21lbnRTdGFydFRvcFNjcmF0Y2g7CiAgICBsZXQgc2VnbWVudEVuZENhcnRlc2lhbiA9IHNlZ21lbnRFbmRUb3BTY3JhdGNoOwogICAgaWYgKGNvbXB1dGUyZEF0dHJpYnV0ZXMpIHsKICAgICAgaW5kZXggPSAwOwogICAgICBmb3IgKGkgPSAxOyBpIDwgY2FydG9ncmFwaGljc0xlbmd0aDsgaSsrKSB7CiAgICAgICAgc3RhcnRDYXJ0b2dyYXBoaWMubGF0aXR1ZGUgPSBjYXJ0b2dyYXBoaWNzQXJyYXlbaW5kZXhdOwogICAgICAgIHN0YXJ0Q2FydG9ncmFwaGljLmxvbmdpdHVkZSA9IGNhcnRvZ3JhcGhpY3NBcnJheVtpbmRleCArIDFdOwogICAgICAgIGVuZENhcnRvZ3JhcGhpYy5sYXRpdHVkZSA9IGNhcnRvZ3JhcGhpY3NBcnJheVtpbmRleCArIDJdOwogICAgICAgIGVuZENhcnRvZ3JhcGhpYy5sb25naXR1ZGUgPSBjYXJ0b2dyYXBoaWNzQXJyYXlbaW5kZXggKyAzXTsKICAgICAgICBzZWdtZW50U3RhcnRDYXJ0ZXNpYW4gPSBwcm9qZWN0aW9uLnByb2plY3QoCiAgICAgICAgICBzdGFydENhcnRvZ3JhcGhpYywKICAgICAgICAgIHNlZ21lbnRTdGFydENhcnRlc2lhbgogICAgICAgICk7CiAgICAgICAgc2VnbWVudEVuZENhcnRlc2lhbiA9IHByb2plY3Rpb24ucHJvamVjdCgKICAgICAgICAgIGVuZENhcnRvZ3JhcGhpYywKICAgICAgICAgIHNlZ21lbnRFbmRDYXJ0ZXNpYW4KICAgICAgICApOwogICAgICAgIGxlbmd0aDJEICs9IENhcnRlc2lhbjNfZGVmYXVsdC5kaXN0YW5jZSgKICAgICAgICAgIHNlZ21lbnRTdGFydENhcnRlc2lhbiwKICAgICAgICAgIHNlZ21lbnRFbmRDYXJ0ZXNpYW4KICAgICAgICApOwogICAgICAgIGluZGV4ICs9IDI7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHBvc2l0aW9uc0xlbmd0aCA9IHRvcFBvc2l0aW9uc0FycmF5Lmxlbmd0aCAvIDM7CiAgICBzZWdtZW50RW5kQ2FydGVzaWFuID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjaygKICAgICAgdG9wUG9zaXRpb25zQXJyYXksCiAgICAgIDAsCiAgICAgIHNlZ21lbnRFbmRDYXJ0ZXNpYW4KICAgICk7CiAgICBsZXQgbGVuZ3RoM0QgPSAwOwogICAgaW5kZXggPSAzOwogICAgZm9yIChpID0gMTsgaSA8IHBvc2l0aW9uc0xlbmd0aDsgaSsrKSB7CiAgICAgIHNlZ21lbnRTdGFydENhcnRlc2lhbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZSgKICAgICAgICBzZWdtZW50RW5kQ2FydGVzaWFuLAogICAgICAgIHNlZ21lbnRTdGFydENhcnRlc2lhbgogICAgICApOwogICAgICBzZWdtZW50RW5kQ2FydGVzaWFuID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjaygKICAgICAgICB0b3BQb3NpdGlvbnNBcnJheSwKICAgICAgICBpbmRleCwKICAgICAgICBzZWdtZW50RW5kQ2FydGVzaWFuCiAgICAgICk7CiAgICAgIGxlbmd0aDNEICs9IENhcnRlc2lhbjNfZGVmYXVsdC5kaXN0YW5jZShzZWdtZW50U3RhcnRDYXJ0ZXNpYW4sIHNlZ21lbnRFbmRDYXJ0ZXNpYW4pOwogICAgICBpbmRleCArPSAzOwogICAgfQogICAgbGV0IGo7CiAgICBpbmRleCA9IDM7CiAgICBsZXQgY2FydG9ncmFwaGljc0luZGV4ID0gMDsKICAgIGxldCB2ZWMyc1dyaXRlSW5kZXggPSAwOwogICAgbGV0IHZlYzNzV3JpdGVJbmRleCA9IDA7CiAgICBsZXQgdmVjNHNXcml0ZUluZGV4ID0gMDsKICAgIGxldCBtaXRlckJyb2tlbiA9IGZhbHNlOwogICAgbGV0IGVuZEJvdHRvbSA9IENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2soCiAgICAgIGJvdHRvbVBvc2l0aW9uc0FycmF5LAogICAgICAwLAogICAgICBzZWdtZW50RW5kQm90dG9tU2NyYXRjaAogICAgKTsKICAgIGxldCBlbmRUb3AgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKHRvcFBvc2l0aW9uc0FycmF5LCAwLCBzZWdtZW50RW5kVG9wU2NyYXRjaCk7CiAgICBsZXQgZW5kR2VvbWV0cnlOb3JtYWwgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKAogICAgICBub3JtYWxzQXJyYXksCiAgICAgIDAsCiAgICAgIHNlZ21lbnRFbmROb3JtYWxTY3JhdGNoCiAgICApOwogICAgaWYgKGxvb3ApIHsKICAgICAgY29uc3QgcHJlRW5kQm90dG9tID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjaygKICAgICAgICBib3R0b21Qb3NpdGlvbnNBcnJheSwKICAgICAgICBib3R0b21Qb3NpdGlvbnNBcnJheS5sZW5ndGggLSA2LAogICAgICAgIHNlZ21lbnRTdGFydEJvdHRvbVNjcmF0Y2gKICAgICAgKTsKICAgICAgaWYgKGJyZWFrTWl0ZXIoZW5kR2VvbWV0cnlOb3JtYWwsIHByZUVuZEJvdHRvbSwgZW5kQm90dG9tLCBlbmRUb3ApKSB7CiAgICAgICAgZW5kR2VvbWV0cnlOb3JtYWwgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKAogICAgICAgICAgZW5kR2VvbWV0cnlOb3JtYWwsCiAgICAgICAgICBlbmRHZW9tZXRyeU5vcm1hbAogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGxldCBsZW5ndGhTb0ZhcjNEID0gMDsKICAgIGxldCBsZW5ndGhTb0ZhcjJEID0gMDsKICAgIGxldCBzdW1IZWlnaHRzID0gMDsKICAgIGZvciAoaSA9IDA7IGkgPCBzZWdtZW50Q291bnQ7IGkrKykgewogICAgICBjb25zdCBzdGFydEJvdHRvbSA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShlbmRCb3R0b20sIHNlZ21lbnRTdGFydEJvdHRvbVNjcmF0Y2gpOwogICAgICBjb25zdCBzdGFydFRvcCA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShlbmRUb3AsIHNlZ21lbnRTdGFydFRvcFNjcmF0Y2gpOwogICAgICBsZXQgc3RhcnRHZW9tZXRyeU5vcm1hbCA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZSgKICAgICAgICBlbmRHZW9tZXRyeU5vcm1hbCwKICAgICAgICBzZWdtZW50U3RhcnROb3JtYWxTY3JhdGNoCiAgICAgICk7CiAgICAgIGlmIChtaXRlckJyb2tlbikgewogICAgICAgIHN0YXJ0R2VvbWV0cnlOb3JtYWwgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKAogICAgICAgICAgc3RhcnRHZW9tZXRyeU5vcm1hbCwKICAgICAgICAgIHN0YXJ0R2VvbWV0cnlOb3JtYWwKICAgICAgICApOwogICAgICB9CiAgICAgIGVuZEJvdHRvbSA9IENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2soCiAgICAgICAgYm90dG9tUG9zaXRpb25zQXJyYXksCiAgICAgICAgaW5kZXgsCiAgICAgICAgc2VnbWVudEVuZEJvdHRvbVNjcmF0Y2gKICAgICAgKTsKICAgICAgZW5kVG9wID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjayh0b3BQb3NpdGlvbnNBcnJheSwgaW5kZXgsIHNlZ21lbnRFbmRUb3BTY3JhdGNoKTsKICAgICAgZW5kR2VvbWV0cnlOb3JtYWwgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKAogICAgICAgIG5vcm1hbHNBcnJheSwKICAgICAgICBpbmRleCwKICAgICAgICBzZWdtZW50RW5kTm9ybWFsU2NyYXRjaAogICAgICApOwogICAgICBtaXRlckJyb2tlbiA9IGJyZWFrTWl0ZXIoZW5kR2VvbWV0cnlOb3JtYWwsIHN0YXJ0Qm90dG9tLCBlbmRCb3R0b20sIGVuZFRvcCk7CiAgICAgIHN0YXJ0Q2FydG9ncmFwaGljLmxhdGl0dWRlID0gY2FydG9ncmFwaGljc0FycmF5W2NhcnRvZ3JhcGhpY3NJbmRleF07CiAgICAgIHN0YXJ0Q2FydG9ncmFwaGljLmxvbmdpdHVkZSA9IGNhcnRvZ3JhcGhpY3NBcnJheVtjYXJ0b2dyYXBoaWNzSW5kZXggKyAxXTsKICAgICAgZW5kQ2FydG9ncmFwaGljLmxhdGl0dWRlID0gY2FydG9ncmFwaGljc0FycmF5W2NhcnRvZ3JhcGhpY3NJbmRleCArIDJdOwogICAgICBlbmRDYXJ0b2dyYXBoaWMubG9uZ2l0dWRlID0gY2FydG9ncmFwaGljc0FycmF5W2NhcnRvZ3JhcGhpY3NJbmRleCArIDNdOwogICAgICBsZXQgc3RhcnQyRDsKICAgICAgbGV0IGVuZDJEOwogICAgICBsZXQgc3RhcnRHZW9tZXRyeU5vcm1hbDJEOwogICAgICBsZXQgZW5kR2VvbWV0cnlOb3JtYWwyRDsKICAgICAgaWYgKGNvbXB1dGUyZEF0dHJpYnV0ZXMpIHsKICAgICAgICBjb25zdCBudWRnZVJlc3VsdCA9IG51ZGdlQ2FydG9ncmFwaGljKHN0YXJ0Q2FydG9ncmFwaGljLCBlbmRDYXJ0b2dyYXBoaWMpOwogICAgICAgIHN0YXJ0MkQgPSBwcm9qZWN0aW9uLnByb2plY3Qoc3RhcnRDYXJ0b2dyYXBoaWMsIHNlZ21lbnRTdGFydDJEU2NyYXRjaCk7CiAgICAgICAgZW5kMkQgPSBwcm9qZWN0aW9uLnByb2plY3QoZW5kQ2FydG9ncmFwaGljLCBzZWdtZW50RW5kMkRTY3JhdGNoKTsKICAgICAgICBjb25zdCBkaXJlY3Rpb24yRCA9IGRpcmVjdGlvbihlbmQyRCwgc3RhcnQyRCwgZm9yd2FyZE9mZnNldDJEU2NyYXRjaCk7CiAgICAgICAgZGlyZWN0aW9uMkQueSA9IE1hdGguYWJzKGRpcmVjdGlvbjJELnkpOwogICAgICAgIHN0YXJ0R2VvbWV0cnlOb3JtYWwyRCA9IHNlZ21lbnRTdGFydE5vcm1hbDJEU2NyYXRjaDsKICAgICAgICBlbmRHZW9tZXRyeU5vcm1hbDJEID0gc2VnbWVudEVuZE5vcm1hbDJEU2NyYXRjaDsKICAgICAgICBpZiAobnVkZ2VSZXN1bHQgPT09IDAgfHwgQ2FydGVzaWFuM19kZWZhdWx0LmRvdChkaXJlY3Rpb24yRCwgQ2FydGVzaWFuM19kZWZhdWx0LlVOSVRfWSkgPiBNSVRFUl9CUkVBS19TTUFMTCkgewogICAgICAgICAgc3RhcnRHZW9tZXRyeU5vcm1hbDJEID0gcHJvamVjdE5vcm1hbCgKICAgICAgICAgICAgcHJvamVjdGlvbiwKICAgICAgICAgICAgc3RhcnRDYXJ0b2dyYXBoaWMsCiAgICAgICAgICAgIHN0YXJ0R2VvbWV0cnlOb3JtYWwsCiAgICAgICAgICAgIHN0YXJ0MkQsCiAgICAgICAgICAgIHNlZ21lbnRTdGFydE5vcm1hbDJEU2NyYXRjaAogICAgICAgICAgKTsKICAgICAgICAgIGVuZEdlb21ldHJ5Tm9ybWFsMkQgPSBwcm9qZWN0Tm9ybWFsKAogICAgICAgICAgICBwcm9qZWN0aW9uLAogICAgICAgICAgICBlbmRDYXJ0b2dyYXBoaWMsCiAgICAgICAgICAgIGVuZEdlb21ldHJ5Tm9ybWFsLAogICAgICAgICAgICBlbmQyRCwKICAgICAgICAgICAgc2VnbWVudEVuZE5vcm1hbDJEU2NyYXRjaAogICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgaWYgKG51ZGdlUmVzdWx0ID09PSAxKSB7CiAgICAgICAgICBlbmRHZW9tZXRyeU5vcm1hbDJEID0gcHJvamVjdE5vcm1hbCgKICAgICAgICAgICAgcHJvamVjdGlvbiwKICAgICAgICAgICAgZW5kQ2FydG9ncmFwaGljLAogICAgICAgICAgICBlbmRHZW9tZXRyeU5vcm1hbCwKICAgICAgICAgICAgZW5kMkQsCiAgICAgICAgICAgIHNlZ21lbnRFbmROb3JtYWwyRFNjcmF0Y2gKICAgICAgICAgICk7CiAgICAgICAgICBzdGFydEdlb21ldHJ5Tm9ybWFsMkQueCA9IDA7CiAgICAgICAgICBzdGFydEdlb21ldHJ5Tm9ybWFsMkQueSA9IE1hdGhfZGVmYXVsdC5zaWduKAogICAgICAgICAgICBzdGFydENhcnRvZ3JhcGhpYy5sb25naXR1ZGUgLSBNYXRoLmFicyhlbmRDYXJ0b2dyYXBoaWMubG9uZ2l0dWRlKQogICAgICAgICAgKTsKICAgICAgICAgIHN0YXJ0R2VvbWV0cnlOb3JtYWwyRC56ID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhcnRHZW9tZXRyeU5vcm1hbDJEID0gcHJvamVjdE5vcm1hbCgKICAgICAgICAgICAgcHJvamVjdGlvbiwKICAgICAgICAgICAgc3RhcnRDYXJ0b2dyYXBoaWMsCiAgICAgICAgICAgIHN0YXJ0R2VvbWV0cnlOb3JtYWwsCiAgICAgICAgICAgIHN0YXJ0MkQsCiAgICAgICAgICAgIHNlZ21lbnRTdGFydE5vcm1hbDJEU2NyYXRjaAogICAgICAgICAgKTsKICAgICAgICAgIGVuZEdlb21ldHJ5Tm9ybWFsMkQueCA9IDA7CiAgICAgICAgICBlbmRHZW9tZXRyeU5vcm1hbDJELnkgPSBNYXRoX2RlZmF1bHQuc2lnbigKICAgICAgICAgICAgc3RhcnRDYXJ0b2dyYXBoaWMubG9uZ2l0dWRlIC0gZW5kQ2FydG9ncmFwaGljLmxvbmdpdHVkZQogICAgICAgICAgKTsKICAgICAgICAgIGVuZEdlb21ldHJ5Tm9ybWFsMkQueiA9IDA7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHNlZ21lbnRMZW5ndGgzRCA9IENhcnRlc2lhbjNfZGVmYXVsdC5kaXN0YW5jZShzdGFydFRvcCwgZW5kVG9wKTsKICAgICAgY29uc3QgZW5jb2RlZFN0YXJ0ID0gRW5jb2RlZENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQ2FydGVzaWFuKAogICAgICAgIHN0YXJ0Qm90dG9tLAogICAgICAgIGVuY29kZVNjcmF0Y2gKICAgICAgKTsKICAgICAgY29uc3QgZm9yd2FyZE9mZnNldCA9IENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdCgKICAgICAgICBlbmRCb3R0b20sCiAgICAgICAgc3RhcnRCb3R0b20sCiAgICAgICAgb2Zmc2V0U2NyYXRjaDIKICAgICAgKTsKICAgICAgY29uc3QgZm9yd2FyZCA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoZm9yd2FyZE9mZnNldCwgcmlnaHRTY3JhdGNoMik7CiAgICAgIGxldCBzdGFydFVwID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KHN0YXJ0VG9wLCBzdGFydEJvdHRvbSwgc3RhcnRVcFNjcmF0Y2gpOwogICAgICBzdGFydFVwID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShzdGFydFVwLCBzdGFydFVwKTsKICAgICAgbGV0IHJpZ2h0Tm9ybWFsID0gQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKGZvcndhcmQsIHN0YXJ0VXAsIHJpZ2h0U2NyYXRjaDIpOwogICAgICByaWdodE5vcm1hbCA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUocmlnaHROb3JtYWwsIHJpZ2h0Tm9ybWFsKTsKICAgICAgbGV0IHN0YXJ0UGxhbmVOb3JtYWwgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3MoCiAgICAgICAgc3RhcnRVcCwKICAgICAgICBzdGFydEdlb21ldHJ5Tm9ybWFsLAogICAgICAgIHN0YXJ0UGxhbmVOb3JtYWxTY3JhdGNoCiAgICAgICk7CiAgICAgIHN0YXJ0UGxhbmVOb3JtYWwgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKHN0YXJ0UGxhbmVOb3JtYWwsIHN0YXJ0UGxhbmVOb3JtYWwpOwogICAgICBsZXQgZW5kVXAgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoZW5kVG9wLCBlbmRCb3R0b20sIGVuZFVwU2NyYXRjaCk7CiAgICAgIGVuZFVwID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShlbmRVcCwgZW5kVXApOwogICAgICBsZXQgZW5kUGxhbmVOb3JtYWwgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3MoCiAgICAgICAgZW5kR2VvbWV0cnlOb3JtYWwsCiAgICAgICAgZW5kVXAsCiAgICAgICAgZW5kUGxhbmVOb3JtYWxTY3JhdGNoCiAgICAgICk7CiAgICAgIGVuZFBsYW5lTm9ybWFsID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShlbmRQbGFuZU5vcm1hbCwgZW5kUGxhbmVOb3JtYWwpOwogICAgICBjb25zdCB0ZXhjb29yZE5vcm1hbGl6YXRpb24zRFggPSBzZWdtZW50TGVuZ3RoM0QgLyBsZW5ndGgzRDsKICAgICAgY29uc3QgdGV4Y29vcmROb3JtYWxpemF0aW9uM0RZID0gbGVuZ3RoU29GYXIzRCAvIGxlbmd0aDNEOwogICAgICBsZXQgc2VnbWVudExlbmd0aDJEID0gMDsKICAgICAgbGV0IGVuY29kZWRTdGFydDJEOwogICAgICBsZXQgZm9yd2FyZE9mZnNldDJEOwogICAgICBsZXQgcmlnaHQyRDsKICAgICAgbGV0IHRleGNvb3JkTm9ybWFsaXphdGlvbjJEWCA9IDA7CiAgICAgIGxldCB0ZXhjb29yZE5vcm1hbGl6YXRpb24yRFkgPSAwOwogICAgICBpZiAoY29tcHV0ZTJkQXR0cmlidXRlcykgewogICAgICAgIHNlZ21lbnRMZW5ndGgyRCA9IENhcnRlc2lhbjNfZGVmYXVsdC5kaXN0YW5jZShzdGFydDJELCBlbmQyRCk7CiAgICAgICAgZW5jb2RlZFN0YXJ0MkQgPSBFbmNvZGVkQ2FydGVzaWFuM19kZWZhdWx0LmZyb21DYXJ0ZXNpYW4oCiAgICAgICAgICBzdGFydDJELAogICAgICAgICAgZW5jb2RlU2NyYXRjaDJECiAgICAgICAgKTsKICAgICAgICBmb3J3YXJkT2Zmc2V0MkQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoCiAgICAgICAgICBlbmQyRCwKICAgICAgICAgIHN0YXJ0MkQsCiAgICAgICAgICBmb3J3YXJkT2Zmc2V0MkRTY3JhdGNoCiAgICAgICAgKTsKICAgICAgICByaWdodDJEID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZShmb3J3YXJkT2Zmc2V0MkQsIHJpZ2h0MkRTY3JhdGNoKTsKICAgICAgICBjb25zdCBzd2FwMiA9IHJpZ2h0MkQueDsKICAgICAgICByaWdodDJELnggPSByaWdodDJELnk7CiAgICAgICAgcmlnaHQyRC55ID0gLXN3YXAyOwogICAgICAgIHRleGNvb3JkTm9ybWFsaXphdGlvbjJEWCA9IHNlZ21lbnRMZW5ndGgyRCAvIGxlbmd0aDJEOwogICAgICAgIHRleGNvb3JkTm9ybWFsaXphdGlvbjJEWSA9IGxlbmd0aFNvRmFyMkQgLyBsZW5ndGgyRDsKICAgICAgfQogICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CiAgICAgICAgY29uc3QgdmVjNEluZGV4ID0gdmVjNHNXcml0ZUluZGV4ICsgaiAqIDQ7CiAgICAgICAgY29uc3QgdmVjMkluZGV4ID0gdmVjMnNXcml0ZUluZGV4ICsgaiAqIDI7CiAgICAgICAgY29uc3Qgd0luZGV4ID0gdmVjNEluZGV4ICsgMzsKICAgICAgICBjb25zdCByaWdodFBsYW5lU2lkZSA9IGogPCA0ID8gMSA6IC0xOwogICAgICAgIGNvbnN0IHRvcEJvdHRvbVNpZGUgPSBqID09PSAyIHx8IGogPT09IDMgfHwgaiA9PT0gNiB8fCBqID09PSA3ID8gMSA6IC0xOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKGVuY29kZWRTdGFydC5oaWdoLCBzdGFydEhpQW5kRm9yd2FyZE9mZnNldFgsIHZlYzRJbmRleCk7CiAgICAgICAgc3RhcnRIaUFuZEZvcndhcmRPZmZzZXRYW3dJbmRleF0gPSBmb3J3YXJkT2Zmc2V0Lng7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2soZW5jb2RlZFN0YXJ0Lmxvdywgc3RhcnRMb0FuZEZvcndhcmRPZmZzZXRZLCB2ZWM0SW5kZXgpOwogICAgICAgIHN0YXJ0TG9BbmRGb3J3YXJkT2Zmc2V0WVt3SW5kZXhdID0gZm9yd2FyZE9mZnNldC55OwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKAogICAgICAgICAgc3RhcnRQbGFuZU5vcm1hbCwKICAgICAgICAgIHN0YXJ0Tm9ybWFsQW5kRm9yd2FyZE9mZnNldFosCiAgICAgICAgICB2ZWM0SW5kZXgKICAgICAgICApOwogICAgICAgIHN0YXJ0Tm9ybWFsQW5kRm9yd2FyZE9mZnNldFpbd0luZGV4XSA9IGZvcndhcmRPZmZzZXQuejsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjaygKICAgICAgICAgIGVuZFBsYW5lTm9ybWFsLAogICAgICAgICAgZW5kTm9ybWFsQW5kVGV4dHVyZUNvb3JkaW5hdGVOb3JtYWxpemF0aW9uWCwKICAgICAgICAgIHZlYzRJbmRleAogICAgICAgICk7CiAgICAgICAgZW5kTm9ybWFsQW5kVGV4dHVyZUNvb3JkaW5hdGVOb3JtYWxpemF0aW9uWFt3SW5kZXhdID0gdGV4Y29vcmROb3JtYWxpemF0aW9uM0RYICogcmlnaHRQbGFuZVNpZGU7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2soCiAgICAgICAgICByaWdodE5vcm1hbCwKICAgICAgICAgIHJpZ2h0Tm9ybWFsQW5kVGV4dHVyZUNvb3JkaW5hdGVOb3JtYWxpemF0aW9uWSwKICAgICAgICAgIHZlYzRJbmRleAogICAgICAgICk7CiAgICAgICAgbGV0IHRleGNvb3JkTm9ybWFsaXphdGlvbiA9IHRleGNvb3JkTm9ybWFsaXphdGlvbjNEWSAqIHRvcEJvdHRvbVNpZGU7CiAgICAgICAgaWYgKHRleGNvb3JkTm9ybWFsaXphdGlvbiA9PT0gMCAmJiB0b3BCb3R0b21TaWRlIDwgMCkgewogICAgICAgICAgdGV4Y29vcmROb3JtYWxpemF0aW9uID0gOTsKICAgICAgICB9CiAgICAgICAgcmlnaHROb3JtYWxBbmRUZXh0dXJlQ29vcmRpbmF0ZU5vcm1hbGl6YXRpb25ZW3dJbmRleF0gPSB0ZXhjb29yZE5vcm1hbGl6YXRpb247CiAgICAgICAgaWYgKGNvbXB1dGUyZEF0dHJpYnV0ZXMpIHsKICAgICAgICAgIHN0YXJ0SGlMbzJEW3ZlYzRJbmRleF0gPSBlbmNvZGVkU3RhcnQyRC5oaWdoLng7CiAgICAgICAgICBzdGFydEhpTG8yRFt2ZWM0SW5kZXggKyAxXSA9IGVuY29kZWRTdGFydDJELmhpZ2gueTsKICAgICAgICAgIHN0YXJ0SGlMbzJEW3ZlYzRJbmRleCArIDJdID0gZW5jb2RlZFN0YXJ0MkQubG93Lng7CiAgICAgICAgICBzdGFydEhpTG8yRFt2ZWM0SW5kZXggKyAzXSA9IGVuY29kZWRTdGFydDJELmxvdy55OwogICAgICAgICAgc3RhcnRFbmROb3JtYWxzMkRbdmVjNEluZGV4XSA9IC1zdGFydEdlb21ldHJ5Tm9ybWFsMkQueTsKICAgICAgICAgIHN0YXJ0RW5kTm9ybWFsczJEW3ZlYzRJbmRleCArIDFdID0gc3RhcnRHZW9tZXRyeU5vcm1hbDJELng7CiAgICAgICAgICBzdGFydEVuZE5vcm1hbHMyRFt2ZWM0SW5kZXggKyAyXSA9IGVuZEdlb21ldHJ5Tm9ybWFsMkQueTsKICAgICAgICAgIHN0YXJ0RW5kTm9ybWFsczJEW3ZlYzRJbmRleCArIDNdID0gLWVuZEdlb21ldHJ5Tm9ybWFsMkQueDsKICAgICAgICAgIG9mZnNldEFuZFJpZ2h0MkRbdmVjNEluZGV4XSA9IGZvcndhcmRPZmZzZXQyRC54OwogICAgICAgICAgb2Zmc2V0QW5kUmlnaHQyRFt2ZWM0SW5kZXggKyAxXSA9IGZvcndhcmRPZmZzZXQyRC55OwogICAgICAgICAgb2Zmc2V0QW5kUmlnaHQyRFt2ZWM0SW5kZXggKyAyXSA9IHJpZ2h0MkQueDsKICAgICAgICAgIG9mZnNldEFuZFJpZ2h0MkRbdmVjNEluZGV4ICsgM10gPSByaWdodDJELnk7CiAgICAgICAgICB0ZXhjb29yZE5vcm1hbGl6YXRpb24yRFt2ZWMySW5kZXhdID0gdGV4Y29vcmROb3JtYWxpemF0aW9uMkRYICogcmlnaHRQbGFuZVNpZGU7CiAgICAgICAgICB0ZXhjb29yZE5vcm1hbGl6YXRpb24gPSB0ZXhjb29yZE5vcm1hbGl6YXRpb24yRFkgKiB0b3BCb3R0b21TaWRlOwogICAgICAgICAgaWYgKHRleGNvb3JkTm9ybWFsaXphdGlvbiA9PT0gMCAmJiB0b3BCb3R0b21TaWRlIDwgMCkgewogICAgICAgICAgICB0ZXhjb29yZE5vcm1hbGl6YXRpb24gPSA5OwogICAgICAgICAgfQogICAgICAgICAgdGV4Y29vcmROb3JtYWxpemF0aW9uMkRbdmVjMkluZGV4ICsgMV0gPSB0ZXhjb29yZE5vcm1hbGl6YXRpb247CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IGFkanVzdEhlaWdodFN0YXJ0Qm90dG9tID0gYWRqdXN0SGVpZ2h0U3RhcnRCb3R0b21TY3JhdGNoOwogICAgICBjb25zdCBhZGp1c3RIZWlnaHRFbmRCb3R0b20gPSBhZGp1c3RIZWlnaHRFbmRCb3R0b21TY3JhdGNoOwogICAgICBjb25zdCBhZGp1c3RIZWlnaHRTdGFydFRvcCA9IGFkanVzdEhlaWdodFN0YXJ0VG9wU2NyYXRjaDsKICAgICAgY29uc3QgYWRqdXN0SGVpZ2h0RW5kVG9wID0gYWRqdXN0SGVpZ2h0RW5kVG9wU2NyYXRjaDsKICAgICAgY29uc3QgZ2V0SGVpZ2h0c1JlY3RhbmdsZSA9IFJlY3RhbmdsZV9kZWZhdWx0LmZyb21DYXJ0b2dyYXBoaWNBcnJheSgKICAgICAgICBnZXRIZWlnaHRDYXJ0b2dyYXBoaWNzLAogICAgICAgIGdldEhlaWdodFJlY3RhbmdsZVNjcmF0Y2gKICAgICAgKTsKICAgICAgY29uc3QgbWluTWF4SGVpZ2h0cyA9IEFwcHJveGltYXRlVGVycmFpbkhlaWdodHNfZGVmYXVsdC5nZXRNaW5pbXVtTWF4aW11bUhlaWdodHMoCiAgICAgICAgZ2V0SGVpZ2h0c1JlY3RhbmdsZSwKICAgICAgICBlbGxpcHNvaWQKICAgICAgKTsKICAgICAgY29uc3QgbWluSGVpZ2h0ID0gbWluTWF4SGVpZ2h0cy5taW5pbXVtVGVycmFpbkhlaWdodDsKICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gbWluTWF4SGVpZ2h0cy5tYXhpbXVtVGVycmFpbkhlaWdodDsKICAgICAgc3VtSGVpZ2h0cyArPSBNYXRoLmFicyhtaW5IZWlnaHQpOwogICAgICBzdW1IZWlnaHRzICs9IE1hdGguYWJzKG1heEhlaWdodCk7CiAgICAgIGFkanVzdEhlaWdodHMoCiAgICAgICAgc3RhcnRCb3R0b20sCiAgICAgICAgc3RhcnRUb3AsCiAgICAgICAgbWluSGVpZ2h0LAogICAgICAgIG1heEhlaWdodCwKICAgICAgICBhZGp1c3RIZWlnaHRTdGFydEJvdHRvbSwKICAgICAgICBhZGp1c3RIZWlnaHRTdGFydFRvcAogICAgICApOwogICAgICBhZGp1c3RIZWlnaHRzKAogICAgICAgIGVuZEJvdHRvbSwKICAgICAgICBlbmRUb3AsCiAgICAgICAgbWluSGVpZ2h0LAogICAgICAgIG1heEhlaWdodCwKICAgICAgICBhZGp1c3RIZWlnaHRFbmRCb3R0b20sCiAgICAgICAgYWRqdXN0SGVpZ2h0RW5kVG9wCiAgICAgICk7CiAgICAgIGxldCBub3JtYWxOdWRnZSA9IENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKAogICAgICAgIHJpZ2h0Tm9ybWFsLAogICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9ONSwKICAgICAgICBub3JtYWxOdWRnZVNjcmF0Y2gKICAgICAgKTsKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZCgKICAgICAgICBhZGp1c3RIZWlnaHRTdGFydEJvdHRvbSwKICAgICAgICBub3JtYWxOdWRnZSwKICAgICAgICBhZGp1c3RIZWlnaHRTdGFydEJvdHRvbQogICAgICApOwogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGFkanVzdEhlaWdodEVuZEJvdHRvbSwgbm9ybWFsTnVkZ2UsIGFkanVzdEhlaWdodEVuZEJvdHRvbSk7CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoYWRqdXN0SGVpZ2h0U3RhcnRUb3AsIG5vcm1hbE51ZGdlLCBhZGp1c3RIZWlnaHRTdGFydFRvcCk7CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoYWRqdXN0SGVpZ2h0RW5kVG9wLCBub3JtYWxOdWRnZSwgYWRqdXN0SGVpZ2h0RW5kVG9wKTsKICAgICAgbnVkZ2VYWihhZGp1c3RIZWlnaHRTdGFydEJvdHRvbSwgYWRqdXN0SGVpZ2h0RW5kQm90dG9tKTsKICAgICAgbnVkZ2VYWihhZGp1c3RIZWlnaHRTdGFydFRvcCwgYWRqdXN0SGVpZ2h0RW5kVG9wKTsKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2soYWRqdXN0SGVpZ2h0U3RhcnRCb3R0b20sIHBvc2l0aW9uc0FycmF5LCB2ZWMzc1dyaXRlSW5kZXgpOwogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayhhZGp1c3RIZWlnaHRFbmRCb3R0b20sIHBvc2l0aW9uc0FycmF5LCB2ZWMzc1dyaXRlSW5kZXggKyAzKTsKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2soYWRqdXN0SGVpZ2h0RW5kVG9wLCBwb3NpdGlvbnNBcnJheSwgdmVjM3NXcml0ZUluZGV4ICsgNik7CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKGFkanVzdEhlaWdodFN0YXJ0VG9wLCBwb3NpdGlvbnNBcnJheSwgdmVjM3NXcml0ZUluZGV4ICsgOSk7CiAgICAgIG5vcm1hbE51ZGdlID0gQ2FydGVzaWFuM19kZWZhdWx0Lm11bHRpcGx5QnlTY2FsYXIoCiAgICAgICAgcmlnaHROb3JtYWwsCiAgICAgICAgLTIgKiBNYXRoX2RlZmF1bHQuRVBTSUxPTjUsCiAgICAgICAgbm9ybWFsTnVkZ2VTY3JhdGNoCiAgICAgICk7CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoCiAgICAgICAgYWRqdXN0SGVpZ2h0U3RhcnRCb3R0b20sCiAgICAgICAgbm9ybWFsTnVkZ2UsCiAgICAgICAgYWRqdXN0SGVpZ2h0U3RhcnRCb3R0b20KICAgICAgKTsKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChhZGp1c3RIZWlnaHRFbmRCb3R0b20sIG5vcm1hbE51ZGdlLCBhZGp1c3RIZWlnaHRFbmRCb3R0b20pOwogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGFkanVzdEhlaWdodFN0YXJ0VG9wLCBub3JtYWxOdWRnZSwgYWRqdXN0SGVpZ2h0U3RhcnRUb3ApOwogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGFkanVzdEhlaWdodEVuZFRvcCwgbm9ybWFsTnVkZ2UsIGFkanVzdEhlaWdodEVuZFRvcCk7CiAgICAgIG51ZGdlWFooYWRqdXN0SGVpZ2h0U3RhcnRCb3R0b20sIGFkanVzdEhlaWdodEVuZEJvdHRvbSk7CiAgICAgIG51ZGdlWFooYWRqdXN0SGVpZ2h0U3RhcnRUb3AsIGFkanVzdEhlaWdodEVuZFRvcCk7CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKAogICAgICAgIGFkanVzdEhlaWdodFN0YXJ0Qm90dG9tLAogICAgICAgIHBvc2l0aW9uc0FycmF5LAogICAgICAgIHZlYzNzV3JpdGVJbmRleCArIDEyCiAgICAgICk7CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKAogICAgICAgIGFkanVzdEhlaWdodEVuZEJvdHRvbSwKICAgICAgICBwb3NpdGlvbnNBcnJheSwKICAgICAgICB2ZWMzc1dyaXRlSW5kZXggKyAxNQogICAgICApOwogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayhhZGp1c3RIZWlnaHRFbmRUb3AsIHBvc2l0aW9uc0FycmF5LCB2ZWMzc1dyaXRlSW5kZXggKyAxOCk7CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKGFkanVzdEhlaWdodFN0YXJ0VG9wLCBwb3NpdGlvbnNBcnJheSwgdmVjM3NXcml0ZUluZGV4ICsgMjEpOwogICAgICBjYXJ0b2dyYXBoaWNzSW5kZXggKz0gMjsKICAgICAgaW5kZXggKz0gMzsKICAgICAgdmVjMnNXcml0ZUluZGV4ICs9IDE2OwogICAgICB2ZWMzc1dyaXRlSW5kZXggKz0gMjQ7CiAgICAgIHZlYzRzV3JpdGVJbmRleCArPSAzMjsKICAgICAgbGVuZ3RoU29GYXIzRCArPSBzZWdtZW50TGVuZ3RoM0Q7CiAgICAgIGxlbmd0aFNvRmFyMkQgKz0gc2VnbWVudExlbmd0aDJEOwogICAgfQogICAgaW5kZXggPSAwOwogICAgbGV0IGluZGV4T2Zmc2V0ID0gMDsKICAgIGZvciAoaSA9IDA7IGkgPCBzZWdtZW50Q291bnQ7IGkrKykgewogICAgICBmb3IgKGogPSAwOyBqIDwgUkVGRVJFTkNFX0lORElDRVNfTEVOR1RIOyBqKyspIHsKICAgICAgICBpbmRpY2VzW2luZGV4ICsgal0gPSBSRUZFUkVOQ0VfSU5ESUNFU1tqXSArIGluZGV4T2Zmc2V0OwogICAgICB9CiAgICAgIGluZGV4T2Zmc2V0ICs9IDg7CiAgICAgIGluZGV4ICs9IFJFRkVSRU5DRV9JTkRJQ0VTX0xFTkdUSDsKICAgIH0KICAgIGNvbnN0IGJvdW5kaW5nU3BoZXJlcyA9IHNjcmF0Y2hCb3VuZGluZ1NwaGVyZXM7CiAgICBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LmZyb21WZXJ0aWNlcygKICAgICAgYm90dG9tUG9zaXRpb25zQXJyYXksCiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPLAogICAgICAzLAogICAgICBib3VuZGluZ1NwaGVyZXNbMF0KICAgICk7CiAgICBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LmZyb21WZXJ0aWNlcygKICAgICAgdG9wUG9zaXRpb25zQXJyYXksCiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPLAogICAgICAzLAogICAgICBib3VuZGluZ1NwaGVyZXNbMV0KICAgICk7CiAgICBjb25zdCBib3VuZGluZ1NwaGVyZSA9IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQuZnJvbUJvdW5kaW5nU3BoZXJlcyhib3VuZGluZ1NwaGVyZXMpOwogICAgYm91bmRpbmdTcGhlcmUucmFkaXVzICs9IHN1bUhlaWdodHMgLyAoc2VnbWVudENvdW50ICogMik7CiAgICBjb25zdCBhdHRyaWJ1dGVzID0gewogICAgICBwb3NpdGlvbjogbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkRPVUJMRSwKICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgIG5vcm1hbGl6ZTogZmFsc2UsCiAgICAgICAgdmFsdWVzOiBwb3NpdGlvbnNBcnJheQogICAgICB9KSwKICAgICAgc3RhcnRIaUFuZEZvcndhcmRPZmZzZXRYOiBnZXRWZWM0R2VvbWV0cnlBdHRyaWJ1dGUoCiAgICAgICAgc3RhcnRIaUFuZEZvcndhcmRPZmZzZXRYCiAgICAgICksCiAgICAgIHN0YXJ0TG9BbmRGb3J3YXJkT2Zmc2V0WTogZ2V0VmVjNEdlb21ldHJ5QXR0cmlidXRlKAogICAgICAgIHN0YXJ0TG9BbmRGb3J3YXJkT2Zmc2V0WQogICAgICApLAogICAgICBzdGFydE5vcm1hbEFuZEZvcndhcmRPZmZzZXRaOiBnZXRWZWM0R2VvbWV0cnlBdHRyaWJ1dGUoCiAgICAgICAgc3RhcnROb3JtYWxBbmRGb3J3YXJkT2Zmc2V0WgogICAgICApLAogICAgICBlbmROb3JtYWxBbmRUZXh0dXJlQ29vcmRpbmF0ZU5vcm1hbGl6YXRpb25YOiBnZXRWZWM0R2VvbWV0cnlBdHRyaWJ1dGUoCiAgICAgICAgZW5kTm9ybWFsQW5kVGV4dHVyZUNvb3JkaW5hdGVOb3JtYWxpemF0aW9uWAogICAgICApLAogICAgICByaWdodE5vcm1hbEFuZFRleHR1cmVDb29yZGluYXRlTm9ybWFsaXphdGlvblk6IGdldFZlYzRHZW9tZXRyeUF0dHJpYnV0ZSgKICAgICAgICByaWdodE5vcm1hbEFuZFRleHR1cmVDb29yZGluYXRlTm9ybWFsaXphdGlvblkKICAgICAgKQogICAgfTsKICAgIGlmIChjb21wdXRlMmRBdHRyaWJ1dGVzKSB7CiAgICAgIGF0dHJpYnV0ZXMuc3RhcnRIaUxvMkQgPSBnZXRWZWM0R2VvbWV0cnlBdHRyaWJ1dGUoc3RhcnRIaUxvMkQpOwogICAgICBhdHRyaWJ1dGVzLm9mZnNldEFuZFJpZ2h0MkQgPSBnZXRWZWM0R2VvbWV0cnlBdHRyaWJ1dGUob2Zmc2V0QW5kUmlnaHQyRCk7CiAgICAgIGF0dHJpYnV0ZXMuc3RhcnRFbmROb3JtYWxzMkQgPSBnZXRWZWM0R2VvbWV0cnlBdHRyaWJ1dGUoc3RhcnRFbmROb3JtYWxzMkQpOwogICAgICBhdHRyaWJ1dGVzLnRleGNvb3JkTm9ybWFsaXphdGlvbjJEID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDIsCiAgICAgICAgbm9ybWFsaXplOiBmYWxzZSwKICAgICAgICB2YWx1ZXM6IHRleGNvb3JkTm9ybWFsaXphdGlvbjJECiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIG5ldyBHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgYXR0cmlidXRlcywKICAgICAgaW5kaWNlcywKICAgICAgYm91bmRpbmdTcGhlcmUKICAgIH0pOwogIH0KICBmdW5jdGlvbiBnZXRWZWM0R2VvbWV0cnlBdHRyaWJ1dGUodHlwZWRBcnJheSkgewogICAgcmV0dXJuIG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDQsCiAgICAgIG5vcm1hbGl6ZTogZmFsc2UsCiAgICAgIHZhbHVlczogdHlwZWRBcnJheQogICAgfSk7CiAgfQogIHZhciBQUk9KRUNUSU9OUywgUFJPSkVDVElPTl9DT1VOVCwgTUlURVJfQlJFQUtfU01BTEwsIE1JVEVSX0JSRUFLX0xBUkdFLCBXQUxMX0lOSVRJQUxfTUlOX0hFSUdIVCwgV0FMTF9JTklUSUFMX01BWF9IRUlHSFQsIGNhcnQzU2NyYXRjaDEsIGNhcnQzU2NyYXRjaDIsIGNhcnQzU2NyYXRjaDMsIGludGVycG9sYXRlZENhcnRvZ3JhcGhpY1NjcmF0Y2gsIGludGVycG9sYXRlZEJvdHRvbVNjcmF0Y2gsIGludGVycG9sYXRlZFRvcFNjcmF0Y2gsIGludGVycG9sYXRlZE5vcm1hbFNjcmF0Y2gsIGhlaWdodGxlc3NDYXJ0b2dyYXBoaWNTY3JhdGNoLCB0b1ByZXZpb3VzU2NyYXRjaCwgdG9OZXh0U2NyYXRjaCwgZm9yd2FyZFNjcmF0Y2gsIHZlcnRleFVwU2NyYXRjaCwgY29zaW5lOTAsIGNvc2luZTE4MCwgWFpfUExBTkUsIHByZXZpb3VzQm90dG9tU2NyYXRjaCwgdmVydGV4Qm90dG9tU2NyYXRjaCwgdmVydGV4VG9wU2NyYXRjaCwgbmV4dEJvdHRvbVNjcmF0Y2gsIHZlcnRleE5vcm1hbFNjcmF0Y2gsIGludGVyc2VjdGlvblNjcmF0Y2gsIGNhcnRvZ3JhcGhpY1NjcmF0Y2gwLCBjYXJ0b2dyYXBoaWNTY3JhdGNoMSwgY2FydG9ncmFwaGljSW50ZXJzZWN0aW9uU2NyYXRjaCwgbGluZURpcmVjdGlvblNjcmF0Y2gsIG1hdHJpeDNTY3JhdGNoLCBxdWF0ZXJuaW9uU2NyYXRjaDMsIGVuZFBvc0NhcnRvZ3JhcGhpY1NjcmF0Y2gsIG5vcm1hbFN0YXJ0cG9pbnRTY3JhdGNoLCBub3JtYWxFbmRwb2ludFNjcmF0Y2gsIGFkanVzdEhlaWdodE5vcm1hbFNjcmF0Y2gsIGFkanVzdEhlaWdodE9mZnNldFNjcmF0Y2gsIG51ZGdlRGlyZWN0aW9uU2NyYXRjaCwgc3RhcnRDYXJ0b2dyYXBoaWNTY3JhdGNoLCBlbmRDYXJ0b2dyYXBoaWNTY3JhdGNoLCBzZWdtZW50U3RhcnRUb3BTY3JhdGNoLCBzZWdtZW50RW5kVG9wU2NyYXRjaCwgc2VnbWVudFN0YXJ0Qm90dG9tU2NyYXRjaCwgc2VnbWVudEVuZEJvdHRvbVNjcmF0Y2gsIHNlZ21lbnRTdGFydE5vcm1hbFNjcmF0Y2gsIHNlZ21lbnRFbmROb3JtYWxTY3JhdGNoLCBnZXRIZWlnaHRDYXJ0b2dyYXBoaWNzLCBnZXRIZWlnaHRSZWN0YW5nbGVTY3JhdGNoLCBhZGp1c3RIZWlnaHRTdGFydFRvcFNjcmF0Y2gsIGFkanVzdEhlaWdodEVuZFRvcFNjcmF0Y2gsIGFkanVzdEhlaWdodFN0YXJ0Qm90dG9tU2NyYXRjaCwgYWRqdXN0SGVpZ2h0RW5kQm90dG9tU2NyYXRjaCwgc2VnbWVudFN0YXJ0MkRTY3JhdGNoLCBzZWdtZW50RW5kMkRTY3JhdGNoLCBzZWdtZW50U3RhcnROb3JtYWwyRFNjcmF0Y2gsIHNlZ21lbnRFbmROb3JtYWwyRFNjcmF0Y2gsIG9mZnNldFNjcmF0Y2gyLCBzdGFydFVwU2NyYXRjaCwgZW5kVXBTY3JhdGNoLCByaWdodFNjcmF0Y2gyLCBzdGFydFBsYW5lTm9ybWFsU2NyYXRjaCwgZW5kUGxhbmVOb3JtYWxTY3JhdGNoLCBlbmNvZGVTY3JhdGNoLCBlbmNvZGVTY3JhdGNoMkQsIGZvcndhcmRPZmZzZXQyRFNjcmF0Y2gsIHJpZ2h0MkRTY3JhdGNoLCBub3JtYWxOdWRnZVNjcmF0Y2gsIHNjcmF0Y2hCb3VuZGluZ1NwaGVyZXMsIFJFRkVSRU5DRV9JTkRJQ0VTLCBSRUZFUkVOQ0VfSU5ESUNFU19MRU5HVEgsIEdyb3VuZFBvbHlsaW5lR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9Hcm91bmRQb2x5bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Hcm91bmRQb2x5bGluZUdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9BcHByb3hpbWF0ZVRlcnJhaW5IZWlnaHRzKCk7CiAgICAgIGluaXRfQXJjVHlwZSgpOwogICAgICBpbml0X2FycmF5UmVtb3ZlRHVwbGljYXRlcygpOwogICAgICBpbml0X0JvdW5kaW5nU3BoZXJlKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRvZ3JhcGhpYygpOwogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfQ29tcG9uZW50RGF0YXR5cGUoKTsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9FbGxpcHNvaWRHZW9kZXNpYygpOwogICAgICBpbml0X0VsbGlwc29pZFJodW1iTGluZSgpOwogICAgICBpbml0X0VuY29kZWRDYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfR2VvZ3JhcGhpY1Byb2plY3Rpb24oKTsKICAgICAgaW5pdF9HZW9tZXRyeSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlKCk7CiAgICAgIGluaXRfSW50ZXJzZWN0aW9uVGVzdHMoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGluaXRfTWF0cml4MygpOwogICAgICBpbml0X1BsYW5lKCk7CiAgICAgIGluaXRfUXVhdGVybmlvbigpOwogICAgICBpbml0X1JlY3RhbmdsZSgpOwogICAgICBpbml0X1dlYk1lcmNhdG9yUHJvamVjdGlvbigpOwogICAgICBQUk9KRUNUSU9OUyA9IFtHZW9ncmFwaGljUHJvamVjdGlvbl9kZWZhdWx0LCBXZWJNZXJjYXRvclByb2plY3Rpb25fZGVmYXVsdF07CiAgICAgIFBST0pFQ1RJT05fQ09VTlQgPSBQUk9KRUNUSU9OUy5sZW5ndGg7CiAgICAgIE1JVEVSX0JSRUFLX1NNQUxMID0gTWF0aC5jb3MoTWF0aF9kZWZhdWx0LnRvUmFkaWFucygzMCkpOwogICAgICBNSVRFUl9CUkVBS19MQVJHRSA9IE1hdGguY29zKE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoMTUwKSk7CiAgICAgIFdBTExfSU5JVElBTF9NSU5fSEVJR0hUID0gMDsKICAgICAgV0FMTF9JTklUSUFMX01BWF9IRUlHSFQgPSAxZTM7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEdyb3VuZFBvbHlsaW5lR2VvbWV0cnkucHJvdG90eXBlLCB7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG51bWJlciBvZiBlbGVtZW50cyB1c2VkIHRvIHBhY2sgdGhlIG9iamVjdCBpbnRvIGFuIGFycmF5LgogICAgICAgICAqIEBtZW1iZXJvZiBHcm91bmRQb2x5bGluZUdlb21ldHJ5LnByb3RvdHlwZQogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBwYWNrZWRMZW5ndGg6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAxICsgdGhpcy5fcG9zaXRpb25zLmxlbmd0aCAqIDMgKyAxICsgMSArIDEgKyBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyAxICsgMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBHcm91bmRQb2x5bGluZUdlb21ldHJ5LnNldFByb2plY3Rpb25BbmRFbGxpcHNvaWQgPSBmdW5jdGlvbihncm91bmRQb2x5bGluZUdlb21ldHJ5LCBtYXBQcm9qZWN0aW9uKSB7CiAgICAgICAgbGV0IHByb2plY3Rpb25JbmRleCA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBQUk9KRUNUSU9OX0NPVU5UOyBpKyspIHsKICAgICAgICAgIGlmIChtYXBQcm9qZWN0aW9uIGluc3RhbmNlb2YgUFJPSkVDVElPTlNbaV0pIHsKICAgICAgICAgICAgcHJvamVjdGlvbkluZGV4ID0gaTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGdyb3VuZFBvbHlsaW5lR2VvbWV0cnkuX3Byb2plY3Rpb25JbmRleCA9IHByb2plY3Rpb25JbmRleDsKICAgICAgICBncm91bmRQb2x5bGluZUdlb21ldHJ5Ll9lbGxpcHNvaWQgPSBtYXBQcm9qZWN0aW9uLmVsbGlwc29pZDsKICAgICAgfTsKICAgICAgY2FydDNTY3JhdGNoMSA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgY2FydDNTY3JhdGNoMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgY2FydDNTY3JhdGNoMyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgaW50ZXJwb2xhdGVkQ2FydG9ncmFwaGljU2NyYXRjaCA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBpbnRlcnBvbGF0ZWRCb3R0b21TY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBpbnRlcnBvbGF0ZWRUb3BTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBpbnRlcnBvbGF0ZWROb3JtYWxTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBoZWlnaHRsZXNzQ2FydG9ncmFwaGljU2NyYXRjaCA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBHcm91bmRQb2x5bGluZUdlb21ldHJ5LnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgbGV0IGluZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHZhbHVlLl9wb3NpdGlvbnM7CiAgICAgICAgY29uc3QgcG9zaXRpb25zTGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aDsKICAgICAgICBhcnJheVtpbmRleCsrXSA9IHBvc2l0aW9uc0xlbmd0aDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9uc0xlbmd0aDsgKytpKSB7CiAgICAgICAgICBjb25zdCBjYXJ0ZXNpYW4xMSA9IHBvc2l0aW9uc1tpXTsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKGNhcnRlc2lhbjExLCBhcnJheSwgaW5kZXgpOwogICAgICAgICAgaW5kZXggKz0gMzsKICAgICAgICB9CiAgICAgICAgYXJyYXlbaW5kZXgrK10gPSB2YWx1ZS5ncmFudWxhcml0eTsKICAgICAgICBhcnJheVtpbmRleCsrXSA9IHZhbHVlLmxvb3AgPyAxIDogMDsKICAgICAgICBhcnJheVtpbmRleCsrXSA9IHZhbHVlLmFyY1R5cGU7CiAgICAgICAgRWxsaXBzb2lkX2RlZmF1bHQucGFjayh2YWx1ZS5fZWxsaXBzb2lkLCBhcnJheSwgaW5kZXgpOwogICAgICAgIGluZGV4ICs9IEVsbGlwc29pZF9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBhcnJheVtpbmRleCsrXSA9IHZhbHVlLl9wcm9qZWN0aW9uSW5kZXg7CiAgICAgICAgYXJyYXlbaW5kZXgrK10gPSB2YWx1ZS5fc2NlbmUzRE9ubHkgPyAxIDogMDsKICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH07CiAgICAgIEdyb3VuZFBvbHlsaW5lR2VvbWV0cnkudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgbGV0IGluZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGNvbnN0IHBvc2l0aW9uc0xlbmd0aCA9IGFycmF5W2luZGV4KytdOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBBcnJheShwb3NpdGlvbnNMZW5ndGgpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zTGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHBvc2l0aW9uc1tpXSA9IENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2soYXJyYXksIGluZGV4KTsKICAgICAgICAgIGluZGV4ICs9IDM7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gYXJyYXlbaW5kZXgrK107CiAgICAgICAgY29uc3QgbG9vcCA9IGFycmF5W2luZGV4KytdID09PSAxOwogICAgICAgIGNvbnN0IGFyY1R5cGUgPSBhcnJheVtpbmRleCsrXTsKICAgICAgICBjb25zdCBlbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC51bnBhY2soYXJyYXksIGluZGV4KTsKICAgICAgICBpbmRleCArPSBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgY29uc3QgcHJvamVjdGlvbkluZGV4ID0gYXJyYXlbaW5kZXgrK107CiAgICAgICAgY29uc3Qgc2NlbmUzRE9ubHkgPSBhcnJheVtpbmRleCsrXSA9PT0gMTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgR3JvdW5kUG9seWxpbmVHZW9tZXRyeSh7CiAgICAgICAgICAgIHBvc2l0aW9ucwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5fcG9zaXRpb25zID0gcG9zaXRpb25zOwogICAgICAgIHJlc3VsdC5ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwogICAgICAgIHJlc3VsdC5sb29wID0gbG9vcDsKICAgICAgICByZXN1bHQuYXJjVHlwZSA9IGFyY1R5cGU7CiAgICAgICAgcmVzdWx0Ll9lbGxpcHNvaWQgPSBlbGxpcHNvaWQ7CiAgICAgICAgcmVzdWx0Ll9wcm9qZWN0aW9uSW5kZXggPSBwcm9qZWN0aW9uSW5kZXg7CiAgICAgICAgcmVzdWx0Ll9zY2VuZTNET25seSA9IHNjZW5lM0RPbmx5OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHRvUHJldmlvdXNTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICB0b05leHRTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBmb3J3YXJkU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgdmVydGV4VXBTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjb3NpbmU5MCA9IDA7CiAgICAgIGNvc2luZTE4MCA9IC0xOwogICAgICBYWl9QTEFORSA9IFBsYW5lX2RlZmF1bHQuZnJvbVBvaW50Tm9ybWFsKENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPLCBDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9ZKTsKICAgICAgcHJldmlvdXNCb3R0b21TY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICB2ZXJ0ZXhCb3R0b21TY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICB2ZXJ0ZXhUb3BTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBuZXh0Qm90dG9tU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgdmVydGV4Tm9ybWFsU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgaW50ZXJzZWN0aW9uU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgY2FydG9ncmFwaGljU2NyYXRjaDAgPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgY2FydG9ncmFwaGljU2NyYXRjaDEgPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgY2FydG9ncmFwaGljSW50ZXJzZWN0aW9uU2NyYXRjaCA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBHcm91bmRQb2x5bGluZUdlb21ldHJ5LmNyZWF0ZUdlb21ldHJ5ID0gZnVuY3Rpb24oZ3JvdW5kUG9seWxpbmVHZW9tZXRyeSkgewogICAgICAgIGNvbnN0IGNvbXB1dGUyZEF0dHJpYnV0ZXMgPSAhZ3JvdW5kUG9seWxpbmVHZW9tZXRyeS5fc2NlbmUzRE9ubHk7CiAgICAgICAgbGV0IGxvb3AgPSBncm91bmRQb2x5bGluZUdlb21ldHJ5Lmxvb3A7CiAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gZ3JvdW5kUG9seWxpbmVHZW9tZXRyeS5fZWxsaXBzb2lkOwogICAgICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gZ3JvdW5kUG9seWxpbmVHZW9tZXRyeS5ncmFudWxhcml0eTsKICAgICAgICBjb25zdCBhcmNUeXBlID0gZ3JvdW5kUG9seWxpbmVHZW9tZXRyeS5hcmNUeXBlOwogICAgICAgIGNvbnN0IHByb2plY3Rpb24gPSBuZXcgUFJPSkVDVElPTlNbZ3JvdW5kUG9seWxpbmVHZW9tZXRyeS5fcHJvamVjdGlvbkluZGV4XSgKICAgICAgICAgIGVsbGlwc29pZAogICAgICAgICk7CiAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gV0FMTF9JTklUSUFMX01JTl9IRUlHSFQ7CiAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gV0FMTF9JTklUSUFMX01BWF9IRUlHSFQ7CiAgICAgICAgbGV0IGluZGV4OwogICAgICAgIGxldCBpOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IGdyb3VuZFBvbHlsaW5lR2VvbWV0cnkuX3Bvc2l0aW9uczsKICAgICAgICBjb25zdCBwb3NpdGlvbnNMZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGlmIChwb3NpdGlvbnNMZW5ndGggPT09IDIpIHsKICAgICAgICAgIGxvb3AgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgbGV0IHAwOwogICAgICAgIGxldCBwMTsKICAgICAgICBsZXQgYzA7CiAgICAgICAgbGV0IGMxOwogICAgICAgIGNvbnN0IHJodW1iTGluZSA9IG5ldyBFbGxpcHNvaWRSaHVtYkxpbmVfZGVmYXVsdCh2b2lkIDAsIHZvaWQgMCwgZWxsaXBzb2lkKTsKICAgICAgICBsZXQgaW50ZXJzZWN0aW9uOwogICAgICAgIGxldCBpbnRlcnNlY3Rpb25DYXJ0b2dyYXBoaWM7CiAgICAgICAgbGV0IGludGVyc2VjdGlvbkxvbmdpdHVkZTsKICAgICAgICBjb25zdCBzcGxpdFBvc2l0aW9ucyA9IFtwb3NpdGlvbnNbMF1dOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwb3NpdGlvbnNMZW5ndGggLSAxOyBpKyspIHsKICAgICAgICAgIHAwID0gcG9zaXRpb25zW2ldOwogICAgICAgICAgcDEgPSBwb3NpdGlvbnNbaSArIDFdOwogICAgICAgICAgaW50ZXJzZWN0aW9uID0gSW50ZXJzZWN0aW9uVGVzdHNfZGVmYXVsdC5saW5lU2VnbWVudFBsYW5lKAogICAgICAgICAgICBwMCwKICAgICAgICAgICAgcDEsCiAgICAgICAgICAgIFhaX1BMQU5FLAogICAgICAgICAgICBpbnRlcnNlY3Rpb25TY3JhdGNoCiAgICAgICAgICApOwogICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChpbnRlcnNlY3Rpb24pICYmICFDYXJ0ZXNpYW4zX2RlZmF1bHQuZXF1YWxzRXBzaWxvbihpbnRlcnNlY3Rpb24sIHAwLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjcpICYmICFDYXJ0ZXNpYW4zX2RlZmF1bHQuZXF1YWxzRXBzaWxvbihpbnRlcnNlY3Rpb24sIHAxLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjcpKSB7CiAgICAgICAgICAgIGlmIChncm91bmRQb2x5bGluZUdlb21ldHJ5LmFyY1R5cGUgPT09IEFyY1R5cGVfZGVmYXVsdC5HRU9ERVNJQykgewogICAgICAgICAgICAgIHNwbGl0UG9zaXRpb25zLnB1c2goQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKGludGVyc2VjdGlvbikpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGdyb3VuZFBvbHlsaW5lR2VvbWV0cnkuYXJjVHlwZSA9PT0gQXJjVHlwZV9kZWZhdWx0LlJIVU1CKSB7CiAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uTG9uZ2l0dWRlID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKAogICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uLAogICAgICAgICAgICAgICAgY2FydG9ncmFwaGljU2NyYXRjaDAKICAgICAgICAgICAgICApLmxvbmdpdHVkZTsKICAgICAgICAgICAgICBjMCA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhwMCwgY2FydG9ncmFwaGljU2NyYXRjaDApOwogICAgICAgICAgICAgIGMxID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHAxLCBjYXJ0b2dyYXBoaWNTY3JhdGNoMSk7CiAgICAgICAgICAgICAgcmh1bWJMaW5lLnNldEVuZFBvaW50cyhjMCwgYzEpOwogICAgICAgICAgICAgIGludGVyc2VjdGlvbkNhcnRvZ3JhcGhpYyA9IHJodW1iTGluZS5maW5kSW50ZXJzZWN0aW9uV2l0aExvbmdpdHVkZSgKICAgICAgICAgICAgICAgIGludGVyc2VjdGlvbkxvbmdpdHVkZSwKICAgICAgICAgICAgICAgIGNhcnRvZ3JhcGhpY0ludGVyc2VjdGlvblNjcmF0Y2gKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIGludGVyc2VjdGlvbiA9IGVsbGlwc29pZC5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbigKICAgICAgICAgICAgICAgIGludGVyc2VjdGlvbkNhcnRvZ3JhcGhpYywKICAgICAgICAgICAgICAgIGludGVyc2VjdGlvblNjcmF0Y2gKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoaW50ZXJzZWN0aW9uKSAmJiAhQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24oaW50ZXJzZWN0aW9uLCBwMCwgTWF0aF9kZWZhdWx0LkVQU0lMT043KSAmJiAhQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24oaW50ZXJzZWN0aW9uLCBwMSwgTWF0aF9kZWZhdWx0LkVQU0lMT043KSkgewogICAgICAgICAgICAgICAgc3BsaXRQb3NpdGlvbnMucHVzaChDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoaW50ZXJzZWN0aW9uKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBzcGxpdFBvc2l0aW9ucy5wdXNoKHAxKTsKICAgICAgICB9CiAgICAgICAgaWYgKGxvb3ApIHsKICAgICAgICAgIHAwID0gcG9zaXRpb25zW3Bvc2l0aW9uc0xlbmd0aCAtIDFdOwogICAgICAgICAgcDEgPSBwb3NpdGlvbnNbMF07CiAgICAgICAgICBpbnRlcnNlY3Rpb24gPSBJbnRlcnNlY3Rpb25UZXN0c19kZWZhdWx0LmxpbmVTZWdtZW50UGxhbmUoCiAgICAgICAgICAgIHAwLAogICAgICAgICAgICBwMSwKICAgICAgICAgICAgWFpfUExBTkUsCiAgICAgICAgICAgIGludGVyc2VjdGlvblNjcmF0Y2gKICAgICAgICAgICk7CiAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGludGVyc2VjdGlvbikgJiYgIUNhcnRlc2lhbjNfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKGludGVyc2VjdGlvbiwgcDAsIE1hdGhfZGVmYXVsdC5FUFNJTE9ONykgJiYgIUNhcnRlc2lhbjNfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKGludGVyc2VjdGlvbiwgcDEsIE1hdGhfZGVmYXVsdC5FUFNJTE9ONykpIHsKICAgICAgICAgICAgaWYgKGdyb3VuZFBvbHlsaW5lR2VvbWV0cnkuYXJjVHlwZSA9PT0gQXJjVHlwZV9kZWZhdWx0LkdFT0RFU0lDKSB7CiAgICAgICAgICAgICAgc3BsaXRQb3NpdGlvbnMucHVzaChDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoaW50ZXJzZWN0aW9uKSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JvdW5kUG9seWxpbmVHZW9tZXRyeS5hcmNUeXBlID09PSBBcmNUeXBlX2RlZmF1bHQuUkhVTUIpIHsKICAgICAgICAgICAgICBpbnRlcnNlY3Rpb25Mb25naXR1ZGUgPSBlbGxpcHNvaWQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoCiAgICAgICAgICAgICAgICBpbnRlcnNlY3Rpb24sCiAgICAgICAgICAgICAgICBjYXJ0b2dyYXBoaWNTY3JhdGNoMAogICAgICAgICAgICAgICkubG9uZ2l0dWRlOwogICAgICAgICAgICAgIGMwID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHAwLCBjYXJ0b2dyYXBoaWNTY3JhdGNoMCk7CiAgICAgICAgICAgICAgYzEgPSBlbGxpcHNvaWQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMocDEsIGNhcnRvZ3JhcGhpY1NjcmF0Y2gxKTsKICAgICAgICAgICAgICByaHVtYkxpbmUuc2V0RW5kUG9pbnRzKGMwLCBjMSk7CiAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uQ2FydG9ncmFwaGljID0gcmh1bWJMaW5lLmZpbmRJbnRlcnNlY3Rpb25XaXRoTG9uZ2l0dWRlKAogICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uTG9uZ2l0dWRlLAogICAgICAgICAgICAgICAgY2FydG9ncmFwaGljSW50ZXJzZWN0aW9uU2NyYXRjaAogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uID0gZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKAogICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uQ2FydG9ncmFwaGljLAogICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uU2NyYXRjaAogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChpbnRlcnNlY3Rpb24pICYmICFDYXJ0ZXNpYW4zX2RlZmF1bHQuZXF1YWxzRXBzaWxvbihpbnRlcnNlY3Rpb24sIHAwLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjcpICYmICFDYXJ0ZXNpYW4zX2RlZmF1bHQuZXF1YWxzRXBzaWxvbihpbnRlcnNlY3Rpb24sIHAxLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjcpKSB7CiAgICAgICAgICAgICAgICBzcGxpdFBvc2l0aW9ucy5wdXNoKENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShpbnRlcnNlY3Rpb24pKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IGNhcnRvZ3JhcGhpY3NMZW5ndGggPSBzcGxpdFBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgbGV0IGNhcnRvZ3JhcGhpY3MgPSBuZXcgQXJyYXkoY2FydG9ncmFwaGljc0xlbmd0aCk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNhcnRvZ3JhcGhpY3NMZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgY2FydG9ncmFwaGljMiA9IENhcnRvZ3JhcGhpY19kZWZhdWx0LmZyb21DYXJ0ZXNpYW4oCiAgICAgICAgICAgIHNwbGl0UG9zaXRpb25zW2ldLAogICAgICAgICAgICBlbGxpcHNvaWQKICAgICAgICAgICk7CiAgICAgICAgICBjYXJ0b2dyYXBoaWMyLmhlaWdodCA9IDA7CiAgICAgICAgICBjYXJ0b2dyYXBoaWNzW2ldID0gY2FydG9ncmFwaGljMjsKICAgICAgICB9CiAgICAgICAgY2FydG9ncmFwaGljcyA9IGFycmF5UmVtb3ZlRHVwbGljYXRlc19kZWZhdWx0KAogICAgICAgICAgY2FydG9ncmFwaGljcywKICAgICAgICAgIENhcnRvZ3JhcGhpY19kZWZhdWx0LmVxdWFsc0Vwc2lsb24KICAgICAgICApOwogICAgICAgIGNhcnRvZ3JhcGhpY3NMZW5ndGggPSBjYXJ0b2dyYXBoaWNzLmxlbmd0aDsKICAgICAgICBpZiAoY2FydG9ncmFwaGljc0xlbmd0aCA8IDIpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNhcnRvZ3JhcGhpY3NBcnJheSA9IFtdOwogICAgICAgIGNvbnN0IG5vcm1hbHNBcnJheSA9IFtdOwogICAgICAgIGNvbnN0IGJvdHRvbVBvc2l0aW9uc0FycmF5ID0gW107CiAgICAgICAgY29uc3QgdG9wUG9zaXRpb25zQXJyYXkgPSBbXTsKICAgICAgICBsZXQgcHJldmlvdXNCb3R0b20gPSBwcmV2aW91c0JvdHRvbVNjcmF0Y2g7CiAgICAgICAgbGV0IHZlcnRleEJvdHRvbSA9IHZlcnRleEJvdHRvbVNjcmF0Y2g7CiAgICAgICAgbGV0IHZlcnRleFRvcCA9IHZlcnRleFRvcFNjcmF0Y2g7CiAgICAgICAgbGV0IG5leHRCb3R0b20gPSBuZXh0Qm90dG9tU2NyYXRjaDsKICAgICAgICBsZXQgdmVydGV4Tm9ybWFsID0gdmVydGV4Tm9ybWFsU2NyYXRjaDsKICAgICAgICBjb25zdCBzdGFydENhcnRvZ3JhcGhpYyA9IGNhcnRvZ3JhcGhpY3NbMF07CiAgICAgICAgY29uc3QgbmV4dENhcnRvZ3JhcGhpYyA9IGNhcnRvZ3JhcGhpY3NbMV07CiAgICAgICAgY29uc3QgcHJlc3RhcnRDYXJ0b2dyYXBoaWMgPSBjYXJ0b2dyYXBoaWNzW2NhcnRvZ3JhcGhpY3NMZW5ndGggLSAxXTsKICAgICAgICBwcmV2aW91c0JvdHRvbSA9IGdldFBvc2l0aW9uKAogICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgcHJlc3RhcnRDYXJ0b2dyYXBoaWMsCiAgICAgICAgICBtaW5IZWlnaHQsCiAgICAgICAgICBwcmV2aW91c0JvdHRvbQogICAgICAgICk7CiAgICAgICAgbmV4dEJvdHRvbSA9IGdldFBvc2l0aW9uKGVsbGlwc29pZCwgbmV4dENhcnRvZ3JhcGhpYywgbWluSGVpZ2h0LCBuZXh0Qm90dG9tKTsKICAgICAgICB2ZXJ0ZXhCb3R0b20gPSBnZXRQb3NpdGlvbigKICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgIHN0YXJ0Q2FydG9ncmFwaGljLAogICAgICAgICAgbWluSGVpZ2h0LAogICAgICAgICAgdmVydGV4Qm90dG9tCiAgICAgICAgKTsKICAgICAgICB2ZXJ0ZXhUb3AgPSBnZXRQb3NpdGlvbihlbGxpcHNvaWQsIHN0YXJ0Q2FydG9ncmFwaGljLCBtYXhIZWlnaHQsIHZlcnRleFRvcCk7CiAgICAgICAgaWYgKGxvb3ApIHsKICAgICAgICAgIHZlcnRleE5vcm1hbCA9IGNvbXB1dGVWZXJ0ZXhNaXRlck5vcm1hbCgKICAgICAgICAgICAgcHJldmlvdXNCb3R0b20sCiAgICAgICAgICAgIHZlcnRleEJvdHRvbSwKICAgICAgICAgICAgdmVydGV4VG9wLAogICAgICAgICAgICBuZXh0Qm90dG9tLAogICAgICAgICAgICB2ZXJ0ZXhOb3JtYWwKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZlcnRleE5vcm1hbCA9IGNvbXB1dGVSaWdodE5vcm1hbCgKICAgICAgICAgICAgc3RhcnRDYXJ0b2dyYXBoaWMsCiAgICAgICAgICAgIG5leHRDYXJ0b2dyYXBoaWMsCiAgICAgICAgICAgIG1heEhlaWdodCwKICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICB2ZXJ0ZXhOb3JtYWwKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKHZlcnRleE5vcm1hbCwgbm9ybWFsc0FycmF5LCAwKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayh2ZXJ0ZXhCb3R0b20sIGJvdHRvbVBvc2l0aW9uc0FycmF5LCAwKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayh2ZXJ0ZXhUb3AsIHRvcFBvc2l0aW9uc0FycmF5LCAwKTsKICAgICAgICBjYXJ0b2dyYXBoaWNzQXJyYXkucHVzaChzdGFydENhcnRvZ3JhcGhpYy5sYXRpdHVkZSk7CiAgICAgICAgY2FydG9ncmFwaGljc0FycmF5LnB1c2goc3RhcnRDYXJ0b2dyYXBoaWMubG9uZ2l0dWRlKTsKICAgICAgICBpbnRlcnBvbGF0ZVNlZ21lbnQoCiAgICAgICAgICBzdGFydENhcnRvZ3JhcGhpYywKICAgICAgICAgIG5leHRDYXJ0b2dyYXBoaWMsCiAgICAgICAgICBtaW5IZWlnaHQsCiAgICAgICAgICBtYXhIZWlnaHQsCiAgICAgICAgICBncmFudWxhcml0eSwKICAgICAgICAgIGFyY1R5cGUsCiAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICBub3JtYWxzQXJyYXksCiAgICAgICAgICBib3R0b21Qb3NpdGlvbnNBcnJheSwKICAgICAgICAgIHRvcFBvc2l0aW9uc0FycmF5LAogICAgICAgICAgY2FydG9ncmFwaGljc0FycmF5CiAgICAgICAgKTsKICAgICAgICBmb3IgKGkgPSAxOyBpIDwgY2FydG9ncmFwaGljc0xlbmd0aCAtIDE7ICsraSkgewogICAgICAgICAgcHJldmlvdXNCb3R0b20gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUodmVydGV4Qm90dG9tLCBwcmV2aW91c0JvdHRvbSk7CiAgICAgICAgICB2ZXJ0ZXhCb3R0b20gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUobmV4dEJvdHRvbSwgdmVydGV4Qm90dG9tKTsKICAgICAgICAgIGNvbnN0IHZlcnRleENhcnRvZ3JhcGhpYyA9IGNhcnRvZ3JhcGhpY3NbaV07CiAgICAgICAgICBnZXRQb3NpdGlvbihlbGxpcHNvaWQsIHZlcnRleENhcnRvZ3JhcGhpYywgbWF4SGVpZ2h0LCB2ZXJ0ZXhUb3ApOwogICAgICAgICAgZ2V0UG9zaXRpb24oZWxsaXBzb2lkLCBjYXJ0b2dyYXBoaWNzW2kgKyAxXSwgbWluSGVpZ2h0LCBuZXh0Qm90dG9tKTsKICAgICAgICAgIGNvbXB1dGVWZXJ0ZXhNaXRlck5vcm1hbCgKICAgICAgICAgICAgcHJldmlvdXNCb3R0b20sCiAgICAgICAgICAgIHZlcnRleEJvdHRvbSwKICAgICAgICAgICAgdmVydGV4VG9wLAogICAgICAgICAgICBuZXh0Qm90dG9tLAogICAgICAgICAgICB2ZXJ0ZXhOb3JtYWwKICAgICAgICAgICk7CiAgICAgICAgICBpbmRleCA9IG5vcm1hbHNBcnJheS5sZW5ndGg7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayh2ZXJ0ZXhOb3JtYWwsIG5vcm1hbHNBcnJheSwgaW5kZXgpOwogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2sodmVydGV4Qm90dG9tLCBib3R0b21Qb3NpdGlvbnNBcnJheSwgaW5kZXgpOwogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2sodmVydGV4VG9wLCB0b3BQb3NpdGlvbnNBcnJheSwgaW5kZXgpOwogICAgICAgICAgY2FydG9ncmFwaGljc0FycmF5LnB1c2godmVydGV4Q2FydG9ncmFwaGljLmxhdGl0dWRlKTsKICAgICAgICAgIGNhcnRvZ3JhcGhpY3NBcnJheS5wdXNoKHZlcnRleENhcnRvZ3JhcGhpYy5sb25naXR1ZGUpOwogICAgICAgICAgaW50ZXJwb2xhdGVTZWdtZW50KAogICAgICAgICAgICBjYXJ0b2dyYXBoaWNzW2ldLAogICAgICAgICAgICBjYXJ0b2dyYXBoaWNzW2kgKyAxXSwKICAgICAgICAgICAgbWluSGVpZ2h0LAogICAgICAgICAgICBtYXhIZWlnaHQsCiAgICAgICAgICAgIGdyYW51bGFyaXR5LAogICAgICAgICAgICBhcmNUeXBlLAogICAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICAgIG5vcm1hbHNBcnJheSwKICAgICAgICAgICAgYm90dG9tUG9zaXRpb25zQXJyYXksCiAgICAgICAgICAgIHRvcFBvc2l0aW9uc0FycmF5LAogICAgICAgICAgICBjYXJ0b2dyYXBoaWNzQXJyYXkKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVuZENhcnRvZ3JhcGhpYyA9IGNhcnRvZ3JhcGhpY3NbY2FydG9ncmFwaGljc0xlbmd0aCAtIDFdOwogICAgICAgIGNvbnN0IHByZUVuZENhcnRvZ3JhcGhpYyA9IGNhcnRvZ3JhcGhpY3NbY2FydG9ncmFwaGljc0xlbmd0aCAtIDJdOwogICAgICAgIHZlcnRleEJvdHRvbSA9IGdldFBvc2l0aW9uKAogICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgZW5kQ2FydG9ncmFwaGljLAogICAgICAgICAgbWluSGVpZ2h0LAogICAgICAgICAgdmVydGV4Qm90dG9tCiAgICAgICAgKTsKICAgICAgICB2ZXJ0ZXhUb3AgPSBnZXRQb3NpdGlvbihlbGxpcHNvaWQsIGVuZENhcnRvZ3JhcGhpYywgbWF4SGVpZ2h0LCB2ZXJ0ZXhUb3ApOwogICAgICAgIGlmIChsb29wKSB7CiAgICAgICAgICBjb25zdCBwb3N0RW5kQ2FydG9ncmFwaGljID0gY2FydG9ncmFwaGljc1swXTsKICAgICAgICAgIHByZXZpb3VzQm90dG9tID0gZ2V0UG9zaXRpb24oCiAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgcHJlRW5kQ2FydG9ncmFwaGljLAogICAgICAgICAgICBtaW5IZWlnaHQsCiAgICAgICAgICAgIHByZXZpb3VzQm90dG9tCiAgICAgICAgICApOwogICAgICAgICAgbmV4dEJvdHRvbSA9IGdldFBvc2l0aW9uKAogICAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICAgIHBvc3RFbmRDYXJ0b2dyYXBoaWMsCiAgICAgICAgICAgIG1pbkhlaWdodCwKICAgICAgICAgICAgbmV4dEJvdHRvbQogICAgICAgICAgKTsKICAgICAgICAgIHZlcnRleE5vcm1hbCA9IGNvbXB1dGVWZXJ0ZXhNaXRlck5vcm1hbCgKICAgICAgICAgICAgcHJldmlvdXNCb3R0b20sCiAgICAgICAgICAgIHZlcnRleEJvdHRvbSwKICAgICAgICAgICAgdmVydGV4VG9wLAogICAgICAgICAgICBuZXh0Qm90dG9tLAogICAgICAgICAgICB2ZXJ0ZXhOb3JtYWwKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZlcnRleE5vcm1hbCA9IGNvbXB1dGVSaWdodE5vcm1hbCgKICAgICAgICAgICAgcHJlRW5kQ2FydG9ncmFwaGljLAogICAgICAgICAgICBlbmRDYXJ0b2dyYXBoaWMsCiAgICAgICAgICAgIG1heEhlaWdodCwKICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICB2ZXJ0ZXhOb3JtYWwKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGluZGV4ID0gbm9ybWFsc0FycmF5Lmxlbmd0aDsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayh2ZXJ0ZXhOb3JtYWwsIG5vcm1hbHNBcnJheSwgaW5kZXgpOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKHZlcnRleEJvdHRvbSwgYm90dG9tUG9zaXRpb25zQXJyYXksIGluZGV4KTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayh2ZXJ0ZXhUb3AsIHRvcFBvc2l0aW9uc0FycmF5LCBpbmRleCk7CiAgICAgICAgY2FydG9ncmFwaGljc0FycmF5LnB1c2goZW5kQ2FydG9ncmFwaGljLmxhdGl0dWRlKTsKICAgICAgICBjYXJ0b2dyYXBoaWNzQXJyYXkucHVzaChlbmRDYXJ0b2dyYXBoaWMubG9uZ2l0dWRlKTsKICAgICAgICBpZiAobG9vcCkgewogICAgICAgICAgaW50ZXJwb2xhdGVTZWdtZW50KAogICAgICAgICAgICBlbmRDYXJ0b2dyYXBoaWMsCiAgICAgICAgICAgIHN0YXJ0Q2FydG9ncmFwaGljLAogICAgICAgICAgICBtaW5IZWlnaHQsCiAgICAgICAgICAgIG1heEhlaWdodCwKICAgICAgICAgICAgZ3JhbnVsYXJpdHksCiAgICAgICAgICAgIGFyY1R5cGUsCiAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgbm9ybWFsc0FycmF5LAogICAgICAgICAgICBib3R0b21Qb3NpdGlvbnNBcnJheSwKICAgICAgICAgICAgdG9wUG9zaXRpb25zQXJyYXksCiAgICAgICAgICAgIGNhcnRvZ3JhcGhpY3NBcnJheQogICAgICAgICAgKTsKICAgICAgICAgIGluZGV4ID0gbm9ybWFsc0FycmF5Lmxlbmd0aDsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICAgICAgICAgbm9ybWFsc0FycmF5W2luZGV4ICsgaV0gPSBub3JtYWxzQXJyYXlbaV07CiAgICAgICAgICAgIGJvdHRvbVBvc2l0aW9uc0FycmF5W2luZGV4ICsgaV0gPSBib3R0b21Qb3NpdGlvbnNBcnJheVtpXTsKICAgICAgICAgICAgdG9wUG9zaXRpb25zQXJyYXlbaW5kZXggKyBpXSA9IHRvcFBvc2l0aW9uc0FycmF5W2ldOwogICAgICAgICAgfQogICAgICAgICAgY2FydG9ncmFwaGljc0FycmF5LnB1c2goc3RhcnRDYXJ0b2dyYXBoaWMubGF0aXR1ZGUpOwogICAgICAgICAgY2FydG9ncmFwaGljc0FycmF5LnB1c2goc3RhcnRDYXJ0b2dyYXBoaWMubG9uZ2l0dWRlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGdlbmVyYXRlR2VvbWV0cnlBdHRyaWJ1dGVzKAogICAgICAgICAgbG9vcCwKICAgICAgICAgIHByb2plY3Rpb24sCiAgICAgICAgICBib3R0b21Qb3NpdGlvbnNBcnJheSwKICAgICAgICAgIHRvcFBvc2l0aW9uc0FycmF5LAogICAgICAgICAgbm9ybWFsc0FycmF5LAogICAgICAgICAgY2FydG9ncmFwaGljc0FycmF5LAogICAgICAgICAgY29tcHV0ZTJkQXR0cmlidXRlcwogICAgICAgICk7CiAgICAgIH07CiAgICAgIGxpbmVEaXJlY3Rpb25TY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBtYXRyaXgzU2NyYXRjaCA9IG5ldyBNYXRyaXgzX2RlZmF1bHQoKTsKICAgICAgcXVhdGVybmlvblNjcmF0Y2gzID0gbmV3IFF1YXRlcm5pb25fZGVmYXVsdCgpOwogICAgICBlbmRQb3NDYXJ0b2dyYXBoaWNTY3JhdGNoID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIG5vcm1hbFN0YXJ0cG9pbnRTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBub3JtYWxFbmRwb2ludFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGFkanVzdEhlaWdodE5vcm1hbFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGFkanVzdEhlaWdodE9mZnNldFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIG51ZGdlRGlyZWN0aW9uU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc3RhcnRDYXJ0b2dyYXBoaWNTY3JhdGNoID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIGVuZENhcnRvZ3JhcGhpY1NjcmF0Y2ggPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgc2VnbWVudFN0YXJ0VG9wU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2VnbWVudEVuZFRvcFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNlZ21lbnRTdGFydEJvdHRvbVNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNlZ21lbnRFbmRCb3R0b21TY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzZWdtZW50U3RhcnROb3JtYWxTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzZWdtZW50RW5kTm9ybWFsU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgZ2V0SGVpZ2h0Q2FydG9ncmFwaGljcyA9IFsKICAgICAgICBzdGFydENhcnRvZ3JhcGhpY1NjcmF0Y2gsCiAgICAgICAgZW5kQ2FydG9ncmFwaGljU2NyYXRjaAogICAgICBdOwogICAgICBnZXRIZWlnaHRSZWN0YW5nbGVTY3JhdGNoID0gbmV3IFJlY3RhbmdsZV9kZWZhdWx0KCk7CiAgICAgIGFkanVzdEhlaWdodFN0YXJ0VG9wU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgYWRqdXN0SGVpZ2h0RW5kVG9wU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgYWRqdXN0SGVpZ2h0U3RhcnRCb3R0b21TY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBhZGp1c3RIZWlnaHRFbmRCb3R0b21TY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzZWdtZW50U3RhcnQyRFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNlZ21lbnRFbmQyRFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNlZ21lbnRTdGFydE5vcm1hbDJEU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2VnbWVudEVuZE5vcm1hbDJEU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgb2Zmc2V0U2NyYXRjaDIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHN0YXJ0VXBTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBlbmRVcFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHJpZ2h0U2NyYXRjaDIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHN0YXJ0UGxhbmVOb3JtYWxTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBlbmRQbGFuZU5vcm1hbFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGVuY29kZVNjcmF0Y2ggPSBuZXcgRW5jb2RlZENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBlbmNvZGVTY3JhdGNoMkQgPSBuZXcgRW5jb2RlZENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBmb3J3YXJkT2Zmc2V0MkRTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICByaWdodDJEU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgbm9ybWFsTnVkZ2VTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQm91bmRpbmdTcGhlcmVzID0gW25ldyBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0KCksIG5ldyBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0KCldOwogICAgICBSRUZFUkVOQ0VfSU5ESUNFUyA9IFsKICAgICAgICAwLAogICAgICAgIDIsCiAgICAgICAgMSwKICAgICAgICAwLAogICAgICAgIDMsCiAgICAgICAgMiwKICAgICAgICAvLyByaWdodAogICAgICAgIDAsCiAgICAgICAgNywKICAgICAgICAzLAogICAgICAgIDAsCiAgICAgICAgNCwKICAgICAgICA3LAogICAgICAgIC8vIHN0YXJ0CiAgICAgICAgMCwKICAgICAgICA1LAogICAgICAgIDQsCiAgICAgICAgMCwKICAgICAgICAxLAogICAgICAgIDUsCiAgICAgICAgLy8gYm90dG9tCiAgICAgICAgNSwKICAgICAgICA3LAogICAgICAgIDQsCiAgICAgICAgNSwKICAgICAgICA2LAogICAgICAgIDcsCiAgICAgICAgLy8gbGVmdAogICAgICAgIDUsCiAgICAgICAgMiwKICAgICAgICA2LAogICAgICAgIDUsCiAgICAgICAgMSwKICAgICAgICAyLAogICAgICAgIC8vIGVuZAogICAgICAgIDMsCiAgICAgICAgNiwKICAgICAgICAyLAogICAgICAgIDMsCiAgICAgICAgNywKICAgICAgICA2CiAgICAgICAgLy8gdG9wCiAgICAgIF07CiAgICAgIFJFRkVSRU5DRV9JTkRJQ0VTX0xFTkdUSCA9IFJFRkVSRU5DRV9JTkRJQ0VTLmxlbmd0aDsKICAgICAgR3JvdW5kUG9seWxpbmVHZW9tZXRyeS5fcHJvamVjdE5vcm1hbCA9IHByb2plY3ROb3JtYWw7CiAgICAgIEdyb3VuZFBvbHlsaW5lR2VvbWV0cnlfZGVmYXVsdCA9IEdyb3VuZFBvbHlsaW5lR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVHcm91bmRQb2x5bGluZUdlb21ldHJ5LmpzCiAgdmFyIGNyZWF0ZUdyb3VuZFBvbHlsaW5lR2VvbWV0cnlfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGNyZWF0ZUdyb3VuZFBvbHlsaW5lR2VvbWV0cnlfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gY3JlYXRlR3JvdW5kUG9seWxpbmVHZW9tZXRyeV9kZWZhdWx0CiAgfSk7CiAgZnVuY3Rpb24gY3JlYXRlR3JvdW5kUG9seWxpbmVHZW9tZXRyeShncm91bmRQb2x5bGluZUdlb21ldHJ5LCBvZmZzZXQpIHsKICAgIHJldHVybiBBcHByb3hpbWF0ZVRlcnJhaW5IZWlnaHRzX2RlZmF1bHQuaW5pdGlhbGl6ZSgpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQob2Zmc2V0KSkgewogICAgICAgIGdyb3VuZFBvbHlsaW5lR2VvbWV0cnkgPSBHcm91bmRQb2x5bGluZUdlb21ldHJ5X2RlZmF1bHQudW5wYWNrKAogICAgICAgICAgZ3JvdW5kUG9seWxpbmVHZW9tZXRyeSwKICAgICAgICAgIG9mZnNldAogICAgICAgICk7CiAgICAgIH0KICAgICAgcmV0dXJuIEdyb3VuZFBvbHlsaW5lR2VvbWV0cnlfZGVmYXVsdC5jcmVhdGVHZW9tZXRyeShncm91bmRQb2x5bGluZUdlb21ldHJ5KTsKICAgIH0pOwogIH0KICB2YXIgY3JlYXRlR3JvdW5kUG9seWxpbmVHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X2NyZWF0ZUdyb3VuZFBvbHlsaW5lR2VvbWV0cnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZUdyb3VuZFBvbHlsaW5lR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X0FwcHJveGltYXRlVGVycmFpbkhlaWdodHMoKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfR3JvdW5kUG9seWxpbmVHZW9tZXRyeSgpOwogICAgICBjcmVhdGVHcm91bmRQb2x5bGluZUdlb21ldHJ5X2RlZmF1bHQgPSBjcmVhdGVHcm91bmRQb2x5bGluZUdlb21ldHJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUGxhbmVHZW9tZXRyeS5qcwogIGZ1bmN0aW9uIFBsYW5lR2VvbWV0cnkob3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgPz8gRnJvemVuX2RlZmF1bHQuRU1QVFlfT0JKRUNUOwogICAgY29uc3QgdmVydGV4Rm9ybWF0ID0gb3B0aW9ucy52ZXJ0ZXhGb3JtYXQgPz8gVmVydGV4Rm9ybWF0X2RlZmF1bHQuREVGQVVMVDsKICAgIHRoaXMuX3ZlcnRleEZvcm1hdCA9IHZlcnRleEZvcm1hdDsKICAgIHRoaXMuX3dvcmtlck5hbWUgPSAiY3JlYXRlUGxhbmVHZW9tZXRyeSI7CiAgfQogIHZhciBzY3JhdGNoVmVydGV4Rm9ybWF0OCwgc2NyYXRjaE9wdGlvbnMxNSwgbWluLCBtYXgsIFBsYW5lR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9QbGFuZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9QbGFuZUdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9Cb3VuZGluZ1NwaGVyZSgpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X0NvbXBvbmVudERhdGF0eXBlKCk7CiAgICAgIGluaXRfRnJvemVuKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0dlb21ldHJ5KCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGUoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZXMoKTsKICAgICAgaW5pdF9QcmltaXRpdmVUeXBlKCk7CiAgICAgIGluaXRfVmVydGV4Rm9ybWF0KCk7CiAgICAgIFBsYW5lR2VvbWV0cnkucGFja2VkTGVuZ3RoID0gVmVydGV4Rm9ybWF0X2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICBQbGFuZUdlb21ldHJ5LnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrKHZhbHVlLl92ZXJ0ZXhGb3JtYXQsIGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hWZXJ0ZXhGb3JtYXQ4ID0gbmV3IFZlcnRleEZvcm1hdF9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hPcHRpb25zMTUgPSB7CiAgICAgICAgdmVydGV4Rm9ybWF0OiBzY3JhdGNoVmVydGV4Rm9ybWF0OAogICAgICB9OwogICAgICBQbGFuZUdlb21ldHJ5LnVucGFjayA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydGluZ0luZGV4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgY29uc3QgdmVydGV4Rm9ybWF0ID0gVmVydGV4Rm9ybWF0X2RlZmF1bHQudW5wYWNrKAogICAgICAgICAgYXJyYXksCiAgICAgICAgICBzdGFydGluZ0luZGV4LAogICAgICAgICAgc2NyYXRjaFZlcnRleEZvcm1hdDgKICAgICAgICApOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgUGxhbmVHZW9tZXRyeShzY3JhdGNoT3B0aW9uczE1KTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0Ll92ZXJ0ZXhGb3JtYXQgPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5jbG9uZSh2ZXJ0ZXhGb3JtYXQsIHJlc3VsdC5fdmVydGV4Rm9ybWF0KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBtaW4gPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KC0wLjUsIC0wLjUsIDApOwogICAgICBtYXggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KDAuNSwgMC41LCAwKTsKICAgICAgUGxhbmVHZW9tZXRyeS5jcmVhdGVHZW9tZXRyeSA9IGZ1bmN0aW9uKHBsYW5lR2VvbWV0cnkpIHsKICAgICAgICBjb25zdCB2ZXJ0ZXhGb3JtYXQgPSBwbGFuZUdlb21ldHJ5Ll92ZXJ0ZXhGb3JtYXQ7CiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZXNfZGVmYXVsdCgpOwogICAgICAgIGxldCBpbmRpY2VzOwogICAgICAgIGxldCBwb3NpdGlvbnM7CiAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5wb3NpdGlvbikgewogICAgICAgICAgcG9zaXRpb25zID0gbmV3IEZsb2F0NjRBcnJheSg0ICogMyk7CiAgICAgICAgICBwb3NpdGlvbnNbMF0gPSBtaW4ueDsKICAgICAgICAgIHBvc2l0aW9uc1sxXSA9IG1pbi55OwogICAgICAgICAgcG9zaXRpb25zWzJdID0gMDsKICAgICAgICAgIHBvc2l0aW9uc1szXSA9IG1heC54OwogICAgICAgICAgcG9zaXRpb25zWzRdID0gbWluLnk7CiAgICAgICAgICBwb3NpdGlvbnNbNV0gPSAwOwogICAgICAgICAgcG9zaXRpb25zWzZdID0gbWF4Lng7CiAgICAgICAgICBwb3NpdGlvbnNbN10gPSBtYXgueTsKICAgICAgICAgIHBvc2l0aW9uc1s4XSA9IDA7CiAgICAgICAgICBwb3NpdGlvbnNbOV0gPSBtaW4ueDsKICAgICAgICAgIHBvc2l0aW9uc1sxMF0gPSBtYXgueTsKICAgICAgICAgIHBvc2l0aW9uc1sxMV0gPSAwOwogICAgICAgICAgYXR0cmlidXRlcy5wb3NpdGlvbiA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRE9VQkxFLAogICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgICAgICB2YWx1ZXM6IHBvc2l0aW9ucwogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCkgewogICAgICAgICAgICBjb25zdCBub3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheSg0ICogMyk7CiAgICAgICAgICAgIG5vcm1hbHNbMF0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzFdID0gMDsKICAgICAgICAgICAgbm9ybWFsc1syXSA9IDE7CiAgICAgICAgICAgIG5vcm1hbHNbM10gPSAwOwogICAgICAgICAgICBub3JtYWxzWzRdID0gMDsKICAgICAgICAgICAgbm9ybWFsc1s1XSA9IDE7CiAgICAgICAgICAgIG5vcm1hbHNbNl0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzddID0gMDsKICAgICAgICAgICAgbm9ybWFsc1s4XSA9IDE7CiAgICAgICAgICAgIG5vcm1hbHNbOV0gPSAwOwogICAgICAgICAgICBub3JtYWxzWzEwXSA9IDA7CiAgICAgICAgICAgIG5vcm1hbHNbMTFdID0gMTsKICAgICAgICAgICAgYXR0cmlidXRlcy5ub3JtYWwgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgICAgICB2YWx1ZXM6IG5vcm1hbHMKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnN0KSB7CiAgICAgICAgICAgIGNvbnN0IHRleENvb3JkcyA9IG5ldyBGbG9hdDMyQXJyYXkoNCAqIDIpOwogICAgICAgICAgICB0ZXhDb29yZHNbMF0gPSAwOwogICAgICAgICAgICB0ZXhDb29yZHNbMV0gPSAwOwogICAgICAgICAgICB0ZXhDb29yZHNbMl0gPSAxOwogICAgICAgICAgICB0ZXhDb29yZHNbM10gPSAwOwogICAgICAgICAgICB0ZXhDb29yZHNbNF0gPSAxOwogICAgICAgICAgICB0ZXhDb29yZHNbNV0gPSAxOwogICAgICAgICAgICB0ZXhDb29yZHNbNl0gPSAwOwogICAgICAgICAgICB0ZXhDb29yZHNbN10gPSAxOwogICAgICAgICAgICBhdHRyaWJ1dGVzLnN0ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDIsCiAgICAgICAgICAgICAgdmFsdWVzOiB0ZXhDb29yZHMKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnRhbmdlbnQpIHsKICAgICAgICAgICAgY29uc3QgdGFuZ2VudHMgPSBuZXcgRmxvYXQzMkFycmF5KDQgKiAzKTsKICAgICAgICAgICAgdGFuZ2VudHNbMF0gPSAxOwogICAgICAgICAgICB0YW5nZW50c1sxXSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzJdID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbM10gPSAxOwogICAgICAgICAgICB0YW5nZW50c1s0XSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzVdID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbNl0gPSAxOwogICAgICAgICAgICB0YW5nZW50c1s3XSA9IDA7CiAgICAgICAgICAgIHRhbmdlbnRzWzhdID0gMDsKICAgICAgICAgICAgdGFuZ2VudHNbOV0gPSAxOwogICAgICAgICAgICB0YW5nZW50c1sxMF0gPSAwOwogICAgICAgICAgICB0YW5nZW50c1sxMV0gPSAwOwogICAgICAgICAgICBhdHRyaWJ1dGVzLnRhbmdlbnQgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgICAgICB2YWx1ZXM6IHRhbmdlbnRzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5iaXRhbmdlbnQpIHsKICAgICAgICAgICAgY29uc3QgYml0YW5nZW50cyA9IG5ldyBGbG9hdDMyQXJyYXkoNCAqIDMpOwogICAgICAgICAgICBiaXRhbmdlbnRzWzBdID0gMDsKICAgICAgICAgICAgYml0YW5nZW50c1sxXSA9IDE7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbMl0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzNdID0gMDsKICAgICAgICAgICAgYml0YW5nZW50c1s0XSA9IDE7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbNV0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzZdID0gMDsKICAgICAgICAgICAgYml0YW5nZW50c1s3XSA9IDE7CiAgICAgICAgICAgIGJpdGFuZ2VudHNbOF0gPSAwOwogICAgICAgICAgICBiaXRhbmdlbnRzWzldID0gMDsKICAgICAgICAgICAgYml0YW5nZW50c1sxMF0gPSAxOwogICAgICAgICAgICBiaXRhbmdlbnRzWzExXSA9IDA7CiAgICAgICAgICAgIGF0dHJpYnV0ZXMuYml0YW5nZW50ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgICAgICAgdmFsdWVzOiBiaXRhbmdlbnRzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheSgyICogMyk7CiAgICAgICAgICBpbmRpY2VzWzBdID0gMDsKICAgICAgICAgIGluZGljZXNbMV0gPSAxOwogICAgICAgICAgaW5kaWNlc1syXSA9IDI7CiAgICAgICAgICBpbmRpY2VzWzNdID0gMDsKICAgICAgICAgIGluZGljZXNbNF0gPSAyOwogICAgICAgICAgaW5kaWNlc1s1XSA9IDM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgR2VvbWV0cnlfZGVmYXVsdCh7CiAgICAgICAgICBhdHRyaWJ1dGVzLAogICAgICAgICAgaW5kaWNlcywKICAgICAgICAgIHByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5UUklBTkdMRVMsCiAgICAgICAgICBib3VuZGluZ1NwaGVyZTogbmV3IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQoQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8sIE1hdGguc3FydCgyKSkKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgUGxhbmVHZW9tZXRyeV9kZWZhdWx0ID0gUGxhbmVHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVBsYW5lR2VvbWV0cnkuanMKICB2YXIgY3JlYXRlUGxhbmVHZW9tZXRyeV9leHBvcnRzID0ge307CiAgX19leHBvcnQoY3JlYXRlUGxhbmVHZW9tZXRyeV9leHBvcnRzLCB7CiAgICBkZWZhdWx0OiAoKSA9PiBjcmVhdGVQbGFuZUdlb21ldHJ5X2RlZmF1bHQKICB9KTsKICBmdW5jdGlvbiBjcmVhdGVQbGFuZUdlb21ldHJ5KHBsYW5lR2VvbWV0cnksIG9mZnNldCkgewogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvZmZzZXQpKSB7CiAgICAgIHBsYW5lR2VvbWV0cnkgPSBQbGFuZUdlb21ldHJ5X2RlZmF1bHQudW5wYWNrKHBsYW5lR2VvbWV0cnksIG9mZnNldCk7CiAgICB9CiAgICByZXR1cm4gUGxhbmVHZW9tZXRyeV9kZWZhdWx0LmNyZWF0ZUdlb21ldHJ5KHBsYW5lR2VvbWV0cnkpOwogIH0KICB2YXIgY3JlYXRlUGxhbmVHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X2NyZWF0ZVBsYW5lR2VvbWV0cnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVBsYW5lR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9QbGFuZUdlb21ldHJ5KCk7CiAgICAgIGNyZWF0ZVBsYW5lR2VvbWV0cnlfZGVmYXVsdCA9IGNyZWF0ZVBsYW5lR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9QbGFuZU91dGxpbmVHZW9tZXRyeS5qcwogIGZ1bmN0aW9uIFBsYW5lT3V0bGluZUdlb21ldHJ5KCkgewogICAgdGhpcy5fd29ya2VyTmFtZSA9ICJjcmVhdGVQbGFuZU91dGxpbmVHZW9tZXRyeSI7CiAgfQogIHZhciBtaW4yLCBtYXgyLCBQbGFuZU91dGxpbmVHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X1BsYW5lT3V0bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9QbGFuZU91dGxpbmVHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfQm91bmRpbmdTcGhlcmUoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9Db21wb25lbnREYXRhdHlwZSgpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9HZW9tZXRyeSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlKCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGVzKCk7CiAgICAgIGluaXRfUHJpbWl0aXZlVHlwZSgpOwogICAgICBQbGFuZU91dGxpbmVHZW9tZXRyeS5wYWNrZWRMZW5ndGggPSAwOwogICAgICBQbGFuZU91dGxpbmVHZW9tZXRyeS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfTsKICAgICAgUGxhbmVPdXRsaW5lR2VvbWV0cnkudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBQbGFuZU91dGxpbmVHZW9tZXRyeSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBtaW4yID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgtMC41LCAtMC41LCAwKTsKICAgICAgbWF4MiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoMC41LCAwLjUsIDApOwogICAgICBQbGFuZU91dGxpbmVHZW9tZXRyeS5jcmVhdGVHZW9tZXRyeSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVzX2RlZmF1bHQoKTsKICAgICAgICBjb25zdCBpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KDQgKiAyKTsKICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQ2NEFycmF5KDQgKiAzKTsKICAgICAgICBwb3NpdGlvbnNbMF0gPSBtaW4yLng7CiAgICAgICAgcG9zaXRpb25zWzFdID0gbWluMi55OwogICAgICAgIHBvc2l0aW9uc1syXSA9IG1pbjIuejsKICAgICAgICBwb3NpdGlvbnNbM10gPSBtYXgyLng7CiAgICAgICAgcG9zaXRpb25zWzRdID0gbWluMi55OwogICAgICAgIHBvc2l0aW9uc1s1XSA9IG1pbjIuejsKICAgICAgICBwb3NpdGlvbnNbNl0gPSBtYXgyLng7CiAgICAgICAgcG9zaXRpb25zWzddID0gbWF4Mi55OwogICAgICAgIHBvc2l0aW9uc1s4XSA9IG1pbjIuejsKICAgICAgICBwb3NpdGlvbnNbOV0gPSBtaW4yLng7CiAgICAgICAgcG9zaXRpb25zWzEwXSA9IG1heDIueTsKICAgICAgICBwb3NpdGlvbnNbMTFdID0gbWluMi56OwogICAgICAgIGF0dHJpYnV0ZXMucG9zaXRpb24gPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5ET1VCTEUsCiAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgICAgdmFsdWVzOiBwb3NpdGlvbnMKICAgICAgICB9KTsKICAgICAgICBpbmRpY2VzWzBdID0gMDsKICAgICAgICBpbmRpY2VzWzFdID0gMTsKICAgICAgICBpbmRpY2VzWzJdID0gMTsKICAgICAgICBpbmRpY2VzWzNdID0gMjsKICAgICAgICBpbmRpY2VzWzRdID0gMjsKICAgICAgICBpbmRpY2VzWzVdID0gMzsKICAgICAgICBpbmRpY2VzWzZdID0gMzsKICAgICAgICBpbmRpY2VzWzddID0gMDsKICAgICAgICByZXR1cm4gbmV3IEdlb21ldHJ5X2RlZmF1bHQoewogICAgICAgICAgYXR0cmlidXRlcywKICAgICAgICAgIGluZGljZXMsCiAgICAgICAgICBwcmltaXRpdmVUeXBlOiBQcmltaXRpdmVUeXBlX2RlZmF1bHQuTElORVMsCiAgICAgICAgICBib3VuZGluZ1NwaGVyZTogbmV3IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQoQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8sIE1hdGguc3FydCgyKSkKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgUGxhbmVPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdCA9IFBsYW5lT3V0bGluZUdlb21ldHJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlUGxhbmVPdXRsaW5lR2VvbWV0cnkuanMKICB2YXIgY3JlYXRlUGxhbmVPdXRsaW5lR2VvbWV0cnlfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGNyZWF0ZVBsYW5lT3V0bGluZUdlb21ldHJ5X2V4cG9ydHMsIHsKICAgIGRlZmF1bHQ6ICgpID0+IGNyZWF0ZVBsYW5lT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQKICB9KTsKICBmdW5jdGlvbiBjcmVhdGVQbGFuZU91dGxpbmVHZW9tZXRyeShwbGFuZUdlb21ldHJ5LCBvZmZzZXQpIHsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQob2Zmc2V0KSkgewogICAgICBwbGFuZUdlb21ldHJ5ID0gUGxhbmVPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdC51bnBhY2socGxhbmVHZW9tZXRyeSwgb2Zmc2V0KTsKICAgIH0KICAgIHJldHVybiBQbGFuZU91dGxpbmVHZW9tZXRyeV9kZWZhdWx0LmNyZWF0ZUdlb21ldHJ5KHBsYW5lR2VvbWV0cnkpOwogIH0KICB2YXIgY3JlYXRlUGxhbmVPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9jcmVhdGVQbGFuZU91dGxpbmVHZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlUGxhbmVPdXRsaW5lR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9QbGFuZU91dGxpbmVHZW9tZXRyeSgpOwogICAgICBjcmVhdGVQbGFuZU91dGxpbmVHZW9tZXRyeV9kZWZhdWx0ID0gY3JlYXRlUGxhbmVPdXRsaW5lR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9TdGVyZW9ncmFwaGljLmpzCiAgZnVuY3Rpb24gU3RlcmVvZ3JhcGhpYyhwb3NpdGlvbiwgdGFuZ2VudFBsYW5lKSB7CiAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh0aGlzLnBvc2l0aW9uKSkgewogICAgICB0aGlzLnBvc2l0aW9uID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgfQogICAgdGhpcy50YW5nZW50UGxhbmUgPSB0YW5nZW50UGxhbmU7CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh0aGlzLnRhbmdlbnRQbGFuZSkpIHsKICAgICAgdGhpcy50YW5nZW50UGxhbmUgPSBTdGVyZW9ncmFwaGljLk5PUlRIX1BPTEVfVEFOR0VOVF9QTEFORTsKICAgIH0KICB9CiAgdmFyIHNjcmF0Y2hDYXJ0b2dyYXBoaWM1LCBzY3JhdGNoQ2FydGVzaWFuMTAsIHNjcmF0Y2hQcm9qZWN0UG9pbnRPbnRvUGxhbmVSYXkyLCBzY3JhdGNoUHJvamVjdFBvaW50T250b1BsYW5lUmF5RGlyZWN0aW9uLCBzY3JhdGNoUHJvamVjdFBvaW50T250b1BsYW5lQ2FydGVzaWFuMzIsIFN0ZXJlb2dyYXBoaWNfZGVmYXVsdDsKICB2YXIgaW5pdF9TdGVyZW9ncmFwaGljID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9TdGVyZW9ncmFwaGljLmpzIigpIHsKICAgICAgaW5pdF9DYXJ0ZXNpYW4yKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRvZ3JhcGhpYygpOwogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X0VsbGlwc29pZFRhbmdlbnRQbGFuZSgpOwogICAgICBpbml0X0ludGVyc2VjdGlvblRlc3RzKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBpbml0X1JheSgpOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhTdGVyZW9ncmFwaGljLnByb3RvdHlwZSwgewogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGVsbGlwc29pZC4KICAgICAgICAgKiBAbWVtYmVyb2YgU3RlcmVvZ3JhcGhpYy5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7RWxsaXBzb2lkfQogICAgICAgICAqLwogICAgICAgIGVsbGlwc29pZDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFuZ2VudFBsYW5lLmVsbGlwc29pZDsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIHggY29vcmRpbmF0ZQogICAgICAgICAqIEBtZW1iZXJvZiBTdGVyZW9ncmFwaGljLnByb3RvdHlwZQogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgeDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueDsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIHkgY29vcmRpbmF0ZQogICAgICAgICAqIEBtZW1iZXJvZiBTdGVyZW9ncmFwaGljLnByb3RvdHlwZQogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgeTogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIENvbXB1dGVzIHRoZSBjb25mb3JtYWwgbGF0aXR1ZGUsIG9yIHRoZSBlbGxpcHNvaWRhbCBsYXRpdHVkZSBwcm9qZWN0ZWQgb250byBhbiBhcmJpdHJhcnkgc3BoZXJlLgogICAgICAgICAqIEBtZW1iZXJvZiBTdGVyZW9ncmFwaGljLnByb3RvdHlwZQogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgY29uZm9ybWFsTGF0aXR1ZGU6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNvbnN0IHIgPSBDYXJ0ZXNpYW4yX2RlZmF1bHQubWFnbml0dWRlKHRoaXMucG9zaXRpb24pOwogICAgICAgICAgICBjb25zdCBkID0gMiAqIHRoaXMuZWxsaXBzb2lkLm1heGltdW1SYWRpdXM7CiAgICAgICAgICAgIGNvbnN0IHNpZ24zID0gdGhpcy50YW5nZW50UGxhbmUucGxhbmUubm9ybWFsLno7CiAgICAgICAgICAgIHJldHVybiBzaWduMyAqIChNYXRoX2RlZmF1bHQuUElfT1ZFUl9UV08gLSAyICogTWF0aC5hdGFuMihyLCBkKSk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBDb21wdXRlcyB0aGUgbG9uZ2l0dWRlCiAgICAgICAgICogQG1lbWJlcm9mIFN0ZXJlb2dyYXBoaWMucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKi8KICAgICAgICBsb25naXR1ZGU6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGxldCBsb25naXR1ZGUgPSBNYXRoX2RlZmF1bHQuUElfT1ZFUl9UV08gKyBNYXRoLmF0YW4yKHRoaXMueSwgdGhpcy54KTsKICAgICAgICAgICAgaWYgKGxvbmdpdHVkZSA+IE1hdGguUEkpIHsKICAgICAgICAgICAgICBsb25naXR1ZGUgLT0gTWF0aF9kZWZhdWx0LlRXT19QSTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbG9uZ2l0dWRlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWM1ID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4xMCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgU3RlcmVvZ3JhcGhpYy5wcm90b3R5cGUuZ2V0TGF0aXR1ZGUgPSBmdW5jdGlvbihlbGxpcHNvaWQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChlbGxpcHNvaWQpKSB7CiAgICAgICAgICBlbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC5kZWZhdWx0OwogICAgICAgIH0KICAgICAgICBzY3JhdGNoQ2FydG9ncmFwaGljNS5sYXRpdHVkZSA9IHRoaXMuY29uZm9ybWFsTGF0aXR1ZGU7CiAgICAgICAgc2NyYXRjaENhcnRvZ3JhcGhpYzUubG9uZ2l0dWRlID0gdGhpcy5sb25naXR1ZGU7CiAgICAgICAgc2NyYXRjaENhcnRvZ3JhcGhpYzUuaGVpZ2h0ID0gMDsKICAgICAgICBjb25zdCBjYXJ0ZXNpYW4xMSA9IHRoaXMuZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKAogICAgICAgICAgc2NyYXRjaENhcnRvZ3JhcGhpYzUsCiAgICAgICAgICBzY3JhdGNoQ2FydGVzaWFuMTAKICAgICAgICApOwogICAgICAgIGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhjYXJ0ZXNpYW4xMSwgc2NyYXRjaENhcnRvZ3JhcGhpYzUpOwogICAgICAgIHJldHVybiBzY3JhdGNoQ2FydG9ncmFwaGljNS5sYXRpdHVkZTsKICAgICAgfTsKICAgICAgc2NyYXRjaFByb2plY3RQb2ludE9udG9QbGFuZVJheTIgPSBuZXcgUmF5X2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFByb2plY3RQb2ludE9udG9QbGFuZVJheURpcmVjdGlvbiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFByb2plY3RQb2ludE9udG9QbGFuZUNhcnRlc2lhbjMyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBTdGVyZW9ncmFwaGljLmZyb21DYXJ0ZXNpYW4gPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgY29uc3Qgc2lnbjMgPSBNYXRoX2RlZmF1bHQuc2lnbk5vdFplcm8oY2FydGVzaWFuMTEueik7CiAgICAgICAgbGV0IHRhbmdlbnRQbGFuZSA9IFN0ZXJlb2dyYXBoaWMuTk9SVEhfUE9MRV9UQU5HRU5UX1BMQU5FOwogICAgICAgIGxldCBvcmlnaW4gPSBTdGVyZW9ncmFwaGljLlNPVVRIX1BPTEU7CiAgICAgICAgaWYgKHNpZ24zIDwgMCkgewogICAgICAgICAgdGFuZ2VudFBsYW5lID0gU3RlcmVvZ3JhcGhpYy5TT1VUSF9QT0xFX1RBTkdFTlRfUExBTkU7CiAgICAgICAgICBvcmlnaW4gPSBTdGVyZW9ncmFwaGljLk5PUlRIX1BPTEU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJheSA9IHNjcmF0Y2hQcm9qZWN0UG9pbnRPbnRvUGxhbmVSYXkyOwogICAgICAgIHJheS5vcmlnaW4gPSB0YW5nZW50UGxhbmUuZWxsaXBzb2lkLnNjYWxlVG9HZW9jZW50cmljU3VyZmFjZSgKICAgICAgICAgIGNhcnRlc2lhbjExLAogICAgICAgICAgcmF5Lm9yaWdpbgogICAgICAgICk7CiAgICAgICAgcmF5LmRpcmVjdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdCgKICAgICAgICAgIHJheS5vcmlnaW4sCiAgICAgICAgICBvcmlnaW4sCiAgICAgICAgICBzY3JhdGNoUHJvamVjdFBvaW50T250b1BsYW5lUmF5RGlyZWN0aW9uCiAgICAgICAgKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKHJheS5kaXJlY3Rpb24sIHJheS5kaXJlY3Rpb24pOwogICAgICAgIGNvbnN0IGludGVyc2VjdGlvblBvaW50ID0gSW50ZXJzZWN0aW9uVGVzdHNfZGVmYXVsdC5yYXlQbGFuZSgKICAgICAgICAgIHJheSwKICAgICAgICAgIHRhbmdlbnRQbGFuZS5wbGFuZSwKICAgICAgICAgIHNjcmF0Y2hQcm9qZWN0UG9pbnRPbnRvUGxhbmVDYXJ0ZXNpYW4zMgogICAgICAgICk7CiAgICAgICAgY29uc3QgdjMgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoaW50ZXJzZWN0aW9uUG9pbnQsIG9yaWdpbiwgaW50ZXJzZWN0aW9uUG9pbnQpOwogICAgICAgIGNvbnN0IHggPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KHRhbmdlbnRQbGFuZS54QXhpcywgdjMpOwogICAgICAgIGNvbnN0IHkgPSBzaWduMyAqIENhcnRlc2lhbjNfZGVmYXVsdC5kb3QodGFuZ2VudFBsYW5lLnlBeGlzLCB2Myk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBTdGVyZW9ncmFwaGljKG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoeCwgeSksIHRhbmdlbnRQbGFuZSk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5wb3NpdGlvbiA9IG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoeCwgeSk7CiAgICAgICAgcmVzdWx0LnRhbmdlbnRQbGFuZSA9IHRhbmdlbnRQbGFuZTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBTdGVyZW9ncmFwaGljLmZyb21DYXJ0ZXNpYW5BcnJheSA9IGZ1bmN0aW9uKGNhcnRlc2lhbnMsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiY2FydGVzaWFucyIsIGNhcnRlc2lhbnMpOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IGNhcnRlc2lhbnMubGVuZ3RoOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQubGVuZ3RoID0gbGVuZ3RoOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICByZXN1bHRbaV0gPSBTdGVyZW9ncmFwaGljLmZyb21DYXJ0ZXNpYW4oY2FydGVzaWFuc1tpXSwgcmVzdWx0W2ldKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgU3RlcmVvZ3JhcGhpYy5jbG9uZSA9IGZ1bmN0aW9uKHN0ZXJlb2dyYXBoaWMsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHN0ZXJlb2dyYXBoaWMpKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFN0ZXJlb2dyYXBoaWMoCiAgICAgICAgICAgIHN0ZXJlb2dyYXBoaWMucG9zaXRpb24sCiAgICAgICAgICAgIHN0ZXJlb2dyYXBoaWMudGFuZ2VudFBsYW5lCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXN1bHQucG9zaXRpb24gPSBzdGVyZW9ncmFwaGljLnBvc2l0aW9uOwogICAgICAgIHJlc3VsdC50YW5nZW50UGxhbmUgPSBzdGVyZW9ncmFwaGljLnRhbmdlbnRQbGFuZTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBTdGVyZW9ncmFwaGljLkhBTEZfVU5JVF9TUEhFUkUgPSBPYmplY3QuZnJlZXplKG5ldyBFbGxpcHNvaWRfZGVmYXVsdCgwLjUsIDAuNSwgMC41KSk7CiAgICAgIFN0ZXJlb2dyYXBoaWMuTk9SVEhfUE9MRSA9IE9iamVjdC5mcmVlemUobmV3IENhcnRlc2lhbjNfZGVmYXVsdCgwLCAwLCAwLjUpKTsKICAgICAgU3RlcmVvZ3JhcGhpYy5TT1VUSF9QT0xFID0gT2JqZWN0LmZyZWV6ZShuZXcgQ2FydGVzaWFuM19kZWZhdWx0KDAsIDAsIC0wLjUpKTsKICAgICAgU3RlcmVvZ3JhcGhpYy5OT1JUSF9QT0xFX1RBTkdFTlRfUExBTkUgPSBPYmplY3QuZnJlZXplKAogICAgICAgIG5ldyBFbGxpcHNvaWRUYW5nZW50UGxhbmVfZGVmYXVsdCgKICAgICAgICAgIFN0ZXJlb2dyYXBoaWMuTk9SVEhfUE9MRSwKICAgICAgICAgIFN0ZXJlb2dyYXBoaWMuSEFMRl9VTklUX1NQSEVSRQogICAgICAgICkKICAgICAgKTsKICAgICAgU3RlcmVvZ3JhcGhpYy5TT1VUSF9QT0xFX1RBTkdFTlRfUExBTkUgPSBPYmplY3QuZnJlZXplKAogICAgICAgIG5ldyBFbGxpcHNvaWRUYW5nZW50UGxhbmVfZGVmYXVsdCgKICAgICAgICAgIFN0ZXJlb2dyYXBoaWMuU09VVEhfUE9MRSwKICAgICAgICAgIFN0ZXJlb2dyYXBoaWMuSEFMRl9VTklUX1NQSEVSRQogICAgICAgICkKICAgICAgKTsKICAgICAgU3RlcmVvZ3JhcGhpY19kZWZhdWx0ID0gU3RlcmVvZ3JhcGhpYzsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1BvbHlnb25HZW9tZXRyeS5qcwogIGZ1bmN0aW9uIGFkanVzdFBvc0hlaWdodHNGb3JOb3JtYWwocG9zaXRpb24sIHAxLCBwMiwgZWxsaXBzb2lkKSB7CiAgICBjb25zdCBjYXJ0bzEyID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHBvc2l0aW9uLCBzY3JhdGNoQ2FydG8xKTsKICAgIGNvbnN0IGhlaWdodCA9IGNhcnRvMTIuaGVpZ2h0OwogICAgY29uc3QgcDFDYXJ0byA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhwMSwgc2NyYXRjaENhcnRvMik7CiAgICBwMUNhcnRvLmhlaWdodCA9IGhlaWdodDsKICAgIGVsbGlwc29pZC5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihwMUNhcnRvLCBwMSk7CiAgICBjb25zdCBwMkNhcnRvID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHAyLCBzY3JhdGNoQ2FydG8yKTsKICAgIHAyQ2FydG8uaGVpZ2h0ID0gaGVpZ2h0IC0gMTAwOwogICAgZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKHAyQ2FydG8sIHAyKTsKICB9CiAgZnVuY3Rpb24gY29tcHV0ZUF0dHJpYnV0ZXMob3B0aW9ucykgewogICAgY29uc3QgdmVydGV4Rm9ybWF0ID0gb3B0aW9ucy52ZXJ0ZXhGb3JtYXQ7CiAgICBjb25zdCBnZW9tZXRyeSA9IG9wdGlvbnMuZ2VvbWV0cnk7CiAgICBjb25zdCBzaGFkb3dWb2x1bWUgPSBvcHRpb25zLnNoYWRvd1ZvbHVtZTsKICAgIGNvbnN0IGZsYXRQb3NpdGlvbnMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlczsKICAgIGNvbnN0IGZsYXRUZXhjb29yZHMgPSBkZWZpbmVkX2RlZmF1bHQoZ2VvbWV0cnkuYXR0cmlidXRlcy5zdCkgPyBnZW9tZXRyeS5hdHRyaWJ1dGVzLnN0LnZhbHVlcyA6IHZvaWQgMDsKICAgIGxldCBsZW5ndGggPSBmbGF0UG9zaXRpb25zLmxlbmd0aDsKICAgIGNvbnN0IHdhbGwgPSBvcHRpb25zLndhbGw7CiAgICBjb25zdCB0b3AgPSBvcHRpb25zLnRvcCB8fCB3YWxsOwogICAgY29uc3QgYm90dG9tID0gb3B0aW9ucy5ib3R0b20gfHwgd2FsbDsKICAgIGlmICh2ZXJ0ZXhGb3JtYXQuc3QgfHwgdmVydGV4Rm9ybWF0Lm5vcm1hbCB8fCB2ZXJ0ZXhGb3JtYXQudGFuZ2VudCB8fCB2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50IHx8IHNoYWRvd1ZvbHVtZSkgewogICAgICBjb25zdCBib3VuZGluZ1JlY3RhbmdsZSA9IG9wdGlvbnMuYm91bmRpbmdSZWN0YW5nbGU7CiAgICAgIGNvbnN0IHJvdGF0aW9uQXhpcyA9IG9wdGlvbnMucm90YXRpb25BeGlzOwogICAgICBjb25zdCBwcm9qZWN0VG8yZCA9IG9wdGlvbnMucHJvamVjdFRvMmQ7CiAgICAgIGNvbnN0IGVsbGlwc29pZCA9IG9wdGlvbnMuZWxsaXBzb2lkOwogICAgICBjb25zdCBzdFJvdGF0aW9uID0gb3B0aW9ucy5zdFJvdGF0aW9uOwogICAgICBjb25zdCBwZXJQb3NpdGlvbkhlaWdodCA9IG9wdGlvbnMucGVyUG9zaXRpb25IZWlnaHQ7CiAgICAgIGNvbnN0IG9yaWdpbiA9IGFwcGVuZFRleHR1cmVDb29yZGluYXRlc09yaWdpbjsKICAgICAgb3JpZ2luLnggPSBib3VuZGluZ1JlY3RhbmdsZS54OwogICAgICBvcmlnaW4ueSA9IGJvdW5kaW5nUmVjdGFuZ2xlLnk7CiAgICAgIGNvbnN0IHRleHR1cmVDb29yZGluYXRlcyA9IHZlcnRleEZvcm1hdC5zdCA/IG5ldyBGbG9hdDMyQXJyYXkoMiAqIChsZW5ndGggLyAzKSkgOiB2b2lkIDA7CiAgICAgIGxldCBub3JtYWxzOwogICAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCkgewogICAgICAgIGlmIChwZXJQb3NpdGlvbkhlaWdodCAmJiB0b3AgJiYgIXdhbGwpIHsKICAgICAgICAgIG5vcm1hbHMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZXM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5vcm1hbHMgPSBuZXcgRmxvYXQzMkFycmF5KGxlbmd0aCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHRhbmdlbnRzID0gdmVydGV4Rm9ybWF0LnRhbmdlbnQgPyBuZXcgRmxvYXQzMkFycmF5KGxlbmd0aCkgOiB2b2lkIDA7CiAgICAgIGNvbnN0IGJpdGFuZ2VudHMgPSB2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50ID8gbmV3IEZsb2F0MzJBcnJheShsZW5ndGgpIDogdm9pZCAwOwogICAgICBjb25zdCBleHRydWRlTm9ybWFscyA9IHNoYWRvd1ZvbHVtZSA/IG5ldyBGbG9hdDMyQXJyYXkobGVuZ3RoKSA6IHZvaWQgMDsKICAgICAgbGV0IHRleHR1cmVDb29yZEluZGV4ID0gMDsKICAgICAgbGV0IGF0dHJJbmRleCA9IDA7CiAgICAgIGxldCBub3JtYWwyID0gc2NyYXRjaE5vcm1hbDY7CiAgICAgIGxldCB0YW5nZW50ID0gc2NyYXRjaFRhbmdlbnQ0OwogICAgICBsZXQgYml0YW5nZW50ID0gc2NyYXRjaEJpdGFuZ2VudDQ7CiAgICAgIGxldCByZWNvbXB1dGVOb3JtYWwgPSB0cnVlOwogICAgICBsZXQgdGV4dHVyZU1hdHJpeCA9IGFwcGVuZFRleHR1cmVDb29yZGluYXRlc01hdHJpeDM7CiAgICAgIGxldCB0YW5nZW50Um90YXRpb25NYXRyaXggPSB0YW5nZW50TWF0cml4U2NyYXRjaDI7CiAgICAgIGlmIChzdFJvdGF0aW9uICE9PSAwKSB7CiAgICAgICAgbGV0IHJvdGF0aW9uID0gUXVhdGVybmlvbl9kZWZhdWx0LmZyb21BeGlzQW5nbGUoCiAgICAgICAgICByb3RhdGlvbkF4aXMsCiAgICAgICAgICBzdFJvdGF0aW9uLAogICAgICAgICAgYXBwZW5kVGV4dHVyZUNvb3JkaW5hdGVzUXVhdGVybmlvbgogICAgICAgICk7CiAgICAgICAgdGV4dHVyZU1hdHJpeCA9IE1hdHJpeDNfZGVmYXVsdC5mcm9tUXVhdGVybmlvbihyb3RhdGlvbiwgdGV4dHVyZU1hdHJpeCk7CiAgICAgICAgcm90YXRpb24gPSBRdWF0ZXJuaW9uX2RlZmF1bHQuZnJvbUF4aXNBbmdsZSgKICAgICAgICAgIHJvdGF0aW9uQXhpcywKICAgICAgICAgIC1zdFJvdGF0aW9uLAogICAgICAgICAgYXBwZW5kVGV4dHVyZUNvb3JkaW5hdGVzUXVhdGVybmlvbgogICAgICAgICk7CiAgICAgICAgdGFuZ2VudFJvdGF0aW9uTWF0cml4ID0gTWF0cml4M19kZWZhdWx0LmZyb21RdWF0ZXJuaW9uKAogICAgICAgICAgcm90YXRpb24sCiAgICAgICAgICB0YW5nZW50Um90YXRpb25NYXRyaXgKICAgICAgICApOwogICAgICB9IGVsc2UgewogICAgICAgIHRleHR1cmVNYXRyaXggPSBNYXRyaXgzX2RlZmF1bHQuY2xvbmUoTWF0cml4M19kZWZhdWx0LklERU5USVRZLCB0ZXh0dXJlTWF0cml4KTsKICAgICAgICB0YW5nZW50Um90YXRpb25NYXRyaXggPSBNYXRyaXgzX2RlZmF1bHQuY2xvbmUoCiAgICAgICAgICBNYXRyaXgzX2RlZmF1bHQuSURFTlRJVFksCiAgICAgICAgICB0YW5nZW50Um90YXRpb25NYXRyaXgKICAgICAgICApOwogICAgICB9CiAgICAgIGxldCBib3R0b21PZmZzZXQgPSAwOwogICAgICBsZXQgYm90dG9tT2Zmc2V0MiA9IDA7CiAgICAgIGlmICh0b3AgJiYgYm90dG9tKSB7CiAgICAgICAgYm90dG9tT2Zmc2V0ID0gbGVuZ3RoIC8gMjsKICAgICAgICBib3R0b21PZmZzZXQyID0gbGVuZ3RoIC8gMzsKICAgICAgICBsZW5ndGggLz0gMjsKICAgICAgfQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAzKSB7CiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KAogICAgICAgICAgZmxhdFBvc2l0aW9ucywKICAgICAgICAgIGksCiAgICAgICAgICBhcHBlbmRUZXh0dXJlQ29vcmRpbmF0ZXNDYXJ0ZXNpYW4zCiAgICAgICAgKTsKICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnN0KSB7CiAgICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChmbGF0VGV4Y29vcmRzKSkgewogICAgICAgICAgICBsZXQgcCA9IE1hdHJpeDNfZGVmYXVsdC5tdWx0aXBseUJ5VmVjdG9yKAogICAgICAgICAgICAgIHRleHR1cmVNYXRyaXgsCiAgICAgICAgICAgICAgcG9zaXRpb24sCiAgICAgICAgICAgICAgc2NyYXRjaFBvc2l0aW9uMwogICAgICAgICAgICApOwogICAgICAgICAgICBwID0gZWxsaXBzb2lkLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UocCwgcCk7CiAgICAgICAgICAgIGNvbnN0IHN0ID0gcHJvamVjdFRvMmQoW3BdLCBhcHBlbmRUZXh0dXJlQ29vcmRpbmF0ZXNDYXJ0ZXNpYW4yKVswXTsKICAgICAgICAgICAgQ2FydGVzaWFuMl9kZWZhdWx0LnN1YnRyYWN0KHN0LCBvcmlnaW4sIHN0KTsKICAgICAgICAgICAgY29uc3Qgc3R4ID0gTWF0aF9kZWZhdWx0LmNsYW1wKHN0LnggLyBib3VuZGluZ1JlY3RhbmdsZS53aWR0aCwgMCwgMSk7CiAgICAgICAgICAgIGNvbnN0IHN0eSA9IE1hdGhfZGVmYXVsdC5jbGFtcChzdC55IC8gYm91bmRpbmdSZWN0YW5nbGUuaGVpZ2h0LCAwLCAxKTsKICAgICAgICAgICAgaWYgKGJvdHRvbSkgewogICAgICAgICAgICAgIHRleHR1cmVDb29yZGluYXRlc1t0ZXh0dXJlQ29vcmRJbmRleCArIGJvdHRvbU9mZnNldDJdID0gc3R4OwogICAgICAgICAgICAgIHRleHR1cmVDb29yZGluYXRlc1t0ZXh0dXJlQ29vcmRJbmRleCArIDEgKyBib3R0b21PZmZzZXQyXSA9IHN0eTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodG9wKSB7CiAgICAgICAgICAgICAgdGV4dHVyZUNvb3JkaW5hdGVzW3RleHR1cmVDb29yZEluZGV4XSA9IHN0eDsKICAgICAgICAgICAgICB0ZXh0dXJlQ29vcmRpbmF0ZXNbdGV4dHVyZUNvb3JkSW5kZXggKyAxXSA9IHN0eTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0ZXh0dXJlQ29vcmRJbmRleCArPSAyOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCB8fCB2ZXJ0ZXhGb3JtYXQudGFuZ2VudCB8fCB2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50IHx8IHNoYWRvd1ZvbHVtZSkgewogICAgICAgICAgY29uc3QgYXR0ckluZGV4MSA9IGF0dHJJbmRleCArIDE7CiAgICAgICAgICBjb25zdCBhdHRySW5kZXgyID0gYXR0ckluZGV4ICsgMjsKICAgICAgICAgIGlmICh3YWxsKSB7CiAgICAgICAgICAgIGlmIChpICsgMyA8IGxlbmd0aCkgewogICAgICAgICAgICAgIGNvbnN0IHAxID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShmbGF0UG9zaXRpb25zLCBpICsgMywgcDFTY3JhdGNoMyk7CiAgICAgICAgICAgICAgaWYgKHJlY29tcHV0ZU5vcm1hbCkgewogICAgICAgICAgICAgICAgY29uc3QgcDIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KAogICAgICAgICAgICAgICAgICBmbGF0UG9zaXRpb25zLAogICAgICAgICAgICAgICAgICBpICsgbGVuZ3RoLAogICAgICAgICAgICAgICAgICBwMlNjcmF0Y2gzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKHBlclBvc2l0aW9uSGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgIGFkanVzdFBvc0hlaWdodHNGb3JOb3JtYWwocG9zaXRpb24sIHAxLCBwMiwgZWxsaXBzb2lkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChwMSwgcG9zaXRpb24sIHAxKTsKICAgICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChwMiwgcG9zaXRpb24sIHAyKTsKICAgICAgICAgICAgICAgIG5vcm1hbDIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKAogICAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3MocDIsIHAxLCBub3JtYWwyKSwKICAgICAgICAgICAgICAgICAgbm9ybWFsMgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJlY29tcHV0ZU5vcm1hbCA9IGZhbHNlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24ocDEsIHBvc2l0aW9uLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjEwKSkgewogICAgICAgICAgICAgICAgcmVjb21wdXRlTm9ybWFsID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC50YW5nZW50IHx8IHZlcnRleEZvcm1hdC5iaXRhbmdlbnQpIHsKICAgICAgICAgICAgICBiaXRhbmdlbnQgPSBlbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKHBvc2l0aW9uLCBiaXRhbmdlbnQpOwogICAgICAgICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQudGFuZ2VudCkgewogICAgICAgICAgICAgICAgdGFuZ2VudCA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoCiAgICAgICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhiaXRhbmdlbnQsIG5vcm1hbDIsIHRhbmdlbnQpLAogICAgICAgICAgICAgICAgICB0YW5nZW50CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbm9ybWFsMiA9IGVsbGlwc29pZC5nZW9kZXRpY1N1cmZhY2VOb3JtYWwocG9zaXRpb24sIG5vcm1hbDIpOwogICAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnRhbmdlbnQgfHwgdmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgewogICAgICAgICAgICAgIGlmIChwZXJQb3NpdGlvbkhlaWdodCkgewogICAgICAgICAgICAgICAgc2NyYXRjaFBlclBvc05vcm1hbCA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoCiAgICAgICAgICAgICAgICAgIG5vcm1hbHMsCiAgICAgICAgICAgICAgICAgIGF0dHJJbmRleCwKICAgICAgICAgICAgICAgICAgc2NyYXRjaFBlclBvc05vcm1hbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHNjcmF0Y2hQZXJQb3NUYW5nZW50ID0gQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKAogICAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuVU5JVF9aLAogICAgICAgICAgICAgICAgICBzY3JhdGNoUGVyUG9zTm9ybWFsLAogICAgICAgICAgICAgICAgICBzY3JhdGNoUGVyUG9zVGFuZ2VudAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHNjcmF0Y2hQZXJQb3NUYW5nZW50ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgICAgICAgICAgICAgTWF0cml4M19kZWZhdWx0Lm11bHRpcGx5QnlWZWN0b3IoCiAgICAgICAgICAgICAgICAgICAgdGFuZ2VudFJvdGF0aW9uTWF0cml4LAogICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hQZXJQb3NUYW5nZW50LAogICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hQZXJQb3NUYW5nZW50CiAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgIHNjcmF0Y2hQZXJQb3NUYW5nZW50CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5iaXRhbmdlbnQpIHsKICAgICAgICAgICAgICAgICAgc2NyYXRjaFBlclBvc0JpdGFuZ2VudCA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoCiAgICAgICAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKAogICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaFBlclBvc05vcm1hbCwKICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hQZXJQb3NUYW5nZW50LAogICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaFBlclBvc0JpdGFuZ2VudAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgc2NyYXRjaFBlclBvc0JpdGFuZ2VudAogICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0YW5nZW50ID0gQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKENhcnRlc2lhbjNfZGVmYXVsdC5VTklUX1osIG5vcm1hbDIsIHRhbmdlbnQpOwogICAgICAgICAgICAgIHRhbmdlbnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKAogICAgICAgICAgICAgICAgTWF0cml4M19kZWZhdWx0Lm11bHRpcGx5QnlWZWN0b3IodGFuZ2VudFJvdGF0aW9uTWF0cml4LCB0YW5nZW50LCB0YW5nZW50KSwKICAgICAgICAgICAgICAgIHRhbmdlbnQKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgICAgICAgICAgICBiaXRhbmdlbnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKAogICAgICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY3Jvc3Mobm9ybWFsMiwgdGFuZ2VudCwgYml0YW5nZW50KSwKICAgICAgICAgICAgICAgICAgYml0YW5nZW50CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5ub3JtYWwpIHsKICAgICAgICAgICAgaWYgKG9wdGlvbnMud2FsbCkgewogICAgICAgICAgICAgIG5vcm1hbHNbYXR0ckluZGV4ICsgYm90dG9tT2Zmc2V0XSA9IG5vcm1hbDIueDsKICAgICAgICAgICAgICBub3JtYWxzW2F0dHJJbmRleDEgKyBib3R0b21PZmZzZXRdID0gbm9ybWFsMi55OwogICAgICAgICAgICAgIG5vcm1hbHNbYXR0ckluZGV4MiArIGJvdHRvbU9mZnNldF0gPSBub3JtYWwyLno7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm90dG9tKSB7CiAgICAgICAgICAgICAgbm9ybWFsc1thdHRySW5kZXggKyBib3R0b21PZmZzZXRdID0gLW5vcm1hbDIueDsKICAgICAgICAgICAgICBub3JtYWxzW2F0dHJJbmRleDEgKyBib3R0b21PZmZzZXRdID0gLW5vcm1hbDIueTsKICAgICAgICAgICAgICBub3JtYWxzW2F0dHJJbmRleDIgKyBib3R0b21PZmZzZXRdID0gLW5vcm1hbDIuejsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodG9wICYmICFwZXJQb3NpdGlvbkhlaWdodCB8fCB3YWxsKSB7CiAgICAgICAgICAgICAgbm9ybWFsc1thdHRySW5kZXhdID0gbm9ybWFsMi54OwogICAgICAgICAgICAgIG5vcm1hbHNbYXR0ckluZGV4MV0gPSBub3JtYWwyLnk7CiAgICAgICAgICAgICAgbm9ybWFsc1thdHRySW5kZXgyXSA9IG5vcm1hbDIuejsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHNoYWRvd1ZvbHVtZSkgewogICAgICAgICAgICBpZiAod2FsbCkgewogICAgICAgICAgICAgIG5vcm1hbDIgPSBlbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKHBvc2l0aW9uLCBub3JtYWwyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBleHRydWRlTm9ybWFsc1thdHRySW5kZXggKyBib3R0b21PZmZzZXRdID0gLW5vcm1hbDIueDsKICAgICAgICAgICAgZXh0cnVkZU5vcm1hbHNbYXR0ckluZGV4MSArIGJvdHRvbU9mZnNldF0gPSAtbm9ybWFsMi55OwogICAgICAgICAgICBleHRydWRlTm9ybWFsc1thdHRySW5kZXgyICsgYm90dG9tT2Zmc2V0XSA9IC1ub3JtYWwyLno7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnRhbmdlbnQpIHsKICAgICAgICAgICAgaWYgKG9wdGlvbnMud2FsbCkgewogICAgICAgICAgICAgIHRhbmdlbnRzW2F0dHJJbmRleCArIGJvdHRvbU9mZnNldF0gPSB0YW5nZW50Lng7CiAgICAgICAgICAgICAgdGFuZ2VudHNbYXR0ckluZGV4MSArIGJvdHRvbU9mZnNldF0gPSB0YW5nZW50Lnk7CiAgICAgICAgICAgICAgdGFuZ2VudHNbYXR0ckluZGV4MiArIGJvdHRvbU9mZnNldF0gPSB0YW5nZW50Lno7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm90dG9tKSB7CiAgICAgICAgICAgICAgdGFuZ2VudHNbYXR0ckluZGV4ICsgYm90dG9tT2Zmc2V0XSA9IC10YW5nZW50Lng7CiAgICAgICAgICAgICAgdGFuZ2VudHNbYXR0ckluZGV4MSArIGJvdHRvbU9mZnNldF0gPSAtdGFuZ2VudC55OwogICAgICAgICAgICAgIHRhbmdlbnRzW2F0dHJJbmRleDIgKyBib3R0b21PZmZzZXRdID0gLXRhbmdlbnQuejsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodG9wKSB7CiAgICAgICAgICAgICAgaWYgKHBlclBvc2l0aW9uSGVpZ2h0KSB7CiAgICAgICAgICAgICAgICB0YW5nZW50c1thdHRySW5kZXhdID0gc2NyYXRjaFBlclBvc1RhbmdlbnQueDsKICAgICAgICAgICAgICAgIHRhbmdlbnRzW2F0dHJJbmRleDFdID0gc2NyYXRjaFBlclBvc1RhbmdlbnQueTsKICAgICAgICAgICAgICAgIHRhbmdlbnRzW2F0dHJJbmRleDJdID0gc2NyYXRjaFBlclBvc1RhbmdlbnQuejsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGFuZ2VudHNbYXR0ckluZGV4XSA9IHRhbmdlbnQueDsKICAgICAgICAgICAgICAgIHRhbmdlbnRzW2F0dHJJbmRleDFdID0gdGFuZ2VudC55OwogICAgICAgICAgICAgICAgdGFuZ2VudHNbYXR0ckluZGV4Ml0gPSB0YW5nZW50Lno7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgewogICAgICAgICAgICBpZiAoYm90dG9tKSB7CiAgICAgICAgICAgICAgYml0YW5nZW50c1thdHRySW5kZXggKyBib3R0b21PZmZzZXRdID0gYml0YW5nZW50Lng7CiAgICAgICAgICAgICAgYml0YW5nZW50c1thdHRySW5kZXgxICsgYm90dG9tT2Zmc2V0XSA9IGJpdGFuZ2VudC55OwogICAgICAgICAgICAgIGJpdGFuZ2VudHNbYXR0ckluZGV4MiArIGJvdHRvbU9mZnNldF0gPSBiaXRhbmdlbnQuejsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodG9wKSB7CiAgICAgICAgICAgICAgaWYgKHBlclBvc2l0aW9uSGVpZ2h0KSB7CiAgICAgICAgICAgICAgICBiaXRhbmdlbnRzW2F0dHJJbmRleF0gPSBzY3JhdGNoUGVyUG9zQml0YW5nZW50Lng7CiAgICAgICAgICAgICAgICBiaXRhbmdlbnRzW2F0dHJJbmRleDFdID0gc2NyYXRjaFBlclBvc0JpdGFuZ2VudC55OwogICAgICAgICAgICAgICAgYml0YW5nZW50c1thdHRySW5kZXgyXSA9IHNjcmF0Y2hQZXJQb3NCaXRhbmdlbnQuejsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYml0YW5nZW50c1thdHRySW5kZXhdID0gYml0YW5nZW50Lng7CiAgICAgICAgICAgICAgICBiaXRhbmdlbnRzW2F0dHJJbmRleDFdID0gYml0YW5nZW50Lnk7CiAgICAgICAgICAgICAgICBiaXRhbmdlbnRzW2F0dHJJbmRleDJdID0gYml0YW5nZW50Lno7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBhdHRySW5kZXggKz0gMzsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHZlcnRleEZvcm1hdC5zdCAmJiAhZGVmaW5lZF9kZWZhdWx0KGZsYXRUZXhjb29yZHMpKSB7CiAgICAgICAgZ2VvbWV0cnkuYXR0cmlidXRlcy5zdCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMiwKICAgICAgICAgIHZhbHVlczogdGV4dHVyZUNvb3JkaW5hdGVzCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKHZlcnRleEZvcm1hdC5ub3JtYWwpIHsKICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgIHZhbHVlczogbm9ybWFscwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQudGFuZ2VudCkgewogICAgICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMudGFuZ2VudCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgIHZhbHVlczogdGFuZ2VudHMKICAgICAgICB9KTsKICAgICAgfQogICAgICBpZiAodmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgewogICAgICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMuYml0YW5nZW50ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgICAgdmFsdWVzOiBiaXRhbmdlbnRzCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKHNoYWRvd1ZvbHVtZSkgewogICAgICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMuZXh0cnVkZURpcmVjdGlvbiA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgIHZhbHVlczogZXh0cnVkZU5vcm1hbHMKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgaWYgKG9wdGlvbnMuZXh0cnVkZSAmJiBkZWZpbmVkX2RlZmF1bHQob3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGUpKSB7CiAgICAgIGNvbnN0IHNpemUgPSBmbGF0UG9zaXRpb25zLmxlbmd0aCAvIDM7CiAgICAgIGxldCBvZmZzZXRBdHRyaWJ1dGUgPSBuZXcgVWludDhBcnJheShzaXplKTsKICAgICAgaWYgKG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlID09PSBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZV9kZWZhdWx0LlRPUCkgewogICAgICAgIGlmICh0b3AgJiYgYm90dG9tIHx8IHdhbGwpIHsKICAgICAgICAgIG9mZnNldEF0dHJpYnV0ZSA9IG9mZnNldEF0dHJpYnV0ZS5maWxsKDEsIDAsIHNpemUgLyAyKTsKICAgICAgICB9IGVsc2UgaWYgKHRvcCkgewogICAgICAgICAgb2Zmc2V0QXR0cmlidXRlID0gb2Zmc2V0QXR0cmlidXRlLmZpbGwoMSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IG9mZnNldFZhbHVlID0gb3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGUgPT09IEdlb21ldHJ5T2Zmc2V0QXR0cmlidXRlX2RlZmF1bHQuTk9ORSA/IDAgOiAxOwogICAgICAgIG9mZnNldEF0dHJpYnV0ZSA9IG9mZnNldEF0dHJpYnV0ZS5maWxsKG9mZnNldFZhbHVlKTsKICAgICAgfQogICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LlVOU0lHTkVEX0JZVEUsCiAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMSwKICAgICAgICB2YWx1ZXM6IG9mZnNldEF0dHJpYnV0ZQogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBnZW9tZXRyeTsKICB9CiAgZnVuY3Rpb24gY3JlYXRlR2VvbWV0cnlGcm9tUG9zaXRpb25zRXh0cnVkZWQoZWxsaXBzb2lkLCBwb2x5Z29uMiwgdGV4dHVyZUNvb3JkaW5hdGVzLCBncmFudWxhcml0eSwgaGllcmFyY2h5LCBwZXJQb3NpdGlvbkhlaWdodCwgY2xvc2VUb3AsIGNsb3NlQm90dG9tLCB2ZXJ0ZXhGb3JtYXQsIGFyY1R5cGUpIHsKICAgIGNvbnN0IGdlb3MgPSB7CiAgICAgIHdhbGxzOiBbXQogICAgfTsKICAgIGxldCBpOwogICAgaWYgKGNsb3NlVG9wIHx8IGNsb3NlQm90dG9tKSB7CiAgICAgIGNvbnN0IHRvcEdlbyA9IFBvbHlnb25HZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5jcmVhdGVHZW9tZXRyeUZyb21Qb3NpdGlvbnMoCiAgICAgICAgZWxsaXBzb2lkLAogICAgICAgIHBvbHlnb24yLAogICAgICAgIHRleHR1cmVDb29yZGluYXRlcywKICAgICAgICBncmFudWxhcml0eSwKICAgICAgICBwZXJQb3NpdGlvbkhlaWdodCwKICAgICAgICB2ZXJ0ZXhGb3JtYXQsCiAgICAgICAgYXJjVHlwZQogICAgICApOwogICAgICBjb25zdCBlZGdlUG9pbnRzID0gdG9wR2VvLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzOwogICAgICBjb25zdCBpbmRpY2VzID0gdG9wR2VvLmluZGljZXM7CiAgICAgIGxldCBudW1Qb3NpdGlvbnM7CiAgICAgIGxldCBuZXdJbmRpY2VzOwogICAgICBpZiAoY2xvc2VUb3AgJiYgY2xvc2VCb3R0b20pIHsKICAgICAgICBjb25zdCB0b3BCb3R0b21Qb3NpdGlvbnMgPSBlZGdlUG9pbnRzLmNvbmNhdChlZGdlUG9pbnRzKTsKICAgICAgICBudW1Qb3NpdGlvbnMgPSB0b3BCb3R0b21Qb3NpdGlvbnMubGVuZ3RoIC8gMzsKICAgICAgICBuZXdJbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkoCiAgICAgICAgICBudW1Qb3NpdGlvbnMsCiAgICAgICAgICBpbmRpY2VzLmxlbmd0aCAqIDIKICAgICAgICApOwogICAgICAgIG5ld0luZGljZXMuc2V0KGluZGljZXMpOwogICAgICAgIGNvbnN0IGlsZW5ndGggPSBpbmRpY2VzLmxlbmd0aDsKICAgICAgICBjb25zdCBsZW5ndGggPSBudW1Qb3NpdGlvbnMgLyAyOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbGVuZ3RoOyBpICs9IDMpIHsKICAgICAgICAgIGNvbnN0IGkwID0gbmV3SW5kaWNlc1tpXSArIGxlbmd0aDsKICAgICAgICAgIGNvbnN0IGkxID0gbmV3SW5kaWNlc1tpICsgMV0gKyBsZW5ndGg7CiAgICAgICAgICBjb25zdCBpMiA9IG5ld0luZGljZXNbaSArIDJdICsgbGVuZ3RoOwogICAgICAgICAgbmV3SW5kaWNlc1tpICsgaWxlbmd0aF0gPSBpMjsKICAgICAgICAgIG5ld0luZGljZXNbaSArIDEgKyBpbGVuZ3RoXSA9IGkxOwogICAgICAgICAgbmV3SW5kaWNlc1tpICsgMiArIGlsZW5ndGhdID0gaTA7CiAgICAgICAgfQogICAgICAgIHRvcEdlby5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyA9IHRvcEJvdHRvbVBvc2l0aW9uczsKICAgICAgICBpZiAocGVyUG9zaXRpb25IZWlnaHQgJiYgdmVydGV4Rm9ybWF0Lm5vcm1hbCkgewogICAgICAgICAgY29uc3Qgbm9ybWFscyA9IHRvcEdlby5hdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZXM7CiAgICAgICAgICB0b3BHZW8uYXR0cmlidXRlcy5ub3JtYWwudmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheSgKICAgICAgICAgICAgdG9wQm90dG9tUG9zaXRpb25zLmxlbmd0aAogICAgICAgICAgKTsKICAgICAgICAgIHRvcEdlby5hdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZXMuc2V0KG5vcm1hbHMpOwogICAgICAgIH0KICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnN0ICYmIGRlZmluZWRfZGVmYXVsdCh0ZXh0dXJlQ29vcmRpbmF0ZXMpKSB7CiAgICAgICAgICBjb25zdCB0ZXhjb29yZHMgPSB0b3BHZW8uYXR0cmlidXRlcy5zdC52YWx1ZXM7CiAgICAgICAgICB0b3BHZW8uYXR0cmlidXRlcy5zdC52YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KG51bVBvc2l0aW9ucyAqIDIpOwogICAgICAgICAgdG9wR2VvLmF0dHJpYnV0ZXMuc3QudmFsdWVzID0gdGV4Y29vcmRzLmNvbmNhdCh0ZXhjb29yZHMpOwogICAgICAgIH0KICAgICAgICB0b3BHZW8uaW5kaWNlcyA9IG5ld0luZGljZXM7CiAgICAgIH0gZWxzZSBpZiAoY2xvc2VCb3R0b20pIHsKICAgICAgICBudW1Qb3NpdGlvbnMgPSBlZGdlUG9pbnRzLmxlbmd0aCAvIDM7CiAgICAgICAgbmV3SW5kaWNlcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KG51bVBvc2l0aW9ucywgaW5kaWNlcy5sZW5ndGgpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSArPSAzKSB7CiAgICAgICAgICBuZXdJbmRpY2VzW2ldID0gaW5kaWNlc1tpICsgMl07CiAgICAgICAgICBuZXdJbmRpY2VzW2kgKyAxXSA9IGluZGljZXNbaSArIDFdOwogICAgICAgICAgbmV3SW5kaWNlc1tpICsgMl0gPSBpbmRpY2VzW2ldOwogICAgICAgIH0KICAgICAgICB0b3BHZW8uaW5kaWNlcyA9IG5ld0luZGljZXM7CiAgICAgIH0KICAgICAgZ2Vvcy50b3BBbmRCb3R0b20gPSBuZXcgR2VvbWV0cnlJbnN0YW5jZV9kZWZhdWx0KHsKICAgICAgICBnZW9tZXRyeTogdG9wR2VvCiAgICAgIH0pOwogICAgfQogICAgbGV0IG91dGVyUmluZyA9IGhpZXJhcmNoeS5vdXRlclJpbmc7CiAgICBjb25zdCB0YW5nZW50UGxhbmUgPSBFbGxpcHNvaWRUYW5nZW50UGxhbmVfZGVmYXVsdC5mcm9tUG9pbnRzKG91dGVyUmluZywgZWxsaXBzb2lkKTsKICAgIGxldCBwb3NpdGlvbnMyRCA9IHRhbmdlbnRQbGFuZS5wcm9qZWN0UG9pbnRzT250b1BsYW5lKAogICAgICBvdXRlclJpbmcsCiAgICAgIGNyZWF0ZUdlb21ldHJ5RnJvbVBvc2l0aW9uc0V4dHJ1ZGVkUG9zaXRpb25zCiAgICApOwogICAgbGV0IHdpbmRpbmdPcmRlciA9IFBvbHlnb25QaXBlbGluZV9kZWZhdWx0LmNvbXB1dGVXaW5kaW5nT3JkZXIyRChwb3NpdGlvbnMyRCk7CiAgICBpZiAod2luZGluZ09yZGVyID09PSBXaW5kaW5nT3JkZXJfZGVmYXVsdC5DTE9DS1dJU0UpIHsKICAgICAgb3V0ZXJSaW5nID0gb3V0ZXJSaW5nLnNsaWNlKCkucmV2ZXJzZSgpOwogICAgfQogICAgbGV0IHdhbGxHZW8gPSBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuY29tcHV0ZVdhbGxHZW9tZXRyeSgKICAgICAgb3V0ZXJSaW5nLAogICAgICB0ZXh0dXJlQ29vcmRpbmF0ZXMsCiAgICAgIGVsbGlwc29pZCwKICAgICAgZ3JhbnVsYXJpdHksCiAgICAgIHBlclBvc2l0aW9uSGVpZ2h0LAogICAgICBhcmNUeXBlCiAgICApOwogICAgZ2Vvcy53YWxscy5wdXNoKAogICAgICBuZXcgR2VvbWV0cnlJbnN0YW5jZV9kZWZhdWx0KHsKICAgICAgICBnZW9tZXRyeTogd2FsbEdlbwogICAgICB9KQogICAgKTsKICAgIGNvbnN0IGhvbGVzID0gaGllcmFyY2h5LmhvbGVzOwogICAgZm9yIChpID0gMDsgaSA8IGhvbGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBob2xlID0gaG9sZXNbaV07CiAgICAgIHBvc2l0aW9uczJEID0gdGFuZ2VudFBsYW5lLnByb2plY3RQb2ludHNPbnRvUGxhbmUoCiAgICAgICAgaG9sZSwKICAgICAgICBjcmVhdGVHZW9tZXRyeUZyb21Qb3NpdGlvbnNFeHRydWRlZFBvc2l0aW9ucwogICAgICApOwogICAgICB3aW5kaW5nT3JkZXIgPSBQb2x5Z29uUGlwZWxpbmVfZGVmYXVsdC5jb21wdXRlV2luZGluZ09yZGVyMkQocG9zaXRpb25zMkQpOwogICAgICBpZiAod2luZGluZ09yZGVyID09PSBXaW5kaW5nT3JkZXJfZGVmYXVsdC5DT1VOVEVSX0NMT0NLV0lTRSkgewogICAgICAgIGhvbGUgPSBob2xlLnNsaWNlKCkucmV2ZXJzZSgpOwogICAgICB9CiAgICAgIHdhbGxHZW8gPSBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuY29tcHV0ZVdhbGxHZW9tZXRyeSgKICAgICAgICBob2xlLAogICAgICAgIHRleHR1cmVDb29yZGluYXRlcywKICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgZ3JhbnVsYXJpdHksCiAgICAgICAgcGVyUG9zaXRpb25IZWlnaHQsCiAgICAgICAgYXJjVHlwZQogICAgICApOwogICAgICBnZW9zLndhbGxzLnB1c2goCiAgICAgICAgbmV3IEdlb21ldHJ5SW5zdGFuY2VfZGVmYXVsdCh7CiAgICAgICAgICBnZW9tZXRyeTogd2FsbEdlbwogICAgICAgIH0pCiAgICAgICk7CiAgICB9CiAgICByZXR1cm4gZ2VvczsKICB9CiAgZnVuY3Rpb24gUG9seWdvbkdlb21ldHJ5KG9wdGlvbnMpIHsKICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgib3B0aW9ucyIsIG9wdGlvbnMpOwogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJvcHRpb25zLnBvbHlnb25IaWVyYXJjaHkiLCBvcHRpb25zLnBvbHlnb25IaWVyYXJjaHkpOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvcHRpb25zLnBlclBvc2l0aW9uSGVpZ2h0KSAmJiBvcHRpb25zLnBlclBvc2l0aW9uSGVpZ2h0ICYmIGRlZmluZWRfZGVmYXVsdChvcHRpb25zLmhlaWdodCkpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgIkNhbm5vdCB1c2UgYm90aCBvcHRpb25zLnBlclBvc2l0aW9uSGVpZ2h0IGFuZCBvcHRpb25zLmhlaWdodCIKICAgICAgKTsKICAgIH0KICAgIGlmIChkZWZpbmVkX2RlZmF1bHQob3B0aW9ucy5hcmNUeXBlKSAmJiBvcHRpb25zLmFyY1R5cGUgIT09IEFyY1R5cGVfZGVmYXVsdC5HRU9ERVNJQyAmJiBvcHRpb25zLmFyY1R5cGUgIT09IEFyY1R5cGVfZGVmYXVsdC5SSFVNQikgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAiSW52YWxpZCBhcmNUeXBlLiBWYWxpZCBvcHRpb25zIGFyZSBBcmNUeXBlLkdFT0RFU0lDIGFuZCBBcmNUeXBlLlJIVU1CLiIKICAgICAgKTsKICAgIH0KICAgIGNvbnN0IHBvbHlnb25IaWVyYXJjaHkgPSBvcHRpb25zLnBvbHlnb25IaWVyYXJjaHk7CiAgICBjb25zdCB2ZXJ0ZXhGb3JtYXQgPSBvcHRpb25zLnZlcnRleEZvcm1hdCA/PyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5ERUZBVUxUOwogICAgY29uc3QgZWxsaXBzb2lkID0gb3B0aW9ucy5lbGxpcHNvaWQgPz8gRWxsaXBzb2lkX2RlZmF1bHQuZGVmYXVsdDsKICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gb3B0aW9ucy5ncmFudWxhcml0eSA/PyBNYXRoX2RlZmF1bHQuUkFESUFOU19QRVJfREVHUkVFOwogICAgY29uc3Qgc3RSb3RhdGlvbiA9IG9wdGlvbnMuc3RSb3RhdGlvbiA/PyAwOwogICAgY29uc3QgdGV4dHVyZUNvb3JkaW5hdGVzID0gb3B0aW9ucy50ZXh0dXJlQ29vcmRpbmF0ZXM7CiAgICBjb25zdCBwZXJQb3NpdGlvbkhlaWdodCA9IG9wdGlvbnMucGVyUG9zaXRpb25IZWlnaHQgPz8gZmFsc2U7CiAgICBjb25zdCBwZXJQb3NpdGlvbkhlaWdodEV4dHJ1ZGUgPSBwZXJQb3NpdGlvbkhlaWdodCAmJiBkZWZpbmVkX2RlZmF1bHQob3B0aW9ucy5leHRydWRlZEhlaWdodCk7CiAgICBsZXQgaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgPz8gMDsKICAgIGxldCBleHRydWRlZEhlaWdodCA9IG9wdGlvbnMuZXh0cnVkZWRIZWlnaHQgPz8gaGVpZ2h0OwogICAgaWYgKCFwZXJQb3NpdGlvbkhlaWdodEV4dHJ1ZGUpIHsKICAgICAgY29uc3QgaCA9IE1hdGgubWF4KGhlaWdodCwgZXh0cnVkZWRIZWlnaHQpOwogICAgICBleHRydWRlZEhlaWdodCA9IE1hdGgubWluKGhlaWdodCwgZXh0cnVkZWRIZWlnaHQpOwogICAgICBoZWlnaHQgPSBoOwogICAgfQogICAgdGhpcy5fdmVydGV4Rm9ybWF0ID0gVmVydGV4Rm9ybWF0X2RlZmF1bHQuY2xvbmUodmVydGV4Rm9ybWF0KTsKICAgIHRoaXMuX2VsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKGVsbGlwc29pZCk7CiAgICB0aGlzLl9ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwogICAgdGhpcy5fc3RSb3RhdGlvbiA9IHN0Um90YXRpb247CiAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQ7CiAgICB0aGlzLl9leHRydWRlZEhlaWdodCA9IGV4dHJ1ZGVkSGVpZ2h0OwogICAgdGhpcy5fY2xvc2VUb3AgPSBvcHRpb25zLmNsb3NlVG9wID8/IHRydWU7CiAgICB0aGlzLl9jbG9zZUJvdHRvbSA9IG9wdGlvbnMuY2xvc2VCb3R0b20gPz8gdHJ1ZTsKICAgIHRoaXMuX3BvbHlnb25IaWVyYXJjaHkgPSBwb2x5Z29uSGllcmFyY2h5OwogICAgdGhpcy5fcGVyUG9zaXRpb25IZWlnaHQgPSBwZXJQb3NpdGlvbkhlaWdodDsKICAgIHRoaXMuX3BlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZSA9IHBlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZTsKICAgIHRoaXMuX3NoYWRvd1ZvbHVtZSA9IG9wdGlvbnMuc2hhZG93Vm9sdW1lID8/IGZhbHNlOwogICAgdGhpcy5fd29ya2VyTmFtZSA9ICJjcmVhdGVQb2x5Z29uR2VvbWV0cnkiOwogICAgdGhpcy5fb2Zmc2V0QXR0cmlidXRlID0gb3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGU7CiAgICB0aGlzLl9hcmNUeXBlID0gb3B0aW9ucy5hcmNUeXBlID8/IEFyY1R5cGVfZGVmYXVsdC5HRU9ERVNJQzsKICAgIHRoaXMuX3JlY3RhbmdsZSA9IHZvaWQgMDsKICAgIHRoaXMuX3RleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHMgPSB2b2lkIDA7CiAgICB0aGlzLl90ZXh0dXJlQ29vcmRpbmF0ZXMgPSB0ZXh0dXJlQ29vcmRpbmF0ZXM7CiAgICB0aGlzLnBhY2tlZExlbmd0aCA9IFBvbHlnb25HZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5jb21wdXRlSGllcmFyY2h5UGFja2VkTGVuZ3RoKAogICAgICBwb2x5Z29uSGllcmFyY2h5LAogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQKICAgICkgKyBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyAodGV4dHVyZUNvb3JkaW5hdGVzID8gUG9seWdvbkdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmNvbXB1dGVIaWVyYXJjaHlQYWNrZWRMZW5ndGgoCiAgICAgIHRleHR1cmVDb29yZGluYXRlcywKICAgICAgQ2FydGVzaWFuMl9kZWZhdWx0CiAgICApIDogMSkgKyAxMjsKICB9CiAgZnVuY3Rpb24gZXhwYW5kUmVjdGFuZ2xlKHBvbGFyLCBsYXN0UG9sYXIsIGVsbGlwc29pZCwgYXJjVHlwZSwgcG9seWdvbjIsIHJlc3VsdCkgewogICAgY29uc3QgbG9uZ2l0dWRlID0gcG9sYXIubG9uZ2l0dWRlOwogICAgY29uc3QgbG9uQWRqdXN0ZWQgPSBsb25naXR1ZGUgPj0gMCA/IGxvbmdpdHVkZSA6IGxvbmdpdHVkZSArIE1hdGhfZGVmYXVsdC5UV09fUEk7CiAgICBwb2x5Z29uMi53ZXN0T3ZlcklkbCA9IE1hdGgubWluKHBvbHlnb24yLndlc3RPdmVySWRsLCBsb25BZGp1c3RlZCk7CiAgICBwb2x5Z29uMi5lYXN0T3ZlcklkbCA9IE1hdGgubWF4KHBvbHlnb24yLmVhc3RPdmVySWRsLCBsb25BZGp1c3RlZCk7CiAgICByZXN1bHQud2VzdCA9IE1hdGgubWluKHJlc3VsdC53ZXN0LCBsb25naXR1ZGUpOwogICAgcmVzdWx0LmVhc3QgPSBNYXRoLm1heChyZXN1bHQuZWFzdCwgbG9uZ2l0dWRlKTsKICAgIGNvbnN0IGxhdGl0dWRlID0gcG9sYXIuZ2V0TGF0aXR1ZGUoZWxsaXBzb2lkKTsKICAgIGxldCBzZWdtZW50TGF0aXR1ZGUgPSBsYXRpdHVkZTsKICAgIHJlc3VsdC5zb3V0aCA9IE1hdGgubWluKHJlc3VsdC5zb3V0aCwgbGF0aXR1ZGUpOwogICAgcmVzdWx0Lm5vcnRoID0gTWF0aC5tYXgocmVzdWx0Lm5vcnRoLCBsYXRpdHVkZSk7CiAgICBpZiAoYXJjVHlwZSAhPT0gQXJjVHlwZV9kZWZhdWx0LlJIVU1CKSB7CiAgICAgIGNvbnN0IHNlZ21lbnQgPSBDYXJ0ZXNpYW4yX2RlZmF1bHQuc3VidHJhY3QoCiAgICAgICAgbGFzdFBvbGFyLnBvc2l0aW9uLAogICAgICAgIHBvbGFyLnBvc2l0aW9uLAogICAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4wMgogICAgICApOwogICAgICBjb25zdCB0ID0gQ2FydGVzaWFuMl9kZWZhdWx0LmRvdChsYXN0UG9sYXIucG9zaXRpb24sIHNlZ21lbnQpIC8gQ2FydGVzaWFuMl9kZWZhdWx0LmRvdChzZWdtZW50LCBzZWdtZW50KTsKICAgICAgaWYgKHQgPiAwICYmIHQgPCAxKSB7CiAgICAgICAgY29uc3QgcHJvamVjdGVkID0gQ2FydGVzaWFuMl9kZWZhdWx0LmFkZCgKICAgICAgICAgIGxhc3RQb2xhci5wb3NpdGlvbiwKICAgICAgICAgIENhcnRlc2lhbjJfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKHNlZ21lbnQsIC10LCBzZWdtZW50KSwKICAgICAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4xOAogICAgICAgICk7CiAgICAgICAgY29uc3QgY2xvc2VzdFBvbGFyID0gU3RlcmVvZ3JhcGhpY19kZWZhdWx0LmNsb25lKGxhc3RQb2xhciwgc2NyYXRjaFBvbGFyQ2xvc2VzdCk7CiAgICAgICAgY2xvc2VzdFBvbGFyLnBvc2l0aW9uID0gcHJvamVjdGVkOwogICAgICAgIGNvbnN0IGFkanVzdGVkTGF0aXR1ZGUgPSBjbG9zZXN0UG9sYXIuZ2V0TGF0aXR1ZGUoZWxsaXBzb2lkKTsKICAgICAgICByZXN1bHQuc291dGggPSBNYXRoLm1pbihyZXN1bHQuc291dGgsIGFkanVzdGVkTGF0aXR1ZGUpOwogICAgICAgIHJlc3VsdC5ub3J0aCA9IE1hdGgubWF4KHJlc3VsdC5ub3J0aCwgYWRqdXN0ZWRMYXRpdHVkZSk7CiAgICAgICAgaWYgKE1hdGguYWJzKGxhdGl0dWRlKSA+IE1hdGguYWJzKGFkanVzdGVkTGF0aXR1ZGUpKSB7CiAgICAgICAgICBzZWdtZW50TGF0aXR1ZGUgPSBhZGp1c3RlZExhdGl0dWRlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29uc3QgZGlyZWN0aW9uMiA9IGxhc3RQb2xhci54ICogcG9sYXIueSAtIHBvbGFyLnggKiBsYXN0UG9sYXIueTsKICAgIGxldCBhbmdsZSA9IE1hdGguc2lnbihkaXJlY3Rpb24yKTsKICAgIGlmIChhbmdsZSAhPT0gMCkgewogICAgICBhbmdsZSAqPSBDYXJ0ZXNpYW4yX2RlZmF1bHQuYW5nbGVCZXR3ZWVuKGxhc3RQb2xhci5wb3NpdGlvbiwgcG9sYXIucG9zaXRpb24pOwogICAgfQogICAgaWYgKHNlZ21lbnRMYXRpdHVkZSA+PSAwKSB7CiAgICAgIHBvbHlnb24yLm5vcnRoQW5nbGUgKz0gYW5nbGU7CiAgICB9CiAgICBpZiAoc2VnbWVudExhdGl0dWRlIDw9IDApIHsKICAgICAgcG9seWdvbjIuc291dGhBbmdsZSArPSBhbmdsZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZ2V0VGFuZ2VudFBsYW5lKHJlY3RhbmdsZSwgcG9zaXRpb25zLCBlbGxpcHNvaWQpIHsKICAgIGlmIChyZWN0YW5nbGUuaGVpZ2h0ID49IE1hdGhfZGVmYXVsdC5QSSB8fCByZWN0YW5nbGUud2lkdGggPj0gTWF0aF9kZWZhdWx0LlBJKSB7CiAgICAgIGNvbnN0IHBvbGFyID0gU3RlcmVvZ3JhcGhpY19kZWZhdWx0LmZyb21DYXJ0ZXNpYW4oCiAgICAgICAgcG9zaXRpb25zWzBdLAogICAgICAgIHNjcmF0Y2hQb2xhckZvclBsYW5lCiAgICAgICk7CiAgICAgIHJldHVybiBwb2xhci50YW5nZW50UGxhbmU7CiAgICB9CiAgICByZXR1cm4gRWxsaXBzb2lkVGFuZ2VudFBsYW5lX2RlZmF1bHQuZnJvbVBvaW50cyhwb3NpdGlvbnMsIGVsbGlwc29pZCk7CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZVByb2plY3RUbzJkKHJlY3RhbmdsZSwgb3V0ZXJQb3NpdGlvbnMsIGVsbGlwc29pZCkgewogICAgcmV0dXJuIChwb3NpdGlvbnMsIHJlc3VsdHMpID0+IHsKICAgICAgaWYgKHJlY3RhbmdsZS5oZWlnaHQgPj0gTWF0aF9kZWZhdWx0LlBJIHx8IHJlY3RhbmdsZS53aWR0aCA+PSBNYXRoX2RlZmF1bHQuUEkpIHsKICAgICAgICBpZiAocmVjdGFuZ2xlLnNvdXRoIDwgMCAmJiByZWN0YW5nbGUubm9ydGggPiAwKSB7CiAgICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHRzKSkgewogICAgICAgICAgICByZXN1bHRzID0gW107CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICBjb25zdCBjYXJ0b2dyYXBoaWMyID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKAogICAgICAgICAgICAgIHBvc2l0aW9uc1tpXSwKICAgICAgICAgICAgICBzY3JhdGNoQ2FydG9ncmFwaGljQ3lsbGluZHJpY2FsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJlc3VsdHNbaV0gPSBuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KAogICAgICAgICAgICAgIGNhcnRvZ3JhcGhpYzIubG9uZ2l0dWRlIC8gTWF0aF9kZWZhdWx0LlBJLAogICAgICAgICAgICAgIGNhcnRvZ3JhcGhpYzIubGF0aXR1ZGUgLyBNYXRoX2RlZmF1bHQuUElfT1ZFUl9UV08KICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdHMubGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aDsKICAgICAgICAgIHJldHVybiByZXN1bHRzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gU3RlcmVvZ3JhcGhpY19kZWZhdWx0LmZyb21DYXJ0ZXNpYW5BcnJheShwb3NpdGlvbnMsIHJlc3VsdHMpOwogICAgICB9CiAgICAgIGNvbnN0IHRhbmdlbnRQbGFuZSA9IEVsbGlwc29pZFRhbmdlbnRQbGFuZV9kZWZhdWx0LmZyb21Qb2ludHMoCiAgICAgICAgb3V0ZXJQb3NpdGlvbnMsCiAgICAgICAgZWxsaXBzb2lkCiAgICAgICk7CiAgICAgIHJldHVybiB0YW5nZW50UGxhbmUucHJvamVjdFBvaW50c09udG9QbGFuZShwb3NpdGlvbnMsIHJlc3VsdHMpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gY3JlYXRlUHJvamVjdFBvc2l0aW9uVG8yZChyZWN0YW5nbGUsIG91dGVyUmluZywgZWxsaXBzb2lkKSB7CiAgICBpZiAocmVjdGFuZ2xlLmhlaWdodCA+PSBNYXRoX2RlZmF1bHQuUEkgfHwgcmVjdGFuZ2xlLndpZHRoID49IE1hdGhfZGVmYXVsdC5QSSkgewogICAgICByZXR1cm4gKHBvc2l0aW9uLCByZXN1bHQpID0+IHsKICAgICAgICBpZiAocmVjdGFuZ2xlLnNvdXRoIDwgMCAmJiByZWN0YW5nbGUubm9ydGggPiAwKSB7CiAgICAgICAgICBjb25zdCBjYXJ0b2dyYXBoaWMyID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKAogICAgICAgICAgICBwb3NpdGlvbiwKICAgICAgICAgICAgc2NyYXRjaENhcnRvZ3JhcGhpY0N5bGxpbmRyaWNhbAogICAgICAgICAgKTsKICAgICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICAgICAgfQogICAgICAgICAgcmVzdWx0LnggPSBjYXJ0b2dyYXBoaWMyLmxvbmdpdHVkZSAvIE1hdGhfZGVmYXVsdC5QSTsKICAgICAgICAgIHJlc3VsdC55ID0gY2FydG9ncmFwaGljMi5sYXRpdHVkZSAvIE1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTzsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBTdGVyZW9ncmFwaGljX2RlZmF1bHQuZnJvbUNhcnRlc2lhbihwb3NpdGlvbiwgcmVzdWx0KTsKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IHRhbmdlbnRQbGFuZSA9IEVsbGlwc29pZFRhbmdlbnRQbGFuZV9kZWZhdWx0LmZyb21Qb2ludHMob3V0ZXJSaW5nLCBlbGxpcHNvaWQpOwogICAgcmV0dXJuIChwb3NpdGlvbiwgcmVzdWx0KSA9PiB7CiAgICAgIHJldHVybiB0YW5nZW50UGxhbmUucHJvamVjdFBvaW50c09udG9QbGFuZShwb3NpdGlvbiwgcmVzdWx0KTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZVNwbGl0UG9seWdvbnMocmVjdGFuZ2xlLCBlbGxpcHNvaWQsIGFyY1R5cGUsIHBlclBvc2l0aW9uSGVpZ2h0KSB7CiAgICByZXR1cm4gKHBvbHlnb25zLCByZXN1bHRzKSA9PiB7CiAgICAgIGlmICghcGVyUG9zaXRpb25IZWlnaHQgJiYgKHJlY3RhbmdsZS5oZWlnaHQgPj0gTWF0aF9kZWZhdWx0LlBJX09WRVJfVFdPIHx8IHJlY3RhbmdsZS53aWR0aCA+PSAyICogTWF0aF9kZWZhdWx0LlBJX09WRVJfVEhSRUUpKSB7CiAgICAgICAgcmV0dXJuIFBvbHlnb25HZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5zcGxpdFBvbHlnb25zT25FcXVhdG9yKAogICAgICAgICAgcG9seWdvbnMsCiAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICBhcmNUeXBlLAogICAgICAgICAgcmVzdWx0cwogICAgICAgICk7CiAgICAgIH0KICAgICAgcmV0dXJuIHBvbHlnb25zOwogICAgfTsKICB9CiAgZnVuY3Rpb24gY29tcHV0ZUJvdW5kaW5nUmVjdGFuZ2xlKG91dGVyUmluZywgcmVjdGFuZ2xlLCBlbGxpcHNvaWQsIHN0Um90YXRpb24pIHsKICAgIGlmIChyZWN0YW5nbGUuaGVpZ2h0ID49IE1hdGhfZGVmYXVsdC5QSSB8fCByZWN0YW5nbGUud2lkdGggPj0gTWF0aF9kZWZhdWx0LlBJKSB7CiAgICAgIHJldHVybiBCb3VuZGluZ1JlY3RhbmdsZV9kZWZhdWx0LmZyb21SZWN0YW5nbGUoCiAgICAgICAgcmVjdGFuZ2xlLAogICAgICAgIHZvaWQgMCwKICAgICAgICBzY3JhdGNoQm91bmRpbmdSZWN0YW5nbGUKICAgICAgKTsKICAgIH0KICAgIGNvbnN0IG91dGVyUG9zaXRpb25zID0gb3V0ZXJSaW5nOwogICAgY29uc3QgdGFuZ2VudFBsYW5lID0gRWxsaXBzb2lkVGFuZ2VudFBsYW5lX2RlZmF1bHQuZnJvbVBvaW50cygKICAgICAgb3V0ZXJQb3NpdGlvbnMsCiAgICAgIGVsbGlwc29pZAogICAgKTsKICAgIHJldHVybiBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuY29tcHV0ZUJvdW5kaW5nUmVjdGFuZ2xlKAogICAgICB0YW5nZW50UGxhbmUucGxhbmUubm9ybWFsLAogICAgICB0YW5nZW50UGxhbmUucHJvamVjdFBvaW50T250b1BsYW5lLmJpbmQodGFuZ2VudFBsYW5lKSwKICAgICAgb3V0ZXJQb3NpdGlvbnMsCiAgICAgIHN0Um90YXRpb24sCiAgICAgIHNjcmF0Y2hCb3VuZGluZ1JlY3RhbmdsZQogICAgKTsKICB9CiAgZnVuY3Rpb24gdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50czIocG9seWdvbkdlb21ldHJ5KSB7CiAgICBjb25zdCBzdFJvdGF0aW9uID0gLXBvbHlnb25HZW9tZXRyeS5fc3RSb3RhdGlvbjsKICAgIGlmIChzdFJvdGF0aW9uID09PSAwKSB7CiAgICAgIHJldHVybiBbMCwgMCwgMCwgMSwgMSwgMF07CiAgICB9CiAgICBjb25zdCBlbGxpcHNvaWQgPSBwb2x5Z29uR2VvbWV0cnkuX2VsbGlwc29pZDsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IHBvbHlnb25HZW9tZXRyeS5fcG9seWdvbkhpZXJhcmNoeS5wb3NpdGlvbnM7CiAgICBjb25zdCBib3VuZGluZ1JlY3RhbmdsZSA9IHBvbHlnb25HZW9tZXRyeS5yZWN0YW5nbGU7CiAgICByZXR1cm4gR2VvbWV0cnlfZGVmYXVsdC5fdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50cygKICAgICAgcG9zaXRpb25zLAogICAgICBzdFJvdGF0aW9uLAogICAgICBlbGxpcHNvaWQsCiAgICAgIGJvdW5kaW5nUmVjdGFuZ2xlCiAgICApOwogIH0KICB2YXIgc2NyYXRjaENhcnRvMSwgc2NyYXRjaENhcnRvMiwgc2NyYXRjaEJvdW5kaW5nUmVjdGFuZ2xlLCBzY3JhdGNoUG9zaXRpb24zLCBzY3JhdGNoTm9ybWFsNiwgc2NyYXRjaFRhbmdlbnQ0LCBzY3JhdGNoQml0YW5nZW50NCwgcDFTY3JhdGNoMywgcDJTY3JhdGNoMywgc2NyYXRjaFBlclBvc05vcm1hbCwgc2NyYXRjaFBlclBvc1RhbmdlbnQsIHNjcmF0Y2hQZXJQb3NCaXRhbmdlbnQsIGFwcGVuZFRleHR1cmVDb29yZGluYXRlc09yaWdpbiwgYXBwZW5kVGV4dHVyZUNvb3JkaW5hdGVzQ2FydGVzaWFuMiwgYXBwZW5kVGV4dHVyZUNvb3JkaW5hdGVzQ2FydGVzaWFuMywgYXBwZW5kVGV4dHVyZUNvb3JkaW5hdGVzUXVhdGVybmlvbiwgYXBwZW5kVGV4dHVyZUNvb3JkaW5hdGVzTWF0cml4MywgdGFuZ2VudE1hdHJpeFNjcmF0Y2gyLCBjcmVhdGVHZW9tZXRyeUZyb21Qb3NpdGlvbnNFeHRydWRlZFBvc2l0aW9ucywgc2NyYXRjaEVsbGlwc29pZDYsIHNjcmF0Y2hWZXJ0ZXhGb3JtYXQ5LCBkdW1teU9wdGlvbnMsIHNjcmF0Y2hDYXJ0ZXNpYW4wMiwgc2NyYXRjaENhcnRlc2lhbjE4LCBzY3JhdGNoUG9sYXJDbG9zZXN0LCBzY3JhdGNoUG9sYXIsIHNjcmF0Y2hQb2xhclByZXZpb3VzLCBwb2x5Z29uLCBzY3JhdGNoUG9sYXJGb3JQbGFuZSwgc2NyYXRjaENhcnRvZ3JhcGhpY0N5bGxpbmRyaWNhbCwgUG9seWdvbkdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfUG9seWdvbkdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Qb2x5Z29uR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X0FyY1R5cGUoKTsKICAgICAgaW5pdF9Cb3VuZGluZ1JlY3RhbmdsZSgpOwogICAgICBpbml0X0JvdW5kaW5nU3BoZXJlKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMigpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DYXJ0b2dyYXBoaWMoKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X0NvbXBvbmVudERhdGF0eXBlKCk7CiAgICAgIGluaXRfRnJvemVuKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkVGFuZ2VudFBsYW5lKCk7CiAgICAgIGluaXRfR2VvbWV0cnkoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZSgpOwogICAgICBpbml0X0dlb21ldHJ5SW5zdGFuY2UoKTsKICAgICAgaW5pdF9HZW9tZXRyeU9mZnNldEF0dHJpYnV0ZSgpOwogICAgICBpbml0X0dlb21ldHJ5UGlwZWxpbmUoKTsKICAgICAgaW5pdF9JbmRleERhdGF0eXBlKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBpbml0X01hdHJpeDMoKTsKICAgICAgaW5pdF9Qb2x5Z29uR2VvbWV0cnlMaWJyYXJ5KCk7CiAgICAgIGluaXRfUG9seWdvblBpcGVsaW5lKCk7CiAgICAgIGluaXRfUXVhdGVybmlvbigpOwogICAgICBpbml0X1JlY3RhbmdsZSgpOwogICAgICBpbml0X1N0ZXJlb2dyYXBoaWMoKTsKICAgICAgaW5pdF9WZXJ0ZXhGb3JtYXQoKTsKICAgICAgaW5pdF9XaW5kaW5nT3JkZXIoKTsKICAgICAgc2NyYXRjaENhcnRvMSA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydG8yID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hCb3VuZGluZ1JlY3RhbmdsZSA9IG5ldyBCb3VuZGluZ1JlY3RhbmdsZV9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hQb3NpdGlvbjMgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hOb3JtYWw2ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoVGFuZ2VudDQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hCaXRhbmdlbnQ0ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBwMVNjcmF0Y2gzID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBwMlNjcmF0Y2gzID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoUGVyUG9zTm9ybWFsID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoUGVyUG9zVGFuZ2VudCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFBlclBvc0JpdGFuZ2VudCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgYXBwZW5kVGV4dHVyZUNvb3JkaW5hdGVzT3JpZ2luID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICBhcHBlbmRUZXh0dXJlQ29vcmRpbmF0ZXNDYXJ0ZXNpYW4yID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICBhcHBlbmRUZXh0dXJlQ29vcmRpbmF0ZXNDYXJ0ZXNpYW4zID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBhcHBlbmRUZXh0dXJlQ29vcmRpbmF0ZXNRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb25fZGVmYXVsdCgpOwogICAgICBhcHBlbmRUZXh0dXJlQ29vcmRpbmF0ZXNNYXRyaXgzID0gbmV3IE1hdHJpeDNfZGVmYXVsdCgpOwogICAgICB0YW5nZW50TWF0cml4U2NyYXRjaDIgPSBuZXcgTWF0cml4M19kZWZhdWx0KCk7CiAgICAgIGNyZWF0ZUdlb21ldHJ5RnJvbVBvc2l0aW9uc0V4dHJ1ZGVkUG9zaXRpb25zID0gW107CiAgICAgIFBvbHlnb25HZW9tZXRyeS5mcm9tUG9zaXRpb25zID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoIm9wdGlvbnMucG9zaXRpb25zIiwgb3B0aW9ucy5wb3NpdGlvbnMpOwogICAgICAgIGNvbnN0IG5ld09wdGlvbnMgPSB7CiAgICAgICAgICBwb2x5Z29uSGllcmFyY2h5OiB7CiAgICAgICAgICAgIHBvc2l0aW9uczogb3B0aW9ucy5wb3NpdGlvbnMKICAgICAgICAgIH0sCiAgICAgICAgICBoZWlnaHQ6IG9wdGlvbnMuaGVpZ2h0LAogICAgICAgICAgZXh0cnVkZWRIZWlnaHQ6IG9wdGlvbnMuZXh0cnVkZWRIZWlnaHQsCiAgICAgICAgICB2ZXJ0ZXhGb3JtYXQ6IG9wdGlvbnMudmVydGV4Rm9ybWF0LAogICAgICAgICAgc3RSb3RhdGlvbjogb3B0aW9ucy5zdFJvdGF0aW9uLAogICAgICAgICAgZWxsaXBzb2lkOiBvcHRpb25zLmVsbGlwc29pZCwKICAgICAgICAgIGdyYW51bGFyaXR5OiBvcHRpb25zLmdyYW51bGFyaXR5LAogICAgICAgICAgcGVyUG9zaXRpb25IZWlnaHQ6IG9wdGlvbnMucGVyUG9zaXRpb25IZWlnaHQsCiAgICAgICAgICBjbG9zZVRvcDogb3B0aW9ucy5jbG9zZVRvcCwKICAgICAgICAgIGNsb3NlQm90dG9tOiBvcHRpb25zLmNsb3NlQm90dG9tLAogICAgICAgICAgb2Zmc2V0QXR0cmlidXRlOiBvcHRpb25zLm9mZnNldEF0dHJpYnV0ZSwKICAgICAgICAgIGFyY1R5cGU6IG9wdGlvbnMuYXJjVHlwZSwKICAgICAgICAgIHRleHR1cmVDb29yZGluYXRlczogb3B0aW9ucy50ZXh0dXJlQ29vcmRpbmF0ZXMKICAgICAgICB9OwogICAgICAgIHJldHVybiBuZXcgUG9seWdvbkdlb21ldHJ5KG5ld09wdGlvbnMpOwogICAgICB9OwogICAgICBQb2x5Z29uR2VvbWV0cnkucGFjayA9IGZ1bmN0aW9uKHZhbHVlLCBhcnJheSwgc3RhcnRpbmdJbmRleCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQucGFja1BvbHlnb25IaWVyYXJjaHkoCiAgICAgICAgICB2YWx1ZS5fcG9seWdvbkhpZXJhcmNoeSwKICAgICAgICAgIGFycmF5LAogICAgICAgICAgc3RhcnRpbmdJbmRleCwKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdAogICAgICAgICk7CiAgICAgICAgRWxsaXBzb2lkX2RlZmF1bHQucGFjayh2YWx1ZS5fZWxsaXBzb2lkLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgVmVydGV4Rm9ybWF0X2RlZmF1bHQucGFjayh2YWx1ZS5fdmVydGV4Rm9ybWF0LCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9oZWlnaHQ7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9leHRydWRlZEhlaWdodDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX2dyYW51bGFyaXR5OwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5fc3RSb3RhdGlvbjsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX3BlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZSA/IDEgOiAwOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5fcGVyUG9zaXRpb25IZWlnaHQgPyAxIDogMDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX2Nsb3NlVG9wID8gMSA6IDA7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9jbG9zZUJvdHRvbSA/IDEgOiAwOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5fc2hhZG93Vm9sdW1lID8gMSA6IDA7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9vZmZzZXRBdHRyaWJ1dGUgPz8gLTE7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9hcmNUeXBlOwogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQodmFsdWUuX3RleHR1cmVDb29yZGluYXRlcykpIHsKICAgICAgICAgIHN0YXJ0aW5nSW5kZXggPSBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQucGFja1BvbHlnb25IaWVyYXJjaHkoCiAgICAgICAgICAgIHZhbHVlLl90ZXh0dXJlQ29vcmRpbmF0ZXMsCiAgICAgICAgICAgIGFycmF5LAogICAgICAgICAgICBzdGFydGluZ0luZGV4LAogICAgICAgICAgICBDYXJ0ZXNpYW4yX2RlZmF1bHQKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSAtMTsKICAgICAgICB9CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLnBhY2tlZExlbmd0aDsKICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hFbGxpcHNvaWQ2ID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUoRWxsaXBzb2lkX2RlZmF1bHQuVU5JVF9TUEhFUkUpOwogICAgICBzY3JhdGNoVmVydGV4Rm9ybWF0OSA9IG5ldyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdCgpOwogICAgICBkdW1teU9wdGlvbnMgPSB7CiAgICAgICAgcG9seWdvbkhpZXJhcmNoeToge30KICAgICAgfTsKICAgICAgUG9seWdvbkdlb21ldHJ5LnVucGFjayA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydGluZ0luZGV4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgY29uc3QgcG9seWdvbkhpZXJhcmNoeSA9IFBvbHlnb25HZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC51bnBhY2tQb2x5Z29uSGllcmFyY2h5KAogICAgICAgICAgYXJyYXksCiAgICAgICAgICBzdGFydGluZ0luZGV4LAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0CiAgICAgICAgKTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gcG9seWdvbkhpZXJhcmNoeS5zdGFydGluZ0luZGV4OwogICAgICAgIGRlbGV0ZSBwb2x5Z29uSGllcmFyY2h5LnN0YXJ0aW5nSW5kZXg7CiAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQudW5wYWNrKGFycmF5LCBzdGFydGluZ0luZGV4LCBzY3JhdGNoRWxsaXBzb2lkNik7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgY29uc3QgdmVydGV4Rm9ybWF0ID0gVmVydGV4Rm9ybWF0X2RlZmF1bHQudW5wYWNrKAogICAgICAgICAgYXJyYXksCiAgICAgICAgICBzdGFydGluZ0luZGV4LAogICAgICAgICAgc2NyYXRjaFZlcnRleEZvcm1hdDkKICAgICAgICApOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gVmVydGV4Rm9ybWF0X2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGNvbnN0IGhlaWdodCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgZXh0cnVkZWRIZWlnaHQgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBzdFJvdGF0aW9uID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBwZXJQb3NpdGlvbkhlaWdodEV4dHJ1ZGUgPSBhcnJheVtzdGFydGluZ0luZGV4KytdID09PSAxOwogICAgICAgIGNvbnN0IHBlclBvc2l0aW9uSGVpZ2h0ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9PT0gMTsKICAgICAgICBjb25zdCBjbG9zZVRvcCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPT09IDE7CiAgICAgICAgY29uc3QgY2xvc2VCb3R0b20gPSBhcnJheVtzdGFydGluZ0luZGV4KytdID09PSAxOwogICAgICAgIGNvbnN0IHNoYWRvd1ZvbHVtZSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPT09IDE7CiAgICAgICAgY29uc3Qgb2Zmc2V0QXR0cmlidXRlID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBhcmNUeXBlID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCB0ZXh0dXJlQ29vcmRpbmF0ZXMgPSBhcnJheVtzdGFydGluZ0luZGV4XSA9PT0gLTEgPyB2b2lkIDAgOiBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQudW5wYWNrUG9seWdvbkhpZXJhcmNoeSgKICAgICAgICAgIGFycmF5LAogICAgICAgICAgc3RhcnRpbmdJbmRleCwKICAgICAgICAgIENhcnRlc2lhbjJfZGVmYXVsdAogICAgICAgICk7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdCh0ZXh0dXJlQ29vcmRpbmF0ZXMpKSB7CiAgICAgICAgICBzdGFydGluZ0luZGV4ID0gdGV4dHVyZUNvb3JkaW5hdGVzLnN0YXJ0aW5nSW5kZXg7CiAgICAgICAgICBkZWxldGUgdGV4dHVyZUNvb3JkaW5hdGVzLnN0YXJ0aW5nSW5kZXg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0YXJ0aW5nSW5kZXgrKzsKICAgICAgICB9CiAgICAgICAgY29uc3QgcGFja2VkTGVuZ3RoID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgUG9seWdvbkdlb21ldHJ5KGR1bW15T3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5fcG9seWdvbkhpZXJhcmNoeSA9IHBvbHlnb25IaWVyYXJjaHk7CiAgICAgICAgcmVzdWx0Ll9lbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC5jbG9uZShlbGxpcHNvaWQsIHJlc3VsdC5fZWxsaXBzb2lkKTsKICAgICAgICByZXN1bHQuX3ZlcnRleEZvcm1hdCA9IFZlcnRleEZvcm1hdF9kZWZhdWx0LmNsb25lKHZlcnRleEZvcm1hdCwgcmVzdWx0Ll92ZXJ0ZXhGb3JtYXQpOwogICAgICAgIHJlc3VsdC5faGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgIHJlc3VsdC5fZXh0cnVkZWRIZWlnaHQgPSBleHRydWRlZEhlaWdodDsKICAgICAgICByZXN1bHQuX2dyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHk7CiAgICAgICAgcmVzdWx0Ll9zdFJvdGF0aW9uID0gc3RSb3RhdGlvbjsKICAgICAgICByZXN1bHQuX3BlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZSA9IHBlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZTsKICAgICAgICByZXN1bHQuX3BlclBvc2l0aW9uSGVpZ2h0ID0gcGVyUG9zaXRpb25IZWlnaHQ7CiAgICAgICAgcmVzdWx0Ll9jbG9zZVRvcCA9IGNsb3NlVG9wOwogICAgICAgIHJlc3VsdC5fY2xvc2VCb3R0b20gPSBjbG9zZUJvdHRvbTsKICAgICAgICByZXN1bHQuX3NoYWRvd1ZvbHVtZSA9IHNoYWRvd1ZvbHVtZTsKICAgICAgICByZXN1bHQuX29mZnNldEF0dHJpYnV0ZSA9IG9mZnNldEF0dHJpYnV0ZSA9PT0gLTEgPyB2b2lkIDAgOiBvZmZzZXRBdHRyaWJ1dGU7CiAgICAgICAgcmVzdWx0Ll9hcmNUeXBlID0gYXJjVHlwZTsKICAgICAgICByZXN1bHQuX3RleHR1cmVDb29yZGluYXRlcyA9IHRleHR1cmVDb29yZGluYXRlczsKICAgICAgICByZXN1bHQucGFja2VkTGVuZ3RoID0gcGFja2VkTGVuZ3RoOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4wMiA9IG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaENhcnRlc2lhbjE4ID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoUG9sYXJDbG9zZXN0ID0gbmV3IFN0ZXJlb2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoUG9sYXIgPSBuZXcgU3RlcmVvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hQb2xhclByZXZpb3VzID0gbmV3IFN0ZXJlb2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBwb2x5Z29uID0gewogICAgICAgIG5vcnRoQW5nbGU6IDAsCiAgICAgICAgc291dGhBbmdsZTogMCwKICAgICAgICB3ZXN0T3ZlcklkbDogMCwKICAgICAgICBlYXN0T3ZlcklkbDogMAogICAgICB9OwogICAgICBQb2x5Z29uR2VvbWV0cnkuY29tcHV0ZVJlY3RhbmdsZUZyb21Qb3NpdGlvbnMgPSBmdW5jdGlvbihwb3NpdGlvbnMsIGVsbGlwc29pZCwgYXJjVHlwZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJwb3NpdGlvbnMiLCBwb3NpdGlvbnMpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBSZWN0YW5nbGVfZGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgICBpZiAocG9zaXRpb25zLmxlbmd0aCA8IDMpIHsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC53ZXN0ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgICAgIHJlc3VsdC5lYXN0ID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOwogICAgICAgIHJlc3VsdC5zb3V0aCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgICByZXN1bHQubm9ydGggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7CiAgICAgICAgcG9seWdvbi5ub3J0aEFuZ2xlID0gMDsKICAgICAgICBwb2x5Z29uLnNvdXRoQW5nbGUgPSAwOwogICAgICAgIHBvbHlnb24ud2VzdE92ZXJJZGwgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICAgICAgcG9seWdvbi5lYXN0T3ZlcklkbCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTsKICAgICAgICBjb25zdCBwb3NpdGlvbnNMZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGxldCBsYXN0UG9sYXJQb3NpdGlvbiA9IFN0ZXJlb2dyYXBoaWNfZGVmYXVsdC5mcm9tQ2FydGVzaWFuKAogICAgICAgICAgcG9zaXRpb25zWzBdLAogICAgICAgICAgc2NyYXRjaFBvbGFyUHJldmlvdXMKICAgICAgICApOwogICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcG9zaXRpb25zTGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHBvbGFyUG9zaXRpb24gPSBTdGVyZW9ncmFwaGljX2RlZmF1bHQuZnJvbUNhcnRlc2lhbigKICAgICAgICAgICAgcG9zaXRpb25zW2ldLAogICAgICAgICAgICBzY3JhdGNoUG9sYXIKICAgICAgICAgICk7CiAgICAgICAgICBleHBhbmRSZWN0YW5nbGUoCiAgICAgICAgICAgIHBvbGFyUG9zaXRpb24sCiAgICAgICAgICAgIGxhc3RQb2xhclBvc2l0aW9uLAogICAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICAgIGFyY1R5cGUsCiAgICAgICAgICAgIHBvbHlnb24sCiAgICAgICAgICAgIHJlc3VsdAogICAgICAgICAgKTsKICAgICAgICAgIGxhc3RQb2xhclBvc2l0aW9uID0gU3RlcmVvZ3JhcGhpY19kZWZhdWx0LmNsb25lKHBvbGFyUG9zaXRpb24sIGxhc3RQb2xhclBvc2l0aW9uKTsKICAgICAgICB9CiAgICAgICAgZXhwYW5kUmVjdGFuZ2xlKAogICAgICAgICAgU3RlcmVvZ3JhcGhpY19kZWZhdWx0LmZyb21DYXJ0ZXNpYW4ocG9zaXRpb25zWzBdLCBzY3JhdGNoUG9sYXIpLAogICAgICAgICAgbGFzdFBvbGFyUG9zaXRpb24sCiAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICBhcmNUeXBlLAogICAgICAgICAgcG9seWdvbiwKICAgICAgICAgIHJlc3VsdAogICAgICAgICk7CiAgICAgICAgaWYgKHJlc3VsdC5lYXN0IC0gcmVzdWx0Lndlc3QgPiBwb2x5Z29uLmVhc3RPdmVySWRsIC0gcG9seWdvbi53ZXN0T3ZlcklkbCkgewogICAgICAgICAgcmVzdWx0Lndlc3QgPSBwb2x5Z29uLndlc3RPdmVySWRsOwogICAgICAgICAgcmVzdWx0LmVhc3QgPSBwb2x5Z29uLmVhc3RPdmVySWRsOwogICAgICAgICAgaWYgKHJlc3VsdC5lYXN0ID4gTWF0aF9kZWZhdWx0LlBJKSB7CiAgICAgICAgICAgIHJlc3VsdC5lYXN0ID0gcmVzdWx0LmVhc3QgLSBNYXRoX2RlZmF1bHQuVFdPX1BJOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHJlc3VsdC53ZXN0ID4gTWF0aF9kZWZhdWx0LlBJKSB7CiAgICAgICAgICAgIHJlc3VsdC53ZXN0ID0gcmVzdWx0Lndlc3QgLSBNYXRoX2RlZmF1bHQuVFdPX1BJOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oCiAgICAgICAgICBNYXRoLmFicyhwb2x5Z29uLm5vcnRoQW5nbGUpLAogICAgICAgICAgTWF0aF9kZWZhdWx0LlRXT19QSSwKICAgICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9OMTAKICAgICAgICApKSB7CiAgICAgICAgICByZXN1bHQubm9ydGggPSBNYXRoX2RlZmF1bHQuUElfT1ZFUl9UV087CiAgICAgICAgICByZXN1bHQuZWFzdCA9IE1hdGhfZGVmYXVsdC5QSTsKICAgICAgICAgIHJlc3VsdC53ZXN0ID0gLU1hdGhfZGVmYXVsdC5QSTsKICAgICAgICB9CiAgICAgICAgaWYgKE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgTWF0aC5hYnMocG9seWdvbi5zb3V0aEFuZ2xlKSwKICAgICAgICAgIE1hdGhfZGVmYXVsdC5UV09fUEksCiAgICAgICAgICBNYXRoX2RlZmF1bHQuRVBTSUxPTjEwCiAgICAgICAgKSkgewogICAgICAgICAgcmVzdWx0LnNvdXRoID0gLU1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTzsKICAgICAgICAgIHJlc3VsdC5lYXN0ID0gTWF0aF9kZWZhdWx0LlBJOwogICAgICAgICAgcmVzdWx0Lndlc3QgPSAtTWF0aF9kZWZhdWx0LlBJOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBzY3JhdGNoUG9sYXJGb3JQbGFuZSA9IG5ldyBTdGVyZW9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaENhcnRvZ3JhcGhpY0N5bGxpbmRyaWNhbCA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBQb2x5Z29uR2VvbWV0cnkuY3JlYXRlR2VvbWV0cnkgPSBmdW5jdGlvbihwb2x5Z29uR2VvbWV0cnkpIHsKICAgICAgICBjb25zdCB2ZXJ0ZXhGb3JtYXQgPSBwb2x5Z29uR2VvbWV0cnkuX3ZlcnRleEZvcm1hdDsKICAgICAgICBjb25zdCBlbGxpcHNvaWQgPSBwb2x5Z29uR2VvbWV0cnkuX2VsbGlwc29pZDsKICAgICAgICBjb25zdCBncmFudWxhcml0eSA9IHBvbHlnb25HZW9tZXRyeS5fZ3JhbnVsYXJpdHk7CiAgICAgICAgY29uc3Qgc3RSb3RhdGlvbiA9IHBvbHlnb25HZW9tZXRyeS5fc3RSb3RhdGlvbjsKICAgICAgICBjb25zdCBwb2x5Z29uSGllcmFyY2h5ID0gcG9seWdvbkdlb21ldHJ5Ll9wb2x5Z29uSGllcmFyY2h5OwogICAgICAgIGNvbnN0IHBlclBvc2l0aW9uSGVpZ2h0ID0gcG9seWdvbkdlb21ldHJ5Ll9wZXJQb3NpdGlvbkhlaWdodDsKICAgICAgICBjb25zdCBjbG9zZVRvcCA9IHBvbHlnb25HZW9tZXRyeS5fY2xvc2VUb3A7CiAgICAgICAgY29uc3QgY2xvc2VCb3R0b20gPSBwb2x5Z29uR2VvbWV0cnkuX2Nsb3NlQm90dG9tOwogICAgICAgIGNvbnN0IGFyY1R5cGUgPSBwb2x5Z29uR2VvbWV0cnkuX2FyY1R5cGU7CiAgICAgICAgY29uc3QgdGV4dHVyZUNvb3JkaW5hdGVzID0gcG9seWdvbkdlb21ldHJ5Ll90ZXh0dXJlQ29vcmRpbmF0ZXM7CiAgICAgICAgY29uc3QgaGFzVGV4dHVyZUNvb3JkaW5hdGVzID0gZGVmaW5lZF9kZWZhdWx0KHRleHR1cmVDb29yZGluYXRlcyk7CiAgICAgICAgY29uc3Qgb3V0ZXJQb3NpdGlvbnMgPSBwb2x5Z29uSGllcmFyY2h5LnBvc2l0aW9uczsKICAgICAgICBpZiAob3V0ZXJQb3NpdGlvbnMubGVuZ3RoIDwgMykgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWN0YW5nbGUgPSBwb2x5Z29uR2VvbWV0cnkucmVjdGFuZ2xlOwogICAgICAgIGNvbnN0IHJlc3VsdHMgPSBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQucG9seWdvbnNGcm9tSGllcmFyY2h5KAogICAgICAgICAgcG9seWdvbkhpZXJhcmNoeSwKICAgICAgICAgIGhhc1RleHR1cmVDb29yZGluYXRlcywKICAgICAgICAgIGNyZWF0ZVByb2plY3RUbzJkKHJlY3RhbmdsZSwgb3V0ZXJQb3NpdGlvbnMsIGVsbGlwc29pZCksCiAgICAgICAgICAhcGVyUG9zaXRpb25IZWlnaHQsCiAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICBjcmVhdGVTcGxpdFBvbHlnb25zKHJlY3RhbmdsZSwgZWxsaXBzb2lkLCBhcmNUeXBlLCBwZXJQb3NpdGlvbkhlaWdodCkKICAgICAgICApOwogICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IHJlc3VsdHMuaGllcmFyY2h5OwogICAgICAgIGNvbnN0IHBvbHlnb25zID0gcmVzdWx0cy5wb2x5Z29uczsKICAgICAgICBjb25zdCBkdW1teUZ1bmN0aW9uID0gZnVuY3Rpb24oaWRlbnRpdHkpIHsKICAgICAgICAgIHJldHVybiBpZGVudGl0eTsKICAgICAgICB9OwogICAgICAgIGNvbnN0IHRleHR1cmVDb29yZGluYXRlUG9seWdvbnMgPSBoYXNUZXh0dXJlQ29vcmRpbmF0ZXMgPyBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQucG9seWdvbnNGcm9tSGllcmFyY2h5KAogICAgICAgICAgdGV4dHVyZUNvb3JkaW5hdGVzLAogICAgICAgICAgdHJ1ZSwKICAgICAgICAgIGR1bW15RnVuY3Rpb24sCiAgICAgICAgICBmYWxzZSwKICAgICAgICAgIGVsbGlwc29pZAogICAgICAgICkucG9seWdvbnMgOiB2b2lkIDA7CiAgICAgICAgaWYgKGhpZXJhcmNoeS5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3Qgb3V0ZXJSaW5nID0gaGllcmFyY2h5WzBdLm91dGVyUmluZzsKICAgICAgICBjb25zdCBib3VuZGluZ1JlY3RhbmdsZSA9IGNvbXB1dGVCb3VuZGluZ1JlY3RhbmdsZSgKICAgICAgICAgIG91dGVyUmluZywKICAgICAgICAgIHJlY3RhbmdsZSwKICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgIHN0Um90YXRpb24KICAgICAgICApOwogICAgICAgIGNvbnN0IGdlb21ldHJpZXMgPSBbXTsKICAgICAgICBjb25zdCBoZWlnaHQgPSBwb2x5Z29uR2VvbWV0cnkuX2hlaWdodDsKICAgICAgICBjb25zdCBleHRydWRlZEhlaWdodCA9IHBvbHlnb25HZW9tZXRyeS5fZXh0cnVkZWRIZWlnaHQ7CiAgICAgICAgY29uc3QgZXh0cnVkZSA9IHBvbHlnb25HZW9tZXRyeS5fcGVyUG9zaXRpb25IZWlnaHRFeHRydWRlIHx8ICFNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbihoZWlnaHQsIGV4dHJ1ZGVkSGVpZ2h0LCAwLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjIpOwogICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7CiAgICAgICAgICBwZXJQb3NpdGlvbkhlaWdodCwKICAgICAgICAgIHZlcnRleEZvcm1hdCwKICAgICAgICAgIGdlb21ldHJ5OiB2b2lkIDAsCiAgICAgICAgICByb3RhdGlvbkF4aXM6IGdldFRhbmdlbnRQbGFuZShyZWN0YW5nbGUsIG91dGVyUmluZywgZWxsaXBzb2lkKS5wbGFuZS5ub3JtYWwsCiAgICAgICAgICBwcm9qZWN0VG8yZDogY3JlYXRlUHJvamVjdFBvc2l0aW9uVG8yZChyZWN0YW5nbGUsIG91dGVyUmluZywgZWxsaXBzb2lkKSwKICAgICAgICAgIGJvdW5kaW5nUmVjdGFuZ2xlLAogICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgc3RSb3RhdGlvbiwKICAgICAgICAgIHRleHR1cmVDb29yZGluYXRlczogdm9pZCAwLAogICAgICAgICAgYm90dG9tOiBmYWxzZSwKICAgICAgICAgIHRvcDogdHJ1ZSwKICAgICAgICAgIHdhbGw6IGZhbHNlLAogICAgICAgICAgZXh0cnVkZTogZmFsc2UsCiAgICAgICAgICBhcmNUeXBlCiAgICAgICAgfTsKICAgICAgICBsZXQgaTsKICAgICAgICBpZiAoZXh0cnVkZSkgewogICAgICAgICAgb3B0aW9ucy5leHRydWRlID0gdHJ1ZTsKICAgICAgICAgIG9wdGlvbnMudG9wID0gY2xvc2VUb3A7CiAgICAgICAgICBvcHRpb25zLmJvdHRvbSA9IGNsb3NlQm90dG9tOwogICAgICAgICAgb3B0aW9ucy5zaGFkb3dWb2x1bWUgPSBwb2x5Z29uR2VvbWV0cnkuX3NoYWRvd1ZvbHVtZTsKICAgICAgICAgIG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlID0gcG9seWdvbkdlb21ldHJ5Ll9vZmZzZXRBdHRyaWJ1dGU7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcG9seWdvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY29uc3Qgc3BsaXRHZW9tZXRyeSA9IGNyZWF0ZUdlb21ldHJ5RnJvbVBvc2l0aW9uc0V4dHJ1ZGVkKAogICAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgICBwb2x5Z29uc1tpXSwKICAgICAgICAgICAgICBoYXNUZXh0dXJlQ29vcmRpbmF0ZXMgPyB0ZXh0dXJlQ29vcmRpbmF0ZVBvbHlnb25zW2ldIDogdm9pZCAwLAogICAgICAgICAgICAgIGdyYW51bGFyaXR5LAogICAgICAgICAgICAgIGhpZXJhcmNoeVtpXSwKICAgICAgICAgICAgICBwZXJQb3NpdGlvbkhlaWdodCwKICAgICAgICAgICAgICBjbG9zZVRvcCwKICAgICAgICAgICAgICBjbG9zZUJvdHRvbSwKICAgICAgICAgICAgICB2ZXJ0ZXhGb3JtYXQsCiAgICAgICAgICAgICAgYXJjVHlwZQogICAgICAgICAgICApOwogICAgICAgICAgICBsZXQgdG9wQW5kQm90dG9tOwogICAgICAgICAgICBpZiAoY2xvc2VUb3AgJiYgY2xvc2VCb3R0b20pIHsKICAgICAgICAgICAgICB0b3BBbmRCb3R0b20gPSBzcGxpdEdlb21ldHJ5LnRvcEFuZEJvdHRvbTsKICAgICAgICAgICAgICBvcHRpb25zLmdlb21ldHJ5ID0gUG9seWdvbkdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LnNjYWxlVG9HZW9kZXRpY0hlaWdodEV4dHJ1ZGVkKAogICAgICAgICAgICAgICAgdG9wQW5kQm90dG9tLmdlb21ldHJ5LAogICAgICAgICAgICAgICAgaGVpZ2h0LAogICAgICAgICAgICAgICAgZXh0cnVkZWRIZWlnaHQsCiAgICAgICAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICAgICAgICBwZXJQb3NpdGlvbkhlaWdodAogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xvc2VUb3ApIHsKICAgICAgICAgICAgICB0b3BBbmRCb3R0b20gPSBzcGxpdEdlb21ldHJ5LnRvcEFuZEJvdHRvbTsKICAgICAgICAgICAgICB0b3BBbmRCb3R0b20uZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMgPSBQb2x5Z29uUGlwZWxpbmVfZGVmYXVsdC5zY2FsZVRvR2VvZGV0aWNIZWlnaHQoCiAgICAgICAgICAgICAgICB0b3BBbmRCb3R0b20uZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsCiAgICAgICAgICAgICAgICBoZWlnaHQsCiAgICAgICAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICAgICAgICAhcGVyUG9zaXRpb25IZWlnaHQKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIG9wdGlvbnMuZ2VvbWV0cnkgPSB0b3BBbmRCb3R0b20uZ2VvbWV0cnk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xvc2VCb3R0b20pIHsKICAgICAgICAgICAgICB0b3BBbmRCb3R0b20gPSBzcGxpdEdlb21ldHJ5LnRvcEFuZEJvdHRvbTsKICAgICAgICAgICAgICB0b3BBbmRCb3R0b20uZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMgPSBQb2x5Z29uUGlwZWxpbmVfZGVmYXVsdC5zY2FsZVRvR2VvZGV0aWNIZWlnaHQoCiAgICAgICAgICAgICAgICB0b3BBbmRCb3R0b20uZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsCiAgICAgICAgICAgICAgICBleHRydWRlZEhlaWdodCwKICAgICAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgICAgIHRydWUKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIG9wdGlvbnMuZ2VvbWV0cnkgPSB0b3BBbmRCb3R0b20uZ2VvbWV0cnk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNsb3NlVG9wIHx8IGNsb3NlQm90dG9tKSB7CiAgICAgICAgICAgICAgb3B0aW9ucy53YWxsID0gZmFsc2U7CiAgICAgICAgICAgICAgdG9wQW5kQm90dG9tLmdlb21ldHJ5ID0gY29tcHV0ZUF0dHJpYnV0ZXMob3B0aW9ucyk7CiAgICAgICAgICAgICAgZ2VvbWV0cmllcy5wdXNoKHRvcEFuZEJvdHRvbSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qgd2FsbHMgPSBzcGxpdEdlb21ldHJ5LndhbGxzOwogICAgICAgICAgICBvcHRpb25zLndhbGwgPSB0cnVlOwogICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHdhbGxzLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgY29uc3Qgd2FsbCA9IHdhbGxzW2tdOwogICAgICAgICAgICAgIG9wdGlvbnMuZ2VvbWV0cnkgPSBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuc2NhbGVUb0dlb2RldGljSGVpZ2h0RXh0cnVkZWQoCiAgICAgICAgICAgICAgICB3YWxsLmdlb21ldHJ5LAogICAgICAgICAgICAgICAgaGVpZ2h0LAogICAgICAgICAgICAgICAgZXh0cnVkZWRIZWlnaHQsCiAgICAgICAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICAgICAgICBwZXJQb3NpdGlvbkhlaWdodAogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgd2FsbC5nZW9tZXRyeSA9IGNvbXB1dGVBdHRyaWJ1dGVzKG9wdGlvbnMpOwogICAgICAgICAgICAgIGdlb21ldHJpZXMucHVzaCh3YWxsKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcG9seWdvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgZ2VvbWV0cnlJbnN0YW5jZSA9IG5ldyBHZW9tZXRyeUluc3RhbmNlX2RlZmF1bHQoewogICAgICAgICAgICAgIGdlb21ldHJ5OiBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuY3JlYXRlR2VvbWV0cnlGcm9tUG9zaXRpb25zKAogICAgICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICAgICAgcG9seWdvbnNbaV0sCiAgICAgICAgICAgICAgICBoYXNUZXh0dXJlQ29vcmRpbmF0ZXMgPyB0ZXh0dXJlQ29vcmRpbmF0ZVBvbHlnb25zW2ldIDogdm9pZCAwLAogICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHksCiAgICAgICAgICAgICAgICBwZXJQb3NpdGlvbkhlaWdodCwKICAgICAgICAgICAgICAgIHZlcnRleEZvcm1hdCwKICAgICAgICAgICAgICAgIGFyY1R5cGUKICAgICAgICAgICAgICApCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBnZW9tZXRyeUluc3RhbmNlLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzID0gUG9seWdvblBpcGVsaW5lX2RlZmF1bHQuc2NhbGVUb0dlb2RldGljSGVpZ2h0KAogICAgICAgICAgICAgIGdlb21ldHJ5SW5zdGFuY2UuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsCiAgICAgICAgICAgICAgaGVpZ2h0LAogICAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgICAhcGVyUG9zaXRpb25IZWlnaHQKICAgICAgICAgICAgKTsKICAgICAgICAgICAgb3B0aW9ucy5nZW9tZXRyeSA9IGdlb21ldHJ5SW5zdGFuY2UuZ2VvbWV0cnk7CiAgICAgICAgICAgIGdlb21ldHJ5SW5zdGFuY2UuZ2VvbWV0cnkgPSBjb21wdXRlQXR0cmlidXRlcyhvcHRpb25zKTsKICAgICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChwb2x5Z29uR2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZSkpIHsKICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBnZW9tZXRyeUluc3RhbmNlLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLmxlbmd0aDsKICAgICAgICAgICAgICBjb25zdCBvZmZzZXRWYWx1ZSA9IHBvbHlnb25HZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlID09PSBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZV9kZWZhdWx0Lk5PTkUgPyAwIDogMTsKICAgICAgICAgICAgICBjb25zdCBhcHBseU9mZnNldCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCAvIDMpLmZpbGwob2Zmc2V0VmFsdWUpOwogICAgICAgICAgICAgIGdlb21ldHJ5SW5zdGFuY2UuZ2VvbWV0cnkuYXR0cmlidXRlcy5hcHBseU9mZnNldCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LlVOU0lHTkVEX0JZVEUsCiAgICAgICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAxLAogICAgICAgICAgICAgICAgdmFsdWVzOiBhcHBseU9mZnNldAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdlb21ldHJpZXMucHVzaChnZW9tZXRyeUluc3RhbmNlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBHZW9tZXRyeVBpcGVsaW5lX2RlZmF1bHQuY29tYmluZUluc3RhbmNlcyhnZW9tZXRyaWVzKVswXTsKICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyA9IG5ldyBGbG9hdDY0QXJyYXkoCiAgICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcwogICAgICAgICk7CiAgICAgICAgZ2VvbWV0cnkuaW5kaWNlcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KAogICAgICAgICAgZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoIC8gMywKICAgICAgICAgIGdlb21ldHJ5LmluZGljZXMKICAgICAgICApOwogICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOwogICAgICAgIGNvbnN0IGJvdW5kaW5nU3BoZXJlID0gQm91bmRpbmdTcGhlcmVfZGVmYXVsdC5mcm9tVmVydGljZXMoCiAgICAgICAgICBhdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcwogICAgICAgICk7CiAgICAgICAgaWYgKCF2ZXJ0ZXhGb3JtYXQucG9zaXRpb24pIHsKICAgICAgICAgIGRlbGV0ZSBhdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IEdlb21ldHJ5X2RlZmF1bHQoewogICAgICAgICAgYXR0cmlidXRlcywKICAgICAgICAgIGluZGljZXM6IGdlb21ldHJ5LmluZGljZXMsCiAgICAgICAgICBwcmltaXRpdmVUeXBlOiBnZW9tZXRyeS5wcmltaXRpdmVUeXBlLAogICAgICAgICAgYm91bmRpbmdTcGhlcmUsCiAgICAgICAgICBvZmZzZXRBdHRyaWJ1dGU6IHBvbHlnb25HZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIFBvbHlnb25HZW9tZXRyeS5jcmVhdGVTaGFkb3dWb2x1bWUgPSBmdW5jdGlvbihwb2x5Z29uR2VvbWV0cnksIG1pbkhlaWdodEZ1bmMsIG1heEhlaWdodEZ1bmMpIHsKICAgICAgICBjb25zdCBncmFudWxhcml0eSA9IHBvbHlnb25HZW9tZXRyeS5fZ3JhbnVsYXJpdHk7CiAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gcG9seWdvbkdlb21ldHJ5Ll9lbGxpcHNvaWQ7CiAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gbWluSGVpZ2h0RnVuYyhncmFudWxhcml0eSwgZWxsaXBzb2lkKTsKICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSBtYXhIZWlnaHRGdW5jKGdyYW51bGFyaXR5LCBlbGxpcHNvaWQpOwogICAgICAgIHJldHVybiBuZXcgUG9seWdvbkdlb21ldHJ5KHsKICAgICAgICAgIHBvbHlnb25IaWVyYXJjaHk6IHBvbHlnb25HZW9tZXRyeS5fcG9seWdvbkhpZXJhcmNoeSwKICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgIHN0Um90YXRpb246IHBvbHlnb25HZW9tZXRyeS5fc3RSb3RhdGlvbiwKICAgICAgICAgIGdyYW51bGFyaXR5LAogICAgICAgICAgcGVyUG9zaXRpb25IZWlnaHQ6IGZhbHNlLAogICAgICAgICAgZXh0cnVkZWRIZWlnaHQ6IG1pbkhlaWdodCwKICAgICAgICAgIGhlaWdodDogbWF4SGVpZ2h0LAogICAgICAgICAgdmVydGV4Rm9ybWF0OiBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5QT1NJVElPTl9PTkxZLAogICAgICAgICAgc2hhZG93Vm9sdW1lOiB0cnVlLAogICAgICAgICAgYXJjVHlwZTogcG9seWdvbkdlb21ldHJ5Ll9hcmNUeXBlCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFBvbHlnb25HZW9tZXRyeS5wcm90b3R5cGUsIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIHJlY3RhbmdsZTogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodGhpcy5fcmVjdGFuZ2xlKSkgewogICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHRoaXMuX3BvbHlnb25IaWVyYXJjaHkucG9zaXRpb25zOwogICAgICAgICAgICAgIHRoaXMuX3JlY3RhbmdsZSA9IFBvbHlnb25HZW9tZXRyeS5jb21wdXRlUmVjdGFuZ2xlRnJvbVBvc2l0aW9ucygKICAgICAgICAgICAgICAgIHBvc2l0aW9ucywKICAgICAgICAgICAgICAgIHRoaXMuX2VsbGlwc29pZCwKICAgICAgICAgICAgICAgIHRoaXMuX2FyY1R5cGUKICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWN0YW5nbGU7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBGb3IgcmVtYXBwaW5nIHRleHR1cmUgY29vcmRpbmF0ZXMgd2hlbiByZW5kZXJpbmcgUG9seWdvbkdlb21ldHJpZXMgYXMgR3JvdW5kUHJpbWl0aXZlcy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIHRleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHM6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHRoaXMuX3RleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHMpKSB7CiAgICAgICAgICAgICAgdGhpcy5fdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50cyA9IHRleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHMyKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl90ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIFBvbHlnb25HZW9tZXRyeV9kZWZhdWx0ID0gUG9seWdvbkdlb21ldHJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlUG9seWdvbkdlb21ldHJ5LmpzCiAgdmFyIGNyZWF0ZVBvbHlnb25HZW9tZXRyeV9leHBvcnRzID0ge307CiAgX19leHBvcnQoY3JlYXRlUG9seWdvbkdlb21ldHJ5X2V4cG9ydHMsIHsKICAgIGRlZmF1bHQ6ICgpID0+IGNyZWF0ZVBvbHlnb25HZW9tZXRyeV9kZWZhdWx0CiAgfSk7CiAgZnVuY3Rpb24gY3JlYXRlUG9seWdvbkdlb21ldHJ5KHBvbHlnb25HZW9tZXRyeSwgb2Zmc2V0KSB7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG9mZnNldCkpIHsKICAgICAgcG9seWdvbkdlb21ldHJ5ID0gUG9seWdvbkdlb21ldHJ5X2RlZmF1bHQudW5wYWNrKHBvbHlnb25HZW9tZXRyeSwgb2Zmc2V0KTsKICAgIH0KICAgIHBvbHlnb25HZW9tZXRyeS5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUocG9seWdvbkdlb21ldHJ5Ll9lbGxpcHNvaWQpOwogICAgcmV0dXJuIFBvbHlnb25HZW9tZXRyeV9kZWZhdWx0LmNyZWF0ZUdlb21ldHJ5KHBvbHlnb25HZW9tZXRyeSk7CiAgfQogIHZhciBjcmVhdGVQb2x5Z29uR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9jcmVhdGVQb2x5Z29uR2VvbWV0cnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVBvbHlnb25HZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X1BvbHlnb25HZW9tZXRyeSgpOwogICAgICBjcmVhdGVQb2x5Z29uR2VvbWV0cnlfZGVmYXVsdCA9IGNyZWF0ZVBvbHlnb25HZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1BvbHlnb25PdXRsaW5lR2VvbWV0cnkuanMKICBmdW5jdGlvbiBjcmVhdGVHZW9tZXRyeUZyb21Qb3NpdGlvbnMyKGVsbGlwc29pZCwgcG9zaXRpb25zLCBtaW5EaXN0YW5jZSwgcGVyUG9zaXRpb25IZWlnaHQsIGFyY1R5cGUpIHsKICAgIGNvbnN0IHRhbmdlbnRQbGFuZSA9IEVsbGlwc29pZFRhbmdlbnRQbGFuZV9kZWZhdWx0LmZyb21Qb2ludHMocG9zaXRpb25zLCBlbGxpcHNvaWQpOwogICAgY29uc3QgcG9zaXRpb25zMkQgPSB0YW5nZW50UGxhbmUucHJvamVjdFBvaW50c09udG9QbGFuZSgKICAgICAgcG9zaXRpb25zLAogICAgICBjcmVhdGVHZW9tZXRyeUZyb21Qb3NpdGlvbnNQb3NpdGlvbnMKICAgICk7CiAgICBjb25zdCBvcmlnaW5hbFdpbmRpbmdPcmRlciA9IFBvbHlnb25QaXBlbGluZV9kZWZhdWx0LmNvbXB1dGVXaW5kaW5nT3JkZXIyRChwb3NpdGlvbnMyRCk7CiAgICBpZiAob3JpZ2luYWxXaW5kaW5nT3JkZXIgPT09IFdpbmRpbmdPcmRlcl9kZWZhdWx0LkNMT0NLV0lTRSkgewogICAgICBwb3NpdGlvbnMyRC5yZXZlcnNlKCk7CiAgICAgIHBvc2l0aW9ucyA9IHBvc2l0aW9ucy5zbGljZSgpLnJldmVyc2UoKTsKICAgIH0KICAgIGxldCBzdWJkaXZpZGVkUG9zaXRpb25zOwogICAgbGV0IGk7CiAgICBsZXQgbGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aDsKICAgIGxldCBpbmRleCA9IDA7CiAgICBpZiAoIXBlclBvc2l0aW9uSGVpZ2h0KSB7CiAgICAgIGxldCBudW1WZXJ0aWNlcyA9IDA7CiAgICAgIGlmIChhcmNUeXBlID09PSBBcmNUeXBlX2RlZmF1bHQuR0VPREVTSUMpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIG51bVZlcnRpY2VzICs9IFBvbHlnb25HZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5zdWJkaXZpZGVMaW5lQ291bnQoCiAgICAgICAgICAgIHBvc2l0aW9uc1tpXSwKICAgICAgICAgICAgcG9zaXRpb25zWyhpICsgMSkgJSBsZW5ndGhdLAogICAgICAgICAgICBtaW5EaXN0YW5jZQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYXJjVHlwZSA9PT0gQXJjVHlwZV9kZWZhdWx0LlJIVU1CKSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBudW1WZXJ0aWNlcyArPSBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuc3ViZGl2aWRlUmh1bWJMaW5lQ291bnQoCiAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgcG9zaXRpb25zW2ldLAogICAgICAgICAgICBwb3NpdGlvbnNbKGkgKyAxKSAlIGxlbmd0aF0sCiAgICAgICAgICAgIG1pbkRpc3RhbmNlCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgICBzdWJkaXZpZGVkUG9zaXRpb25zID0gbmV3IEZsb2F0NjRBcnJheShudW1WZXJ0aWNlcyAqIDMpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgdGVtcFBvc2l0aW9uczsKICAgICAgICBpZiAoYXJjVHlwZSA9PT0gQXJjVHlwZV9kZWZhdWx0LkdFT0RFU0lDKSB7CiAgICAgICAgICB0ZW1wUG9zaXRpb25zID0gUG9seWdvbkdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LnN1YmRpdmlkZUxpbmUoCiAgICAgICAgICAgIHBvc2l0aW9uc1tpXSwKICAgICAgICAgICAgcG9zaXRpb25zWyhpICsgMSkgJSBsZW5ndGhdLAogICAgICAgICAgICBtaW5EaXN0YW5jZSwKICAgICAgICAgICAgY3JlYXRlR2VvbWV0cnlGcm9tUG9zaXRpb25zU3ViZGl2aWRlZAogICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgaWYgKGFyY1R5cGUgPT09IEFyY1R5cGVfZGVmYXVsdC5SSFVNQikgewogICAgICAgICAgdGVtcFBvc2l0aW9ucyA9IFBvbHlnb25HZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5zdWJkaXZpZGVSaHVtYkxpbmUoCiAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgcG9zaXRpb25zW2ldLAogICAgICAgICAgICBwb3NpdGlvbnNbKGkgKyAxKSAlIGxlbmd0aF0sCiAgICAgICAgICAgIG1pbkRpc3RhbmNlLAogICAgICAgICAgICBjcmVhdGVHZW9tZXRyeUZyb21Qb3NpdGlvbnNTdWJkaXZpZGVkCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCB0ZW1wUG9zaXRpb25zTGVuZ3RoID0gdGVtcFBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0ZW1wUG9zaXRpb25zTGVuZ3RoOyArK2opIHsKICAgICAgICAgIHN1YmRpdmlkZWRQb3NpdGlvbnNbaW5kZXgrK10gPSB0ZW1wUG9zaXRpb25zW2pdOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgc3ViZGl2aWRlZFBvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkobGVuZ3RoICogMiAqIDMpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICBjb25zdCBwMCA9IHBvc2l0aW9uc1tpXTsKICAgICAgICBjb25zdCBwMSA9IHBvc2l0aW9uc1soaSArIDEpICUgbGVuZ3RoXTsKICAgICAgICBzdWJkaXZpZGVkUG9zaXRpb25zW2luZGV4KytdID0gcDAueDsKICAgICAgICBzdWJkaXZpZGVkUG9zaXRpb25zW2luZGV4KytdID0gcDAueTsKICAgICAgICBzdWJkaXZpZGVkUG9zaXRpb25zW2luZGV4KytdID0gcDAuejsKICAgICAgICBzdWJkaXZpZGVkUG9zaXRpb25zW2luZGV4KytdID0gcDEueDsKICAgICAgICBzdWJkaXZpZGVkUG9zaXRpb25zW2luZGV4KytdID0gcDEueTsKICAgICAgICBzdWJkaXZpZGVkUG9zaXRpb25zW2luZGV4KytdID0gcDEuejsKICAgICAgfQogICAgfQogICAgbGVuZ3RoID0gc3ViZGl2aWRlZFBvc2l0aW9ucy5sZW5ndGggLyAzOwogICAgY29uc3QgaW5kaWNlc1NpemUgPSBsZW5ndGggKiAyOwogICAgY29uc3QgaW5kaWNlcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KGxlbmd0aCwgaW5kaWNlc1NpemUpOwogICAgaW5kZXggPSAwOwogICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aCAtIDE7IGkrKykgewogICAgICBpbmRpY2VzW2luZGV4KytdID0gaTsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGkgKyAxOwogICAgfQogICAgaW5kaWNlc1tpbmRleCsrXSA9IGxlbmd0aCAtIDE7CiAgICBpbmRpY2VzW2luZGV4KytdID0gMDsKICAgIHJldHVybiBuZXcgR2VvbWV0cnlJbnN0YW5jZV9kZWZhdWx0KHsKICAgICAgZ2VvbWV0cnk6IG5ldyBHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgICBhdHRyaWJ1dGVzOiBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVzX2RlZmF1bHQoewogICAgICAgICAgcG9zaXRpb246IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRE9VQkxFLAogICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgICAgICB2YWx1ZXM6IHN1YmRpdmlkZWRQb3NpdGlvbnMKICAgICAgICAgIH0pCiAgICAgICAgfSksCiAgICAgICAgaW5kaWNlcywKICAgICAgICBwcmltaXRpdmVUeXBlOiBQcmltaXRpdmVUeXBlX2RlZmF1bHQuTElORVMKICAgICAgfSkKICAgIH0pOwogIH0KICBmdW5jdGlvbiBjcmVhdGVHZW9tZXRyeUZyb21Qb3NpdGlvbnNFeHRydWRlZDIoZWxsaXBzb2lkLCBwb3NpdGlvbnMsIG1pbkRpc3RhbmNlLCBwZXJQb3NpdGlvbkhlaWdodCwgYXJjVHlwZSkgewogICAgY29uc3QgdGFuZ2VudFBsYW5lID0gRWxsaXBzb2lkVGFuZ2VudFBsYW5lX2RlZmF1bHQuZnJvbVBvaW50cyhwb3NpdGlvbnMsIGVsbGlwc29pZCk7CiAgICBjb25zdCBwb3NpdGlvbnMyRCA9IHRhbmdlbnRQbGFuZS5wcm9qZWN0UG9pbnRzT250b1BsYW5lKAogICAgICBwb3NpdGlvbnMsCiAgICAgIGNyZWF0ZUdlb21ldHJ5RnJvbVBvc2l0aW9uc1Bvc2l0aW9ucwogICAgKTsKICAgIGNvbnN0IG9yaWdpbmFsV2luZGluZ09yZGVyID0gUG9seWdvblBpcGVsaW5lX2RlZmF1bHQuY29tcHV0ZVdpbmRpbmdPcmRlcjJEKHBvc2l0aW9uczJEKTsKICAgIGlmIChvcmlnaW5hbFdpbmRpbmdPcmRlciA9PT0gV2luZGluZ09yZGVyX2RlZmF1bHQuQ0xPQ0tXSVNFKSB7CiAgICAgIHBvc2l0aW9uczJELnJldmVyc2UoKTsKICAgICAgcG9zaXRpb25zID0gcG9zaXRpb25zLnNsaWNlKCkucmV2ZXJzZSgpOwogICAgfQogICAgbGV0IHN1YmRpdmlkZWRQb3NpdGlvbnM7CiAgICBsZXQgaTsKICAgIGxldCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgY29uc3QgY29ybmVycyA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgbGV0IGluZGV4ID0gMDsKICAgIGlmICghcGVyUG9zaXRpb25IZWlnaHQpIHsKICAgICAgbGV0IG51bVZlcnRpY2VzID0gMDsKICAgICAgaWYgKGFyY1R5cGUgPT09IEFyY1R5cGVfZGVmYXVsdC5HRU9ERVNJQykgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgbnVtVmVydGljZXMgKz0gUG9seWdvbkdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LnN1YmRpdmlkZUxpbmVDb3VudCgKICAgICAgICAgICAgcG9zaXRpb25zW2ldLAogICAgICAgICAgICBwb3NpdGlvbnNbKGkgKyAxKSAlIGxlbmd0aF0sCiAgICAgICAgICAgIG1pbkRpc3RhbmNlCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChhcmNUeXBlID09PSBBcmNUeXBlX2RlZmF1bHQuUkhVTUIpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIG51bVZlcnRpY2VzICs9IFBvbHlnb25HZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5zdWJkaXZpZGVSaHVtYkxpbmVDb3VudCgKICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICBwb3NpdGlvbnNbaV0sCiAgICAgICAgICAgIHBvc2l0aW9uc1soaSArIDEpICUgbGVuZ3RoXSwKICAgICAgICAgICAgbWluRGlzdGFuY2UKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN1YmRpdmlkZWRQb3NpdGlvbnMgPSBuZXcgRmxvYXQ2NEFycmF5KG51bVZlcnRpY2VzICogMyAqIDIpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICBjb3JuZXJzW2ldID0gaW5kZXggLyAzOwogICAgICAgIGxldCB0ZW1wUG9zaXRpb25zOwogICAgICAgIGlmIChhcmNUeXBlID09PSBBcmNUeXBlX2RlZmF1bHQuR0VPREVTSUMpIHsKICAgICAgICAgIHRlbXBQb3NpdGlvbnMgPSBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuc3ViZGl2aWRlTGluZSgKICAgICAgICAgICAgcG9zaXRpb25zW2ldLAogICAgICAgICAgICBwb3NpdGlvbnNbKGkgKyAxKSAlIGxlbmd0aF0sCiAgICAgICAgICAgIG1pbkRpc3RhbmNlLAogICAgICAgICAgICBjcmVhdGVHZW9tZXRyeUZyb21Qb3NpdGlvbnNTdWJkaXZpZGVkCiAgICAgICAgICApOwogICAgICAgIH0gZWxzZSBpZiAoYXJjVHlwZSA9PT0gQXJjVHlwZV9kZWZhdWx0LlJIVU1CKSB7CiAgICAgICAgICB0ZW1wUG9zaXRpb25zID0gUG9seWdvbkdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LnN1YmRpdmlkZVJodW1iTGluZSgKICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICBwb3NpdGlvbnNbaV0sCiAgICAgICAgICAgIHBvc2l0aW9uc1soaSArIDEpICUgbGVuZ3RoXSwKICAgICAgICAgICAgbWluRGlzdGFuY2UsCiAgICAgICAgICAgIGNyZWF0ZUdlb21ldHJ5RnJvbVBvc2l0aW9uc1N1YmRpdmlkZWQKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHRlbXBQb3NpdGlvbnNMZW5ndGggPSB0ZW1wUG9zaXRpb25zLmxlbmd0aDsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRlbXBQb3NpdGlvbnNMZW5ndGg7ICsraikgewogICAgICAgICAgc3ViZGl2aWRlZFBvc2l0aW9uc1tpbmRleCsrXSA9IHRlbXBQb3NpdGlvbnNbal07CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzdWJkaXZpZGVkUG9zaXRpb25zID0gbmV3IEZsb2F0NjRBcnJheShsZW5ndGggKiAyICogMyAqIDIpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICBjb3JuZXJzW2ldID0gaW5kZXggLyAzOwogICAgICAgIGNvbnN0IHAwID0gcG9zaXRpb25zW2ldOwogICAgICAgIGNvbnN0IHAxID0gcG9zaXRpb25zWyhpICsgMSkgJSBsZW5ndGhdOwogICAgICAgIHN1YmRpdmlkZWRQb3NpdGlvbnNbaW5kZXgrK10gPSBwMC54OwogICAgICAgIHN1YmRpdmlkZWRQb3NpdGlvbnNbaW5kZXgrK10gPSBwMC55OwogICAgICAgIHN1YmRpdmlkZWRQb3NpdGlvbnNbaW5kZXgrK10gPSBwMC56OwogICAgICAgIHN1YmRpdmlkZWRQb3NpdGlvbnNbaW5kZXgrK10gPSBwMS54OwogICAgICAgIHN1YmRpdmlkZWRQb3NpdGlvbnNbaW5kZXgrK10gPSBwMS55OwogICAgICAgIHN1YmRpdmlkZWRQb3NpdGlvbnNbaW5kZXgrK10gPSBwMS56OwogICAgICB9CiAgICB9CiAgICBsZW5ndGggPSBzdWJkaXZpZGVkUG9zaXRpb25zLmxlbmd0aCAvICgzICogMik7CiAgICBjb25zdCBjb3JuZXJzTGVuZ3RoID0gY29ybmVycy5sZW5ndGg7CiAgICBjb25zdCBpbmRpY2VzU2l6ZSA9IChsZW5ndGggKiAyICsgY29ybmVyc0xlbmd0aCkgKiAyOwogICAgY29uc3QgaW5kaWNlcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KAogICAgICBsZW5ndGggKyBjb3JuZXJzTGVuZ3RoLAogICAgICBpbmRpY2VzU2l6ZQogICAgKTsKICAgIGluZGV4ID0gMDsKICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBpbmRpY2VzW2luZGV4KytdID0gaTsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IChpICsgMSkgJSBsZW5ndGg7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSBpICsgbGVuZ3RoOwogICAgICBpbmRpY2VzW2luZGV4KytdID0gKGkgKyAxKSAlIGxlbmd0aCArIGxlbmd0aDsKICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBjb3JuZXJzTGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgY29ybmVyID0gY29ybmVyc1tpXTsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGNvcm5lcjsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGNvcm5lciArIGxlbmd0aDsKICAgIH0KICAgIHJldHVybiBuZXcgR2VvbWV0cnlJbnN0YW5jZV9kZWZhdWx0KHsKICAgICAgZ2VvbWV0cnk6IG5ldyBHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgICBhdHRyaWJ1dGVzOiBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVzX2RlZmF1bHQoewogICAgICAgICAgcG9zaXRpb246IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRE9VQkxFLAogICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgICAgICB2YWx1ZXM6IHN1YmRpdmlkZWRQb3NpdGlvbnMKICAgICAgICAgIH0pCiAgICAgICAgfSksCiAgICAgICAgaW5kaWNlcywKICAgICAgICBwcmltaXRpdmVUeXBlOiBQcmltaXRpdmVUeXBlX2RlZmF1bHQuTElORVMKICAgICAgfSkKICAgIH0pOwogIH0KICBmdW5jdGlvbiBQb2x5Z29uT3V0bGluZUdlb21ldHJ5KG9wdGlvbnMpIHsKICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgib3B0aW9ucyIsIG9wdGlvbnMpOwogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJvcHRpb25zLnBvbHlnb25IaWVyYXJjaHkiLCBvcHRpb25zLnBvbHlnb25IaWVyYXJjaHkpOwogICAgaWYgKG9wdGlvbnMucGVyUG9zaXRpb25IZWlnaHQgJiYgZGVmaW5lZF9kZWZhdWx0KG9wdGlvbnMuaGVpZ2h0KSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAiQ2Fubm90IHVzZSBib3RoIG9wdGlvbnMucGVyUG9zaXRpb25IZWlnaHQgYW5kIG9wdGlvbnMuaGVpZ2h0IgogICAgICApOwogICAgfQogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvcHRpb25zLmFyY1R5cGUpICYmIG9wdGlvbnMuYXJjVHlwZSAhPT0gQXJjVHlwZV9kZWZhdWx0LkdFT0RFU0lDICYmIG9wdGlvbnMuYXJjVHlwZSAhPT0gQXJjVHlwZV9kZWZhdWx0LlJIVU1CKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICJJbnZhbGlkIGFyY1R5cGUuIFZhbGlkIG9wdGlvbnMgYXJlIEFyY1R5cGUuR0VPREVTSUMgYW5kIEFyY1R5cGUuUkhVTUIuIgogICAgICApOwogICAgfQogICAgY29uc3QgcG9seWdvbkhpZXJhcmNoeSA9IG9wdGlvbnMucG9seWdvbkhpZXJhcmNoeTsKICAgIGNvbnN0IGVsbGlwc29pZCA9IG9wdGlvbnMuZWxsaXBzb2lkID8/IEVsbGlwc29pZF9kZWZhdWx0LmRlZmF1bHQ7CiAgICBjb25zdCBncmFudWxhcml0eSA9IG9wdGlvbnMuZ3JhbnVsYXJpdHkgPz8gTWF0aF9kZWZhdWx0LlJBRElBTlNfUEVSX0RFR1JFRTsKICAgIGNvbnN0IHBlclBvc2l0aW9uSGVpZ2h0ID0gb3B0aW9ucy5wZXJQb3NpdGlvbkhlaWdodCA/PyBmYWxzZTsKICAgIGNvbnN0IHBlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZSA9IHBlclBvc2l0aW9uSGVpZ2h0ICYmIGRlZmluZWRfZGVmYXVsdChvcHRpb25zLmV4dHJ1ZGVkSGVpZ2h0KTsKICAgIGNvbnN0IGFyY1R5cGUgPSBvcHRpb25zLmFyY1R5cGUgPz8gQXJjVHlwZV9kZWZhdWx0LkdFT0RFU0lDOwogICAgbGV0IGhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0ID8/IDA7CiAgICBsZXQgZXh0cnVkZWRIZWlnaHQgPSBvcHRpb25zLmV4dHJ1ZGVkSGVpZ2h0ID8/IGhlaWdodDsKICAgIGlmICghcGVyUG9zaXRpb25IZWlnaHRFeHRydWRlKSB7CiAgICAgIGNvbnN0IGggPSBNYXRoLm1heChoZWlnaHQsIGV4dHJ1ZGVkSGVpZ2h0KTsKICAgICAgZXh0cnVkZWRIZWlnaHQgPSBNYXRoLm1pbihoZWlnaHQsIGV4dHJ1ZGVkSGVpZ2h0KTsKICAgICAgaGVpZ2h0ID0gaDsKICAgIH0KICAgIHRoaXMuX2VsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKGVsbGlwc29pZCk7CiAgICB0aGlzLl9ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwogICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0OwogICAgdGhpcy5fZXh0cnVkZWRIZWlnaHQgPSBleHRydWRlZEhlaWdodDsKICAgIHRoaXMuX2FyY1R5cGUgPSBhcmNUeXBlOwogICAgdGhpcy5fcG9seWdvbkhpZXJhcmNoeSA9IHBvbHlnb25IaWVyYXJjaHk7CiAgICB0aGlzLl9wZXJQb3NpdGlvbkhlaWdodCA9IHBlclBvc2l0aW9uSGVpZ2h0OwogICAgdGhpcy5fcGVyUG9zaXRpb25IZWlnaHRFeHRydWRlID0gcGVyUG9zaXRpb25IZWlnaHRFeHRydWRlOwogICAgdGhpcy5fb2Zmc2V0QXR0cmlidXRlID0gb3B0aW9ucy5vZmZzZXRBdHRyaWJ1dGU7CiAgICB0aGlzLl93b3JrZXJOYW1lID0gImNyZWF0ZVBvbHlnb25PdXRsaW5lR2VvbWV0cnkiOwogICAgdGhpcy5wYWNrZWRMZW5ndGggPSBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuY29tcHV0ZUhpZXJhcmNoeVBhY2tlZExlbmd0aCgKICAgICAgcG9seWdvbkhpZXJhcmNoeSwKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0CiAgICApICsgRWxsaXBzb2lkX2RlZmF1bHQucGFja2VkTGVuZ3RoICsgODsKICB9CiAgdmFyIGNyZWF0ZUdlb21ldHJ5RnJvbVBvc2l0aW9uc1Bvc2l0aW9ucywgY3JlYXRlR2VvbWV0cnlGcm9tUG9zaXRpb25zU3ViZGl2aWRlZCwgc2NyYXRjaEVsbGlwc29pZDcsIGR1bW15T3B0aW9uczIsIFBvbHlnb25PdXRsaW5lR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9Qb2x5Z29uT3V0bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Qb2x5Z29uT3V0bGluZUdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9BcmNUeXBlKCk7CiAgICAgIGluaXRfQm91bmRpbmdTcGhlcmUoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9Db21wb25lbnREYXRhdHlwZSgpOwogICAgICBpbml0X0Zyb3plbigpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X0VsbGlwc29pZFRhbmdlbnRQbGFuZSgpOwogICAgICBpbml0X0dlb21ldHJ5KCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGUoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZXMoKTsKICAgICAgaW5pdF9HZW9tZXRyeUluc3RhbmNlKCk7CiAgICAgIGluaXRfR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGUoKTsKICAgICAgaW5pdF9HZW9tZXRyeVBpcGVsaW5lKCk7CiAgICAgIGluaXRfSW5kZXhEYXRhdHlwZSgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9Qb2x5Z29uR2VvbWV0cnlMaWJyYXJ5KCk7CiAgICAgIGluaXRfUG9seWdvblBpcGVsaW5lKCk7CiAgICAgIGluaXRfUHJpbWl0aXZlVHlwZSgpOwogICAgICBpbml0X1dpbmRpbmdPcmRlcigpOwogICAgICBjcmVhdGVHZW9tZXRyeUZyb21Qb3NpdGlvbnNQb3NpdGlvbnMgPSBbXTsKICAgICAgY3JlYXRlR2VvbWV0cnlGcm9tUG9zaXRpb25zU3ViZGl2aWRlZCA9IFtdOwogICAgICBQb2x5Z29uT3V0bGluZUdlb21ldHJ5LnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBzdGFydGluZ0luZGV4ID0gUG9seWdvbkdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LnBhY2tQb2x5Z29uSGllcmFyY2h5KAogICAgICAgICAgdmFsdWUuX3BvbHlnb25IaWVyYXJjaHksCiAgICAgICAgICBhcnJheSwKICAgICAgICAgIHN0YXJ0aW5nSW5kZXgsCiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQKICAgICAgICApOwogICAgICAgIEVsbGlwc29pZF9kZWZhdWx0LnBhY2sodmFsdWUuX2VsbGlwc29pZCwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gRWxsaXBzb2lkX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5faGVpZ2h0OwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5fZXh0cnVkZWRIZWlnaHQ7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9ncmFudWxhcml0eTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX3BlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZSA/IDEgOiAwOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5fcGVyUG9zaXRpb25IZWlnaHQgPyAxIDogMDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX2FyY1R5cGU7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9vZmZzZXRBdHRyaWJ1dGUgPz8gLTE7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleF0gPSB2YWx1ZS5wYWNrZWRMZW5ndGg7CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9OwogICAgICBzY3JhdGNoRWxsaXBzb2lkNyA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKEVsbGlwc29pZF9kZWZhdWx0LlVOSVRfU1BIRVJFKTsKICAgICAgZHVtbXlPcHRpb25zMiA9IHsKICAgICAgICBwb2x5Z29uSGllcmFyY2h5OiB7fQogICAgICB9OwogICAgICBQb2x5Z29uT3V0bGluZUdlb21ldHJ5LnVucGFjayA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydGluZ0luZGV4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgY29uc3QgcG9seWdvbkhpZXJhcmNoeSA9IFBvbHlnb25HZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC51bnBhY2tQb2x5Z29uSGllcmFyY2h5KAogICAgICAgICAgYXJyYXksCiAgICAgICAgICBzdGFydGluZ0luZGV4LAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0CiAgICAgICAgKTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gcG9seWdvbkhpZXJhcmNoeS5zdGFydGluZ0luZGV4OwogICAgICAgIGRlbGV0ZSBwb2x5Z29uSGllcmFyY2h5LnN0YXJ0aW5nSW5kZXg7CiAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQudW5wYWNrKGFycmF5LCBzdGFydGluZ0luZGV4LCBzY3JhdGNoRWxsaXBzb2lkNyk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgY29uc3QgaGVpZ2h0ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBleHRydWRlZEhlaWdodCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgZ3JhbnVsYXJpdHkgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IHBlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPT09IDE7CiAgICAgICAgY29uc3QgcGVyUG9zaXRpb25IZWlnaHQgPSBhcnJheVtzdGFydGluZ0luZGV4KytdID09PSAxOwogICAgICAgIGNvbnN0IGFyY1R5cGUgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IG9mZnNldEF0dHJpYnV0ZSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgcGFja2VkTGVuZ3RoID0gYXJyYXlbc3RhcnRpbmdJbmRleF07CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IFBvbHlnb25PdXRsaW5lR2VvbWV0cnkoZHVtbXlPcHRpb25zMik7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5fcG9seWdvbkhpZXJhcmNoeSA9IHBvbHlnb25IaWVyYXJjaHk7CiAgICAgICAgcmVzdWx0Ll9lbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC5jbG9uZShlbGxpcHNvaWQsIHJlc3VsdC5fZWxsaXBzb2lkKTsKICAgICAgICByZXN1bHQuX2hlaWdodCA9IGhlaWdodDsKICAgICAgICByZXN1bHQuX2V4dHJ1ZGVkSGVpZ2h0ID0gZXh0cnVkZWRIZWlnaHQ7CiAgICAgICAgcmVzdWx0Ll9ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwogICAgICAgIHJlc3VsdC5fcGVyUG9zaXRpb25IZWlnaHQgPSBwZXJQb3NpdGlvbkhlaWdodDsKICAgICAgICByZXN1bHQuX3BlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZSA9IHBlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZTsKICAgICAgICByZXN1bHQuX2FyY1R5cGUgPSBhcmNUeXBlOwogICAgICAgIHJlc3VsdC5fb2Zmc2V0QXR0cmlidXRlID0gb2Zmc2V0QXR0cmlidXRlID09PSAtMSA/IHZvaWQgMCA6IG9mZnNldEF0dHJpYnV0ZTsKICAgICAgICByZXN1bHQucGFja2VkTGVuZ3RoID0gcGFja2VkTGVuZ3RoOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFBvbHlnb25PdXRsaW5lR2VvbWV0cnkuZnJvbVBvc2l0aW9ucyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJvcHRpb25zLnBvc2l0aW9ucyIsIG9wdGlvbnMucG9zaXRpb25zKTsKICAgICAgICBjb25zdCBuZXdPcHRpb25zID0gewogICAgICAgICAgcG9seWdvbkhpZXJhcmNoeTogewogICAgICAgICAgICBwb3NpdGlvbnM6IG9wdGlvbnMucG9zaXRpb25zCiAgICAgICAgICB9LAogICAgICAgICAgaGVpZ2h0OiBvcHRpb25zLmhlaWdodCwKICAgICAgICAgIGV4dHJ1ZGVkSGVpZ2h0OiBvcHRpb25zLmV4dHJ1ZGVkSGVpZ2h0LAogICAgICAgICAgZWxsaXBzb2lkOiBvcHRpb25zLmVsbGlwc29pZCwKICAgICAgICAgIGdyYW51bGFyaXR5OiBvcHRpb25zLmdyYW51bGFyaXR5LAogICAgICAgICAgcGVyUG9zaXRpb25IZWlnaHQ6IG9wdGlvbnMucGVyUG9zaXRpb25IZWlnaHQsCiAgICAgICAgICBhcmNUeXBlOiBvcHRpb25zLmFyY1R5cGUsCiAgICAgICAgICBvZmZzZXRBdHRyaWJ1dGU6IG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gbmV3IFBvbHlnb25PdXRsaW5lR2VvbWV0cnkobmV3T3B0aW9ucyk7CiAgICAgIH07CiAgICAgIFBvbHlnb25PdXRsaW5lR2VvbWV0cnkuY3JlYXRlR2VvbWV0cnkgPSBmdW5jdGlvbihwb2x5Z29uR2VvbWV0cnkpIHsKICAgICAgICBjb25zdCBlbGxpcHNvaWQgPSBwb2x5Z29uR2VvbWV0cnkuX2VsbGlwc29pZDsKICAgICAgICBjb25zdCBncmFudWxhcml0eSA9IHBvbHlnb25HZW9tZXRyeS5fZ3JhbnVsYXJpdHk7CiAgICAgICAgY29uc3QgcG9seWdvbkhpZXJhcmNoeSA9IHBvbHlnb25HZW9tZXRyeS5fcG9seWdvbkhpZXJhcmNoeTsKICAgICAgICBjb25zdCBwZXJQb3NpdGlvbkhlaWdodCA9IHBvbHlnb25HZW9tZXRyeS5fcGVyUG9zaXRpb25IZWlnaHQ7CiAgICAgICAgY29uc3QgYXJjVHlwZSA9IHBvbHlnb25HZW9tZXRyeS5fYXJjVHlwZTsKICAgICAgICBjb25zdCBwb2x5Z29ucyA9IFBvbHlnb25HZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5wb2x5Z29uT3V0bGluZXNGcm9tSGllcmFyY2h5KAogICAgICAgICAgcG9seWdvbkhpZXJhcmNoeSwKICAgICAgICAgICFwZXJQb3NpdGlvbkhlaWdodCwKICAgICAgICAgIGVsbGlwc29pZAogICAgICAgICk7CiAgICAgICAgaWYgKHBvbHlnb25zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgbGV0IGdlb21ldHJ5SW5zdGFuY2U7CiAgICAgICAgY29uc3QgZ2VvbWV0cmllcyA9IFtdOwogICAgICAgIGNvbnN0IG1pbkRpc3RhbmNlID0gTWF0aF9kZWZhdWx0LmNob3JkTGVuZ3RoKAogICAgICAgICAgZ3JhbnVsYXJpdHksCiAgICAgICAgICBlbGxpcHNvaWQubWF4aW11bVJhZGl1cwogICAgICAgICk7CiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcG9seWdvbkdlb21ldHJ5Ll9oZWlnaHQ7CiAgICAgICAgY29uc3QgZXh0cnVkZWRIZWlnaHQgPSBwb2x5Z29uR2VvbWV0cnkuX2V4dHJ1ZGVkSGVpZ2h0OwogICAgICAgIGNvbnN0IGV4dHJ1ZGUgPSBwb2x5Z29uR2VvbWV0cnkuX3BlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZSB8fCAhTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oaGVpZ2h0LCBleHRydWRlZEhlaWdodCwgMCwgTWF0aF9kZWZhdWx0LkVQU0lMT04yKTsKICAgICAgICBsZXQgb2Zmc2V0VmFsdWU7CiAgICAgICAgbGV0IGk7CiAgICAgICAgaWYgKGV4dHJ1ZGUpIHsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwb2x5Z29ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBnZW9tZXRyeUluc3RhbmNlID0gY3JlYXRlR2VvbWV0cnlGcm9tUG9zaXRpb25zRXh0cnVkZWQyKAogICAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgICBwb2x5Z29uc1tpXSwKICAgICAgICAgICAgICBtaW5EaXN0YW5jZSwKICAgICAgICAgICAgICBwZXJQb3NpdGlvbkhlaWdodCwKICAgICAgICAgICAgICBhcmNUeXBlCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGdlb21ldHJ5SW5zdGFuY2UuZ2VvbWV0cnkgPSBQb2x5Z29uR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuc2NhbGVUb0dlb2RldGljSGVpZ2h0RXh0cnVkZWQoCiAgICAgICAgICAgICAgZ2VvbWV0cnlJbnN0YW5jZS5nZW9tZXRyeSwKICAgICAgICAgICAgICBoZWlnaHQsCiAgICAgICAgICAgICAgZXh0cnVkZWRIZWlnaHQsCiAgICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICAgIHBlclBvc2l0aW9uSGVpZ2h0CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQocG9seWdvbkdlb21ldHJ5Ll9vZmZzZXRBdHRyaWJ1dGUpKSB7CiAgICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IGdlb21ldHJ5SW5zdGFuY2UuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoIC8gMzsKICAgICAgICAgICAgICBsZXQgb2Zmc2V0QXR0cmlidXRlID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7CiAgICAgICAgICAgICAgaWYgKHBvbHlnb25HZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlID09PSBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZV9kZWZhdWx0LlRPUCkgewogICAgICAgICAgICAgICAgb2Zmc2V0QXR0cmlidXRlID0gb2Zmc2V0QXR0cmlidXRlLmZpbGwoMSwgMCwgc2l6ZSAvIDIpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBvZmZzZXRWYWx1ZSA9IHBvbHlnb25HZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlID09PSBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZV9kZWZhdWx0Lk5PTkUgPyAwIDogMTsKICAgICAgICAgICAgICAgIG9mZnNldEF0dHJpYnV0ZSA9IG9mZnNldEF0dHJpYnV0ZS5maWxsKG9mZnNldFZhbHVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZ2VvbWV0cnlJbnN0YW5jZS5nZW9tZXRyeS5hdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuVU5TSUdORURfQllURSwKICAgICAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDEsCiAgICAgICAgICAgICAgICB2YWx1ZXM6IG9mZnNldEF0dHJpYnV0ZQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdlb21ldHJpZXMucHVzaChnZW9tZXRyeUluc3RhbmNlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBvbHlnb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGdlb21ldHJ5SW5zdGFuY2UgPSBjcmVhdGVHZW9tZXRyeUZyb21Qb3NpdGlvbnMyKAogICAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgICBwb2x5Z29uc1tpXSwKICAgICAgICAgICAgICBtaW5EaXN0YW5jZSwKICAgICAgICAgICAgICBwZXJQb3NpdGlvbkhlaWdodCwKICAgICAgICAgICAgICBhcmNUeXBlCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGdlb21ldHJ5SW5zdGFuY2UuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMgPSBQb2x5Z29uUGlwZWxpbmVfZGVmYXVsdC5zY2FsZVRvR2VvZGV0aWNIZWlnaHQoCiAgICAgICAgICAgICAgZ2VvbWV0cnlJbnN0YW5jZS5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcywKICAgICAgICAgICAgICBoZWlnaHQsCiAgICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICAgICFwZXJQb3NpdGlvbkhlaWdodAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHBvbHlnb25HZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlKSkgewogICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IGdlb21ldHJ5SW5zdGFuY2UuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoOwogICAgICAgICAgICAgIG9mZnNldFZhbHVlID0gcG9seWdvbkdlb21ldHJ5Ll9vZmZzZXRBdHRyaWJ1dGUgPT09IEdlb21ldHJ5T2Zmc2V0QXR0cmlidXRlX2RlZmF1bHQuTk9ORSA/IDAgOiAxOwogICAgICAgICAgICAgIGNvbnN0IGFwcGx5T2Zmc2V0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoIC8gMykuZmlsbChvZmZzZXRWYWx1ZSk7CiAgICAgICAgICAgICAgZ2VvbWV0cnlJbnN0YW5jZS5nZW9tZXRyeS5hdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuVU5TSUdORURfQllURSwKICAgICAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDEsCiAgICAgICAgICAgICAgICB2YWx1ZXM6IGFwcGx5T2Zmc2V0CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2VvbWV0cmllcy5wdXNoKGdlb21ldHJ5SW5zdGFuY2UpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBnZW9tZXRyeSA9IEdlb21ldHJ5UGlwZWxpbmVfZGVmYXVsdC5jb21iaW5lSW5zdGFuY2VzKGdlb21ldHJpZXMpWzBdOwogICAgICAgIGNvbnN0IGJvdW5kaW5nU3BoZXJlID0gQm91bmRpbmdTcGhlcmVfZGVmYXVsdC5mcm9tVmVydGljZXMoCiAgICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcwogICAgICAgICk7CiAgICAgICAgcmV0dXJuIG5ldyBHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgICAgIGF0dHJpYnV0ZXM6IGdlb21ldHJ5LmF0dHJpYnV0ZXMsCiAgICAgICAgICBpbmRpY2VzOiBnZW9tZXRyeS5pbmRpY2VzLAogICAgICAgICAgcHJpbWl0aXZlVHlwZTogZ2VvbWV0cnkucHJpbWl0aXZlVHlwZSwKICAgICAgICAgIGJvdW5kaW5nU3BoZXJlLAogICAgICAgICAgb2Zmc2V0QXR0cmlidXRlOiBwb2x5Z29uR2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZQogICAgICAgIH0pOwogICAgICB9OwogICAgICBQb2x5Z29uT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQgPSBQb2x5Z29uT3V0bGluZUdlb21ldHJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlUG9seWdvbk91dGxpbmVHZW9tZXRyeS5qcwogIHZhciBjcmVhdGVQb2x5Z29uT3V0bGluZUdlb21ldHJ5X2V4cG9ydHMgPSB7fTsKICBfX2V4cG9ydChjcmVhdGVQb2x5Z29uT3V0bGluZUdlb21ldHJ5X2V4cG9ydHMsIHsKICAgIGRlZmF1bHQ6ICgpID0+IGNyZWF0ZVBvbHlnb25PdXRsaW5lR2VvbWV0cnlfZGVmYXVsdAogIH0pOwogIGZ1bmN0aW9uIGNyZWF0ZVBvbHlnb25PdXRsaW5lR2VvbWV0cnkocG9seWdvbkdlb21ldHJ5LCBvZmZzZXQpIHsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQob2Zmc2V0KSkgewogICAgICBwb2x5Z29uR2VvbWV0cnkgPSBQb2x5Z29uT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQudW5wYWNrKHBvbHlnb25HZW9tZXRyeSwgb2Zmc2V0KTsKICAgIH0KICAgIHBvbHlnb25HZW9tZXRyeS5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUocG9seWdvbkdlb21ldHJ5Ll9lbGxpcHNvaWQpOwogICAgcmV0dXJuIFBvbHlnb25PdXRsaW5lR2VvbWV0cnlfZGVmYXVsdC5jcmVhdGVHZW9tZXRyeShwb2x5Z29uR2VvbWV0cnkpOwogIH0KICB2YXIgY3JlYXRlUG9seWdvbk91dGxpbmVHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X2NyZWF0ZVBvbHlnb25PdXRsaW5lR2VvbWV0cnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVBvbHlnb25PdXRsaW5lR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9Qb2x5Z29uT3V0bGluZUdlb21ldHJ5KCk7CiAgICAgIGNyZWF0ZVBvbHlnb25PdXRsaW5lR2VvbWV0cnlfZGVmYXVsdCA9IGNyZWF0ZVBvbHlnb25PdXRsaW5lR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Db2xvci5qcwogIGZ1bmN0aW9uIGh1ZTJyZ2IobTEsIG0yLCBoKSB7CiAgICBpZiAoaCA8IDApIHsKICAgICAgaCArPSAxOwogICAgfQogICAgaWYgKGggPiAxKSB7CiAgICAgIGggLT0gMTsKICAgIH0KICAgIGlmIChoICogNiA8IDEpIHsKICAgICAgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogNiAqIGg7CiAgICB9CiAgICBpZiAoaCAqIDIgPCAxKSB7CiAgICAgIHJldHVybiBtMjsKICAgIH0KICAgIGlmIChoICogMyA8IDIpIHsKICAgICAgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogKDIgLyAzIC0gaCkgKiA2OwogICAgfQogICAgcmV0dXJuIG0xOwogIH0KICBmdW5jdGlvbiBDb2xvcihyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSkgewogICAgdGhpcy5yZWQgPSByZWQgPz8gMTsKICAgIHRoaXMuZ3JlZW4gPSBncmVlbiA/PyAxOwogICAgdGhpcy5ibHVlID0gYmx1ZSA/PyAxOwogICAgdGhpcy5hbHBoYSA9IGFscGhhID8/IDE7CiAgfQogIHZhciBzY3JhdGNoQXJyYXlCdWZmZXIsIHNjcmF0Y2hVaW50MzJBcnJheSwgc2NyYXRjaFVpbnQ4QXJyYXksIHJnYmFNYXRjaGVyLCBycmdnYmJhYU1hdGNoZXIsIHJnYlBhcmVudGhlc2VzTWF0Y2hlciwgaHNsUGFyZW50aGVzZXNNYXRjaGVyLCBDb2xvcl9kZWZhdWx0OwogIHZhciBpbml0X0NvbG9yID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Db2xvci5qcyIoKSB7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRmVhdHVyZURldGVjdGlvbigpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgQ29sb3IuZnJvbUNhcnRlc2lhbjQgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihjYXJ0ZXNpYW4xMS54LCBjYXJ0ZXNpYW4xMS55LCBjYXJ0ZXNpYW4xMS56LCBjYXJ0ZXNpYW4xMS53KTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnJlZCA9IGNhcnRlc2lhbjExLng7CiAgICAgICAgcmVzdWx0LmdyZWVuID0gY2FydGVzaWFuMTEueTsKICAgICAgICByZXN1bHQuYmx1ZSA9IGNhcnRlc2lhbjExLno7CiAgICAgICAgcmVzdWx0LmFscGhhID0gY2FydGVzaWFuMTEudzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDb2xvci5mcm9tQnl0ZXMgPSBmdW5jdGlvbihyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSwgcmVzdWx0KSB7CiAgICAgICAgcmVkID0gQ29sb3IuYnl0ZVRvRmxvYXQocmVkID8/IDI1NSk7CiAgICAgICAgZ3JlZW4gPSBDb2xvci5ieXRlVG9GbG9hdChncmVlbiA/PyAyNTUpOwogICAgICAgIGJsdWUgPSBDb2xvci5ieXRlVG9GbG9hdChibHVlID8/IDI1NSk7CiAgICAgICAgYWxwaGEgPSBDb2xvci5ieXRlVG9GbG9hdChhbHBoYSA/PyAyNTUpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgQ29sb3IocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwogICAgICAgIH0KICAgICAgICByZXN1bHQucmVkID0gcmVkOwogICAgICAgIHJlc3VsdC5ncmVlbiA9IGdyZWVuOwogICAgICAgIHJlc3VsdC5ibHVlID0gYmx1ZTsKICAgICAgICByZXN1bHQuYWxwaGEgPSBhbHBoYTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDb2xvci5mcm9tQWxwaGEgPSBmdW5jdGlvbihjb2xvciwgYWxwaGEsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY29sb3IiLCBjb2xvcik7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJhbHBoYSIsIGFscGhhKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENvbG9yKGNvbG9yLnJlZCwgY29sb3IuZ3JlZW4sIGNvbG9yLmJsdWUsIGFscGhhKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnJlZCA9IGNvbG9yLnJlZDsKICAgICAgICByZXN1bHQuZ3JlZW4gPSBjb2xvci5ncmVlbjsKICAgICAgICByZXN1bHQuYmx1ZSA9IGNvbG9yLmJsdWU7CiAgICAgICAgcmVzdWx0LmFscGhhID0gYWxwaGE7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgaWYgKEZlYXR1cmVEZXRlY3Rpb25fZGVmYXVsdC5zdXBwb3J0c1R5cGVkQXJyYXlzKCkpIHsKICAgICAgICBzY3JhdGNoQXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoNCk7CiAgICAgICAgc2NyYXRjaFVpbnQzMkFycmF5ID0gbmV3IFVpbnQzMkFycmF5KHNjcmF0Y2hBcnJheUJ1ZmZlcik7CiAgICAgICAgc2NyYXRjaFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShzY3JhdGNoQXJyYXlCdWZmZXIpOwogICAgICB9CiAgICAgIENvbG9yLmZyb21SZ2JhID0gZnVuY3Rpb24ocmdiYSwgcmVzdWx0KSB7CiAgICAgICAgc2NyYXRjaFVpbnQzMkFycmF5WzBdID0gcmdiYTsKICAgICAgICByZXR1cm4gQ29sb3IuZnJvbUJ5dGVzKAogICAgICAgICAgc2NyYXRjaFVpbnQ4QXJyYXlbMF0sCiAgICAgICAgICBzY3JhdGNoVWludDhBcnJheVsxXSwKICAgICAgICAgIHNjcmF0Y2hVaW50OEFycmF5WzJdLAogICAgICAgICAgc2NyYXRjaFVpbnQ4QXJyYXlbM10sCiAgICAgICAgICByZXN1bHQKICAgICAgICApOwogICAgICB9OwogICAgICBDb2xvci5mcm9tSHNsID0gZnVuY3Rpb24oaHVlLCBzYXR1cmF0aW9uLCBsaWdodG5lc3MsIGFscGhhLCByZXN1bHQpIHsKICAgICAgICBodWUgPSAoaHVlID8/IDApICUgMTsKICAgICAgICBzYXR1cmF0aW9uID0gc2F0dXJhdGlvbiA/PyAwOwogICAgICAgIGxpZ2h0bmVzcyA9IGxpZ2h0bmVzcyA/PyAwOwogICAgICAgIGFscGhhID0gYWxwaGEgPz8gMTsKICAgICAgICBsZXQgcmVkID0gbGlnaHRuZXNzOwogICAgICAgIGxldCBncmVlbiA9IGxpZ2h0bmVzczsKICAgICAgICBsZXQgYmx1ZSA9IGxpZ2h0bmVzczsKICAgICAgICBpZiAoc2F0dXJhdGlvbiAhPT0gMCkgewogICAgICAgICAgbGV0IG0yOwogICAgICAgICAgaWYgKGxpZ2h0bmVzcyA8IDAuNSkgewogICAgICAgICAgICBtMiA9IGxpZ2h0bmVzcyAqICgxICsgc2F0dXJhdGlvbik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtMiA9IGxpZ2h0bmVzcyArIHNhdHVyYXRpb24gLSBsaWdodG5lc3MgKiBzYXR1cmF0aW9uOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgbTEgPSAyICogbGlnaHRuZXNzIC0gbTI7CiAgICAgICAgICByZWQgPSBodWUycmdiKG0xLCBtMiwgaHVlICsgMSAvIDMpOwogICAgICAgICAgZ3JlZW4gPSBodWUycmdiKG0xLCBtMiwgaHVlKTsKICAgICAgICAgIGJsdWUgPSBodWUycmdiKG0xLCBtMiwgaHVlIC0gMSAvIDMpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENvbG9yKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnJlZCA9IHJlZDsKICAgICAgICByZXN1bHQuZ3JlZW4gPSBncmVlbjsKICAgICAgICByZXN1bHQuYmx1ZSA9IGJsdWU7CiAgICAgICAgcmVzdWx0LmFscGhhID0gYWxwaGE7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ29sb3IuZnJvbVJhbmRvbSA9IGZ1bmN0aW9uKG9wdGlvbnMsIHJlc3VsdCkgewogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgICAgICBsZXQgcmVkID0gb3B0aW9ucy5yZWQ7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVkKSkgewogICAgICAgICAgY29uc3QgbWluaW11bVJlZCA9IG9wdGlvbnMubWluaW11bVJlZCA/PyAwOwogICAgICAgICAgY29uc3QgbWF4aW11bVJlZCA9IG9wdGlvbnMubWF4aW11bVJlZCA/PyAxOwogICAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIm1pbmltdW1SZWQiLCBtaW5pbXVtUmVkLCBtYXhpbXVtUmVkKTsKICAgICAgICAgIHJlZCA9IG1pbmltdW1SZWQgKyBNYXRoX2RlZmF1bHQubmV4dFJhbmRvbU51bWJlcigpICogKG1heGltdW1SZWQgLSBtaW5pbXVtUmVkKTsKICAgICAgICB9CiAgICAgICAgbGV0IGdyZWVuID0gb3B0aW9ucy5ncmVlbjsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChncmVlbikpIHsKICAgICAgICAgIGNvbnN0IG1pbmltdW1HcmVlbiA9IG9wdGlvbnMubWluaW11bUdyZWVuID8/IDA7CiAgICAgICAgICBjb25zdCBtYXhpbXVtR3JlZW4gPSBvcHRpb25zLm1heGltdW1HcmVlbiA/PyAxOwogICAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoCiAgICAgICAgICAgICJtaW5pbXVtR3JlZW4iLAogICAgICAgICAgICBtaW5pbXVtR3JlZW4sCiAgICAgICAgICAgIG1heGltdW1HcmVlbgogICAgICAgICAgKTsKICAgICAgICAgIGdyZWVuID0gbWluaW11bUdyZWVuICsgTWF0aF9kZWZhdWx0Lm5leHRSYW5kb21OdW1iZXIoKSAqIChtYXhpbXVtR3JlZW4gLSBtaW5pbXVtR3JlZW4pOwogICAgICAgIH0KICAgICAgICBsZXQgYmx1ZSA9IG9wdGlvbnMuYmx1ZTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChibHVlKSkgewogICAgICAgICAgY29uc3QgbWluaW11bUJsdWUgPSBvcHRpb25zLm1pbmltdW1CbHVlID8/IDA7CiAgICAgICAgICBjb25zdCBtYXhpbXVtQmx1ZSA9IG9wdGlvbnMubWF4aW11bUJsdWUgPz8gMTsKICAgICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKAogICAgICAgICAgICAibWluaW11bUJsdWUiLAogICAgICAgICAgICBtaW5pbXVtQmx1ZSwKICAgICAgICAgICAgbWF4aW11bUJsdWUKICAgICAgICAgICk7CiAgICAgICAgICBibHVlID0gbWluaW11bUJsdWUgKyBNYXRoX2RlZmF1bHQubmV4dFJhbmRvbU51bWJlcigpICogKG1heGltdW1CbHVlIC0gbWluaW11bUJsdWUpOwogICAgICAgIH0KICAgICAgICBsZXQgYWxwaGEgPSBvcHRpb25zLmFscGhhOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFscGhhKSkgewogICAgICAgICAgY29uc3QgbWluaW11bUFscGhhID0gb3B0aW9ucy5taW5pbXVtQWxwaGEgPz8gMDsKICAgICAgICAgIGNvbnN0IG1heGltdW1BbHBoYSA9IG9wdGlvbnMubWF4aW11bUFscGhhID8/IDE7CiAgICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygKICAgICAgICAgICAgIm1pbmltdW1BbHBoYSIsCiAgICAgICAgICAgIG1pbmltdW1BbHBoYSwKICAgICAgICAgICAgbWF4aW11bUFscGhhCiAgICAgICAgICApOwogICAgICAgICAgYWxwaGEgPSBtaW5pbXVtQWxwaGEgKyBNYXRoX2RlZmF1bHQubmV4dFJhbmRvbU51bWJlcigpICogKG1heGltdW1BbHBoYSAtIG1pbmltdW1BbHBoYSk7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgQ29sb3IocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwogICAgICAgIH0KICAgICAgICByZXN1bHQucmVkID0gcmVkOwogICAgICAgIHJlc3VsdC5ncmVlbiA9IGdyZWVuOwogICAgICAgIHJlc3VsdC5ibHVlID0gYmx1ZTsKICAgICAgICByZXN1bHQuYWxwaGEgPSBhbHBoYTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICByZ2JhTWF0Y2hlciA9IC9eIyhbMC05YS1mXSkoWzAtOWEtZl0pKFswLTlhLWZdKShbMC05YS1mXSk/JC9pOwogICAgICBycmdnYmJhYU1hdGNoZXIgPSAvXiMoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pPyQvaTsKICAgICAgcmdiUGFyZW50aGVzZXNNYXRjaGVyID0gL15yZ2JhP1xzKlwoXHMqKFswLTkuXSslPylccypbLFxzXStccyooWzAtOS5dKyU/KVxzKlssXHNdK1xzKihbMC05Ll0rJT8pKD86XHMqWyxccy9dK1xzKihbMC05Ll0rKSk/XHMqXCkkL2k7CiAgICAgIGhzbFBhcmVudGhlc2VzTWF0Y2hlciA9IC9eaHNsYT9ccypcKFxzKihbMC05Ll0rKVxzKlssXHNdK1xzKihbMC05Ll0rJSlccypbLFxzXStccyooWzAtOS5dKyUpKD86XHMqWyxccy9dK1xzKihbMC05Ll0rKSk/XHMqXCkkL2k7CiAgICAgIENvbG9yLmZyb21Dc3NDb2xvclN0cmluZyA9IGZ1bmN0aW9uKGNvbG9yLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5zdHJpbmcoImNvbG9yIiwgY29sb3IpOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBDb2xvcigpOwogICAgICAgIH0KICAgICAgICBjb2xvciA9IGNvbG9yLnRyaW0oKTsKICAgICAgICBjb25zdCBuYW1lZENvbG9yID0gQ29sb3JbY29sb3IudG9VcHBlckNhc2UoKV07CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChuYW1lZENvbG9yKSkgewogICAgICAgICAgQ29sb3IuY2xvbmUobmFtZWRDb2xvciwgcmVzdWx0KTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGxldCBtYXRjaGVzID0gcmdiYU1hdGNoZXIuZXhlYyhjb2xvcik7CiAgICAgICAgaWYgKG1hdGNoZXMgIT09IG51bGwpIHsKICAgICAgICAgIHJlc3VsdC5yZWQgPSBwYXJzZUludChtYXRjaGVzWzFdLCAxNikgLyAxNTsKICAgICAgICAgIHJlc3VsdC5ncmVlbiA9IHBhcnNlSW50KG1hdGNoZXNbMl0sIDE2KSAvIDE1OwogICAgICAgICAgcmVzdWx0LmJsdWUgPSBwYXJzZUludChtYXRjaGVzWzNdLCAxNikgLyAxNTsKICAgICAgICAgIHJlc3VsdC5hbHBoYSA9IHBhcnNlSW50KG1hdGNoZXNbNF0gPz8gImYiLCAxNikgLyAxNTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIG1hdGNoZXMgPSBycmdnYmJhYU1hdGNoZXIuZXhlYyhjb2xvcik7CiAgICAgICAgaWYgKG1hdGNoZXMgIT09IG51bGwpIHsKICAgICAgICAgIHJlc3VsdC5yZWQgPSBwYXJzZUludChtYXRjaGVzWzFdLCAxNikgLyAyNTU7CiAgICAgICAgICByZXN1bHQuZ3JlZW4gPSBwYXJzZUludChtYXRjaGVzWzJdLCAxNikgLyAyNTU7CiAgICAgICAgICByZXN1bHQuYmx1ZSA9IHBhcnNlSW50KG1hdGNoZXNbM10sIDE2KSAvIDI1NTsKICAgICAgICAgIHJlc3VsdC5hbHBoYSA9IHBhcnNlSW50KG1hdGNoZXNbNF0gPz8gImZmIiwgMTYpIC8gMjU1OwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgbWF0Y2hlcyA9IHJnYlBhcmVudGhlc2VzTWF0Y2hlci5leGVjKGNvbG9yKTsKICAgICAgICBpZiAobWF0Y2hlcyAhPT0gbnVsbCkgewogICAgICAgICAgcmVzdWx0LnJlZCA9IHBhcnNlRmxvYXQobWF0Y2hlc1sxXSkgLyAoIiUiID09PSBtYXRjaGVzWzFdLnN1YnN0cigtMSkgPyAxMDAgOiAyNTUpOwogICAgICAgICAgcmVzdWx0LmdyZWVuID0gcGFyc2VGbG9hdChtYXRjaGVzWzJdKSAvICgiJSIgPT09IG1hdGNoZXNbMl0uc3Vic3RyKC0xKSA/IDEwMCA6IDI1NSk7CiAgICAgICAgICByZXN1bHQuYmx1ZSA9IHBhcnNlRmxvYXQobWF0Y2hlc1szXSkgLyAoIiUiID09PSBtYXRjaGVzWzNdLnN1YnN0cigtMSkgPyAxMDAgOiAyNTUpOwogICAgICAgICAgcmVzdWx0LmFscGhhID0gcGFyc2VGbG9hdChtYXRjaGVzWzRdID8/ICIxLjAiKTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIG1hdGNoZXMgPSBoc2xQYXJlbnRoZXNlc01hdGNoZXIuZXhlYyhjb2xvcik7CiAgICAgICAgaWYgKG1hdGNoZXMgIT09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBDb2xvci5mcm9tSHNsKAogICAgICAgICAgICBwYXJzZUZsb2F0KG1hdGNoZXNbMV0pIC8gMzYwLAogICAgICAgICAgICBwYXJzZUZsb2F0KG1hdGNoZXNbMl0pIC8gMTAwLAogICAgICAgICAgICBwYXJzZUZsb2F0KG1hdGNoZXNbM10pIC8gMTAwLAogICAgICAgICAgICBwYXJzZUZsb2F0KG1hdGNoZXNbNF0gPz8gIjEuMCIpLAogICAgICAgICAgICByZXN1bHQKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHZvaWQgMDsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDb2xvci5wYWNrZWRMZW5ndGggPSA0OwogICAgICBDb2xvci5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLnJlZDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuZ3JlZW47CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLmJsdWU7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleF0gPSB2YWx1ZS5hbHBoYTsKICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH07CiAgICAgIENvbG9yLnVucGFjayA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydGluZ0luZGV4LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IENvbG9yKCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5yZWQgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdC5ncmVlbiA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0LmJsdWUgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdC5hbHBoYSA9IGFycmF5W3N0YXJ0aW5nSW5kZXhdOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENvbG9yLmJ5dGVUb0Zsb2F0ID0gZnVuY3Rpb24obnVtYmVyKSB7CiAgICAgICAgcmV0dXJuIG51bWJlciAvIDI1NTsKICAgICAgfTsKICAgICAgQ29sb3IuZmxvYXRUb0J5dGUgPSBmdW5jdGlvbihudW1iZXIpIHsKICAgICAgICByZXR1cm4gbnVtYmVyID09PSAxID8gMjU1IDogbnVtYmVyICogMjU2IHwgMDsKICAgICAgfTsKICAgICAgQ29sb3IuY2xvbmUgPSBmdW5jdGlvbihjb2xvciwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoY29sb3IpKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENvbG9yKGNvbG9yLnJlZCwgY29sb3IuZ3JlZW4sIGNvbG9yLmJsdWUsIGNvbG9yLmFscGhhKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnJlZCA9IGNvbG9yLnJlZDsKICAgICAgICByZXN1bHQuZ3JlZW4gPSBjb2xvci5ncmVlbjsKICAgICAgICByZXN1bHQuYmx1ZSA9IGNvbG9yLmJsdWU7CiAgICAgICAgcmVzdWx0LmFscGhhID0gY29sb3IuYWxwaGE7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ29sb3IuZXF1YWxzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQpIHsKICAgICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgLy8KICAgICAgICBkZWZpbmVkX2RlZmF1bHQobGVmdCkgJiYgLy8KICAgICAgICBkZWZpbmVkX2RlZmF1bHQocmlnaHQpICYmIC8vCiAgICAgICAgbGVmdC5yZWQgPT09IHJpZ2h0LnJlZCAmJiAvLwogICAgICAgIGxlZnQuZ3JlZW4gPT09IHJpZ2h0LmdyZWVuICYmIC8vCiAgICAgICAgbGVmdC5ibHVlID09PSByaWdodC5ibHVlICYmIC8vCiAgICAgICAgbGVmdC5hbHBoYSA9PT0gcmlnaHQuYWxwaGE7CiAgICAgIH07CiAgICAgIENvbG9yLmVxdWFsc0FycmF5ID0gZnVuY3Rpb24oY29sb3IsIGFycmF5LCBvZmZzZXQpIHsKICAgICAgICByZXR1cm4gY29sb3IucmVkID09PSBhcnJheVtvZmZzZXRdICYmIGNvbG9yLmdyZWVuID09PSBhcnJheVtvZmZzZXQgKyAxXSAmJiBjb2xvci5ibHVlID09PSBhcnJheVtvZmZzZXQgKyAyXSAmJiBjb2xvci5hbHBoYSA9PT0gYXJyYXlbb2Zmc2V0ICsgM107CiAgICAgIH07CiAgICAgIENvbG9yLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJldHVybiBDb2xvci5jbG9uZSh0aGlzLCByZXN1bHQpOwogICAgICB9OwogICAgICBDb2xvci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24ob3RoZXIpIHsKICAgICAgICByZXR1cm4gQ29sb3IuZXF1YWxzKHRoaXMsIG90aGVyKTsKICAgICAgfTsKICAgICAgQ29sb3IucHJvdG90eXBlLmVxdWFsc0Vwc2lsb24gPSBmdW5jdGlvbihvdGhlciwgZXBzaWxvbikgewogICAgICAgIHJldHVybiB0aGlzID09PSBvdGhlciB8fCAvLwogICAgICAgIGRlZmluZWRfZGVmYXVsdChvdGhlcikgJiYgLy8KICAgICAgICBNYXRoLmFicyh0aGlzLnJlZCAtIG90aGVyLnJlZCkgPD0gZXBzaWxvbiAmJiAvLwogICAgICAgIE1hdGguYWJzKHRoaXMuZ3JlZW4gLSBvdGhlci5ncmVlbikgPD0gZXBzaWxvbiAmJiAvLwogICAgICAgIE1hdGguYWJzKHRoaXMuYmx1ZSAtIG90aGVyLmJsdWUpIDw9IGVwc2lsb24gJiYgLy8KICAgICAgICBNYXRoLmFicyh0aGlzLmFscGhhIC0gb3RoZXIuYWxwaGEpIDw9IGVwc2lsb247CiAgICAgIH07CiAgICAgIENvbG9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBgKCR7dGhpcy5yZWR9LCAke3RoaXMuZ3JlZW59LCAke3RoaXMuYmx1ZX0sICR7dGhpcy5hbHBoYX0pYDsKICAgICAgfTsKICAgICAgQ29sb3IucHJvdG90eXBlLnRvQ3NzQ29sb3JTdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICBjb25zdCByZWQgPSBDb2xvci5mbG9hdFRvQnl0ZSh0aGlzLnJlZCk7CiAgICAgICAgY29uc3QgZ3JlZW4gPSBDb2xvci5mbG9hdFRvQnl0ZSh0aGlzLmdyZWVuKTsKICAgICAgICBjb25zdCBibHVlID0gQ29sb3IuZmxvYXRUb0J5dGUodGhpcy5ibHVlKTsKICAgICAgICBpZiAodGhpcy5hbHBoYSA9PT0gMSkgewogICAgICAgICAgcmV0dXJuIGByZ2IoJHtyZWR9LCR7Z3JlZW59LCR7Ymx1ZX0pYDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGByZ2JhKCR7cmVkfSwke2dyZWVufSwke2JsdWV9LCR7dGhpcy5hbHBoYX0pYDsKICAgICAgfTsKICAgICAgQ29sb3IucHJvdG90eXBlLnRvQ3NzSGV4U3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgbGV0IHIgPSBDb2xvci5mbG9hdFRvQnl0ZSh0aGlzLnJlZCkudG9TdHJpbmcoMTYpOwogICAgICAgIGlmIChyLmxlbmd0aCA8IDIpIHsKICAgICAgICAgIHIgPSBgMCR7cn1gOwogICAgICAgIH0KICAgICAgICBsZXQgZyA9IENvbG9yLmZsb2F0VG9CeXRlKHRoaXMuZ3JlZW4pLnRvU3RyaW5nKDE2KTsKICAgICAgICBpZiAoZy5sZW5ndGggPCAyKSB7CiAgICAgICAgICBnID0gYDAke2d9YDsKICAgICAgICB9CiAgICAgICAgbGV0IGIgPSBDb2xvci5mbG9hdFRvQnl0ZSh0aGlzLmJsdWUpLnRvU3RyaW5nKDE2KTsKICAgICAgICBpZiAoYi5sZW5ndGggPCAyKSB7CiAgICAgICAgICBiID0gYDAke2J9YDsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuYWxwaGEgPCAxKSB7CiAgICAgICAgICBsZXQgaGV4QWxwaGEgPSBDb2xvci5mbG9hdFRvQnl0ZSh0aGlzLmFscGhhKS50b1N0cmluZygxNik7CiAgICAgICAgICBpZiAoaGV4QWxwaGEubGVuZ3RoIDwgMikgewogICAgICAgICAgICBoZXhBbHBoYSA9IGAwJHtoZXhBbHBoYX1gOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGAjJHtyfSR7Z30ke2J9JHtoZXhBbHBoYX1gOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYCMke3J9JHtnfSR7Yn1gOwogICAgICB9OwogICAgICBDb2xvci5wcm90b3R5cGUudG9CeXRlcyA9IGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIGNvbnN0IHJlZCA9IENvbG9yLmZsb2F0VG9CeXRlKHRoaXMucmVkKTsKICAgICAgICBjb25zdCBncmVlbiA9IENvbG9yLmZsb2F0VG9CeXRlKHRoaXMuZ3JlZW4pOwogICAgICAgIGNvbnN0IGJsdWUgPSBDb2xvci5mbG9hdFRvQnl0ZSh0aGlzLmJsdWUpOwogICAgICAgIGNvbnN0IGFscGhhID0gQ29sb3IuZmxvYXRUb0J5dGUodGhpcy5hbHBoYSk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmV0dXJuIFtyZWQsIGdyZWVuLCBibHVlLCBhbHBoYV07CiAgICAgICAgfQogICAgICAgIHJlc3VsdFswXSA9IHJlZDsKICAgICAgICByZXN1bHRbMV0gPSBncmVlbjsKICAgICAgICByZXN1bHRbMl0gPSBibHVlOwogICAgICAgIHJlc3VsdFszXSA9IGFscGhhOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENvbG9yLnByb3RvdHlwZS50b1JnYmEgPSBmdW5jdGlvbigpIHsKICAgICAgICBzY3JhdGNoVWludDhBcnJheVswXSA9IENvbG9yLmZsb2F0VG9CeXRlKHRoaXMucmVkKTsKICAgICAgICBzY3JhdGNoVWludDhBcnJheVsxXSA9IENvbG9yLmZsb2F0VG9CeXRlKHRoaXMuZ3JlZW4pOwogICAgICAgIHNjcmF0Y2hVaW50OEFycmF5WzJdID0gQ29sb3IuZmxvYXRUb0J5dGUodGhpcy5ibHVlKTsKICAgICAgICBzY3JhdGNoVWludDhBcnJheVszXSA9IENvbG9yLmZsb2F0VG9CeXRlKHRoaXMuYWxwaGEpOwogICAgICAgIHJldHVybiBzY3JhdGNoVWludDMyQXJyYXlbMF07CiAgICAgIH07CiAgICAgIENvbG9yLnByb3RvdHlwZS5icmlnaHRlbiA9IGZ1bmN0aW9uKG1hZ25pdHVkZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJtYWduaXR1ZGUiLCBtYWduaXR1ZGUpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJtYWduaXR1ZGUiLCBtYWduaXR1ZGUsIDApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBtYWduaXR1ZGUgPSAxIC0gbWFnbml0dWRlOwogICAgICAgIHJlc3VsdC5yZWQgPSAxIC0gKDEgLSB0aGlzLnJlZCkgKiBtYWduaXR1ZGU7CiAgICAgICAgcmVzdWx0LmdyZWVuID0gMSAtICgxIC0gdGhpcy5ncmVlbikgKiBtYWduaXR1ZGU7CiAgICAgICAgcmVzdWx0LmJsdWUgPSAxIC0gKDEgLSB0aGlzLmJsdWUpICogbWFnbml0dWRlOwogICAgICAgIHJlc3VsdC5hbHBoYSA9IHRoaXMuYWxwaGE7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ29sb3IucHJvdG90eXBlLmRhcmtlbiA9IGZ1bmN0aW9uKG1hZ25pdHVkZSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJtYWduaXR1ZGUiLCBtYWduaXR1ZGUpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJtYWduaXR1ZGUiLCBtYWduaXR1ZGUsIDApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBtYWduaXR1ZGUgPSAxIC0gbWFnbml0dWRlOwogICAgICAgIHJlc3VsdC5yZWQgPSB0aGlzLnJlZCAqIG1hZ25pdHVkZTsKICAgICAgICByZXN1bHQuZ3JlZW4gPSB0aGlzLmdyZWVuICogbWFnbml0dWRlOwogICAgICAgIHJlc3VsdC5ibHVlID0gdGhpcy5ibHVlICogbWFnbml0dWRlOwogICAgICAgIHJlc3VsdC5hbHBoYSA9IHRoaXMuYWxwaGE7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ29sb3IucHJvdG90eXBlLndpdGhBbHBoYSA9IGZ1bmN0aW9uKGFscGhhLCByZXN1bHQpIHsKICAgICAgICByZXR1cm4gQ29sb3IuZnJvbUFscGhhKHRoaXMsIGFscGhhLCByZXN1bHQpOwogICAgICB9OwogICAgICBDb2xvci5hZGQgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnJlZCA9IGxlZnQucmVkICsgcmlnaHQucmVkOwogICAgICAgIHJlc3VsdC5ncmVlbiA9IGxlZnQuZ3JlZW4gKyByaWdodC5ncmVlbjsKICAgICAgICByZXN1bHQuYmx1ZSA9IGxlZnQuYmx1ZSArIHJpZ2h0LmJsdWU7CiAgICAgICAgcmVzdWx0LmFscGhhID0gbGVmdC5hbHBoYSArIHJpZ2h0LmFscGhhOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENvbG9yLnN1YnRyYWN0ID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC5yZWQgPSBsZWZ0LnJlZCAtIHJpZ2h0LnJlZDsKICAgICAgICByZXN1bHQuZ3JlZW4gPSBsZWZ0LmdyZWVuIC0gcmlnaHQuZ3JlZW47CiAgICAgICAgcmVzdWx0LmJsdWUgPSBsZWZ0LmJsdWUgLSByaWdodC5ibHVlOwogICAgICAgIHJlc3VsdC5hbHBoYSA9IGxlZnQuYWxwaGEgLSByaWdodC5hbHBoYTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDb2xvci5tdWx0aXBseSA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImxlZnQiLCBsZWZ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJpZ2h0IiwgcmlnaHQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQucmVkID0gbGVmdC5yZWQgKiByaWdodC5yZWQ7CiAgICAgICAgcmVzdWx0LmdyZWVuID0gbGVmdC5ncmVlbiAqIHJpZ2h0LmdyZWVuOwogICAgICAgIHJlc3VsdC5ibHVlID0gbGVmdC5ibHVlICogcmlnaHQuYmx1ZTsKICAgICAgICByZXN1bHQuYWxwaGEgPSBsZWZ0LmFscGhhICogcmlnaHQuYWxwaGE7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ29sb3IuZGl2aWRlID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC5yZWQgPSBsZWZ0LnJlZCAvIHJpZ2h0LnJlZDsKICAgICAgICByZXN1bHQuZ3JlZW4gPSBsZWZ0LmdyZWVuIC8gcmlnaHQuZ3JlZW47CiAgICAgICAgcmVzdWx0LmJsdWUgPSBsZWZ0LmJsdWUgLyByaWdodC5ibHVlOwogICAgICAgIHJlc3VsdC5hbHBoYSA9IGxlZnQuYWxwaGEgLyByaWdodC5hbHBoYTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDb2xvci5tb2QgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnJlZCA9IGxlZnQucmVkICUgcmlnaHQucmVkOwogICAgICAgIHJlc3VsdC5ncmVlbiA9IGxlZnQuZ3JlZW4gJSByaWdodC5ncmVlbjsKICAgICAgICByZXN1bHQuYmx1ZSA9IGxlZnQuYmx1ZSAlIHJpZ2h0LmJsdWU7CiAgICAgICAgcmVzdWx0LmFscGhhID0gbGVmdC5hbHBoYSAlIHJpZ2h0LmFscGhhOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENvbG9yLmxlcnAgPSBmdW5jdGlvbihzdGFydCwgZW5kLCB0LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInN0YXJ0Iiwgc3RhcnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiZW5kIiwgZW5kKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoInQiLCB0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnJlZCA9IE1hdGhfZGVmYXVsdC5sZXJwKHN0YXJ0LnJlZCwgZW5kLnJlZCwgdCk7CiAgICAgICAgcmVzdWx0LmdyZWVuID0gTWF0aF9kZWZhdWx0LmxlcnAoc3RhcnQuZ3JlZW4sIGVuZC5ncmVlbiwgdCk7CiAgICAgICAgcmVzdWx0LmJsdWUgPSBNYXRoX2RlZmF1bHQubGVycChzdGFydC5ibHVlLCBlbmQuYmx1ZSwgdCk7CiAgICAgICAgcmVzdWx0LmFscGhhID0gTWF0aF9kZWZhdWx0LmxlcnAoc3RhcnQuYWxwaGEsIGVuZC5hbHBoYSwgdCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ29sb3IubXVsdGlwbHlCeVNjYWxhciA9IGZ1bmN0aW9uKGNvbG9yLCBzY2FsYXIsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY29sb3IiLCBjb2xvcik7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJzY2FsYXIiLCBzY2FsYXIpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQucmVkID0gY29sb3IucmVkICogc2NhbGFyOwogICAgICAgIHJlc3VsdC5ncmVlbiA9IGNvbG9yLmdyZWVuICogc2NhbGFyOwogICAgICAgIHJlc3VsdC5ibHVlID0gY29sb3IuYmx1ZSAqIHNjYWxhcjsKICAgICAgICByZXN1bHQuYWxwaGEgPSBjb2xvci5hbHBoYSAqIHNjYWxhcjsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDb2xvci5kaXZpZGVCeVNjYWxhciA9IGZ1bmN0aW9uKGNvbG9yLCBzY2FsYXIsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY29sb3IiLCBjb2xvcik7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJzY2FsYXIiLCBzY2FsYXIpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQucmVkID0gY29sb3IucmVkIC8gc2NhbGFyOwogICAgICAgIHJlc3VsdC5ncmVlbiA9IGNvbG9yLmdyZWVuIC8gc2NhbGFyOwogICAgICAgIHJlc3VsdC5ibHVlID0gY29sb3IuYmx1ZSAvIHNjYWxhcjsKICAgICAgICByZXN1bHQuYWxwaGEgPSBjb2xvci5hbHBoYSAvIHNjYWxhcjsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDb2xvci5BTElDRUJMVUUgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0YwRjhGRiIpKTsKICAgICAgQ29sb3IuQU5USVFVRVdISVRFID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGQUVCRDciKSk7CiAgICAgIENvbG9yLkFRVUEgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzAwRkZGRiIpKTsKICAgICAgQ29sb3IuQVFVQU1BUklORSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjN0ZGRkQ0IikpOwogICAgICBDb2xvci5BWlVSRSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRjBGRkZGIikpOwogICAgICBDb2xvci5CRUlHRSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRjVGNURDIikpOwogICAgICBDb2xvci5CSVNRVUUgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGRTRDNCIpKTsKICAgICAgQ29sb3IuQkxBQ0sgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzAwMDAwMCIpKTsKICAgICAgQ29sb3IuQkxBTkNIRURBTE1PTkQgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGRUJDRCIpKTsKICAgICAgQ29sb3IuQkxVRSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMDAwMEZGIikpOwogICAgICBDb2xvci5CTFVFVklPTEVUID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM4QTJCRTIiKSk7CiAgICAgIENvbG9yLkJST1dOID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNBNTJBMkEiKSk7CiAgICAgIENvbG9yLkJVUkxZV09PRCA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjREVCODg3IikpOwogICAgICBDb2xvci5DQURFVEJMVUUgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzVGOUVBMCIpKTsKICAgICAgQ29sb3IuQ0hBUlRSRVVTRSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjN0ZGRjAwIikpOwogICAgICBDb2xvci5DSE9DT0xBVEUgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0QyNjkxRSIpKTsKICAgICAgQ29sb3IuQ09SQUwgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGN0Y1MCIpKTsKICAgICAgQ29sb3IuQ09STkZMT1dFUkJMVUUgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzY0OTVFRCIpKTsKICAgICAgQ29sb3IuQ09STlNJTEsgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGRjhEQyIpKTsKICAgICAgQ29sb3IuQ1JJTVNPTiA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjREMxNDNDIikpOwogICAgICBDb2xvci5DWUFOID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMEZGRkYiKSk7CiAgICAgIENvbG9yLkRBUktCTFVFID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMDAwOEIiKSk7CiAgICAgIENvbG9yLkRBUktDWUFOID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMDhCOEIiKSk7CiAgICAgIENvbG9yLkRBUktHT0xERU5ST0QgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0I4ODYwQiIpKTsKICAgICAgQ29sb3IuREFSS0dSQVkgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0E5QTlBOSIpKTsKICAgICAgQ29sb3IuREFSS0dSRUVOID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMDY0MDAiKSk7CiAgICAgIENvbG9yLkRBUktHUkVZID0gQ29sb3IuREFSS0dSQVk7CiAgICAgIENvbG9yLkRBUktLSEFLSSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjQkRCNzZCIikpOwogICAgICBDb2xvci5EQVJLTUFHRU5UQSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjOEIwMDhCIikpOwogICAgICBDb2xvci5EQVJLT0xJVkVHUkVFTiA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjNTU2QjJGIikpOwogICAgICBDb2xvci5EQVJLT1JBTkdFID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRjhDMDAiKSk7CiAgICAgIENvbG9yLkRBUktPUkNISUQgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzk5MzJDQyIpKTsKICAgICAgQ29sb3IuREFSS1JFRCA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjOEIwMDAwIikpOwogICAgICBDb2xvci5EQVJLU0FMTU9OID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNFOTk2N0EiKSk7CiAgICAgIENvbG9yLkRBUktTRUFHUkVFTiA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjOEZCQzhGIikpOwogICAgICBDb2xvci5EQVJLU0xBVEVCTFVFID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM0ODNEOEIiKSk7CiAgICAgIENvbG9yLkRBUktTTEFURUdSQVkgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzJGNEY0RiIpKTsKICAgICAgQ29sb3IuREFSS1NMQVRFR1JFWSA9IENvbG9yLkRBUktTTEFURUdSQVk7CiAgICAgIENvbG9yLkRBUktUVVJRVU9JU0UgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzAwQ0VEMSIpKTsKICAgICAgQ29sb3IuREFSS1ZJT0xFVCA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjOTQwMEQzIikpOwogICAgICBDb2xvci5ERUVQUElOSyA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkYxNDkzIikpOwogICAgICBDb2xvci5ERUVQU0tZQkxVRSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMDBCRkZGIikpOwogICAgICBDb2xvci5ESU1HUkFZID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM2OTY5NjkiKSk7CiAgICAgIENvbG9yLkRJTUdSRVkgPSBDb2xvci5ESU1HUkFZOwogICAgICBDb2xvci5ET0RHRVJCTFVFID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMxRTkwRkYiKSk7CiAgICAgIENvbG9yLkZJUkVCUklDSyA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjQjIyMjIyIikpOwogICAgICBDb2xvci5GTE9SQUxXSElURSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZGQUYwIikpOwogICAgICBDb2xvci5GT1JFU1RHUkVFTiA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMjI4QjIyIikpOwogICAgICBDb2xvci5GVUNIU0lBID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRjAwRkYiKSk7CiAgICAgIENvbG9yLkdBSU5TQk9STyA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRENEQ0RDIikpOwogICAgICBDb2xvci5HSE9TVFdISVRFID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGOEY4RkYiKSk7CiAgICAgIENvbG9yLkdPTEQgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGRDcwMCIpKTsKICAgICAgQ29sb3IuR09MREVOUk9EID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNEQUE1MjAiKSk7CiAgICAgIENvbG9yLkdSQVkgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzgwODA4MCIpKTsKICAgICAgQ29sb3IuR1JFRU4gPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzAwODAwMCIpKTsKICAgICAgQ29sb3IuR1JFRU5ZRUxMT1cgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0FERkYyRiIpKTsKICAgICAgQ29sb3IuR1JFWSA9IENvbG9yLkdSQVk7CiAgICAgIENvbG9yLkhPTkVZREVXID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGMEZGRjAiKSk7CiAgICAgIENvbG9yLkhPVFBJTksgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGNjlCNCIpKTsKICAgICAgQ29sb3IuSU5ESUFOUkVEID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNDRDVDNUMiKSk7CiAgICAgIENvbG9yLklORElHTyA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjNEIwMDgyIikpOwogICAgICBDb2xvci5JVk9SWSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZGRkYwIikpOwogICAgICBDb2xvci5LSEFLSSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRjBFNjhDIikpOwogICAgICBDb2xvci5MQVZFTkRFUiA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRTZFNkZBIikpOwogICAgICBDb2xvci5MQVZFTkRBUl9CTFVTSCA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZGMEY1IikpOwogICAgICBDb2xvci5MQVdOR1JFRU4gPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzdDRkMwMCIpKTsKICAgICAgQ29sb3IuTEVNT05DSElGRk9OID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRkZBQ0QiKSk7CiAgICAgIENvbG9yLkxJR0hUQkxVRSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjQUREOEU2IikpOwogICAgICBDb2xvci5MSUdIVENPUkFMID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGMDgwODAiKSk7CiAgICAgIENvbG9yLkxJR0hUQ1lBTiA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRTBGRkZGIikpOwogICAgICBDb2xvci5MSUdIVEdPTERFTlJPRFlFTExPVyA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkFGQUQyIikpOwogICAgICBDb2xvci5MSUdIVEdSQVkgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0QzRDNEMyIpKTsKICAgICAgQ29sb3IuTElHSFRHUkVFTiA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjOTBFRTkwIikpOwogICAgICBDb2xvci5MSUdIVEdSRVkgPSBDb2xvci5MSUdIVEdSQVk7CiAgICAgIENvbG9yLkxJR0hUUElOSyA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZCNkMxIikpOwogICAgICBDb2xvci5MSUdIVFNFQUdSRUVOID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMyMEIyQUEiKSk7CiAgICAgIENvbG9yLkxJR0hUU0tZQkxVRSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjODdDRUZBIikpOwogICAgICBDb2xvci5MSUdIVFNMQVRFR1JBWSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjNzc4ODk5IikpOwogICAgICBDb2xvci5MSUdIVFNMQVRFR1JFWSA9IENvbG9yLkxJR0hUU0xBVEVHUkFZOwogICAgICBDb2xvci5MSUdIVFNURUVMQkxVRSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjQjBDNERFIikpOwogICAgICBDb2xvci5MSUdIVFlFTExPVyA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZGRkUwIikpOwogICAgICBDb2xvci5MSU1FID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMEZGMDAiKSk7CiAgICAgIENvbG9yLkxJTUVHUkVFTiA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMzJDRDMyIikpOwogICAgICBDb2xvci5MSU5FTiA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkFGMEU2IikpOwogICAgICBDb2xvci5NQUdFTlRBID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRjAwRkYiKSk7CiAgICAgIENvbG9yLk1BUk9PTiA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjODAwMDAwIikpOwogICAgICBDb2xvci5NRURJVU1BUVVBTUFSSU5FID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM2NkNEQUEiKSk7CiAgICAgIENvbG9yLk1FRElVTUJMVUUgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzAwMDBDRCIpKTsKICAgICAgQ29sb3IuTUVESVVNT1JDSElEID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNCQTU1RDMiKSk7CiAgICAgIENvbG9yLk1FRElVTVBVUlBMRSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjOTM3MERCIikpOwogICAgICBDb2xvci5NRURJVU1TRUFHUkVFTiA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjM0NCMzcxIikpOwogICAgICBDb2xvci5NRURJVU1TTEFURUJMVUUgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzdCNjhFRSIpKTsKICAgICAgQ29sb3IuTUVESVVNU1BSSU5HR1JFRU4gPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzAwRkE5QSIpKTsKICAgICAgQ29sb3IuTUVESVVNVFVSUVVPSVNFID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM0OEQxQ0MiKSk7CiAgICAgIENvbG9yLk1FRElVTVZJT0xFVFJFRCA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjQzcxNTg1IikpOwogICAgICBDb2xvci5NSUROSUdIVEJMVUUgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzE5MTk3MCIpKTsKICAgICAgQ29sb3IuTUlOVENSRUFNID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGNUZGRkEiKSk7CiAgICAgIENvbG9yLk1JU1RZUk9TRSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZFNEUxIikpOwogICAgICBDb2xvci5NT0NDQVNJTiA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZFNEI1IikpOwogICAgICBDb2xvci5OQVZBSk9XSElURSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZERUFEIikpOwogICAgICBDb2xvci5OQVZZID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMDAwODAiKSk7CiAgICAgIENvbG9yLk9MRExBQ0UgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0ZERjVFNiIpKTsKICAgICAgQ29sb3IuT0xJVkUgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzgwODAwMCIpKTsKICAgICAgQ29sb3IuT0xJVkVEUkFCID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM2QjhFMjMiKSk7CiAgICAgIENvbG9yLk9SQU5HRSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZBNTAwIikpOwogICAgICBDb2xvci5PUkFOR0VSRUQgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGNDUwMCIpKTsKICAgICAgQ29sb3IuT1JDSElEID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNEQTcwRDYiKSk7CiAgICAgIENvbG9yLlBBTEVHT0xERU5ST0QgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0VFRThBQSIpKTsKICAgICAgQ29sb3IuUEFMRUdSRUVOID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM5OEZCOTgiKSk7CiAgICAgIENvbG9yLlBBTEVUVVJRVU9JU0UgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0FGRUVFRSIpKTsKICAgICAgQ29sb3IuUEFMRVZJT0xFVFJFRCA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjREI3MDkzIikpOwogICAgICBDb2xvci5QQVBBWUFXSElQID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRkVGRDUiKSk7CiAgICAgIENvbG9yLlBFQUNIUFVGRiA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZEQUI5IikpOwogICAgICBDb2xvci5QRVJVID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNDRDg1M0YiKSk7CiAgICAgIENvbG9yLlBJTksgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGQzBDQiIpKTsKICAgICAgQ29sb3IuUExVTSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRERBMEREIikpOwogICAgICBDb2xvci5QT1dERVJCTFVFID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNCMEUwRTYiKSk7CiAgICAgIENvbG9yLlBVUlBMRSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjODAwMDgwIikpOwogICAgICBDb2xvci5SRUQgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGMDAwMCIpKTsKICAgICAgQ29sb3IuUk9TWUJST1dOID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNCQzhGOEYiKSk7CiAgICAgIENvbG9yLlJPWUFMQkxVRSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjNDE2OUUxIikpOwogICAgICBDb2xvci5TQURETEVCUk9XTiA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjOEI0NTEzIikpOwogICAgICBDb2xvci5TQUxNT04gPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0ZBODA3MiIpKTsKICAgICAgQ29sb3IuU0FORFlCUk9XTiA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRjRBNDYwIikpOwogICAgICBDb2xvci5TRUFHUkVFTiA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMkU4QjU3IikpOwogICAgICBDb2xvci5TRUFTSEVMTCA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZGNUVFIikpOwogICAgICBDb2xvci5TSUVOTkEgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0EwNTIyRCIpKTsKICAgICAgQ29sb3IuU0lMVkVSID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNDMEMwQzAiKSk7CiAgICAgIENvbG9yLlNLWUJMVUUgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzg3Q0VFQiIpKTsKICAgICAgQ29sb3IuU0xBVEVCTFVFID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM2QTVBQ0QiKSk7CiAgICAgIENvbG9yLlNMQVRFR1JBWSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjNzA4MDkwIikpOwogICAgICBDb2xvci5TTEFURUdSRVkgPSBDb2xvci5TTEFURUdSQVk7CiAgICAgIENvbG9yLlNOT1cgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGRkFGQSIpKTsKICAgICAgQ29sb3IuU1BSSU5HR1JFRU4gPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzAwRkY3RiIpKTsKICAgICAgQ29sb3IuU1RFRUxCTFVFID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM0NjgyQjQiKSk7CiAgICAgIENvbG9yLlRBTiA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRDJCNDhDIikpOwogICAgICBDb2xvci5URUFMID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMDgwODAiKSk7CiAgICAgIENvbG9yLlRISVNUTEUgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0Q4QkZEOCIpKTsKICAgICAgQ29sb3IuVE9NQVRPID0gT2JqZWN0LmZyZWV6ZShDb2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRjYzNDciKSk7CiAgICAgIENvbG9yLlRVUlFVT0lTRSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjNDBFMEQwIikpOwogICAgICBDb2xvci5WSU9MRVQgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0VFODJFRSIpKTsKICAgICAgQ29sb3IuV0hFQVQgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0Y1REVCMyIpKTsKICAgICAgQ29sb3IuV0hJVEUgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGRkZGRiIpKTsKICAgICAgQ29sb3IuV0hJVEVTTU9LRSA9IE9iamVjdC5mcmVlemUoQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRjVGNUY1IikpOwogICAgICBDb2xvci5ZRUxMT1cgPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGRkYwMCIpKTsKICAgICAgQ29sb3IuWUVMTE9XR1JFRU4gPSBPYmplY3QuZnJlZXplKENvbG9yLmZyb21Dc3NDb2xvclN0cmluZygiIzlBQ0QzMiIpKTsKICAgICAgQ29sb3IuVFJBTlNQQVJFTlQgPSBPYmplY3QuZnJlZXplKG5ldyBDb2xvcigwLCAwLCAwLCAwKSk7CiAgICAgIENvbG9yX2RlZmF1bHQgPSBDb2xvcjsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1BvbHlsaW5lR2VvbWV0cnkuanMKICBmdW5jdGlvbiBpbnRlcnBvbGF0ZUNvbG9ycyhwMCwgcDEsIGNvbG9yMCwgY29sb3IxLCBudW1Qb2ludHMpIHsKICAgIGNvbnN0IGNvbG9ycyA9IHNjcmF0Y2hJbnRlcnBvbGF0ZUNvbG9yc0FycmF5OwogICAgY29sb3JzLmxlbmd0aCA9IG51bVBvaW50czsKICAgIGxldCBpOwogICAgY29uc3QgcjAgPSBjb2xvcjAucmVkOwogICAgY29uc3QgZzAgPSBjb2xvcjAuZ3JlZW47CiAgICBjb25zdCBiMCA9IGNvbG9yMC5ibHVlOwogICAgY29uc3QgYTAgPSBjb2xvcjAuYWxwaGE7CiAgICBjb25zdCByMSA9IGNvbG9yMS5yZWQ7CiAgICBjb25zdCBnMSA9IGNvbG9yMS5ncmVlbjsKICAgIGNvbnN0IGIxID0gY29sb3IxLmJsdWU7CiAgICBjb25zdCBhMSA9IGNvbG9yMS5hbHBoYTsKICAgIGlmIChDb2xvcl9kZWZhdWx0LmVxdWFscyhjb2xvcjAsIGNvbG9yMSkpIHsKICAgICAgZm9yIChpID0gMDsgaSA8IG51bVBvaW50czsgaSsrKSB7CiAgICAgICAgY29sb3JzW2ldID0gQ29sb3JfZGVmYXVsdC5jbG9uZShjb2xvcjApOwogICAgICB9CiAgICAgIHJldHVybiBjb2xvcnM7CiAgICB9CiAgICBjb25zdCByZWRQZXJWZXJ0ZXggPSAocjEgLSByMCkgLyBudW1Qb2ludHM7CiAgICBjb25zdCBncmVlblBlclZlcnRleCA9IChnMSAtIGcwKSAvIG51bVBvaW50czsKICAgIGNvbnN0IGJsdWVQZXJWZXJ0ZXggPSAoYjEgLSBiMCkgLyBudW1Qb2ludHM7CiAgICBjb25zdCBhbHBoYVBlclZlcnRleCA9IChhMSAtIGEwKSAvIG51bVBvaW50czsKICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qb2ludHM7IGkrKykgewogICAgICBjb2xvcnNbaV0gPSBuZXcgQ29sb3JfZGVmYXVsdCgKICAgICAgICByMCArIGkgKiByZWRQZXJWZXJ0ZXgsCiAgICAgICAgZzAgKyBpICogZ3JlZW5QZXJWZXJ0ZXgsCiAgICAgICAgYjAgKyBpICogYmx1ZVBlclZlcnRleCwKICAgICAgICBhMCArIGkgKiBhbHBoYVBlclZlcnRleAogICAgICApOwogICAgfQogICAgcmV0dXJuIGNvbG9yczsKICB9CiAgZnVuY3Rpb24gUG9seWxpbmVHZW9tZXRyeShvcHRpb25zKSB7CiAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICBjb25zdCBwb3NpdGlvbnMgPSBvcHRpb25zLnBvc2l0aW9uczsKICAgIGNvbnN0IGNvbG9ycyA9IG9wdGlvbnMuY29sb3JzOwogICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoID8/IDE7CiAgICBjb25zdCBjb2xvcnNQZXJWZXJ0ZXggPSBvcHRpb25zLmNvbG9yc1BlclZlcnRleCA/PyBmYWxzZTsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHBvc2l0aW9ucykgfHwgcG9zaXRpb25zLmxlbmd0aCA8IDIpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIkF0IGxlYXN0IHR3byBwb3NpdGlvbnMgYXJlIHJlcXVpcmVkLiIpOwogICAgfQogICAgaWYgKHR5cGVvZiB3aWR0aCAhPT0gIm51bWJlciIpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIndpZHRoIG11c3QgYmUgYSBudW1iZXIiKTsKICAgIH0KICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoY29sb3JzKSAmJiAoY29sb3JzUGVyVmVydGV4ICYmIGNvbG9ycy5sZW5ndGggPCBwb3NpdGlvbnMubGVuZ3RoIHx8ICFjb2xvcnNQZXJWZXJ0ZXggJiYgY29sb3JzLmxlbmd0aCA8IHBvc2l0aW9ucy5sZW5ndGggLSAxKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiY29sb3JzIGhhcyBhbiBpbnZhbGlkIGxlbmd0aC4iKTsKICAgIH0KICAgIHRoaXMuX3Bvc2l0aW9ucyA9IHBvc2l0aW9uczsKICAgIHRoaXMuX2NvbG9ycyA9IGNvbG9yczsKICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7CiAgICB0aGlzLl9jb2xvcnNQZXJWZXJ0ZXggPSBjb2xvcnNQZXJWZXJ0ZXg7CiAgICB0aGlzLl92ZXJ0ZXhGb3JtYXQgPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5jbG9uZSgKICAgICAgb3B0aW9ucy52ZXJ0ZXhGb3JtYXQgPz8gVmVydGV4Rm9ybWF0X2RlZmF1bHQuREVGQVVMVAogICAgKTsKICAgIHRoaXMuX2FyY1R5cGUgPSBvcHRpb25zLmFyY1R5cGUgPz8gQXJjVHlwZV9kZWZhdWx0LkdFT0RFU0lDOwogICAgdGhpcy5fZ3JhbnVsYXJpdHkgPSBvcHRpb25zLmdyYW51bGFyaXR5ID8/IE1hdGhfZGVmYXVsdC5SQURJQU5TX1BFUl9ERUdSRUU7CiAgICB0aGlzLl9lbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC5jbG9uZShvcHRpb25zLmVsbGlwc29pZCA/PyBFbGxpcHNvaWRfZGVmYXVsdC5kZWZhdWx0KTsKICAgIHRoaXMuX3dvcmtlck5hbWUgPSAiY3JlYXRlUG9seWxpbmVHZW9tZXRyeSI7CiAgICBsZXQgbnVtQ29tcG9uZW50cyA9IDEgKyBwb3NpdGlvbnMubGVuZ3RoICogQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgIG51bUNvbXBvbmVudHMgKz0gZGVmaW5lZF9kZWZhdWx0KGNvbG9ycykgPyAxICsgY29sb3JzLmxlbmd0aCAqIENvbG9yX2RlZmF1bHQucGFja2VkTGVuZ3RoIDogMTsKICAgIHRoaXMucGFja2VkTGVuZ3RoID0gbnVtQ29tcG9uZW50cyArIEVsbGlwc29pZF9kZWZhdWx0LnBhY2tlZExlbmd0aCArIFZlcnRleEZvcm1hdF9kZWZhdWx0LnBhY2tlZExlbmd0aCArIDQ7CiAgfQogIHZhciBzY3JhdGNoSW50ZXJwb2xhdGVDb2xvcnNBcnJheSwgc2NyYXRjaEVsbGlwc29pZDgsIHNjcmF0Y2hWZXJ0ZXhGb3JtYXQxMCwgc2NyYXRjaE9wdGlvbnMxNiwgc2NyYXRjaENhcnRlc2lhbjM4LCBzY3JhdGNoUG9zaXRpb240LCBzY3JhdGNoUHJldlBvc2l0aW9uLCBzY3JhdGNoTmV4dFBvc2l0aW9uLCBQb2x5bGluZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfUG9seWxpbmVHZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUG9seWxpbmVHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfQXJjVHlwZSgpOwogICAgICBpbml0X2FycmF5UmVtb3ZlRHVwbGljYXRlcygpOwogICAgICBpbml0X0JvdW5kaW5nU3BoZXJlKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NvbG9yKCk7CiAgICAgIGluaXRfQ29tcG9uZW50RGF0YXR5cGUoKTsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9HZW9tZXRyeSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlKCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGVzKCk7CiAgICAgIGluaXRfR2VvbWV0cnlUeXBlKCk7CiAgICAgIGluaXRfSW5kZXhEYXRhdHlwZSgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9Qb2x5bGluZVBpcGVsaW5lKCk7CiAgICAgIGluaXRfUHJpbWl0aXZlVHlwZSgpOwogICAgICBpbml0X1ZlcnRleEZvcm1hdCgpOwogICAgICBzY3JhdGNoSW50ZXJwb2xhdGVDb2xvcnNBcnJheSA9IFtdOwogICAgICBQb2x5bGluZUdlb21ldHJ5LnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh2YWx1ZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJ2YWx1ZSBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhcnJheSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhcnJheSBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGxldCBpOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHZhbHVlLl9wb3NpdGlvbnM7CiAgICAgICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IGxlbmd0aDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2ksIHN0YXJ0aW5nSW5kZXggKz0gQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aCkgewogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2socG9zaXRpb25zW2ldLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNvbG9ycyA9IHZhbHVlLl9jb2xvcnM7CiAgICAgICAgbGVuZ3RoID0gZGVmaW5lZF9kZWZhdWx0KGNvbG9ycykgPyBjb2xvcnMubGVuZ3RoIDogMDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gbGVuZ3RoOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSwgc3RhcnRpbmdJbmRleCArPSBDb2xvcl9kZWZhdWx0LnBhY2tlZExlbmd0aCkgewogICAgICAgICAgQ29sb3JfZGVmYXVsdC5wYWNrKGNvbG9yc1tpXSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIH0KICAgICAgICBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrKHZhbHVlLl9lbGxpcHNvaWQsIGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IEVsbGlwc29pZF9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrKHZhbHVlLl92ZXJ0ZXhGb3JtYXQsIGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IFZlcnRleEZvcm1hdF9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX3dpZHRoOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS5fY29sb3JzUGVyVmVydGV4ID8gMSA6IDA7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9hcmNUeXBlOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXhdID0gdmFsdWUuX2dyYW51bGFyaXR5OwogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfTsKICAgICAgc2NyYXRjaEVsbGlwc29pZDggPSBFbGxpcHNvaWRfZGVmYXVsdC5jbG9uZShFbGxpcHNvaWRfZGVmYXVsdC5VTklUX1NQSEVSRSk7CiAgICAgIHNjcmF0Y2hWZXJ0ZXhGb3JtYXQxMCA9IG5ldyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoT3B0aW9uczE2ID0gewogICAgICAgIHBvc2l0aW9uczogdm9pZCAwLAogICAgICAgIGNvbG9yczogdm9pZCAwLAogICAgICAgIGVsbGlwc29pZDogc2NyYXRjaEVsbGlwc29pZDgsCiAgICAgICAgdmVydGV4Rm9ybWF0OiBzY3JhdGNoVmVydGV4Rm9ybWF0MTAsCiAgICAgICAgd2lkdGg6IHZvaWQgMCwKICAgICAgICBjb2xvcnNQZXJWZXJ0ZXg6IHZvaWQgMCwKICAgICAgICBhcmNUeXBlOiB2b2lkIDAsCiAgICAgICAgZ3JhbnVsYXJpdHk6IHZvaWQgMAogICAgICB9OwogICAgICBQb2x5bGluZUdlb21ldHJ5LnVucGFjayA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydGluZ0luZGV4LCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhcnJheSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhcnJheSBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGxldCBpOwogICAgICAgIGxldCBsZW5ndGggPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSwgc3RhcnRpbmdJbmRleCArPSBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoKSB7CiAgICAgICAgICBwb3NpdGlvbnNbaV0gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICB9CiAgICAgICAgbGVuZ3RoID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBjb2xvcnMgPSBsZW5ndGggPiAwID8gbmV3IEFycmF5KGxlbmd0aCkgOiB2b2lkIDA7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpLCBzdGFydGluZ0luZGV4ICs9IENvbG9yX2RlZmF1bHQucGFja2VkTGVuZ3RoKSB7CiAgICAgICAgICBjb2xvcnNbaV0gPSBDb2xvcl9kZWZhdWx0LnVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LnVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCwgc2NyYXRjaEVsbGlwc29pZDgpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gRWxsaXBzb2lkX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGNvbnN0IHZlcnRleEZvcm1hdCA9IFZlcnRleEZvcm1hdF9kZWZhdWx0LnVucGFjaygKICAgICAgICAgIGFycmF5LAogICAgICAgICAgc3RhcnRpbmdJbmRleCwKICAgICAgICAgIHNjcmF0Y2hWZXJ0ZXhGb3JtYXQxMAogICAgICAgICk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgY29uc3Qgd2lkdGggPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IGNvbG9yc1BlclZlcnRleCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPT09IDE7CiAgICAgICAgY29uc3QgYXJjVHlwZSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgZ3JhbnVsYXJpdHkgPSBhcnJheVtzdGFydGluZ0luZGV4XTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczE2LnBvc2l0aW9ucyA9IHBvc2l0aW9uczsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTYuY29sb3JzID0gY29sb3JzOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxNi53aWR0aCA9IHdpZHRoOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxNi5jb2xvcnNQZXJWZXJ0ZXggPSBjb2xvcnNQZXJWZXJ0ZXg7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczE2LmFyY1R5cGUgPSBhcmNUeXBlOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxNi5ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwogICAgICAgICAgcmV0dXJuIG5ldyBQb2x5bGluZUdlb21ldHJ5KHNjcmF0Y2hPcHRpb25zMTYpOwogICAgICAgIH0KICAgICAgICByZXN1bHQuX3Bvc2l0aW9ucyA9IHBvc2l0aW9uczsKICAgICAgICByZXN1bHQuX2NvbG9ycyA9IGNvbG9yczsKICAgICAgICByZXN1bHQuX2VsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKGVsbGlwc29pZCwgcmVzdWx0Ll9lbGxpcHNvaWQpOwogICAgICAgIHJlc3VsdC5fdmVydGV4Rm9ybWF0ID0gVmVydGV4Rm9ybWF0X2RlZmF1bHQuY2xvbmUodmVydGV4Rm9ybWF0LCByZXN1bHQuX3ZlcnRleEZvcm1hdCk7CiAgICAgICAgcmVzdWx0Ll93aWR0aCA9IHdpZHRoOwogICAgICAgIHJlc3VsdC5fY29sb3JzUGVyVmVydGV4ID0gY29sb3JzUGVyVmVydGV4OwogICAgICAgIHJlc3VsdC5fYXJjVHlwZSA9IGFyY1R5cGU7CiAgICAgICAgcmVzdWx0Ll9ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zOCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFBvc2l0aW9uNCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFByZXZQb3NpdGlvbiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaE5leHRQb3NpdGlvbiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgUG9seWxpbmVHZW9tZXRyeS5jcmVhdGVHZW9tZXRyeSA9IGZ1bmN0aW9uKHBvbHlsaW5lR2VvbWV0cnkpIHsKICAgICAgICBjb25zdCB3aWR0aCA9IHBvbHlsaW5lR2VvbWV0cnkuX3dpZHRoOwogICAgICAgIGNvbnN0IHZlcnRleEZvcm1hdCA9IHBvbHlsaW5lR2VvbWV0cnkuX3ZlcnRleEZvcm1hdDsKICAgICAgICBsZXQgY29sb3JzID0gcG9seWxpbmVHZW9tZXRyeS5fY29sb3JzOwogICAgICAgIGNvbnN0IGNvbG9yc1BlclZlcnRleCA9IHBvbHlsaW5lR2VvbWV0cnkuX2NvbG9yc1BlclZlcnRleDsKICAgICAgICBjb25zdCBhcmNUeXBlID0gcG9seWxpbmVHZW9tZXRyeS5fYXJjVHlwZTsKICAgICAgICBjb25zdCBncmFudWxhcml0eSA9IHBvbHlsaW5lR2VvbWV0cnkuX2dyYW51bGFyaXR5OwogICAgICAgIGNvbnN0IGVsbGlwc29pZCA9IHBvbHlsaW5lR2VvbWV0cnkuX2VsbGlwc29pZDsKICAgICAgICBsZXQgaTsKICAgICAgICBsZXQgajsKICAgICAgICBsZXQgazsKICAgICAgICBjb25zdCByZW1vdmVkSW5kaWNlcyA9IFtdOwogICAgICAgIGxldCBwb3NpdGlvbnMgPSBhcnJheVJlbW92ZUR1cGxpY2F0ZXNfZGVmYXVsdCgKICAgICAgICAgIHBvbHlsaW5lR2VvbWV0cnkuX3Bvc2l0aW9ucywKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5lcXVhbHNFcHNpbG9uLAogICAgICAgICAgZmFsc2UsCiAgICAgICAgICByZW1vdmVkSW5kaWNlcwogICAgICAgICk7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChjb2xvcnMpICYmIHJlbW92ZWRJbmRpY2VzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGxldCByZW1vdmVkQXJyYXlJbmRleCA9IDA7CiAgICAgICAgICBsZXQgbmV4dFJlbW92ZWRJbmRleCA9IHJlbW92ZWRJbmRpY2VzWzBdOwogICAgICAgICAgY29sb3JzID0gY29sb3JzLmZpbHRlcihmdW5jdGlvbihjb2xvciwgaW5kZXgyKSB7CiAgICAgICAgICAgIGxldCByZW1vdmUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKGNvbG9yc1BlclZlcnRleCkgewogICAgICAgICAgICAgIHJlbW92ZSA9IGluZGV4MiA9PT0gbmV4dFJlbW92ZWRJbmRleCB8fCBpbmRleDIgPT09IDAgJiYgbmV4dFJlbW92ZWRJbmRleCA9PT0gMTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZW1vdmUgPSBpbmRleDIgKyAxID09PSBuZXh0UmVtb3ZlZEluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZW1vdmUpIHsKICAgICAgICAgICAgICByZW1vdmVkQXJyYXlJbmRleCsrOwogICAgICAgICAgICAgIG5leHRSZW1vdmVkSW5kZXggPSByZW1vdmVkSW5kaWNlc1tyZW1vdmVkQXJyYXlJbmRleF07CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGxldCBwb3NpdGlvbnNMZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGlmIChwb3NpdGlvbnNMZW5ndGggPCAyIHx8IHdpZHRoIDw9IDApIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGlmIChhcmNUeXBlID09PSBBcmNUeXBlX2RlZmF1bHQuR0VPREVTSUMgfHwgYXJjVHlwZSA9PT0gQXJjVHlwZV9kZWZhdWx0LlJIVU1CKSB7CiAgICAgICAgICBsZXQgc3ViZGl2aXNpb25TaXplOwogICAgICAgICAgbGV0IG51bWJlck9mUG9pbnRzRnVuY3Rpb247CiAgICAgICAgICBpZiAoYXJjVHlwZSA9PT0gQXJjVHlwZV9kZWZhdWx0LkdFT0RFU0lDKSB7CiAgICAgICAgICAgIHN1YmRpdmlzaW9uU2l6ZSA9IE1hdGhfZGVmYXVsdC5jaG9yZExlbmd0aCgKICAgICAgICAgICAgICBncmFudWxhcml0eSwKICAgICAgICAgICAgICBlbGxpcHNvaWQubWF4aW11bVJhZGl1cwogICAgICAgICAgICApOwogICAgICAgICAgICBudW1iZXJPZlBvaW50c0Z1bmN0aW9uID0gUG9seWxpbmVQaXBlbGluZV9kZWZhdWx0Lm51bWJlck9mUG9pbnRzOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3ViZGl2aXNpb25TaXplID0gZ3JhbnVsYXJpdHk7CiAgICAgICAgICAgIG51bWJlck9mUG9pbnRzRnVuY3Rpb24gPSBQb2x5bGluZVBpcGVsaW5lX2RlZmF1bHQubnVtYmVyT2ZQb2ludHNSaHVtYkxpbmU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBoZWlnaHRzID0gUG9seWxpbmVQaXBlbGluZV9kZWZhdWx0LmV4dHJhY3RIZWlnaHRzKHBvc2l0aW9ucywgZWxsaXBzb2lkKTsKICAgICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoY29sb3JzKSkgewogICAgICAgICAgICBsZXQgY29sb3JMZW5ndGggPSAxOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcG9zaXRpb25zTGVuZ3RoIC0gMTsgKytpKSB7CiAgICAgICAgICAgICAgY29sb3JMZW5ndGggKz0gbnVtYmVyT2ZQb2ludHNGdW5jdGlvbigKICAgICAgICAgICAgICAgIHBvc2l0aW9uc1tpXSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uc1tpICsgMV0sCiAgICAgICAgICAgICAgICBzdWJkaXZpc2lvblNpemUKICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IG5ld0NvbG9ycyA9IG5ldyBBcnJheShjb2xvckxlbmd0aCk7CiAgICAgICAgICAgIGxldCBuZXdDb2xvckluZGV4ID0gMDsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBvc2l0aW9uc0xlbmd0aCAtIDE7ICsraSkgewogICAgICAgICAgICAgIGNvbnN0IHAwID0gcG9zaXRpb25zW2ldOwogICAgICAgICAgICAgIGNvbnN0IHAxID0gcG9zaXRpb25zW2kgKyAxXTsKICAgICAgICAgICAgICBjb25zdCBjMCA9IGNvbG9yc1tpXTsKICAgICAgICAgICAgICBjb25zdCBudW1Db2xvcnMgPSBudW1iZXJPZlBvaW50c0Z1bmN0aW9uKHAwLCBwMSwgc3ViZGl2aXNpb25TaXplKTsKICAgICAgICAgICAgICBpZiAoY29sb3JzUGVyVmVydGV4ICYmIGkgPCBjb2xvckxlbmd0aCkgewogICAgICAgICAgICAgICAgY29uc3QgYzEgPSBjb2xvcnNbaSArIDFdOwogICAgICAgICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkQ29sb3JzID0gaW50ZXJwb2xhdGVDb2xvcnMoCiAgICAgICAgICAgICAgICAgIHAwLAogICAgICAgICAgICAgICAgICBwMSwKICAgICAgICAgICAgICAgICAgYzAsCiAgICAgICAgICAgICAgICAgIGMxLAogICAgICAgICAgICAgICAgICBudW1Db2xvcnMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRDb2xvcnNMZW5ndGggPSBpbnRlcnBvbGF0ZWRDb2xvcnMubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGludGVycG9sYXRlZENvbG9yc0xlbmd0aDsgKytqKSB7CiAgICAgICAgICAgICAgICAgIG5ld0NvbG9yc1tuZXdDb2xvckluZGV4KytdID0gaW50ZXJwb2xhdGVkQ29sb3JzW2pdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtQ29sb3JzOyArK2opIHsKICAgICAgICAgICAgICAgICAgbmV3Q29sb3JzW25ld0NvbG9ySW5kZXgrK10gPSBDb2xvcl9kZWZhdWx0LmNsb25lKGMwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV3Q29sb3JzW25ld0NvbG9ySW5kZXhdID0gQ29sb3JfZGVmYXVsdC5jbG9uZShjb2xvcnNbY29sb3JzLmxlbmd0aCAtIDFdKTsKICAgICAgICAgICAgY29sb3JzID0gbmV3Q29sb3JzOwogICAgICAgICAgICBzY3JhdGNoSW50ZXJwb2xhdGVDb2xvcnNBcnJheS5sZW5ndGggPSAwOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGFyY1R5cGUgPT09IEFyY1R5cGVfZGVmYXVsdC5HRU9ERVNJQykgewogICAgICAgICAgICBwb3NpdGlvbnMgPSBQb2x5bGluZVBpcGVsaW5lX2RlZmF1bHQuZ2VuZXJhdGVDYXJ0ZXNpYW5BcmMoewogICAgICAgICAgICAgIHBvc2l0aW9ucywKICAgICAgICAgICAgICBtaW5EaXN0YW5jZTogc3ViZGl2aXNpb25TaXplLAogICAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodHMKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwb3NpdGlvbnMgPSBQb2x5bGluZVBpcGVsaW5lX2RlZmF1bHQuZ2VuZXJhdGVDYXJ0ZXNpYW5SaHVtYkFyYyh7CiAgICAgICAgICAgICAgcG9zaXRpb25zLAogICAgICAgICAgICAgIGdyYW51bGFyaXR5OiBzdWJkaXZpc2lvblNpemUsCiAgICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0cwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcG9zaXRpb25zTGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aDsKICAgICAgICBjb25zdCBzaXplID0gcG9zaXRpb25zTGVuZ3RoICogNCAtIDQ7CiAgICAgICAgY29uc3QgZmluYWxQb3NpdGlvbnMgPSBuZXcgRmxvYXQ2NEFycmF5KHNpemUgKiAzKTsKICAgICAgICBjb25zdCBwcmV2UG9zaXRpb25zID0gbmV3IEZsb2F0NjRBcnJheShzaXplICogMyk7CiAgICAgICAgY29uc3QgbmV4dFBvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSAqIDMpOwogICAgICAgIGNvbnN0IGV4cGFuZEFuZFdpZHRoID0gbmV3IEZsb2F0MzJBcnJheShzaXplICogMik7CiAgICAgICAgY29uc3Qgc3QgPSB2ZXJ0ZXhGb3JtYXQuc3QgPyBuZXcgRmxvYXQzMkFycmF5KHNpemUgKiAyKSA6IHZvaWQgMDsKICAgICAgICBjb25zdCBmaW5hbENvbG9ycyA9IGRlZmluZWRfZGVmYXVsdChjb2xvcnMpID8gbmV3IFVpbnQ4QXJyYXkoc2l6ZSAqIDQpIDogdm9pZCAwOwogICAgICAgIGxldCBwb3NpdGlvbkluZGV4ID0gMDsKICAgICAgICBsZXQgZXhwYW5kQW5kV2lkdGhJbmRleCA9IDA7CiAgICAgICAgbGV0IHN0SW5kZXggPSAwOwogICAgICAgIGxldCBjb2xvckluZGV4ID0gMDsKICAgICAgICBsZXQgcG9zaXRpb247CiAgICAgICAgZm9yIChqID0gMDsgaiA8IHBvc2l0aW9uc0xlbmd0aDsgKytqKSB7CiAgICAgICAgICBpZiAoaiA9PT0gMCkgewogICAgICAgICAgICBwb3NpdGlvbiA9IHNjcmF0Y2hDYXJ0ZXNpYW4zODsKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KHBvc2l0aW9uc1swXSwgcG9zaXRpb25zWzFdLCBwb3NpdGlvbik7CiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQocG9zaXRpb25zWzBdLCBwb3NpdGlvbiwgcG9zaXRpb24pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbnNbaiAtIDFdOwogICAgICAgICAgfQogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKHBvc2l0aW9uLCBzY3JhdGNoUHJldlBvc2l0aW9uKTsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShwb3NpdGlvbnNbal0sIHNjcmF0Y2hQb3NpdGlvbjQpOwogICAgICAgICAgaWYgKGogPT09IHBvc2l0aW9uc0xlbmd0aCAtIDEpIHsKICAgICAgICAgICAgcG9zaXRpb24gPSBzY3JhdGNoQ2FydGVzaWFuMzg7CiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdCgKICAgICAgICAgICAgICBwb3NpdGlvbnNbcG9zaXRpb25zTGVuZ3RoIC0gMV0sCiAgICAgICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uc0xlbmd0aCAtIDJdLAogICAgICAgICAgICAgIHBvc2l0aW9uCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQocG9zaXRpb25zW3Bvc2l0aW9uc0xlbmd0aCAtIDFdLCBwb3NpdGlvbiwgcG9zaXRpb24pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbnNbaiArIDFdOwogICAgICAgICAgfQogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKHBvc2l0aW9uLCBzY3JhdGNoTmV4dFBvc2l0aW9uKTsKICAgICAgICAgIGxldCBjb2xvcjAsIGNvbG9yMTsKICAgICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoZmluYWxDb2xvcnMpKSB7CiAgICAgICAgICAgIGlmIChqICE9PSAwICYmICFjb2xvcnNQZXJWZXJ0ZXgpIHsKICAgICAgICAgICAgICBjb2xvcjAgPSBjb2xvcnNbaiAtIDFdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGNvbG9yMCA9IGNvbG9yc1tqXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaiAhPT0gcG9zaXRpb25zTGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgIGNvbG9yMSA9IGNvbG9yc1tqXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY29uc3Qgc3RhcnRLID0gaiA9PT0gMCA/IDIgOiAwOwogICAgICAgICAgY29uc3QgZW5kSyA9IGogPT09IHBvc2l0aW9uc0xlbmd0aCAtIDEgPyAyIDogNDsKICAgICAgICAgIGZvciAoayA9IHN0YXJ0SzsgayA8IGVuZEs7ICsraykgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayhzY3JhdGNoUG9zaXRpb240LCBmaW5hbFBvc2l0aW9ucywgcG9zaXRpb25JbmRleCk7CiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKHNjcmF0Y2hQcmV2UG9zaXRpb24sIHByZXZQb3NpdGlvbnMsIHBvc2l0aW9uSW5kZXgpOwogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayhzY3JhdGNoTmV4dFBvc2l0aW9uLCBuZXh0UG9zaXRpb25zLCBwb3NpdGlvbkluZGV4KTsKICAgICAgICAgICAgcG9zaXRpb25JbmRleCArPSAzOwogICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24yID0gayAtIDIgPCAwID8gLTEgOiAxOwogICAgICAgICAgICBleHBhbmRBbmRXaWR0aFtleHBhbmRBbmRXaWR0aEluZGV4KytdID0gMiAqIChrICUgMikgLSAxOwogICAgICAgICAgICBleHBhbmRBbmRXaWR0aFtleHBhbmRBbmRXaWR0aEluZGV4KytdID0gZGlyZWN0aW9uMiAqIHdpZHRoOwogICAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnN0KSB7CiAgICAgICAgICAgICAgc3Rbc3RJbmRleCsrXSA9IGogLyAocG9zaXRpb25zTGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgc3Rbc3RJbmRleCsrXSA9IE1hdGgubWF4KGV4cGFuZEFuZFdpZHRoW2V4cGFuZEFuZFdpZHRoSW5kZXggLSAyXSwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChmaW5hbENvbG9ycykpIHsKICAgICAgICAgICAgICBjb25zdCBjb2xvciA9IGsgPCAyID8gY29sb3IwIDogY29sb3IxOwogICAgICAgICAgICAgIGZpbmFsQ29sb3JzW2NvbG9ySW5kZXgrK10gPSBDb2xvcl9kZWZhdWx0LmZsb2F0VG9CeXRlKGNvbG9yLnJlZCk7CiAgICAgICAgICAgICAgZmluYWxDb2xvcnNbY29sb3JJbmRleCsrXSA9IENvbG9yX2RlZmF1bHQuZmxvYXRUb0J5dGUoY29sb3IuZ3JlZW4pOwogICAgICAgICAgICAgIGZpbmFsQ29sb3JzW2NvbG9ySW5kZXgrK10gPSBDb2xvcl9kZWZhdWx0LmZsb2F0VG9CeXRlKGNvbG9yLmJsdWUpOwogICAgICAgICAgICAgIGZpbmFsQ29sb3JzW2NvbG9ySW5kZXgrK10gPSBDb2xvcl9kZWZhdWx0LmZsb2F0VG9CeXRlKGNvbG9yLmFscGhhKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlc19kZWZhdWx0KCk7CiAgICAgICAgYXR0cmlidXRlcy5wb3NpdGlvbiA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkRPVUJMRSwKICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgICB2YWx1ZXM6IGZpbmFsUG9zaXRpb25zCiAgICAgICAgfSk7CiAgICAgICAgYXR0cmlidXRlcy5wcmV2UG9zaXRpb24gPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5ET1VCTEUsCiAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgICAgdmFsdWVzOiBwcmV2UG9zaXRpb25zCiAgICAgICAgfSk7CiAgICAgICAgYXR0cmlidXRlcy5uZXh0UG9zaXRpb24gPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5ET1VCTEUsCiAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgICAgdmFsdWVzOiBuZXh0UG9zaXRpb25zCiAgICAgICAgfSk7CiAgICAgICAgYXR0cmlidXRlcy5leHBhbmRBbmRXaWR0aCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMiwKICAgICAgICAgIHZhbHVlczogZXhwYW5kQW5kV2lkdGgKICAgICAgICB9KTsKICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnN0KSB7CiAgICAgICAgICBhdHRyaWJ1dGVzLnN0ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5GTE9BVCwKICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMiwKICAgICAgICAgICAgdmFsdWVzOiBzdAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoZmluYWxDb2xvcnMpKSB7CiAgICAgICAgICBhdHRyaWJ1dGVzLmNvbG9yID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5VTlNJR05FRF9CWVRFLAogICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiA0LAogICAgICAgICAgICB2YWx1ZXM6IGZpbmFsQ29sb3JzLAogICAgICAgICAgICBub3JtYWxpemU6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBjb25zdCBpbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkoc2l6ZSwgcG9zaXRpb25zTGVuZ3RoICogNiAtIDYpOwogICAgICAgIGxldCBpbmRleCA9IDA7CiAgICAgICAgbGV0IGluZGljZXNJbmRleCA9IDA7CiAgICAgICAgY29uc3QgbGVuZ3RoID0gcG9zaXRpb25zTGVuZ3RoIC0gMTsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuZ3RoOyArK2opIHsKICAgICAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gaW5kZXg7CiAgICAgICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IGluZGV4ICsgMjsKICAgICAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gaW5kZXggKyAxOwogICAgICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBpbmRleCArIDE7CiAgICAgICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IGluZGV4ICsgMjsKICAgICAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gaW5kZXggKyAzOwogICAgICAgICAgaW5kZXggKz0gNDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgICAgIGF0dHJpYnV0ZXMsCiAgICAgICAgICBpbmRpY2VzLAogICAgICAgICAgcHJpbWl0aXZlVHlwZTogUHJpbWl0aXZlVHlwZV9kZWZhdWx0LlRSSUFOR0xFUywKICAgICAgICAgIGJvdW5kaW5nU3BoZXJlOiBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LmZyb21Qb2ludHMocG9zaXRpb25zKSwKICAgICAgICAgIGdlb21ldHJ5VHlwZTogR2VvbWV0cnlUeXBlX2RlZmF1bHQuUE9MWUxJTkVTCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIFBvbHlsaW5lR2VvbWV0cnlfZGVmYXVsdCA9IFBvbHlsaW5lR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVQb2x5bGluZUdlb21ldHJ5LmpzCiAgdmFyIGNyZWF0ZVBvbHlsaW5lR2VvbWV0cnlfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGNyZWF0ZVBvbHlsaW5lR2VvbWV0cnlfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gY3JlYXRlUG9seWxpbmVHZW9tZXRyeV9kZWZhdWx0CiAgfSk7CiAgZnVuY3Rpb24gY3JlYXRlUG9seWxpbmVHZW9tZXRyeShwb2x5bGluZUdlb21ldHJ5LCBvZmZzZXQpIHsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQob2Zmc2V0KSkgewogICAgICBwb2x5bGluZUdlb21ldHJ5ID0gUG9seWxpbmVHZW9tZXRyeV9kZWZhdWx0LnVucGFjayhwb2x5bGluZUdlb21ldHJ5LCBvZmZzZXQpOwogICAgfQogICAgcG9seWxpbmVHZW9tZXRyeS5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUocG9seWxpbmVHZW9tZXRyeS5fZWxsaXBzb2lkKTsKICAgIHJldHVybiBQb2x5bGluZUdlb21ldHJ5X2RlZmF1bHQuY3JlYXRlR2VvbWV0cnkocG9seWxpbmVHZW9tZXRyeSk7CiAgfQogIHZhciBjcmVhdGVQb2x5bGluZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfY3JlYXRlUG9seWxpbmVHZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlUG9seWxpbmVHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X1BvbHlsaW5lR2VvbWV0cnkoKTsKICAgICAgY3JlYXRlUG9seWxpbmVHZW9tZXRyeV9kZWZhdWx0ID0gY3JlYXRlUG9seWxpbmVHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1BvbHlsaW5lVm9sdW1lR2VvbWV0cnkuanMKICBmdW5jdGlvbiBjb21wdXRlQXR0cmlidXRlczIoY29tYmluZWRQb3NpdGlvbnMsIHNoYXBlLCBib3VuZGluZ1JlY3RhbmdsZSwgdmVydGV4Rm9ybWF0KSB7CiAgICBjb25zdCBhdHRyaWJ1dGVzID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlc19kZWZhdWx0KCk7CiAgICBpZiAodmVydGV4Rm9ybWF0LnBvc2l0aW9uKSB7CiAgICAgIGF0dHJpYnV0ZXMucG9zaXRpb24gPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRE9VQkxFLAogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgdmFsdWVzOiBjb21iaW5lZFBvc2l0aW9ucwogICAgICB9KTsKICAgIH0KICAgIGNvbnN0IHNoYXBlTGVuZ3RoID0gc2hhcGUubGVuZ3RoOwogICAgY29uc3QgdmVydGV4Q291bnQgPSBjb21iaW5lZFBvc2l0aW9ucy5sZW5ndGggLyAzOwogICAgY29uc3QgbGVuZ3RoID0gKHZlcnRleENvdW50IC0gc2hhcGVMZW5ndGggKiAyKSAvIChzaGFwZUxlbmd0aCAqIDIpOwogICAgY29uc3QgZmlyc3RFbmRJbmRpY2VzID0gUG9seWdvblBpcGVsaW5lX2RlZmF1bHQudHJpYW5ndWxhdGUoc2hhcGUpOwogICAgY29uc3QgaW5kaWNlc0NvdW50ID0gKGxlbmd0aCAtIDEpICogc2hhcGVMZW5ndGggKiA2ICsgZmlyc3RFbmRJbmRpY2VzLmxlbmd0aCAqIDI7CiAgICBjb25zdCBpbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkodmVydGV4Q291bnQsIGluZGljZXNDb3VudCk7CiAgICBsZXQgaSwgajsKICAgIGxldCBsbCwgdWwsIHVyLCBscjsKICAgIGNvbnN0IG9mZnNldCA9IHNoYXBlTGVuZ3RoICogMjsKICAgIGxldCBpbmRleCA9IDA7CiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgIGZvciAoaiA9IDA7IGogPCBzaGFwZUxlbmd0aCAtIDE7IGorKykgewogICAgICAgIGxsID0gaiAqIDIgKyBpICogc2hhcGVMZW5ndGggKiAyOwogICAgICAgIGxyID0gbGwgKyBvZmZzZXQ7CiAgICAgICAgdWwgPSBsbCArIDE7CiAgICAgICAgdXIgPSB1bCArIG9mZnNldDsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gdWw7CiAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGxsOwogICAgICAgIGluZGljZXNbaW5kZXgrK10gPSB1cjsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gdXI7CiAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGxsOwogICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBscjsKICAgICAgfQogICAgICBsbCA9IHNoYXBlTGVuZ3RoICogMiAtIDIgKyBpICogc2hhcGVMZW5ndGggKiAyOwogICAgICB1bCA9IGxsICsgMTsKICAgICAgdXIgPSB1bCArIG9mZnNldDsKICAgICAgbHIgPSBsbCArIG9mZnNldDsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IHVsOwogICAgICBpbmRpY2VzW2luZGV4KytdID0gbGw7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSB1cjsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IHVyOwogICAgICBpbmRpY2VzW2luZGV4KytdID0gbGw7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSBscjsKICAgIH0KICAgIGlmICh2ZXJ0ZXhGb3JtYXQuc3QgfHwgdmVydGV4Rm9ybWF0LnRhbmdlbnQgfHwgdmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgewogICAgICBjb25zdCBzdCA9IG5ldyBGbG9hdDMyQXJyYXkodmVydGV4Q291bnQgKiAyKTsKICAgICAgY29uc3QgbGVuZ3RoU3QgPSAxIC8gKGxlbmd0aCAtIDEpOwogICAgICBjb25zdCBoZWlnaHRTdCA9IDEgLyBib3VuZGluZ1JlY3RhbmdsZS5oZWlnaHQ7CiAgICAgIGNvbnN0IGhlaWdodE9mZnNldCA9IGJvdW5kaW5nUmVjdGFuZ2xlLmhlaWdodCAvIDI7CiAgICAgIGxldCBzLCB0OwogICAgICBsZXQgc3RpbmRleCA9IDA7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgIHMgPSBpICogbGVuZ3RoU3Q7CiAgICAgICAgdCA9IGhlaWdodFN0ICogKHNoYXBlWzBdLnkgKyBoZWlnaHRPZmZzZXQpOwogICAgICAgIHN0W3N0aW5kZXgrK10gPSBzOwogICAgICAgIHN0W3N0aW5kZXgrK10gPSB0OwogICAgICAgIGZvciAoaiA9IDE7IGogPCBzaGFwZUxlbmd0aDsgaisrKSB7CiAgICAgICAgICB0ID0gaGVpZ2h0U3QgKiAoc2hhcGVbal0ueSArIGhlaWdodE9mZnNldCk7CiAgICAgICAgICBzdFtzdGluZGV4KytdID0gczsKICAgICAgICAgIHN0W3N0aW5kZXgrK10gPSB0OwogICAgICAgICAgc3Rbc3RpbmRleCsrXSA9IHM7CiAgICAgICAgICBzdFtzdGluZGV4KytdID0gdDsKICAgICAgICB9CiAgICAgICAgdCA9IGhlaWdodFN0ICogKHNoYXBlWzBdLnkgKyBoZWlnaHRPZmZzZXQpOwogICAgICAgIHN0W3N0aW5kZXgrK10gPSBzOwogICAgICAgIHN0W3N0aW5kZXgrK10gPSB0OwogICAgICB9CiAgICAgIGZvciAoaiA9IDA7IGogPCBzaGFwZUxlbmd0aDsgaisrKSB7CiAgICAgICAgcyA9IDA7CiAgICAgICAgdCA9IGhlaWdodFN0ICogKHNoYXBlW2pdLnkgKyBoZWlnaHRPZmZzZXQpOwogICAgICAgIHN0W3N0aW5kZXgrK10gPSBzOwogICAgICAgIHN0W3N0aW5kZXgrK10gPSB0OwogICAgICB9CiAgICAgIGZvciAoaiA9IDA7IGogPCBzaGFwZUxlbmd0aDsgaisrKSB7CiAgICAgICAgcyA9IChsZW5ndGggLSAxKSAqIGxlbmd0aFN0OwogICAgICAgIHQgPSBoZWlnaHRTdCAqIChzaGFwZVtqXS55ICsgaGVpZ2h0T2Zmc2V0KTsKICAgICAgICBzdFtzdGluZGV4KytdID0gczsKICAgICAgICBzdFtzdGluZGV4KytdID0gdDsKICAgICAgfQogICAgICBhdHRyaWJ1dGVzLnN0ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDIsCiAgICAgICAgdmFsdWVzOiBuZXcgRmxvYXQzMkFycmF5KHN0KQogICAgICB9KTsKICAgIH0KICAgIGNvbnN0IGVuZE9mZnNldCA9IHZlcnRleENvdW50IC0gc2hhcGVMZW5ndGggKiAyOwogICAgZm9yIChpID0gMDsgaSA8IGZpcnN0RW5kSW5kaWNlcy5sZW5ndGg7IGkgKz0gMykgewogICAgICBjb25zdCB2MDIgPSBmaXJzdEVuZEluZGljZXNbaV0gKyBlbmRPZmZzZXQ7CiAgICAgIGNvbnN0IHYxMiA9IGZpcnN0RW5kSW5kaWNlc1tpICsgMV0gKyBlbmRPZmZzZXQ7CiAgICAgIGNvbnN0IHYyMiA9IGZpcnN0RW5kSW5kaWNlc1tpICsgMl0gKyBlbmRPZmZzZXQ7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSB2MDI7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSB2MTI7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSB2MjI7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSB2MjIgKyBzaGFwZUxlbmd0aDsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IHYxMiArIHNoYXBlTGVuZ3RoOwogICAgICBpbmRpY2VzW2luZGV4KytdID0gdjAyICsgc2hhcGVMZW5ndGg7CiAgICB9CiAgICBsZXQgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cnlfZGVmYXVsdCh7CiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIGluZGljZXMsCiAgICAgIGJvdW5kaW5nU3BoZXJlOiBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LmZyb21WZXJ0aWNlcyhjb21iaW5lZFBvc2l0aW9ucyksCiAgICAgIHByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5UUklBTkdMRVMKICAgIH0pOwogICAgaWYgKHZlcnRleEZvcm1hdC5ub3JtYWwpIHsKICAgICAgZ2VvbWV0cnkgPSBHZW9tZXRyeVBpcGVsaW5lX2RlZmF1bHQuY29tcHV0ZU5vcm1hbChnZW9tZXRyeSk7CiAgICB9CiAgICBpZiAodmVydGV4Rm9ybWF0LnRhbmdlbnQgfHwgdmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgewogICAgICB0cnkgewogICAgICAgIGdlb21ldHJ5ID0gR2VvbWV0cnlQaXBlbGluZV9kZWZhdWx0LmNvbXB1dGVUYW5nZW50QW5kQml0YW5nZW50KGdlb21ldHJ5KTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIG9uZVRpbWVXYXJuaW5nX2RlZmF1bHQoCiAgICAgICAgICAicG9seWxpbmUtdm9sdW1lLXRhbmdlbnQtYml0YW5nZW50IiwKICAgICAgICAgICJVbmFibGUgdG8gY29tcHV0ZSB0YW5nZW50cyBhbmQgYml0YW5nZW50cyBmb3IgcG9seWxpbmUgdm9sdW1lIGdlb21ldHJ5IgogICAgICAgICk7CiAgICAgIH0KICAgICAgaWYgKCF2ZXJ0ZXhGb3JtYXQudGFuZ2VudCkgewogICAgICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMudGFuZ2VudCA9IHZvaWQgMDsKICAgICAgfQogICAgICBpZiAoIXZlcnRleEZvcm1hdC5iaXRhbmdlbnQpIHsKICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLmJpdGFuZ2VudCA9IHZvaWQgMDsKICAgICAgfQogICAgICBpZiAoIXZlcnRleEZvcm1hdC5zdCkgewogICAgICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMuc3QgPSB2b2lkIDA7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBnZW9tZXRyeTsKICB9CiAgZnVuY3Rpb24gUG9seWxpbmVWb2x1bWVHZW9tZXRyeShvcHRpb25zKSB7CiAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICBjb25zdCBwb3NpdGlvbnMgPSBvcHRpb25zLnBvbHlsaW5lUG9zaXRpb25zOwogICAgY29uc3Qgc2hhcGUgPSBvcHRpb25zLnNoYXBlUG9zaXRpb25zOwogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocG9zaXRpb25zKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgib3B0aW9ucy5wb2x5bGluZVBvc2l0aW9ucyBpcyByZXF1aXJlZC4iKTsKICAgIH0KICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHNoYXBlKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgib3B0aW9ucy5zaGFwZVBvc2l0aW9ucyBpcyByZXF1aXJlZC4iKTsKICAgIH0KICAgIHRoaXMuX3Bvc2l0aW9ucyA9IHBvc2l0aW9uczsKICAgIHRoaXMuX3NoYXBlID0gc2hhcGU7CiAgICB0aGlzLl9lbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC5jbG9uZShvcHRpb25zLmVsbGlwc29pZCA/PyBFbGxpcHNvaWRfZGVmYXVsdC5kZWZhdWx0KTsKICAgIHRoaXMuX2Nvcm5lclR5cGUgPSBvcHRpb25zLmNvcm5lclR5cGUgPz8gQ29ybmVyVHlwZV9kZWZhdWx0LlJPVU5ERUQ7CiAgICB0aGlzLl92ZXJ0ZXhGb3JtYXQgPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5jbG9uZSgKICAgICAgb3B0aW9ucy52ZXJ0ZXhGb3JtYXQgPz8gVmVydGV4Rm9ybWF0X2RlZmF1bHQuREVGQVVMVAogICAgKTsKICAgIHRoaXMuX2dyYW51bGFyaXR5ID0gb3B0aW9ucy5ncmFudWxhcml0eSA/PyBNYXRoX2RlZmF1bHQuUkFESUFOU19QRVJfREVHUkVFOwogICAgdGhpcy5fd29ya2VyTmFtZSA9ICJjcmVhdGVQb2x5bGluZVZvbHVtZUdlb21ldHJ5IjsKICAgIGxldCBudW1Db21wb25lbnRzID0gMSArIHBvc2l0aW9ucy5sZW5ndGggKiBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgbnVtQ29tcG9uZW50cyArPSAxICsgc2hhcGUubGVuZ3RoICogQ2FydGVzaWFuMl9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgIHRoaXMucGFja2VkTGVuZ3RoID0gbnVtQ29tcG9uZW50cyArIEVsbGlwc29pZF9kZWZhdWx0LnBhY2tlZExlbmd0aCArIFZlcnRleEZvcm1hdF9kZWZhdWx0LnBhY2tlZExlbmd0aCArIDI7CiAgfQogIHZhciBzY3JhdGNoRWxsaXBzb2lkOSwgc2NyYXRjaFZlcnRleEZvcm1hdDExLCBzY3JhdGNoT3B0aW9uczE3LCBiclNjcmF0Y2gsIFBvbHlsaW5lVm9sdW1lR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9Qb2x5bGluZVZvbHVtZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Qb2x5bGluZVZvbHVtZUdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9hcnJheVJlbW92ZUR1cGxpY2F0ZXMoKTsKICAgICAgaW5pdF9Cb3VuZGluZ1JlY3RhbmdsZSgpOwogICAgICBpbml0X0JvdW5kaW5nU3BoZXJlKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMigpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9Db21wb25lbnREYXRhdHlwZSgpOwogICAgICBpbml0X0Nvcm5lclR5cGUoKTsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9HZW9tZXRyeSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlKCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGVzKCk7CiAgICAgIGluaXRfR2VvbWV0cnlQaXBlbGluZSgpOwogICAgICBpbml0X0luZGV4RGF0YXR5cGUoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGluaXRfb25lVGltZVdhcm5pbmcoKTsKICAgICAgaW5pdF9Qb2x5Z29uUGlwZWxpbmUoKTsKICAgICAgaW5pdF9Qb2x5bGluZVZvbHVtZUdlb21ldHJ5TGlicmFyeSgpOwogICAgICBpbml0X1ByaW1pdGl2ZVR5cGUoKTsKICAgICAgaW5pdF9WZXJ0ZXhGb3JtYXQoKTsKICAgICAgaW5pdF9XaW5kaW5nT3JkZXIoKTsKICAgICAgUG9seWxpbmVWb2x1bWVHZW9tZXRyeS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodmFsdWUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgidmFsdWUgaXMgcmVxdWlyZWQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYXJyYXkpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXJyYXkgaXMgcmVxdWlyZWQiKTsKICAgICAgICB9CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBsZXQgaTsKICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSB2YWx1ZS5fcG9zaXRpb25zOwogICAgICAgIGxldCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSBsZW5ndGg7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpLCBzdGFydGluZ0luZGV4ICs9IENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGgpIHsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKHBvc2l0aW9uc1tpXSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIH0KICAgICAgICBjb25zdCBzaGFwZSA9IHZhbHVlLl9zaGFwZTsKICAgICAgICBsZW5ndGggPSBzaGFwZS5sZW5ndGg7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IGxlbmd0aDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2ksIHN0YXJ0aW5nSW5kZXggKz0gQ2FydGVzaWFuMl9kZWZhdWx0LnBhY2tlZExlbmd0aCkgewogICAgICAgICAgQ2FydGVzaWFuMl9kZWZhdWx0LnBhY2soc2hhcGVbaV0sIGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICB9CiAgICAgICAgRWxsaXBzb2lkX2RlZmF1bHQucGFjayh2YWx1ZS5fZWxsaXBzb2lkLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgVmVydGV4Rm9ybWF0X2RlZmF1bHQucGFjayh2YWx1ZS5fdmVydGV4Rm9ybWF0LCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9jb3JuZXJUeXBlOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXhdID0gdmFsdWUuX2dyYW51bGFyaXR5OwogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfTsKICAgICAgc2NyYXRjaEVsbGlwc29pZDkgPSBFbGxpcHNvaWRfZGVmYXVsdC5jbG9uZShFbGxpcHNvaWRfZGVmYXVsdC5VTklUX1NQSEVSRSk7CiAgICAgIHNjcmF0Y2hWZXJ0ZXhGb3JtYXQxMSA9IG5ldyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoT3B0aW9uczE3ID0gewogICAgICAgIHBvbHlsaW5lUG9zaXRpb25zOiB2b2lkIDAsCiAgICAgICAgc2hhcGVQb3NpdGlvbnM6IHZvaWQgMCwKICAgICAgICBlbGxpcHNvaWQ6IHNjcmF0Y2hFbGxpcHNvaWQ5LAogICAgICAgIHZlcnRleEZvcm1hdDogc2NyYXRjaFZlcnRleEZvcm1hdDExLAogICAgICAgIGNvcm5lclR5cGU6IHZvaWQgMCwKICAgICAgICBncmFudWxhcml0eTogdm9pZCAwCiAgICAgIH07CiAgICAgIFBvbHlsaW5lVm9sdW1lR2VvbWV0cnkudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFycmF5KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFycmF5IGlzIHJlcXVpcmVkIik7CiAgICAgICAgfQogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgbGV0IGk7CiAgICAgICAgbGV0IGxlbmd0aCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpLCBzdGFydGluZ0luZGV4ICs9IENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGgpIHsKICAgICAgICAgIHBvc2l0aW9uc1tpXSA9IENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2soYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IHNoYXBlID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpLCBzdGFydGluZ0luZGV4ICs9IENhcnRlc2lhbjJfZGVmYXVsdC5wYWNrZWRMZW5ndGgpIHsKICAgICAgICAgIHNoYXBlW2ldID0gQ2FydGVzaWFuMl9kZWZhdWx0LnVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LnVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCwgc2NyYXRjaEVsbGlwc29pZDkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gRWxsaXBzb2lkX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGNvbnN0IHZlcnRleEZvcm1hdCA9IFZlcnRleEZvcm1hdF9kZWZhdWx0LnVucGFjaygKICAgICAgICAgIGFycmF5LAogICAgICAgICAgc3RhcnRpbmdJbmRleCwKICAgICAgICAgIHNjcmF0Y2hWZXJ0ZXhGb3JtYXQxMQogICAgICAgICk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgY29uc3QgY29ybmVyVHlwZSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgZ3JhbnVsYXJpdHkgPSBhcnJheVtzdGFydGluZ0luZGV4XTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczE3LnBvbHlsaW5lUG9zaXRpb25zID0gcG9zaXRpb25zOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxNy5zaGFwZVBvc2l0aW9ucyA9IHNoYXBlOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxNy5jb3JuZXJUeXBlID0gY29ybmVyVHlwZTsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTcuZ3JhbnVsYXJpdHkgPSBncmFudWxhcml0eTsKICAgICAgICAgIHJldHVybiBuZXcgUG9seWxpbmVWb2x1bWVHZW9tZXRyeShzY3JhdGNoT3B0aW9uczE3KTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0Ll9wb3NpdGlvbnMgPSBwb3NpdGlvbnM7CiAgICAgICAgcmVzdWx0Ll9zaGFwZSA9IHNoYXBlOwogICAgICAgIHJlc3VsdC5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUoZWxsaXBzb2lkLCByZXN1bHQuX2VsbGlwc29pZCk7CiAgICAgICAgcmVzdWx0Ll92ZXJ0ZXhGb3JtYXQgPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5jbG9uZSh2ZXJ0ZXhGb3JtYXQsIHJlc3VsdC5fdmVydGV4Rm9ybWF0KTsKICAgICAgICByZXN1bHQuX2Nvcm5lclR5cGUgPSBjb3JuZXJUeXBlOwogICAgICAgIHJlc3VsdC5fZ3JhbnVsYXJpdHkgPSBncmFudWxhcml0eTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBiclNjcmF0Y2ggPSBuZXcgQm91bmRpbmdSZWN0YW5nbGVfZGVmYXVsdCgpOwogICAgICBQb2x5bGluZVZvbHVtZUdlb21ldHJ5LmNyZWF0ZUdlb21ldHJ5ID0gZnVuY3Rpb24ocG9seWxpbmVWb2x1bWVHZW9tZXRyeSkgewogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHBvbHlsaW5lVm9sdW1lR2VvbWV0cnkuX3Bvc2l0aW9uczsKICAgICAgICBjb25zdCBjbGVhblBvc2l0aW9ucyA9IGFycmF5UmVtb3ZlRHVwbGljYXRlc19kZWZhdWx0KAogICAgICAgICAgcG9zaXRpb25zLAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24KICAgICAgICApOwogICAgICAgIGxldCBzaGFwZTJEID0gcG9seWxpbmVWb2x1bWVHZW9tZXRyeS5fc2hhcGU7CiAgICAgICAgc2hhcGUyRCA9IFBvbHlsaW5lVm9sdW1lR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQucmVtb3ZlRHVwbGljYXRlc0Zyb21TaGFwZShzaGFwZTJEKTsKICAgICAgICBpZiAoY2xlYW5Qb3NpdGlvbnMubGVuZ3RoIDwgMiB8fCBzaGFwZTJELmxlbmd0aCA8IDMpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGlmIChQb2x5Z29uUGlwZWxpbmVfZGVmYXVsdC5jb21wdXRlV2luZGluZ09yZGVyMkQoc2hhcGUyRCkgPT09IFdpbmRpbmdPcmRlcl9kZWZhdWx0LkNMT0NLV0lTRSkgewogICAgICAgICAgc2hhcGUyRC5yZXZlcnNlKCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGJvdW5kaW5nUmVjdGFuZ2xlID0gQm91bmRpbmdSZWN0YW5nbGVfZGVmYXVsdC5mcm9tUG9pbnRzKHNoYXBlMkQsIGJyU2NyYXRjaCk7CiAgICAgICAgY29uc3QgY29tcHV0ZWRQb3NpdGlvbnMgPSBQb2x5bGluZVZvbHVtZUdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmNvbXB1dGVQb3NpdGlvbnMoCiAgICAgICAgICBjbGVhblBvc2l0aW9ucywKICAgICAgICAgIHNoYXBlMkQsCiAgICAgICAgICBib3VuZGluZ1JlY3RhbmdsZSwKICAgICAgICAgIHBvbHlsaW5lVm9sdW1lR2VvbWV0cnksCiAgICAgICAgICB0cnVlCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gY29tcHV0ZUF0dHJpYnV0ZXMyKAogICAgICAgICAgY29tcHV0ZWRQb3NpdGlvbnMsCiAgICAgICAgICBzaGFwZTJELAogICAgICAgICAgYm91bmRpbmdSZWN0YW5nbGUsCiAgICAgICAgICBwb2x5bGluZVZvbHVtZUdlb21ldHJ5Ll92ZXJ0ZXhGb3JtYXQKICAgICAgICApOwogICAgICB9OwogICAgICBQb2x5bGluZVZvbHVtZUdlb21ldHJ5X2RlZmF1bHQgPSBQb2x5bGluZVZvbHVtZUdlb21ldHJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlUG9seWxpbmVWb2x1bWVHZW9tZXRyeS5qcwogIHZhciBjcmVhdGVQb2x5bGluZVZvbHVtZUdlb21ldHJ5X2V4cG9ydHMgPSB7fTsKICBfX2V4cG9ydChjcmVhdGVQb2x5bGluZVZvbHVtZUdlb21ldHJ5X2V4cG9ydHMsIHsKICAgIGRlZmF1bHQ6ICgpID0+IGNyZWF0ZVBvbHlsaW5lVm9sdW1lR2VvbWV0cnlfZGVmYXVsdAogIH0pOwogIGZ1bmN0aW9uIGNyZWF0ZVBvbHlsaW5lVm9sdW1lR2VvbWV0cnkocG9seWxpbmVWb2x1bWVHZW9tZXRyeSwgb2Zmc2V0KSB7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG9mZnNldCkpIHsKICAgICAgcG9seWxpbmVWb2x1bWVHZW9tZXRyeSA9IFBvbHlsaW5lVm9sdW1lR2VvbWV0cnlfZGVmYXVsdC51bnBhY2soCiAgICAgICAgcG9seWxpbmVWb2x1bWVHZW9tZXRyeSwKICAgICAgICBvZmZzZXQKICAgICAgKTsKICAgIH0KICAgIHBvbHlsaW5lVm9sdW1lR2VvbWV0cnkuX2VsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKAogICAgICBwb2x5bGluZVZvbHVtZUdlb21ldHJ5Ll9lbGxpcHNvaWQKICAgICk7CiAgICByZXR1cm4gUG9seWxpbmVWb2x1bWVHZW9tZXRyeV9kZWZhdWx0LmNyZWF0ZUdlb21ldHJ5KHBvbHlsaW5lVm9sdW1lR2VvbWV0cnkpOwogIH0KICB2YXIgY3JlYXRlUG9seWxpbmVWb2x1bWVHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X2NyZWF0ZVBvbHlsaW5lVm9sdW1lR2VvbWV0cnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVBvbHlsaW5lVm9sdW1lR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9Qb2x5bGluZVZvbHVtZUdlb21ldHJ5KCk7CiAgICAgIGNyZWF0ZVBvbHlsaW5lVm9sdW1lR2VvbWV0cnlfZGVmYXVsdCA9IGNyZWF0ZVBvbHlsaW5lVm9sdW1lR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Qb2x5bGluZVZvbHVtZU91dGxpbmVHZW9tZXRyeS5qcwogIGZ1bmN0aW9uIGNvbXB1dGVBdHRyaWJ1dGVzMyhwb3NpdGlvbnMsIHNoYXBlKSB7CiAgICBjb25zdCBhdHRyaWJ1dGVzID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlc19kZWZhdWx0KCk7CiAgICBhdHRyaWJ1dGVzLnBvc2l0aW9uID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5ET1VCTEUsCiAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgIHZhbHVlczogcG9zaXRpb25zCiAgICB9KTsKICAgIGNvbnN0IHNoYXBlTGVuZ3RoID0gc2hhcGUubGVuZ3RoOwogICAgY29uc3QgdmVydGV4Q291bnQgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGggLyAzOwogICAgY29uc3QgcG9zaXRpb25MZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoIC8gMzsKICAgIGNvbnN0IHNoYXBlQ291bnQgPSBwb3NpdGlvbkxlbmd0aCAvIHNoYXBlTGVuZ3RoOwogICAgY29uc3QgaW5kaWNlcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KAogICAgICB2ZXJ0ZXhDb3VudCwKICAgICAgMiAqIHNoYXBlTGVuZ3RoICogKHNoYXBlQ291bnQgKyAxKQogICAgKTsKICAgIGxldCBpLCBqOwogICAgbGV0IGluZGV4ID0gMDsKICAgIGkgPSAwOwogICAgbGV0IG9mZnNldCA9IGkgKiBzaGFwZUxlbmd0aDsKICAgIGZvciAoaiA9IDA7IGogPCBzaGFwZUxlbmd0aCAtIDE7IGorKykgewogICAgICBpbmRpY2VzW2luZGV4KytdID0gaiArIG9mZnNldDsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGogKyBvZmZzZXQgKyAxOwogICAgfQogICAgaW5kaWNlc1tpbmRleCsrXSA9IHNoYXBlTGVuZ3RoIC0gMSArIG9mZnNldDsKICAgIGluZGljZXNbaW5kZXgrK10gPSBvZmZzZXQ7CiAgICBpID0gc2hhcGVDb3VudCAtIDE7CiAgICBvZmZzZXQgPSBpICogc2hhcGVMZW5ndGg7CiAgICBmb3IgKGogPSAwOyBqIDwgc2hhcGVMZW5ndGggLSAxOyBqKyspIHsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGogKyBvZmZzZXQ7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSBqICsgb2Zmc2V0ICsgMTsKICAgIH0KICAgIGluZGljZXNbaW5kZXgrK10gPSBzaGFwZUxlbmd0aCAtIDEgKyBvZmZzZXQ7CiAgICBpbmRpY2VzW2luZGV4KytdID0gb2Zmc2V0OwogICAgZm9yIChpID0gMDsgaSA8IHNoYXBlQ291bnQgLSAxOyBpKyspIHsKICAgICAgY29uc3QgZmlyc3RPZmZzZXQgPSBzaGFwZUxlbmd0aCAqIGk7CiAgICAgIGNvbnN0IHNlY29uZE9mZnNldCA9IGZpcnN0T2Zmc2V0ICsgc2hhcGVMZW5ndGg7CiAgICAgIGZvciAoaiA9IDA7IGogPCBzaGFwZUxlbmd0aDsgaisrKSB7CiAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGogKyBmaXJzdE9mZnNldDsKICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gaiArIHNlY29uZE9mZnNldDsKICAgICAgfQogICAgfQogICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cnlfZGVmYXVsdCh7CiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIGluZGljZXM6IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KHZlcnRleENvdW50LCBpbmRpY2VzKSwKICAgICAgYm91bmRpbmdTcGhlcmU6IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQuZnJvbVZlcnRpY2VzKHBvc2l0aW9ucyksCiAgICAgIHByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5MSU5FUwogICAgfSk7CiAgICByZXR1cm4gZ2VvbWV0cnk7CiAgfQogIGZ1bmN0aW9uIFBvbHlsaW5lVm9sdW1lT3V0bGluZUdlb21ldHJ5KG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IG9wdGlvbnMucG9seWxpbmVQb3NpdGlvbnM7CiAgICBjb25zdCBzaGFwZSA9IG9wdGlvbnMuc2hhcGVQb3NpdGlvbnM7CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChwb3NpdGlvbnMpKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJvcHRpb25zLnBvbHlsaW5lUG9zaXRpb25zIGlzIHJlcXVpcmVkLiIpOwogICAgfQogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoc2hhcGUpKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJvcHRpb25zLnNoYXBlUG9zaXRpb25zIGlzIHJlcXVpcmVkLiIpOwogICAgfQogICAgdGhpcy5fcG9zaXRpb25zID0gcG9zaXRpb25zOwogICAgdGhpcy5fc2hhcGUgPSBzaGFwZTsKICAgIHRoaXMuX2VsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKG9wdGlvbnMuZWxsaXBzb2lkID8/IEVsbGlwc29pZF9kZWZhdWx0LmRlZmF1bHQpOwogICAgdGhpcy5fY29ybmVyVHlwZSA9IG9wdGlvbnMuY29ybmVyVHlwZSA/PyBDb3JuZXJUeXBlX2RlZmF1bHQuUk9VTkRFRDsKICAgIHRoaXMuX2dyYW51bGFyaXR5ID0gb3B0aW9ucy5ncmFudWxhcml0eSA/PyBNYXRoX2RlZmF1bHQuUkFESUFOU19QRVJfREVHUkVFOwogICAgdGhpcy5fd29ya2VyTmFtZSA9ICJjcmVhdGVQb2x5bGluZVZvbHVtZU91dGxpbmVHZW9tZXRyeSI7CiAgICBsZXQgbnVtQ29tcG9uZW50cyA9IDEgKyBwb3NpdGlvbnMubGVuZ3RoICogQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgIG51bUNvbXBvbmVudHMgKz0gMSArIHNoYXBlLmxlbmd0aCAqIENhcnRlc2lhbjJfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICB0aGlzLnBhY2tlZExlbmd0aCA9IG51bUNvbXBvbmVudHMgKyBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyAyOwogIH0KICB2YXIgc2NyYXRjaEVsbGlwc29pZDEwLCBzY3JhdGNoT3B0aW9uczE4LCBiclNjcmF0Y2gyLCBQb2x5bGluZVZvbHVtZU91dGxpbmVHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X1BvbHlsaW5lVm9sdW1lT3V0bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Qb2x5bGluZVZvbHVtZU91dGxpbmVHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfYXJyYXlSZW1vdmVEdXBsaWNhdGVzKCk7CiAgICAgIGluaXRfQm91bmRpbmdSZWN0YW5nbGUoKTsKICAgICAgaW5pdF9Cb3VuZGluZ1NwaGVyZSgpOwogICAgICBpbml0X0NhcnRlc2lhbjIoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ29tcG9uZW50RGF0YXR5cGUoKTsKICAgICAgaW5pdF9Db3JuZXJUeXBlKCk7CiAgICAgIGluaXRfRnJvemVuKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfR2VvbWV0cnkoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlcygpOwogICAgICBpbml0X0luZGV4RGF0YXR5cGUoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGluaXRfUG9seWdvblBpcGVsaW5lKCk7CiAgICAgIGluaXRfUG9seWxpbmVWb2x1bWVHZW9tZXRyeUxpYnJhcnkoKTsKICAgICAgaW5pdF9QcmltaXRpdmVUeXBlKCk7CiAgICAgIGluaXRfV2luZGluZ09yZGVyKCk7CiAgICAgIFBvbHlsaW5lVm9sdW1lT3V0bGluZUdlb21ldHJ5LnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh2YWx1ZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJ2YWx1ZSBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhcnJheSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhcnJheSBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGxldCBpOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHZhbHVlLl9wb3NpdGlvbnM7CiAgICAgICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IGxlbmd0aDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2ksIHN0YXJ0aW5nSW5kZXggKz0gQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aCkgewogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2socG9zaXRpb25zW2ldLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHNoYXBlID0gdmFsdWUuX3NoYXBlOwogICAgICAgIGxlbmd0aCA9IHNoYXBlLmxlbmd0aDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gbGVuZ3RoOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSwgc3RhcnRpbmdJbmRleCArPSBDYXJ0ZXNpYW4yX2RlZmF1bHQucGFja2VkTGVuZ3RoKSB7CiAgICAgICAgICBDYXJ0ZXNpYW4yX2RlZmF1bHQucGFjayhzaGFwZVtpXSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIH0KICAgICAgICBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrKHZhbHVlLl9lbGxpcHNvaWQsIGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IEVsbGlwc29pZF9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX2Nvcm5lclR5cGU7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleF0gPSB2YWx1ZS5fZ3JhbnVsYXJpdHk7CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9OwogICAgICBzY3JhdGNoRWxsaXBzb2lkMTAgPSBFbGxpcHNvaWRfZGVmYXVsdC5jbG9uZShFbGxpcHNvaWRfZGVmYXVsdC5VTklUX1NQSEVSRSk7CiAgICAgIHNjcmF0Y2hPcHRpb25zMTggPSB7CiAgICAgICAgcG9seWxpbmVQb3NpdGlvbnM6IHZvaWQgMCwKICAgICAgICBzaGFwZVBvc2l0aW9uczogdm9pZCAwLAogICAgICAgIGVsbGlwc29pZDogc2NyYXRjaEVsbGlwc29pZDEwLAogICAgICAgIGhlaWdodDogdm9pZCAwLAogICAgICAgIGNvcm5lclR5cGU6IHZvaWQgMCwKICAgICAgICBncmFudWxhcml0eTogdm9pZCAwCiAgICAgIH07CiAgICAgIFBvbHlsaW5lVm9sdW1lT3V0bGluZUdlb21ldHJ5LnVucGFjayA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydGluZ0luZGV4LCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhcnJheSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhcnJheSBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGxldCBpOwogICAgICAgIGxldCBsZW5ndGggPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSwgc3RhcnRpbmdJbmRleCArPSBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoKSB7CiAgICAgICAgICBwb3NpdGlvbnNbaV0gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICB9CiAgICAgICAgbGVuZ3RoID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBzaGFwZSA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSwgc3RhcnRpbmdJbmRleCArPSBDYXJ0ZXNpYW4yX2RlZmF1bHQucGFja2VkTGVuZ3RoKSB7CiAgICAgICAgICBzaGFwZVtpXSA9IENhcnRlc2lhbjJfZGVmYXVsdC51bnBhY2soYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIH0KICAgICAgICBjb25zdCBlbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC51bnBhY2soYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHNjcmF0Y2hFbGxpcHNvaWQxMCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgY29uc3QgY29ybmVyVHlwZSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgZ3JhbnVsYXJpdHkgPSBhcnJheVtzdGFydGluZ0luZGV4XTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczE4LnBvbHlsaW5lUG9zaXRpb25zID0gcG9zaXRpb25zOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxOC5zaGFwZVBvc2l0aW9ucyA9IHNoYXBlOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxOC5jb3JuZXJUeXBlID0gY29ybmVyVHlwZTsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTguZ3JhbnVsYXJpdHkgPSBncmFudWxhcml0eTsKICAgICAgICAgIHJldHVybiBuZXcgUG9seWxpbmVWb2x1bWVPdXRsaW5lR2VvbWV0cnkoc2NyYXRjaE9wdGlvbnMxOCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5fcG9zaXRpb25zID0gcG9zaXRpb25zOwogICAgICAgIHJlc3VsdC5fc2hhcGUgPSBzaGFwZTsKICAgICAgICByZXN1bHQuX2VsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKGVsbGlwc29pZCwgcmVzdWx0Ll9lbGxpcHNvaWQpOwogICAgICAgIHJlc3VsdC5fY29ybmVyVHlwZSA9IGNvcm5lclR5cGU7CiAgICAgICAgcmVzdWx0Ll9ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIGJyU2NyYXRjaDIgPSBuZXcgQm91bmRpbmdSZWN0YW5nbGVfZGVmYXVsdCgpOwogICAgICBQb2x5bGluZVZvbHVtZU91dGxpbmVHZW9tZXRyeS5jcmVhdGVHZW9tZXRyeSA9IGZ1bmN0aW9uKHBvbHlsaW5lVm9sdW1lT3V0bGluZUdlb21ldHJ5KSB7CiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gcG9seWxpbmVWb2x1bWVPdXRsaW5lR2VvbWV0cnkuX3Bvc2l0aW9uczsKICAgICAgICBjb25zdCBjbGVhblBvc2l0aW9ucyA9IGFycmF5UmVtb3ZlRHVwbGljYXRlc19kZWZhdWx0KAogICAgICAgICAgcG9zaXRpb25zLAogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24KICAgICAgICApOwogICAgICAgIGxldCBzaGFwZTJEID0gcG9seWxpbmVWb2x1bWVPdXRsaW5lR2VvbWV0cnkuX3NoYXBlOwogICAgICAgIHNoYXBlMkQgPSBQb2x5bGluZVZvbHVtZUdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LnJlbW92ZUR1cGxpY2F0ZXNGcm9tU2hhcGUoc2hhcGUyRCk7CiAgICAgICAgaWYgKGNsZWFuUG9zaXRpb25zLmxlbmd0aCA8IDIgfHwgc2hhcGUyRC5sZW5ndGggPCAzKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAoUG9seWdvblBpcGVsaW5lX2RlZmF1bHQuY29tcHV0ZVdpbmRpbmdPcmRlcjJEKHNoYXBlMkQpID09PSBXaW5kaW5nT3JkZXJfZGVmYXVsdC5DTE9DS1dJU0UpIHsKICAgICAgICAgIHNoYXBlMkQucmV2ZXJzZSgpOwogICAgICAgIH0KICAgICAgICBjb25zdCBib3VuZGluZ1JlY3RhbmdsZSA9IEJvdW5kaW5nUmVjdGFuZ2xlX2RlZmF1bHQuZnJvbVBvaW50cyhzaGFwZTJELCBiclNjcmF0Y2gyKTsKICAgICAgICBjb25zdCBjb21wdXRlZFBvc2l0aW9ucyA9IFBvbHlsaW5lVm9sdW1lR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuY29tcHV0ZVBvc2l0aW9ucygKICAgICAgICAgIGNsZWFuUG9zaXRpb25zLAogICAgICAgICAgc2hhcGUyRCwKICAgICAgICAgIGJvdW5kaW5nUmVjdGFuZ2xlLAogICAgICAgICAgcG9seWxpbmVWb2x1bWVPdXRsaW5lR2VvbWV0cnksCiAgICAgICAgICBmYWxzZQogICAgICAgICk7CiAgICAgICAgcmV0dXJuIGNvbXB1dGVBdHRyaWJ1dGVzMyhjb21wdXRlZFBvc2l0aW9ucywgc2hhcGUyRCk7CiAgICAgIH07CiAgICAgIFBvbHlsaW5lVm9sdW1lT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQgPSBQb2x5bGluZVZvbHVtZU91dGxpbmVHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVBvbHlsaW5lVm9sdW1lT3V0bGluZUdlb21ldHJ5LmpzCiAgdmFyIGNyZWF0ZVBvbHlsaW5lVm9sdW1lT3V0bGluZUdlb21ldHJ5X2V4cG9ydHMgPSB7fTsKICBfX2V4cG9ydChjcmVhdGVQb2x5bGluZVZvbHVtZU91dGxpbmVHZW9tZXRyeV9leHBvcnRzLCB7CiAgICBkZWZhdWx0OiAoKSA9PiBjcmVhdGVQb2x5bGluZVZvbHVtZU91dGxpbmVHZW9tZXRyeV9kZWZhdWx0CiAgfSk7CiAgZnVuY3Rpb24gY3JlYXRlUG9seWxpbmVWb2x1bWVPdXRsaW5lR2VvbWV0cnkocG9seWxpbmVWb2x1bWVPdXRsaW5lR2VvbWV0cnksIG9mZnNldCkgewogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvZmZzZXQpKSB7CiAgICAgIHBvbHlsaW5lVm9sdW1lT3V0bGluZUdlb21ldHJ5ID0gUG9seWxpbmVWb2x1bWVPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdC51bnBhY2soCiAgICAgICAgcG9seWxpbmVWb2x1bWVPdXRsaW5lR2VvbWV0cnksCiAgICAgICAgb2Zmc2V0CiAgICAgICk7CiAgICB9CiAgICBwb2x5bGluZVZvbHVtZU91dGxpbmVHZW9tZXRyeS5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUoCiAgICAgIHBvbHlsaW5lVm9sdW1lT3V0bGluZUdlb21ldHJ5Ll9lbGxpcHNvaWQKICAgICk7CiAgICByZXR1cm4gUG9seWxpbmVWb2x1bWVPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdC5jcmVhdGVHZW9tZXRyeSgKICAgICAgcG9seWxpbmVWb2x1bWVPdXRsaW5lR2VvbWV0cnkKICAgICk7CiAgfQogIHZhciBjcmVhdGVQb2x5bGluZVZvbHVtZU91dGxpbmVHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X2NyZWF0ZVBvbHlsaW5lVm9sdW1lT3V0bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVQb2x5bGluZVZvbHVtZU91dGxpbmVHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X1BvbHlsaW5lVm9sdW1lT3V0bGluZUdlb21ldHJ5KCk7CiAgICAgIGNyZWF0ZVBvbHlsaW5lVm9sdW1lT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQgPSBjcmVhdGVQb2x5bGluZVZvbHVtZU91dGxpbmVHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1JlY3RhbmdsZUdlb21ldHJ5TGlicmFyeS5qcwogIGZ1bmN0aW9uIGdldFJvdGF0aW9uT3B0aW9ucyhud0Nvcm5lciwgcm90YXRpb24sIGdyYW51bGFyaXR5WCwgZ3JhbnVsYXJpdHlZLCBjZW50ZXIsIHdpZHRoLCBoZWlnaHQpIHsKICAgIGNvbnN0IGNvc1JvdGF0aW9uID0gTWF0aC5jb3Mocm90YXRpb24pOwogICAgY29uc3QgZ3JhbllDb3MgPSBncmFudWxhcml0eVkgKiBjb3NSb3RhdGlvbjsKICAgIGNvbnN0IGdyYW5YQ29zID0gZ3JhbnVsYXJpdHlYICogY29zUm90YXRpb247CiAgICBjb25zdCBzaW5Sb3RhdGlvbiA9IE1hdGguc2luKHJvdGF0aW9uKTsKICAgIGNvbnN0IGdyYW5ZU2luID0gZ3JhbnVsYXJpdHlZICogc2luUm90YXRpb247CiAgICBjb25zdCBncmFuWFNpbiA9IGdyYW51bGFyaXR5WCAqIHNpblJvdGF0aW9uOwogICAgcHJvai5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuZGVmYXVsdDsKICAgIG53Q2FydGVzaWFuID0gcHJvai5wcm9qZWN0KG53Q29ybmVyLCBud0NhcnRlc2lhbik7CiAgICBud0NhcnRlc2lhbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChud0NhcnRlc2lhbiwgY2VudGVyQ2FydGVzaWFuLCBud0NhcnRlc2lhbik7CiAgICBjb25zdCByb3RhdGlvbk1hdHJpeCA9IE1hdHJpeDJfZGVmYXVsdC5mcm9tUm90YXRpb24ocm90YXRpb24sIHJvdGF0aW9uTWF0cml4U2NyYXRjaCk7CiAgICBud0NhcnRlc2lhbiA9IE1hdHJpeDJfZGVmYXVsdC5tdWx0aXBseUJ5VmVjdG9yKAogICAgICByb3RhdGlvbk1hdHJpeCwKICAgICAgbndDYXJ0ZXNpYW4sCiAgICAgIG53Q2FydGVzaWFuCiAgICApOwogICAgbndDYXJ0ZXNpYW4gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKG53Q2FydGVzaWFuLCBjZW50ZXJDYXJ0ZXNpYW4sIG53Q2FydGVzaWFuKTsKICAgIG53Q29ybmVyID0gcHJvai51bnByb2plY3QobndDYXJ0ZXNpYW4sIG53Q29ybmVyKTsKICAgIHdpZHRoIC09IDE7CiAgICBoZWlnaHQgLT0gMTsKICAgIGNvbnN0IGxhdGl0dWRlID0gbndDb3JuZXIubGF0aXR1ZGU7CiAgICBjb25zdCBsYXRpdHVkZTAgPSBsYXRpdHVkZSArIHdpZHRoICogZ3JhblhTaW47CiAgICBjb25zdCBsYXRpdHVkZTEgPSBsYXRpdHVkZSAtIGdyYW5ZQ29zICogaGVpZ2h0OwogICAgY29uc3QgbGF0aXR1ZGUyID0gbGF0aXR1ZGUgLSBncmFuWUNvcyAqIGhlaWdodCArIHdpZHRoICogZ3JhblhTaW47CiAgICBjb25zdCBub3J0aCA9IE1hdGgubWF4KGxhdGl0dWRlLCBsYXRpdHVkZTAsIGxhdGl0dWRlMSwgbGF0aXR1ZGUyKTsKICAgIGNvbnN0IHNvdXRoID0gTWF0aC5taW4obGF0aXR1ZGUsIGxhdGl0dWRlMCwgbGF0aXR1ZGUxLCBsYXRpdHVkZTIpOwogICAgY29uc3QgbG9uZ2l0dWRlID0gbndDb3JuZXIubG9uZ2l0dWRlOwogICAgY29uc3QgbG9uZ2l0dWRlMCA9IGxvbmdpdHVkZSArIHdpZHRoICogZ3JhblhDb3M7CiAgICBjb25zdCBsb25naXR1ZGUxID0gbG9uZ2l0dWRlICsgaGVpZ2h0ICogZ3JhbllTaW47CiAgICBjb25zdCBsb25naXR1ZGUyID0gbG9uZ2l0dWRlICsgaGVpZ2h0ICogZ3JhbllTaW4gKyB3aWR0aCAqIGdyYW5YQ29zOwogICAgY29uc3QgZWFzdCA9IE1hdGgubWF4KGxvbmdpdHVkZSwgbG9uZ2l0dWRlMCwgbG9uZ2l0dWRlMSwgbG9uZ2l0dWRlMik7CiAgICBjb25zdCB3ZXN0ID0gTWF0aC5taW4obG9uZ2l0dWRlLCBsb25naXR1ZGUwLCBsb25naXR1ZGUxLCBsb25naXR1ZGUyKTsKICAgIHJldHVybiB7CiAgICAgIG5vcnRoLAogICAgICBzb3V0aCwKICAgICAgZWFzdCwKICAgICAgd2VzdCwKICAgICAgZ3JhbllDb3MsCiAgICAgIGdyYW5ZU2luLAogICAgICBncmFuWENvcywKICAgICAgZ3JhblhTaW4sCiAgICAgIG53Q29ybmVyCiAgICB9OwogIH0KICB2YXIgY29zMywgc2luMywgc3FydCwgUmVjdGFuZ2xlR2VvbWV0cnlMaWJyYXJ5LCByb3RhdGlvbk1hdHJpeFNjcmF0Y2gsIG53Q2FydGVzaWFuLCBjZW50ZXJTY3JhdGNoMywgY2VudGVyQ2FydGVzaWFuLCBwcm9qLCBSZWN0YW5nbGVHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdDsKICB2YXIgaW5pdF9SZWN0YW5nbGVHZW9tZXRyeUxpYnJhcnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1JlY3RhbmdsZUdlb21ldHJ5TGlicmFyeS5qcyIoKSB7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRvZ3JhcGhpYygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X0dlb2dyYXBoaWNQcm9qZWN0aW9uKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBpbml0X01hdHJpeDIoKTsKICAgICAgaW5pdF9SZWN0YW5nbGUoKTsKICAgICAgY29zMyA9IE1hdGguY29zOwogICAgICBzaW4zID0gTWF0aC5zaW47CiAgICAgIHNxcnQgPSBNYXRoLnNxcnQ7CiAgICAgIFJlY3RhbmdsZUdlb21ldHJ5TGlicmFyeSA9IHt9OwogICAgICBSZWN0YW5nbGVHZW9tZXRyeUxpYnJhcnkuY29tcHV0ZVBvc2l0aW9uID0gZnVuY3Rpb24oY29tcHV0ZWRPcHRpb25zLCBlbGxpcHNvaWQsIGNvbXB1dGVTVCwgcm93LCBjb2wsIHBvc2l0aW9uLCBzdCkgewogICAgICAgIGNvbnN0IHJhZGlpU3F1YXJlZCA9IGVsbGlwc29pZC5yYWRpaVNxdWFyZWQ7CiAgICAgICAgY29uc3QgbndDb3JuZXIgPSBjb21wdXRlZE9wdGlvbnMubndDb3JuZXI7CiAgICAgICAgY29uc3QgcmVjdGFuZ2xlID0gY29tcHV0ZWRPcHRpb25zLmJvdW5kaW5nUmVjdGFuZ2xlOwogICAgICAgIGxldCBzdExhdGl0dWRlID0gbndDb3JuZXIubGF0aXR1ZGUgLSBjb21wdXRlZE9wdGlvbnMuZ3JhbllDb3MgKiByb3cgKyBjb2wgKiBjb21wdXRlZE9wdGlvbnMuZ3JhblhTaW47CiAgICAgICAgY29uc3QgY29zTGF0aXR1ZGUgPSBjb3MzKHN0TGF0aXR1ZGUpOwogICAgICAgIGNvbnN0IG5aID0gc2luMyhzdExhdGl0dWRlKTsKICAgICAgICBjb25zdCBrWiA9IHJhZGlpU3F1YXJlZC56ICogblo7CiAgICAgICAgbGV0IHN0TG9uZ2l0dWRlID0gbndDb3JuZXIubG9uZ2l0dWRlICsgcm93ICogY29tcHV0ZWRPcHRpb25zLmdyYW5ZU2luICsgY29sICogY29tcHV0ZWRPcHRpb25zLmdyYW5YQ29zOwogICAgICAgIGNvbnN0IG5YID0gY29zTGF0aXR1ZGUgKiBjb3MzKHN0TG9uZ2l0dWRlKTsKICAgICAgICBjb25zdCBuWSA9IGNvc0xhdGl0dWRlICogc2luMyhzdExvbmdpdHVkZSk7CiAgICAgICAgY29uc3Qga1ggPSByYWRpaVNxdWFyZWQueCAqIG5YOwogICAgICAgIGNvbnN0IGtZID0gcmFkaWlTcXVhcmVkLnkgKiBuWTsKICAgICAgICBjb25zdCBnYW1tYSA9IHNxcnQoa1ggKiBuWCArIGtZICogblkgKyBrWiAqIG5aKTsKICAgICAgICBwb3NpdGlvbi54ID0ga1ggLyBnYW1tYTsKICAgICAgICBwb3NpdGlvbi55ID0ga1kgLyBnYW1tYTsKICAgICAgICBwb3NpdGlvbi56ID0ga1ogLyBnYW1tYTsKICAgICAgICBpZiAoY29tcHV0ZVNUKSB7CiAgICAgICAgICBjb25zdCBzdE53Q29ybmVyID0gY29tcHV0ZWRPcHRpb25zLnN0TndDb3JuZXI7CiAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHN0TndDb3JuZXIpKSB7CiAgICAgICAgICAgIHN0TGF0aXR1ZGUgPSBzdE53Q29ybmVyLmxhdGl0dWRlIC0gY29tcHV0ZWRPcHRpb25zLnN0R3JhbllDb3MgKiByb3cgKyBjb2wgKiBjb21wdXRlZE9wdGlvbnMuc3RHcmFuWFNpbjsKICAgICAgICAgICAgc3RMb25naXR1ZGUgPSBzdE53Q29ybmVyLmxvbmdpdHVkZSArIHJvdyAqIGNvbXB1dGVkT3B0aW9ucy5zdEdyYW5ZU2luICsgY29sICogY29tcHV0ZWRPcHRpb25zLnN0R3JhblhDb3M7CiAgICAgICAgICAgIHN0LnggPSAoc3RMb25naXR1ZGUgLSBjb21wdXRlZE9wdGlvbnMuc3RXZXN0KSAqIGNvbXB1dGVkT3B0aW9ucy5sb25TY2FsYXI7CiAgICAgICAgICAgIHN0LnkgPSAoc3RMYXRpdHVkZSAtIGNvbXB1dGVkT3B0aW9ucy5zdFNvdXRoKSAqIGNvbXB1dGVkT3B0aW9ucy5sYXRTY2FsYXI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdC54ID0gKHN0TG9uZ2l0dWRlIC0gcmVjdGFuZ2xlLndlc3QpICogY29tcHV0ZWRPcHRpb25zLmxvblNjYWxhcjsKICAgICAgICAgICAgc3QueSA9IChzdExhdGl0dWRlIC0gcmVjdGFuZ2xlLnNvdXRoKSAqIGNvbXB1dGVkT3B0aW9ucy5sYXRTY2FsYXI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICByb3RhdGlvbk1hdHJpeFNjcmF0Y2ggPSBuZXcgTWF0cml4Ml9kZWZhdWx0KCk7CiAgICAgIG53Q2FydGVzaWFuID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjZW50ZXJTY3JhdGNoMyA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBjZW50ZXJDYXJ0ZXNpYW4gPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHByb2ogPSBuZXcgR2VvZ3JhcGhpY1Byb2plY3Rpb25fZGVmYXVsdCgpOwogICAgICBSZWN0YW5nbGVHZW9tZXRyeUxpYnJhcnkuY29tcHV0ZU9wdGlvbnMgPSBmdW5jdGlvbihyZWN0YW5nbGUsIGdyYW51bGFyaXR5LCByb3RhdGlvbiwgc3RSb3RhdGlvbiwgYm91bmRpbmdSZWN0YW5nbGVTY3JhdGNoLCBud0Nvcm5lclJlc3VsdCwgc3ROd0Nvcm5lclJlc3VsdCkgewogICAgICAgIGxldCBlYXN0ID0gcmVjdGFuZ2xlLmVhc3Q7CiAgICAgICAgbGV0IHdlc3QgPSByZWN0YW5nbGUud2VzdDsKICAgICAgICBsZXQgbm9ydGggPSByZWN0YW5nbGUubm9ydGg7CiAgICAgICAgbGV0IHNvdXRoID0gcmVjdGFuZ2xlLnNvdXRoOwogICAgICAgIGxldCBub3J0aENhcCA9IGZhbHNlOwogICAgICAgIGxldCBzb3V0aENhcCA9IGZhbHNlOwogICAgICAgIGlmIChub3J0aCA9PT0gTWF0aF9kZWZhdWx0LlBJX09WRVJfVFdPKSB7CiAgICAgICAgICBub3J0aENhcCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChzb3V0aCA9PT0gLU1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTykgewogICAgICAgICAgc291dGhDYXAgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBsZXQgZHg7CiAgICAgICAgY29uc3QgZHkgPSBub3J0aCAtIHNvdXRoOwogICAgICAgIGlmICh3ZXN0ID4gZWFzdCkgewogICAgICAgICAgZHggPSBNYXRoX2RlZmF1bHQuVFdPX1BJIC0gd2VzdCArIGVhc3Q7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGR4ID0gZWFzdCAtIHdlc3Q7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5jZWlsKGR4IC8gZ3JhbnVsYXJpdHkpICsgMTsKICAgICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLmNlaWwoZHkgLyBncmFudWxhcml0eSkgKyAxOwogICAgICAgIGNvbnN0IGdyYW51bGFyaXR5WCA9IGR4IC8gKHdpZHRoIC0gMSk7CiAgICAgICAgY29uc3QgZ3JhbnVsYXJpdHlZID0gZHkgLyAoaGVpZ2h0IC0gMSk7CiAgICAgICAgY29uc3QgbndDb3JuZXIgPSBSZWN0YW5nbGVfZGVmYXVsdC5ub3J0aHdlc3QocmVjdGFuZ2xlLCBud0Nvcm5lclJlc3VsdCk7CiAgICAgICAgY29uc3QgY2VudGVyID0gUmVjdGFuZ2xlX2RlZmF1bHQuY2VudGVyKHJlY3RhbmdsZSwgY2VudGVyU2NyYXRjaDMpOwogICAgICAgIGlmIChyb3RhdGlvbiAhPT0gMCB8fCBzdFJvdGF0aW9uICE9PSAwKSB7CiAgICAgICAgICBpZiAoY2VudGVyLmxvbmdpdHVkZSA8IG53Q29ybmVyLmxvbmdpdHVkZSkgewogICAgICAgICAgICBjZW50ZXIubG9uZ2l0dWRlICs9IE1hdGhfZGVmYXVsdC5UV09fUEk7CiAgICAgICAgICB9CiAgICAgICAgICBwcm9qLl9lbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC5kZWZhdWx0OwogICAgICAgICAgY2VudGVyQ2FydGVzaWFuID0gcHJvai5wcm9qZWN0KGNlbnRlciwgY2VudGVyQ2FydGVzaWFuKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZ3JhbllDb3MgPSBncmFudWxhcml0eVk7CiAgICAgICAgY29uc3QgZ3JhblhDb3MgPSBncmFudWxhcml0eVg7CiAgICAgICAgY29uc3QgZ3JhbllTaW4gPSAwOwogICAgICAgIGNvbnN0IGdyYW5YU2luID0gMDsKICAgICAgICBjb25zdCBib3VuZGluZ1JlY3RhbmdsZSA9IFJlY3RhbmdsZV9kZWZhdWx0LmNsb25lKAogICAgICAgICAgcmVjdGFuZ2xlLAogICAgICAgICAgYm91bmRpbmdSZWN0YW5nbGVTY3JhdGNoCiAgICAgICAgKTsKICAgICAgICBjb25zdCBjb21wdXRlZE9wdGlvbnMgPSB7CiAgICAgICAgICBncmFuWUNvcywKICAgICAgICAgIGdyYW5ZU2luLAogICAgICAgICAgZ3JhblhDb3MsCiAgICAgICAgICBncmFuWFNpbiwKICAgICAgICAgIG53Q29ybmVyLAogICAgICAgICAgYm91bmRpbmdSZWN0YW5nbGUsCiAgICAgICAgICB3aWR0aCwKICAgICAgICAgIGhlaWdodCwKICAgICAgICAgIG5vcnRoQ2FwLAogICAgICAgICAgc291dGhDYXAKICAgICAgICB9OwogICAgICAgIGlmIChyb3RhdGlvbiAhPT0gMCkgewogICAgICAgICAgY29uc3Qgcm90YXRpb25PcHRpb25zID0gZ2V0Um90YXRpb25PcHRpb25zKAogICAgICAgICAgICBud0Nvcm5lciwKICAgICAgICAgICAgcm90YXRpb24sCiAgICAgICAgICAgIGdyYW51bGFyaXR5WCwKICAgICAgICAgICAgZ3JhbnVsYXJpdHlZLAogICAgICAgICAgICBjZW50ZXIsCiAgICAgICAgICAgIHdpZHRoLAogICAgICAgICAgICBoZWlnaHQKICAgICAgICAgICk7CiAgICAgICAgICBub3J0aCA9IHJvdGF0aW9uT3B0aW9ucy5ub3J0aDsKICAgICAgICAgIHNvdXRoID0gcm90YXRpb25PcHRpb25zLnNvdXRoOwogICAgICAgICAgZWFzdCA9IHJvdGF0aW9uT3B0aW9ucy5lYXN0OwogICAgICAgICAgd2VzdCA9IHJvdGF0aW9uT3B0aW9ucy53ZXN0OwogICAgICAgICAgaWYgKG5vcnRoIDwgLU1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTyB8fCBub3J0aCA+IE1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTyB8fCBzb3V0aCA8IC1NYXRoX2RlZmF1bHQuUElfT1ZFUl9UV08gfHwgc291dGggPiBNYXRoX2RlZmF1bHQuUElfT1ZFUl9UV08pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICAgIlJvdGF0ZWQgcmVjdGFuZ2xlIGlzIGludmFsaWQuICBJdCBjcm9zc2VzIG92ZXIgZWl0aGVyIHRoZSBub3J0aCBvciBzb3V0aCBwb2xlLiIKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbXB1dGVkT3B0aW9ucy5ncmFuWUNvcyA9IHJvdGF0aW9uT3B0aW9ucy5ncmFuWUNvczsKICAgICAgICAgIGNvbXB1dGVkT3B0aW9ucy5ncmFuWVNpbiA9IHJvdGF0aW9uT3B0aW9ucy5ncmFuWVNpbjsKICAgICAgICAgIGNvbXB1dGVkT3B0aW9ucy5ncmFuWENvcyA9IHJvdGF0aW9uT3B0aW9ucy5ncmFuWENvczsKICAgICAgICAgIGNvbXB1dGVkT3B0aW9ucy5ncmFuWFNpbiA9IHJvdGF0aW9uT3B0aW9ucy5ncmFuWFNpbjsKICAgICAgICAgIGJvdW5kaW5nUmVjdGFuZ2xlLm5vcnRoID0gbm9ydGg7CiAgICAgICAgICBib3VuZGluZ1JlY3RhbmdsZS5zb3V0aCA9IHNvdXRoOwogICAgICAgICAgYm91bmRpbmdSZWN0YW5nbGUuZWFzdCA9IGVhc3Q7CiAgICAgICAgICBib3VuZGluZ1JlY3RhbmdsZS53ZXN0ID0gd2VzdDsKICAgICAgICB9CiAgICAgICAgaWYgKHN0Um90YXRpb24gIT09IDApIHsKICAgICAgICAgIHJvdGF0aW9uID0gcm90YXRpb24gLSBzdFJvdGF0aW9uOwogICAgICAgICAgY29uc3Qgc3ROd0Nvcm5lciA9IFJlY3RhbmdsZV9kZWZhdWx0Lm5vcnRod2VzdChib3VuZGluZ1JlY3RhbmdsZSwgc3ROd0Nvcm5lclJlc3VsdCk7CiAgICAgICAgICBjb25zdCBzdFJvdGF0aW9uT3B0aW9ucyA9IGdldFJvdGF0aW9uT3B0aW9ucygKICAgICAgICAgICAgc3ROd0Nvcm5lciwKICAgICAgICAgICAgcm90YXRpb24sCiAgICAgICAgICAgIGdyYW51bGFyaXR5WCwKICAgICAgICAgICAgZ3JhbnVsYXJpdHlZLAogICAgICAgICAgICBjZW50ZXIsCiAgICAgICAgICAgIHdpZHRoLAogICAgICAgICAgICBoZWlnaHQKICAgICAgICAgICk7CiAgICAgICAgICBjb21wdXRlZE9wdGlvbnMuc3RHcmFuWUNvcyA9IHN0Um90YXRpb25PcHRpb25zLmdyYW5ZQ29zOwogICAgICAgICAgY29tcHV0ZWRPcHRpb25zLnN0R3JhblhDb3MgPSBzdFJvdGF0aW9uT3B0aW9ucy5ncmFuWENvczsKICAgICAgICAgIGNvbXB1dGVkT3B0aW9ucy5zdEdyYW5ZU2luID0gc3RSb3RhdGlvbk9wdGlvbnMuZ3JhbllTaW47CiAgICAgICAgICBjb21wdXRlZE9wdGlvbnMuc3RHcmFuWFNpbiA9IHN0Um90YXRpb25PcHRpb25zLmdyYW5YU2luOwogICAgICAgICAgY29tcHV0ZWRPcHRpb25zLnN0TndDb3JuZXIgPSBzdE53Q29ybmVyOwogICAgICAgICAgY29tcHV0ZWRPcHRpb25zLnN0V2VzdCA9IHN0Um90YXRpb25PcHRpb25zLndlc3Q7CiAgICAgICAgICBjb21wdXRlZE9wdGlvbnMuc3RTb3V0aCA9IHN0Um90YXRpb25PcHRpb25zLnNvdXRoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29tcHV0ZWRPcHRpb25zOwogICAgICB9OwogICAgICBSZWN0YW5nbGVHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdCA9IFJlY3RhbmdsZUdlb21ldHJ5TGlicmFyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1JlY3RhbmdsZUdlb21ldHJ5LmpzCiAgZnVuY3Rpb24gY3JlYXRlQXR0cmlidXRlcyh2ZXJ0ZXhGb3JtYXQsIGF0dHJpYnV0ZXMpIHsKICAgIGNvbnN0IGdlbyA9IG5ldyBHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgYXR0cmlidXRlczogbmV3IEdlb21ldHJ5QXR0cmlidXRlc19kZWZhdWx0KCksCiAgICAgIHByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5UUklBTkdMRVMKICAgIH0pOwogICAgZ2VvLmF0dHJpYnV0ZXMucG9zaXRpb24gPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkRPVUJMRSwKICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgdmFsdWVzOiBhdHRyaWJ1dGVzLnBvc2l0aW9ucwogICAgfSk7CiAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCkgewogICAgICBnZW8uYXR0cmlidXRlcy5ub3JtYWwgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICB2YWx1ZXM6IGF0dHJpYnV0ZXMubm9ybWFscwogICAgICB9KTsKICAgIH0KICAgIGlmICh2ZXJ0ZXhGb3JtYXQudGFuZ2VudCkgewogICAgICBnZW8uYXR0cmlidXRlcy50YW5nZW50ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgdmFsdWVzOiBhdHRyaWJ1dGVzLnRhbmdlbnRzCiAgICAgIH0pOwogICAgfQogICAgaWYgKHZlcnRleEZvcm1hdC5iaXRhbmdlbnQpIHsKICAgICAgZ2VvLmF0dHJpYnV0ZXMuYml0YW5nZW50ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgdmFsdWVzOiBhdHRyaWJ1dGVzLmJpdGFuZ2VudHMKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gZ2VvOwogIH0KICBmdW5jdGlvbiBjYWxjdWxhdGVBdHRyaWJ1dGVzKHBvc2l0aW9ucywgdmVydGV4Rm9ybWF0LCBlbGxpcHNvaWQsIHRhbmdlbnRSb3RhdGlvbk1hdHJpeCkgewogICAgY29uc3QgbGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aDsKICAgIGNvbnN0IG5vcm1hbHMgPSB2ZXJ0ZXhGb3JtYXQubm9ybWFsID8gbmV3IEZsb2F0MzJBcnJheShsZW5ndGgpIDogdm9pZCAwOwogICAgY29uc3QgdGFuZ2VudHMgPSB2ZXJ0ZXhGb3JtYXQudGFuZ2VudCA/IG5ldyBGbG9hdDMyQXJyYXkobGVuZ3RoKSA6IHZvaWQgMDsKICAgIGNvbnN0IGJpdGFuZ2VudHMgPSB2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50ID8gbmV3IEZsb2F0MzJBcnJheShsZW5ndGgpIDogdm9pZCAwOwogICAgbGV0IGF0dHJJbmRleCA9IDA7CiAgICBjb25zdCBiaXRhbmdlbnQgPSBiaXRhbmdlbnRTY3JhdGNoMjsKICAgIGNvbnN0IHRhbmdlbnQgPSB0YW5nZW50U2NyYXRjaDI7CiAgICBsZXQgbm9ybWFsMiA9IG5vcm1hbFNjcmF0Y2g0OwogICAgaWYgKHZlcnRleEZvcm1hdC5ub3JtYWwgfHwgdmVydGV4Rm9ybWF0LnRhbmdlbnQgfHwgdmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAzKSB7CiAgICAgICAgY29uc3QgcCA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkocG9zaXRpb25zLCBpLCBwb3NpdGlvblNjcmF0Y2gyKTsKICAgICAgICBjb25zdCBhdHRySW5kZXgxID0gYXR0ckluZGV4ICsgMTsKICAgICAgICBjb25zdCBhdHRySW5kZXgyID0gYXR0ckluZGV4ICsgMjsKICAgICAgICBub3JtYWwyID0gZWxsaXBzb2lkLmdlb2RldGljU3VyZmFjZU5vcm1hbChwLCBub3JtYWwyKTsKICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnRhbmdlbnQgfHwgdmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgewogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKENhcnRlc2lhbjNfZGVmYXVsdC5VTklUX1osIG5vcm1hbDIsIHRhbmdlbnQpOwogICAgICAgICAgTWF0cml4M19kZWZhdWx0Lm11bHRpcGx5QnlWZWN0b3IodGFuZ2VudFJvdGF0aW9uTWF0cml4LCB0YW5nZW50LCB0YW5nZW50KTsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUodGFuZ2VudCwgdGFuZ2VudCk7CiAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKAogICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhub3JtYWwyLCB0YW5nZW50LCBiaXRhbmdlbnQpLAogICAgICAgICAgICAgIGJpdGFuZ2VudAogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCkgewogICAgICAgICAgbm9ybWFsc1thdHRySW5kZXhdID0gbm9ybWFsMi54OwogICAgICAgICAgbm9ybWFsc1thdHRySW5kZXgxXSA9IG5vcm1hbDIueTsKICAgICAgICAgIG5vcm1hbHNbYXR0ckluZGV4Ml0gPSBub3JtYWwyLno7CiAgICAgICAgfQogICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQudGFuZ2VudCkgewogICAgICAgICAgdGFuZ2VudHNbYXR0ckluZGV4XSA9IHRhbmdlbnQueDsKICAgICAgICAgIHRhbmdlbnRzW2F0dHJJbmRleDFdID0gdGFuZ2VudC55OwogICAgICAgICAgdGFuZ2VudHNbYXR0ckluZGV4Ml0gPSB0YW5nZW50Lno7CiAgICAgICAgfQogICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgICAgICBiaXRhbmdlbnRzW2F0dHJJbmRleF0gPSBiaXRhbmdlbnQueDsKICAgICAgICAgIGJpdGFuZ2VudHNbYXR0ckluZGV4MV0gPSBiaXRhbmdlbnQueTsKICAgICAgICAgIGJpdGFuZ2VudHNbYXR0ckluZGV4Ml0gPSBiaXRhbmdlbnQuejsKICAgICAgICB9CiAgICAgICAgYXR0ckluZGV4ICs9IDM7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjcmVhdGVBdHRyaWJ1dGVzKHZlcnRleEZvcm1hdCwgewogICAgICBwb3NpdGlvbnMsCiAgICAgIG5vcm1hbHMsCiAgICAgIHRhbmdlbnRzLAogICAgICBiaXRhbmdlbnRzCiAgICB9KTsKICB9CiAgZnVuY3Rpb24gY2FsY3VsYXRlQXR0cmlidXRlc1dhbGwocG9zaXRpb25zLCB2ZXJ0ZXhGb3JtYXQsIGVsbGlwc29pZCkgewogICAgY29uc3QgbGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aDsKICAgIGNvbnN0IG5vcm1hbHMgPSB2ZXJ0ZXhGb3JtYXQubm9ybWFsID8gbmV3IEZsb2F0MzJBcnJheShsZW5ndGgpIDogdm9pZCAwOwogICAgY29uc3QgdGFuZ2VudHMgPSB2ZXJ0ZXhGb3JtYXQudGFuZ2VudCA/IG5ldyBGbG9hdDMyQXJyYXkobGVuZ3RoKSA6IHZvaWQgMDsKICAgIGNvbnN0IGJpdGFuZ2VudHMgPSB2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50ID8gbmV3IEZsb2F0MzJBcnJheShsZW5ndGgpIDogdm9pZCAwOwogICAgbGV0IG5vcm1hbEluZGV4ID0gMDsKICAgIGxldCB0YW5nZW50SW5kZXggPSAwOwogICAgbGV0IGJpdGFuZ2VudEluZGV4ID0gMDsKICAgIGxldCByZWNvbXB1dGVOb3JtYWwgPSB0cnVlOwogICAgbGV0IGJpdGFuZ2VudCA9IGJpdGFuZ2VudFNjcmF0Y2gyOwogICAgbGV0IHRhbmdlbnQgPSB0YW5nZW50U2NyYXRjaDI7CiAgICBsZXQgbm9ybWFsMiA9IG5vcm1hbFNjcmF0Y2g0OwogICAgaWYgKHZlcnRleEZvcm1hdC5ub3JtYWwgfHwgdmVydGV4Rm9ybWF0LnRhbmdlbnQgfHwgdmVydGV4Rm9ybWF0LmJpdGFuZ2VudCkgewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSA2KSB7CiAgICAgICAgY29uc3QgcCA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkocG9zaXRpb25zLCBpLCBwb3NpdGlvblNjcmF0Y2gyKTsKICAgICAgICBjb25zdCBwMSA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkocG9zaXRpb25zLCAoaSArIDYpICUgbGVuZ3RoLCB2MVNjcmF0Y2gpOwogICAgICAgIGlmIChyZWNvbXB1dGVOb3JtYWwpIHsKICAgICAgICAgIGNvbnN0IHAyID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShwb3NpdGlvbnMsIChpICsgMykgJSBsZW5ndGgsIHYyU2NyYXRjaCk7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QocDEsIHAsIHAxKTsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChwMiwgcCwgcDIpOwogICAgICAgICAgbm9ybWFsMiA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKHAyLCBwMSwgbm9ybWFsMiksIG5vcm1hbDIpOwogICAgICAgICAgcmVjb21wdXRlTm9ybWFsID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChDYXJ0ZXNpYW4zX2RlZmF1bHQuZXF1YWxzRXBzaWxvbihwMSwgcCwgTWF0aF9kZWZhdWx0LkVQU0lMT04xMCkpIHsKICAgICAgICAgIHJlY29tcHV0ZU5vcm1hbCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQudGFuZ2VudCB8fCB2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgICAgICBiaXRhbmdlbnQgPSBlbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKHAsIGJpdGFuZ2VudCk7CiAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnRhbmdlbnQpIHsKICAgICAgICAgICAgdGFuZ2VudCA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoCiAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKGJpdGFuZ2VudCwgbm9ybWFsMiwgdGFuZ2VudCksCiAgICAgICAgICAgICAgdGFuZ2VudAogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCkgewogICAgICAgICAgbm9ybWFsc1tub3JtYWxJbmRleCsrXSA9IG5vcm1hbDIueDsKICAgICAgICAgIG5vcm1hbHNbbm9ybWFsSW5kZXgrK10gPSBub3JtYWwyLnk7CiAgICAgICAgICBub3JtYWxzW25vcm1hbEluZGV4KytdID0gbm9ybWFsMi56OwogICAgICAgICAgbm9ybWFsc1tub3JtYWxJbmRleCsrXSA9IG5vcm1hbDIueDsKICAgICAgICAgIG5vcm1hbHNbbm9ybWFsSW5kZXgrK10gPSBub3JtYWwyLnk7CiAgICAgICAgICBub3JtYWxzW25vcm1hbEluZGV4KytdID0gbm9ybWFsMi56OwogICAgICAgIH0KICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnRhbmdlbnQpIHsKICAgICAgICAgIHRhbmdlbnRzW3RhbmdlbnRJbmRleCsrXSA9IHRhbmdlbnQueDsKICAgICAgICAgIHRhbmdlbnRzW3RhbmdlbnRJbmRleCsrXSA9IHRhbmdlbnQueTsKICAgICAgICAgIHRhbmdlbnRzW3RhbmdlbnRJbmRleCsrXSA9IHRhbmdlbnQuejsKICAgICAgICAgIHRhbmdlbnRzW3RhbmdlbnRJbmRleCsrXSA9IHRhbmdlbnQueDsKICAgICAgICAgIHRhbmdlbnRzW3RhbmdlbnRJbmRleCsrXSA9IHRhbmdlbnQueTsKICAgICAgICAgIHRhbmdlbnRzW3RhbmdlbnRJbmRleCsrXSA9IHRhbmdlbnQuejsKICAgICAgICB9CiAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5iaXRhbmdlbnQpIHsKICAgICAgICAgIGJpdGFuZ2VudHNbYml0YW5nZW50SW5kZXgrK10gPSBiaXRhbmdlbnQueDsKICAgICAgICAgIGJpdGFuZ2VudHNbYml0YW5nZW50SW5kZXgrK10gPSBiaXRhbmdlbnQueTsKICAgICAgICAgIGJpdGFuZ2VudHNbYml0YW5nZW50SW5kZXgrK10gPSBiaXRhbmdlbnQuejsKICAgICAgICAgIGJpdGFuZ2VudHNbYml0YW5nZW50SW5kZXgrK10gPSBiaXRhbmdlbnQueDsKICAgICAgICAgIGJpdGFuZ2VudHNbYml0YW5nZW50SW5kZXgrK10gPSBiaXRhbmdlbnQueTsKICAgICAgICAgIGJpdGFuZ2VudHNbYml0YW5nZW50SW5kZXgrK10gPSBiaXRhbmdlbnQuejsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjcmVhdGVBdHRyaWJ1dGVzKHZlcnRleEZvcm1hdCwgewogICAgICBwb3NpdGlvbnMsCiAgICAgIG5vcm1hbHMsCiAgICAgIHRhbmdlbnRzLAogICAgICBiaXRhbmdlbnRzCiAgICB9KTsKICB9CiAgZnVuY3Rpb24gY29uc3RydWN0UmVjdGFuZ2xlKHJlY3RhbmdsZUdlb21ldHJ5LCBjb21wdXRlZE9wdGlvbnMpIHsKICAgIGNvbnN0IHZlcnRleEZvcm1hdCA9IHJlY3RhbmdsZUdlb21ldHJ5Ll92ZXJ0ZXhGb3JtYXQ7CiAgICBjb25zdCBlbGxpcHNvaWQgPSByZWN0YW5nbGVHZW9tZXRyeS5fZWxsaXBzb2lkOwogICAgY29uc3QgaGVpZ2h0ID0gY29tcHV0ZWRPcHRpb25zLmhlaWdodDsKICAgIGNvbnN0IHdpZHRoID0gY29tcHV0ZWRPcHRpb25zLndpZHRoOwogICAgY29uc3Qgbm9ydGhDYXAgPSBjb21wdXRlZE9wdGlvbnMubm9ydGhDYXA7CiAgICBjb25zdCBzb3V0aENhcCA9IGNvbXB1dGVkT3B0aW9ucy5zb3V0aENhcDsKICAgIGxldCByb3dTdGFydCA9IDA7CiAgICBsZXQgcm93RW5kID0gaGVpZ2h0OwogICAgbGV0IHJvd0hlaWdodCA9IGhlaWdodDsKICAgIGxldCBzaXplID0gMDsKICAgIGlmIChub3J0aENhcCkgewogICAgICByb3dTdGFydCA9IDE7CiAgICAgIHJvd0hlaWdodCAtPSAxOwogICAgICBzaXplICs9IDE7CiAgICB9CiAgICBpZiAoc291dGhDYXApIHsKICAgICAgcm93RW5kIC09IDE7CiAgICAgIHJvd0hlaWdodCAtPSAxOwogICAgICBzaXplICs9IDE7CiAgICB9CiAgICBzaXplICs9IHdpZHRoICogcm93SGVpZ2h0OwogICAgY29uc3QgcG9zaXRpb25zID0gdmVydGV4Rm9ybWF0LnBvc2l0aW9uID8gbmV3IEZsb2F0NjRBcnJheShzaXplICogMykgOiB2b2lkIDA7CiAgICBjb25zdCB0ZXh0dXJlQ29vcmRpbmF0ZXMgPSB2ZXJ0ZXhGb3JtYXQuc3QgPyBuZXcgRmxvYXQzMkFycmF5KHNpemUgKiAyKSA6IHZvaWQgMDsKICAgIGxldCBwb3NJbmRleCA9IDA7CiAgICBsZXQgc3RJbmRleCA9IDA7CiAgICBjb25zdCBwb3NpdGlvbiA9IHBvc2l0aW9uU2NyYXRjaDI7CiAgICBjb25zdCBzdCA9IHN0U2NyYXRjaDI7CiAgICBsZXQgbWluWCA9IE51bWJlci5NQVhfVkFMVUU7CiAgICBsZXQgbWluWSA9IE51bWJlci5NQVhfVkFMVUU7CiAgICBsZXQgbWF4WCA9IC1OdW1iZXIuTUFYX1ZBTFVFOwogICAgbGV0IG1heFkgPSAtTnVtYmVyLk1BWF9WQUxVRTsKICAgIGZvciAobGV0IHJvdyA9IHJvd1N0YXJ0OyByb3cgPCByb3dFbmQ7ICsrcm93KSB7CiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyArK2NvbCkgewogICAgICAgIFJlY3RhbmdsZUdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmNvbXB1dGVQb3NpdGlvbigKICAgICAgICAgIGNvbXB1dGVkT3B0aW9ucywKICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgIHZlcnRleEZvcm1hdC5zdCwKICAgICAgICAgIHJvdywKICAgICAgICAgIGNvbCwKICAgICAgICAgIHBvc2l0aW9uLAogICAgICAgICAgc3QKICAgICAgICApOwogICAgICAgIHBvc2l0aW9uc1twb3NJbmRleCsrXSA9IHBvc2l0aW9uLng7CiAgICAgICAgcG9zaXRpb25zW3Bvc0luZGV4KytdID0gcG9zaXRpb24ueTsKICAgICAgICBwb3NpdGlvbnNbcG9zSW5kZXgrK10gPSBwb3NpdGlvbi56OwogICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuc3QpIHsKICAgICAgICAgIHRleHR1cmVDb29yZGluYXRlc1tzdEluZGV4KytdID0gc3QueDsKICAgICAgICAgIHRleHR1cmVDb29yZGluYXRlc1tzdEluZGV4KytdID0gc3QueTsKICAgICAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCBzdC54KTsKICAgICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBzdC55KTsKICAgICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBzdC54KTsKICAgICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCBzdC55KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChub3J0aENhcCkgewogICAgICBSZWN0YW5nbGVHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5jb21wdXRlUG9zaXRpb24oCiAgICAgICAgY29tcHV0ZWRPcHRpb25zLAogICAgICAgIGVsbGlwc29pZCwKICAgICAgICB2ZXJ0ZXhGb3JtYXQuc3QsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIHBvc2l0aW9uLAogICAgICAgIHN0CiAgICAgICk7CiAgICAgIHBvc2l0aW9uc1twb3NJbmRleCsrXSA9IHBvc2l0aW9uLng7CiAgICAgIHBvc2l0aW9uc1twb3NJbmRleCsrXSA9IHBvc2l0aW9uLnk7CiAgICAgIHBvc2l0aW9uc1twb3NJbmRleCsrXSA9IHBvc2l0aW9uLno7CiAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuc3QpIHsKICAgICAgICB0ZXh0dXJlQ29vcmRpbmF0ZXNbc3RJbmRleCsrXSA9IHN0Lng7CiAgICAgICAgdGV4dHVyZUNvb3JkaW5hdGVzW3N0SW5kZXgrK10gPSBzdC55OwogICAgICAgIG1pblggPSBzdC54OwogICAgICAgIG1pblkgPSBzdC55OwogICAgICAgIG1heFggPSBzdC54OwogICAgICAgIG1heFkgPSBzdC55OwogICAgICB9CiAgICB9CiAgICBpZiAoc291dGhDYXApIHsKICAgICAgUmVjdGFuZ2xlR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuY29tcHV0ZVBvc2l0aW9uKAogICAgICAgIGNvbXB1dGVkT3B0aW9ucywKICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgdmVydGV4Rm9ybWF0LnN0LAogICAgICAgIGhlaWdodCAtIDEsCiAgICAgICAgMCwKICAgICAgICBwb3NpdGlvbiwKICAgICAgICBzdAogICAgICApOwogICAgICBwb3NpdGlvbnNbcG9zSW5kZXgrK10gPSBwb3NpdGlvbi54OwogICAgICBwb3NpdGlvbnNbcG9zSW5kZXgrK10gPSBwb3NpdGlvbi55OwogICAgICBwb3NpdGlvbnNbcG9zSW5kZXhdID0gcG9zaXRpb24uejsKICAgICAgaWYgKHZlcnRleEZvcm1hdC5zdCkgewogICAgICAgIHRleHR1cmVDb29yZGluYXRlc1tzdEluZGV4KytdID0gc3QueDsKICAgICAgICB0ZXh0dXJlQ29vcmRpbmF0ZXNbc3RJbmRleF0gPSBzdC55OwogICAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCBzdC54KTsKICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgc3QueSk7CiAgICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHN0LngpOwogICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCBzdC55KTsKICAgICAgfQogICAgfQogICAgaWYgKHZlcnRleEZvcm1hdC5zdCAmJiAobWluWCA8IDAgfHwgbWluWSA8IDAgfHwgbWF4WCA+IDEgfHwgbWF4WSA+IDEpKSB7CiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdGV4dHVyZUNvb3JkaW5hdGVzLmxlbmd0aDsgayArPSAyKSB7CiAgICAgICAgdGV4dHVyZUNvb3JkaW5hdGVzW2tdID0gKHRleHR1cmVDb29yZGluYXRlc1trXSAtIG1pblgpIC8gKG1heFggLSBtaW5YKTsKICAgICAgICB0ZXh0dXJlQ29vcmRpbmF0ZXNbayArIDFdID0gKHRleHR1cmVDb29yZGluYXRlc1trICsgMV0gLSBtaW5ZKSAvIChtYXhZIC0gbWluWSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGdlbyA9IGNhbGN1bGF0ZUF0dHJpYnV0ZXMoCiAgICAgIHBvc2l0aW9ucywKICAgICAgdmVydGV4Rm9ybWF0LAogICAgICBlbGxpcHNvaWQsCiAgICAgIGNvbXB1dGVkT3B0aW9ucy50YW5nZW50Um90YXRpb25NYXRyaXgKICAgICk7CiAgICBsZXQgaW5kaWNlc1NpemUgPSA2ICogKHdpZHRoIC0gMSkgKiAocm93SGVpZ2h0IC0gMSk7CiAgICBpZiAobm9ydGhDYXApIHsKICAgICAgaW5kaWNlc1NpemUgKz0gMyAqICh3aWR0aCAtIDEpOwogICAgfQogICAgaWYgKHNvdXRoQ2FwKSB7CiAgICAgIGluZGljZXNTaXplICs9IDMgKiAod2lkdGggLSAxKTsKICAgIH0KICAgIGNvbnN0IGluZGljZXMgPSBJbmRleERhdGF0eXBlX2RlZmF1bHQuY3JlYXRlVHlwZWRBcnJheShzaXplLCBpbmRpY2VzU2l6ZSk7CiAgICBsZXQgaW5kZXggPSAwOwogICAgbGV0IGluZGljZXNJbmRleCA9IDA7CiAgICBsZXQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCByb3dIZWlnaHQgLSAxOyArK2kpIHsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB3aWR0aCAtIDE7ICsraikgewogICAgICAgIGNvbnN0IHVwcGVyTGVmdCA9IGluZGV4OwogICAgICAgIGNvbnN0IGxvd2VyTGVmdCA9IHVwcGVyTGVmdCArIHdpZHRoOwogICAgICAgIGNvbnN0IGxvd2VyUmlnaHQgPSBsb3dlckxlZnQgKyAxOwogICAgICAgIGNvbnN0IHVwcGVyUmlnaHQgPSB1cHBlckxlZnQgKyAxOwogICAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gdXBwZXJMZWZ0OwogICAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gbG93ZXJMZWZ0OwogICAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gdXBwZXJSaWdodDsKICAgICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IHVwcGVyUmlnaHQ7CiAgICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBsb3dlckxlZnQ7CiAgICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBsb3dlclJpZ2h0OwogICAgICAgICsraW5kZXg7CiAgICAgIH0KICAgICAgKytpbmRleDsKICAgIH0KICAgIGlmIChub3J0aENhcCB8fCBzb3V0aENhcCkgewogICAgICBsZXQgbm9ydGhJbmRleCA9IHNpemUgLSAxOwogICAgICBjb25zdCBzb3V0aEluZGV4ID0gc2l6ZSAtIDE7CiAgICAgIGlmIChub3J0aENhcCAmJiBzb3V0aENhcCkgewogICAgICAgIG5vcnRoSW5kZXggPSBzaXplIC0gMjsKICAgICAgfQogICAgICBsZXQgcDE7CiAgICAgIGxldCBwMjsKICAgICAgaW5kZXggPSAwOwogICAgICBpZiAobm9ydGhDYXApIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGggLSAxOyBpKyspIHsKICAgICAgICAgIHAxID0gaW5kZXg7CiAgICAgICAgICBwMiA9IHAxICsgMTsKICAgICAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gbm9ydGhJbmRleDsKICAgICAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcDE7CiAgICAgICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IHAyOwogICAgICAgICAgKytpbmRleDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHNvdXRoQ2FwKSB7CiAgICAgICAgaW5kZXggPSAocm93SGVpZ2h0IC0gMSkgKiB3aWR0aDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGggLSAxOyBpKyspIHsKICAgICAgICAgIHAxID0gaW5kZXg7CiAgICAgICAgICBwMiA9IHAxICsgMTsKICAgICAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gcDE7CiAgICAgICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IHNvdXRoSW5kZXg7CiAgICAgICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IHAyOwogICAgICAgICAgKytpbmRleDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGdlby5pbmRpY2VzID0gaW5kaWNlczsKICAgIGlmICh2ZXJ0ZXhGb3JtYXQuc3QpIHsKICAgICAgZ2VvLmF0dHJpYnV0ZXMuc3QgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMiwKICAgICAgICB2YWx1ZXM6IHRleHR1cmVDb29yZGluYXRlcwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBnZW87CiAgfQogIGZ1bmN0aW9uIGFkZFdhbGxQb3NpdGlvbnMyKHdhbGxQb3NpdGlvbnMsIHBvc0luZGV4LCBpLCB0b3BQb3NpdGlvbnMsIGJvdHRvbVBvc2l0aW9ucykgewogICAgd2FsbFBvc2l0aW9uc1twb3NJbmRleCsrXSA9IHRvcFBvc2l0aW9uc1tpXTsKICAgIHdhbGxQb3NpdGlvbnNbcG9zSW5kZXgrK10gPSB0b3BQb3NpdGlvbnNbaSArIDFdOwogICAgd2FsbFBvc2l0aW9uc1twb3NJbmRleCsrXSA9IHRvcFBvc2l0aW9uc1tpICsgMl07CiAgICB3YWxsUG9zaXRpb25zW3Bvc0luZGV4KytdID0gYm90dG9tUG9zaXRpb25zW2ldOwogICAgd2FsbFBvc2l0aW9uc1twb3NJbmRleCsrXSA9IGJvdHRvbVBvc2l0aW9uc1tpICsgMV07CiAgICB3YWxsUG9zaXRpb25zW3Bvc0luZGV4XSA9IGJvdHRvbVBvc2l0aW9uc1tpICsgMl07CiAgICByZXR1cm4gd2FsbFBvc2l0aW9uczsKICB9CiAgZnVuY3Rpb24gYWRkV2FsbFRleHR1cmVDb29yZGluYXRlcyh3YWxsVGV4dHVyZXMsIHN0SW5kZXgsIGksIHN0KSB7CiAgICB3YWxsVGV4dHVyZXNbc3RJbmRleCsrXSA9IHN0W2ldOwogICAgd2FsbFRleHR1cmVzW3N0SW5kZXgrK10gPSBzdFtpICsgMV07CiAgICB3YWxsVGV4dHVyZXNbc3RJbmRleCsrXSA9IHN0W2ldOwogICAgd2FsbFRleHR1cmVzW3N0SW5kZXhdID0gc3RbaSArIDFdOwogICAgcmV0dXJuIHdhbGxUZXh0dXJlczsKICB9CiAgZnVuY3Rpb24gY29uc3RydWN0RXh0cnVkZWRSZWN0YW5nbGUocmVjdGFuZ2xlR2VvbWV0cnksIGNvbXB1dGVkT3B0aW9ucykgewogICAgY29uc3Qgc2hhZG93Vm9sdW1lID0gcmVjdGFuZ2xlR2VvbWV0cnkuX3NoYWRvd1ZvbHVtZTsKICAgIGNvbnN0IG9mZnNldEF0dHJpYnV0ZVZhbHVlID0gcmVjdGFuZ2xlR2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZTsKICAgIGNvbnN0IHZlcnRleEZvcm1hdCA9IHJlY3RhbmdsZUdlb21ldHJ5Ll92ZXJ0ZXhGb3JtYXQ7CiAgICBjb25zdCBtaW5IZWlnaHQgPSByZWN0YW5nbGVHZW9tZXRyeS5fZXh0cnVkZWRIZWlnaHQ7CiAgICBjb25zdCBtYXhIZWlnaHQgPSByZWN0YW5nbGVHZW9tZXRyeS5fc3VyZmFjZUhlaWdodDsKICAgIGNvbnN0IGVsbGlwc29pZCA9IHJlY3RhbmdsZUdlb21ldHJ5Ll9lbGxpcHNvaWQ7CiAgICBjb25zdCBoZWlnaHQgPSBjb21wdXRlZE9wdGlvbnMuaGVpZ2h0OwogICAgY29uc3Qgd2lkdGggPSBjb21wdXRlZE9wdGlvbnMud2lkdGg7CiAgICBsZXQgaTsKICAgIGlmIChzaGFkb3dWb2x1bWUpIHsKICAgICAgY29uc3QgbmV3VmVydGV4Rm9ybWF0ID0gVmVydGV4Rm9ybWF0X2RlZmF1bHQuY2xvbmUoCiAgICAgICAgdmVydGV4Rm9ybWF0LAogICAgICAgIHNjcmF0Y2hWZXJ0ZXhGb3JtYXQxMgogICAgICApOwogICAgICBuZXdWZXJ0ZXhGb3JtYXQubm9ybWFsID0gdHJ1ZTsKICAgICAgcmVjdGFuZ2xlR2VvbWV0cnkuX3ZlcnRleEZvcm1hdCA9IG5ld1ZlcnRleEZvcm1hdDsKICAgIH0KICAgIGNvbnN0IHRvcEJvdHRvbUdlbyA9IGNvbnN0cnVjdFJlY3RhbmdsZShyZWN0YW5nbGVHZW9tZXRyeSwgY29tcHV0ZWRPcHRpb25zKTsKICAgIGlmIChzaGFkb3dWb2x1bWUpIHsKICAgICAgcmVjdGFuZ2xlR2VvbWV0cnkuX3ZlcnRleEZvcm1hdCA9IHZlcnRleEZvcm1hdDsKICAgIH0KICAgIGxldCB0b3BQb3NpdGlvbnMgPSBQb2x5Z29uUGlwZWxpbmVfZGVmYXVsdC5zY2FsZVRvR2VvZGV0aWNIZWlnaHQoCiAgICAgIHRvcEJvdHRvbUdlby5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcywKICAgICAgbWF4SGVpZ2h0LAogICAgICBlbGxpcHNvaWQsCiAgICAgIGZhbHNlCiAgICApOwogICAgdG9wUG9zaXRpb25zID0gbmV3IEZsb2F0NjRBcnJheSh0b3BQb3NpdGlvbnMpOwogICAgbGV0IGxlbmd0aCA9IHRvcFBvc2l0aW9ucy5sZW5ndGg7CiAgICBjb25zdCBuZXdMZW5ndGggPSBsZW5ndGggKiAyOwogICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0NjRBcnJheShuZXdMZW5ndGgpOwogICAgcG9zaXRpb25zLnNldCh0b3BQb3NpdGlvbnMpOwogICAgY29uc3QgYm90dG9tUG9zaXRpb25zID0gUG9seWdvblBpcGVsaW5lX2RlZmF1bHQuc2NhbGVUb0dlb2RldGljSGVpZ2h0KAogICAgICB0b3BCb3R0b21HZW8uYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsCiAgICAgIG1pbkhlaWdodCwKICAgICAgZWxsaXBzb2lkCiAgICApOwogICAgcG9zaXRpb25zLnNldChib3R0b21Qb3NpdGlvbnMsIGxlbmd0aCk7CiAgICB0b3BCb3R0b21HZW8uYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMgPSBwb3NpdGlvbnM7CiAgICBjb25zdCBub3JtYWxzID0gdmVydGV4Rm9ybWF0Lm5vcm1hbCA/IG5ldyBGbG9hdDMyQXJyYXkobmV3TGVuZ3RoKSA6IHZvaWQgMDsKICAgIGNvbnN0IHRhbmdlbnRzID0gdmVydGV4Rm9ybWF0LnRhbmdlbnQgPyBuZXcgRmxvYXQzMkFycmF5KG5ld0xlbmd0aCkgOiB2b2lkIDA7CiAgICBjb25zdCBiaXRhbmdlbnRzID0gdmVydGV4Rm9ybWF0LmJpdGFuZ2VudCA/IG5ldyBGbG9hdDMyQXJyYXkobmV3TGVuZ3RoKSA6IHZvaWQgMDsKICAgIGNvbnN0IHRleHR1cmVzID0gdmVydGV4Rm9ybWF0LnN0ID8gbmV3IEZsb2F0MzJBcnJheShuZXdMZW5ndGggLyAzICogMikgOiB2b2lkIDA7CiAgICBsZXQgdG9wU3Q7CiAgICBsZXQgdG9wTm9ybWFsczsKICAgIGlmICh2ZXJ0ZXhGb3JtYXQubm9ybWFsKSB7CiAgICAgIHRvcE5vcm1hbHMgPSB0b3BCb3R0b21HZW8uYXR0cmlidXRlcy5ub3JtYWwudmFsdWVzOwogICAgICBub3JtYWxzLnNldCh0b3BOb3JtYWxzKTsKICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgdG9wTm9ybWFsc1tpXSA9IC10b3BOb3JtYWxzW2ldOwogICAgICB9CiAgICAgIG5vcm1hbHMuc2V0KHRvcE5vcm1hbHMsIGxlbmd0aCk7CiAgICAgIHRvcEJvdHRvbUdlby5hdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZXMgPSBub3JtYWxzOwogICAgfQogICAgaWYgKHNoYWRvd1ZvbHVtZSkgewogICAgICB0b3BOb3JtYWxzID0gdG9wQm90dG9tR2VvLmF0dHJpYnV0ZXMubm9ybWFsLnZhbHVlczsKICAgICAgaWYgKCF2ZXJ0ZXhGb3JtYXQubm9ybWFsKSB7CiAgICAgICAgdG9wQm90dG9tR2VvLmF0dHJpYnV0ZXMubm9ybWFsID0gdm9pZCAwOwogICAgICB9CiAgICAgIGNvbnN0IGV4dHJ1ZGVOb3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheShuZXdMZW5ndGgpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICB0b3BOb3JtYWxzW2ldID0gLXRvcE5vcm1hbHNbaV07CiAgICAgIH0KICAgICAgZXh0cnVkZU5vcm1hbHMuc2V0KHRvcE5vcm1hbHMsIGxlbmd0aCk7CiAgICAgIHRvcEJvdHRvbUdlby5hdHRyaWJ1dGVzLmV4dHJ1ZGVEaXJlY3Rpb24gPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICB2YWx1ZXM6IGV4dHJ1ZGVOb3JtYWxzCiAgICAgIH0pOwogICAgfQogICAgbGV0IG9mZnNldFZhbHVlOwogICAgY29uc3QgaGFzT2Zmc2V0cyA9IGRlZmluZWRfZGVmYXVsdChvZmZzZXRBdHRyaWJ1dGVWYWx1ZSk7CiAgICBpZiAoaGFzT2Zmc2V0cykgewogICAgICBjb25zdCBzaXplID0gbGVuZ3RoIC8gMyAqIDI7CiAgICAgIGxldCBvZmZzZXRBdHRyaWJ1dGUgPSBuZXcgVWludDhBcnJheShzaXplKTsKICAgICAgaWYgKG9mZnNldEF0dHJpYnV0ZVZhbHVlID09PSBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZV9kZWZhdWx0LlRPUCkgewogICAgICAgIG9mZnNldEF0dHJpYnV0ZSA9IG9mZnNldEF0dHJpYnV0ZS5maWxsKDEsIDAsIHNpemUgLyAyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvZmZzZXRWYWx1ZSA9IG9mZnNldEF0dHJpYnV0ZVZhbHVlID09PSBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZV9kZWZhdWx0Lk5PTkUgPyAwIDogMTsKICAgICAgICBvZmZzZXRBdHRyaWJ1dGUgPSBvZmZzZXRBdHRyaWJ1dGUuZmlsbChvZmZzZXRWYWx1ZSk7CiAgICAgIH0KICAgICAgdG9wQm90dG9tR2VvLmF0dHJpYnV0ZXMuYXBwbHlPZmZzZXQgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuVU5TSUdORURfQllURSwKICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAxLAogICAgICAgIHZhbHVlczogb2Zmc2V0QXR0cmlidXRlCiAgICAgIH0pOwogICAgfQogICAgaWYgKHZlcnRleEZvcm1hdC50YW5nZW50KSB7CiAgICAgIGNvbnN0IHRvcFRhbmdlbnRzID0gdG9wQm90dG9tR2VvLmF0dHJpYnV0ZXMudGFuZ2VudC52YWx1ZXM7CiAgICAgIHRhbmdlbnRzLnNldCh0b3BUYW5nZW50cyk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgIHRvcFRhbmdlbnRzW2ldID0gLXRvcFRhbmdlbnRzW2ldOwogICAgICB9CiAgICAgIHRhbmdlbnRzLnNldCh0b3BUYW5nZW50cywgbGVuZ3RoKTsKICAgICAgdG9wQm90dG9tR2VvLmF0dHJpYnV0ZXMudGFuZ2VudC52YWx1ZXMgPSB0YW5nZW50czsKICAgIH0KICAgIGlmICh2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgIGNvbnN0IHRvcEJpdGFuZ2VudHMgPSB0b3BCb3R0b21HZW8uYXR0cmlidXRlcy5iaXRhbmdlbnQudmFsdWVzOwogICAgICBiaXRhbmdlbnRzLnNldCh0b3BCaXRhbmdlbnRzKTsKICAgICAgYml0YW5nZW50cy5zZXQodG9wQml0YW5nZW50cywgbGVuZ3RoKTsKICAgICAgdG9wQm90dG9tR2VvLmF0dHJpYnV0ZXMuYml0YW5nZW50LnZhbHVlcyA9IGJpdGFuZ2VudHM7CiAgICB9CiAgICBpZiAodmVydGV4Rm9ybWF0LnN0KSB7CiAgICAgIHRvcFN0ID0gdG9wQm90dG9tR2VvLmF0dHJpYnV0ZXMuc3QudmFsdWVzOwogICAgICB0ZXh0dXJlcy5zZXQodG9wU3QpOwogICAgICB0ZXh0dXJlcy5zZXQodG9wU3QsIGxlbmd0aCAvIDMgKiAyKTsKICAgICAgdG9wQm90dG9tR2VvLmF0dHJpYnV0ZXMuc3QudmFsdWVzID0gdGV4dHVyZXM7CiAgICB9CiAgICBjb25zdCBpbmRpY2VzID0gdG9wQm90dG9tR2VvLmluZGljZXM7CiAgICBjb25zdCBpbmRpY2VzTGVuZ3RoID0gaW5kaWNlcy5sZW5ndGg7CiAgICBjb25zdCBwb3NMZW5ndGggPSBsZW5ndGggLyAzOwogICAgY29uc3QgbmV3SW5kaWNlcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KAogICAgICBuZXdMZW5ndGggLyAzLAogICAgICBpbmRpY2VzTGVuZ3RoICogMgogICAgKTsKICAgIG5ld0luZGljZXMuc2V0KGluZGljZXMpOwogICAgZm9yIChpID0gMDsgaSA8IGluZGljZXNMZW5ndGg7IGkgKz0gMykgewogICAgICBuZXdJbmRpY2VzW2kgKyBpbmRpY2VzTGVuZ3RoXSA9IGluZGljZXNbaSArIDJdICsgcG9zTGVuZ3RoOwogICAgICBuZXdJbmRpY2VzW2kgKyAxICsgaW5kaWNlc0xlbmd0aF0gPSBpbmRpY2VzW2kgKyAxXSArIHBvc0xlbmd0aDsKICAgICAgbmV3SW5kaWNlc1tpICsgMiArIGluZGljZXNMZW5ndGhdID0gaW5kaWNlc1tpXSArIHBvc0xlbmd0aDsKICAgIH0KICAgIHRvcEJvdHRvbUdlby5pbmRpY2VzID0gbmV3SW5kaWNlczsKICAgIGNvbnN0IG5vcnRoQ2FwID0gY29tcHV0ZWRPcHRpb25zLm5vcnRoQ2FwOwogICAgY29uc3Qgc291dGhDYXAgPSBjb21wdXRlZE9wdGlvbnMuc291dGhDYXA7CiAgICBsZXQgcm93SGVpZ2h0ID0gaGVpZ2h0OwogICAgbGV0IHdpZHRoTXVsdGlwbGllciA9IDI7CiAgICBsZXQgcGVyaW1ldGVyUG9zaXRpb25zID0gMDsKICAgIGxldCBjb3JuZXJzID0gNDsKICAgIGxldCBkdXBsaWF0ZUNvcm5lcnMgPSA0OwogICAgaWYgKG5vcnRoQ2FwKSB7CiAgICAgIHdpZHRoTXVsdGlwbGllciAtPSAxOwogICAgICByb3dIZWlnaHQgLT0gMTsKICAgICAgcGVyaW1ldGVyUG9zaXRpb25zICs9IDE7CiAgICAgIGNvcm5lcnMgLT0gMjsKICAgICAgZHVwbGlhdGVDb3JuZXJzIC09IDE7CiAgICB9CiAgICBpZiAoc291dGhDYXApIHsKICAgICAgd2lkdGhNdWx0aXBsaWVyIC09IDE7CiAgICAgIHJvd0hlaWdodCAtPSAxOwogICAgICBwZXJpbWV0ZXJQb3NpdGlvbnMgKz0gMTsKICAgICAgY29ybmVycyAtPSAyOwogICAgICBkdXBsaWF0ZUNvcm5lcnMgLT0gMTsKICAgIH0KICAgIHBlcmltZXRlclBvc2l0aW9ucyArPSB3aWR0aE11bHRpcGxpZXIgKiB3aWR0aCArIDIgKiByb3dIZWlnaHQgLSBjb3JuZXJzOwogICAgY29uc3Qgd2FsbENvdW50ID0gKHBlcmltZXRlclBvc2l0aW9ucyArIGR1cGxpYXRlQ29ybmVycykgKiAyOwogICAgbGV0IHdhbGxQb3NpdGlvbnMgPSBuZXcgRmxvYXQ2NEFycmF5KHdhbGxDb3VudCAqIDMpOwogICAgY29uc3Qgd2FsbEV4dHJ1ZGVOb3JtYWxzID0gc2hhZG93Vm9sdW1lID8gbmV3IEZsb2F0MzJBcnJheSh3YWxsQ291bnQgKiAzKSA6IHZvaWQgMDsKICAgIGxldCB3YWxsT2Zmc2V0QXR0cmlidXRlID0gaGFzT2Zmc2V0cyA/IG5ldyBVaW50OEFycmF5KHdhbGxDb3VudCkgOiB2b2lkIDA7CiAgICBsZXQgd2FsbFRleHR1cmVzID0gdmVydGV4Rm9ybWF0LnN0ID8gbmV3IEZsb2F0MzJBcnJheSh3YWxsQ291bnQgKiAyKSA6IHZvaWQgMDsKICAgIGNvbnN0IGNvbXB1dGVUb3BPZmZzZXRzID0gb2Zmc2V0QXR0cmlidXRlVmFsdWUgPT09IEdlb21ldHJ5T2Zmc2V0QXR0cmlidXRlX2RlZmF1bHQuVE9QOwogICAgaWYgKGhhc09mZnNldHMgJiYgIWNvbXB1dGVUb3BPZmZzZXRzKSB7CiAgICAgIG9mZnNldFZhbHVlID0gb2Zmc2V0QXR0cmlidXRlVmFsdWUgPT09IEdlb21ldHJ5T2Zmc2V0QXR0cmlidXRlX2RlZmF1bHQuQUxMID8gMSA6IDA7CiAgICAgIHdhbGxPZmZzZXRBdHRyaWJ1dGUgPSB3YWxsT2Zmc2V0QXR0cmlidXRlLmZpbGwob2Zmc2V0VmFsdWUpOwogICAgfQogICAgbGV0IHBvc0luZGV4ID0gMDsKICAgIGxldCBzdEluZGV4ID0gMDsKICAgIGxldCBleHRydWRlTm9ybWFsSW5kZXggPSAwOwogICAgbGV0IHdhbGxPZmZzZXRJbmRleCA9IDA7CiAgICBjb25zdCBhcmVhMiA9IHdpZHRoICogcm93SGVpZ2h0OwogICAgbGV0IHRocmVlSTsKICAgIGZvciAoaSA9IDA7IGkgPCBhcmVhMjsgaSArPSB3aWR0aCkgewogICAgICB0aHJlZUkgPSBpICogMzsKICAgICAgd2FsbFBvc2l0aW9ucyA9IGFkZFdhbGxQb3NpdGlvbnMyKAogICAgICAgIHdhbGxQb3NpdGlvbnMsCiAgICAgICAgcG9zSW5kZXgsCiAgICAgICAgdGhyZWVJLAogICAgICAgIHRvcFBvc2l0aW9ucywKICAgICAgICBib3R0b21Qb3NpdGlvbnMKICAgICAgKTsKICAgICAgcG9zSW5kZXggKz0gNjsKICAgICAgaWYgKHZlcnRleEZvcm1hdC5zdCkgewogICAgICAgIHdhbGxUZXh0dXJlcyA9IGFkZFdhbGxUZXh0dXJlQ29vcmRpbmF0ZXMoCiAgICAgICAgICB3YWxsVGV4dHVyZXMsCiAgICAgICAgICBzdEluZGV4LAogICAgICAgICAgaSAqIDIsCiAgICAgICAgICB0b3BTdAogICAgICAgICk7CiAgICAgICAgc3RJbmRleCArPSA0OwogICAgICB9CiAgICAgIGlmIChzaGFkb3dWb2x1bWUpIHsKICAgICAgICBleHRydWRlTm9ybWFsSW5kZXggKz0gMzsKICAgICAgICB3YWxsRXh0cnVkZU5vcm1hbHNbZXh0cnVkZU5vcm1hbEluZGV4KytdID0gdG9wTm9ybWFsc1t0aHJlZUldOwogICAgICAgIHdhbGxFeHRydWRlTm9ybWFsc1tleHRydWRlTm9ybWFsSW5kZXgrK10gPSB0b3BOb3JtYWxzW3RocmVlSSArIDFdOwogICAgICAgIHdhbGxFeHRydWRlTm9ybWFsc1tleHRydWRlTm9ybWFsSW5kZXgrK10gPSB0b3BOb3JtYWxzW3RocmVlSSArIDJdOwogICAgICB9CiAgICAgIGlmIChjb21wdXRlVG9wT2Zmc2V0cykgewogICAgICAgIHdhbGxPZmZzZXRBdHRyaWJ1dGVbd2FsbE9mZnNldEluZGV4KytdID0gMTsKICAgICAgICB3YWxsT2Zmc2V0SW5kZXggKz0gMTsKICAgICAgfQogICAgfQogICAgaWYgKCFzb3V0aENhcCkgewogICAgICBmb3IgKGkgPSBhcmVhMiAtIHdpZHRoOyBpIDwgYXJlYTI7IGkrKykgewogICAgICAgIHRocmVlSSA9IGkgKiAzOwogICAgICAgIHdhbGxQb3NpdGlvbnMgPSBhZGRXYWxsUG9zaXRpb25zMigKICAgICAgICAgIHdhbGxQb3NpdGlvbnMsCiAgICAgICAgICBwb3NJbmRleCwKICAgICAgICAgIHRocmVlSSwKICAgICAgICAgIHRvcFBvc2l0aW9ucywKICAgICAgICAgIGJvdHRvbVBvc2l0aW9ucwogICAgICAgICk7CiAgICAgICAgcG9zSW5kZXggKz0gNjsKICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnN0KSB7CiAgICAgICAgICB3YWxsVGV4dHVyZXMgPSBhZGRXYWxsVGV4dHVyZUNvb3JkaW5hdGVzKAogICAgICAgICAgICB3YWxsVGV4dHVyZXMsCiAgICAgICAgICAgIHN0SW5kZXgsCiAgICAgICAgICAgIGkgKiAyLAogICAgICAgICAgICB0b3BTdAogICAgICAgICAgKTsKICAgICAgICAgIHN0SW5kZXggKz0gNDsKICAgICAgICB9CiAgICAgICAgaWYgKHNoYWRvd1ZvbHVtZSkgewogICAgICAgICAgZXh0cnVkZU5vcm1hbEluZGV4ICs9IDM7CiAgICAgICAgICB3YWxsRXh0cnVkZU5vcm1hbHNbZXh0cnVkZU5vcm1hbEluZGV4KytdID0gdG9wTm9ybWFsc1t0aHJlZUldOwogICAgICAgICAgd2FsbEV4dHJ1ZGVOb3JtYWxzW2V4dHJ1ZGVOb3JtYWxJbmRleCsrXSA9IHRvcE5vcm1hbHNbdGhyZWVJICsgMV07CiAgICAgICAgICB3YWxsRXh0cnVkZU5vcm1hbHNbZXh0cnVkZU5vcm1hbEluZGV4KytdID0gdG9wTm9ybWFsc1t0aHJlZUkgKyAyXTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbXB1dGVUb3BPZmZzZXRzKSB7CiAgICAgICAgICB3YWxsT2Zmc2V0QXR0cmlidXRlW3dhbGxPZmZzZXRJbmRleCsrXSA9IDE7CiAgICAgICAgICB3YWxsT2Zmc2V0SW5kZXggKz0gMTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHNvdXRoSW5kZXggPSBub3J0aENhcCA/IGFyZWEyICsgMSA6IGFyZWEyOwogICAgICB0aHJlZUkgPSBzb3V0aEluZGV4ICogMzsKICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgIHdhbGxQb3NpdGlvbnMgPSBhZGRXYWxsUG9zaXRpb25zMigKICAgICAgICAgIHdhbGxQb3NpdGlvbnMsCiAgICAgICAgICBwb3NJbmRleCwKICAgICAgICAgIHRocmVlSSwKICAgICAgICAgIHRvcFBvc2l0aW9ucywKICAgICAgICAgIGJvdHRvbVBvc2l0aW9ucwogICAgICAgICk7CiAgICAgICAgcG9zSW5kZXggKz0gNjsKICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnN0KSB7CiAgICAgICAgICB3YWxsVGV4dHVyZXMgPSBhZGRXYWxsVGV4dHVyZUNvb3JkaW5hdGVzKAogICAgICAgICAgICB3YWxsVGV4dHVyZXMsCiAgICAgICAgICAgIHN0SW5kZXgsCiAgICAgICAgICAgIHNvdXRoSW5kZXggKiAyLAogICAgICAgICAgICB0b3BTdAogICAgICAgICAgKTsKICAgICAgICAgIHN0SW5kZXggKz0gNDsKICAgICAgICB9CiAgICAgICAgaWYgKHNoYWRvd1ZvbHVtZSkgewogICAgICAgICAgZXh0cnVkZU5vcm1hbEluZGV4ICs9IDM7CiAgICAgICAgICB3YWxsRXh0cnVkZU5vcm1hbHNbZXh0cnVkZU5vcm1hbEluZGV4KytdID0gdG9wTm9ybWFsc1t0aHJlZUldOwogICAgICAgICAgd2FsbEV4dHJ1ZGVOb3JtYWxzW2V4dHJ1ZGVOb3JtYWxJbmRleCsrXSA9IHRvcE5vcm1hbHNbdGhyZWVJICsgMV07CiAgICAgICAgICB3YWxsRXh0cnVkZU5vcm1hbHNbZXh0cnVkZU5vcm1hbEluZGV4KytdID0gdG9wTm9ybWFsc1t0aHJlZUkgKyAyXTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbXB1dGVUb3BPZmZzZXRzKSB7CiAgICAgICAgICB3YWxsT2Zmc2V0QXR0cmlidXRlW3dhbGxPZmZzZXRJbmRleCsrXSA9IDE7CiAgICAgICAgICB3YWxsT2Zmc2V0SW5kZXggKz0gMTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZvciAoaSA9IGFyZWEyIC0gMTsgaSA+IDA7IGkgLT0gd2lkdGgpIHsKICAgICAgdGhyZWVJID0gaSAqIDM7CiAgICAgIHdhbGxQb3NpdGlvbnMgPSBhZGRXYWxsUG9zaXRpb25zMigKICAgICAgICB3YWxsUG9zaXRpb25zLAogICAgICAgIHBvc0luZGV4LAogICAgICAgIHRocmVlSSwKICAgICAgICB0b3BQb3NpdGlvbnMsCiAgICAgICAgYm90dG9tUG9zaXRpb25zCiAgICAgICk7CiAgICAgIHBvc0luZGV4ICs9IDY7CiAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuc3QpIHsKICAgICAgICB3YWxsVGV4dHVyZXMgPSBhZGRXYWxsVGV4dHVyZUNvb3JkaW5hdGVzKAogICAgICAgICAgd2FsbFRleHR1cmVzLAogICAgICAgICAgc3RJbmRleCwKICAgICAgICAgIGkgKiAyLAogICAgICAgICAgdG9wU3QKICAgICAgICApOwogICAgICAgIHN0SW5kZXggKz0gNDsKICAgICAgfQogICAgICBpZiAoc2hhZG93Vm9sdW1lKSB7CiAgICAgICAgZXh0cnVkZU5vcm1hbEluZGV4ICs9IDM7CiAgICAgICAgd2FsbEV4dHJ1ZGVOb3JtYWxzW2V4dHJ1ZGVOb3JtYWxJbmRleCsrXSA9IHRvcE5vcm1hbHNbdGhyZWVJXTsKICAgICAgICB3YWxsRXh0cnVkZU5vcm1hbHNbZXh0cnVkZU5vcm1hbEluZGV4KytdID0gdG9wTm9ybWFsc1t0aHJlZUkgKyAxXTsKICAgICAgICB3YWxsRXh0cnVkZU5vcm1hbHNbZXh0cnVkZU5vcm1hbEluZGV4KytdID0gdG9wTm9ybWFsc1t0aHJlZUkgKyAyXTsKICAgICAgfQogICAgICBpZiAoY29tcHV0ZVRvcE9mZnNldHMpIHsKICAgICAgICB3YWxsT2Zmc2V0QXR0cmlidXRlW3dhbGxPZmZzZXRJbmRleCsrXSA9IDE7CiAgICAgICAgd2FsbE9mZnNldEluZGV4ICs9IDE7CiAgICAgIH0KICAgIH0KICAgIGlmICghbm9ydGhDYXApIHsKICAgICAgZm9yIChpID0gd2lkdGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgIHRocmVlSSA9IGkgKiAzOwogICAgICAgIHdhbGxQb3NpdGlvbnMgPSBhZGRXYWxsUG9zaXRpb25zMigKICAgICAgICAgIHdhbGxQb3NpdGlvbnMsCiAgICAgICAgICBwb3NJbmRleCwKICAgICAgICAgIHRocmVlSSwKICAgICAgICAgIHRvcFBvc2l0aW9ucywKICAgICAgICAgIGJvdHRvbVBvc2l0aW9ucwogICAgICAgICk7CiAgICAgICAgcG9zSW5kZXggKz0gNjsKICAgICAgICBpZiAodmVydGV4Rm9ybWF0LnN0KSB7CiAgICAgICAgICB3YWxsVGV4dHVyZXMgPSBhZGRXYWxsVGV4dHVyZUNvb3JkaW5hdGVzKAogICAgICAgICAgICB3YWxsVGV4dHVyZXMsCiAgICAgICAgICAgIHN0SW5kZXgsCiAgICAgICAgICAgIGkgKiAyLAogICAgICAgICAgICB0b3BTdAogICAgICAgICAgKTsKICAgICAgICAgIHN0SW5kZXggKz0gNDsKICAgICAgICB9CiAgICAgICAgaWYgKHNoYWRvd1ZvbHVtZSkgewogICAgICAgICAgZXh0cnVkZU5vcm1hbEluZGV4ICs9IDM7CiAgICAgICAgICB3YWxsRXh0cnVkZU5vcm1hbHNbZXh0cnVkZU5vcm1hbEluZGV4KytdID0gdG9wTm9ybWFsc1t0aHJlZUldOwogICAgICAgICAgd2FsbEV4dHJ1ZGVOb3JtYWxzW2V4dHJ1ZGVOb3JtYWxJbmRleCsrXSA9IHRvcE5vcm1hbHNbdGhyZWVJICsgMV07CiAgICAgICAgICB3YWxsRXh0cnVkZU5vcm1hbHNbZXh0cnVkZU5vcm1hbEluZGV4KytdID0gdG9wTm9ybWFsc1t0aHJlZUkgKyAyXTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbXB1dGVUb3BPZmZzZXRzKSB7CiAgICAgICAgICB3YWxsT2Zmc2V0QXR0cmlidXRlW3dhbGxPZmZzZXRJbmRleCsrXSA9IDE7CiAgICAgICAgICB3YWxsT2Zmc2V0SW5kZXggKz0gMTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IG5vcnRoSW5kZXggPSBhcmVhMjsKICAgICAgdGhyZWVJID0gbm9ydGhJbmRleCAqIDM7CiAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICB3YWxsUG9zaXRpb25zID0gYWRkV2FsbFBvc2l0aW9uczIoCiAgICAgICAgICB3YWxsUG9zaXRpb25zLAogICAgICAgICAgcG9zSW5kZXgsCiAgICAgICAgICB0aHJlZUksCiAgICAgICAgICB0b3BQb3NpdGlvbnMsCiAgICAgICAgICBib3R0b21Qb3NpdGlvbnMKICAgICAgICApOwogICAgICAgIHBvc0luZGV4ICs9IDY7CiAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5zdCkgewogICAgICAgICAgd2FsbFRleHR1cmVzID0gYWRkV2FsbFRleHR1cmVDb29yZGluYXRlcygKICAgICAgICAgICAgd2FsbFRleHR1cmVzLAogICAgICAgICAgICBzdEluZGV4LAogICAgICAgICAgICBub3J0aEluZGV4ICogMiwKICAgICAgICAgICAgdG9wU3QKICAgICAgICAgICk7CiAgICAgICAgICBzdEluZGV4ICs9IDQ7CiAgICAgICAgfQogICAgICAgIGlmIChzaGFkb3dWb2x1bWUpIHsKICAgICAgICAgIGV4dHJ1ZGVOb3JtYWxJbmRleCArPSAzOwogICAgICAgICAgd2FsbEV4dHJ1ZGVOb3JtYWxzW2V4dHJ1ZGVOb3JtYWxJbmRleCsrXSA9IHRvcE5vcm1hbHNbdGhyZWVJXTsKICAgICAgICAgIHdhbGxFeHRydWRlTm9ybWFsc1tleHRydWRlTm9ybWFsSW5kZXgrK10gPSB0b3BOb3JtYWxzW3RocmVlSSArIDFdOwogICAgICAgICAgd2FsbEV4dHJ1ZGVOb3JtYWxzW2V4dHJ1ZGVOb3JtYWxJbmRleCsrXSA9IHRvcE5vcm1hbHNbdGhyZWVJICsgMl07CiAgICAgICAgfQogICAgICAgIGlmIChjb21wdXRlVG9wT2Zmc2V0cykgewogICAgICAgICAgd2FsbE9mZnNldEF0dHJpYnV0ZVt3YWxsT2Zmc2V0SW5kZXgrK10gPSAxOwogICAgICAgICAgd2FsbE9mZnNldEluZGV4ICs9IDE7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBsZXQgZ2VvID0gY2FsY3VsYXRlQXR0cmlidXRlc1dhbGwod2FsbFBvc2l0aW9ucywgdmVydGV4Rm9ybWF0LCBlbGxpcHNvaWQpOwogICAgaWYgKHZlcnRleEZvcm1hdC5zdCkgewogICAgICBnZW8uYXR0cmlidXRlcy5zdCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5GTE9BVCwKICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAyLAogICAgICAgIHZhbHVlczogd2FsbFRleHR1cmVzCiAgICAgIH0pOwogICAgfQogICAgaWYgKHNoYWRvd1ZvbHVtZSkgewogICAgICBnZW8uYXR0cmlidXRlcy5leHRydWRlRGlyZWN0aW9uID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgdmFsdWVzOiB3YWxsRXh0cnVkZU5vcm1hbHMKICAgICAgfSk7CiAgICB9CiAgICBpZiAoaGFzT2Zmc2V0cykgewogICAgICBnZW8uYXR0cmlidXRlcy5hcHBseU9mZnNldCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5VTlNJR05FRF9CWVRFLAogICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDEsCiAgICAgICAgdmFsdWVzOiB3YWxsT2Zmc2V0QXR0cmlidXRlCiAgICAgIH0pOwogICAgfQogICAgY29uc3Qgd2FsbEluZGljZXMgPSBJbmRleERhdGF0eXBlX2RlZmF1bHQuY3JlYXRlVHlwZWRBcnJheSgKICAgICAgd2FsbENvdW50LAogICAgICBwZXJpbWV0ZXJQb3NpdGlvbnMgKiA2CiAgICApOwogICAgbGV0IHVwcGVyTGVmdDsKICAgIGxldCBsb3dlckxlZnQ7CiAgICBsZXQgbG93ZXJSaWdodDsKICAgIGxldCB1cHBlclJpZ2h0OwogICAgbGVuZ3RoID0gd2FsbFBvc2l0aW9ucy5sZW5ndGggLyAzOwogICAgbGV0IGluZGV4ID0gMDsKICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggLSAxOyBpICs9IDIpIHsKICAgICAgdXBwZXJMZWZ0ID0gaTsKICAgICAgdXBwZXJSaWdodCA9ICh1cHBlckxlZnQgKyAyKSAlIGxlbmd0aDsKICAgICAgY29uc3QgcDEgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KHdhbGxQb3NpdGlvbnMsIHVwcGVyTGVmdCAqIDMsIHYxU2NyYXRjaCk7CiAgICAgIGNvbnN0IHAyID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheSh3YWxsUG9zaXRpb25zLCB1cHBlclJpZ2h0ICogMywgdjJTY3JhdGNoKTsKICAgICAgaWYgKENhcnRlc2lhbjNfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKHAxLCBwMiwgTWF0aF9kZWZhdWx0LkVQU0lMT04xMCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsb3dlckxlZnQgPSAodXBwZXJMZWZ0ICsgMSkgJSBsZW5ndGg7CiAgICAgIGxvd2VyUmlnaHQgPSAobG93ZXJMZWZ0ICsgMikgJSBsZW5ndGg7CiAgICAgIHdhbGxJbmRpY2VzW2luZGV4KytdID0gdXBwZXJMZWZ0OwogICAgICB3YWxsSW5kaWNlc1tpbmRleCsrXSA9IGxvd2VyTGVmdDsKICAgICAgd2FsbEluZGljZXNbaW5kZXgrK10gPSB1cHBlclJpZ2h0OwogICAgICB3YWxsSW5kaWNlc1tpbmRleCsrXSA9IHVwcGVyUmlnaHQ7CiAgICAgIHdhbGxJbmRpY2VzW2luZGV4KytdID0gbG93ZXJMZWZ0OwogICAgICB3YWxsSW5kaWNlc1tpbmRleCsrXSA9IGxvd2VyUmlnaHQ7CiAgICB9CiAgICBnZW8uaW5kaWNlcyA9IHdhbGxJbmRpY2VzOwogICAgZ2VvID0gR2VvbWV0cnlQaXBlbGluZV9kZWZhdWx0LmNvbWJpbmVJbnN0YW5jZXMoWwogICAgICBuZXcgR2VvbWV0cnlJbnN0YW5jZV9kZWZhdWx0KHsKICAgICAgICBnZW9tZXRyeTogdG9wQm90dG9tR2VvCiAgICAgIH0pLAogICAgICBuZXcgR2VvbWV0cnlJbnN0YW5jZV9kZWZhdWx0KHsKICAgICAgICBnZW9tZXRyeTogZ2VvCiAgICAgIH0pCiAgICBdKTsKICAgIHJldHVybiBnZW9bMF07CiAgfQogIGZ1bmN0aW9uIGNvbXB1dGVSZWN0YW5nbGUzKHJlY3RhbmdsZSwgZ3JhbnVsYXJpdHksIHJvdGF0aW9uLCBlbGxpcHNvaWQsIHJlc3VsdCkgewogICAgaWYgKHJvdGF0aW9uID09PSAwKSB7CiAgICAgIHJldHVybiBSZWN0YW5nbGVfZGVmYXVsdC5jbG9uZShyZWN0YW5nbGUsIHJlc3VsdCk7CiAgICB9CiAgICBjb25zdCBjb21wdXRlZE9wdGlvbnMgPSBSZWN0YW5nbGVHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5jb21wdXRlT3B0aW9ucygKICAgICAgcmVjdGFuZ2xlLAogICAgICBncmFudWxhcml0eSwKICAgICAgcm90YXRpb24sCiAgICAgIDAsCiAgICAgIHJlY3RhbmdsZVNjcmF0Y2gsCiAgICAgIG53U2NyYXRjaAogICAgKTsKICAgIGNvbnN0IGhlaWdodCA9IGNvbXB1dGVkT3B0aW9ucy5oZWlnaHQ7CiAgICBjb25zdCB3aWR0aCA9IGNvbXB1dGVkT3B0aW9ucy53aWR0aDsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IHNjcmF0Y2hSZWN0YW5nbGVQb2ludHM7CiAgICBSZWN0YW5nbGVHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5jb21wdXRlUG9zaXRpb24oCiAgICAgIGNvbXB1dGVkT3B0aW9ucywKICAgICAgZWxsaXBzb2lkLAogICAgICBmYWxzZSwKICAgICAgMCwKICAgICAgMCwKICAgICAgcG9zaXRpb25zWzBdCiAgICApOwogICAgUmVjdGFuZ2xlR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuY29tcHV0ZVBvc2l0aW9uKAogICAgICBjb21wdXRlZE9wdGlvbnMsCiAgICAgIGVsbGlwc29pZCwKICAgICAgZmFsc2UsCiAgICAgIDAsCiAgICAgIHdpZHRoIC0gMSwKICAgICAgcG9zaXRpb25zWzFdCiAgICApOwogICAgUmVjdGFuZ2xlR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuY29tcHV0ZVBvc2l0aW9uKAogICAgICBjb21wdXRlZE9wdGlvbnMsCiAgICAgIGVsbGlwc29pZCwKICAgICAgZmFsc2UsCiAgICAgIGhlaWdodCAtIDEsCiAgICAgIDAsCiAgICAgIHBvc2l0aW9uc1syXQogICAgKTsKICAgIFJlY3RhbmdsZUdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmNvbXB1dGVQb3NpdGlvbigKICAgICAgY29tcHV0ZWRPcHRpb25zLAogICAgICBlbGxpcHNvaWQsCiAgICAgIGZhbHNlLAogICAgICBoZWlnaHQgLSAxLAogICAgICB3aWR0aCAtIDEsCiAgICAgIHBvc2l0aW9uc1szXQogICAgKTsKICAgIHJldHVybiBSZWN0YW5nbGVfZGVmYXVsdC5mcm9tQ2FydGVzaWFuQXJyYXkocG9zaXRpb25zLCBlbGxpcHNvaWQsIHJlc3VsdCk7CiAgfQogIGZ1bmN0aW9uIFJlY3RhbmdsZUdlb21ldHJ5KG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgIGNvbnN0IHJlY3RhbmdsZSA9IG9wdGlvbnMucmVjdGFuZ2xlOwogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLCByZWN0YW5nbGUpOwogICAgUmVjdGFuZ2xlX2RlZmF1bHQuX3ZhbGlkYXRlKHJlY3RhbmdsZSk7CiAgICBpZiAocmVjdGFuZ2xlLm5vcnRoIDwgcmVjdGFuZ2xlLnNvdXRoKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICJvcHRpb25zLnJlY3RhbmdsZS5ub3J0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBvcHRpb25zLnJlY3RhbmdsZS5zb3V0aCIKICAgICAgKTsKICAgIH0KICAgIGNvbnN0IGhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0ID8/IDA7CiAgICBjb25zdCBleHRydWRlZEhlaWdodCA9IG9wdGlvbnMuZXh0cnVkZWRIZWlnaHQgPz8gaGVpZ2h0OwogICAgdGhpcy5fcmVjdGFuZ2xlID0gUmVjdGFuZ2xlX2RlZmF1bHQuY2xvbmUocmVjdGFuZ2xlKTsKICAgIHRoaXMuX2dyYW51bGFyaXR5ID0gb3B0aW9ucy5ncmFudWxhcml0eSA/PyBNYXRoX2RlZmF1bHQuUkFESUFOU19QRVJfREVHUkVFOwogICAgdGhpcy5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUob3B0aW9ucy5lbGxpcHNvaWQgPz8gRWxsaXBzb2lkX2RlZmF1bHQuZGVmYXVsdCk7CiAgICB0aGlzLl9zdXJmYWNlSGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCBleHRydWRlZEhlaWdodCk7CiAgICB0aGlzLl9yb3RhdGlvbiA9IG9wdGlvbnMucm90YXRpb24gPz8gMDsKICAgIHRoaXMuX3N0Um90YXRpb24gPSBvcHRpb25zLnN0Um90YXRpb24gPz8gMDsKICAgIHRoaXMuX3ZlcnRleEZvcm1hdCA9IFZlcnRleEZvcm1hdF9kZWZhdWx0LmNsb25lKAogICAgICBvcHRpb25zLnZlcnRleEZvcm1hdCA/PyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5ERUZBVUxUCiAgICApOwogICAgdGhpcy5fZXh0cnVkZWRIZWlnaHQgPSBNYXRoLm1pbihoZWlnaHQsIGV4dHJ1ZGVkSGVpZ2h0KTsKICAgIHRoaXMuX3NoYWRvd1ZvbHVtZSA9IG9wdGlvbnMuc2hhZG93Vm9sdW1lID8/IGZhbHNlOwogICAgdGhpcy5fd29ya2VyTmFtZSA9ICJjcmVhdGVSZWN0YW5nbGVHZW9tZXRyeSI7CiAgICB0aGlzLl9vZmZzZXRBdHRyaWJ1dGUgPSBvcHRpb25zLm9mZnNldEF0dHJpYnV0ZTsKICAgIHRoaXMuX3JvdGF0ZWRSZWN0YW5nbGUgPSB2b2lkIDA7CiAgICB0aGlzLl90ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzID0gdm9pZCAwOwogIH0KICBmdW5jdGlvbiB0ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzMyhyZWN0YW5nbGVHZW9tZXRyeSkgewogICAgaWYgKHJlY3RhbmdsZUdlb21ldHJ5Ll9zdFJvdGF0aW9uID09PSAwKSB7CiAgICAgIHJldHVybiBbMCwgMCwgMCwgMSwgMSwgMF07CiAgICB9CiAgICBjb25zdCByZWN0YW5nbGUgPSBSZWN0YW5nbGVfZGVmYXVsdC5jbG9uZSgKICAgICAgcmVjdGFuZ2xlR2VvbWV0cnkuX3JlY3RhbmdsZSwKICAgICAgdW5yb3RhdGVkVGV4dHVyZVJlY3RhbmdsZVNjcmF0Y2gKICAgICk7CiAgICBjb25zdCBncmFudWxhcml0eSA9IHJlY3RhbmdsZUdlb21ldHJ5Ll9ncmFudWxhcml0eTsKICAgIGNvbnN0IGVsbGlwc29pZCA9IHJlY3RhbmdsZUdlb21ldHJ5Ll9lbGxpcHNvaWQ7CiAgICBjb25zdCByb3RhdGlvbiA9IHJlY3RhbmdsZUdlb21ldHJ5Ll9yb3RhdGlvbiAtIHJlY3RhbmdsZUdlb21ldHJ5Ll9zdFJvdGF0aW9uOwogICAgY29uc3QgdW5yb3RhdGVkVGV4dHVyZVJlY3RhbmdsZSA9IGNvbXB1dGVSZWN0YW5nbGUzKAogICAgICByZWN0YW5nbGUsCiAgICAgIGdyYW51bGFyaXR5LAogICAgICByb3RhdGlvbiwKICAgICAgZWxsaXBzb2lkLAogICAgICB1bnJvdGF0ZWRUZXh0dXJlUmVjdGFuZ2xlU2NyYXRjaAogICAgKTsKICAgIGNvbnN0IHBvaW50czJEID0gcG9pbnRzMkRTY3JhdGNoMjsKICAgIHBvaW50czJEWzBdLnggPSB1bnJvdGF0ZWRUZXh0dXJlUmVjdGFuZ2xlLndlc3Q7CiAgICBwb2ludHMyRFswXS55ID0gdW5yb3RhdGVkVGV4dHVyZVJlY3RhbmdsZS5zb3V0aDsKICAgIHBvaW50czJEWzFdLnggPSB1bnJvdGF0ZWRUZXh0dXJlUmVjdGFuZ2xlLndlc3Q7CiAgICBwb2ludHMyRFsxXS55ID0gdW5yb3RhdGVkVGV4dHVyZVJlY3RhbmdsZS5ub3J0aDsKICAgIHBvaW50czJEWzJdLnggPSB1bnJvdGF0ZWRUZXh0dXJlUmVjdGFuZ2xlLmVhc3Q7CiAgICBwb2ludHMyRFsyXS55ID0gdW5yb3RhdGVkVGV4dHVyZVJlY3RhbmdsZS5zb3V0aDsKICAgIGNvbnN0IGJvdW5kaW5nUmVjdGFuZ2xlID0gcmVjdGFuZ2xlR2VvbWV0cnkucmVjdGFuZ2xlOwogICAgY29uc3QgdG9EZXNpcmVkSW5Db21wdXRlZCA9IE1hdHJpeDJfZGVmYXVsdC5mcm9tUm90YXRpb24oCiAgICAgIHJlY3RhbmdsZUdlb21ldHJ5Ll9zdFJvdGF0aW9uLAogICAgICByb3RhdGlvbjJEU2NyYXRjaDIKICAgICk7CiAgICBjb25zdCBib3VuZGluZ1JlY3RhbmdsZUNlbnRlciA9IFJlY3RhbmdsZV9kZWZhdWx0LmNlbnRlcigKICAgICAgYm91bmRpbmdSZWN0YW5nbGUsCiAgICAgIHJlY3RhbmdsZUNlbnRlclNjcmF0Y2gyCiAgICApOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICAgY29uc3QgcG9pbnQyRCA9IHBvaW50czJEW2ldOwogICAgICBwb2ludDJELnggLT0gYm91bmRpbmdSZWN0YW5nbGVDZW50ZXIubG9uZ2l0dWRlOwogICAgICBwb2ludDJELnkgLT0gYm91bmRpbmdSZWN0YW5nbGVDZW50ZXIubGF0aXR1ZGU7CiAgICAgIE1hdHJpeDJfZGVmYXVsdC5tdWx0aXBseUJ5VmVjdG9yKHRvRGVzaXJlZEluQ29tcHV0ZWQsIHBvaW50MkQsIHBvaW50MkQpOwogICAgICBwb2ludDJELnggKz0gYm91bmRpbmdSZWN0YW5nbGVDZW50ZXIubG9uZ2l0dWRlOwogICAgICBwb2ludDJELnkgKz0gYm91bmRpbmdSZWN0YW5nbGVDZW50ZXIubGF0aXR1ZGU7CiAgICAgIHBvaW50MkQueCA9IChwb2ludDJELnggLSBib3VuZGluZ1JlY3RhbmdsZS53ZXN0KSAvIGJvdW5kaW5nUmVjdGFuZ2xlLndpZHRoOwogICAgICBwb2ludDJELnkgPSAocG9pbnQyRC55IC0gYm91bmRpbmdSZWN0YW5nbGUuc291dGgpIC8gYm91bmRpbmdSZWN0YW5nbGUuaGVpZ2h0OwogICAgfQogICAgY29uc3QgbWluWFlDb3JuZXIgPSBwb2ludHMyRFswXTsKICAgIGNvbnN0IG1heFlDb3JuZXIgPSBwb2ludHMyRFsxXTsKICAgIGNvbnN0IG1heFhDb3JuZXIgPSBwb2ludHMyRFsyXTsKICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheSg2KTsKICAgIENhcnRlc2lhbjJfZGVmYXVsdC5wYWNrKG1pblhZQ29ybmVyLCByZXN1bHQpOwogICAgQ2FydGVzaWFuMl9kZWZhdWx0LnBhY2sobWF4WUNvcm5lciwgcmVzdWx0LCAyKTsKICAgIENhcnRlc2lhbjJfZGVmYXVsdC5wYWNrKG1heFhDb3JuZXIsIHJlc3VsdCwgNCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICB2YXIgcG9zaXRpb25TY3JhdGNoMiwgbm9ybWFsU2NyYXRjaDQsIHRhbmdlbnRTY3JhdGNoMiwgYml0YW5nZW50U2NyYXRjaDIsIHJlY3RhbmdsZVNjcmF0Y2gsIHN0U2NyYXRjaDIsIGJvdHRvbUJvdW5kaW5nU3BoZXJlMywgdG9wQm91bmRpbmdTcGhlcmUzLCB2MVNjcmF0Y2gsIHYyU2NyYXRjaCwgc2NyYXRjaFZlcnRleEZvcm1hdDEyLCBzY3JhdGNoUmVjdGFuZ2xlUG9pbnRzLCBud1NjcmF0Y2gsIHN0TndTY3JhdGNoLCBzY3JhdGNoUmVjdGFuZ2xlLCBzY3JhdGNoRWxsaXBzb2lkMTEsIHNjcmF0Y2hPcHRpb25zMTksIHRhbmdlbnRSb3RhdGlvbk1hdHJpeFNjcmF0Y2gsIHF1YXRlcm5pb25TY3JhdGNoNCwgY2VudGVyU2NyYXRjaDQsIHVucm90YXRlZFRleHR1cmVSZWN0YW5nbGVTY3JhdGNoLCBwb2ludHMyRFNjcmF0Y2gyLCByb3RhdGlvbjJEU2NyYXRjaDIsIHJlY3RhbmdsZUNlbnRlclNjcmF0Y2gyLCBSZWN0YW5nbGVHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X1JlY3RhbmdsZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9SZWN0YW5nbGVHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfQm91bmRpbmdTcGhlcmUoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4yKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRvZ3JhcGhpYygpOwogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfQ29tcG9uZW50RGF0YXR5cGUoKTsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9HZW9tZXRyeSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlKCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGVzKCk7CiAgICAgIGluaXRfR2VvbWV0cnlJbnN0YW5jZSgpOwogICAgICBpbml0X0dlb21ldHJ5T2Zmc2V0QXR0cmlidXRlKCk7CiAgICAgIGluaXRfR2VvbWV0cnlQaXBlbGluZSgpOwogICAgICBpbml0X0luZGV4RGF0YXR5cGUoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGluaXRfTWF0cml4MigpOwogICAgICBpbml0X01hdHJpeDMoKTsKICAgICAgaW5pdF9Qb2x5Z29uUGlwZWxpbmUoKTsKICAgICAgaW5pdF9QcmltaXRpdmVUeXBlKCk7CiAgICAgIGluaXRfUXVhdGVybmlvbigpOwogICAgICBpbml0X1JlY3RhbmdsZSgpOwogICAgICBpbml0X1JlY3RhbmdsZUdlb21ldHJ5TGlicmFyeSgpOwogICAgICBpbml0X1ZlcnRleEZvcm1hdCgpOwogICAgICBwb3NpdGlvblNjcmF0Y2gyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBub3JtYWxTY3JhdGNoNCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgdGFuZ2VudFNjcmF0Y2gyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBiaXRhbmdlbnRTY3JhdGNoMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgcmVjdGFuZ2xlU2NyYXRjaCA9IG5ldyBSZWN0YW5nbGVfZGVmYXVsdCgpOwogICAgICBzdFNjcmF0Y2gyID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICBib3R0b21Cb3VuZGluZ1NwaGVyZTMgPSBuZXcgQm91bmRpbmdTcGhlcmVfZGVmYXVsdCgpOwogICAgICB0b3BCb3VuZGluZ1NwaGVyZTMgPSBuZXcgQm91bmRpbmdTcGhlcmVfZGVmYXVsdCgpOwogICAgICB2MVNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHYyU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFZlcnRleEZvcm1hdDEyID0gbmV3IFZlcnRleEZvcm1hdF9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hSZWN0YW5nbGVQb2ludHMgPSBbCiAgICAgICAgbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpLAogICAgICAgIG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKSwKICAgICAgICBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCksCiAgICAgICAgbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpCiAgICAgIF07CiAgICAgIG53U2NyYXRjaCA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBzdE53U2NyYXRjaCA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBSZWN0YW5nbGVHZW9tZXRyeS5wYWNrZWRMZW5ndGggPSBSZWN0YW5nbGVfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyA3OwogICAgICBSZWN0YW5nbGVHZW9tZXRyeS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgUmVjdGFuZ2xlX2RlZmF1bHQucGFjayh2YWx1ZS5fcmVjdGFuZ2xlLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBSZWN0YW5nbGVfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgRWxsaXBzb2lkX2RlZmF1bHQucGFjayh2YWx1ZS5fZWxsaXBzb2lkLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgVmVydGV4Rm9ybWF0X2RlZmF1bHQucGFjayh2YWx1ZS5fdmVydGV4Rm9ybWF0LCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9ncmFudWxhcml0eTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX3N1cmZhY2VIZWlnaHQ7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9yb3RhdGlvbjsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX3N0Um90YXRpb247CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9leHRydWRlZEhlaWdodDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX3NoYWRvd1ZvbHVtZSA/IDEgOiAwOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXhdID0gdmFsdWUuX29mZnNldEF0dHJpYnV0ZSA/PyAtMTsKICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hSZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaEVsbGlwc29pZDExID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUoRWxsaXBzb2lkX2RlZmF1bHQuVU5JVF9TUEhFUkUpOwogICAgICBzY3JhdGNoT3B0aW9uczE5ID0gewogICAgICAgIHJlY3RhbmdsZTogc2NyYXRjaFJlY3RhbmdsZSwKICAgICAgICBlbGxpcHNvaWQ6IHNjcmF0Y2hFbGxpcHNvaWQxMSwKICAgICAgICB2ZXJ0ZXhGb3JtYXQ6IHNjcmF0Y2hWZXJ0ZXhGb3JtYXQxMiwKICAgICAgICBncmFudWxhcml0eTogdm9pZCAwLAogICAgICAgIGhlaWdodDogdm9pZCAwLAogICAgICAgIHJvdGF0aW9uOiB2b2lkIDAsCiAgICAgICAgc3RSb3RhdGlvbjogdm9pZCAwLAogICAgICAgIGV4dHJ1ZGVkSGVpZ2h0OiB2b2lkIDAsCiAgICAgICAgc2hhZG93Vm9sdW1lOiB2b2lkIDAsCiAgICAgICAgb2Zmc2V0QXR0cmlidXRlOiB2b2lkIDAKICAgICAgfTsKICAgICAgUmVjdGFuZ2xlR2VvbWV0cnkudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBjb25zdCByZWN0YW5nbGUgPSBSZWN0YW5nbGVfZGVmYXVsdC51bnBhY2soYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHNjcmF0Y2hSZWN0YW5nbGUpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gUmVjdGFuZ2xlX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGNvbnN0IGVsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LnVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCwgc2NyYXRjaEVsbGlwc29pZDExKTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IEVsbGlwc29pZF9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBjb25zdCB2ZXJ0ZXhGb3JtYXQgPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC51bnBhY2soCiAgICAgICAgICBhcnJheSwKICAgICAgICAgIHN0YXJ0aW5nSW5kZXgsCiAgICAgICAgICBzY3JhdGNoVmVydGV4Rm9ybWF0MTIKICAgICAgICApOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gVmVydGV4Rm9ybWF0X2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBzdXJmYWNlSGVpZ2h0ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCByb3RhdGlvbiA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3Qgc3RSb3RhdGlvbiA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgZXh0cnVkZWRIZWlnaHQgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IHNoYWRvd1ZvbHVtZSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPT09IDE7CiAgICAgICAgY29uc3Qgb2Zmc2V0QXR0cmlidXRlID0gYXJyYXlbc3RhcnRpbmdJbmRleF07CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxOS5ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxOS5oZWlnaHQgPSBzdXJmYWNlSGVpZ2h0OwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxOS5yb3RhdGlvbiA9IHJvdGF0aW9uOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxOS5zdFJvdGF0aW9uID0gc3RSb3RhdGlvbjsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTkuZXh0cnVkZWRIZWlnaHQgPSBleHRydWRlZEhlaWdodDsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMTkuc2hhZG93Vm9sdW1lID0gc2hhZG93Vm9sdW1lOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMxOS5vZmZzZXRBdHRyaWJ1dGUgPSBvZmZzZXRBdHRyaWJ1dGUgPT09IC0xID8gdm9pZCAwIDogb2Zmc2V0QXR0cmlidXRlOwogICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGVHZW9tZXRyeShzY3JhdGNoT3B0aW9uczE5KTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0Ll9yZWN0YW5nbGUgPSBSZWN0YW5nbGVfZGVmYXVsdC5jbG9uZShyZWN0YW5nbGUsIHJlc3VsdC5fcmVjdGFuZ2xlKTsKICAgICAgICByZXN1bHQuX2VsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKGVsbGlwc29pZCwgcmVzdWx0Ll9lbGxpcHNvaWQpOwogICAgICAgIHJlc3VsdC5fdmVydGV4Rm9ybWF0ID0gVmVydGV4Rm9ybWF0X2RlZmF1bHQuY2xvbmUodmVydGV4Rm9ybWF0LCByZXN1bHQuX3ZlcnRleEZvcm1hdCk7CiAgICAgICAgcmVzdWx0Ll9ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwogICAgICAgIHJlc3VsdC5fc3VyZmFjZUhlaWdodCA9IHN1cmZhY2VIZWlnaHQ7CiAgICAgICAgcmVzdWx0Ll9yb3RhdGlvbiA9IHJvdGF0aW9uOwogICAgICAgIHJlc3VsdC5fc3RSb3RhdGlvbiA9IHN0Um90YXRpb247CiAgICAgICAgcmVzdWx0Ll9leHRydWRlZEhlaWdodCA9IGV4dHJ1ZGVkSGVpZ2h0OwogICAgICAgIHJlc3VsdC5fc2hhZG93Vm9sdW1lID0gc2hhZG93Vm9sdW1lOwogICAgICAgIHJlc3VsdC5fb2Zmc2V0QXR0cmlidXRlID0gb2Zmc2V0QXR0cmlidXRlID09PSAtMSA/IHZvaWQgMCA6IG9mZnNldEF0dHJpYnV0ZTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBSZWN0YW5nbGVHZW9tZXRyeS5jb21wdXRlUmVjdGFuZ2xlID0gZnVuY3Rpb24ob3B0aW9ucywgcmVzdWx0KSB7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgPz8gRnJvemVuX2RlZmF1bHQuRU1QVFlfT0JKRUNUOwogICAgICAgIGNvbnN0IHJlY3RhbmdsZSA9IG9wdGlvbnMucmVjdGFuZ2xlOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIiwgcmVjdGFuZ2xlKTsKICAgICAgICBSZWN0YW5nbGVfZGVmYXVsdC5fdmFsaWRhdGUocmVjdGFuZ2xlKTsKICAgICAgICBpZiAocmVjdGFuZ2xlLm5vcnRoIDwgcmVjdGFuZ2xlLnNvdXRoKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgIm9wdGlvbnMucmVjdGFuZ2xlLm5vcnRoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG9wdGlvbnMucmVjdGFuZ2xlLnNvdXRoIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZ3JhbnVsYXJpdHkgPSBvcHRpb25zLmdyYW51bGFyaXR5ID8/IE1hdGhfZGVmYXVsdC5SQURJQU5TX1BFUl9ERUdSRUU7CiAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gb3B0aW9ucy5lbGxpcHNvaWQgPz8gRWxsaXBzb2lkX2RlZmF1bHQuZGVmYXVsdDsKICAgICAgICBjb25zdCByb3RhdGlvbiA9IG9wdGlvbnMucm90YXRpb24gPz8gMDsKICAgICAgICByZXR1cm4gY29tcHV0ZVJlY3RhbmdsZTMocmVjdGFuZ2xlLCBncmFudWxhcml0eSwgcm90YXRpb24sIGVsbGlwc29pZCwgcmVzdWx0KTsKICAgICAgfTsKICAgICAgdGFuZ2VudFJvdGF0aW9uTWF0cml4U2NyYXRjaCA9IG5ldyBNYXRyaXgzX2RlZmF1bHQoKTsKICAgICAgcXVhdGVybmlvblNjcmF0Y2g0ID0gbmV3IFF1YXRlcm5pb25fZGVmYXVsdCgpOwogICAgICBjZW50ZXJTY3JhdGNoNCA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBSZWN0YW5nbGVHZW9tZXRyeS5jcmVhdGVHZW9tZXRyeSA9IGZ1bmN0aW9uKHJlY3RhbmdsZUdlb21ldHJ5KSB7CiAgICAgICAgaWYgKE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgcmVjdGFuZ2xlR2VvbWV0cnkuX3JlY3RhbmdsZS5ub3J0aCwKICAgICAgICAgIHJlY3RhbmdsZUdlb21ldHJ5Ll9yZWN0YW5nbGUuc291dGgsCiAgICAgICAgICBNYXRoX2RlZmF1bHQuRVBTSUxPTjEwCiAgICAgICAgKSB8fCBNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgIHJlY3RhbmdsZUdlb21ldHJ5Ll9yZWN0YW5nbGUuZWFzdCwKICAgICAgICAgIHJlY3RhbmdsZUdlb21ldHJ5Ll9yZWN0YW5nbGUud2VzdCwKICAgICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9OMTAKICAgICAgICApKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBsZXQgcmVjdGFuZ2xlID0gcmVjdGFuZ2xlR2VvbWV0cnkuX3JlY3RhbmdsZTsKICAgICAgICBjb25zdCBlbGxpcHNvaWQgPSByZWN0YW5nbGVHZW9tZXRyeS5fZWxsaXBzb2lkOwogICAgICAgIGNvbnN0IHJvdGF0aW9uID0gcmVjdGFuZ2xlR2VvbWV0cnkuX3JvdGF0aW9uOwogICAgICAgIGNvbnN0IHN0Um90YXRpb24gPSByZWN0YW5nbGVHZW9tZXRyeS5fc3RSb3RhdGlvbjsKICAgICAgICBjb25zdCB2ZXJ0ZXhGb3JtYXQgPSByZWN0YW5nbGVHZW9tZXRyeS5fdmVydGV4Rm9ybWF0OwogICAgICAgIGNvbnN0IGNvbXB1dGVkT3B0aW9ucyA9IFJlY3RhbmdsZUdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmNvbXB1dGVPcHRpb25zKAogICAgICAgICAgcmVjdGFuZ2xlLAogICAgICAgICAgcmVjdGFuZ2xlR2VvbWV0cnkuX2dyYW51bGFyaXR5LAogICAgICAgICAgcm90YXRpb24sCiAgICAgICAgICBzdFJvdGF0aW9uLAogICAgICAgICAgcmVjdGFuZ2xlU2NyYXRjaCwKICAgICAgICAgIG53U2NyYXRjaCwKICAgICAgICAgIHN0TndTY3JhdGNoCiAgICAgICAgKTsKICAgICAgICBjb25zdCB0YW5nZW50Um90YXRpb25NYXRyaXggPSB0YW5nZW50Um90YXRpb25NYXRyaXhTY3JhdGNoOwogICAgICAgIGlmIChzdFJvdGF0aW9uICE9PSAwIHx8IHJvdGF0aW9uICE9PSAwKSB7CiAgICAgICAgICBjb25zdCBjZW50ZXIgPSBSZWN0YW5nbGVfZGVmYXVsdC5jZW50ZXIocmVjdGFuZ2xlLCBjZW50ZXJTY3JhdGNoNCk7CiAgICAgICAgICBjb25zdCBheGlzID0gZWxsaXBzb2lkLmdlb2RldGljU3VyZmFjZU5vcm1hbENhcnRvZ3JhcGhpYyhjZW50ZXIsIHYxU2NyYXRjaCk7CiAgICAgICAgICBRdWF0ZXJuaW9uX2RlZmF1bHQuZnJvbUF4aXNBbmdsZShheGlzLCAtc3RSb3RhdGlvbiwgcXVhdGVybmlvblNjcmF0Y2g0KTsKICAgICAgICAgIE1hdHJpeDNfZGVmYXVsdC5mcm9tUXVhdGVybmlvbihxdWF0ZXJuaW9uU2NyYXRjaDQsIHRhbmdlbnRSb3RhdGlvbk1hdHJpeCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIE1hdHJpeDNfZGVmYXVsdC5jbG9uZShNYXRyaXgzX2RlZmF1bHQuSURFTlRJVFksIHRhbmdlbnRSb3RhdGlvbk1hdHJpeCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN1cmZhY2VIZWlnaHQgPSByZWN0YW5nbGVHZW9tZXRyeS5fc3VyZmFjZUhlaWdodDsKICAgICAgICBjb25zdCBleHRydWRlZEhlaWdodCA9IHJlY3RhbmdsZUdlb21ldHJ5Ll9leHRydWRlZEhlaWdodDsKICAgICAgICBjb25zdCBleHRydWRlID0gIU1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgc3VyZmFjZUhlaWdodCwKICAgICAgICAgIGV4dHJ1ZGVkSGVpZ2h0LAogICAgICAgICAgMCwKICAgICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9OMgogICAgICAgICk7CiAgICAgICAgY29tcHV0ZWRPcHRpb25zLmxvblNjYWxhciA9IDEgLyByZWN0YW5nbGVHZW9tZXRyeS5fcmVjdGFuZ2xlLndpZHRoOwogICAgICAgIGNvbXB1dGVkT3B0aW9ucy5sYXRTY2FsYXIgPSAxIC8gcmVjdGFuZ2xlR2VvbWV0cnkuX3JlY3RhbmdsZS5oZWlnaHQ7CiAgICAgICAgY29tcHV0ZWRPcHRpb25zLnRhbmdlbnRSb3RhdGlvbk1hdHJpeCA9IHRhbmdlbnRSb3RhdGlvbk1hdHJpeDsKICAgICAgICBsZXQgZ2VvbWV0cnk7CiAgICAgICAgbGV0IGJvdW5kaW5nU3BoZXJlOwogICAgICAgIHJlY3RhbmdsZSA9IHJlY3RhbmdsZUdlb21ldHJ5Ll9yZWN0YW5nbGU7CiAgICAgICAgaWYgKGV4dHJ1ZGUpIHsKICAgICAgICAgIGdlb21ldHJ5ID0gY29uc3RydWN0RXh0cnVkZWRSZWN0YW5nbGUocmVjdGFuZ2xlR2VvbWV0cnksIGNvbXB1dGVkT3B0aW9ucyk7CiAgICAgICAgICBjb25zdCB0b3BCUyA9IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQuZnJvbVJlY3RhbmdsZTNEKAogICAgICAgICAgICByZWN0YW5nbGUsCiAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgc3VyZmFjZUhlaWdodCwKICAgICAgICAgICAgdG9wQm91bmRpbmdTcGhlcmUzCiAgICAgICAgICApOwogICAgICAgICAgY29uc3QgYm90dG9tQlMgPSBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LmZyb21SZWN0YW5nbGUzRCgKICAgICAgICAgICAgcmVjdGFuZ2xlLAogICAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICAgIGV4dHJ1ZGVkSGVpZ2h0LAogICAgICAgICAgICBib3R0b21Cb3VuZGluZ1NwaGVyZTMKICAgICAgICAgICk7CiAgICAgICAgICBib3VuZGluZ1NwaGVyZSA9IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQudW5pb24odG9wQlMsIGJvdHRvbUJTKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZ2VvbWV0cnkgPSBjb25zdHJ1Y3RSZWN0YW5nbGUocmVjdGFuZ2xlR2VvbWV0cnksIGNvbXB1dGVkT3B0aW9ucyk7CiAgICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyA9IFBvbHlnb25QaXBlbGluZV9kZWZhdWx0LnNjYWxlVG9HZW9kZXRpY0hlaWdodCgKICAgICAgICAgICAgZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsCiAgICAgICAgICAgIHN1cmZhY2VIZWlnaHQsCiAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgZmFsc2UKICAgICAgICAgICk7CiAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHJlY3RhbmdsZUdlb21ldHJ5Ll9vZmZzZXRBdHRyaWJ1dGUpKSB7CiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLmxlbmd0aDsKICAgICAgICAgICAgY29uc3Qgb2Zmc2V0VmFsdWUgPSByZWN0YW5nbGVHZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlID09PSBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZV9kZWZhdWx0Lk5PTkUgPyAwIDogMTsKICAgICAgICAgICAgY29uc3QgYXBwbHlPZmZzZXQgPSBuZXcgVWludDhBcnJheShsZW5ndGggLyAzKS5maWxsKG9mZnNldFZhbHVlKTsKICAgICAgICAgICAgZ2VvbWV0cnkuYXR0cmlidXRlcy5hcHBseU9mZnNldCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5VTlNJR05FRF9CWVRFLAogICAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDEsCiAgICAgICAgICAgICAgdmFsdWVzOiBhcHBseU9mZnNldAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGJvdW5kaW5nU3BoZXJlID0gQm91bmRpbmdTcGhlcmVfZGVmYXVsdC5mcm9tUmVjdGFuZ2xlM0QoCiAgICAgICAgICAgIHJlY3RhbmdsZSwKICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICBzdXJmYWNlSGVpZ2h0CiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAoIXZlcnRleEZvcm1hdC5wb3NpdGlvbikgewogICAgICAgICAgZGVsZXRlIGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgR2VvbWV0cnlfZGVmYXVsdCh7CiAgICAgICAgICBhdHRyaWJ1dGVzOiBnZW9tZXRyeS5hdHRyaWJ1dGVzLAogICAgICAgICAgaW5kaWNlczogZ2VvbWV0cnkuaW5kaWNlcywKICAgICAgICAgIHByaW1pdGl2ZVR5cGU6IGdlb21ldHJ5LnByaW1pdGl2ZVR5cGUsCiAgICAgICAgICBib3VuZGluZ1NwaGVyZSwKICAgICAgICAgIG9mZnNldEF0dHJpYnV0ZTogcmVjdGFuZ2xlR2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZQogICAgICAgIH0pOwogICAgICB9OwogICAgICBSZWN0YW5nbGVHZW9tZXRyeS5jcmVhdGVTaGFkb3dWb2x1bWUgPSBmdW5jdGlvbihyZWN0YW5nbGVHZW9tZXRyeSwgbWluSGVpZ2h0RnVuYywgbWF4SGVpZ2h0RnVuYykgewogICAgICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gcmVjdGFuZ2xlR2VvbWV0cnkuX2dyYW51bGFyaXR5OwogICAgICAgIGNvbnN0IGVsbGlwc29pZCA9IHJlY3RhbmdsZUdlb21ldHJ5Ll9lbGxpcHNvaWQ7CiAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gbWluSGVpZ2h0RnVuYyhncmFudWxhcml0eSwgZWxsaXBzb2lkKTsKICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSBtYXhIZWlnaHRGdW5jKGdyYW51bGFyaXR5LCBlbGxpcHNvaWQpOwogICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlR2VvbWV0cnkoewogICAgICAgICAgcmVjdGFuZ2xlOiByZWN0YW5nbGVHZW9tZXRyeS5fcmVjdGFuZ2xlLAogICAgICAgICAgcm90YXRpb246IHJlY3RhbmdsZUdlb21ldHJ5Ll9yb3RhdGlvbiwKICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgIHN0Um90YXRpb246IHJlY3RhbmdsZUdlb21ldHJ5Ll9zdFJvdGF0aW9uLAogICAgICAgICAgZ3JhbnVsYXJpdHksCiAgICAgICAgICBleHRydWRlZEhlaWdodDogbWF4SGVpZ2h0LAogICAgICAgICAgaGVpZ2h0OiBtaW5IZWlnaHQsCiAgICAgICAgICB2ZXJ0ZXhGb3JtYXQ6IFZlcnRleEZvcm1hdF9kZWZhdWx0LlBPU0lUSU9OX09OTFksCiAgICAgICAgICBzaGFkb3dWb2x1bWU6IHRydWUKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgdW5yb3RhdGVkVGV4dHVyZVJlY3RhbmdsZVNjcmF0Y2ggPSBuZXcgUmVjdGFuZ2xlX2RlZmF1bHQoKTsKICAgICAgcG9pbnRzMkRTY3JhdGNoMiA9IFtuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KCksIG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKSwgbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpXTsKICAgICAgcm90YXRpb24yRFNjcmF0Y2gyID0gbmV3IE1hdHJpeDJfZGVmYXVsdCgpOwogICAgICByZWN0YW5nbGVDZW50ZXJTY3JhdGNoMiA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZWN0YW5nbGVHZW9tZXRyeS5wcm90b3R5cGUsIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIHJlY3RhbmdsZTogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodGhpcy5fcm90YXRlZFJlY3RhbmdsZSkpIHsKICAgICAgICAgICAgICB0aGlzLl9yb3RhdGVkUmVjdGFuZ2xlID0gY29tcHV0ZVJlY3RhbmdsZTMoCiAgICAgICAgICAgICAgICB0aGlzLl9yZWN0YW5nbGUsCiAgICAgICAgICAgICAgICB0aGlzLl9ncmFudWxhcml0eSwKICAgICAgICAgICAgICAgIHRoaXMuX3JvdGF0aW9uLAogICAgICAgICAgICAgICAgdGhpcy5fZWxsaXBzb2lkCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRlZFJlY3RhbmdsZTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIEZvciByZW1hcHBpbmcgdGV4dHVyZSBjb29yZGluYXRlcyB3aGVuIHJlbmRlcmluZyBSZWN0YW5nbGVHZW9tZXRyaWVzIGFzIEdyb3VuZFByaW1pdGl2ZXMuCiAgICAgICAgICogVGhpcyB2ZXJzaW9uIHBlcm1pdHMgc2tldyBpbiB0ZXh0dXJlcyBieSBjb21wdXRpbmcgb2Zmc2V0cyBkaXJlY3RseSBpbiBjYXJ0b2dyYXBoaWMgc3BhY2UgYW5kCiAgICAgICAgICogbW9yZSBhY2N1cmF0ZWx5IGFwcHJveGltYXRlcyByZW5kZXJpbmcgUmVjdGFuZ2xlR2VvbWV0cmllcyB3aXRoIGhlaWdodCBhcyBzdGFuZGFyZCBQcmltaXRpdmVzLgogICAgICAgICAqIEBzZWUgR2VvbWV0cnkjX3RleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHMKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIHRleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHM6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHRoaXMuX3RleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHMpKSB7CiAgICAgICAgICAgICAgdGhpcy5fdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50cyA9IHRleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHMzKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl90ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIFJlY3RhbmdsZUdlb21ldHJ5X2RlZmF1bHQgPSBSZWN0YW5nbGVHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVJlY3RhbmdsZUdlb21ldHJ5LmpzCiAgdmFyIGNyZWF0ZVJlY3RhbmdsZUdlb21ldHJ5X2V4cG9ydHMgPSB7fTsKICBfX2V4cG9ydChjcmVhdGVSZWN0YW5nbGVHZW9tZXRyeV9leHBvcnRzLCB7CiAgICBkZWZhdWx0OiAoKSA9PiBjcmVhdGVSZWN0YW5nbGVHZW9tZXRyeV9kZWZhdWx0CiAgfSk7CiAgZnVuY3Rpb24gY3JlYXRlUmVjdGFuZ2xlR2VvbWV0cnkocmVjdGFuZ2xlR2VvbWV0cnksIG9mZnNldCkgewogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvZmZzZXQpKSB7CiAgICAgIHJlY3RhbmdsZUdlb21ldHJ5ID0gUmVjdGFuZ2xlR2VvbWV0cnlfZGVmYXVsdC51bnBhY2socmVjdGFuZ2xlR2VvbWV0cnksIG9mZnNldCk7CiAgICB9CiAgICByZWN0YW5nbGVHZW9tZXRyeS5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUocmVjdGFuZ2xlR2VvbWV0cnkuX2VsbGlwc29pZCk7CiAgICByZWN0YW5nbGVHZW9tZXRyeS5fcmVjdGFuZ2xlID0gUmVjdGFuZ2xlX2RlZmF1bHQuY2xvbmUocmVjdGFuZ2xlR2VvbWV0cnkuX3JlY3RhbmdsZSk7CiAgICByZXR1cm4gUmVjdGFuZ2xlR2VvbWV0cnlfZGVmYXVsdC5jcmVhdGVHZW9tZXRyeShyZWN0YW5nbGVHZW9tZXRyeSk7CiAgfQogIHZhciBjcmVhdGVSZWN0YW5nbGVHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X2NyZWF0ZVJlY3RhbmdsZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVSZWN0YW5nbGVHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X1JlY3RhbmdsZSgpOwogICAgICBpbml0X1JlY3RhbmdsZUdlb21ldHJ5KCk7CiAgICAgIGNyZWF0ZVJlY3RhbmdsZUdlb21ldHJ5X2RlZmF1bHQgPSBjcmVhdGVSZWN0YW5nbGVHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1JlY3RhbmdsZU91dGxpbmVHZW9tZXRyeS5qcwogIGZ1bmN0aW9uIGNvbnN0cnVjdFJlY3RhbmdsZTIoZ2VvbWV0cnksIGNvbXB1dGVkT3B0aW9ucykgewogICAgY29uc3QgZWxsaXBzb2lkID0gZ2VvbWV0cnkuX2VsbGlwc29pZDsKICAgIGNvbnN0IGhlaWdodCA9IGNvbXB1dGVkT3B0aW9ucy5oZWlnaHQ7CiAgICBjb25zdCB3aWR0aCA9IGNvbXB1dGVkT3B0aW9ucy53aWR0aDsKICAgIGNvbnN0IG5vcnRoQ2FwID0gY29tcHV0ZWRPcHRpb25zLm5vcnRoQ2FwOwogICAgY29uc3Qgc291dGhDYXAgPSBjb21wdXRlZE9wdGlvbnMuc291dGhDYXA7CiAgICBsZXQgcm93SGVpZ2h0ID0gaGVpZ2h0OwogICAgbGV0IHdpZHRoTXVsdGlwbGllciA9IDI7CiAgICBsZXQgc2l6ZSA9IDA7CiAgICBsZXQgY29ybmVycyA9IDQ7CiAgICBpZiAobm9ydGhDYXApIHsKICAgICAgd2lkdGhNdWx0aXBsaWVyIC09IDE7CiAgICAgIHJvd0hlaWdodCAtPSAxOwogICAgICBzaXplICs9IDE7CiAgICAgIGNvcm5lcnMgLT0gMjsKICAgIH0KICAgIGlmIChzb3V0aENhcCkgewogICAgICB3aWR0aE11bHRpcGxpZXIgLT0gMTsKICAgICAgcm93SGVpZ2h0IC09IDE7CiAgICAgIHNpemUgKz0gMTsKICAgICAgY29ybmVycyAtPSAyOwogICAgfQogICAgc2l6ZSArPSB3aWR0aE11bHRpcGxpZXIgKiB3aWR0aCArIDIgKiByb3dIZWlnaHQgLSBjb3JuZXJzOwogICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0NjRBcnJheShzaXplICogMyk7CiAgICBsZXQgcG9zSW5kZXggPSAwOwogICAgbGV0IHJvdyA9IDA7CiAgICBsZXQgY29sOwogICAgY29uc3QgcG9zaXRpb24gPSBwb3NpdGlvblNjcmF0Y2gzOwogICAgaWYgKG5vcnRoQ2FwKSB7CiAgICAgIFJlY3RhbmdsZUdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmNvbXB1dGVQb3NpdGlvbigKICAgICAgICBjb21wdXRlZE9wdGlvbnMsCiAgICAgICAgZWxsaXBzb2lkLAogICAgICAgIGZhbHNlLAogICAgICAgIHJvdywKICAgICAgICAwLAogICAgICAgIHBvc2l0aW9uCiAgICAgICk7CiAgICAgIHBvc2l0aW9uc1twb3NJbmRleCsrXSA9IHBvc2l0aW9uLng7CiAgICAgIHBvc2l0aW9uc1twb3NJbmRleCsrXSA9IHBvc2l0aW9uLnk7CiAgICAgIHBvc2l0aW9uc1twb3NJbmRleCsrXSA9IHBvc2l0aW9uLno7CiAgICB9IGVsc2UgewogICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewogICAgICAgIFJlY3RhbmdsZUdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmNvbXB1dGVQb3NpdGlvbigKICAgICAgICAgIGNvbXB1dGVkT3B0aW9ucywKICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgIGZhbHNlLAogICAgICAgICAgcm93LAogICAgICAgICAgY29sLAogICAgICAgICAgcG9zaXRpb24KICAgICAgICApOwogICAgICAgIHBvc2l0aW9uc1twb3NJbmRleCsrXSA9IHBvc2l0aW9uLng7CiAgICAgICAgcG9zaXRpb25zW3Bvc0luZGV4KytdID0gcG9zaXRpb24ueTsKICAgICAgICBwb3NpdGlvbnNbcG9zSW5kZXgrK10gPSBwb3NpdGlvbi56OwogICAgICB9CiAgICB9CiAgICBjb2wgPSB3aWR0aCAtIDE7CiAgICBmb3IgKHJvdyA9IDE7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKICAgICAgUmVjdGFuZ2xlR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuY29tcHV0ZVBvc2l0aW9uKAogICAgICAgIGNvbXB1dGVkT3B0aW9ucywKICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgZmFsc2UsCiAgICAgICAgcm93LAogICAgICAgIGNvbCwKICAgICAgICBwb3NpdGlvbgogICAgICApOwogICAgICBwb3NpdGlvbnNbcG9zSW5kZXgrK10gPSBwb3NpdGlvbi54OwogICAgICBwb3NpdGlvbnNbcG9zSW5kZXgrK10gPSBwb3NpdGlvbi55OwogICAgICBwb3NpdGlvbnNbcG9zSW5kZXgrK10gPSBwb3NpdGlvbi56OwogICAgfQogICAgcm93ID0gaGVpZ2h0IC0gMTsKICAgIGlmICghc291dGhDYXApIHsKICAgICAgZm9yIChjb2wgPSB3aWR0aCAtIDI7IGNvbCA+PSAwOyBjb2wtLSkgewogICAgICAgIFJlY3RhbmdsZUdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmNvbXB1dGVQb3NpdGlvbigKICAgICAgICAgIGNvbXB1dGVkT3B0aW9ucywKICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgIGZhbHNlLAogICAgICAgICAgcm93LAogICAgICAgICAgY29sLAogICAgICAgICAgcG9zaXRpb24KICAgICAgICApOwogICAgICAgIHBvc2l0aW9uc1twb3NJbmRleCsrXSA9IHBvc2l0aW9uLng7CiAgICAgICAgcG9zaXRpb25zW3Bvc0luZGV4KytdID0gcG9zaXRpb24ueTsKICAgICAgICBwb3NpdGlvbnNbcG9zSW5kZXgrK10gPSBwb3NpdGlvbi56OwogICAgICB9CiAgICB9CiAgICBjb2wgPSAwOwogICAgZm9yIChyb3cgPSBoZWlnaHQgLSAyOyByb3cgPiAwOyByb3ctLSkgewogICAgICBSZWN0YW5nbGVHZW9tZXRyeUxpYnJhcnlfZGVmYXVsdC5jb21wdXRlUG9zaXRpb24oCiAgICAgICAgY29tcHV0ZWRPcHRpb25zLAogICAgICAgIGVsbGlwc29pZCwKICAgICAgICBmYWxzZSwKICAgICAgICByb3csCiAgICAgICAgY29sLAogICAgICAgIHBvc2l0aW9uCiAgICAgICk7CiAgICAgIHBvc2l0aW9uc1twb3NJbmRleCsrXSA9IHBvc2l0aW9uLng7CiAgICAgIHBvc2l0aW9uc1twb3NJbmRleCsrXSA9IHBvc2l0aW9uLnk7CiAgICAgIHBvc2l0aW9uc1twb3NJbmRleCsrXSA9IHBvc2l0aW9uLno7CiAgICB9CiAgICBjb25zdCBpbmRpY2VzU2l6ZSA9IHBvc2l0aW9ucy5sZW5ndGggLyAzICogMjsKICAgIGNvbnN0IGluZGljZXMgPSBJbmRleERhdGF0eXBlX2RlZmF1bHQuY3JlYXRlVHlwZWRBcnJheSgKICAgICAgcG9zaXRpb25zLmxlbmd0aCAvIDMsCiAgICAgIGluZGljZXNTaXplCiAgICApOwogICAgbGV0IGluZGV4ID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aCAvIDMgLSAxOyBpKyspIHsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGk7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSBpICsgMTsKICAgIH0KICAgIGluZGljZXNbaW5kZXgrK10gPSBwb3NpdGlvbnMubGVuZ3RoIC8gMyAtIDE7CiAgICBpbmRpY2VzW2luZGV4KytdID0gMDsKICAgIGNvbnN0IGdlbyA9IG5ldyBHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgYXR0cmlidXRlczogbmV3IEdlb21ldHJ5QXR0cmlidXRlc19kZWZhdWx0KCksCiAgICAgIHByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZVR5cGVfZGVmYXVsdC5MSU5FUwogICAgfSk7CiAgICBnZW8uYXR0cmlidXRlcy5wb3NpdGlvbiA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRE9VQkxFLAogICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICB2YWx1ZXM6IHBvc2l0aW9ucwogICAgfSk7CiAgICBnZW8uaW5kaWNlcyA9IGluZGljZXM7CiAgICByZXR1cm4gZ2VvOwogIH0KICBmdW5jdGlvbiBjb25zdHJ1Y3RFeHRydWRlZFJlY3RhbmdsZTIocmVjdGFuZ2xlR2VvbWV0cnksIGNvbXB1dGVkT3B0aW9ucykgewogICAgY29uc3QgbWF4SGVpZ2h0ID0gcmVjdGFuZ2xlR2VvbWV0cnkuX3N1cmZhY2VIZWlnaHQ7CiAgICBjb25zdCBtaW5IZWlnaHQgPSByZWN0YW5nbGVHZW9tZXRyeS5fZXh0cnVkZWRIZWlnaHQ7CiAgICBjb25zdCBlbGxpcHNvaWQgPSByZWN0YW5nbGVHZW9tZXRyeS5fZWxsaXBzb2lkOwogICAgY29uc3QgZ2VvID0gY29uc3RydWN0UmVjdGFuZ2xlMihyZWN0YW5nbGVHZW9tZXRyeSwgY29tcHV0ZWRPcHRpb25zKTsKICAgIGNvbnN0IGhlaWdodCA9IGNvbXB1dGVkT3B0aW9ucy5oZWlnaHQ7CiAgICBjb25zdCB3aWR0aCA9IGNvbXB1dGVkT3B0aW9ucy53aWR0aDsKICAgIGNvbnN0IHRvcFBvc2l0aW9ucyA9IFBvbHlnb25QaXBlbGluZV9kZWZhdWx0LnNjYWxlVG9HZW9kZXRpY0hlaWdodCgKICAgICAgZ2VvLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLAogICAgICBtYXhIZWlnaHQsCiAgICAgIGVsbGlwc29pZCwKICAgICAgZmFsc2UKICAgICk7CiAgICBsZXQgbGVuZ3RoID0gdG9wUG9zaXRpb25zLmxlbmd0aDsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkobGVuZ3RoICogMik7CiAgICBwb3NpdGlvbnMuc2V0KHRvcFBvc2l0aW9ucyk7CiAgICBjb25zdCBib3R0b21Qb3NpdGlvbnMgPSBQb2x5Z29uUGlwZWxpbmVfZGVmYXVsdC5zY2FsZVRvR2VvZGV0aWNIZWlnaHQoCiAgICAgIGdlby5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcywKICAgICAgbWluSGVpZ2h0LAogICAgICBlbGxpcHNvaWQKICAgICk7CiAgICBwb3NpdGlvbnMuc2V0KGJvdHRvbVBvc2l0aW9ucywgbGVuZ3RoKTsKICAgIGdlby5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyA9IHBvc2l0aW9uczsKICAgIGNvbnN0IG5vcnRoQ2FwID0gY29tcHV0ZWRPcHRpb25zLm5vcnRoQ2FwOwogICAgY29uc3Qgc291dGhDYXAgPSBjb21wdXRlZE9wdGlvbnMuc291dGhDYXA7CiAgICBsZXQgY29ybmVycyA9IDQ7CiAgICBpZiAobm9ydGhDYXApIHsKICAgICAgY29ybmVycyAtPSAxOwogICAgfQogICAgaWYgKHNvdXRoQ2FwKSB7CiAgICAgIGNvcm5lcnMgLT0gMTsKICAgIH0KICAgIGNvbnN0IGluZGljZXNTaXplID0gKHBvc2l0aW9ucy5sZW5ndGggLyAzICsgY29ybmVycykgKiAyOwogICAgY29uc3QgaW5kaWNlcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KAogICAgICBwb3NpdGlvbnMubGVuZ3RoIC8gMywKICAgICAgaW5kaWNlc1NpemUKICAgICk7CiAgICBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoIC8gNjsKICAgIGxldCBpbmRleCA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aCAtIDE7IGkrKykgewogICAgICBpbmRpY2VzW2luZGV4KytdID0gaTsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGkgKyAxOwogICAgICBpbmRpY2VzW2luZGV4KytdID0gaSArIGxlbmd0aDsKICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGkgKyBsZW5ndGggKyAxOwogICAgfQogICAgaW5kaWNlc1tpbmRleCsrXSA9IGxlbmd0aCAtIDE7CiAgICBpbmRpY2VzW2luZGV4KytdID0gMDsKICAgIGluZGljZXNbaW5kZXgrK10gPSBsZW5ndGggKyBsZW5ndGggLSAxOwogICAgaW5kaWNlc1tpbmRleCsrXSA9IGxlbmd0aDsKICAgIGluZGljZXNbaW5kZXgrK10gPSAwOwogICAgaW5kaWNlc1tpbmRleCsrXSA9IGxlbmd0aDsKICAgIGxldCBib3R0b21Db3JuZXI7CiAgICBpZiAobm9ydGhDYXApIHsKICAgICAgYm90dG9tQ29ybmVyID0gaGVpZ2h0IC0gMTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHRvcFJpZ2h0Q29ybmVyID0gd2lkdGggLSAxOwogICAgICBpbmRpY2VzW2luZGV4KytdID0gdG9wUmlnaHRDb3JuZXI7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSB0b3BSaWdodENvcm5lciArIGxlbmd0aDsKICAgICAgYm90dG9tQ29ybmVyID0gd2lkdGggKyBoZWlnaHQgLSAyOwogICAgfQogICAgaW5kaWNlc1tpbmRleCsrXSA9IGJvdHRvbUNvcm5lcjsKICAgIGluZGljZXNbaW5kZXgrK10gPSBib3R0b21Db3JuZXIgKyBsZW5ndGg7CiAgICBpZiAoIXNvdXRoQ2FwKSB7CiAgICAgIGNvbnN0IGJvdHRvbUxlZnRDb3JuZXIgPSB3aWR0aCArIGJvdHRvbUNvcm5lciAtIDE7CiAgICAgIGluZGljZXNbaW5kZXgrK10gPSBib3R0b21MZWZ0Q29ybmVyOwogICAgICBpbmRpY2VzW2luZGV4XSA9IGJvdHRvbUxlZnRDb3JuZXIgKyBsZW5ndGg7CiAgICB9CiAgICBnZW8uaW5kaWNlcyA9IGluZGljZXM7CiAgICByZXR1cm4gZ2VvOwogIH0KICBmdW5jdGlvbiBSZWN0YW5nbGVPdXRsaW5lR2VvbWV0cnkob3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgPz8gRnJvemVuX2RlZmF1bHQuRU1QVFlfT0JKRUNUOwogICAgY29uc3QgcmVjdGFuZ2xlID0gb3B0aW9ucy5yZWN0YW5nbGU7CiAgICBjb25zdCBncmFudWxhcml0eSA9IG9wdGlvbnMuZ3JhbnVsYXJpdHkgPz8gTWF0aF9kZWZhdWx0LlJBRElBTlNfUEVSX0RFR1JFRTsKICAgIGNvbnN0IGVsbGlwc29pZCA9IG9wdGlvbnMuZWxsaXBzb2lkID8/IEVsbGlwc29pZF9kZWZhdWx0LmRlZmF1bHQ7CiAgICBjb25zdCByb3RhdGlvbiA9IG9wdGlvbnMucm90YXRpb24gPz8gMDsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlY3RhbmdsZSkpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInJlY3RhbmdsZSBpcyByZXF1aXJlZC4iKTsKICAgIH0KICAgIFJlY3RhbmdsZV9kZWZhdWx0Ll92YWxpZGF0ZShyZWN0YW5nbGUpOwogICAgaWYgKHJlY3RhbmdsZS5ub3J0aCA8IHJlY3RhbmdsZS5zb3V0aCkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAib3B0aW9ucy5yZWN0YW5nbGUubm9ydGggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3B0aW9ucy5yZWN0YW5nbGUuc291dGgiCiAgICAgICk7CiAgICB9CiAgICBjb25zdCBoZWlnaHQgPSBvcHRpb25zLmhlaWdodCA/PyAwOwogICAgY29uc3QgZXh0cnVkZWRIZWlnaHQgPSBvcHRpb25zLmV4dHJ1ZGVkSGVpZ2h0ID8/IGhlaWdodDsKICAgIHRoaXMuX3JlY3RhbmdsZSA9IFJlY3RhbmdsZV9kZWZhdWx0LmNsb25lKHJlY3RhbmdsZSk7CiAgICB0aGlzLl9ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwogICAgdGhpcy5fZWxsaXBzb2lkID0gZWxsaXBzb2lkOwogICAgdGhpcy5fc3VyZmFjZUhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgZXh0cnVkZWRIZWlnaHQpOwogICAgdGhpcy5fcm90YXRpb24gPSByb3RhdGlvbjsKICAgIHRoaXMuX2V4dHJ1ZGVkSGVpZ2h0ID0gTWF0aC5taW4oaGVpZ2h0LCBleHRydWRlZEhlaWdodCk7CiAgICB0aGlzLl9vZmZzZXRBdHRyaWJ1dGUgPSBvcHRpb25zLm9mZnNldEF0dHJpYnV0ZTsKICAgIHRoaXMuX3dvcmtlck5hbWUgPSAiY3JlYXRlUmVjdGFuZ2xlT3V0bGluZUdlb21ldHJ5IjsKICB9CiAgdmFyIGJvdHRvbUJvdW5kaW5nU3BoZXJlNCwgdG9wQm91bmRpbmdTcGhlcmU0LCBwb3NpdGlvblNjcmF0Y2gzLCByZWN0YW5nbGVTY3JhdGNoMiwgc2NyYXRjaFJlY3RhbmdsZTIsIHNjcmF0Y2hFbGxpcHNvaWQxMiwgc2NyYXRjaE9wdGlvbnMyMCwgbndTY3JhdGNoMiwgUmVjdGFuZ2xlT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfUmVjdGFuZ2xlT3V0bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9SZWN0YW5nbGVPdXRsaW5lR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X0JvdW5kaW5nU3BoZXJlKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRvZ3JhcGhpYygpOwogICAgICBpbml0X0NvbXBvbmVudERhdGF0eXBlKCk7CiAgICAgIGluaXRfRnJvemVuKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfR2VvbWV0cnkoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlcygpOwogICAgICBpbml0X0dlb21ldHJ5T2Zmc2V0QXR0cmlidXRlKCk7CiAgICAgIGluaXRfSW5kZXhEYXRhdHlwZSgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9Qb2x5Z29uUGlwZWxpbmUoKTsKICAgICAgaW5pdF9QcmltaXRpdmVUeXBlKCk7CiAgICAgIGluaXRfUmVjdGFuZ2xlKCk7CiAgICAgIGluaXRfUmVjdGFuZ2xlR2VvbWV0cnlMaWJyYXJ5KCk7CiAgICAgIGJvdHRvbUJvdW5kaW5nU3BoZXJlNCA9IG5ldyBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0KCk7CiAgICAgIHRvcEJvdW5kaW5nU3BoZXJlNCA9IG5ldyBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0KCk7CiAgICAgIHBvc2l0aW9uU2NyYXRjaDMgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHJlY3RhbmdsZVNjcmF0Y2gyID0gbmV3IFJlY3RhbmdsZV9kZWZhdWx0KCk7CiAgICAgIFJlY3RhbmdsZU91dGxpbmVHZW9tZXRyeS5wYWNrZWRMZW5ndGggPSBSZWN0YW5nbGVfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyA1OwogICAgICBSZWN0YW5nbGVPdXRsaW5lR2VvbWV0cnkucGFjayA9IGZ1bmN0aW9uKHZhbHVlLCBhcnJheSwgc3RhcnRpbmdJbmRleCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHZhbHVlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInZhbHVlIGlzIHJlcXVpcmVkIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFycmF5KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFycmF5IGlzIHJlcXVpcmVkIik7CiAgICAgICAgfQogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgUmVjdGFuZ2xlX2RlZmF1bHQucGFjayh2YWx1ZS5fcmVjdGFuZ2xlLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBSZWN0YW5nbGVfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgRWxsaXBzb2lkX2RlZmF1bHQucGFjayh2YWx1ZS5fZWxsaXBzb2lkLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9ncmFudWxhcml0eTsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX3N1cmZhY2VIZWlnaHQ7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9yb3RhdGlvbjsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX2V4dHJ1ZGVkSGVpZ2h0OwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXhdID0gdmFsdWUuX29mZnNldEF0dHJpYnV0ZSA/PyAtMTsKICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hSZWN0YW5nbGUyID0gbmV3IFJlY3RhbmdsZV9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hFbGxpcHNvaWQxMiA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKEVsbGlwc29pZF9kZWZhdWx0LlVOSVRfU1BIRVJFKTsKICAgICAgc2NyYXRjaE9wdGlvbnMyMCA9IHsKICAgICAgICByZWN0YW5nbGU6IHNjcmF0Y2hSZWN0YW5nbGUyLAogICAgICAgIGVsbGlwc29pZDogc2NyYXRjaEVsbGlwc29pZDEyLAogICAgICAgIGdyYW51bGFyaXR5OiB2b2lkIDAsCiAgICAgICAgaGVpZ2h0OiB2b2lkIDAsCiAgICAgICAgcm90YXRpb246IHZvaWQgMCwKICAgICAgICBleHRydWRlZEhlaWdodDogdm9pZCAwLAogICAgICAgIG9mZnNldEF0dHJpYnV0ZTogdm9pZCAwCiAgICAgIH07CiAgICAgIFJlY3RhbmdsZU91dGxpbmVHZW9tZXRyeS51bnBhY2sgPSBmdW5jdGlvbihhcnJheSwgc3RhcnRpbmdJbmRleCwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYXJyYXkpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXJyYXkgaXMgcmVxdWlyZWQiKTsKICAgICAgICB9CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBjb25zdCByZWN0YW5nbGUgPSBSZWN0YW5nbGVfZGVmYXVsdC51bnBhY2soYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHNjcmF0Y2hSZWN0YW5nbGUyKTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IFJlY3RhbmdsZV9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBjb25zdCBlbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC51bnBhY2soYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHNjcmF0Y2hFbGxpcHNvaWQxMik7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgY29uc3QgZ3JhbnVsYXJpdHkgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IGhlaWdodCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3Qgcm90YXRpb24gPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IGV4dHJ1ZGVkSGVpZ2h0ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBvZmZzZXRBdHRyaWJ1dGUgPSBhcnJheVtzdGFydGluZ0luZGV4XTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczIwLmdyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHk7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczIwLmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMjAucm90YXRpb24gPSByb3RhdGlvbjsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMjAuZXh0cnVkZWRIZWlnaHQgPSBleHRydWRlZEhlaWdodDsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMjAub2Zmc2V0QXR0cmlidXRlID0gb2Zmc2V0QXR0cmlidXRlID09PSAtMSA/IHZvaWQgMCA6IG9mZnNldEF0dHJpYnV0ZTsKICAgICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlT3V0bGluZUdlb21ldHJ5KHNjcmF0Y2hPcHRpb25zMjApOwogICAgICAgIH0KICAgICAgICByZXN1bHQuX3JlY3RhbmdsZSA9IFJlY3RhbmdsZV9kZWZhdWx0LmNsb25lKHJlY3RhbmdsZSwgcmVzdWx0Ll9yZWN0YW5nbGUpOwogICAgICAgIHJlc3VsdC5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUoZWxsaXBzb2lkLCByZXN1bHQuX2VsbGlwc29pZCk7CiAgICAgICAgcmVzdWx0Ll9zdXJmYWNlSGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgIHJlc3VsdC5fcm90YXRpb24gPSByb3RhdGlvbjsKICAgICAgICByZXN1bHQuX2V4dHJ1ZGVkSGVpZ2h0ID0gZXh0cnVkZWRIZWlnaHQ7CiAgICAgICAgcmVzdWx0Ll9vZmZzZXRBdHRyaWJ1dGUgPSBvZmZzZXRBdHRyaWJ1dGUgPT09IC0xID8gdm9pZCAwIDogb2Zmc2V0QXR0cmlidXRlOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIG53U2NyYXRjaDIgPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgUmVjdGFuZ2xlT3V0bGluZUdlb21ldHJ5LmNyZWF0ZUdlb21ldHJ5ID0gZnVuY3Rpb24ocmVjdGFuZ2xlR2VvbWV0cnkpIHsKICAgICAgICBjb25zdCByZWN0YW5nbGUgPSByZWN0YW5nbGVHZW9tZXRyeS5fcmVjdGFuZ2xlOwogICAgICAgIGNvbnN0IGVsbGlwc29pZCA9IHJlY3RhbmdsZUdlb21ldHJ5Ll9lbGxpcHNvaWQ7CiAgICAgICAgY29uc3QgY29tcHV0ZWRPcHRpb25zID0gUmVjdGFuZ2xlR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQuY29tcHV0ZU9wdGlvbnMoCiAgICAgICAgICByZWN0YW5nbGUsCiAgICAgICAgICByZWN0YW5nbGVHZW9tZXRyeS5fZ3JhbnVsYXJpdHksCiAgICAgICAgICByZWN0YW5nbGVHZW9tZXRyeS5fcm90YXRpb24sCiAgICAgICAgICAwLAogICAgICAgICAgcmVjdGFuZ2xlU2NyYXRjaDIsCiAgICAgICAgICBud1NjcmF0Y2gyCiAgICAgICAgKTsKICAgICAgICBsZXQgZ2VvbWV0cnk7CiAgICAgICAgbGV0IGJvdW5kaW5nU3BoZXJlOwogICAgICAgIGlmIChNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgIHJlY3RhbmdsZS5ub3J0aCwKICAgICAgICAgIHJlY3RhbmdsZS5zb3V0aCwKICAgICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9OMTAKICAgICAgICApIHx8IE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKAogICAgICAgICAgcmVjdGFuZ2xlLmVhc3QsCiAgICAgICAgICByZWN0YW5nbGUud2VzdCwKICAgICAgICAgIE1hdGhfZGVmYXVsdC5FUFNJTE9OMTAKICAgICAgICApKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBjb25zdCBzdXJmYWNlSGVpZ2h0ID0gcmVjdGFuZ2xlR2VvbWV0cnkuX3N1cmZhY2VIZWlnaHQ7CiAgICAgICAgY29uc3QgZXh0cnVkZWRIZWlnaHQgPSByZWN0YW5nbGVHZW9tZXRyeS5fZXh0cnVkZWRIZWlnaHQ7CiAgICAgICAgY29uc3QgZXh0cnVkZSA9ICFNYXRoX2RlZmF1bHQuZXF1YWxzRXBzaWxvbigKICAgICAgICAgIHN1cmZhY2VIZWlnaHQsCiAgICAgICAgICBleHRydWRlZEhlaWdodCwKICAgICAgICAgIDAsCiAgICAgICAgICBNYXRoX2RlZmF1bHQuRVBTSUxPTjIKICAgICAgICApOwogICAgICAgIGxldCBvZmZzZXRWYWx1ZTsKICAgICAgICBpZiAoZXh0cnVkZSkgewogICAgICAgICAgZ2VvbWV0cnkgPSBjb25zdHJ1Y3RFeHRydWRlZFJlY3RhbmdsZTIocmVjdGFuZ2xlR2VvbWV0cnksIGNvbXB1dGVkT3B0aW9ucyk7CiAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHJlY3RhbmdsZUdlb21ldHJ5Ll9vZmZzZXRBdHRyaWJ1dGUpKSB7CiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGggLyAzOwogICAgICAgICAgICBsZXQgb2Zmc2V0QXR0cmlidXRlID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7CiAgICAgICAgICAgIGlmIChyZWN0YW5nbGVHZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlID09PSBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZV9kZWZhdWx0LlRPUCkgewogICAgICAgICAgICAgIG9mZnNldEF0dHJpYnV0ZSA9IG9mZnNldEF0dHJpYnV0ZS5maWxsKDEsIDAsIHNpemUgLyAyKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBvZmZzZXRWYWx1ZSA9IHJlY3RhbmdsZUdlb21ldHJ5Ll9vZmZzZXRBdHRyaWJ1dGUgPT09IEdlb21ldHJ5T2Zmc2V0QXR0cmlidXRlX2RlZmF1bHQuTk9ORSA/IDAgOiAxOwogICAgICAgICAgICAgIG9mZnNldEF0dHJpYnV0ZSA9IG9mZnNldEF0dHJpYnV0ZS5maWxsKG9mZnNldFZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LlVOU0lHTkVEX0JZVEUsCiAgICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMSwKICAgICAgICAgICAgICB2YWx1ZXM6IG9mZnNldEF0dHJpYnV0ZQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHRvcEJTID0gQm91bmRpbmdTcGhlcmVfZGVmYXVsdC5mcm9tUmVjdGFuZ2xlM0QoCiAgICAgICAgICAgIHJlY3RhbmdsZSwKICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICBzdXJmYWNlSGVpZ2h0LAogICAgICAgICAgICB0b3BCb3VuZGluZ1NwaGVyZTQKICAgICAgICAgICk7CiAgICAgICAgICBjb25zdCBib3R0b21CUyA9IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQuZnJvbVJlY3RhbmdsZTNEKAogICAgICAgICAgICByZWN0YW5nbGUsCiAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgZXh0cnVkZWRIZWlnaHQsCiAgICAgICAgICAgIGJvdHRvbUJvdW5kaW5nU3BoZXJlNAogICAgICAgICAgKTsKICAgICAgICAgIGJvdW5kaW5nU3BoZXJlID0gQm91bmRpbmdTcGhlcmVfZGVmYXVsdC51bmlvbih0b3BCUywgYm90dG9tQlMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBnZW9tZXRyeSA9IGNvbnN0cnVjdFJlY3RhbmdsZTIocmVjdGFuZ2xlR2VvbWV0cnksIGNvbXB1dGVkT3B0aW9ucyk7CiAgICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyA9IFBvbHlnb25QaXBlbGluZV9kZWZhdWx0LnNjYWxlVG9HZW9kZXRpY0hlaWdodCgKICAgICAgICAgICAgZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsCiAgICAgICAgICAgIHN1cmZhY2VIZWlnaHQsCiAgICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgICAgZmFsc2UKICAgICAgICAgICk7CiAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHJlY3RhbmdsZUdlb21ldHJ5Ll9vZmZzZXRBdHRyaWJ1dGUpKSB7CiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLmxlbmd0aDsKICAgICAgICAgICAgb2Zmc2V0VmFsdWUgPSByZWN0YW5nbGVHZW9tZXRyeS5fb2Zmc2V0QXR0cmlidXRlID09PSBHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZV9kZWZhdWx0Lk5PTkUgPyAwIDogMTsKICAgICAgICAgICAgY29uc3QgYXBwbHlPZmZzZXQgPSBuZXcgVWludDhBcnJheShsZW5ndGggLyAzKS5maWxsKG9mZnNldFZhbHVlKTsKICAgICAgICAgICAgZ2VvbWV0cnkuYXR0cmlidXRlcy5hcHBseU9mZnNldCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5VTlNJR05FRF9CWVRFLAogICAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDEsCiAgICAgICAgICAgICAgdmFsdWVzOiBhcHBseU9mZnNldAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGJvdW5kaW5nU3BoZXJlID0gQm91bmRpbmdTcGhlcmVfZGVmYXVsdC5mcm9tUmVjdGFuZ2xlM0QoCiAgICAgICAgICAgIHJlY3RhbmdsZSwKICAgICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgICBzdXJmYWNlSGVpZ2h0CiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IEdlb21ldHJ5X2RlZmF1bHQoewogICAgICAgICAgYXR0cmlidXRlczogZ2VvbWV0cnkuYXR0cmlidXRlcywKICAgICAgICAgIGluZGljZXM6IGdlb21ldHJ5LmluZGljZXMsCiAgICAgICAgICBwcmltaXRpdmVUeXBlOiBQcmltaXRpdmVUeXBlX2RlZmF1bHQuTElORVMsCiAgICAgICAgICBib3VuZGluZ1NwaGVyZSwKICAgICAgICAgIG9mZnNldEF0dHJpYnV0ZTogcmVjdGFuZ2xlR2VvbWV0cnkuX29mZnNldEF0dHJpYnV0ZQogICAgICAgIH0pOwogICAgICB9OwogICAgICBSZWN0YW5nbGVPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdCA9IFJlY3RhbmdsZU91dGxpbmVHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVJlY3RhbmdsZU91dGxpbmVHZW9tZXRyeS5qcwogIHZhciBjcmVhdGVSZWN0YW5nbGVPdXRsaW5lR2VvbWV0cnlfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGNyZWF0ZVJlY3RhbmdsZU91dGxpbmVHZW9tZXRyeV9leHBvcnRzLCB7CiAgICBkZWZhdWx0OiAoKSA9PiBjcmVhdGVSZWN0YW5nbGVPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdAogIH0pOwogIGZ1bmN0aW9uIGNyZWF0ZVJlY3RhbmdsZU91dGxpbmVHZW9tZXRyeShyZWN0YW5nbGVHZW9tZXRyeSwgb2Zmc2V0KSB7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG9mZnNldCkpIHsKICAgICAgcmVjdGFuZ2xlR2VvbWV0cnkgPSBSZWN0YW5nbGVPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdC51bnBhY2soCiAgICAgICAgcmVjdGFuZ2xlR2VvbWV0cnksCiAgICAgICAgb2Zmc2V0CiAgICAgICk7CiAgICB9CiAgICByZWN0YW5nbGVHZW9tZXRyeS5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUocmVjdGFuZ2xlR2VvbWV0cnkuX2VsbGlwc29pZCk7CiAgICByZWN0YW5nbGVHZW9tZXRyeS5fcmVjdGFuZ2xlID0gUmVjdGFuZ2xlX2RlZmF1bHQuY2xvbmUocmVjdGFuZ2xlR2VvbWV0cnkuX3JlY3RhbmdsZSk7CiAgICByZXR1cm4gUmVjdGFuZ2xlT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQuY3JlYXRlR2VvbWV0cnkocmVjdGFuZ2xlR2VvbWV0cnkpOwogIH0KICB2YXIgY3JlYXRlUmVjdGFuZ2xlT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfY3JlYXRlUmVjdGFuZ2xlT3V0bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVSZWN0YW5nbGVPdXRsaW5lR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9SZWN0YW5nbGUoKTsKICAgICAgaW5pdF9SZWN0YW5nbGVPdXRsaW5lR2VvbWV0cnkoKTsKICAgICAgY3JlYXRlUmVjdGFuZ2xlT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQgPSBjcmVhdGVSZWN0YW5nbGVPdXRsaW5lR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9TaW1wbGVQb2x5bGluZUdlb21ldHJ5LmpzCiAgZnVuY3Rpb24gaW50ZXJwb2xhdGVDb2xvcnMyKHAwLCBwMSwgY29sb3IwLCBjb2xvcjEsIG1pbkRpc3RhbmNlLCBhcnJheSwgb2Zmc2V0KSB7CiAgICBjb25zdCBudW1Qb2ludHMgPSBQb2x5bGluZVBpcGVsaW5lX2RlZmF1bHQubnVtYmVyT2ZQb2ludHMocDAsIHAxLCBtaW5EaXN0YW5jZSk7CiAgICBsZXQgaTsKICAgIGNvbnN0IHIwID0gY29sb3IwLnJlZDsKICAgIGNvbnN0IGcwID0gY29sb3IwLmdyZWVuOwogICAgY29uc3QgYjAgPSBjb2xvcjAuYmx1ZTsKICAgIGNvbnN0IGEwID0gY29sb3IwLmFscGhhOwogICAgY29uc3QgcjEgPSBjb2xvcjEucmVkOwogICAgY29uc3QgZzEgPSBjb2xvcjEuZ3JlZW47CiAgICBjb25zdCBiMSA9IGNvbG9yMS5ibHVlOwogICAgY29uc3QgYTEgPSBjb2xvcjEuYWxwaGE7CiAgICBpZiAoQ29sb3JfZGVmYXVsdC5lcXVhbHMoY29sb3IwLCBjb2xvcjEpKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qb2ludHM7IGkrKykgewogICAgICAgIGFycmF5W29mZnNldCsrXSA9IENvbG9yX2RlZmF1bHQuZmxvYXRUb0J5dGUocjApOwogICAgICAgIGFycmF5W29mZnNldCsrXSA9IENvbG9yX2RlZmF1bHQuZmxvYXRUb0J5dGUoZzApOwogICAgICAgIGFycmF5W29mZnNldCsrXSA9IENvbG9yX2RlZmF1bHQuZmxvYXRUb0J5dGUoYjApOwogICAgICAgIGFycmF5W29mZnNldCsrXSA9IENvbG9yX2RlZmF1bHQuZmxvYXRUb0J5dGUoYTApOwogICAgICB9CiAgICAgIHJldHVybiBvZmZzZXQ7CiAgICB9CiAgICBjb25zdCByZWRQZXJWZXJ0ZXggPSAocjEgLSByMCkgLyBudW1Qb2ludHM7CiAgICBjb25zdCBncmVlblBlclZlcnRleCA9IChnMSAtIGcwKSAvIG51bVBvaW50czsKICAgIGNvbnN0IGJsdWVQZXJWZXJ0ZXggPSAoYjEgLSBiMCkgLyBudW1Qb2ludHM7CiAgICBjb25zdCBhbHBoYVBlclZlcnRleCA9IChhMSAtIGEwKSAvIG51bVBvaW50czsKICAgIGxldCBpbmRleCA9IG9mZnNldDsKICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qb2ludHM7IGkrKykgewogICAgICBhcnJheVtpbmRleCsrXSA9IENvbG9yX2RlZmF1bHQuZmxvYXRUb0J5dGUocjAgKyBpICogcmVkUGVyVmVydGV4KTsKICAgICAgYXJyYXlbaW5kZXgrK10gPSBDb2xvcl9kZWZhdWx0LmZsb2F0VG9CeXRlKGcwICsgaSAqIGdyZWVuUGVyVmVydGV4KTsKICAgICAgYXJyYXlbaW5kZXgrK10gPSBDb2xvcl9kZWZhdWx0LmZsb2F0VG9CeXRlKGIwICsgaSAqIGJsdWVQZXJWZXJ0ZXgpOwogICAgICBhcnJheVtpbmRleCsrXSA9IENvbG9yX2RlZmF1bHQuZmxvYXRUb0J5dGUoYTAgKyBpICogYWxwaGFQZXJWZXJ0ZXgpOwogICAgfQogICAgcmV0dXJuIGluZGV4OwogIH0KICBmdW5jdGlvbiBTaW1wbGVQb2x5bGluZUdlb21ldHJ5KG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IG9wdGlvbnMucG9zaXRpb25zOwogICAgY29uc3QgY29sb3JzID0gb3B0aW9ucy5jb2xvcnM7CiAgICBjb25zdCBjb2xvcnNQZXJWZXJ0ZXggPSBvcHRpb25zLmNvbG9yc1BlclZlcnRleCA/PyBmYWxzZTsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHBvc2l0aW9ucykgfHwgcG9zaXRpb25zLmxlbmd0aCA8IDIpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIkF0IGxlYXN0IHR3byBwb3NpdGlvbnMgYXJlIHJlcXVpcmVkLiIpOwogICAgfQogICAgaWYgKGRlZmluZWRfZGVmYXVsdChjb2xvcnMpICYmIChjb2xvcnNQZXJWZXJ0ZXggJiYgY29sb3JzLmxlbmd0aCA8IHBvc2l0aW9ucy5sZW5ndGggfHwgIWNvbG9yc1BlclZlcnRleCAmJiBjb2xvcnMubGVuZ3RoIDwgcG9zaXRpb25zLmxlbmd0aCAtIDEpKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJjb2xvcnMgaGFzIGFuIGludmFsaWQgbGVuZ3RoLiIpOwogICAgfQogICAgdGhpcy5fcG9zaXRpb25zID0gcG9zaXRpb25zOwogICAgdGhpcy5fY29sb3JzID0gY29sb3JzOwogICAgdGhpcy5fY29sb3JzUGVyVmVydGV4ID0gY29sb3JzUGVyVmVydGV4OwogICAgdGhpcy5fYXJjVHlwZSA9IG9wdGlvbnMuYXJjVHlwZSA/PyBBcmNUeXBlX2RlZmF1bHQuR0VPREVTSUM7CiAgICB0aGlzLl9ncmFudWxhcml0eSA9IG9wdGlvbnMuZ3JhbnVsYXJpdHkgPz8gTWF0aF9kZWZhdWx0LlJBRElBTlNfUEVSX0RFR1JFRTsKICAgIHRoaXMuX2VsbGlwc29pZCA9IG9wdGlvbnMuZWxsaXBzb2lkID8/IEVsbGlwc29pZF9kZWZhdWx0LmRlZmF1bHQ7CiAgICB0aGlzLl93b3JrZXJOYW1lID0gImNyZWF0ZVNpbXBsZVBvbHlsaW5lR2VvbWV0cnkiOwogICAgbGV0IG51bUNvbXBvbmVudHMgPSAxICsgcG9zaXRpb25zLmxlbmd0aCAqIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICBudW1Db21wb25lbnRzICs9IGRlZmluZWRfZGVmYXVsdChjb2xvcnMpID8gMSArIGNvbG9ycy5sZW5ndGggKiBDb2xvcl9kZWZhdWx0LnBhY2tlZExlbmd0aCA6IDE7CiAgICB0aGlzLnBhY2tlZExlbmd0aCA9IG51bUNvbXBvbmVudHMgKyBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyAzOwogIH0KICB2YXIgc2NyYXRjaEFycmF5MSwgc2NyYXRjaEFycmF5MiwgZ2VuZXJhdGVBcmNPcHRpb25zU2NyYXRjaCwgU2ltcGxlUG9seWxpbmVHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X1NpbXBsZVBvbHlsaW5lR2VvbWV0cnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1NpbXBsZVBvbHlsaW5lR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X0FyY1R5cGUoKTsKICAgICAgaW5pdF9Cb3VuZGluZ1NwaGVyZSgpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9Db2xvcigpOwogICAgICBpbml0X0NvbXBvbmVudERhdGF0eXBlKCk7CiAgICAgIGluaXRfRnJvemVuKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfR2VvbWV0cnkoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlcygpOwogICAgICBpbml0X0luZGV4RGF0YXR5cGUoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGluaXRfUG9seWxpbmVQaXBlbGluZSgpOwogICAgICBpbml0X1ByaW1pdGl2ZVR5cGUoKTsKICAgICAgU2ltcGxlUG9seWxpbmVHZW9tZXRyeS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodmFsdWUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgidmFsdWUgaXMgcmVxdWlyZWQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYXJyYXkpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXJyYXkgaXMgcmVxdWlyZWQiKTsKICAgICAgICB9CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBsZXQgaTsKICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSB2YWx1ZS5fcG9zaXRpb25zOwogICAgICAgIGxldCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSBsZW5ndGg7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpLCBzdGFydGluZ0luZGV4ICs9IENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGgpIHsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKHBvc2l0aW9uc1tpXSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIH0KICAgICAgICBjb25zdCBjb2xvcnMgPSB2YWx1ZS5fY29sb3JzOwogICAgICAgIGxlbmd0aCA9IGRlZmluZWRfZGVmYXVsdChjb2xvcnMpID8gY29sb3JzLmxlbmd0aCA6IDA7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IGxlbmd0aDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2ksIHN0YXJ0aW5nSW5kZXggKz0gQ29sb3JfZGVmYXVsdC5wYWNrZWRMZW5ndGgpIHsKICAgICAgICAgIENvbG9yX2RlZmF1bHQucGFjayhjb2xvcnNbaV0sIGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICB9CiAgICAgICAgRWxsaXBzb2lkX2RlZmF1bHQucGFjayh2YWx1ZS5fZWxsaXBzb2lkLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLl9jb2xvcnNQZXJWZXJ0ZXggPyAxIDogMDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUuX2FyY1R5cGU7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleF0gPSB2YWx1ZS5fZ3JhbnVsYXJpdHk7CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9OwogICAgICBTaW1wbGVQb2x5bGluZUdlb21ldHJ5LnVucGFjayA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydGluZ0luZGV4LCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhcnJheSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhcnJheSBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGxldCBpOwogICAgICAgIGxldCBsZW5ndGggPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSwgc3RhcnRpbmdJbmRleCArPSBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoKSB7CiAgICAgICAgICBwb3NpdGlvbnNbaV0gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICB9CiAgICAgICAgbGVuZ3RoID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBjb2xvcnMgPSBsZW5ndGggPiAwID8gbmV3IEFycmF5KGxlbmd0aCkgOiB2b2lkIDA7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpLCBzdGFydGluZ0luZGV4ICs9IENvbG9yX2RlZmF1bHQucGFja2VkTGVuZ3RoKSB7CiAgICAgICAgICBjb2xvcnNbaV0gPSBDb2xvcl9kZWZhdWx0LnVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LnVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgY29uc3QgY29sb3JzUGVyVmVydGV4ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9PT0gMTsKICAgICAgICBjb25zdCBhcmNUeXBlID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBjb25zdCBncmFudWxhcml0eSA9IGFycmF5W3N0YXJ0aW5nSW5kZXhdOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlUG9seWxpbmVHZW9tZXRyeSh7CiAgICAgICAgICAgIHBvc2l0aW9ucywKICAgICAgICAgICAgY29sb3JzLAogICAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICAgIGNvbG9yc1BlclZlcnRleCwKICAgICAgICAgICAgYXJjVHlwZSwKICAgICAgICAgICAgZ3JhbnVsYXJpdHkKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXN1bHQuX3Bvc2l0aW9ucyA9IHBvc2l0aW9uczsKICAgICAgICByZXN1bHQuX2NvbG9ycyA9IGNvbG9yczsKICAgICAgICByZXN1bHQuX2VsbGlwc29pZCA9IGVsbGlwc29pZDsKICAgICAgICByZXN1bHQuX2NvbG9yc1BlclZlcnRleCA9IGNvbG9yc1BlclZlcnRleDsKICAgICAgICByZXN1bHQuX2FyY1R5cGUgPSBhcmNUeXBlOwogICAgICAgIHJlc3VsdC5fZ3JhbnVsYXJpdHkgPSBncmFudWxhcml0eTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBzY3JhdGNoQXJyYXkxID0gbmV3IEFycmF5KDIpOwogICAgICBzY3JhdGNoQXJyYXkyID0gbmV3IEFycmF5KDIpOwogICAgICBnZW5lcmF0ZUFyY09wdGlvbnNTY3JhdGNoID0gewogICAgICAgIHBvc2l0aW9uczogc2NyYXRjaEFycmF5MSwKICAgICAgICBoZWlnaHQ6IHNjcmF0Y2hBcnJheTIsCiAgICAgICAgZWxsaXBzb2lkOiB2b2lkIDAsCiAgICAgICAgbWluRGlzdGFuY2U6IHZvaWQgMCwKICAgICAgICBncmFudWxhcml0eTogdm9pZCAwCiAgICAgIH07CiAgICAgIFNpbXBsZVBvbHlsaW5lR2VvbWV0cnkuY3JlYXRlR2VvbWV0cnkgPSBmdW5jdGlvbihzaW1wbGVQb2x5bGluZUdlb21ldHJ5KSB7CiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gc2ltcGxlUG9seWxpbmVHZW9tZXRyeS5fcG9zaXRpb25zOwogICAgICAgIGNvbnN0IGNvbG9ycyA9IHNpbXBsZVBvbHlsaW5lR2VvbWV0cnkuX2NvbG9yczsKICAgICAgICBjb25zdCBjb2xvcnNQZXJWZXJ0ZXggPSBzaW1wbGVQb2x5bGluZUdlb21ldHJ5Ll9jb2xvcnNQZXJWZXJ0ZXg7CiAgICAgICAgY29uc3QgYXJjVHlwZSA9IHNpbXBsZVBvbHlsaW5lR2VvbWV0cnkuX2FyY1R5cGU7CiAgICAgICAgY29uc3QgZ3JhbnVsYXJpdHkgPSBzaW1wbGVQb2x5bGluZUdlb21ldHJ5Ll9ncmFudWxhcml0eTsKICAgICAgICBjb25zdCBlbGxpcHNvaWQgPSBzaW1wbGVQb2x5bGluZUdlb21ldHJ5Ll9lbGxpcHNvaWQ7CiAgICAgICAgY29uc3QgbWluRGlzdGFuY2UgPSBNYXRoX2RlZmF1bHQuY2hvcmRMZW5ndGgoCiAgICAgICAgICBncmFudWxhcml0eSwKICAgICAgICAgIGVsbGlwc29pZC5tYXhpbXVtUmFkaXVzCiAgICAgICAgKTsKICAgICAgICBjb25zdCBwZXJTZWdtZW50Q29sb3JzID0gZGVmaW5lZF9kZWZhdWx0KGNvbG9ycykgJiYgIWNvbG9yc1BlclZlcnRleDsKICAgICAgICBsZXQgaTsKICAgICAgICBjb25zdCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGxldCBwb3NpdGlvblZhbHVlczsKICAgICAgICBsZXQgbnVtYmVyT2ZQb3NpdGlvbnM7CiAgICAgICAgbGV0IGNvbG9yVmFsdWVzOwogICAgICAgIGxldCBjb2xvcjsKICAgICAgICBsZXQgb2Zmc2V0ID0gMDsKICAgICAgICBpZiAoYXJjVHlwZSA9PT0gQXJjVHlwZV9kZWZhdWx0LkdFT0RFU0lDIHx8IGFyY1R5cGUgPT09IEFyY1R5cGVfZGVmYXVsdC5SSFVNQikgewogICAgICAgICAgbGV0IHN1YmRpdmlzaW9uU2l6ZTsKICAgICAgICAgIGxldCBudW1iZXJPZlBvaW50c0Z1bmN0aW9uOwogICAgICAgICAgbGV0IGdlbmVyYXRlQXJjRnVuY3Rpb247CiAgICAgICAgICBpZiAoYXJjVHlwZSA9PT0gQXJjVHlwZV9kZWZhdWx0LkdFT0RFU0lDKSB7CiAgICAgICAgICAgIHN1YmRpdmlzaW9uU2l6ZSA9IE1hdGhfZGVmYXVsdC5jaG9yZExlbmd0aCgKICAgICAgICAgICAgICBncmFudWxhcml0eSwKICAgICAgICAgICAgICBlbGxpcHNvaWQubWF4aW11bVJhZGl1cwogICAgICAgICAgICApOwogICAgICAgICAgICBudW1iZXJPZlBvaW50c0Z1bmN0aW9uID0gUG9seWxpbmVQaXBlbGluZV9kZWZhdWx0Lm51bWJlck9mUG9pbnRzOwogICAgICAgICAgICBnZW5lcmF0ZUFyY0Z1bmN0aW9uID0gUG9seWxpbmVQaXBlbGluZV9kZWZhdWx0LmdlbmVyYXRlQXJjOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3ViZGl2aXNpb25TaXplID0gZ3JhbnVsYXJpdHk7CiAgICAgICAgICAgIG51bWJlck9mUG9pbnRzRnVuY3Rpb24gPSBQb2x5bGluZVBpcGVsaW5lX2RlZmF1bHQubnVtYmVyT2ZQb2ludHNSaHVtYkxpbmU7CiAgICAgICAgICAgIGdlbmVyYXRlQXJjRnVuY3Rpb24gPSBQb2x5bGluZVBpcGVsaW5lX2RlZmF1bHQuZ2VuZXJhdGVSaHVtYkFyYzsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGhlaWdodHMgPSBQb2x5bGluZVBpcGVsaW5lX2RlZmF1bHQuZXh0cmFjdEhlaWdodHMocG9zaXRpb25zLCBlbGxpcHNvaWQpOwogICAgICAgICAgY29uc3QgZ2VuZXJhdGVBcmNPcHRpb25zID0gZ2VuZXJhdGVBcmNPcHRpb25zU2NyYXRjaDsKICAgICAgICAgIGlmIChhcmNUeXBlID09PSBBcmNUeXBlX2RlZmF1bHQuR0VPREVTSUMpIHsKICAgICAgICAgICAgZ2VuZXJhdGVBcmNPcHRpb25zLm1pbkRpc3RhbmNlID0gbWluRGlzdGFuY2U7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnZW5lcmF0ZUFyY09wdGlvbnMuZ3JhbnVsYXJpdHkgPSBncmFudWxhcml0eTsKICAgICAgICAgIH0KICAgICAgICAgIGdlbmVyYXRlQXJjT3B0aW9ucy5lbGxpcHNvaWQgPSBlbGxpcHNvaWQ7CiAgICAgICAgICBpZiAocGVyU2VnbWVudENvbG9ycykgewogICAgICAgICAgICBsZXQgcG9zaXRpb25Db3VudCA9IDA7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggLSAxOyBpKyspIHsKICAgICAgICAgICAgICBwb3NpdGlvbkNvdW50ICs9IG51bWJlck9mUG9pbnRzRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBwb3NpdGlvbnNbaV0sCiAgICAgICAgICAgICAgICBwb3NpdGlvbnNbaSArIDFdLAogICAgICAgICAgICAgICAgc3ViZGl2aXNpb25TaXplCiAgICAgICAgICAgICAgKSArIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcG9zaXRpb25WYWx1ZXMgPSBuZXcgRmxvYXQ2NEFycmF5KHBvc2l0aW9uQ291bnQgKiAzKTsKICAgICAgICAgICAgY29sb3JWYWx1ZXMgPSBuZXcgVWludDhBcnJheShwb3NpdGlvbkNvdW50ICogNCk7CiAgICAgICAgICAgIGdlbmVyYXRlQXJjT3B0aW9ucy5wb3NpdGlvbnMgPSBzY3JhdGNoQXJyYXkxOwogICAgICAgICAgICBnZW5lcmF0ZUFyY09wdGlvbnMuaGVpZ2h0ID0gc2NyYXRjaEFycmF5MjsKICAgICAgICAgICAgbGV0IGNpID0gMDsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aCAtIDE7ICsraSkgewogICAgICAgICAgICAgIHNjcmF0Y2hBcnJheTFbMF0gPSBwb3NpdGlvbnNbaV07CiAgICAgICAgICAgICAgc2NyYXRjaEFycmF5MVsxXSA9IHBvc2l0aW9uc1tpICsgMV07CiAgICAgICAgICAgICAgc2NyYXRjaEFycmF5MlswXSA9IGhlaWdodHNbaV07CiAgICAgICAgICAgICAgc2NyYXRjaEFycmF5MlsxXSA9IGhlaWdodHNbaSArIDFdOwogICAgICAgICAgICAgIGNvbnN0IHBvcyA9IGdlbmVyYXRlQXJjRnVuY3Rpb24oZ2VuZXJhdGVBcmNPcHRpb25zKTsKICAgICAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGNvbG9ycykpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHNlZ0xlbiA9IHBvcy5sZW5ndGggLyAzOwogICAgICAgICAgICAgICAgY29sb3IgPSBjb2xvcnNbaV07CiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHNlZ0xlbjsgKytrKSB7CiAgICAgICAgICAgICAgICAgIGNvbG9yVmFsdWVzW2NpKytdID0gQ29sb3JfZGVmYXVsdC5mbG9hdFRvQnl0ZShjb2xvci5yZWQpOwogICAgICAgICAgICAgICAgICBjb2xvclZhbHVlc1tjaSsrXSA9IENvbG9yX2RlZmF1bHQuZmxvYXRUb0J5dGUoY29sb3IuZ3JlZW4pOwogICAgICAgICAgICAgICAgICBjb2xvclZhbHVlc1tjaSsrXSA9IENvbG9yX2RlZmF1bHQuZmxvYXRUb0J5dGUoY29sb3IuYmx1ZSk7CiAgICAgICAgICAgICAgICAgIGNvbG9yVmFsdWVzW2NpKytdID0gQ29sb3JfZGVmYXVsdC5mbG9hdFRvQnl0ZShjb2xvci5hbHBoYSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHBvc2l0aW9uVmFsdWVzLnNldChwb3MsIG9mZnNldCk7CiAgICAgICAgICAgICAgb2Zmc2V0ICs9IHBvcy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdlbmVyYXRlQXJjT3B0aW9ucy5wb3NpdGlvbnMgPSBwb3NpdGlvbnM7CiAgICAgICAgICAgIGdlbmVyYXRlQXJjT3B0aW9ucy5oZWlnaHQgPSBoZWlnaHRzOwogICAgICAgICAgICBwb3NpdGlvblZhbHVlcyA9IG5ldyBGbG9hdDY0QXJyYXkoCiAgICAgICAgICAgICAgZ2VuZXJhdGVBcmNGdW5jdGlvbihnZW5lcmF0ZUFyY09wdGlvbnMpCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoY29sb3JzKSkgewogICAgICAgICAgICAgIGNvbG9yVmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkocG9zaXRpb25WYWx1ZXMubGVuZ3RoIC8gMyAqIDQpOwogICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggLSAxOyArK2kpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHAwID0gcG9zaXRpb25zW2ldOwogICAgICAgICAgICAgICAgY29uc3QgcDEgPSBwb3NpdGlvbnNbaSArIDFdOwogICAgICAgICAgICAgICAgY29uc3QgYzAgPSBjb2xvcnNbaV07CiAgICAgICAgICAgICAgICBjb25zdCBjMSA9IGNvbG9yc1tpICsgMV07CiAgICAgICAgICAgICAgICBvZmZzZXQgPSBpbnRlcnBvbGF0ZUNvbG9yczIoCiAgICAgICAgICAgICAgICAgIHAwLAogICAgICAgICAgICAgICAgICBwMSwKICAgICAgICAgICAgICAgICAgYzAsCiAgICAgICAgICAgICAgICAgIGMxLAogICAgICAgICAgICAgICAgICBtaW5EaXN0YW5jZSwKICAgICAgICAgICAgICAgICAgY29sb3JWYWx1ZXMsCiAgICAgICAgICAgICAgICAgIG9mZnNldAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgbGFzdENvbG9yID0gY29sb3JzW2xlbmd0aCAtIDFdOwogICAgICAgICAgICAgIGNvbG9yVmFsdWVzW29mZnNldCsrXSA9IENvbG9yX2RlZmF1bHQuZmxvYXRUb0J5dGUobGFzdENvbG9yLnJlZCk7CiAgICAgICAgICAgICAgY29sb3JWYWx1ZXNbb2Zmc2V0KytdID0gQ29sb3JfZGVmYXVsdC5mbG9hdFRvQnl0ZShsYXN0Q29sb3IuZ3JlZW4pOwogICAgICAgICAgICAgIGNvbG9yVmFsdWVzW29mZnNldCsrXSA9IENvbG9yX2RlZmF1bHQuZmxvYXRUb0J5dGUobGFzdENvbG9yLmJsdWUpOwogICAgICAgICAgICAgIGNvbG9yVmFsdWVzW29mZnNldCsrXSA9IENvbG9yX2RlZmF1bHQuZmxvYXRUb0J5dGUobGFzdENvbG9yLmFscGhhKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBudW1iZXJPZlBvc2l0aW9ucyA9IHBlclNlZ21lbnRDb2xvcnMgPyBsZW5ndGggKiAyIC0gMiA6IGxlbmd0aDsKICAgICAgICAgIHBvc2l0aW9uVmFsdWVzID0gbmV3IEZsb2F0NjRBcnJheShudW1iZXJPZlBvc2l0aW9ucyAqIDMpOwogICAgICAgICAgY29sb3JWYWx1ZXMgPSBkZWZpbmVkX2RlZmF1bHQoY29sb3JzKSA/IG5ldyBVaW50OEFycmF5KG51bWJlck9mUG9zaXRpb25zICogNCkgOiB2b2lkIDA7CiAgICAgICAgICBsZXQgcG9zaXRpb25JbmRleCA9IDA7CiAgICAgICAgICBsZXQgY29sb3JJbmRleCA9IDA7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgY29uc3QgcCA9IHBvc2l0aW9uc1tpXTsKICAgICAgICAgICAgaWYgKHBlclNlZ21lbnRDb2xvcnMgJiYgaSA+IDApIHsKICAgICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayhwLCBwb3NpdGlvblZhbHVlcywgcG9zaXRpb25JbmRleCk7CiAgICAgICAgICAgICAgcG9zaXRpb25JbmRleCArPSAzOwogICAgICAgICAgICAgIGNvbG9yID0gY29sb3JzW2kgLSAxXTsKICAgICAgICAgICAgICBjb2xvclZhbHVlc1tjb2xvckluZGV4KytdID0gQ29sb3JfZGVmYXVsdC5mbG9hdFRvQnl0ZShjb2xvci5yZWQpOwogICAgICAgICAgICAgIGNvbG9yVmFsdWVzW2NvbG9ySW5kZXgrK10gPSBDb2xvcl9kZWZhdWx0LmZsb2F0VG9CeXRlKGNvbG9yLmdyZWVuKTsKICAgICAgICAgICAgICBjb2xvclZhbHVlc1tjb2xvckluZGV4KytdID0gQ29sb3JfZGVmYXVsdC5mbG9hdFRvQnl0ZShjb2xvci5ibHVlKTsKICAgICAgICAgICAgICBjb2xvclZhbHVlc1tjb2xvckluZGV4KytdID0gQ29sb3JfZGVmYXVsdC5mbG9hdFRvQnl0ZShjb2xvci5hbHBoYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBlclNlZ21lbnRDb2xvcnMgJiYgaSA9PT0gbGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKHAsIHBvc2l0aW9uVmFsdWVzLCBwb3NpdGlvbkluZGV4KTsKICAgICAgICAgICAgcG9zaXRpb25JbmRleCArPSAzOwogICAgICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGNvbG9ycykpIHsKICAgICAgICAgICAgICBjb2xvciA9IGNvbG9yc1tpXTsKICAgICAgICAgICAgICBjb2xvclZhbHVlc1tjb2xvckluZGV4KytdID0gQ29sb3JfZGVmYXVsdC5mbG9hdFRvQnl0ZShjb2xvci5yZWQpOwogICAgICAgICAgICAgIGNvbG9yVmFsdWVzW2NvbG9ySW5kZXgrK10gPSBDb2xvcl9kZWZhdWx0LmZsb2F0VG9CeXRlKGNvbG9yLmdyZWVuKTsKICAgICAgICAgICAgICBjb2xvclZhbHVlc1tjb2xvckluZGV4KytdID0gQ29sb3JfZGVmYXVsdC5mbG9hdFRvQnl0ZShjb2xvci5ibHVlKTsKICAgICAgICAgICAgICBjb2xvclZhbHVlc1tjb2xvckluZGV4KytdID0gQ29sb3JfZGVmYXVsdC5mbG9hdFRvQnl0ZShjb2xvci5hbHBoYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZXNfZGVmYXVsdCgpOwogICAgICAgIGF0dHJpYnV0ZXMucG9zaXRpb24gPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5ET1VCTEUsCiAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgICAgdmFsdWVzOiBwb3NpdGlvblZhbHVlcwogICAgICAgIH0pOwogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoY29sb3JzKSkgewogICAgICAgICAgYXR0cmlidXRlcy5jb2xvciA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuVU5TSUdORURfQllURSwKICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogNCwKICAgICAgICAgICAgdmFsdWVzOiBjb2xvclZhbHVlcywKICAgICAgICAgICAgbm9ybWFsaXplOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgbnVtYmVyT2ZQb3NpdGlvbnMgPSBwb3NpdGlvblZhbHVlcy5sZW5ndGggLyAzOwogICAgICAgIGNvbnN0IG51bWJlck9mSW5kaWNlcyA9IChudW1iZXJPZlBvc2l0aW9ucyAtIDEpICogMjsKICAgICAgICBjb25zdCBpbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkoCiAgICAgICAgICBudW1iZXJPZlBvc2l0aW9ucywKICAgICAgICAgIG51bWJlck9mSW5kaWNlcwogICAgICAgICk7CiAgICAgICAgbGV0IGluZGV4ID0gMDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyT2ZQb3NpdGlvbnMgLSAxOyArK2kpIHsKICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBpOwogICAgICAgICAgaW5kaWNlc1tpbmRleCsrXSA9IGkgKyAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IEdlb21ldHJ5X2RlZmF1bHQoewogICAgICAgICAgYXR0cmlidXRlcywKICAgICAgICAgIGluZGljZXMsCiAgICAgICAgICBwcmltaXRpdmVUeXBlOiBQcmltaXRpdmVUeXBlX2RlZmF1bHQuTElORVMsCiAgICAgICAgICBib3VuZGluZ1NwaGVyZTogQm91bmRpbmdTcGhlcmVfZGVmYXVsdC5mcm9tUG9pbnRzKHBvc2l0aW9ucykKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgU2ltcGxlUG9seWxpbmVHZW9tZXRyeV9kZWZhdWx0ID0gU2ltcGxlUG9seWxpbmVHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVNpbXBsZVBvbHlsaW5lR2VvbWV0cnkuanMKICB2YXIgY3JlYXRlU2ltcGxlUG9seWxpbmVHZW9tZXRyeV9leHBvcnRzID0ge307CiAgX19leHBvcnQoY3JlYXRlU2ltcGxlUG9seWxpbmVHZW9tZXRyeV9leHBvcnRzLCB7CiAgICBkZWZhdWx0OiAoKSA9PiBjcmVhdGVTaW1wbGVQb2x5bGluZUdlb21ldHJ5X2RlZmF1bHQKICB9KTsKICBmdW5jdGlvbiBjcmVhdGVTaW1wbGVQb2x5bGluZUdlb21ldHJ5KHNpbXBsZVBvbHlsaW5lR2VvbWV0cnksIG9mZnNldCkgewogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvZmZzZXQpKSB7CiAgICAgIHNpbXBsZVBvbHlsaW5lR2VvbWV0cnkgPSBTaW1wbGVQb2x5bGluZUdlb21ldHJ5X2RlZmF1bHQudW5wYWNrKAogICAgICAgIHNpbXBsZVBvbHlsaW5lR2VvbWV0cnksCiAgICAgICAgb2Zmc2V0CiAgICAgICk7CiAgICB9CiAgICBzaW1wbGVQb2x5bGluZUdlb21ldHJ5Ll9lbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC5jbG9uZSgKICAgICAgc2ltcGxlUG9seWxpbmVHZW9tZXRyeS5fZWxsaXBzb2lkCiAgICApOwogICAgcmV0dXJuIFNpbXBsZVBvbHlsaW5lR2VvbWV0cnlfZGVmYXVsdC5jcmVhdGVHZW9tZXRyeShzaW1wbGVQb2x5bGluZUdlb21ldHJ5KTsKICB9CiAgdmFyIGNyZWF0ZVNpbXBsZVBvbHlsaW5lR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9jcmVhdGVTaW1wbGVQb2x5bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVTaW1wbGVQb2x5bGluZUdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfU2ltcGxlUG9seWxpbmVHZW9tZXRyeSgpOwogICAgICBjcmVhdGVTaW1wbGVQb2x5bGluZUdlb21ldHJ5X2RlZmF1bHQgPSBjcmVhdGVTaW1wbGVQb2x5bGluZUdlb21ldHJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvU3BoZXJlR2VvbWV0cnkuanMKICBmdW5jdGlvbiBTcGhlcmVHZW9tZXRyeShvcHRpb25zKSB7CiAgICBjb25zdCByYWRpdXMgPSBvcHRpb25zLnJhZGl1cyA/PyAxOwogICAgY29uc3QgcmFkaWkgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KHJhZGl1cywgcmFkaXVzLCByYWRpdXMpOwogICAgY29uc3QgZWxsaXBzb2lkT3B0aW9ucyA9IHsKICAgICAgcmFkaWksCiAgICAgIHN0YWNrUGFydGl0aW9uczogb3B0aW9ucy5zdGFja1BhcnRpdGlvbnMsCiAgICAgIHNsaWNlUGFydGl0aW9uczogb3B0aW9ucy5zbGljZVBhcnRpdGlvbnMsCiAgICAgIHZlcnRleEZvcm1hdDogb3B0aW9ucy52ZXJ0ZXhGb3JtYXQKICAgIH07CiAgICB0aGlzLl9lbGxpcHNvaWRHZW9tZXRyeSA9IG5ldyBFbGxpcHNvaWRHZW9tZXRyeV9kZWZhdWx0KGVsbGlwc29pZE9wdGlvbnMpOwogICAgdGhpcy5fd29ya2VyTmFtZSA9ICJjcmVhdGVTcGhlcmVHZW9tZXRyeSI7CiAgfQogIHZhciBzY3JhdGNoRWxsaXBzb2lkR2VvbWV0cnksIHNjcmF0Y2hPcHRpb25zMjEsIFNwaGVyZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfU3BoZXJlR2VvbWV0cnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1NwaGVyZUdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkR2VvbWV0cnkoKTsKICAgICAgaW5pdF9WZXJ0ZXhGb3JtYXQoKTsKICAgICAgU3BoZXJlR2VvbWV0cnkucGFja2VkTGVuZ3RoID0gRWxsaXBzb2lkR2VvbWV0cnlfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgIFNwaGVyZUdlb21ldHJ5LnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIHJldHVybiBFbGxpcHNvaWRHZW9tZXRyeV9kZWZhdWx0LnBhY2sodmFsdWUuX2VsbGlwc29pZEdlb21ldHJ5LCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hFbGxpcHNvaWRHZW9tZXRyeSA9IG5ldyBFbGxpcHNvaWRHZW9tZXRyeV9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hPcHRpb25zMjEgPSB7CiAgICAgICAgcmFkaXVzOiB2b2lkIDAsCiAgICAgICAgcmFkaWk6IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKSwKICAgICAgICB2ZXJ0ZXhGb3JtYXQ6IG5ldyBWZXJ0ZXhGb3JtYXRfZGVmYXVsdCgpLAogICAgICAgIHN0YWNrUGFydGl0aW9uczogdm9pZCAwLAogICAgICAgIHNsaWNlUGFydGl0aW9uczogdm9pZCAwCiAgICAgIH07CiAgICAgIFNwaGVyZUdlb21ldHJ5LnVucGFjayA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydGluZ0luZGV4LCByZXN1bHQpIHsKICAgICAgICBjb25zdCBlbGxpcHNvaWRHZW9tZXRyeSA9IEVsbGlwc29pZEdlb21ldHJ5X2RlZmF1bHQudW5wYWNrKAogICAgICAgICAgYXJyYXksCiAgICAgICAgICBzdGFydGluZ0luZGV4LAogICAgICAgICAgc2NyYXRjaEVsbGlwc29pZEdlb21ldHJ5CiAgICAgICAgKTsKICAgICAgICBzY3JhdGNoT3B0aW9uczIxLnZlcnRleEZvcm1hdCA9IFZlcnRleEZvcm1hdF9kZWZhdWx0LmNsb25lKAogICAgICAgICAgZWxsaXBzb2lkR2VvbWV0cnkuX3ZlcnRleEZvcm1hdCwKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMjEudmVydGV4Rm9ybWF0CiAgICAgICAgKTsKICAgICAgICBzY3JhdGNoT3B0aW9uczIxLnN0YWNrUGFydGl0aW9ucyA9IGVsbGlwc29pZEdlb21ldHJ5Ll9zdGFja1BhcnRpdGlvbnM7CiAgICAgICAgc2NyYXRjaE9wdGlvbnMyMS5zbGljZVBhcnRpdGlvbnMgPSBlbGxpcHNvaWRHZW9tZXRyeS5fc2xpY2VQYXJ0aXRpb25zOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMjEucmFkaXVzID0gZWxsaXBzb2lkR2VvbWV0cnkuX3JhZGlpLng7CiAgICAgICAgICByZXR1cm4gbmV3IFNwaGVyZUdlb21ldHJ5KHNjcmF0Y2hPcHRpb25zMjEpOwogICAgICAgIH0KICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoZWxsaXBzb2lkR2VvbWV0cnkuX3JhZGlpLCBzY3JhdGNoT3B0aW9uczIxLnJhZGlpKTsKICAgICAgICByZXN1bHQuX2VsbGlwc29pZEdlb21ldHJ5ID0gbmV3IEVsbGlwc29pZEdlb21ldHJ5X2RlZmF1bHQoc2NyYXRjaE9wdGlvbnMyMSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgU3BoZXJlR2VvbWV0cnkuY3JlYXRlR2VvbWV0cnkgPSBmdW5jdGlvbihzcGhlcmVHZW9tZXRyeSkgewogICAgICAgIHJldHVybiBFbGxpcHNvaWRHZW9tZXRyeV9kZWZhdWx0LmNyZWF0ZUdlb21ldHJ5KHNwaGVyZUdlb21ldHJ5Ll9lbGxpcHNvaWRHZW9tZXRyeSk7CiAgICAgIH07CiAgICAgIFNwaGVyZUdlb21ldHJ5X2RlZmF1bHQgPSBTcGhlcmVHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVNwaGVyZUdlb21ldHJ5LmpzCiAgdmFyIGNyZWF0ZVNwaGVyZUdlb21ldHJ5X2V4cG9ydHMgPSB7fTsKICBfX2V4cG9ydChjcmVhdGVTcGhlcmVHZW9tZXRyeV9leHBvcnRzLCB7CiAgICBkZWZhdWx0OiAoKSA9PiBjcmVhdGVTcGhlcmVHZW9tZXRyeV9kZWZhdWx0CiAgfSk7CiAgZnVuY3Rpb24gY3JlYXRlU3BoZXJlR2VvbWV0cnkoc3BoZXJlR2VvbWV0cnksIG9mZnNldCkgewogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvZmZzZXQpKSB7CiAgICAgIHNwaGVyZUdlb21ldHJ5ID0gU3BoZXJlR2VvbWV0cnlfZGVmYXVsdC51bnBhY2soc3BoZXJlR2VvbWV0cnksIG9mZnNldCk7CiAgICB9CiAgICByZXR1cm4gU3BoZXJlR2VvbWV0cnlfZGVmYXVsdC5jcmVhdGVHZW9tZXRyeShzcGhlcmVHZW9tZXRyeSk7CiAgfQogIHZhciBjcmVhdGVTcGhlcmVHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X2NyZWF0ZVNwaGVyZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVTcGhlcmVHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X1NwaGVyZUdlb21ldHJ5KCk7CiAgICAgIGNyZWF0ZVNwaGVyZUdlb21ldHJ5X2RlZmF1bHQgPSBjcmVhdGVTcGhlcmVHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1NwaGVyZU91dGxpbmVHZW9tZXRyeS5qcwogIGZ1bmN0aW9uIFNwaGVyZU91dGxpbmVHZW9tZXRyeShvcHRpb25zKSB7CiAgICBjb25zdCByYWRpdXMgPSBvcHRpb25zLnJhZGl1cyA/PyAxOwogICAgY29uc3QgcmFkaWkgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KHJhZGl1cywgcmFkaXVzLCByYWRpdXMpOwogICAgY29uc3QgZWxsaXBzb2lkT3B0aW9ucyA9IHsKICAgICAgcmFkaWksCiAgICAgIHN0YWNrUGFydGl0aW9uczogb3B0aW9ucy5zdGFja1BhcnRpdGlvbnMsCiAgICAgIHNsaWNlUGFydGl0aW9uczogb3B0aW9ucy5zbGljZVBhcnRpdGlvbnMsCiAgICAgIHN1YmRpdmlzaW9uczogb3B0aW9ucy5zdWJkaXZpc2lvbnMKICAgIH07CiAgICB0aGlzLl9lbGxpcHNvaWRHZW9tZXRyeSA9IG5ldyBFbGxpcHNvaWRPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdChlbGxpcHNvaWRPcHRpb25zKTsKICAgIHRoaXMuX3dvcmtlck5hbWUgPSAiY3JlYXRlU3BoZXJlT3V0bGluZUdlb21ldHJ5IjsKICB9CiAgdmFyIHNjcmF0Y2hFbGxpcHNvaWRHZW9tZXRyeTIsIHNjcmF0Y2hPcHRpb25zMjIsIFNwaGVyZU91dGxpbmVHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X1NwaGVyZU91dGxpbmVHZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvU3BoZXJlT3V0bGluZUdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5KCk7CiAgICAgIFNwaGVyZU91dGxpbmVHZW9tZXRyeS5wYWNrZWRMZW5ndGggPSBFbGxpcHNvaWRPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgIFNwaGVyZU91dGxpbmVHZW9tZXRyeS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICByZXR1cm4gRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQucGFjaygKICAgICAgICAgIHZhbHVlLl9lbGxpcHNvaWRHZW9tZXRyeSwKICAgICAgICAgIGFycmF5LAogICAgICAgICAgc3RhcnRpbmdJbmRleAogICAgICAgICk7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hFbGxpcHNvaWRHZW9tZXRyeTIgPSBuZXcgRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaE9wdGlvbnMyMiA9IHsKICAgICAgICByYWRpdXM6IHZvaWQgMCwKICAgICAgICByYWRpaTogbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpLAogICAgICAgIHN0YWNrUGFydGl0aW9uczogdm9pZCAwLAogICAgICAgIHNsaWNlUGFydGl0aW9uczogdm9pZCAwLAogICAgICAgIHN1YmRpdmlzaW9uczogdm9pZCAwCiAgICAgIH07CiAgICAgIFNwaGVyZU91dGxpbmVHZW9tZXRyeS51bnBhY2sgPSBmdW5jdGlvbihhcnJheSwgc3RhcnRpbmdJbmRleCwgcmVzdWx0KSB7CiAgICAgICAgY29uc3QgZWxsaXBzb2lkR2VvbWV0cnkgPSBFbGxpcHNvaWRPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdC51bnBhY2soCiAgICAgICAgICBhcnJheSwKICAgICAgICAgIHN0YXJ0aW5nSW5kZXgsCiAgICAgICAgICBzY3JhdGNoRWxsaXBzb2lkR2VvbWV0cnkyCiAgICAgICAgKTsKICAgICAgICBzY3JhdGNoT3B0aW9uczIyLnN0YWNrUGFydGl0aW9ucyA9IGVsbGlwc29pZEdlb21ldHJ5Ll9zdGFja1BhcnRpdGlvbnM7CiAgICAgICAgc2NyYXRjaE9wdGlvbnMyMi5zbGljZVBhcnRpdGlvbnMgPSBlbGxpcHNvaWRHZW9tZXRyeS5fc2xpY2VQYXJ0aXRpb25zOwogICAgICAgIHNjcmF0Y2hPcHRpb25zMjIuc3ViZGl2aXNpb25zID0gZWxsaXBzb2lkR2VvbWV0cnkuX3N1YmRpdmlzaW9uczsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczIyLnJhZGl1cyA9IGVsbGlwc29pZEdlb21ldHJ5Ll9yYWRpaS54OwogICAgICAgICAgcmV0dXJuIG5ldyBTcGhlcmVPdXRsaW5lR2VvbWV0cnkoc2NyYXRjaE9wdGlvbnMyMik7CiAgICAgICAgfQogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShlbGxpcHNvaWRHZW9tZXRyeS5fcmFkaWksIHNjcmF0Y2hPcHRpb25zMjIucmFkaWkpOwogICAgICAgIHJlc3VsdC5fZWxsaXBzb2lkR2VvbWV0cnkgPSBuZXcgRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQoc2NyYXRjaE9wdGlvbnMyMik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgU3BoZXJlT3V0bGluZUdlb21ldHJ5LmNyZWF0ZUdlb21ldHJ5ID0gZnVuY3Rpb24oc3BoZXJlR2VvbWV0cnkpIHsKICAgICAgICByZXR1cm4gRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQuY3JlYXRlR2VvbWV0cnkoCiAgICAgICAgICBzcGhlcmVHZW9tZXRyeS5fZWxsaXBzb2lkR2VvbWV0cnkKICAgICAgICApOwogICAgICB9OwogICAgICBTcGhlcmVPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdCA9IFNwaGVyZU91dGxpbmVHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVNwaGVyZU91dGxpbmVHZW9tZXRyeS5qcwogIHZhciBjcmVhdGVTcGhlcmVPdXRsaW5lR2VvbWV0cnlfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGNyZWF0ZVNwaGVyZU91dGxpbmVHZW9tZXRyeV9leHBvcnRzLCB7CiAgICBkZWZhdWx0OiAoKSA9PiBjcmVhdGVTcGhlcmVPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdAogIH0pOwogIGZ1bmN0aW9uIGNyZWF0ZVNwaGVyZU91dGxpbmVHZW9tZXRyeShzcGhlcmVHZW9tZXRyeSwgb2Zmc2V0KSB7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG9mZnNldCkpIHsKICAgICAgc3BoZXJlR2VvbWV0cnkgPSBTcGhlcmVPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdC51bnBhY2soc3BoZXJlR2VvbWV0cnksIG9mZnNldCk7CiAgICB9CiAgICByZXR1cm4gU3BoZXJlT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQuY3JlYXRlR2VvbWV0cnkoc3BoZXJlR2VvbWV0cnkpOwogIH0KICB2YXIgY3JlYXRlU3BoZXJlT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfY3JlYXRlU3BoZXJlT3V0bGluZUdlb21ldHJ5ID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVTcGhlcmVPdXRsaW5lR2VvbWV0cnkuanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9TcGhlcmVPdXRsaW5lR2VvbWV0cnkoKTsKICAgICAgY3JlYXRlU3BoZXJlT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQgPSBjcmVhdGVTcGhlcmVPdXRsaW5lR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVWZWN0b3JUaWxlQ2xhbXBlZFBvbHlsaW5lcy5qcwogIHZhciBjcmVhdGVWZWN0b3JUaWxlQ2xhbXBlZFBvbHlsaW5lc19leHBvcnRzID0ge307CiAgX19leHBvcnQoY3JlYXRlVmVjdG9yVGlsZUNsYW1wZWRQb2x5bGluZXNfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gY3JlYXRlVmVjdG9yVGlsZUNsYW1wZWRQb2x5bGluZXNfZGVmYXVsdAogIH0pOwogIGZ1bmN0aW9uIGRlY29kZVBvc2l0aW9ucyh1QnVmZmVyLCB2QnVmZmVyLCBoZWlnaHRCdWZmZXIsIHJlY3RhbmdsZSwgbWluaW11bUhlaWdodCwgbWF4aW11bUhlaWdodCwgZWxsaXBzb2lkKSB7CiAgICBjb25zdCBwb3NpdGlvbnNMZW5ndGggPSB1QnVmZmVyLmxlbmd0aDsKICAgIGNvbnN0IGRlY29kZWRQb3NpdGlvbnMgPSBuZXcgRmxvYXQ2NEFycmF5KHBvc2l0aW9uc0xlbmd0aCAqIDMpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnNMZW5ndGg7ICsraSkgewogICAgICBjb25zdCB1MyA9IHVCdWZmZXJbaV07CiAgICAgIGNvbnN0IHYzID0gdkJ1ZmZlcltpXTsKICAgICAgY29uc3QgaCA9IGhlaWdodEJ1ZmZlcltpXTsKICAgICAgY29uc3QgbG9uID0gTWF0aF9kZWZhdWx0LmxlcnAocmVjdGFuZ2xlLndlc3QsIHJlY3RhbmdsZS5lYXN0LCB1MyAvIE1BWF9TSE9SVCk7CiAgICAgIGNvbnN0IGxhdCA9IE1hdGhfZGVmYXVsdC5sZXJwKAogICAgICAgIHJlY3RhbmdsZS5zb3V0aCwKICAgICAgICByZWN0YW5nbGUubm9ydGgsCiAgICAgICAgdjMgLyBNQVhfU0hPUlQKICAgICAgKTsKICAgICAgY29uc3QgYWx0ID0gTWF0aF9kZWZhdWx0LmxlcnAobWluaW11bUhlaWdodCwgbWF4aW11bUhlaWdodCwgaCAvIE1BWF9TSE9SVCk7CiAgICAgIGNvbnN0IGNhcnRvZ3JhcGhpYzIgPSBDYXJ0b2dyYXBoaWNfZGVmYXVsdC5mcm9tUmFkaWFucygKICAgICAgICBsb24sCiAgICAgICAgbGF0LAogICAgICAgIGFsdCwKICAgICAgICBzY3JhdGNoQlZDYXJ0b2dyYXBoaWMKICAgICAgKTsKICAgICAgY29uc3QgZGVjb2RlZFBvc2l0aW9uID0gZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKAogICAgICAgIGNhcnRvZ3JhcGhpYzIsCiAgICAgICAgc2NyYXRjaEVuY29kZWRQb3NpdGlvbgogICAgICApOwogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayhkZWNvZGVkUG9zaXRpb24sIGRlY29kZWRQb3NpdGlvbnMsIGkgKiAzKTsKICAgIH0KICAgIHJldHVybiBkZWNvZGVkUG9zaXRpb25zOwogIH0KICBmdW5jdGlvbiBnZXRQb3NpdGlvbk9mZnNldHMoY291bnRzKSB7CiAgICBjb25zdCBjb3VudHNMZW5ndGggPSBjb3VudHMubGVuZ3RoOwogICAgY29uc3QgcG9zaXRpb25PZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KGNvdW50c0xlbmd0aCArIDEpOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50c0xlbmd0aDsgKytpKSB7CiAgICAgIHBvc2l0aW9uT2Zmc2V0c1tpXSA9IG9mZnNldDsKICAgICAgb2Zmc2V0ICs9IGNvdW50c1tpXTsKICAgIH0KICAgIHBvc2l0aW9uT2Zmc2V0c1tjb3VudHNMZW5ndGhdID0gb2Zmc2V0OwogICAgcmV0dXJuIHBvc2l0aW9uT2Zmc2V0czsKICB9CiAgZnVuY3Rpb24gcmVtb3ZlRHVwbGljYXRlcyh1QnVmZmVyLCB2QnVmZmVyLCBoZWlnaHRCdWZmZXIsIGNvdW50cykgewogICAgY29uc3QgY291bnRzTGVuZ3RoID0gY291bnRzLmxlbmd0aDsKICAgIGNvbnN0IHBvc2l0aW9uc0xlbmd0aCA9IHVCdWZmZXIubGVuZ3RoOwogICAgY29uc3QgbWFya1JlbW92YWwgPSBuZXcgVWludDhBcnJheShwb3NpdGlvbnNMZW5ndGgpOwogICAgY29uc3QgcHJldmlvdXMgPSBwcmV2aW91c0NvbXByZXNzZWRDYXJ0b2dyYXBoaWNTY3JhdGNoOwogICAgY29uc3QgY3VycmVudCA9IGN1cnJlbnRDb21wcmVzc2VkQ2FydG9ncmFwaGljU2NyYXRjaDsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudHNMZW5ndGg7IGkrKykgewogICAgICBjb25zdCBjb3VudCA9IGNvdW50c1tpXTsKICAgICAgbGV0IHVwZGF0ZWRDb3VudCA9IGNvdW50OwogICAgICBmb3IgKGxldCBqID0gMTsgaiA8IGNvdW50OyBqKyspIHsKICAgICAgICBjb25zdCBpbmRleCA9IG9mZnNldCArIGo7CiAgICAgICAgY29uc3QgcHJldmlvdXNJbmRleCA9IGluZGV4IC0gMTsKICAgICAgICBjdXJyZW50LmxvbmdpdHVkZSA9IHVCdWZmZXJbaW5kZXhdOwogICAgICAgIGN1cnJlbnQubGF0aXR1ZGUgPSB2QnVmZmVyW2luZGV4XTsKICAgICAgICBwcmV2aW91cy5sb25naXR1ZGUgPSB1QnVmZmVyW3ByZXZpb3VzSW5kZXhdOwogICAgICAgIHByZXZpb3VzLmxhdGl0dWRlID0gdkJ1ZmZlcltwcmV2aW91c0luZGV4XTsKICAgICAgICBpZiAoQ2FydG9ncmFwaGljX2RlZmF1bHQuZXF1YWxzKGN1cnJlbnQsIHByZXZpb3VzKSkgewogICAgICAgICAgdXBkYXRlZENvdW50LS07CiAgICAgICAgICBtYXJrUmVtb3ZhbFtwcmV2aW91c0luZGV4XSA9IDE7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvdW50c1tpXSA9IHVwZGF0ZWRDb3VudDsKICAgICAgb2Zmc2V0ICs9IGNvdW50OwogICAgfQogICAgbGV0IG5leHRBdmFpbGFibGVJbmRleCA9IDA7CiAgICBmb3IgKGxldCBrID0gMDsgayA8IHBvc2l0aW9uc0xlbmd0aDsgaysrKSB7CiAgICAgIGlmIChtYXJrUmVtb3ZhbFtrXSAhPT0gMSkgewogICAgICAgIHVCdWZmZXJbbmV4dEF2YWlsYWJsZUluZGV4XSA9IHVCdWZmZXJba107CiAgICAgICAgdkJ1ZmZlcltuZXh0QXZhaWxhYmxlSW5kZXhdID0gdkJ1ZmZlcltrXTsKICAgICAgICBoZWlnaHRCdWZmZXJbbmV4dEF2YWlsYWJsZUluZGV4XSA9IGhlaWdodEJ1ZmZlcltrXTsKICAgICAgICBuZXh0QXZhaWxhYmxlSW5kZXgrKzsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBWZXJ0ZXhBdHRyaWJ1dGVzQW5kSW5kaWNlcyh2b2x1bWVzQ291bnQpIHsKICAgIGNvbnN0IHZlcnRleENvdW50ID0gdm9sdW1lc0NvdW50ICogODsKICAgIGNvbnN0IHZlYzNGbG9hdHMgPSB2ZXJ0ZXhDb3VudCAqIDM7CiAgICBjb25zdCB2ZWM0RmxvYXRzID0gdmVydGV4Q291bnQgKiA0OwogICAgdGhpcy5zdGFydEVsbGlwc29pZE5vcm1hbHMgPSBuZXcgRmxvYXQzMkFycmF5KHZlYzNGbG9hdHMpOwogICAgdGhpcy5lbmRFbGxpcHNvaWROb3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheSh2ZWMzRmxvYXRzKTsKICAgIHRoaXMuc3RhcnRQb3NpdGlvbkFuZEhlaWdodHMgPSBuZXcgRmxvYXQzMkFycmF5KHZlYzRGbG9hdHMpOwogICAgdGhpcy5zdGFydEZhY2VOb3JtYWxBbmRWZXJ0ZXhDb3JuZXJJZHMgPSBuZXcgRmxvYXQzMkFycmF5KHZlYzRGbG9hdHMpOwogICAgdGhpcy5lbmRQb3NpdGlvbkFuZEhlaWdodHMgPSBuZXcgRmxvYXQzMkFycmF5KHZlYzRGbG9hdHMpOwogICAgdGhpcy5lbmRGYWNlTm9ybWFsQW5kSGFsZldpZHRocyA9IG5ldyBGbG9hdDMyQXJyYXkodmVjNEZsb2F0cyk7CiAgICB0aGlzLnZlcnRleEJhdGNoSWRzID0gbmV3IFVpbnQxNkFycmF5KHZlcnRleENvdW50KTsKICAgIHRoaXMuaW5kaWNlcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KHZlcnRleENvdW50LCAzNiAqIHZvbHVtZXNDb3VudCk7CiAgICB0aGlzLnZlYzNPZmZzZXQgPSAwOwogICAgdGhpcy52ZWM0T2Zmc2V0ID0gMDsKICAgIHRoaXMuYmF0Y2hJZE9mZnNldCA9IDA7CiAgICB0aGlzLmluZGV4T2Zmc2V0ID0gMDsKICAgIHRoaXMudm9sdW1lU3RhcnRJbmRleCA9IDA7CiAgfQogIGZ1bmN0aW9uIGNvbXB1dGVNaXRlcmVkTm9ybWFsKHByZXZpb3VzUG9zaXRpb24sIHBvc2l0aW9uLCBuZXh0UG9zaXRpb24sIGVsbGlwc29pZFN1cmZhY2VOb3JtYWwsIHJlc3VsdCkgewogICAgY29uc3QgdG93YXJkTmV4dCA9IENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdCgKICAgICAgbmV4dFBvc2l0aW9uLAogICAgICBwb3NpdGlvbiwKICAgICAgdG93YXJkTmV4dFNjcmF0Y2gKICAgICk7CiAgICBsZXQgdG93YXJkQ3VyciA9IENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdCgKICAgICAgcG9zaXRpb24sCiAgICAgIHByZXZpb3VzUG9zaXRpb24sCiAgICAgIHRvd2FyZEN1cnJTY3JhdGNoCiAgICApOwogICAgQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSh0b3dhcmROZXh0LCB0b3dhcmROZXh0KTsKICAgIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUodG93YXJkQ3VyciwgdG93YXJkQ3Vycik7CiAgICBpZiAoQ2FydGVzaWFuM19kZWZhdWx0LmRvdCh0b3dhcmROZXh0LCB0b3dhcmRDdXJyKSA8IE1JVEVSX0JSRUFLKSB7CiAgICAgIHRvd2FyZEN1cnIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcigKICAgICAgICB0b3dhcmRDdXJyLAogICAgICAgIC0xLAogICAgICAgIHRvd2FyZEN1cnJTY3JhdGNoCiAgICAgICk7CiAgICB9CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKHRvd2FyZE5leHQsIHRvd2FyZEN1cnIsIHJlc3VsdCk7CiAgICBpZiAoQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFscyhyZXN1bHQsIENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPKSkgewogICAgICByZXN1bHQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QocHJldmlvdXNQb3NpdGlvbiwgcG9zaXRpb24pOwogICAgfQogICAgQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKHJlc3VsdCwgZWxsaXBzb2lkU3VyZmFjZU5vcm1hbCwgcmVzdWx0KTsKICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhlbGxpcHNvaWRTdXJmYWNlTm9ybWFsLCByZXN1bHQsIHJlc3VsdCk7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKHJlc3VsdCwgcmVzdWx0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZVZlY3RvclRpbGVDbGFtcGVkUG9seWxpbmVzKHBhcmFtZXRlcnMsIHRyYW5zZmVyYWJsZU9iamVjdHMpIHsKICAgIGNvbnN0IGVuY29kZWRQb3NpdGlvbnMgPSBuZXcgVWludDE2QXJyYXkocGFyYW1ldGVycy5wb3NpdGlvbnMpOwogICAgY29uc3Qgd2lkdGhzID0gbmV3IFVpbnQxNkFycmF5KHBhcmFtZXRlcnMud2lkdGhzKTsKICAgIGNvbnN0IGNvdW50cyA9IG5ldyBVaW50MzJBcnJheShwYXJhbWV0ZXJzLmNvdW50cyk7CiAgICBjb25zdCBiYXRjaElkcyA9IG5ldyBVaW50MTZBcnJheShwYXJhbWV0ZXJzLmJhdGNoSWRzKTsKICAgIGNvbnN0IHJlY3RhbmdsZSA9IHNjcmF0Y2hSZWN0YW5nbGUzOwogICAgY29uc3QgZWxsaXBzb2lkID0gc2NyYXRjaEVsbGlwc29pZDEzOwogICAgY29uc3QgY2VudGVyID0gc2NyYXRjaENlbnRlcjQ7CiAgICBjb25zdCBwYWNrZWRCdWZmZXIgPSBuZXcgRmxvYXQ2NEFycmF5KHBhcmFtZXRlcnMucGFja2VkQnVmZmVyKTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgY29uc3QgbWluaW11bUhlaWdodCA9IHBhY2tlZEJ1ZmZlcltvZmZzZXQrK107CiAgICBjb25zdCBtYXhpbXVtSGVpZ2h0ID0gcGFja2VkQnVmZmVyW29mZnNldCsrXTsKICAgIFJlY3RhbmdsZV9kZWZhdWx0LnVucGFjayhwYWNrZWRCdWZmZXIsIG9mZnNldCwgcmVjdGFuZ2xlKTsKICAgIG9mZnNldCArPSBSZWN0YW5nbGVfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICBFbGxpcHNvaWRfZGVmYXVsdC51bnBhY2socGFja2VkQnVmZmVyLCBvZmZzZXQsIGVsbGlwc29pZCk7CiAgICBvZmZzZXQgKz0gRWxsaXBzb2lkX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjayhwYWNrZWRCdWZmZXIsIG9mZnNldCwgY2VudGVyKTsKICAgIGxldCBpOwogICAgbGV0IHBvc2l0aW9uc0xlbmd0aCA9IGVuY29kZWRQb3NpdGlvbnMubGVuZ3RoIC8gMzsKICAgIGNvbnN0IHVCdWZmZXIgPSBlbmNvZGVkUG9zaXRpb25zLnN1YmFycmF5KDAsIHBvc2l0aW9uc0xlbmd0aCk7CiAgICBjb25zdCB2QnVmZmVyID0gZW5jb2RlZFBvc2l0aW9ucy5zdWJhcnJheSgKICAgICAgcG9zaXRpb25zTGVuZ3RoLAogICAgICAyICogcG9zaXRpb25zTGVuZ3RoCiAgICApOwogICAgY29uc3QgaGVpZ2h0QnVmZmVyID0gZW5jb2RlZFBvc2l0aW9ucy5zdWJhcnJheSgKICAgICAgMiAqIHBvc2l0aW9uc0xlbmd0aCwKICAgICAgMyAqIHBvc2l0aW9uc0xlbmd0aAogICAgKTsKICAgIEF0dHJpYnV0ZUNvbXByZXNzaW9uX2RlZmF1bHQuemlnWmFnRGVsdGFEZWNvZGUodUJ1ZmZlciwgdkJ1ZmZlciwgaGVpZ2h0QnVmZmVyKTsKICAgIHJlbW92ZUR1cGxpY2F0ZXModUJ1ZmZlciwgdkJ1ZmZlciwgaGVpZ2h0QnVmZmVyLCBjb3VudHMpOwogICAgY29uc3QgY291bnRzTGVuZ3RoID0gY291bnRzLmxlbmd0aDsKICAgIGxldCB2b2x1bWVzQ291bnQgPSAwOwogICAgZm9yIChpID0gMDsgaSA8IGNvdW50c0xlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IHBvbHlsaW5lUG9zaXRpb25Db3VudCA9IGNvdW50c1tpXTsKICAgICAgdm9sdW1lc0NvdW50ICs9IHBvbHlsaW5lUG9zaXRpb25Db3VudCAtIDE7CiAgICB9CiAgICBjb25zdCBhdHRyaWJzQW5kSW5kaWNlcyA9IG5ldyBWZXJ0ZXhBdHRyaWJ1dGVzQW5kSW5kaWNlcyh2b2x1bWVzQ291bnQpOwogICAgY29uc3QgcG9zaXRpb25zID0gZGVjb2RlUG9zaXRpb25zKAogICAgICB1QnVmZmVyLAogICAgICB2QnVmZmVyLAogICAgICBoZWlnaHRCdWZmZXIsCiAgICAgIHJlY3RhbmdsZSwKICAgICAgbWluaW11bUhlaWdodCwKICAgICAgbWF4aW11bUhlaWdodCwKICAgICAgZWxsaXBzb2lkLAogICAgICBjZW50ZXIKICAgICk7CiAgICBwb3NpdGlvbnNMZW5ndGggPSB1QnVmZmVyLmxlbmd0aDsKICAgIGNvbnN0IHBvc2l0aW9uc1JUQyA9IG5ldyBGbG9hdDMyQXJyYXkocG9zaXRpb25zTGVuZ3RoICogMyk7CiAgICBmb3IgKGkgPSAwOyBpIDwgcG9zaXRpb25zTGVuZ3RoOyArK2kpIHsKICAgICAgcG9zaXRpb25zUlRDW2kgKiAzXSA9IHBvc2l0aW9uc1tpICogM10gLSBjZW50ZXIueDsKICAgICAgcG9zaXRpb25zUlRDW2kgKiAzICsgMV0gPSBwb3NpdGlvbnNbaSAqIDMgKyAxXSAtIGNlbnRlci55OwogICAgICBwb3NpdGlvbnNSVENbaSAqIDMgKyAyXSA9IHBvc2l0aW9uc1tpICogMyArIDJdIC0gY2VudGVyLno7CiAgICB9CiAgICBsZXQgY3VycmVudFBvc2l0aW9uSW5kZXggPSAwOwogICAgbGV0IGN1cnJlbnRIZWlnaHRJbmRleCA9IDA7CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnRzTGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgcG9seWxpbmVWb2x1bWVDb3VudCA9IGNvdW50c1tpXSAtIDE7CiAgICAgIGNvbnN0IGhhbGZXaWR0aCA9IHdpZHRoc1tpXSAqIDAuNTsKICAgICAgY29uc3QgYmF0Y2hJZCA9IGJhdGNoSWRzW2ldOwogICAgICBjb25zdCB2b2x1bWVGaXJzdFBvc2l0aW9uSW5kZXggPSBjdXJyZW50UG9zaXRpb25JbmRleDsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBwb2x5bGluZVZvbHVtZUNvdW50OyBqKyspIHsKICAgICAgICBjb25zdCB2b2x1bWVTdGFydCA9IENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2soCiAgICAgICAgICBwb3NpdGlvbnNSVEMsCiAgICAgICAgICBjdXJyZW50UG9zaXRpb25JbmRleCwKICAgICAgICAgIHNjcmF0Y2hQMAogICAgICAgICk7CiAgICAgICAgY29uc3Qgdm9sdW1lRW5kID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjaygKICAgICAgICAgIHBvc2l0aW9uc1JUQywKICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbkluZGV4ICsgMywKICAgICAgICAgIHNjcmF0Y2hQMQogICAgICAgICk7CiAgICAgICAgbGV0IHN0YXJ0SGVpZ2h0ID0gaGVpZ2h0QnVmZmVyW2N1cnJlbnRIZWlnaHRJbmRleF07CiAgICAgICAgbGV0IGVuZEhlaWdodCA9IGhlaWdodEJ1ZmZlcltjdXJyZW50SGVpZ2h0SW5kZXggKyAxXTsKICAgICAgICBzdGFydEhlaWdodCA9IE1hdGhfZGVmYXVsdC5sZXJwKAogICAgICAgICAgbWluaW11bUhlaWdodCwKICAgICAgICAgIG1heGltdW1IZWlnaHQsCiAgICAgICAgICBzdGFydEhlaWdodCAvIE1BWF9TSE9SVAogICAgICAgICk7CiAgICAgICAgZW5kSGVpZ2h0ID0gTWF0aF9kZWZhdWx0LmxlcnAoCiAgICAgICAgICBtaW5pbXVtSGVpZ2h0LAogICAgICAgICAgbWF4aW11bUhlaWdodCwKICAgICAgICAgIGVuZEhlaWdodCAvIE1BWF9TSE9SVAogICAgICAgICk7CiAgICAgICAgY3VycmVudEhlaWdodEluZGV4Kys7CiAgICAgICAgbGV0IHByZVN0YXJ0ID0gc2NyYXRjaFByZXY7CiAgICAgICAgbGV0IHBvc3RFbmQgPSBzY3JhdGNoTmV4dDsKICAgICAgICBpZiAoaiA9PT0gMCkgewogICAgICAgICAgY29uc3QgZmluYWxQb3NpdGlvbkluZGV4ID0gdm9sdW1lRmlyc3RQb3NpdGlvbkluZGV4ICsgcG9seWxpbmVWb2x1bWVDb3VudCAqIDM7CiAgICAgICAgICBjb25zdCBmaW5hbFBvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjaygKICAgICAgICAgICAgcG9zaXRpb25zUlRDLAogICAgICAgICAgICBmaW5hbFBvc2l0aW9uSW5kZXgsCiAgICAgICAgICAgIHNjcmF0Y2hQcmV2CiAgICAgICAgICApOwogICAgICAgICAgaWYgKENhcnRlc2lhbjNfZGVmYXVsdC5lcXVhbHMoZmluYWxQb3NpdGlvbiwgdm9sdW1lU3RhcnQpKSB7CiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2socG9zaXRpb25zUlRDLCBmaW5hbFBvc2l0aW9uSW5kZXggLSAzLCBwcmVTdGFydCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBvZmZzZXRQYXN0U3RhcnQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoCiAgICAgICAgICAgICAgdm9sdW1lU3RhcnQsCiAgICAgICAgICAgICAgdm9sdW1lRW5kLAogICAgICAgICAgICAgIHNjcmF0Y2hQcmV2CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHByZVN0YXJ0ID0gQ2FydGVzaWFuM19kZWZhdWx0LmFkZChvZmZzZXRQYXN0U3RhcnQsIHZvbHVtZVN0YXJ0LCBzY3JhdGNoUHJldik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2socG9zaXRpb25zUlRDLCBjdXJyZW50UG9zaXRpb25JbmRleCAtIDMsIHByZVN0YXJ0KTsKICAgICAgICB9CiAgICAgICAgaWYgKGogPT09IHBvbHlsaW5lVm9sdW1lQ291bnQgLSAxKSB7CiAgICAgICAgICBjb25zdCBmaXJzdFBvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjaygKICAgICAgICAgICAgcG9zaXRpb25zUlRDLAogICAgICAgICAgICB2b2x1bWVGaXJzdFBvc2l0aW9uSW5kZXgsCiAgICAgICAgICAgIHNjcmF0Y2hOZXh0CiAgICAgICAgICApOwogICAgICAgICAgaWYgKENhcnRlc2lhbjNfZGVmYXVsdC5lcXVhbHMoZmlyc3RQb3NpdGlvbiwgdm9sdW1lRW5kKSkgewogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKAogICAgICAgICAgICAgIHBvc2l0aW9uc1JUQywKICAgICAgICAgICAgICB2b2x1bWVGaXJzdFBvc2l0aW9uSW5kZXggKyAzLAogICAgICAgICAgICAgIHBvc3RFbmQKICAgICAgICAgICAgKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IG9mZnNldFBhc3RFbmQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoCiAgICAgICAgICAgICAgdm9sdW1lRW5kLAogICAgICAgICAgICAgIHZvbHVtZVN0YXJ0LAogICAgICAgICAgICAgIHNjcmF0Y2hOZXh0CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHBvc3RFbmQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKG9mZnNldFBhc3RFbmQsIHZvbHVtZUVuZCwgc2NyYXRjaE5leHQpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKHBvc2l0aW9uc1JUQywgY3VycmVudFBvc2l0aW9uSW5kZXggKyA2LCBwb3N0RW5kKTsKICAgICAgICB9CiAgICAgICAgYXR0cmlic0FuZEluZGljZXMuYWRkVm9sdW1lKAogICAgICAgICAgcHJlU3RhcnQsCiAgICAgICAgICB2b2x1bWVTdGFydCwKICAgICAgICAgIHZvbHVtZUVuZCwKICAgICAgICAgIHBvc3RFbmQsCiAgICAgICAgICBzdGFydEhlaWdodCwKICAgICAgICAgIGVuZEhlaWdodCwKICAgICAgICAgIGhhbGZXaWR0aCwKICAgICAgICAgIGJhdGNoSWQsCiAgICAgICAgICBjZW50ZXIsCiAgICAgICAgICBlbGxpcHNvaWQKICAgICAgICApOwogICAgICAgIGN1cnJlbnRQb3NpdGlvbkluZGV4ICs9IDM7CiAgICAgIH0KICAgICAgY3VycmVudFBvc2l0aW9uSW5kZXggKz0gMzsKICAgICAgY3VycmVudEhlaWdodEluZGV4Kys7CiAgICB9CiAgICBjb25zdCBpbmRpY2VzID0gYXR0cmlic0FuZEluZGljZXMuaW5kaWNlczsKICAgIHRyYW5zZmVyYWJsZU9iamVjdHMucHVzaChhdHRyaWJzQW5kSW5kaWNlcy5zdGFydEVsbGlwc29pZE5vcm1hbHMuYnVmZmVyKTsKICAgIHRyYW5zZmVyYWJsZU9iamVjdHMucHVzaChhdHRyaWJzQW5kSW5kaWNlcy5lbmRFbGxpcHNvaWROb3JtYWxzLmJ1ZmZlcik7CiAgICB0cmFuc2ZlcmFibGVPYmplY3RzLnB1c2goYXR0cmlic0FuZEluZGljZXMuc3RhcnRQb3NpdGlvbkFuZEhlaWdodHMuYnVmZmVyKTsKICAgIHRyYW5zZmVyYWJsZU9iamVjdHMucHVzaCgKICAgICAgYXR0cmlic0FuZEluZGljZXMuc3RhcnRGYWNlTm9ybWFsQW5kVmVydGV4Q29ybmVySWRzLmJ1ZmZlcgogICAgKTsKICAgIHRyYW5zZmVyYWJsZU9iamVjdHMucHVzaChhdHRyaWJzQW5kSW5kaWNlcy5lbmRQb3NpdGlvbkFuZEhlaWdodHMuYnVmZmVyKTsKICAgIHRyYW5zZmVyYWJsZU9iamVjdHMucHVzaChhdHRyaWJzQW5kSW5kaWNlcy5lbmRGYWNlTm9ybWFsQW5kSGFsZldpZHRocy5idWZmZXIpOwogICAgdHJhbnNmZXJhYmxlT2JqZWN0cy5wdXNoKGF0dHJpYnNBbmRJbmRpY2VzLnZlcnRleEJhdGNoSWRzLmJ1ZmZlcik7CiAgICB0cmFuc2ZlcmFibGVPYmplY3RzLnB1c2goaW5kaWNlcy5idWZmZXIpOwogICAgbGV0IHJlc3VsdHMgPSB7CiAgICAgIGluZGV4RGF0YXR5cGU6IGluZGljZXMuQllURVNfUEVSX0VMRU1FTlQgPT09IDIgPyBJbmRleERhdGF0eXBlX2RlZmF1bHQuVU5TSUdORURfU0hPUlQgOiBJbmRleERhdGF0eXBlX2RlZmF1bHQuVU5TSUdORURfSU5ULAogICAgICBzdGFydEVsbGlwc29pZE5vcm1hbHM6IGF0dHJpYnNBbmRJbmRpY2VzLnN0YXJ0RWxsaXBzb2lkTm9ybWFscy5idWZmZXIsCiAgICAgIGVuZEVsbGlwc29pZE5vcm1hbHM6IGF0dHJpYnNBbmRJbmRpY2VzLmVuZEVsbGlwc29pZE5vcm1hbHMuYnVmZmVyLAogICAgICBzdGFydFBvc2l0aW9uQW5kSGVpZ2h0czogYXR0cmlic0FuZEluZGljZXMuc3RhcnRQb3NpdGlvbkFuZEhlaWdodHMuYnVmZmVyLAogICAgICBzdGFydEZhY2VOb3JtYWxBbmRWZXJ0ZXhDb3JuZXJJZHM6IGF0dHJpYnNBbmRJbmRpY2VzLnN0YXJ0RmFjZU5vcm1hbEFuZFZlcnRleENvcm5lcklkcy5idWZmZXIsCiAgICAgIGVuZFBvc2l0aW9uQW5kSGVpZ2h0czogYXR0cmlic0FuZEluZGljZXMuZW5kUG9zaXRpb25BbmRIZWlnaHRzLmJ1ZmZlciwKICAgICAgZW5kRmFjZU5vcm1hbEFuZEhhbGZXaWR0aHM6IGF0dHJpYnNBbmRJbmRpY2VzLmVuZEZhY2VOb3JtYWxBbmRIYWxmV2lkdGhzLmJ1ZmZlciwKICAgICAgdmVydGV4QmF0Y2hJZHM6IGF0dHJpYnNBbmRJbmRpY2VzLnZlcnRleEJhdGNoSWRzLmJ1ZmZlciwKICAgICAgaW5kaWNlczogaW5kaWNlcy5idWZmZXIKICAgIH07CiAgICBpZiAocGFyYW1ldGVycy5rZWVwRGVjb2RlZFBvc2l0aW9ucykgewogICAgICBjb25zdCBwb3NpdGlvbk9mZnNldHMgPSBnZXRQb3NpdGlvbk9mZnNldHMoY291bnRzKTsKICAgICAgdHJhbnNmZXJhYmxlT2JqZWN0cy5wdXNoKHBvc2l0aW9ucy5idWZmZXIsIHBvc2l0aW9uT2Zmc2V0cy5idWZmZXIpOwogICAgICByZXN1bHRzID0gY29tYmluZV9kZWZhdWx0KHJlc3VsdHMsIHsKICAgICAgICBkZWNvZGVkUG9zaXRpb25zOiBwb3NpdGlvbnMuYnVmZmVyLAogICAgICAgIGRlY29kZWRQb3NpdGlvbk9mZnNldHM6IHBvc2l0aW9uT2Zmc2V0cy5idWZmZXIKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9CiAgdmFyIE1BWF9TSE9SVCwgTUlURVJfQlJFQUssIHNjcmF0Y2hCVkNhcnRvZ3JhcGhpYywgc2NyYXRjaEVuY29kZWRQb3NpdGlvbiwgcHJldmlvdXNDb21wcmVzc2VkQ2FydG9ncmFwaGljU2NyYXRjaCwgY3VycmVudENvbXByZXNzZWRDYXJ0b2dyYXBoaWNTY3JhdGNoLCB0b3dhcmRDdXJyU2NyYXRjaCwgdG93YXJkTmV4dFNjcmF0Y2gsIFJFRkVSRU5DRV9JTkRJQ0VTMiwgUkVGRVJFTkNFX0lORElDRVNfTEVOR1RIMiwgcG9zaXRpb25TY3JhdGNoNCwgc2NyYXRjaFN0YXJ0RWxsaXBzb2lkTm9ybWFsLCBzY3JhdGNoU3RhcnRGYWNlTm9ybWFsLCBzY3JhdGNoRW5kRWxsaXBzb2lkTm9ybWFsLCBzY3JhdGNoRW5kRmFjZU5vcm1hbCwgc2NyYXRjaFJlY3RhbmdsZTMsIHNjcmF0Y2hFbGxpcHNvaWQxMywgc2NyYXRjaENlbnRlcjQsIHNjcmF0Y2hQcmV2LCBzY3JhdGNoUDAsIHNjcmF0Y2hQMSwgc2NyYXRjaE5leHQsIGNyZWF0ZVZlY3RvclRpbGVDbGFtcGVkUG9seWxpbmVzX2RlZmF1bHQ7CiAgdmFyIGluaXRfY3JlYXRlVmVjdG9yVGlsZUNsYW1wZWRQb2x5bGluZXMgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVZlY3RvclRpbGVDbGFtcGVkUG9seWxpbmVzLmpzIigpIHsKICAgICAgaW5pdF9BdHRyaWJ1dGVDb21wcmVzc2lvbigpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DYXJ0b2dyYXBoaWMoKTsKICAgICAgaW5pdF9jb21iaW5lKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfSW5kZXhEYXRhdHlwZSgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9SZWN0YW5nbGUoKTsKICAgICAgaW5pdF9jcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyKCk7CiAgICAgIE1BWF9TSE9SVCA9IDMyNzY3OwogICAgICBNSVRFUl9CUkVBSyA9IE1hdGguY29zKE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoMTUwKSk7CiAgICAgIHNjcmF0Y2hCVkNhcnRvZ3JhcGhpYyA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoRW5jb2RlZFBvc2l0aW9uID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBwcmV2aW91c0NvbXByZXNzZWRDYXJ0b2dyYXBoaWNTY3JhdGNoID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIGN1cnJlbnRDb21wcmVzc2VkQ2FydG9ncmFwaGljU2NyYXRjaCA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICB0b3dhcmRDdXJyU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgdG93YXJkTmV4dFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIFJFRkVSRU5DRV9JTkRJQ0VTMiA9IFsKICAgICAgICAwLAogICAgICAgIDIsCiAgICAgICAgNiwKICAgICAgICAwLAogICAgICAgIDYsCiAgICAgICAgNCwKICAgICAgICAvLyByaWdodAogICAgICAgIDAsCiAgICAgICAgMSwKICAgICAgICAzLAogICAgICAgIDAsCiAgICAgICAgMywKICAgICAgICAyLAogICAgICAgIC8vIHN0YXJ0IGZhY2UKICAgICAgICAwLAogICAgICAgIDQsCiAgICAgICAgNSwKICAgICAgICAwLAogICAgICAgIDUsCiAgICAgICAgMSwKICAgICAgICAvLyBib3R0b20KICAgICAgICA1LAogICAgICAgIDMsCiAgICAgICAgMSwKICAgICAgICA1LAogICAgICAgIDcsCiAgICAgICAgMywKICAgICAgICAvLyBsZWZ0CiAgICAgICAgNywKICAgICAgICA1LAogICAgICAgIDQsCiAgICAgICAgNywKICAgICAgICA0LAogICAgICAgIDYsCiAgICAgICAgLy8gZW5kIGZhY2UKICAgICAgICA3LAogICAgICAgIDYsCiAgICAgICAgMiwKICAgICAgICA3LAogICAgICAgIDIsCiAgICAgICAgMwogICAgICAgIC8vIHRvcAogICAgICBdOwogICAgICBSRUZFUkVOQ0VfSU5ESUNFU19MRU5HVEgyID0gUkVGRVJFTkNFX0lORElDRVMyLmxlbmd0aDsKICAgICAgcG9zaXRpb25TY3JhdGNoNCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFN0YXJ0RWxsaXBzb2lkTm9ybWFsID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoU3RhcnRGYWNlTm9ybWFsID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoRW5kRWxsaXBzb2lkTm9ybWFsID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoRW5kRmFjZU5vcm1hbCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgVmVydGV4QXR0cmlidXRlc0FuZEluZGljZXMucHJvdG90eXBlLmFkZFZvbHVtZSA9IGZ1bmN0aW9uKHByZVN0YXJ0UlRDLCBzdGFydFJUQywgZW5kUlRDLCBwb3N0RW5kUlRDLCBzdGFydEhlaWdodCwgZW5kSGVpZ2h0LCBoYWxmV2lkdGgsIGJhdGNoSWQsIGNlbnRlciwgZWxsaXBzb2lkKSB7CiAgICAgICAgbGV0IHBvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LmFkZChzdGFydFJUQywgY2VudGVyLCBwb3NpdGlvblNjcmF0Y2g0KTsKICAgICAgICBjb25zdCBzdGFydEVsbGlwc29pZE5vcm1hbCA9IGVsbGlwc29pZC5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoCiAgICAgICAgICBwb3NpdGlvbiwKICAgICAgICAgIHNjcmF0Y2hTdGFydEVsbGlwc29pZE5vcm1hbAogICAgICAgICk7CiAgICAgICAgcG9zaXRpb24gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKGVuZFJUQywgY2VudGVyLCBwb3NpdGlvblNjcmF0Y2g0KTsKICAgICAgICBjb25zdCBlbmRFbGxpcHNvaWROb3JtYWwgPSBlbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKAogICAgICAgICAgcG9zaXRpb24sCiAgICAgICAgICBzY3JhdGNoRW5kRWxsaXBzb2lkTm9ybWFsCiAgICAgICAgKTsKICAgICAgICBjb25zdCBzdGFydEZhY2VOb3JtYWwgPSBjb21wdXRlTWl0ZXJlZE5vcm1hbCgKICAgICAgICAgIHByZVN0YXJ0UlRDLAogICAgICAgICAgc3RhcnRSVEMsCiAgICAgICAgICBlbmRSVEMsCiAgICAgICAgICBzdGFydEVsbGlwc29pZE5vcm1hbCwKICAgICAgICAgIHNjcmF0Y2hTdGFydEZhY2VOb3JtYWwKICAgICAgICApOwogICAgICAgIGNvbnN0IGVuZEZhY2VOb3JtYWwgPSBjb21wdXRlTWl0ZXJlZE5vcm1hbCgKICAgICAgICAgIHBvc3RFbmRSVEMsCiAgICAgICAgICBlbmRSVEMsCiAgICAgICAgICBzdGFydFJUQywKICAgICAgICAgIGVuZEVsbGlwc29pZE5vcm1hbCwKICAgICAgICAgIHNjcmF0Y2hFbmRGYWNlTm9ybWFsCiAgICAgICAgKTsKICAgICAgICBjb25zdCBzdGFydEVsbGlwc29pZE5vcm1hbHMgPSB0aGlzLnN0YXJ0RWxsaXBzb2lkTm9ybWFsczsKICAgICAgICBjb25zdCBlbmRFbGxpcHNvaWROb3JtYWxzID0gdGhpcy5lbmRFbGxpcHNvaWROb3JtYWxzOwogICAgICAgIGNvbnN0IHN0YXJ0UG9zaXRpb25BbmRIZWlnaHRzID0gdGhpcy5zdGFydFBvc2l0aW9uQW5kSGVpZ2h0czsKICAgICAgICBjb25zdCBzdGFydEZhY2VOb3JtYWxBbmRWZXJ0ZXhDb3JuZXJJZHMgPSB0aGlzLnN0YXJ0RmFjZU5vcm1hbEFuZFZlcnRleENvcm5lcklkczsKICAgICAgICBjb25zdCBlbmRQb3NpdGlvbkFuZEhlaWdodHMgPSB0aGlzLmVuZFBvc2l0aW9uQW5kSGVpZ2h0czsKICAgICAgICBjb25zdCBlbmRGYWNlTm9ybWFsQW5kSGFsZldpZHRocyA9IHRoaXMuZW5kRmFjZU5vcm1hbEFuZEhhbGZXaWR0aHM7CiAgICAgICAgY29uc3QgdmVydGV4QmF0Y2hJZHMgPSB0aGlzLnZlcnRleEJhdGNoSWRzOwogICAgICAgIGxldCBiYXRjaElkT2Zmc2V0ID0gdGhpcy5iYXRjaElkT2Zmc2V0OwogICAgICAgIGxldCB2ZWMzT2Zmc2V0ID0gdGhpcy52ZWMzT2Zmc2V0OwogICAgICAgIGxldCB2ZWM0T2Zmc2V0ID0gdGhpcy52ZWM0T2Zmc2V0OwogICAgICAgIGxldCBpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKHN0YXJ0RWxsaXBzb2lkTm9ybWFsLCBzdGFydEVsbGlwc29pZE5vcm1hbHMsIHZlYzNPZmZzZXQpOwogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2soZW5kRWxsaXBzb2lkTm9ybWFsLCBlbmRFbGxpcHNvaWROb3JtYWxzLCB2ZWMzT2Zmc2V0KTsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKHN0YXJ0UlRDLCBzdGFydFBvc2l0aW9uQW5kSGVpZ2h0cywgdmVjNE9mZnNldCk7CiAgICAgICAgICBzdGFydFBvc2l0aW9uQW5kSGVpZ2h0c1t2ZWM0T2Zmc2V0ICsgM10gPSBzdGFydEhlaWdodDsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKGVuZFJUQywgZW5kUG9zaXRpb25BbmRIZWlnaHRzLCB2ZWM0T2Zmc2V0KTsKICAgICAgICAgIGVuZFBvc2l0aW9uQW5kSGVpZ2h0c1t2ZWM0T2Zmc2V0ICsgM10gPSBlbmRIZWlnaHQ7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjaygKICAgICAgICAgICAgc3RhcnRGYWNlTm9ybWFsLAogICAgICAgICAgICBzdGFydEZhY2VOb3JtYWxBbmRWZXJ0ZXhDb3JuZXJJZHMsCiAgICAgICAgICAgIHZlYzRPZmZzZXQKICAgICAgICAgICk7CiAgICAgICAgICBzdGFydEZhY2VOb3JtYWxBbmRWZXJ0ZXhDb3JuZXJJZHNbdmVjNE9mZnNldCArIDNdID0gaTsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKGVuZEZhY2VOb3JtYWwsIGVuZEZhY2VOb3JtYWxBbmRIYWxmV2lkdGhzLCB2ZWM0T2Zmc2V0KTsKICAgICAgICAgIGVuZEZhY2VOb3JtYWxBbmRIYWxmV2lkdGhzW3ZlYzRPZmZzZXQgKyAzXSA9IGhhbGZXaWR0aDsKICAgICAgICAgIHZlcnRleEJhdGNoSWRzW2JhdGNoSWRPZmZzZXQrK10gPSBiYXRjaElkOwogICAgICAgICAgdmVjM09mZnNldCArPSAzOwogICAgICAgICAgdmVjNE9mZnNldCArPSA0OwogICAgICAgIH0KICAgICAgICB0aGlzLmJhdGNoSWRPZmZzZXQgPSBiYXRjaElkT2Zmc2V0OwogICAgICAgIHRoaXMudmVjM09mZnNldCA9IHZlYzNPZmZzZXQ7CiAgICAgICAgdGhpcy52ZWM0T2Zmc2V0ID0gdmVjNE9mZnNldDsKICAgICAgICBjb25zdCBpbmRpY2VzID0gdGhpcy5pbmRpY2VzOwogICAgICAgIGNvbnN0IHZvbHVtZVN0YXJ0SW5kZXggPSB0aGlzLnZvbHVtZVN0YXJ0SW5kZXg7CiAgICAgICAgY29uc3QgaW5kZXhPZmZzZXQgPSB0aGlzLmluZGV4T2Zmc2V0OwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBSRUZFUkVOQ0VfSU5ESUNFU19MRU5HVEgyOyBpKyspIHsKICAgICAgICAgIGluZGljZXNbaW5kZXhPZmZzZXQgKyBpXSA9IFJFRkVSRU5DRV9JTkRJQ0VTMltpXSArIHZvbHVtZVN0YXJ0SW5kZXg7CiAgICAgICAgfQogICAgICAgIHRoaXMudm9sdW1lU3RhcnRJbmRleCArPSA4OwogICAgICAgIHRoaXMuaW5kZXhPZmZzZXQgKz0gUkVGRVJFTkNFX0lORElDRVNfTEVOR1RIMjsKICAgICAgfTsKICAgICAgc2NyYXRjaFJlY3RhbmdsZTMgPSBuZXcgUmVjdGFuZ2xlX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaEVsbGlwc29pZDEzID0gbmV3IEVsbGlwc29pZF9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDZW50ZXI0ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoUHJldiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFAwID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoUDEgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hOZXh0ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjcmVhdGVWZWN0b3JUaWxlQ2xhbXBlZFBvbHlsaW5lc19kZWZhdWx0ID0gY3JlYXRlVGFza1Byb2Nlc3Nvcldvcmtlcl9kZWZhdWx0KGNyZWF0ZVZlY3RvclRpbGVDbGFtcGVkUG9seWxpbmVzKTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9TY2VuZS9WZWN0b3IzRFRpbGVCYXRjaC5qcwogIGZ1bmN0aW9uIFZlY3RvcjNEVGlsZUJhdGNoKG9wdGlvbnMpIHsKICAgIHRoaXMub2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQ7CiAgICB0aGlzLmNvdW50ID0gb3B0aW9ucy5jb3VudDsKICAgIHRoaXMuY29sb3IgPSBvcHRpb25zLmNvbG9yOwogICAgdGhpcy5iYXRjaElkcyA9IG9wdGlvbnMuYmF0Y2hJZHM7CiAgfQogIHZhciBWZWN0b3IzRFRpbGVCYXRjaF9kZWZhdWx0OwogIHZhciBpbml0X1ZlY3RvcjNEVGlsZUJhdGNoID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvU2NlbmUvVmVjdG9yM0RUaWxlQmF0Y2guanMiKCkgewogICAgICBWZWN0b3IzRFRpbGVCYXRjaF9kZWZhdWx0ID0gVmVjdG9yM0RUaWxlQmF0Y2g7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVWZWN0b3JUaWxlR2VvbWV0cmllcy5qcwogIHZhciBjcmVhdGVWZWN0b3JUaWxlR2VvbWV0cmllc19leHBvcnRzID0ge307CiAgX19leHBvcnQoY3JlYXRlVmVjdG9yVGlsZUdlb21ldHJpZXNfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gY3JlYXRlVmVjdG9yVGlsZUdlb21ldHJpZXNfZGVmYXVsdAogIH0pOwogIGZ1bmN0aW9uIGJveE1vZGVsTWF0cml4QW5kQm91bmRpbmdWb2x1bWUoYm94ZXMsIGluZGV4KSB7CiAgICBsZXQgYm94SW5kZXggPSBpbmRleCAqIHBhY2tlZEJveExlbmd0aDsKICAgIGNvbnN0IGRpbWVuc2lvbnMgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKGJveGVzLCBib3hJbmRleCwgc2NyYXRjaENhcnRlc2lhbjExKTsKICAgIGJveEluZGV4ICs9IENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICBjb25zdCBib3hNb2RlbE1hdHJpeCA9IE1hdHJpeDRfZGVmYXVsdC51bnBhY2soCiAgICAgIGJveGVzLAogICAgICBib3hJbmRleCwKICAgICAgc2NyYXRjaE1vZGVsTWF0cml4QW5kQlYubW9kZWxNYXRyaXgKICAgICk7CiAgICBNYXRyaXg0X2RlZmF1bHQubXVsdGlwbHlCeVNjYWxlKGJveE1vZGVsTWF0cml4LCBkaW1lbnNpb25zLCBib3hNb2RlbE1hdHJpeCk7CiAgICBjb25zdCBib3VuZGluZ1ZvbHVtZSA9IHNjcmF0Y2hNb2RlbE1hdHJpeEFuZEJWLmJvdW5kaW5nVm9sdW1lOwogICAgQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPLCBib3VuZGluZ1ZvbHVtZS5jZW50ZXIpOwogICAgYm91bmRpbmdWb2x1bWUucmFkaXVzID0gTWF0aC5zcXJ0KDMpOwogICAgcmV0dXJuIHNjcmF0Y2hNb2RlbE1hdHJpeEFuZEJWOwogIH0KICBmdW5jdGlvbiBjeWxpbmRlck1vZGVsTWF0cml4QW5kQm91bmRpbmdWb2x1bWUoY3lsaW5kZXJzLCBpbmRleCkgewogICAgbGV0IGN5bGluZGVySW5kZXggPSBpbmRleCAqIHBhY2tlZEN5bGluZGVyTGVuZ3RoOwogICAgY29uc3QgY3lsaW5kZXJSYWRpdXMgPSBjeWxpbmRlcnNbY3lsaW5kZXJJbmRleCsrXTsKICAgIGNvbnN0IGxlbmd0aCA9IGN5bGluZGVyc1tjeWxpbmRlckluZGV4KytdOwogICAgY29uc3Qgc2NhbGUgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUVsZW1lbnRzKAogICAgICBjeWxpbmRlclJhZGl1cywKICAgICAgY3lsaW5kZXJSYWRpdXMsCiAgICAgIGxlbmd0aCwKICAgICAgc2NyYXRjaENhcnRlc2lhbjExCiAgICApOwogICAgY29uc3QgY3lsaW5kZXJNb2RlbE1hdHJpeCA9IE1hdHJpeDRfZGVmYXVsdC51bnBhY2soCiAgICAgIGN5bGluZGVycywKICAgICAgY3lsaW5kZXJJbmRleCwKICAgICAgc2NyYXRjaE1vZGVsTWF0cml4QW5kQlYubW9kZWxNYXRyaXgKICAgICk7CiAgICBNYXRyaXg0X2RlZmF1bHQubXVsdGlwbHlCeVNjYWxlKGN5bGluZGVyTW9kZWxNYXRyaXgsIHNjYWxlLCBjeWxpbmRlck1vZGVsTWF0cml4KTsKICAgIGNvbnN0IGJvdW5kaW5nVm9sdW1lID0gc2NyYXRjaE1vZGVsTWF0cml4QW5kQlYuYm91bmRpbmdWb2x1bWU7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8sIGJvdW5kaW5nVm9sdW1lLmNlbnRlcik7CiAgICBib3VuZGluZ1ZvbHVtZS5yYWRpdXMgPSBNYXRoLnNxcnQoMik7CiAgICByZXR1cm4gc2NyYXRjaE1vZGVsTWF0cml4QW5kQlY7CiAgfQogIGZ1bmN0aW9uIGVsbGlwc29pZE1vZGVsTWF0cml4QW5kQm91bmRpbmdWb2x1bWUoZWxsaXBzb2lkcywgaW5kZXgpIHsKICAgIGxldCBlbGxpcHNvaWRJbmRleCA9IGluZGV4ICogcGFja2VkRWxsaXBzb2lkTGVuZ3RoOwogICAgY29uc3QgcmFkaWkgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKGVsbGlwc29pZHMsIGVsbGlwc29pZEluZGV4LCBzY3JhdGNoQ2FydGVzaWFuMTEpOwogICAgZWxsaXBzb2lkSW5kZXggKz0gQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgIGNvbnN0IGVsbGlwc29pZE1vZGVsTWF0cml4ID0gTWF0cml4NF9kZWZhdWx0LnVucGFjaygKICAgICAgZWxsaXBzb2lkcywKICAgICAgZWxsaXBzb2lkSW5kZXgsCiAgICAgIHNjcmF0Y2hNb2RlbE1hdHJpeEFuZEJWLm1vZGVsTWF0cml4CiAgICApOwogICAgTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5QnlTY2FsZShlbGxpcHNvaWRNb2RlbE1hdHJpeCwgcmFkaWksIGVsbGlwc29pZE1vZGVsTWF0cml4KTsKICAgIGNvbnN0IGJvdW5kaW5nVm9sdW1lID0gc2NyYXRjaE1vZGVsTWF0cml4QW5kQlYuYm91bmRpbmdWb2x1bWU7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8sIGJvdW5kaW5nVm9sdW1lLmNlbnRlcik7CiAgICBib3VuZGluZ1ZvbHVtZS5yYWRpdXMgPSAxOwogICAgcmV0dXJuIHNjcmF0Y2hNb2RlbE1hdHJpeEFuZEJWOwogIH0KICBmdW5jdGlvbiBzcGhlcmVNb2RlbE1hdHJpeEFuZEJvdW5kaW5nVm9sdW1lKHNwaGVyZXMsIGluZGV4KSB7CiAgICBsZXQgc3BoZXJlSW5kZXggPSBpbmRleCAqIHBhY2tlZFNwaGVyZUxlbmd0aDsKICAgIGNvbnN0IHNwaGVyZVJhZGl1cyA9IHNwaGVyZXNbc3BoZXJlSW5kZXgrK107CiAgICBjb25zdCBzcGhlcmVUcmFuc2xhdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2soCiAgICAgIHNwaGVyZXMsCiAgICAgIHNwaGVyZUluZGV4LAogICAgICBzY3JhdGNoQ2FydGVzaWFuMTEKICAgICk7CiAgICBjb25zdCBzcGhlcmVNb2RlbE1hdHJpeCA9IE1hdHJpeDRfZGVmYXVsdC5mcm9tVHJhbnNsYXRpb24oCiAgICAgIHNwaGVyZVRyYW5zbGF0aW9uLAogICAgICBzY3JhdGNoTW9kZWxNYXRyaXhBbmRCVi5tb2RlbE1hdHJpeAogICAgKTsKICAgIE1hdHJpeDRfZGVmYXVsdC5tdWx0aXBseUJ5VW5pZm9ybVNjYWxlKAogICAgICBzcGhlcmVNb2RlbE1hdHJpeCwKICAgICAgc3BoZXJlUmFkaXVzLAogICAgICBzcGhlcmVNb2RlbE1hdHJpeAogICAgKTsKICAgIGNvbnN0IGJvdW5kaW5nVm9sdW1lID0gc2NyYXRjaE1vZGVsTWF0cml4QW5kQlYuYm91bmRpbmdWb2x1bWU7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8sIGJvdW5kaW5nVm9sdW1lLmNlbnRlcik7CiAgICBib3VuZGluZ1ZvbHVtZS5yYWRpdXMgPSAxOwogICAgcmV0dXJuIHNjcmF0Y2hNb2RlbE1hdHJpeEFuZEJWOwogIH0KICBmdW5jdGlvbiBjcmVhdGVQcmltaXRpdmUob3B0aW9ucywgcHJpbWl0aXZlLCBwcmltaXRpdmVCYXRjaElkcywgZ2VvbWV0cnksIGdldE1vZGVsTWF0cml4QW5kQm91bmRpbmdWb2x1bWUpIHsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHByaW1pdGl2ZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbnVtYmVyT2ZQcmltaXRpdmVzID0gcHJpbWl0aXZlQmF0Y2hJZHMubGVuZ3RoOwogICAgY29uc3QgZ2VvbWV0cnlQb3NpdGlvbnMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlczsKICAgIGNvbnN0IGdlb21ldHJ5SW5kaWNlcyA9IGdlb21ldHJ5LmluZGljZXM7CiAgICBjb25zdCBwb3NpdGlvbnMgPSBvcHRpb25zLnBvc2l0aW9uczsKICAgIGNvbnN0IHZlcnRleEJhdGNoSWRzID0gb3B0aW9ucy52ZXJ0ZXhCYXRjaElkczsKICAgIGNvbnN0IGluZGljZXMgPSBvcHRpb25zLmluZGljZXM7CiAgICBjb25zdCBiYXRjaElkcyA9IG9wdGlvbnMuYmF0Y2hJZHM7CiAgICBjb25zdCBiYXRjaFRhYmxlQ29sb3JzID0gb3B0aW9ucy5iYXRjaFRhYmxlQ29sb3JzOwogICAgY29uc3QgYmF0Y2hlZEluZGljZXMgPSBvcHRpb25zLmJhdGNoZWRJbmRpY2VzOwogICAgY29uc3QgaW5kZXhPZmZzZXRzID0gb3B0aW9ucy5pbmRleE9mZnNldHM7CiAgICBjb25zdCBpbmRleENvdW50cyA9IG9wdGlvbnMuaW5kZXhDb3VudHM7CiAgICBjb25zdCBib3VuZGluZ1ZvbHVtZXMgPSBvcHRpb25zLmJvdW5kaW5nVm9sdW1lczsKICAgIGNvbnN0IG1vZGVsTWF0cml4ID0gb3B0aW9ucy5tb2RlbE1hdHJpeDsKICAgIGNvbnN0IGNlbnRlciA9IG9wdGlvbnMuY2VudGVyOwogICAgbGV0IHBvc2l0aW9uT2Zmc2V0ID0gb3B0aW9ucy5wb3NpdGlvbk9mZnNldDsKICAgIGxldCBiYXRjaElkSW5kZXggPSBvcHRpb25zLmJhdGNoSWRJbmRleDsKICAgIGxldCBpbmRleE9mZnNldCA9IG9wdGlvbnMuaW5kZXhPZmZzZXQ7CiAgICBjb25zdCBiYXRjaGVkSW5kaWNlc09mZnNldCA9IG9wdGlvbnMuYmF0Y2hlZEluZGljZXNPZmZzZXQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mUHJpbWl0aXZlczsgKytpKSB7CiAgICAgIGNvbnN0IHByaW1pdGl2ZU1vZGVsTWF0cml4QW5kQlYgPSBnZXRNb2RlbE1hdHJpeEFuZEJvdW5kaW5nVm9sdW1lKAogICAgICAgIHByaW1pdGl2ZSwKICAgICAgICBpCiAgICAgICk7CiAgICAgIGNvbnN0IHByaW1pdGl2ZU1vZGVsTWF0cml4ID0gcHJpbWl0aXZlTW9kZWxNYXRyaXhBbmRCVi5tb2RlbE1hdHJpeDsKICAgICAgTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5KG1vZGVsTWF0cml4LCBwcmltaXRpdmVNb2RlbE1hdHJpeCwgcHJpbWl0aXZlTW9kZWxNYXRyaXgpOwogICAgICBjb25zdCBiYXRjaElkID0gcHJpbWl0aXZlQmF0Y2hJZHNbaV07CiAgICAgIGNvbnN0IHBvc2l0aW9uc0xlbmd0aCA9IGdlb21ldHJ5UG9zaXRpb25zLmxlbmd0aDsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBwb3NpdGlvbnNMZW5ndGg7IGogKz0gMykgewogICAgICAgIGNvbnN0IHBvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjayhnZW9tZXRyeVBvc2l0aW9ucywgaiwgc2NyYXRjaFBvc2l0aW9uNSk7CiAgICAgICAgTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5QnlQb2ludChwcmltaXRpdmVNb2RlbE1hdHJpeCwgcG9zaXRpb24sIHBvc2l0aW9uKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QocG9zaXRpb24sIGNlbnRlciwgcG9zaXRpb24pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKHBvc2l0aW9uLCBwb3NpdGlvbnMsIHBvc2l0aW9uT2Zmc2V0ICogMyArIGopOwogICAgICAgIHZlcnRleEJhdGNoSWRzW2JhdGNoSWRJbmRleCsrXSA9IGJhdGNoSWQ7CiAgICAgIH0KICAgICAgY29uc3QgaW5kaWNlc0xlbmd0aCA9IGdlb21ldHJ5SW5kaWNlcy5sZW5ndGg7CiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaW5kaWNlc0xlbmd0aDsgKytrKSB7CiAgICAgICAgaW5kaWNlc1tpbmRleE9mZnNldCArIGtdID0gZ2VvbWV0cnlJbmRpY2VzW2tdICsgcG9zaXRpb25PZmZzZXQ7CiAgICAgIH0KICAgICAgY29uc3Qgb2Zmc2V0ID0gaSArIGJhdGNoZWRJbmRpY2VzT2Zmc2V0OwogICAgICBiYXRjaGVkSW5kaWNlc1tvZmZzZXRdID0gbmV3IFZlY3RvcjNEVGlsZUJhdGNoX2RlZmF1bHQoewogICAgICAgIG9mZnNldDogaW5kZXhPZmZzZXQsCiAgICAgICAgY291bnQ6IGluZGljZXNMZW5ndGgsCiAgICAgICAgY29sb3I6IENvbG9yX2RlZmF1bHQuZnJvbVJnYmEoYmF0Y2hUYWJsZUNvbG9yc1tiYXRjaElkXSksCiAgICAgICAgYmF0Y2hJZHM6IFtiYXRjaElkXQogICAgICB9KTsKICAgICAgYmF0Y2hJZHNbb2Zmc2V0XSA9IGJhdGNoSWQ7CiAgICAgIGluZGV4T2Zmc2V0c1tvZmZzZXRdID0gaW5kZXhPZmZzZXQ7CiAgICAgIGluZGV4Q291bnRzW29mZnNldF0gPSBpbmRpY2VzTGVuZ3RoOwogICAgICBib3VuZGluZ1ZvbHVtZXNbb2Zmc2V0XSA9IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQudHJhbnNmb3JtKAogICAgICAgIHByaW1pdGl2ZU1vZGVsTWF0cml4QW5kQlYuYm91bmRpbmdWb2x1bWUsCiAgICAgICAgcHJpbWl0aXZlTW9kZWxNYXRyaXgKICAgICAgKTsKICAgICAgcG9zaXRpb25PZmZzZXQgKz0gcG9zaXRpb25zTGVuZ3RoIC8gMzsKICAgICAgaW5kZXhPZmZzZXQgKz0gaW5kaWNlc0xlbmd0aDsKICAgIH0KICAgIG9wdGlvbnMucG9zaXRpb25PZmZzZXQgPSBwb3NpdGlvbk9mZnNldDsKICAgIG9wdGlvbnMuYmF0Y2hJZEluZGV4ID0gYmF0Y2hJZEluZGV4OwogICAgb3B0aW9ucy5pbmRleE9mZnNldCA9IGluZGV4T2Zmc2V0OwogICAgb3B0aW9ucy5iYXRjaGVkSW5kaWNlc09mZnNldCArPSBudW1iZXJPZlByaW1pdGl2ZXM7CiAgfQogIGZ1bmN0aW9uIHVucGFja0J1ZmZlcihidWZmZXIpIHsKICAgIGNvbnN0IHBhY2tlZEJ1ZmZlciA9IG5ldyBGbG9hdDY0QXJyYXkoYnVmZmVyKTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjayhwYWNrZWRCdWZmZXIsIG9mZnNldCwgc2NyYXRjaENlbnRlcjUpOwogICAgb2Zmc2V0ICs9IENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICBNYXRyaXg0X2RlZmF1bHQudW5wYWNrKHBhY2tlZEJ1ZmZlciwgb2Zmc2V0LCBzY3JhdGNoTWF0cml4NCk7CiAgfQogIGZ1bmN0aW9uIHBhY2tlZEJhdGNoZWRJbmRpY2VzTGVuZ3RoKGJhdGNoZWRJbmRpY2VzKSB7CiAgICBjb25zdCBsZW5ndGggPSBiYXRjaGVkSW5kaWNlcy5sZW5ndGg7CiAgICBsZXQgY291bnQgPSAwOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBjb3VudCArPSBDb2xvcl9kZWZhdWx0LnBhY2tlZExlbmd0aCArIDMgKyBiYXRjaGVkSW5kaWNlc1tpXS5iYXRjaElkcy5sZW5ndGg7CiAgICB9CiAgICByZXR1cm4gY291bnQ7CiAgfQogIGZ1bmN0aW9uIHBhY2tCdWZmZXIoaW5kaWNlc0J5dGVzUGVyRWxlbWVudCwgYmF0Y2hlZEluZGljZXMsIGJvdW5kaW5nVm9sdW1lcykgewogICAgY29uc3QgbnVtQlZzID0gYm91bmRpbmdWb2x1bWVzLmxlbmd0aDsKICAgIGNvbnN0IGxlbmd0aCA9IDEgKyAxICsgbnVtQlZzICogQm91bmRpbmdTcGhlcmVfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyAxICsgcGFja2VkQmF0Y2hlZEluZGljZXNMZW5ndGgoYmF0Y2hlZEluZGljZXMpOwogICAgY29uc3QgcGFja2VkQnVmZmVyID0gbmV3IEZsb2F0NjRBcnJheShsZW5ndGgpOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBwYWNrZWRCdWZmZXJbb2Zmc2V0KytdID0gaW5kaWNlc0J5dGVzUGVyRWxlbWVudDsKICAgIHBhY2tlZEJ1ZmZlcltvZmZzZXQrK10gPSBudW1CVnM7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUJWczsgKytpKSB7CiAgICAgIEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQucGFjayhib3VuZGluZ1ZvbHVtZXNbaV0sIHBhY2tlZEJ1ZmZlciwgb2Zmc2V0KTsKICAgICAgb2Zmc2V0ICs9IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgfQogICAgY29uc3QgaW5kaWNlc0xlbmd0aCA9IGJhdGNoZWRJbmRpY2VzLmxlbmd0aDsKICAgIHBhY2tlZEJ1ZmZlcltvZmZzZXQrK10gPSBpbmRpY2VzTGVuZ3RoOwogICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmRpY2VzTGVuZ3RoOyArK2opIHsKICAgICAgY29uc3QgYmF0Y2hlZEluZGV4ID0gYmF0Y2hlZEluZGljZXNbal07CiAgICAgIENvbG9yX2RlZmF1bHQucGFjayhiYXRjaGVkSW5kZXguY29sb3IsIHBhY2tlZEJ1ZmZlciwgb2Zmc2V0KTsKICAgICAgb2Zmc2V0ICs9IENvbG9yX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICBwYWNrZWRCdWZmZXJbb2Zmc2V0KytdID0gYmF0Y2hlZEluZGV4Lm9mZnNldDsKICAgICAgcGFja2VkQnVmZmVyW29mZnNldCsrXSA9IGJhdGNoZWRJbmRleC5jb3VudDsKICAgICAgY29uc3QgYmF0Y2hJZHMgPSBiYXRjaGVkSW5kZXguYmF0Y2hJZHM7CiAgICAgIGNvbnN0IGJhdGNoSWRzTGVuZ3RoID0gYmF0Y2hJZHMubGVuZ3RoOwogICAgICBwYWNrZWRCdWZmZXJbb2Zmc2V0KytdID0gYmF0Y2hJZHNMZW5ndGg7CiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgYmF0Y2hJZHNMZW5ndGg7ICsraykgewogICAgICAgIHBhY2tlZEJ1ZmZlcltvZmZzZXQrK10gPSBiYXRjaElkc1trXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhY2tlZEJ1ZmZlcjsKICB9CiAgZnVuY3Rpb24gY3JlYXRlVmVjdG9yVGlsZUdlb21ldHJpZXMocGFyYW1ldGVycywgdHJhbnNmZXJhYmxlT2JqZWN0cykgewogICAgY29uc3QgYm94ZXMgPSBkZWZpbmVkX2RlZmF1bHQocGFyYW1ldGVycy5ib3hlcykgPyBuZXcgRmxvYXQzMkFycmF5KHBhcmFtZXRlcnMuYm94ZXMpIDogdm9pZCAwOwogICAgY29uc3QgYm94QmF0Y2hJZHMgPSBkZWZpbmVkX2RlZmF1bHQocGFyYW1ldGVycy5ib3hCYXRjaElkcykgPyBuZXcgVWludDE2QXJyYXkocGFyYW1ldGVycy5ib3hCYXRjaElkcykgOiB2b2lkIDA7CiAgICBjb25zdCBjeWxpbmRlcnMgPSBkZWZpbmVkX2RlZmF1bHQocGFyYW1ldGVycy5jeWxpbmRlcnMpID8gbmV3IEZsb2F0MzJBcnJheShwYXJhbWV0ZXJzLmN5bGluZGVycykgOiB2b2lkIDA7CiAgICBjb25zdCBjeWxpbmRlckJhdGNoSWRzID0gZGVmaW5lZF9kZWZhdWx0KHBhcmFtZXRlcnMuY3lsaW5kZXJCYXRjaElkcykgPyBuZXcgVWludDE2QXJyYXkocGFyYW1ldGVycy5jeWxpbmRlckJhdGNoSWRzKSA6IHZvaWQgMDsKICAgIGNvbnN0IGVsbGlwc29pZHMgPSBkZWZpbmVkX2RlZmF1bHQocGFyYW1ldGVycy5lbGxpcHNvaWRzKSA/IG5ldyBGbG9hdDMyQXJyYXkocGFyYW1ldGVycy5lbGxpcHNvaWRzKSA6IHZvaWQgMDsKICAgIGNvbnN0IGVsbGlwc29pZEJhdGNoSWRzID0gZGVmaW5lZF9kZWZhdWx0KHBhcmFtZXRlcnMuZWxsaXBzb2lkQmF0Y2hJZHMpID8gbmV3IFVpbnQxNkFycmF5KHBhcmFtZXRlcnMuZWxsaXBzb2lkQmF0Y2hJZHMpIDogdm9pZCAwOwogICAgY29uc3Qgc3BoZXJlcyA9IGRlZmluZWRfZGVmYXVsdChwYXJhbWV0ZXJzLnNwaGVyZXMpID8gbmV3IEZsb2F0MzJBcnJheShwYXJhbWV0ZXJzLnNwaGVyZXMpIDogdm9pZCAwOwogICAgY29uc3Qgc3BoZXJlQmF0Y2hJZHMgPSBkZWZpbmVkX2RlZmF1bHQocGFyYW1ldGVycy5zcGhlcmVCYXRjaElkcykgPyBuZXcgVWludDE2QXJyYXkocGFyYW1ldGVycy5zcGhlcmVCYXRjaElkcykgOiB2b2lkIDA7CiAgICBjb25zdCBudW1iZXJPZkJveGVzID0gZGVmaW5lZF9kZWZhdWx0KGJveGVzKSA/IGJveEJhdGNoSWRzLmxlbmd0aCA6IDA7CiAgICBjb25zdCBudW1iZXJPZkN5bGluZGVycyA9IGRlZmluZWRfZGVmYXVsdChjeWxpbmRlcnMpID8gY3lsaW5kZXJCYXRjaElkcy5sZW5ndGggOiAwOwogICAgY29uc3QgbnVtYmVyT2ZFbGxpcHNvaWRzID0gZGVmaW5lZF9kZWZhdWx0KGVsbGlwc29pZHMpID8gZWxsaXBzb2lkQmF0Y2hJZHMubGVuZ3RoIDogMDsKICAgIGNvbnN0IG51bWJlck9mU3BoZXJlcyA9IGRlZmluZWRfZGVmYXVsdChzcGhlcmVzKSA/IHNwaGVyZUJhdGNoSWRzLmxlbmd0aCA6IDA7CiAgICBjb25zdCBib3hHZW9tZXRyeSA9IEJveEdlb21ldHJ5X2RlZmF1bHQuZ2V0VW5pdEJveCgpOwogICAgY29uc3QgY3lsaW5kZXJHZW9tZXRyeSA9IEN5bGluZGVyR2VvbWV0cnlfZGVmYXVsdC5nZXRVbml0Q3lsaW5kZXIoKTsKICAgIGNvbnN0IGVsbGlwc29pZEdlb21ldHJ5ID0gRWxsaXBzb2lkR2VvbWV0cnlfZGVmYXVsdC5nZXRVbml0RWxsaXBzb2lkKCk7CiAgICBjb25zdCBib3hQb3NpdGlvbnMgPSBib3hHZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlczsKICAgIGNvbnN0IGN5bGluZGVyUG9zaXRpb25zID0gY3lsaW5kZXJHZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlczsKICAgIGNvbnN0IGVsbGlwc29pZFBvc2l0aW9ucyA9IGVsbGlwc29pZEdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzOwogICAgbGV0IG51bWJlck9mUG9zaXRpb25zID0gYm94UG9zaXRpb25zLmxlbmd0aCAqIG51bWJlck9mQm94ZXM7CiAgICBudW1iZXJPZlBvc2l0aW9ucyArPSBjeWxpbmRlclBvc2l0aW9ucy5sZW5ndGggKiBudW1iZXJPZkN5bGluZGVyczsKICAgIG51bWJlck9mUG9zaXRpb25zICs9IGVsbGlwc29pZFBvc2l0aW9ucy5sZW5ndGggKiAobnVtYmVyT2ZFbGxpcHNvaWRzICsgbnVtYmVyT2ZTcGhlcmVzKTsKICAgIGNvbnN0IGJveEluZGljZXMgPSBib3hHZW9tZXRyeS5pbmRpY2VzOwogICAgY29uc3QgY3lsaW5kZXJJbmRpY2VzID0gY3lsaW5kZXJHZW9tZXRyeS5pbmRpY2VzOwogICAgY29uc3QgZWxsaXBzb2lkSW5kaWNlcyA9IGVsbGlwc29pZEdlb21ldHJ5LmluZGljZXM7CiAgICBsZXQgbnVtYmVyT2ZJbmRpY2VzID0gYm94SW5kaWNlcy5sZW5ndGggKiBudW1iZXJPZkJveGVzOwogICAgbnVtYmVyT2ZJbmRpY2VzICs9IGN5bGluZGVySW5kaWNlcy5sZW5ndGggKiBudW1iZXJPZkN5bGluZGVyczsKICAgIG51bWJlck9mSW5kaWNlcyArPSBlbGxpcHNvaWRJbmRpY2VzLmxlbmd0aCAqIChudW1iZXJPZkVsbGlwc29pZHMgKyBudW1iZXJPZlNwaGVyZXMpOwogICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShudW1iZXJPZlBvc2l0aW9ucyk7CiAgICBjb25zdCB2ZXJ0ZXhCYXRjaElkcyA9IG5ldyBVaW50MTZBcnJheShudW1iZXJPZlBvc2l0aW9ucyAvIDMpOwogICAgY29uc3QgaW5kaWNlcyA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KAogICAgICBudW1iZXJPZlBvc2l0aW9ucyAvIDMsCiAgICAgIG51bWJlck9mSW5kaWNlcwogICAgKTsKICAgIGNvbnN0IG51bWJlck9mR2VvbWV0cmllcyA9IG51bWJlck9mQm94ZXMgKyBudW1iZXJPZkN5bGluZGVycyArIG51bWJlck9mRWxsaXBzb2lkcyArIG51bWJlck9mU3BoZXJlczsKICAgIGNvbnN0IGJhdGNoSWRzID0gbmV3IFVpbnQxNkFycmF5KG51bWJlck9mR2VvbWV0cmllcyk7CiAgICBjb25zdCBiYXRjaGVkSW5kaWNlcyA9IG5ldyBBcnJheShudW1iZXJPZkdlb21ldHJpZXMpOwogICAgY29uc3QgaW5kZXhPZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KG51bWJlck9mR2VvbWV0cmllcyk7CiAgICBjb25zdCBpbmRleENvdW50cyA9IG5ldyBVaW50MzJBcnJheShudW1iZXJPZkdlb21ldHJpZXMpOwogICAgY29uc3QgYm91bmRpbmdWb2x1bWVzID0gbmV3IEFycmF5KG51bWJlck9mR2VvbWV0cmllcyk7CiAgICB1bnBhY2tCdWZmZXIocGFyYW1ldGVycy5wYWNrZWRCdWZmZXIpOwogICAgY29uc3Qgb3B0aW9ucyA9IHsKICAgICAgYmF0Y2hUYWJsZUNvbG9yczogbmV3IFVpbnQzMkFycmF5KHBhcmFtZXRlcnMuYmF0Y2hUYWJsZUNvbG9ycyksCiAgICAgIHBvc2l0aW9ucywKICAgICAgdmVydGV4QmF0Y2hJZHMsCiAgICAgIGluZGljZXMsCiAgICAgIGJhdGNoSWRzLAogICAgICBiYXRjaGVkSW5kaWNlcywKICAgICAgaW5kZXhPZmZzZXRzLAogICAgICBpbmRleENvdW50cywKICAgICAgYm91bmRpbmdWb2x1bWVzLAogICAgICBwb3NpdGlvbk9mZnNldDogMCwKICAgICAgYmF0Y2hJZEluZGV4OiAwLAogICAgICBpbmRleE9mZnNldDogMCwKICAgICAgYmF0Y2hlZEluZGljZXNPZmZzZXQ6IDAsCiAgICAgIG1vZGVsTWF0cml4OiBzY3JhdGNoTWF0cml4NCwKICAgICAgY2VudGVyOiBzY3JhdGNoQ2VudGVyNQogICAgfTsKICAgIGNyZWF0ZVByaW1pdGl2ZSgKICAgICAgb3B0aW9ucywKICAgICAgYm94ZXMsCiAgICAgIGJveEJhdGNoSWRzLAogICAgICBib3hHZW9tZXRyeSwKICAgICAgYm94TW9kZWxNYXRyaXhBbmRCb3VuZGluZ1ZvbHVtZQogICAgKTsKICAgIGNyZWF0ZVByaW1pdGl2ZSgKICAgICAgb3B0aW9ucywKICAgICAgY3lsaW5kZXJzLAogICAgICBjeWxpbmRlckJhdGNoSWRzLAogICAgICBjeWxpbmRlckdlb21ldHJ5LAogICAgICBjeWxpbmRlck1vZGVsTWF0cml4QW5kQm91bmRpbmdWb2x1bWUKICAgICk7CiAgICBjcmVhdGVQcmltaXRpdmUoCiAgICAgIG9wdGlvbnMsCiAgICAgIGVsbGlwc29pZHMsCiAgICAgIGVsbGlwc29pZEJhdGNoSWRzLAogICAgICBlbGxpcHNvaWRHZW9tZXRyeSwKICAgICAgZWxsaXBzb2lkTW9kZWxNYXRyaXhBbmRCb3VuZGluZ1ZvbHVtZQogICAgKTsKICAgIGNyZWF0ZVByaW1pdGl2ZSgKICAgICAgb3B0aW9ucywKICAgICAgc3BoZXJlcywKICAgICAgc3BoZXJlQmF0Y2hJZHMsCiAgICAgIGVsbGlwc29pZEdlb21ldHJ5LAogICAgICBzcGhlcmVNb2RlbE1hdHJpeEFuZEJvdW5kaW5nVm9sdW1lCiAgICApOwogICAgY29uc3QgcGFja2VkQnVmZmVyID0gcGFja0J1ZmZlcigKICAgICAgaW5kaWNlcy5CWVRFU19QRVJfRUxFTUVOVCwKICAgICAgYmF0Y2hlZEluZGljZXMsCiAgICAgIGJvdW5kaW5nVm9sdW1lcwogICAgKTsKICAgIHRyYW5zZmVyYWJsZU9iamVjdHMucHVzaCgKICAgICAgcG9zaXRpb25zLmJ1ZmZlciwKICAgICAgdmVydGV4QmF0Y2hJZHMuYnVmZmVyLAogICAgICBpbmRpY2VzLmJ1ZmZlcgogICAgKTsKICAgIHRyYW5zZmVyYWJsZU9iamVjdHMucHVzaCgKICAgICAgYmF0Y2hJZHMuYnVmZmVyLAogICAgICBpbmRleE9mZnNldHMuYnVmZmVyLAogICAgICBpbmRleENvdW50cy5idWZmZXIKICAgICk7CiAgICB0cmFuc2ZlcmFibGVPYmplY3RzLnB1c2gocGFja2VkQnVmZmVyLmJ1ZmZlcik7CiAgICByZXR1cm4gewogICAgICBwb3NpdGlvbnM6IHBvc2l0aW9ucy5idWZmZXIsCiAgICAgIHZlcnRleEJhdGNoSWRzOiB2ZXJ0ZXhCYXRjaElkcy5idWZmZXIsCiAgICAgIGluZGljZXM6IGluZGljZXMuYnVmZmVyLAogICAgICBpbmRleE9mZnNldHM6IGluZGV4T2Zmc2V0cy5idWZmZXIsCiAgICAgIGluZGV4Q291bnRzOiBpbmRleENvdW50cy5idWZmZXIsCiAgICAgIGJhdGNoSWRzOiBiYXRjaElkcy5idWZmZXIsCiAgICAgIHBhY2tlZEJ1ZmZlcjogcGFja2VkQnVmZmVyLmJ1ZmZlcgogICAgfTsKICB9CiAgdmFyIHNjcmF0Y2hDYXJ0ZXNpYW4xMSwgcGFja2VkQm94TGVuZ3RoLCBwYWNrZWRDeWxpbmRlckxlbmd0aCwgcGFja2VkRWxsaXBzb2lkTGVuZ3RoLCBwYWNrZWRTcGhlcmVMZW5ndGgsIHNjcmF0Y2hNb2RlbE1hdHJpeEFuZEJWLCBzY3JhdGNoUG9zaXRpb241LCBzY3JhdGNoQ2VudGVyNSwgc2NyYXRjaE1hdHJpeDQsIGNyZWF0ZVZlY3RvclRpbGVHZW9tZXRyaWVzX2RlZmF1bHQ7CiAgdmFyIGluaXRfY3JlYXRlVmVjdG9yVGlsZUdlb21ldHJpZXMgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVZlY3RvclRpbGVHZW9tZXRyaWVzLmpzIigpIHsKICAgICAgaW5pdF9Cb3VuZGluZ1NwaGVyZSgpOwogICAgICBpbml0X0JveEdlb21ldHJ5KCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NvbG9yKCk7CiAgICAgIGluaXRfQ3lsaW5kZXJHZW9tZXRyeSgpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9FbGxpcHNvaWRHZW9tZXRyeSgpOwogICAgICBpbml0X0luZGV4RGF0YXR5cGUoKTsKICAgICAgaW5pdF9NYXRyaXg0KCk7CiAgICAgIGluaXRfVmVjdG9yM0RUaWxlQmF0Y2goKTsKICAgICAgaW5pdF9jcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyKCk7CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4xMSA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgcGFja2VkQm94TGVuZ3RoID0gTWF0cml4NF9kZWZhdWx0LnBhY2tlZExlbmd0aCArIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgIHBhY2tlZEN5bGluZGVyTGVuZ3RoID0gTWF0cml4NF9kZWZhdWx0LnBhY2tlZExlbmd0aCArIDI7CiAgICAgIHBhY2tlZEVsbGlwc29pZExlbmd0aCA9IE1hdHJpeDRfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICBwYWNrZWRTcGhlcmVMZW5ndGggPSBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoICsgMTsKICAgICAgc2NyYXRjaE1vZGVsTWF0cml4QW5kQlYgPSB7CiAgICAgICAgbW9kZWxNYXRyaXg6IG5ldyBNYXRyaXg0X2RlZmF1bHQoKSwKICAgICAgICBib3VuZGluZ1ZvbHVtZTogbmV3IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQoKQogICAgICB9OwogICAgICBzY3JhdGNoUG9zaXRpb241ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2VudGVyNSA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaE1hdHJpeDQgPSBuZXcgTWF0cml4NF9kZWZhdWx0KCk7CiAgICAgIGNyZWF0ZVZlY3RvclRpbGVHZW9tZXRyaWVzX2RlZmF1bHQgPSBjcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyX2RlZmF1bHQoY3JlYXRlVmVjdG9yVGlsZUdlb21ldHJpZXMpOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlVmVjdG9yVGlsZVBvaW50cy5qcwogIHZhciBjcmVhdGVWZWN0b3JUaWxlUG9pbnRzX2V4cG9ydHMgPSB7fTsKICBfX2V4cG9ydChjcmVhdGVWZWN0b3JUaWxlUG9pbnRzX2V4cG9ydHMsIHsKICAgIGRlZmF1bHQ6ICgpID0+IGNyZWF0ZVZlY3RvclRpbGVQb2ludHNfZGVmYXVsdAogIH0pOwogIGZ1bmN0aW9uIHVucGFja0J1ZmZlcjIocGFja2VkQnVmZmVyKSB7CiAgICBwYWNrZWRCdWZmZXIgPSBuZXcgRmxvYXQ2NEFycmF5KHBhY2tlZEJ1ZmZlcik7CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIHNjcmF0Y2hNaW5NYXhIZWlnaHRzLm1pbiA9IHBhY2tlZEJ1ZmZlcltvZmZzZXQrK107CiAgICBzY3JhdGNoTWluTWF4SGVpZ2h0cy5tYXggPSBwYWNrZWRCdWZmZXJbb2Zmc2V0KytdOwogICAgUmVjdGFuZ2xlX2RlZmF1bHQudW5wYWNrKHBhY2tlZEJ1ZmZlciwgb2Zmc2V0LCBzY3JhdGNoUmVjdGFuZ2xlNCk7CiAgICBvZmZzZXQgKz0gUmVjdGFuZ2xlX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgRWxsaXBzb2lkX2RlZmF1bHQudW5wYWNrKHBhY2tlZEJ1ZmZlciwgb2Zmc2V0LCBzY3JhdGNoRWxsaXBzb2lkMTQpOwogIH0KICBmdW5jdGlvbiBjcmVhdGVWZWN0b3JUaWxlUG9pbnRzKHBhcmFtZXRlcnMsIHRyYW5zZmVyYWJsZU9iamVjdHMpIHsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBVaW50MTZBcnJheShwYXJhbWV0ZXJzLnBvc2l0aW9ucyk7CiAgICB1bnBhY2tCdWZmZXIyKHBhcmFtZXRlcnMucGFja2VkQnVmZmVyKTsKICAgIGNvbnN0IHJlY3RhbmdsZSA9IHNjcmF0Y2hSZWN0YW5nbGU0OwogICAgY29uc3QgZWxsaXBzb2lkID0gc2NyYXRjaEVsbGlwc29pZDE0OwogICAgY29uc3QgbWluaW11bUhlaWdodCA9IHNjcmF0Y2hNaW5NYXhIZWlnaHRzLm1pbjsKICAgIGNvbnN0IG1heGltdW1IZWlnaHQgPSBzY3JhdGNoTWluTWF4SGVpZ2h0cy5tYXg7CiAgICBjb25zdCBwb3NpdGlvbnNMZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoIC8gMzsKICAgIGNvbnN0IHVCdWZmZXIgPSBwb3NpdGlvbnMuc3ViYXJyYXkoMCwgcG9zaXRpb25zTGVuZ3RoKTsKICAgIGNvbnN0IHZCdWZmZXIgPSBwb3NpdGlvbnMuc3ViYXJyYXkocG9zaXRpb25zTGVuZ3RoLCAyICogcG9zaXRpb25zTGVuZ3RoKTsKICAgIGNvbnN0IGhlaWdodEJ1ZmZlciA9IHBvc2l0aW9ucy5zdWJhcnJheSgKICAgICAgMiAqIHBvc2l0aW9uc0xlbmd0aCwKICAgICAgMyAqIHBvc2l0aW9uc0xlbmd0aAogICAgKTsKICAgIEF0dHJpYnV0ZUNvbXByZXNzaW9uX2RlZmF1bHQuemlnWmFnRGVsdGFEZWNvZGUodUJ1ZmZlciwgdkJ1ZmZlciwgaGVpZ2h0QnVmZmVyKTsKICAgIGNvbnN0IGRlY29kZWQgPSBuZXcgRmxvYXQ2NEFycmF5KHBvc2l0aW9ucy5sZW5ndGgpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnNMZW5ndGg7ICsraSkgewogICAgICBjb25zdCB1MyA9IHVCdWZmZXJbaV07CiAgICAgIGNvbnN0IHYzID0gdkJ1ZmZlcltpXTsKICAgICAgY29uc3QgaCA9IGhlaWdodEJ1ZmZlcltpXTsKICAgICAgY29uc3QgbG9uID0gTWF0aF9kZWZhdWx0LmxlcnAocmVjdGFuZ2xlLndlc3QsIHJlY3RhbmdsZS5lYXN0LCB1MyAvIG1heFNob3J0KTsKICAgICAgY29uc3QgbGF0ID0gTWF0aF9kZWZhdWx0LmxlcnAocmVjdGFuZ2xlLnNvdXRoLCByZWN0YW5nbGUubm9ydGgsIHYzIC8gbWF4U2hvcnQpOwogICAgICBjb25zdCBhbHQgPSBNYXRoX2RlZmF1bHQubGVycChtaW5pbXVtSGVpZ2h0LCBtYXhpbXVtSGVpZ2h0LCBoIC8gbWF4U2hvcnQpOwogICAgICBjb25zdCBjYXJ0b2dyYXBoaWMyID0gQ2FydG9ncmFwaGljX2RlZmF1bHQuZnJvbVJhZGlhbnMoCiAgICAgICAgbG9uLAogICAgICAgIGxhdCwKICAgICAgICBhbHQsCiAgICAgICAgc2NyYXRjaEJWQ2FydG9ncmFwaGljMgogICAgICApOwogICAgICBjb25zdCBkZWNvZGVkUG9zaXRpb24gPSBlbGxpcHNvaWQuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oCiAgICAgICAgY2FydG9ncmFwaGljMiwKICAgICAgICBzY3JhdGNoRW5jb2RlZFBvc2l0aW9uMgogICAgICApOwogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayhkZWNvZGVkUG9zaXRpb24sIGRlY29kZWQsIGkgKiAzKTsKICAgIH0KICAgIHRyYW5zZmVyYWJsZU9iamVjdHMucHVzaChkZWNvZGVkLmJ1ZmZlcik7CiAgICByZXR1cm4gewogICAgICBwb3NpdGlvbnM6IGRlY29kZWQuYnVmZmVyCiAgICB9OwogIH0KICB2YXIgbWF4U2hvcnQsIHNjcmF0Y2hCVkNhcnRvZ3JhcGhpYzIsIHNjcmF0Y2hFbmNvZGVkUG9zaXRpb24yLCBzY3JhdGNoUmVjdGFuZ2xlNCwgc2NyYXRjaEVsbGlwc29pZDE0LCBzY3JhdGNoTWluTWF4SGVpZ2h0cywgY3JlYXRlVmVjdG9yVGlsZVBvaW50c19kZWZhdWx0OwogIHZhciBpbml0X2NyZWF0ZVZlY3RvclRpbGVQb2ludHMgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVZlY3RvclRpbGVQb2ludHMuanMiKCkgewogICAgICBpbml0X0F0dHJpYnV0ZUNvbXByZXNzaW9uKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRvZ3JhcGhpYygpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9SZWN0YW5nbGUoKTsKICAgICAgaW5pdF9jcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyKCk7CiAgICAgIG1heFNob3J0ID0gMzI3Njc7CiAgICAgIHNjcmF0Y2hCVkNhcnRvZ3JhcGhpYzIgPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaEVuY29kZWRQb3NpdGlvbjIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hSZWN0YW5nbGU0ID0gbmV3IFJlY3RhbmdsZV9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hFbGxpcHNvaWQxNCA9IG5ldyBFbGxpcHNvaWRfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoTWluTWF4SGVpZ2h0cyA9IHsKICAgICAgICBtaW46IHZvaWQgMCwKICAgICAgICBtYXg6IHZvaWQgMAogICAgICB9OwogICAgICBjcmVhdGVWZWN0b3JUaWxlUG9pbnRzX2RlZmF1bHQgPSBjcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyX2RlZmF1bHQoY3JlYXRlVmVjdG9yVGlsZVBvaW50cyk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVWZWN0b3JUaWxlUG9seWdvbnMuanMKICB2YXIgY3JlYXRlVmVjdG9yVGlsZVBvbHlnb25zX2V4cG9ydHMgPSB7fTsKICBfX2V4cG9ydChjcmVhdGVWZWN0b3JUaWxlUG9seWdvbnNfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gY3JlYXRlVmVjdG9yVGlsZVBvbHlnb25zX2RlZmF1bHQKICB9KTsKICBmdW5jdGlvbiB1bnBhY2tCdWZmZXIzKGJ1ZmZlcikgewogICAgY29uc3QgcGFja2VkQnVmZmVyID0gbmV3IEZsb2F0NjRBcnJheShidWZmZXIpOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBzY3JhdGNoU2NhbGFycy5pbmRleEJ5dGVzUGVyRWxlbWVudCA9IHBhY2tlZEJ1ZmZlcltvZmZzZXQrK107CiAgICBzY3JhdGNoU2NhbGFycy5taW4gPSBwYWNrZWRCdWZmZXJbb2Zmc2V0KytdOwogICAgc2NyYXRjaFNjYWxhcnMubWF4ID0gcGFja2VkQnVmZmVyW29mZnNldCsrXTsKICAgIENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2socGFja2VkQnVmZmVyLCBvZmZzZXQsIHNjcmF0Y2hDZW50ZXI2KTsKICAgIG9mZnNldCArPSBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgRWxsaXBzb2lkX2RlZmF1bHQudW5wYWNrKHBhY2tlZEJ1ZmZlciwgb2Zmc2V0LCBzY3JhdGNoRWxsaXBzb2lkMTUpOwogICAgb2Zmc2V0ICs9IEVsbGlwc29pZF9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgIFJlY3RhbmdsZV9kZWZhdWx0LnVucGFjayhwYWNrZWRCdWZmZXIsIG9mZnNldCwgc2NyYXRjaFJlY3RhbmdsZTUpOwogIH0KICBmdW5jdGlvbiBwYWNrZWRCYXRjaGVkSW5kaWNlc0xlbmd0aDIoYmF0Y2hlZEluZGljZXMpIHsKICAgIGNvbnN0IGxlbmd0aCA9IGJhdGNoZWRJbmRpY2VzLmxlbmd0aDsKICAgIGxldCBjb3VudCA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIGNvdW50ICs9IENvbG9yX2RlZmF1bHQucGFja2VkTGVuZ3RoICsgMyArIGJhdGNoZWRJbmRpY2VzW2ldLmJhdGNoSWRzLmxlbmd0aDsKICAgIH0KICAgIHJldHVybiBjb3VudDsKICB9CiAgZnVuY3Rpb24gcGFja0J1ZmZlcjIoaW5kZXhEYXRhdHlwZSwgYm91bmRpbmdWb2x1bWVzLCBiYXRjaGVkSW5kaWNlcykgewogICAgY29uc3QgbnVtQlZzID0gYm91bmRpbmdWb2x1bWVzLmxlbmd0aDsKICAgIGNvbnN0IGxlbmd0aCA9IDEgKyAxICsgbnVtQlZzICogT3JpZW50ZWRCb3VuZGluZ0JveF9kZWZhdWx0LnBhY2tlZExlbmd0aCArIDEgKyBwYWNrZWRCYXRjaGVkSW5kaWNlc0xlbmd0aDIoYmF0Y2hlZEluZGljZXMpOwogICAgY29uc3QgcGFja2VkQnVmZmVyID0gbmV3IEZsb2F0NjRBcnJheShsZW5ndGgpOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBwYWNrZWRCdWZmZXJbb2Zmc2V0KytdID0gaW5kZXhEYXRhdHlwZTsKICAgIHBhY2tlZEJ1ZmZlcltvZmZzZXQrK10gPSBudW1CVnM7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUJWczsgKytpKSB7CiAgICAgIE9yaWVudGVkQm91bmRpbmdCb3hfZGVmYXVsdC5wYWNrKGJvdW5kaW5nVm9sdW1lc1tpXSwgcGFja2VkQnVmZmVyLCBvZmZzZXQpOwogICAgICBvZmZzZXQgKz0gT3JpZW50ZWRCb3VuZGluZ0JveF9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgIH0KICAgIGNvbnN0IGluZGljZXNMZW5ndGggPSBiYXRjaGVkSW5kaWNlcy5sZW5ndGg7CiAgICBwYWNrZWRCdWZmZXJbb2Zmc2V0KytdID0gaW5kaWNlc0xlbmd0aDsKICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5kaWNlc0xlbmd0aDsgKytqKSB7CiAgICAgIGNvbnN0IGJhdGNoZWRJbmRleCA9IGJhdGNoZWRJbmRpY2VzW2pdOwogICAgICBDb2xvcl9kZWZhdWx0LnBhY2soYmF0Y2hlZEluZGV4LmNvbG9yLCBwYWNrZWRCdWZmZXIsIG9mZnNldCk7CiAgICAgIG9mZnNldCArPSBDb2xvcl9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgcGFja2VkQnVmZmVyW29mZnNldCsrXSA9IGJhdGNoZWRJbmRleC5vZmZzZXQ7CiAgICAgIHBhY2tlZEJ1ZmZlcltvZmZzZXQrK10gPSBiYXRjaGVkSW5kZXguY291bnQ7CiAgICAgIGNvbnN0IGJhdGNoSWRzID0gYmF0Y2hlZEluZGV4LmJhdGNoSWRzOwogICAgICBjb25zdCBiYXRjaElkc0xlbmd0aCA9IGJhdGNoSWRzLmxlbmd0aDsKICAgICAgcGFja2VkQnVmZmVyW29mZnNldCsrXSA9IGJhdGNoSWRzTGVuZ3RoOwogICAgICBmb3IgKGxldCBrID0gMDsgayA8IGJhdGNoSWRzTGVuZ3RoOyArK2spIHsKICAgICAgICBwYWNrZWRCdWZmZXJbb2Zmc2V0KytdID0gYmF0Y2hJZHNba107CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwYWNrZWRCdWZmZXI7CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZVZlY3RvclRpbGVQb2x5Z29ucyhwYXJhbWV0ZXJzLCB0cmFuc2ZlcmFibGVPYmplY3RzKSB7CiAgICB1bnBhY2tCdWZmZXIzKHBhcmFtZXRlcnMucGFja2VkQnVmZmVyKTsKICAgIGxldCBpbmRpY2VzOwogICAgY29uc3QgaW5kZXhCeXRlc1BlckVsZW1lbnQgPSBzY3JhdGNoU2NhbGFycy5pbmRleEJ5dGVzUGVyRWxlbWVudDsKICAgIGlmIChpbmRleEJ5dGVzUGVyRWxlbWVudCA9PT0gMikgewogICAgICBpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KHBhcmFtZXRlcnMuaW5kaWNlcyk7CiAgICB9IGVsc2UgewogICAgICBpbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KHBhcmFtZXRlcnMuaW5kaWNlcyk7CiAgICB9CiAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgVWludDE2QXJyYXkocGFyYW1ldGVycy5wb3NpdGlvbnMpOwogICAgY29uc3QgY291bnRzID0gbmV3IFVpbnQzMkFycmF5KHBhcmFtZXRlcnMuY291bnRzKTsKICAgIGNvbnN0IGluZGV4Q291bnRzID0gbmV3IFVpbnQzMkFycmF5KHBhcmFtZXRlcnMuaW5kZXhDb3VudHMpOwogICAgY29uc3QgYmF0Y2hJZHMgPSBuZXcgVWludDMyQXJyYXkocGFyYW1ldGVycy5iYXRjaElkcyk7CiAgICBjb25zdCBiYXRjaFRhYmxlQ29sb3JzID0gbmV3IFVpbnQzMkFycmF5KHBhcmFtZXRlcnMuYmF0Y2hUYWJsZUNvbG9ycyk7CiAgICBjb25zdCBib3VuZGluZ1ZvbHVtZXMgPSBuZXcgQXJyYXkoY291bnRzLmxlbmd0aCk7CiAgICBjb25zdCBjZW50ZXIgPSBzY3JhdGNoQ2VudGVyNjsKICAgIGNvbnN0IGVsbGlwc29pZCA9IHNjcmF0Y2hFbGxpcHNvaWQxNTsKICAgIGxldCByZWN0YW5nbGUgPSBzY3JhdGNoUmVjdGFuZ2xlNTsKICAgIGNvbnN0IG1pbkhlaWdodCA9IHNjcmF0Y2hTY2FsYXJzLm1pbjsKICAgIGNvbnN0IG1heEhlaWdodCA9IHNjcmF0Y2hTY2FsYXJzLm1heDsKICAgIGxldCBtaW5pbXVtSGVpZ2h0cyA9IHBhcmFtZXRlcnMubWluaW11bUhlaWdodHM7CiAgICBsZXQgbWF4aW11bUhlaWdodHMgPSBwYXJhbWV0ZXJzLm1heGltdW1IZWlnaHRzOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdChtaW5pbXVtSGVpZ2h0cykgJiYgZGVmaW5lZF9kZWZhdWx0KG1heGltdW1IZWlnaHRzKSkgewogICAgICBtaW5pbXVtSGVpZ2h0cyA9IG5ldyBGbG9hdDMyQXJyYXkobWluaW11bUhlaWdodHMpOwogICAgICBtYXhpbXVtSGVpZ2h0cyA9IG5ldyBGbG9hdDMyQXJyYXkobWF4aW11bUhlaWdodHMpOwogICAgfQogICAgbGV0IGk7CiAgICBsZXQgajsKICAgIGxldCByZ2JhOwogICAgY29uc3QgcG9zaXRpb25zTGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aCAvIDI7CiAgICBjb25zdCB1QnVmZmVyID0gcG9zaXRpb25zLnN1YmFycmF5KDAsIHBvc2l0aW9uc0xlbmd0aCk7CiAgICBjb25zdCB2QnVmZmVyID0gcG9zaXRpb25zLnN1YmFycmF5KHBvc2l0aW9uc0xlbmd0aCwgMiAqIHBvc2l0aW9uc0xlbmd0aCk7CiAgICBBdHRyaWJ1dGVDb21wcmVzc2lvbl9kZWZhdWx0LnppZ1phZ0RlbHRhRGVjb2RlKHVCdWZmZXIsIHZCdWZmZXIpOwogICAgY29uc3QgZGVjb2RlZFBvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkocG9zaXRpb25zTGVuZ3RoICogMyk7CiAgICBmb3IgKGkgPSAwOyBpIDwgcG9zaXRpb25zTGVuZ3RoOyArK2kpIHsKICAgICAgY29uc3QgdTMgPSB1QnVmZmVyW2ldOwogICAgICBjb25zdCB2MyA9IHZCdWZmZXJbaV07CiAgICAgIGNvbnN0IHggPSBNYXRoX2RlZmF1bHQubGVycChyZWN0YW5nbGUud2VzdCwgcmVjdGFuZ2xlLmVhc3QsIHUzIC8gbWF4U2hvcnQyKTsKICAgICAgY29uc3QgeSA9IE1hdGhfZGVmYXVsdC5sZXJwKHJlY3RhbmdsZS5zb3V0aCwgcmVjdGFuZ2xlLm5vcnRoLCB2MyAvIG1heFNob3J0Mik7CiAgICAgIGNvbnN0IGNhcnQgPSBDYXJ0b2dyYXBoaWNfZGVmYXVsdC5mcm9tUmFkaWFucyh4LCB5LCAwLCBzY3JhdGNoQlZDYXJ0b2dyYXBoaWMzKTsKICAgICAgY29uc3QgZGVjb2RlZFBvc2l0aW9uID0gZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKAogICAgICAgIGNhcnQsCiAgICAgICAgc2NyYXRjaEVuY29kZWRQb3NpdGlvbjMKICAgICAgKTsKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2soZGVjb2RlZFBvc2l0aW9uLCBkZWNvZGVkUG9zaXRpb25zLCBpICogMyk7CiAgICB9CiAgICBjb25zdCBjb3VudHNMZW5ndGggPSBjb3VudHMubGVuZ3RoOwogICAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBBcnJheShjb3VudHNMZW5ndGgpOwogICAgY29uc3QgaW5kZXhPZmZzZXRzID0gbmV3IEFycmF5KGNvdW50c0xlbmd0aCk7CiAgICBsZXQgY3VycmVudE9mZnNldCA9IDA7CiAgICBsZXQgY3VycmVudEluZGV4T2Zmc2V0ID0gMDsKICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudHNMZW5ndGg7ICsraSkgewogICAgICBvZmZzZXRzW2ldID0gY3VycmVudE9mZnNldDsKICAgICAgaW5kZXhPZmZzZXRzW2ldID0gY3VycmVudEluZGV4T2Zmc2V0OwogICAgICBjdXJyZW50T2Zmc2V0ICs9IGNvdW50c1tpXTsKICAgICAgY3VycmVudEluZGV4T2Zmc2V0ICs9IGluZGV4Q291bnRzW2ldOwogICAgfQogICAgY29uc3QgYmF0Y2hlZFBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkocG9zaXRpb25zTGVuZ3RoICogMyAqIDIpOwogICAgY29uc3QgYmF0Y2hlZElkcyA9IG5ldyBVaW50MTZBcnJheShwb3NpdGlvbnNMZW5ndGggKiAyKTsKICAgIGNvbnN0IGJhdGNoZWRJbmRleE9mZnNldHMgPSBuZXcgVWludDMyQXJyYXkoaW5kZXhPZmZzZXRzLmxlbmd0aCk7CiAgICBjb25zdCBiYXRjaGVkSW5kZXhDb3VudHMgPSBuZXcgVWludDMyQXJyYXkoaW5kZXhDb3VudHMubGVuZ3RoKTsKICAgIGxldCBiYXRjaGVkSW5kaWNlcyA9IFtdOwogICAgY29uc3QgY29sb3JUb0J1ZmZlcnMgPSB7fTsKICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudHNMZW5ndGg7ICsraSkgewogICAgICByZ2JhID0gYmF0Y2hUYWJsZUNvbG9yc1tpXTsKICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoY29sb3JUb0J1ZmZlcnNbcmdiYV0pKSB7CiAgICAgICAgY29sb3JUb0J1ZmZlcnNbcmdiYV0gPSB7CiAgICAgICAgICBwb3NpdGlvbkxlbmd0aDogY291bnRzW2ldLAogICAgICAgICAgaW5kZXhMZW5ndGg6IGluZGV4Q291bnRzW2ldLAogICAgICAgICAgb2Zmc2V0OiAwLAogICAgICAgICAgaW5kZXhPZmZzZXQ6IDAsCiAgICAgICAgICBiYXRjaElkczogW2ldCiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb2xvclRvQnVmZmVyc1tyZ2JhXS5wb3NpdGlvbkxlbmd0aCArPSBjb3VudHNbaV07CiAgICAgICAgY29sb3JUb0J1ZmZlcnNbcmdiYV0uaW5kZXhMZW5ndGggKz0gaW5kZXhDb3VudHNbaV07CiAgICAgICAgY29sb3JUb0J1ZmZlcnNbcmdiYV0uYmF0Y2hJZHMucHVzaChpKTsKICAgICAgfQogICAgfQogICAgbGV0IGJ1ZmZlcjsKICAgIGxldCBieUNvbG9yUG9zaXRpb25PZmZzZXQgPSAwOwogICAgbGV0IGJ5Q29sb3JJbmRleE9mZnNldCA9IDA7CiAgICBmb3IgKHJnYmEgaW4gY29sb3JUb0J1ZmZlcnMpIHsKICAgICAgaWYgKGNvbG9yVG9CdWZmZXJzLmhhc093blByb3BlcnR5KHJnYmEpKSB7CiAgICAgICAgYnVmZmVyID0gY29sb3JUb0J1ZmZlcnNbcmdiYV07CiAgICAgICAgYnVmZmVyLm9mZnNldCA9IGJ5Q29sb3JQb3NpdGlvbk9mZnNldDsKICAgICAgICBidWZmZXIuaW5kZXhPZmZzZXQgPSBieUNvbG9ySW5kZXhPZmZzZXQ7CiAgICAgICAgY29uc3QgcG9zaXRpb25MZW5ndGggPSBidWZmZXIucG9zaXRpb25MZW5ndGggKiAyOwogICAgICAgIGNvbnN0IGluZGV4TGVuZ3RoID0gYnVmZmVyLmluZGV4TGVuZ3RoICogMiArIGJ1ZmZlci5wb3NpdGlvbkxlbmd0aCAqIDY7CiAgICAgICAgYnlDb2xvclBvc2l0aW9uT2Zmc2V0ICs9IHBvc2l0aW9uTGVuZ3RoOwogICAgICAgIGJ5Q29sb3JJbmRleE9mZnNldCArPSBpbmRleExlbmd0aDsKICAgICAgICBidWZmZXIuaW5kZXhMZW5ndGggPSBpbmRleExlbmd0aDsKICAgICAgfQogICAgfQogICAgY29uc3QgYmF0Y2hlZERyYXdDYWxscyA9IFtdOwogICAgZm9yIChyZ2JhIGluIGNvbG9yVG9CdWZmZXJzKSB7CiAgICAgIGlmIChjb2xvclRvQnVmZmVycy5oYXNPd25Qcm9wZXJ0eShyZ2JhKSkgewogICAgICAgIGJ1ZmZlciA9IGNvbG9yVG9CdWZmZXJzW3JnYmFdOwogICAgICAgIGJhdGNoZWREcmF3Q2FsbHMucHVzaCh7CiAgICAgICAgICBjb2xvcjogQ29sb3JfZGVmYXVsdC5mcm9tUmdiYShwYXJzZUludChyZ2JhKSksCiAgICAgICAgICBvZmZzZXQ6IGJ1ZmZlci5pbmRleE9mZnNldCwKICAgICAgICAgIGNvdW50OiBidWZmZXIuaW5kZXhMZW5ndGgsCiAgICAgICAgICBiYXRjaElkczogYnVmZmVyLmJhdGNoSWRzCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudHNMZW5ndGg7ICsraSkgewogICAgICByZ2JhID0gYmF0Y2hUYWJsZUNvbG9yc1tpXTsKICAgICAgYnVmZmVyID0gY29sb3JUb0J1ZmZlcnNbcmdiYV07CiAgICAgIGNvbnN0IHBvc2l0aW9uT2Zmc2V0ID0gYnVmZmVyLm9mZnNldDsKICAgICAgbGV0IHBvc2l0aW9uSW5kZXggPSBwb3NpdGlvbk9mZnNldCAqIDM7CiAgICAgIGxldCBiYXRjaElkSW5kZXggPSBwb3NpdGlvbk9mZnNldDsKICAgICAgY29uc3QgcG9seWdvbk9mZnNldCA9IG9mZnNldHNbaV07CiAgICAgIGNvbnN0IHBvbHlnb25Db3VudCA9IGNvdW50c1tpXTsKICAgICAgY29uc3QgYmF0Y2hJZCA9IGJhdGNoSWRzW2ldOwogICAgICBsZXQgcG9seWdvbk1pbmltdW1IZWlnaHQgPSBtaW5IZWlnaHQ7CiAgICAgIGxldCBwb2x5Z29uTWF4aW11bUhlaWdodCA9IG1heEhlaWdodDsKICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChtaW5pbXVtSGVpZ2h0cykgJiYgZGVmaW5lZF9kZWZhdWx0KG1heGltdW1IZWlnaHRzKSkgewogICAgICAgIHBvbHlnb25NaW5pbXVtSGVpZ2h0ID0gbWluaW11bUhlaWdodHNbaV07CiAgICAgICAgcG9seWdvbk1heGltdW1IZWlnaHQgPSBtYXhpbXVtSGVpZ2h0c1tpXTsKICAgICAgfQogICAgICBsZXQgbWluTGF0ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgICBsZXQgbWF4TGF0ID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOwogICAgICBsZXQgbWluTG9uID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgICBsZXQgbWF4TG9uID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOwogICAgICBmb3IgKGogPSAwOyBqIDwgcG9seWdvbkNvdW50OyArK2opIHsKICAgICAgICBjb25zdCBwb3NpdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2soCiAgICAgICAgICBkZWNvZGVkUG9zaXRpb25zLAogICAgICAgICAgcG9seWdvbk9mZnNldCAqIDMgKyBqICogMywKICAgICAgICAgIHNjcmF0Y2hFbmNvZGVkUG9zaXRpb24zCiAgICAgICAgKTsKICAgICAgICBlbGxpcHNvaWQuc2NhbGVUb0dlb2RldGljU3VyZmFjZShwb3NpdGlvbiwgcG9zaXRpb24pOwogICAgICAgIGNvbnN0IGNhcnRvID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKAogICAgICAgICAgcG9zaXRpb24sCiAgICAgICAgICBzY3JhdGNoQlZDYXJ0b2dyYXBoaWMzCiAgICAgICAgKTsKICAgICAgICBjb25zdCBsYXQgPSBjYXJ0by5sYXRpdHVkZTsKICAgICAgICBjb25zdCBsb24gPSBjYXJ0by5sb25naXR1ZGU7CiAgICAgICAgbWluTGF0ID0gTWF0aC5taW4obGF0LCBtaW5MYXQpOwogICAgICAgIG1heExhdCA9IE1hdGgubWF4KGxhdCwgbWF4TGF0KTsKICAgICAgICBtaW5Mb24gPSBNYXRoLm1pbihsb24sIG1pbkxvbik7CiAgICAgICAgbWF4TG9uID0gTWF0aC5tYXgobG9uLCBtYXhMb24pOwogICAgICAgIGNvbnN0IG5vcm1hbDIgPSBlbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKHBvc2l0aW9uLCBzY3JhdGNoTm9ybWFsNyk7CiAgICAgICAgbGV0IHNjYWxlZE5vcm1hbCA9IENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKAogICAgICAgICAgbm9ybWFsMiwKICAgICAgICAgIHBvbHlnb25NaW5pbXVtSGVpZ2h0LAogICAgICAgICAgc2NyYXRjaFNjYWxlZE5vcm1hbAogICAgICAgICk7CiAgICAgICAgY29uc3QgbWluSGVpZ2h0UG9zaXRpb24gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuYWRkKAogICAgICAgICAgcG9zaXRpb24sCiAgICAgICAgICBzY2FsZWROb3JtYWwsCiAgICAgICAgICBzY3JhdGNoTWluSGVpZ2h0UG9zaXRpb24KICAgICAgICApOwogICAgICAgIHNjYWxlZE5vcm1hbCA9IENhcnRlc2lhbjNfZGVmYXVsdC5tdWx0aXBseUJ5U2NhbGFyKAogICAgICAgICAgbm9ybWFsMiwKICAgICAgICAgIHBvbHlnb25NYXhpbXVtSGVpZ2h0LAogICAgICAgICAgc2NhbGVkTm9ybWFsCiAgICAgICAgKTsKICAgICAgICBjb25zdCBtYXhIZWlnaHRQb3NpdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5hZGQoCiAgICAgICAgICBwb3NpdGlvbiwKICAgICAgICAgIHNjYWxlZE5vcm1hbCwKICAgICAgICAgIHNjcmF0Y2hNYXhIZWlnaHRQb3NpdGlvbgogICAgICAgICk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KG1heEhlaWdodFBvc2l0aW9uLCBjZW50ZXIsIG1heEhlaWdodFBvc2l0aW9uKTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QobWluSGVpZ2h0UG9zaXRpb24sIGNlbnRlciwgbWluSGVpZ2h0UG9zaXRpb24pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKG1heEhlaWdodFBvc2l0aW9uLCBiYXRjaGVkUG9zaXRpb25zLCBwb3NpdGlvbkluZGV4KTsKICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayhtaW5IZWlnaHRQb3NpdGlvbiwgYmF0Y2hlZFBvc2l0aW9ucywgcG9zaXRpb25JbmRleCArIDMpOwogICAgICAgIGJhdGNoZWRJZHNbYmF0Y2hJZEluZGV4XSA9IGJhdGNoSWQ7CiAgICAgICAgYmF0Y2hlZElkc1tiYXRjaElkSW5kZXggKyAxXSA9IGJhdGNoSWQ7CiAgICAgICAgcG9zaXRpb25JbmRleCArPSA2OwogICAgICAgIGJhdGNoSWRJbmRleCArPSAyOwogICAgICB9CiAgICAgIHJlY3RhbmdsZSA9IHNjcmF0Y2hCVlJlY3RhbmdsZTsKICAgICAgcmVjdGFuZ2xlLndlc3QgPSBtaW5Mb247CiAgICAgIHJlY3RhbmdsZS5lYXN0ID0gbWF4TG9uOwogICAgICByZWN0YW5nbGUuc291dGggPSBtaW5MYXQ7CiAgICAgIHJlY3RhbmdsZS5ub3J0aCA9IG1heExhdDsKICAgICAgYm91bmRpbmdWb2x1bWVzW2ldID0gT3JpZW50ZWRCb3VuZGluZ0JveF9kZWZhdWx0LmZyb21SZWN0YW5nbGUoCiAgICAgICAgcmVjdGFuZ2xlLAogICAgICAgIG1pbkhlaWdodCwKICAgICAgICBtYXhIZWlnaHQsCiAgICAgICAgZWxsaXBzb2lkCiAgICAgICk7CiAgICAgIGxldCBpbmRpY2VzSW5kZXggPSBidWZmZXIuaW5kZXhPZmZzZXQ7CiAgICAgIGNvbnN0IGluZGV4T2Zmc2V0ID0gaW5kZXhPZmZzZXRzW2ldOwogICAgICBjb25zdCBpbmRleENvdW50ID0gaW5kZXhDb3VudHNbaV07CiAgICAgIGJhdGNoZWRJbmRleE9mZnNldHNbaV0gPSBpbmRpY2VzSW5kZXg7CiAgICAgIGZvciAoaiA9IDA7IGogPCBpbmRleENvdW50OyBqICs9IDMpIHsKICAgICAgICBjb25zdCBpMCA9IGluZGljZXNbaW5kZXhPZmZzZXQgKyBqXSAtIHBvbHlnb25PZmZzZXQ7CiAgICAgICAgY29uc3QgaTEgPSBpbmRpY2VzW2luZGV4T2Zmc2V0ICsgaiArIDFdIC0gcG9seWdvbk9mZnNldDsKICAgICAgICBjb25zdCBpMiA9IGluZGljZXNbaW5kZXhPZmZzZXQgKyBqICsgMl0gLSBwb2x5Z29uT2Zmc2V0OwogICAgICAgIGJhdGNoZWRJbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IGkwICogMiArIHBvc2l0aW9uT2Zmc2V0OwogICAgICAgIGJhdGNoZWRJbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IGkxICogMiArIHBvc2l0aW9uT2Zmc2V0OwogICAgICAgIGJhdGNoZWRJbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IGkyICogMiArIHBvc2l0aW9uT2Zmc2V0OwogICAgICAgIGJhdGNoZWRJbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IGkyICogMiArIDEgKyBwb3NpdGlvbk9mZnNldDsKICAgICAgICBiYXRjaGVkSW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBpMSAqIDIgKyAxICsgcG9zaXRpb25PZmZzZXQ7CiAgICAgICAgYmF0Y2hlZEluZGljZXNbaW5kaWNlc0luZGV4KytdID0gaTAgKiAyICsgMSArIHBvc2l0aW9uT2Zmc2V0OwogICAgICB9CiAgICAgIGZvciAoaiA9IDA7IGogPCBwb2x5Z29uQ291bnQ7ICsraikgewogICAgICAgIGNvbnN0IHYwMiA9IGo7CiAgICAgICAgY29uc3QgdjEyID0gKGogKyAxKSAlIHBvbHlnb25Db3VudDsKICAgICAgICBiYXRjaGVkSW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSB2MDIgKiAyICsgMSArIHBvc2l0aW9uT2Zmc2V0OwogICAgICAgIGJhdGNoZWRJbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IHYxMiAqIDIgKyBwb3NpdGlvbk9mZnNldDsKICAgICAgICBiYXRjaGVkSW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSB2MDIgKiAyICsgcG9zaXRpb25PZmZzZXQ7CiAgICAgICAgYmF0Y2hlZEluZGljZXNbaW5kaWNlc0luZGV4KytdID0gdjAyICogMiArIDEgKyBwb3NpdGlvbk9mZnNldDsKICAgICAgICBiYXRjaGVkSW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSB2MTIgKiAyICsgMSArIHBvc2l0aW9uT2Zmc2V0OwogICAgICAgIGJhdGNoZWRJbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IHYxMiAqIDIgKyBwb3NpdGlvbk9mZnNldDsKICAgICAgfQogICAgICBidWZmZXIub2Zmc2V0ICs9IHBvbHlnb25Db3VudCAqIDI7CiAgICAgIGJ1ZmZlci5pbmRleE9mZnNldCA9IGluZGljZXNJbmRleDsKICAgICAgYmF0Y2hlZEluZGV4Q291bnRzW2ldID0gaW5kaWNlc0luZGV4IC0gYmF0Y2hlZEluZGV4T2Zmc2V0c1tpXTsKICAgIH0KICAgIGJhdGNoZWRJbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkoCiAgICAgIGJhdGNoZWRQb3NpdGlvbnMubGVuZ3RoIC8gMywKICAgICAgYmF0Y2hlZEluZGljZXMKICAgICk7CiAgICBjb25zdCBiYXRjaGVkSW5kaWNlc0xlbmd0aCA9IGJhdGNoZWREcmF3Q2FsbHMubGVuZ3RoOwogICAgZm9yIChsZXQgbSA9IDA7IG0gPCBiYXRjaGVkSW5kaWNlc0xlbmd0aDsgKyttKSB7CiAgICAgIGNvbnN0IHRlbXBJZHMgPSBiYXRjaGVkRHJhd0NhbGxzW21dLmJhdGNoSWRzOwogICAgICBsZXQgY291bnQgPSAwOwogICAgICBjb25zdCB0ZW1wSWRzTGVuZ3RoID0gdGVtcElkcy5sZW5ndGg7CiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdGVtcElkc0xlbmd0aDsgKytuKSB7CiAgICAgICAgY291bnQgKz0gYmF0Y2hlZEluZGV4Q291bnRzW3RlbXBJZHNbbl1dOwogICAgICB9CiAgICAgIGJhdGNoZWREcmF3Q2FsbHNbbV0uY291bnQgPSBjb3VudDsKICAgIH0KICAgIGNvbnN0IGluZGV4RGF0YXR5cGUgPSBiYXRjaGVkSW5kaWNlcy5CWVRFU19QRVJfRUxFTUVOVCA9PT0gMiA/IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5VTlNJR05FRF9TSE9SVCA6IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5VTlNJR05FRF9JTlQ7CiAgICBjb25zdCBwYWNrZWRCdWZmZXIgPSBwYWNrQnVmZmVyMigKICAgICAgaW5kZXhEYXRhdHlwZSwKICAgICAgYm91bmRpbmdWb2x1bWVzLAogICAgICBiYXRjaGVkRHJhd0NhbGxzCiAgICApOwogICAgdHJhbnNmZXJhYmxlT2JqZWN0cy5wdXNoKAogICAgICBiYXRjaGVkUG9zaXRpb25zLmJ1ZmZlciwKICAgICAgYmF0Y2hlZEluZGljZXMuYnVmZmVyLAogICAgICBiYXRjaGVkSW5kZXhPZmZzZXRzLmJ1ZmZlciwKICAgICAgYmF0Y2hlZEluZGV4Q291bnRzLmJ1ZmZlciwKICAgICAgYmF0Y2hlZElkcy5idWZmZXIsCiAgICAgIHBhY2tlZEJ1ZmZlci5idWZmZXIKICAgICk7CiAgICByZXR1cm4gewogICAgICBwb3NpdGlvbnM6IGJhdGNoZWRQb3NpdGlvbnMuYnVmZmVyLAogICAgICBpbmRpY2VzOiBiYXRjaGVkSW5kaWNlcy5idWZmZXIsCiAgICAgIGluZGV4T2Zmc2V0czogYmF0Y2hlZEluZGV4T2Zmc2V0cy5idWZmZXIsCiAgICAgIGluZGV4Q291bnRzOiBiYXRjaGVkSW5kZXhDb3VudHMuYnVmZmVyLAogICAgICBiYXRjaElkczogYmF0Y2hlZElkcy5idWZmZXIsCiAgICAgIHBhY2tlZEJ1ZmZlcjogcGFja2VkQnVmZmVyLmJ1ZmZlcgogICAgfTsKICB9CiAgdmFyIHNjcmF0Y2hDZW50ZXI2LCBzY3JhdGNoRWxsaXBzb2lkMTUsIHNjcmF0Y2hSZWN0YW5nbGU1LCBzY3JhdGNoU2NhbGFycywgbWF4U2hvcnQyLCBzY3JhdGNoRW5jb2RlZFBvc2l0aW9uMywgc2NyYXRjaE5vcm1hbDcsIHNjcmF0Y2hTY2FsZWROb3JtYWwsIHNjcmF0Y2hNaW5IZWlnaHRQb3NpdGlvbiwgc2NyYXRjaE1heEhlaWdodFBvc2l0aW9uLCBzY3JhdGNoQlZDYXJ0b2dyYXBoaWMzLCBzY3JhdGNoQlZSZWN0YW5nbGUsIGNyZWF0ZVZlY3RvclRpbGVQb2x5Z29uc19kZWZhdWx0OwogIHZhciBpbml0X2NyZWF0ZVZlY3RvclRpbGVQb2x5Z29ucyA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlVmVjdG9yVGlsZVBvbHlnb25zLmpzIigpIHsKICAgICAgaW5pdF9BdHRyaWJ1dGVDb21wcmVzc2lvbigpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DYXJ0b2dyYXBoaWMoKTsKICAgICAgaW5pdF9Db2xvcigpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9JbmRleERhdGF0eXBlKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBpbml0X09yaWVudGVkQm91bmRpbmdCb3goKTsKICAgICAgaW5pdF9SZWN0YW5nbGUoKTsKICAgICAgaW5pdF9jcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyKCk7CiAgICAgIHNjcmF0Y2hDZW50ZXI2ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoRWxsaXBzb2lkMTUgPSBuZXcgRWxsaXBzb2lkX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFJlY3RhbmdsZTUgPSBuZXcgUmVjdGFuZ2xlX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFNjYWxhcnMgPSB7CiAgICAgICAgbWluOiB2b2lkIDAsCiAgICAgICAgbWF4OiB2b2lkIDAsCiAgICAgICAgaW5kZXhCeXRlc1BlckVsZW1lbnQ6IHZvaWQgMAogICAgICB9OwogICAgICBtYXhTaG9ydDIgPSAzMjc2NzsKICAgICAgc2NyYXRjaEVuY29kZWRQb3NpdGlvbjMgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hOb3JtYWw3ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoU2NhbGVkTm9ybWFsID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoTWluSGVpZ2h0UG9zaXRpb24gPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hNYXhIZWlnaHRQb3NpdGlvbiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaEJWQ2FydG9ncmFwaGljMyA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQlZSZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlX2RlZmF1bHQoKTsKICAgICAgY3JlYXRlVmVjdG9yVGlsZVBvbHlnb25zX2RlZmF1bHQgPSBjcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyX2RlZmF1bHQoY3JlYXRlVmVjdG9yVGlsZVBvbHlnb25zKTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2RlY29kZVZlY3RvclBvbHlsaW5lUG9zaXRpb25zLmpzCiAgZnVuY3Rpb24gZGVjb2RlVmVjdG9yUG9seWxpbmVQb3NpdGlvbnMocG9zaXRpb25zLCByZWN0YW5nbGUsIG1pbmltdW1IZWlnaHQsIG1heGltdW1IZWlnaHQsIGVsbGlwc29pZCkgewogICAgY29uc3QgcG9zaXRpb25zTGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aCAvIDM7CiAgICBjb25zdCB1QnVmZmVyID0gcG9zaXRpb25zLnN1YmFycmF5KDAsIHBvc2l0aW9uc0xlbmd0aCk7CiAgICBjb25zdCB2QnVmZmVyID0gcG9zaXRpb25zLnN1YmFycmF5KHBvc2l0aW9uc0xlbmd0aCwgMiAqIHBvc2l0aW9uc0xlbmd0aCk7CiAgICBjb25zdCBoZWlnaHRCdWZmZXIgPSBwb3NpdGlvbnMuc3ViYXJyYXkoCiAgICAgIDIgKiBwb3NpdGlvbnNMZW5ndGgsCiAgICAgIDMgKiBwb3NpdGlvbnNMZW5ndGgKICAgICk7CiAgICBBdHRyaWJ1dGVDb21wcmVzc2lvbl9kZWZhdWx0LnppZ1phZ0RlbHRhRGVjb2RlKHVCdWZmZXIsIHZCdWZmZXIsIGhlaWdodEJ1ZmZlcik7CiAgICBjb25zdCBkZWNvZGVkID0gbmV3IEZsb2F0NjRBcnJheShwb3NpdGlvbnMubGVuZ3RoKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zTGVuZ3RoOyArK2kpIHsKICAgICAgY29uc3QgdTMgPSB1QnVmZmVyW2ldOwogICAgICBjb25zdCB2MyA9IHZCdWZmZXJbaV07CiAgICAgIGNvbnN0IGggPSBoZWlnaHRCdWZmZXJbaV07CiAgICAgIGNvbnN0IGxvbiA9IE1hdGhfZGVmYXVsdC5sZXJwKHJlY3RhbmdsZS53ZXN0LCByZWN0YW5nbGUuZWFzdCwgdTMgLyBtYXhTaG9ydDMpOwogICAgICBjb25zdCBsYXQgPSBNYXRoX2RlZmF1bHQubGVycChyZWN0YW5nbGUuc291dGgsIHJlY3RhbmdsZS5ub3J0aCwgdjMgLyBtYXhTaG9ydDMpOwogICAgICBjb25zdCBhbHQgPSBNYXRoX2RlZmF1bHQubGVycChtaW5pbXVtSGVpZ2h0LCBtYXhpbXVtSGVpZ2h0LCBoIC8gbWF4U2hvcnQzKTsKICAgICAgY29uc3QgY2FydG9ncmFwaGljMiA9IENhcnRvZ3JhcGhpY19kZWZhdWx0LmZyb21SYWRpYW5zKAogICAgICAgIGxvbiwKICAgICAgICBsYXQsCiAgICAgICAgYWx0LAogICAgICAgIHNjcmF0Y2hCVkNhcnRvZ3JhcGhpYzQKICAgICAgKTsKICAgICAgY29uc3QgZGVjb2RlZFBvc2l0aW9uID0gZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKAogICAgICAgIGNhcnRvZ3JhcGhpYzIsCiAgICAgICAgc2NyYXRjaEVuY29kZWRQb3NpdGlvbjQKICAgICAgKTsKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2soZGVjb2RlZFBvc2l0aW9uLCBkZWNvZGVkLCBpICogMyk7CiAgICB9CiAgICByZXR1cm4gZGVjb2RlZDsKICB9CiAgdmFyIG1heFNob3J0Mywgc2NyYXRjaEJWQ2FydG9ncmFwaGljNCwgc2NyYXRjaEVuY29kZWRQb3NpdGlvbjQsIGRlY29kZVZlY3RvclBvbHlsaW5lUG9zaXRpb25zX2RlZmF1bHQ7CiAgdmFyIGluaXRfZGVjb2RlVmVjdG9yUG9seWxpbmVQb3NpdGlvbnMgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2RlY29kZVZlY3RvclBvbHlsaW5lUG9zaXRpb25zLmpzIigpIHsKICAgICAgaW5pdF9BdHRyaWJ1dGVDb21wcmVzc2lvbigpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DYXJ0b2dyYXBoaWMoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIG1heFNob3J0MyA9IDMyNzY3OwogICAgICBzY3JhdGNoQlZDYXJ0b2dyYXBoaWM0ID0gbmV3IENhcnRvZ3JhcGhpY19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hFbmNvZGVkUG9zaXRpb240ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBkZWNvZGVWZWN0b3JQb2x5bGluZVBvc2l0aW9uc19kZWZhdWx0ID0gZGVjb2RlVmVjdG9yUG9seWxpbmVQb3NpdGlvbnM7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVWZWN0b3JUaWxlUG9seWxpbmVzLmpzCiAgdmFyIGNyZWF0ZVZlY3RvclRpbGVQb2x5bGluZXNfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGNyZWF0ZVZlY3RvclRpbGVQb2x5bGluZXNfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gY3JlYXRlVmVjdG9yVGlsZVBvbHlsaW5lc19kZWZhdWx0CiAgfSk7CiAgZnVuY3Rpb24gdW5wYWNrQnVmZmVyNChwYWNrZWRCdWZmZXIpIHsKICAgIHBhY2tlZEJ1ZmZlciA9IG5ldyBGbG9hdDY0QXJyYXkocGFja2VkQnVmZmVyKTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgc2NyYXRjaE1pbk1heEhlaWdodHMyLm1pbiA9IHBhY2tlZEJ1ZmZlcltvZmZzZXQrK107CiAgICBzY3JhdGNoTWluTWF4SGVpZ2h0czIubWF4ID0gcGFja2VkQnVmZmVyW29mZnNldCsrXTsKICAgIFJlY3RhbmdsZV9kZWZhdWx0LnVucGFjayhwYWNrZWRCdWZmZXIsIG9mZnNldCwgc2NyYXRjaFJlY3RhbmdsZTYpOwogICAgb2Zmc2V0ICs9IFJlY3RhbmdsZV9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgIEVsbGlwc29pZF9kZWZhdWx0LnVucGFjayhwYWNrZWRCdWZmZXIsIG9mZnNldCwgc2NyYXRjaEVsbGlwc29pZDE2KTsKICAgIG9mZnNldCArPSBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKHBhY2tlZEJ1ZmZlciwgb2Zmc2V0LCBzY3JhdGNoQ2VudGVyNyk7CiAgfQogIGZ1bmN0aW9uIGdldFBvc2l0aW9uT2Zmc2V0czIoY291bnRzKSB7CiAgICBjb25zdCBjb3VudHNMZW5ndGggPSBjb3VudHMubGVuZ3RoOwogICAgY29uc3QgcG9zaXRpb25PZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KGNvdW50c0xlbmd0aCArIDEpOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50c0xlbmd0aDsgKytpKSB7CiAgICAgIHBvc2l0aW9uT2Zmc2V0c1tpXSA9IG9mZnNldDsKICAgICAgb2Zmc2V0ICs9IGNvdW50c1tpXTsKICAgIH0KICAgIHBvc2l0aW9uT2Zmc2V0c1tjb3VudHNMZW5ndGhdID0gb2Zmc2V0OwogICAgcmV0dXJuIHBvc2l0aW9uT2Zmc2V0czsKICB9CiAgZnVuY3Rpb24gY3JlYXRlVmVjdG9yVGlsZVBvbHlsaW5lcyhwYXJhbWV0ZXJzLCB0cmFuc2ZlcmFibGVPYmplY3RzKSB7CiAgICBjb25zdCBlbmNvZGVkUG9zaXRpb25zID0gbmV3IFVpbnQxNkFycmF5KHBhcmFtZXRlcnMucG9zaXRpb25zKTsKICAgIGNvbnN0IHdpZHRocyA9IG5ldyBVaW50MTZBcnJheShwYXJhbWV0ZXJzLndpZHRocyk7CiAgICBjb25zdCBjb3VudHMgPSBuZXcgVWludDMyQXJyYXkocGFyYW1ldGVycy5jb3VudHMpOwogICAgY29uc3QgYmF0Y2hJZHMgPSBuZXcgVWludDE2QXJyYXkocGFyYW1ldGVycy5iYXRjaElkcyk7CiAgICB1bnBhY2tCdWZmZXI0KHBhcmFtZXRlcnMucGFja2VkQnVmZmVyKTsKICAgIGNvbnN0IHJlY3RhbmdsZSA9IHNjcmF0Y2hSZWN0YW5nbGU2OwogICAgY29uc3QgZWxsaXBzb2lkID0gc2NyYXRjaEVsbGlwc29pZDE2OwogICAgY29uc3QgY2VudGVyID0gc2NyYXRjaENlbnRlcjc7CiAgICBjb25zdCBtaW5pbXVtSGVpZ2h0ID0gc2NyYXRjaE1pbk1heEhlaWdodHMyLm1pbjsKICAgIGNvbnN0IG1heGltdW1IZWlnaHQgPSBzY3JhdGNoTWluTWF4SGVpZ2h0czIubWF4OwogICAgY29uc3QgcG9zaXRpb25zID0gZGVjb2RlVmVjdG9yUG9seWxpbmVQb3NpdGlvbnNfZGVmYXVsdCgKICAgICAgZW5jb2RlZFBvc2l0aW9ucywKICAgICAgcmVjdGFuZ2xlLAogICAgICBtaW5pbXVtSGVpZ2h0LAogICAgICBtYXhpbXVtSGVpZ2h0LAogICAgICBlbGxpcHNvaWQKICAgICk7CiAgICBjb25zdCBwb3NpdGlvbnNMZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoIC8gMzsKICAgIGNvbnN0IHNpemUgPSBwb3NpdGlvbnNMZW5ndGggKiA0IC0gNDsKICAgIGNvbnN0IGN1clBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSAqIDMpOwogICAgY29uc3QgcHJldlBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSAqIDMpOwogICAgY29uc3QgbmV4dFBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSAqIDMpOwogICAgY29uc3QgZXhwYW5kQW5kV2lkdGggPSBuZXcgRmxvYXQzMkFycmF5KHNpemUgKiAyKTsKICAgIGNvbnN0IHZlcnRleEJhdGNoSWRzID0gbmV3IFVpbnQxNkFycmF5KHNpemUpOwogICAgbGV0IHBvc2l0aW9uSW5kZXggPSAwOwogICAgbGV0IGV4cGFuZEFuZFdpZHRoSW5kZXggPSAwOwogICAgbGV0IGJhdGNoSWRJbmRleCA9IDA7CiAgICBsZXQgaTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgbGV0IGxlbmd0aCA9IGNvdW50cy5sZW5ndGg7CiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgY29uc3QgY291bnQgPSBjb3VudHNbaV07CiAgICAgIGNvbnN0IHdpZHRoID0gd2lkdGhzW2ldOwogICAgICBjb25zdCBiYXRjaElkID0gYmF0Y2hJZHNbaV07CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY291bnQ7ICsraikgewogICAgICAgIGxldCBwcmV2aW91czsKICAgICAgICBpZiAoaiA9PT0gMCkgewogICAgICAgICAgY29uc3QgcDAgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKHBvc2l0aW9ucywgb2Zmc2V0ICogMywgc2NyYXRjaFAwMik7CiAgICAgICAgICBjb25zdCBwMSA9IENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2socG9zaXRpb25zLCAob2Zmc2V0ICsgMSkgKiAzLCBzY3JhdGNoUDEyKTsKICAgICAgICAgIHByZXZpb3VzID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KHAwLCBwMSwgc2NyYXRjaFByZXYyKTsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQocDAsIHByZXZpb3VzLCBwcmV2aW91cyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByZXZpb3VzID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjaygKICAgICAgICAgICAgcG9zaXRpb25zLAogICAgICAgICAgICAob2Zmc2V0ICsgaiAtIDEpICogMywKICAgICAgICAgICAgc2NyYXRjaFByZXYyCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCBjdXJyZW50ID0gQ2FydGVzaWFuM19kZWZhdWx0LnVucGFjaygKICAgICAgICAgIHBvc2l0aW9ucywKICAgICAgICAgIChvZmZzZXQgKyBqKSAqIDMsCiAgICAgICAgICBzY3JhdGNoQ3VyCiAgICAgICAgKTsKICAgICAgICBsZXQgbmV4dDsKICAgICAgICBpZiAoaiA9PT0gY291bnQgLSAxKSB7CiAgICAgICAgICBjb25zdCBwMiA9IENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2soCiAgICAgICAgICAgIHBvc2l0aW9ucywKICAgICAgICAgICAgKG9mZnNldCArIGNvdW50IC0gMSkgKiAzLAogICAgICAgICAgICBzY3JhdGNoUDAyCiAgICAgICAgICApOwogICAgICAgICAgY29uc3QgcDMgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKAogICAgICAgICAgICBwb3NpdGlvbnMsCiAgICAgICAgICAgIChvZmZzZXQgKyBjb3VudCAtIDIpICogMywKICAgICAgICAgICAgc2NyYXRjaFAxMgogICAgICAgICAgKTsKICAgICAgICAgIG5leHQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QocDIsIHAzLCBzY3JhdGNoTmV4dDIpOwogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmFkZChwMiwgbmV4dCwgbmV4dCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5leHQgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKHBvc2l0aW9ucywgKG9mZnNldCArIGogKyAxKSAqIDMsIHNjcmF0Y2hOZXh0Mik7CiAgICAgICAgfQogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5zdWJ0cmFjdChwcmV2aW91cywgY2VudGVyLCBwcmV2aW91cyk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KGN1cnJlbnQsIGNlbnRlciwgY3VycmVudCk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KG5leHQsIGNlbnRlciwgbmV4dCk7CiAgICAgICAgY29uc3Qgc3RhcnRLID0gaiA9PT0gMCA/IDIgOiAwOwogICAgICAgIGNvbnN0IGVuZEsgPSBqID09PSBjb3VudCAtIDEgPyAyIDogNDsKICAgICAgICBmb3IgKGxldCBrID0gc3RhcnRLOyBrIDwgZW5kSzsgKytrKSB7CiAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayhjdXJyZW50LCBjdXJQb3NpdGlvbnMsIHBvc2l0aW9uSW5kZXgpOwogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2socHJldmlvdXMsIHByZXZQb3NpdGlvbnMsIHBvc2l0aW9uSW5kZXgpOwogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2sobmV4dCwgbmV4dFBvc2l0aW9ucywgcG9zaXRpb25JbmRleCk7CiAgICAgICAgICBwb3NpdGlvbkluZGV4ICs9IDM7CiAgICAgICAgICBjb25zdCBkaXJlY3Rpb24yID0gayAtIDIgPCAwID8gLTEgOiAxOwogICAgICAgICAgZXhwYW5kQW5kV2lkdGhbZXhwYW5kQW5kV2lkdGhJbmRleCsrXSA9IDIgKiAoayAlIDIpIC0gMTsKICAgICAgICAgIGV4cGFuZEFuZFdpZHRoW2V4cGFuZEFuZFdpZHRoSW5kZXgrK10gPSBkaXJlY3Rpb24yICogd2lkdGg7CiAgICAgICAgICB2ZXJ0ZXhCYXRjaElkc1tiYXRjaElkSW5kZXgrK10gPSBiYXRjaElkOwogICAgICAgIH0KICAgICAgfQogICAgICBvZmZzZXQgKz0gY291bnQ7CiAgICB9CiAgICBjb25zdCBpbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkoc2l6ZSwgcG9zaXRpb25zTGVuZ3RoICogNiAtIDYpOwogICAgbGV0IGluZGV4ID0gMDsKICAgIGxldCBpbmRpY2VzSW5kZXggPSAwOwogICAgbGVuZ3RoID0gcG9zaXRpb25zTGVuZ3RoIC0gMTsKICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IGluZGV4OwogICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IGluZGV4ICsgMjsKICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBpbmRleCArIDE7CiAgICAgIGluZGljZXNbaW5kaWNlc0luZGV4KytdID0gaW5kZXggKyAxOwogICAgICBpbmRpY2VzW2luZGljZXNJbmRleCsrXSA9IGluZGV4ICsgMjsKICAgICAgaW5kaWNlc1tpbmRpY2VzSW5kZXgrK10gPSBpbmRleCArIDM7CiAgICAgIGluZGV4ICs9IDQ7CiAgICB9CiAgICB0cmFuc2ZlcmFibGVPYmplY3RzLnB1c2goCiAgICAgIGN1clBvc2l0aW9ucy5idWZmZXIsCiAgICAgIHByZXZQb3NpdGlvbnMuYnVmZmVyLAogICAgICBuZXh0UG9zaXRpb25zLmJ1ZmZlcgogICAgKTsKICAgIHRyYW5zZmVyYWJsZU9iamVjdHMucHVzaCgKICAgICAgZXhwYW5kQW5kV2lkdGguYnVmZmVyLAogICAgICB2ZXJ0ZXhCYXRjaElkcy5idWZmZXIsCiAgICAgIGluZGljZXMuYnVmZmVyCiAgICApOwogICAgbGV0IHJlc3VsdHMgPSB7CiAgICAgIGluZGV4RGF0YXR5cGU6IGluZGljZXMuQllURVNfUEVSX0VMRU1FTlQgPT09IDIgPyBJbmRleERhdGF0eXBlX2RlZmF1bHQuVU5TSUdORURfU0hPUlQgOiBJbmRleERhdGF0eXBlX2RlZmF1bHQuVU5TSUdORURfSU5ULAogICAgICBjdXJyZW50UG9zaXRpb25zOiBjdXJQb3NpdGlvbnMuYnVmZmVyLAogICAgICBwcmV2aW91c1Bvc2l0aW9uczogcHJldlBvc2l0aW9ucy5idWZmZXIsCiAgICAgIG5leHRQb3NpdGlvbnM6IG5leHRQb3NpdGlvbnMuYnVmZmVyLAogICAgICBleHBhbmRBbmRXaWR0aDogZXhwYW5kQW5kV2lkdGguYnVmZmVyLAogICAgICBiYXRjaElkczogdmVydGV4QmF0Y2hJZHMuYnVmZmVyLAogICAgICBpbmRpY2VzOiBpbmRpY2VzLmJ1ZmZlcgogICAgfTsKICAgIGlmIChwYXJhbWV0ZXJzLmtlZXBEZWNvZGVkUG9zaXRpb25zKSB7CiAgICAgIGNvbnN0IHBvc2l0aW9uT2Zmc2V0cyA9IGdldFBvc2l0aW9uT2Zmc2V0czIoY291bnRzKTsKICAgICAgdHJhbnNmZXJhYmxlT2JqZWN0cy5wdXNoKHBvc2l0aW9ucy5idWZmZXIsIHBvc2l0aW9uT2Zmc2V0cy5idWZmZXIpOwogICAgICByZXN1bHRzID0gY29tYmluZV9kZWZhdWx0KHJlc3VsdHMsIHsKICAgICAgICBkZWNvZGVkUG9zaXRpb25zOiBwb3NpdGlvbnMuYnVmZmVyLAogICAgICAgIGRlY29kZWRQb3NpdGlvbk9mZnNldHM6IHBvc2l0aW9uT2Zmc2V0cy5idWZmZXIKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9CiAgdmFyIHNjcmF0Y2hSZWN0YW5nbGU2LCBzY3JhdGNoRWxsaXBzb2lkMTYsIHNjcmF0Y2hDZW50ZXI3LCBzY3JhdGNoTWluTWF4SGVpZ2h0czIsIHNjcmF0Y2hQMDIsIHNjcmF0Y2hQMTIsIHNjcmF0Y2hQcmV2Miwgc2NyYXRjaEN1ciwgc2NyYXRjaE5leHQyLCBjcmVhdGVWZWN0b3JUaWxlUG9seWxpbmVzX2RlZmF1bHQ7CiAgdmFyIGluaXRfY3JlYXRlVmVjdG9yVGlsZVBvbHlsaW5lcyA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlVmVjdG9yVGlsZVBvbHlsaW5lcy5qcyIoKSB7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X2NvbWJpbmUoKTsKICAgICAgaW5pdF9kZWNvZGVWZWN0b3JQb2x5bGluZVBvc2l0aW9ucygpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X0luZGV4RGF0YXR5cGUoKTsKICAgICAgaW5pdF9SZWN0YW5nbGUoKTsKICAgICAgaW5pdF9jcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyKCk7CiAgICAgIHNjcmF0Y2hSZWN0YW5nbGU2ID0gbmV3IFJlY3RhbmdsZV9kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hFbGxpcHNvaWQxNiA9IG5ldyBFbGxpcHNvaWRfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2VudGVyNyA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaE1pbk1heEhlaWdodHMyID0gewogICAgICAgIG1pbjogdm9pZCAwLAogICAgICAgIG1heDogdm9pZCAwCiAgICAgIH07CiAgICAgIHNjcmF0Y2hQMDIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hQMTIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hQcmV2MiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaEN1ciA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaE5leHQyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjcmVhdGVWZWN0b3JUaWxlUG9seWxpbmVzX2RlZmF1bHQgPSBjcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyX2RlZmF1bHQoY3JlYXRlVmVjdG9yVGlsZVBvbHlsaW5lcyk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9FbGxpcHNvaWRhbE9jY2x1ZGVyLmpzCiAgZnVuY3Rpb24gRWxsaXBzb2lkYWxPY2NsdWRlcihlbGxpcHNvaWQsIGNhbWVyYVBvc2l0aW9uKSB7CiAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImVsbGlwc29pZCIsIGVsbGlwc29pZCk7CiAgICB0aGlzLl9lbGxpcHNvaWQgPSBlbGxpcHNvaWQ7CiAgICB0aGlzLl9jYW1lcmFQb3NpdGlvbiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgIHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5TY2FsZWRTcGFjZSA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgIHRoaXMuX2Rpc3RhbmNlVG9MaW1iSW5TY2FsZWRTcGFjZVNxdWFyZWQgPSAwOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdChjYW1lcmFQb3NpdGlvbikpIHsKICAgICAgdGhpcy5jYW1lcmFQb3NpdGlvbiA9IGNhbWVyYVBvc2l0aW9uOwogICAgfQogIH0KICBmdW5jdGlvbiBnZXRQb3NzaWJseVNocnVua0VsbGlwc29pZChlbGxpcHNvaWQsIG1pbmltdW1IZWlnaHQsIHJlc3VsdCkgewogICAgaWYgKGRlZmluZWRfZGVmYXVsdChtaW5pbXVtSGVpZ2h0KSAmJiBtaW5pbXVtSGVpZ2h0IDwgMCAmJiBlbGxpcHNvaWQubWluaW11bVJhZGl1cyA+IC1taW5pbXVtSGVpZ2h0KSB7CiAgICAgIGNvbnN0IGVsbGlwc29pZFNocnVua1JhZGlpID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21FbGVtZW50cygKICAgICAgICBlbGxpcHNvaWQucmFkaWkueCArIG1pbmltdW1IZWlnaHQsCiAgICAgICAgZWxsaXBzb2lkLnJhZGlpLnkgKyBtaW5pbXVtSGVpZ2h0LAogICAgICAgIGVsbGlwc29pZC5yYWRpaS56ICsgbWluaW11bUhlaWdodCwKICAgICAgICBzY3JhdGNoRWxsaXBzb2lkU2hydW5rUmFkaWkKICAgICAgKTsKICAgICAgZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuZnJvbUNhcnRlc2lhbjMoZWxsaXBzb2lkU2hydW5rUmFkaWksIHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gZWxsaXBzb2lkOwogIH0KICBmdW5jdGlvbiBjb21wdXRlSG9yaXpvbkN1bGxpbmdQb2ludEZyb21Qb3NpdGlvbnMoZWxsaXBzb2lkLCBkaXJlY3Rpb25Ub1BvaW50LCBwb3NpdGlvbnMsIHJlc3VsdCkgewogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJkaXJlY3Rpb25Ub1BvaW50IiwgZGlyZWN0aW9uVG9Qb2ludCk7CiAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoInBvc2l0aW9ucyIsIHBvc2l0aW9ucyk7CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgIHJlc3VsdCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgIH0KICAgIGNvbnN0IHNjYWxlZFNwYWNlRGlyZWN0aW9uVG9Qb2ludCA9IGNvbXB1dGVTY2FsZWRTcGFjZURpcmVjdGlvblRvUG9pbnQoCiAgICAgIGVsbGlwc29pZCwKICAgICAgZGlyZWN0aW9uVG9Qb2ludAogICAgKTsKICAgIGxldCByZXN1bHRNYWduaXR1ZGUgPSAwOwogICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHBvc2l0aW9ucy5sZW5ndGg7IGkgPCBsZW47ICsraSkgewogICAgICBjb25zdCBwb3NpdGlvbiA9IHBvc2l0aW9uc1tpXTsKICAgICAgY29uc3QgY2FuZGlkYXRlTWFnbml0dWRlID0gY29tcHV0ZU1hZ25pdHVkZSgKICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgcG9zaXRpb24sCiAgICAgICAgc2NhbGVkU3BhY2VEaXJlY3Rpb25Ub1BvaW50CiAgICAgICk7CiAgICAgIGlmIChjYW5kaWRhdGVNYWduaXR1ZGUgPCAwKSB7CiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgfQogICAgICByZXN1bHRNYWduaXR1ZGUgPSBNYXRoLm1heChyZXN1bHRNYWduaXR1ZGUsIGNhbmRpZGF0ZU1hZ25pdHVkZSk7CiAgICB9CiAgICByZXR1cm4gbWFnbml0dWRlVG9Qb2ludChzY2FsZWRTcGFjZURpcmVjdGlvblRvUG9pbnQsIHJlc3VsdE1hZ25pdHVkZSwgcmVzdWx0KTsKICB9CiAgZnVuY3Rpb24gY29tcHV0ZUhvcml6b25DdWxsaW5nUG9pbnRGcm9tVmVydGljZXMoZWxsaXBzb2lkLCBkaXJlY3Rpb25Ub1BvaW50LCB2ZXJ0aWNlcywgc3RyaWRlLCBjZW50ZXIsIHJlc3VsdCkgewogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJkaXJlY3Rpb25Ub1BvaW50IiwgZGlyZWN0aW9uVG9Qb2ludCk7CiAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoInZlcnRpY2VzIiwgdmVydGljZXMpOwogICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJzdHJpZGUiLCBzdHJpZGUpOwogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICByZXN1bHQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICB9CiAgICBzdHJpZGUgPSBzdHJpZGUgPz8gMzsKICAgIGNlbnRlciA9IGNlbnRlciA/PyBDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTzsKICAgIGNvbnN0IHNjYWxlZFNwYWNlRGlyZWN0aW9uVG9Qb2ludCA9IGNvbXB1dGVTY2FsZWRTcGFjZURpcmVjdGlvblRvUG9pbnQoCiAgICAgIGVsbGlwc29pZCwKICAgICAgZGlyZWN0aW9uVG9Qb2ludAogICAgKTsKICAgIGxldCByZXN1bHRNYWduaXR1ZGUgPSAwOwogICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSBzdHJpZGUpIHsKICAgICAgcG9zaXRpb25TY3JhdGNoNS54ID0gdmVydGljZXNbaV0gKyBjZW50ZXIueDsKICAgICAgcG9zaXRpb25TY3JhdGNoNS55ID0gdmVydGljZXNbaSArIDFdICsgY2VudGVyLnk7CiAgICAgIHBvc2l0aW9uU2NyYXRjaDUueiA9IHZlcnRpY2VzW2kgKyAyXSArIGNlbnRlci56OwogICAgICBjb25zdCBjYW5kaWRhdGVNYWduaXR1ZGUgPSBjb21wdXRlTWFnbml0dWRlKAogICAgICAgIGVsbGlwc29pZCwKICAgICAgICBwb3NpdGlvblNjcmF0Y2g1LAogICAgICAgIHNjYWxlZFNwYWNlRGlyZWN0aW9uVG9Qb2ludAogICAgICApOwogICAgICBpZiAoY2FuZGlkYXRlTWFnbml0dWRlIDwgMCkgewogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH0KICAgICAgcmVzdWx0TWFnbml0dWRlID0gTWF0aC5tYXgocmVzdWx0TWFnbml0dWRlLCBjYW5kaWRhdGVNYWduaXR1ZGUpOwogICAgfQogICAgcmV0dXJuIG1hZ25pdHVkZVRvUG9pbnQoc2NhbGVkU3BhY2VEaXJlY3Rpb25Ub1BvaW50LCByZXN1bHRNYWduaXR1ZGUsIHJlc3VsdCk7CiAgfQogIGZ1bmN0aW9uIGlzU2NhbGVkU3BhY2VQb2ludFZpc2libGUob2NjbHVkZWVTY2FsZWRTcGFjZVBvc2l0aW9uLCBjYW1lcmFQb3NpdGlvbkluU2NhbGVkU3BhY2UsIGRpc3RhbmNlVG9MaW1iSW5TY2FsZWRTcGFjZVNxdWFyZWQpIHsKICAgIGNvbnN0IGN2ID0gY2FtZXJhUG9zaXRpb25JblNjYWxlZFNwYWNlOwogICAgY29uc3QgdmhNYWduaXR1ZGVTcXVhcmVkID0gZGlzdGFuY2VUb0xpbWJJblNjYWxlZFNwYWNlU3F1YXJlZDsKICAgIGNvbnN0IHZ0ID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KAogICAgICBvY2NsdWRlZVNjYWxlZFNwYWNlUG9zaXRpb24sCiAgICAgIGN2LAogICAgICBzY3JhdGNoQ2FydGVzaWFuMTkKICAgICk7CiAgICBjb25zdCB2dERvdFZjID0gLUNhcnRlc2lhbjNfZGVmYXVsdC5kb3QodnQsIGN2KTsKICAgIGNvbnN0IGlzT2NjbHVkZWQgPSB2aE1hZ25pdHVkZVNxdWFyZWQgPCAwID8gdnREb3RWYyA+IDAgOiB2dERvdFZjID4gdmhNYWduaXR1ZGVTcXVhcmVkICYmIHZ0RG90VmMgKiB2dERvdFZjIC8gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZVNxdWFyZWQodnQpID4gdmhNYWduaXR1ZGVTcXVhcmVkOwogICAgcmV0dXJuICFpc09jY2x1ZGVkOwogIH0KICBmdW5jdGlvbiBjb21wdXRlTWFnbml0dWRlKGVsbGlwc29pZCwgcG9zaXRpb24sIHNjYWxlZFNwYWNlRGlyZWN0aW9uVG9Qb2ludCkgewogICAgY29uc3Qgc2NhbGVkU3BhY2VQb3NpdGlvbiA9IGVsbGlwc29pZC50cmFuc2Zvcm1Qb3NpdGlvblRvU2NhbGVkU3BhY2UoCiAgICAgIHBvc2l0aW9uLAogICAgICBzY2FsZWRTcGFjZVNjcmF0Y2gKICAgICk7CiAgICBsZXQgbWFnbml0dWRlU3F1YXJlZCA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGVTcXVhcmVkKHNjYWxlZFNwYWNlUG9zaXRpb24pOwogICAgbGV0IG1hZ25pdHVkZSA9IE1hdGguc3FydChtYWduaXR1ZGVTcXVhcmVkKTsKICAgIGNvbnN0IGRpcmVjdGlvbjIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZGl2aWRlQnlTY2FsYXIoCiAgICAgIHNjYWxlZFNwYWNlUG9zaXRpb24sCiAgICAgIG1hZ25pdHVkZSwKICAgICAgZGlyZWN0aW9uU2NyYXRjaAogICAgKTsKICAgIG1hZ25pdHVkZVNxdWFyZWQgPSBNYXRoLm1heCgxLCBtYWduaXR1ZGVTcXVhcmVkKTsKICAgIG1hZ25pdHVkZSA9IE1hdGgubWF4KDEsIG1hZ25pdHVkZSk7CiAgICBjb25zdCBjb3NBbHBoYSA9IENhcnRlc2lhbjNfZGVmYXVsdC5kb3QoZGlyZWN0aW9uMiwgc2NhbGVkU3BhY2VEaXJlY3Rpb25Ub1BvaW50KTsKICAgIGNvbnN0IHNpbkFscGhhID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZSgKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKGRpcmVjdGlvbjIsIHNjYWxlZFNwYWNlRGlyZWN0aW9uVG9Qb2ludCwgZGlyZWN0aW9uMikKICAgICk7CiAgICBjb25zdCBjb3NCZXRhID0gMSAvIG1hZ25pdHVkZTsKICAgIGNvbnN0IHNpbkJldGEgPSBNYXRoLnNxcnQobWFnbml0dWRlU3F1YXJlZCAtIDEpICogY29zQmV0YTsKICAgIHJldHVybiAxIC8gKGNvc0FscGhhICogY29zQmV0YSAtIHNpbkFscGhhICogc2luQmV0YSk7CiAgfQogIGZ1bmN0aW9uIG1hZ25pdHVkZVRvUG9pbnQoc2NhbGVkU3BhY2VEaXJlY3Rpb25Ub1BvaW50LCByZXN1bHRNYWduaXR1ZGUsIHJlc3VsdCkgewogICAgaWYgKHJlc3VsdE1hZ25pdHVkZSA8PSAwIHx8IHJlc3VsdE1hZ25pdHVkZSA9PT0gMSAvIDAgfHwgcmVzdWx0TWFnbml0dWRlICE9PSByZXN1bHRNYWduaXR1ZGUpIHsKICAgICAgcmV0dXJuIHZvaWQgMDsKICAgIH0KICAgIHJldHVybiBDYXJ0ZXNpYW4zX2RlZmF1bHQubXVsdGlwbHlCeVNjYWxhcigKICAgICAgc2NhbGVkU3BhY2VEaXJlY3Rpb25Ub1BvaW50LAogICAgICByZXN1bHRNYWduaXR1ZGUsCiAgICAgIHJlc3VsdAogICAgKTsKICB9CiAgZnVuY3Rpb24gY29tcHV0ZVNjYWxlZFNwYWNlRGlyZWN0aW9uVG9Qb2ludChlbGxpcHNvaWQsIGRpcmVjdGlvblRvUG9pbnQpIHsKICAgIGlmIChDYXJ0ZXNpYW4zX2RlZmF1bHQuZXF1YWxzKGRpcmVjdGlvblRvUG9pbnQsIENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPKSkgewogICAgICByZXR1cm4gZGlyZWN0aW9uVG9Qb2ludDsKICAgIH0KICAgIGVsbGlwc29pZC50cmFuc2Zvcm1Qb3NpdGlvblRvU2NhbGVkU3BhY2UoCiAgICAgIGRpcmVjdGlvblRvUG9pbnQsCiAgICAgIGRpcmVjdGlvblRvUG9pbnRTY3JhdGNoCiAgICApOwogICAgcmV0dXJuIENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoZGlyZWN0aW9uVG9Qb2ludFNjcmF0Y2gsIGRpcmVjdGlvblRvUG9pbnRTY3JhdGNoKTsKICB9CiAgdmFyIHNjcmF0Y2hDYXJ0ZXNpYW4xOSwgc2NyYXRjaENhbWVyYVBvc2l0aW9uSW5TY2FsZWRTcGFjZVNocnVuaywgc2NyYXRjaEVsbGlwc29pZFNocnVuaywgc3Vic2FtcGxlU2NyYXRjaCwgc2NyYXRjaEVsbGlwc29pZFNocnVua1JhZGlpLCBwb3NpdGlvblNjcmF0Y2g1LCBzY2FsZWRTcGFjZVNjcmF0Y2gsIGRpcmVjdGlvblNjcmF0Y2gsIGRpcmVjdGlvblRvUG9pbnRTY3JhdGNoLCBFbGxpcHNvaWRhbE9jY2x1ZGVyX2RlZmF1bHQ7CiAgdmFyIGluaXRfRWxsaXBzb2lkYWxPY2NsdWRlciA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvRWxsaXBzb2lkYWxPY2NsdWRlci5qcyIoKSB7CiAgICAgIGluaXRfQm91bmRpbmdTcGhlcmUoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfUmVjdGFuZ2xlKCk7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEVsbGlwc29pZGFsT2NjbHVkZXIucHJvdG90eXBlLCB7CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgb2NjbHVkaW5nIGVsbGlwc29pZC4KICAgICAgICAgKiBAbWVtYmVyb2YgRWxsaXBzb2lkYWxPY2NsdWRlci5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7RWxsaXBzb2lkfQogICAgICAgICAqLwogICAgICAgIGVsbGlwc29pZDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VsbGlwc29pZDsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgb3Igc2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIGNhbWVyYS4KICAgICAgICAgKiBAbWVtYmVyb2YgRWxsaXBzb2lkYWxPY2NsdWRlci5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7Q2FydGVzaWFuM30KICAgICAgICAgKi8KICAgICAgICBjYW1lcmFQb3NpdGlvbjogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbWVyYVBvc2l0aW9uOwogICAgICAgICAgfSwKICAgICAgICAgIHNldDogZnVuY3Rpb24oY2FtZXJhUG9zaXRpb24pIHsKICAgICAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gdGhpcy5fZWxsaXBzb2lkOwogICAgICAgICAgICBjb25zdCBjdiA9IGVsbGlwc29pZC50cmFuc2Zvcm1Qb3NpdGlvblRvU2NhbGVkU3BhY2UoCiAgICAgICAgICAgICAgY2FtZXJhUG9zaXRpb24sCiAgICAgICAgICAgICAgdGhpcy5fY2FtZXJhUG9zaXRpb25JblNjYWxlZFNwYWNlCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNvbnN0IHZoTWFnbml0dWRlU3F1YXJlZCA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGVTcXVhcmVkKGN2KSAtIDE7CiAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShjYW1lcmFQb3NpdGlvbiwgdGhpcy5fY2FtZXJhUG9zaXRpb24pOwogICAgICAgICAgICB0aGlzLl9jYW1lcmFQb3NpdGlvbkluU2NhbGVkU3BhY2UgPSBjdjsKICAgICAgICAgICAgdGhpcy5fZGlzdGFuY2VUb0xpbWJJblNjYWxlZFNwYWNlU3F1YXJlZCA9IHZoTWFnbml0dWRlU3F1YXJlZDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBzY3JhdGNoQ2FydGVzaWFuMTkgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIEVsbGlwc29pZGFsT2NjbHVkZXIucHJvdG90eXBlLmlzUG9pbnRWaXNpYmxlID0gZnVuY3Rpb24ob2NjbHVkZWUpIHsKICAgICAgICBjb25zdCBlbGxpcHNvaWQgPSB0aGlzLl9lbGxpcHNvaWQ7CiAgICAgICAgY29uc3Qgb2NjbHVkZWVTY2FsZWRTcGFjZVBvc2l0aW9uID0gZWxsaXBzb2lkLnRyYW5zZm9ybVBvc2l0aW9uVG9TY2FsZWRTcGFjZSgKICAgICAgICAgIG9jY2x1ZGVlLAogICAgICAgICAgc2NyYXRjaENhcnRlc2lhbjE5CiAgICAgICAgKTsKICAgICAgICByZXR1cm4gaXNTY2FsZWRTcGFjZVBvaW50VmlzaWJsZSgKICAgICAgICAgIG9jY2x1ZGVlU2NhbGVkU3BhY2VQb3NpdGlvbiwKICAgICAgICAgIHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5TY2FsZWRTcGFjZSwKICAgICAgICAgIHRoaXMuX2Rpc3RhbmNlVG9MaW1iSW5TY2FsZWRTcGFjZVNxdWFyZWQKICAgICAgICApOwogICAgICB9OwogICAgICBFbGxpcHNvaWRhbE9jY2x1ZGVyLnByb3RvdHlwZS5pc1NjYWxlZFNwYWNlUG9pbnRWaXNpYmxlID0gZnVuY3Rpb24ob2NjbHVkZWVTY2FsZWRTcGFjZVBvc2l0aW9uKSB7CiAgICAgICAgcmV0dXJuIGlzU2NhbGVkU3BhY2VQb2ludFZpc2libGUoCiAgICAgICAgICBvY2NsdWRlZVNjYWxlZFNwYWNlUG9zaXRpb24sCiAgICAgICAgICB0aGlzLl9jYW1lcmFQb3NpdGlvbkluU2NhbGVkU3BhY2UsCiAgICAgICAgICB0aGlzLl9kaXN0YW5jZVRvTGltYkluU2NhbGVkU3BhY2VTcXVhcmVkCiAgICAgICAgKTsKICAgICAgfTsKICAgICAgc2NyYXRjaENhbWVyYVBvc2l0aW9uSW5TY2FsZWRTcGFjZVNocnVuayA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgRWxsaXBzb2lkYWxPY2NsdWRlci5wcm90b3R5cGUuaXNTY2FsZWRTcGFjZVBvaW50VmlzaWJsZVBvc3NpYmx5VW5kZXJFbGxpcHNvaWQgPSBmdW5jdGlvbihvY2NsdWRlZVNjYWxlZFNwYWNlUG9zaXRpb24sIG1pbmltdW1IZWlnaHQpIHsKICAgICAgICBjb25zdCBlbGxpcHNvaWQgPSB0aGlzLl9lbGxpcHNvaWQ7CiAgICAgICAgbGV0IHZoTWFnbml0dWRlU3F1YXJlZDsKICAgICAgICBsZXQgY3Y7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChtaW5pbXVtSGVpZ2h0KSAmJiBtaW5pbXVtSGVpZ2h0IDwgMCAmJiBlbGxpcHNvaWQubWluaW11bVJhZGl1cyA+IC1taW5pbXVtSGVpZ2h0KSB7CiAgICAgICAgICBjdiA9IHNjcmF0Y2hDYW1lcmFQb3NpdGlvbkluU2NhbGVkU3BhY2VTaHJ1bms7CiAgICAgICAgICBjdi54ID0gdGhpcy5fY2FtZXJhUG9zaXRpb24ueCAvIChlbGxpcHNvaWQucmFkaWkueCArIG1pbmltdW1IZWlnaHQpOwogICAgICAgICAgY3YueSA9IHRoaXMuX2NhbWVyYVBvc2l0aW9uLnkgLyAoZWxsaXBzb2lkLnJhZGlpLnkgKyBtaW5pbXVtSGVpZ2h0KTsKICAgICAgICAgIGN2LnogPSB0aGlzLl9jYW1lcmFQb3NpdGlvbi56IC8gKGVsbGlwc29pZC5yYWRpaS56ICsgbWluaW11bUhlaWdodCk7CiAgICAgICAgICB2aE1hZ25pdHVkZVNxdWFyZWQgPSBjdi54ICogY3YueCArIGN2LnkgKiBjdi55ICsgY3YueiAqIGN2LnogLSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdiA9IHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5TY2FsZWRTcGFjZTsKICAgICAgICAgIHZoTWFnbml0dWRlU3F1YXJlZCA9IHRoaXMuX2Rpc3RhbmNlVG9MaW1iSW5TY2FsZWRTcGFjZVNxdWFyZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpc1NjYWxlZFNwYWNlUG9pbnRWaXNpYmxlKAogICAgICAgICAgb2NjbHVkZWVTY2FsZWRTcGFjZVBvc2l0aW9uLAogICAgICAgICAgY3YsCiAgICAgICAgICB2aE1hZ25pdHVkZVNxdWFyZWQKICAgICAgICApOwogICAgICB9OwogICAgICBFbGxpcHNvaWRhbE9jY2x1ZGVyLnByb3RvdHlwZS5jb21wdXRlSG9yaXpvbkN1bGxpbmdQb2ludCA9IGZ1bmN0aW9uKGRpcmVjdGlvblRvUG9pbnQsIHBvc2l0aW9ucywgcmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIGNvbXB1dGVIb3Jpem9uQ3VsbGluZ1BvaW50RnJvbVBvc2l0aW9ucygKICAgICAgICAgIHRoaXMuX2VsbGlwc29pZCwKICAgICAgICAgIGRpcmVjdGlvblRvUG9pbnQsCiAgICAgICAgICBwb3NpdGlvbnMsCiAgICAgICAgICByZXN1bHQKICAgICAgICApOwogICAgICB9OwogICAgICBzY3JhdGNoRWxsaXBzb2lkU2hydW5rID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUoRWxsaXBzb2lkX2RlZmF1bHQuVU5JVF9TUEhFUkUpOwogICAgICBFbGxpcHNvaWRhbE9jY2x1ZGVyLnByb3RvdHlwZS5jb21wdXRlSG9yaXpvbkN1bGxpbmdQb2ludFBvc3NpYmx5VW5kZXJFbGxpcHNvaWQgPSBmdW5jdGlvbihkaXJlY3Rpb25Ub1BvaW50LCBwb3NpdGlvbnMsIG1pbmltdW1IZWlnaHQsIHJlc3VsdCkgewogICAgICAgIGNvbnN0IHBvc3NpYmx5U2hydW5rRWxsaXBzb2lkID0gZ2V0UG9zc2libHlTaHJ1bmtFbGxpcHNvaWQoCiAgICAgICAgICB0aGlzLl9lbGxpcHNvaWQsCiAgICAgICAgICBtaW5pbXVtSGVpZ2h0LAogICAgICAgICAgc2NyYXRjaEVsbGlwc29pZFNocnVuawogICAgICAgICk7CiAgICAgICAgcmV0dXJuIGNvbXB1dGVIb3Jpem9uQ3VsbGluZ1BvaW50RnJvbVBvc2l0aW9ucygKICAgICAgICAgIHBvc3NpYmx5U2hydW5rRWxsaXBzb2lkLAogICAgICAgICAgZGlyZWN0aW9uVG9Qb2ludCwKICAgICAgICAgIHBvc2l0aW9ucywKICAgICAgICAgIHJlc3VsdAogICAgICAgICk7CiAgICAgIH07CiAgICAgIEVsbGlwc29pZGFsT2NjbHVkZXIucHJvdG90eXBlLmNvbXB1dGVIb3Jpem9uQ3VsbGluZ1BvaW50RnJvbVZlcnRpY2VzID0gZnVuY3Rpb24oZGlyZWN0aW9uVG9Qb2ludCwgdmVydGljZXMsIHN0cmlkZSwgY2VudGVyLCByZXN1bHQpIHsKICAgICAgICByZXR1cm4gY29tcHV0ZUhvcml6b25DdWxsaW5nUG9pbnRGcm9tVmVydGljZXMoCiAgICAgICAgICB0aGlzLl9lbGxpcHNvaWQsCiAgICAgICAgICBkaXJlY3Rpb25Ub1BvaW50LAogICAgICAgICAgdmVydGljZXMsCiAgICAgICAgICBzdHJpZGUsCiAgICAgICAgICBjZW50ZXIsCiAgICAgICAgICByZXN1bHQKICAgICAgICApOwogICAgICB9OwogICAgICBFbGxpcHNvaWRhbE9jY2x1ZGVyLnByb3RvdHlwZS5jb21wdXRlSG9yaXpvbkN1bGxpbmdQb2ludEZyb21WZXJ0aWNlc1Bvc3NpYmx5VW5kZXJFbGxpcHNvaWQgPSBmdW5jdGlvbihkaXJlY3Rpb25Ub1BvaW50LCB2ZXJ0aWNlcywgc3RyaWRlLCBjZW50ZXIsIG1pbmltdW1IZWlnaHQsIHJlc3VsdCkgewogICAgICAgIGNvbnN0IHBvc3NpYmx5U2hydW5rRWxsaXBzb2lkID0gZ2V0UG9zc2libHlTaHJ1bmtFbGxpcHNvaWQoCiAgICAgICAgICB0aGlzLl9lbGxpcHNvaWQsCiAgICAgICAgICBtaW5pbXVtSGVpZ2h0LAogICAgICAgICAgc2NyYXRjaEVsbGlwc29pZFNocnVuawogICAgICAgICk7CiAgICAgICAgcmV0dXJuIGNvbXB1dGVIb3Jpem9uQ3VsbGluZ1BvaW50RnJvbVZlcnRpY2VzKAogICAgICAgICAgcG9zc2libHlTaHJ1bmtFbGxpcHNvaWQsCiAgICAgICAgICBkaXJlY3Rpb25Ub1BvaW50LAogICAgICAgICAgdmVydGljZXMsCiAgICAgICAgICBzdHJpZGUsCiAgICAgICAgICBjZW50ZXIsCiAgICAgICAgICByZXN1bHQKICAgICAgICApOwogICAgICB9OwogICAgICBzdWJzYW1wbGVTY3JhdGNoID0gW107CiAgICAgIEVsbGlwc29pZGFsT2NjbHVkZXIucHJvdG90eXBlLmNvbXB1dGVIb3Jpem9uQ3VsbGluZ1BvaW50RnJvbVJlY3RhbmdsZSA9IGZ1bmN0aW9uKHJlY3RhbmdsZSwgZWxsaXBzb2lkLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsIHJlY3RhbmdsZSk7CiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gUmVjdGFuZ2xlX2RlZmF1bHQuc3Vic2FtcGxlKAogICAgICAgICAgcmVjdGFuZ2xlLAogICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgMCwKICAgICAgICAgIHN1YnNhbXBsZVNjcmF0Y2gKICAgICAgICApOwogICAgICAgIGNvbnN0IGJzID0gQm91bmRpbmdTcGhlcmVfZGVmYXVsdC5mcm9tUG9pbnRzKHBvc2l0aW9ucyk7CiAgICAgICAgaWYgKENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUoYnMuY2VudGVyKSA8IDAuMSAqIGVsbGlwc29pZC5taW5pbXVtUmFkaXVzKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlSG9yaXpvbkN1bGxpbmdQb2ludChicy5jZW50ZXIsIHBvc2l0aW9ucywgcmVzdWx0KTsKICAgICAgfTsKICAgICAgc2NyYXRjaEVsbGlwc29pZFNocnVua1JhZGlpID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBwb3NpdGlvblNjcmF0Y2g1ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY2FsZWRTcGFjZVNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGRpcmVjdGlvblNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGRpcmVjdGlvblRvUG9pbnRTY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBFbGxpcHNvaWRhbE9jY2x1ZGVyX2RlZmF1bHQgPSBFbGxpcHNvaWRhbE9jY2x1ZGVyOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvVmVydGljYWxFeGFnZ2VyYXRpb24uanMKICB2YXIgVmVydGljYWxFeGFnZ2VyYXRpb24sIHNjcmF0Y2hDYXJ0b2dyYXBoaWM2LCBWZXJ0aWNhbEV4YWdnZXJhdGlvbl9kZWZhdWx0OwogIHZhciBpbml0X1ZlcnRpY2FsRXhhZ2dlcmF0aW9uID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9WZXJ0aWNhbEV4YWdnZXJhdGlvbi5qcyIoKSB7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRvZ3JhcGhpYygpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBWZXJ0aWNhbEV4YWdnZXJhdGlvbiA9IHt9OwogICAgICBWZXJ0aWNhbEV4YWdnZXJhdGlvbi5nZXRIZWlnaHQgPSBmdW5jdGlvbihoZWlnaHQsIHNjYWxlLCByZWxhdGl2ZUhlaWdodCkgewogICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHNjYWxlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInNjYWxlIG11c3QgYmUgYSBmaW5pdGUgbnVtYmVyLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShyZWxhdGl2ZUhlaWdodCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJyZWxhdGl2ZUhlaWdodCBtdXN0IGJlIGEgZmluaXRlIG51bWJlci4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIChoZWlnaHQgLSByZWxhdGl2ZUhlaWdodCkgKiBzY2FsZSArIHJlbGF0aXZlSGVpZ2h0OwogICAgICB9OwogICAgICBzY3JhdGNoQ2FydG9ncmFwaGljNiA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBWZXJ0aWNhbEV4YWdnZXJhdGlvbi5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKHBvc2l0aW9uLCBlbGxpcHNvaWQsIHZlcnRpY2FsRXhhZ2dlcmF0aW9uLCB2ZXJ0aWNhbEV4YWdnZXJhdGlvblJlbGF0aXZlSGVpZ2h0LCByZXN1bHQpIHsKICAgICAgICBjb25zdCBjYXJ0b2dyYXBoaWMyID0gZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKAogICAgICAgICAgcG9zaXRpb24sCiAgICAgICAgICBzY3JhdGNoQ2FydG9ncmFwaGljNgogICAgICAgICk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoY2FydG9ncmFwaGljMikpIHsKICAgICAgICAgIHJldHVybiBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUocG9zaXRpb24sIHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG5ld0hlaWdodCA9IFZlcnRpY2FsRXhhZ2dlcmF0aW9uLmdldEhlaWdodCgKICAgICAgICAgIGNhcnRvZ3JhcGhpYzIuaGVpZ2h0LAogICAgICAgICAgdmVydGljYWxFeGFnZ2VyYXRpb24sCiAgICAgICAgICB2ZXJ0aWNhbEV4YWdnZXJhdGlvblJlbGF0aXZlSGVpZ2h0CiAgICAgICAgKTsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21SYWRpYW5zKAogICAgICAgICAgY2FydG9ncmFwaGljMi5sb25naXR1ZGUsCiAgICAgICAgICBjYXJ0b2dyYXBoaWMyLmxhdGl0dWRlLAogICAgICAgICAgbmV3SGVpZ2h0LAogICAgICAgICAgZWxsaXBzb2lkLAogICAgICAgICAgcmVzdWx0CiAgICAgICAgKTsKICAgICAgfTsKICAgICAgVmVydGljYWxFeGFnZ2VyYXRpb25fZGVmYXVsdCA9IFZlcnRpY2FsRXhhZ2dlcmF0aW9uOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvVGVycmFpblF1YW50aXphdGlvbi5qcwogIHZhciBUZXJyYWluUXVhbnRpemF0aW9uLCBUZXJyYWluUXVhbnRpemF0aW9uX2RlZmF1bHQ7CiAgdmFyIGluaXRfVGVycmFpblF1YW50aXphdGlvbiA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvVGVycmFpblF1YW50aXphdGlvbi5qcyIoKSB7CiAgICAgIFRlcnJhaW5RdWFudGl6YXRpb24gPSB7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHZlcnRpY2VzIGFyZSBub3QgY29tcHJlc3NlZC4KICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgTk9ORTogMCwKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgdmVydGljZXMgYXJlIGNvbXByZXNzZWQgdG8gMTIgYml0cy4KICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgQklUUzEyOiAxCiAgICAgIH07CiAgICAgIFRlcnJhaW5RdWFudGl6YXRpb25fZGVmYXVsdCA9IE9iamVjdC5mcmVlemUoVGVycmFpblF1YW50aXphdGlvbik7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9UZXJyYWluRW5jb2RpbmcuanMKICBmdW5jdGlvbiBUZXJyYWluRW5jb2RpbmcoY2VudGVyLCBheGlzQWxpZ25lZEJvdW5kaW5nQm94LCBtaW5pbXVtSGVpZ2h0LCBtYXhpbXVtSGVpZ2h0LCBmcm9tRU5VLCBoYXNWZXJ0ZXhOb3JtYWxzLCBoYXNXZWJNZXJjYXRvclQsIGhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHMsIGV4YWdnZXJhdGlvbiwgZXhhZ2dlcmF0aW9uUmVsYXRpdmVIZWlnaHQpIHsKICAgIGxldCBxdWFudGl6YXRpb24gPSBUZXJyYWluUXVhbnRpemF0aW9uX2RlZmF1bHQuTk9ORTsKICAgIGxldCB0b0VOVTsKICAgIGxldCBtYXRyaXg7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGF4aXNBbGlnbmVkQm91bmRpbmdCb3gpICYmIGRlZmluZWRfZGVmYXVsdChtaW5pbXVtSGVpZ2h0KSAmJiBkZWZpbmVkX2RlZmF1bHQobWF4aW11bUhlaWdodCkgJiYgZGVmaW5lZF9kZWZhdWx0KGZyb21FTlUpKSB7CiAgICAgIGNvbnN0IG1pbmltdW0gPSBheGlzQWxpZ25lZEJvdW5kaW5nQm94Lm1pbmltdW07CiAgICAgIGNvbnN0IG1heGltdW0gPSBheGlzQWxpZ25lZEJvdW5kaW5nQm94Lm1heGltdW07CiAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuc3VidHJhY3QoCiAgICAgICAgbWF4aW11bSwKICAgICAgICBtaW5pbXVtLAogICAgICAgIGNhcnRlc2lhbjNEaW1TY3JhdGNoCiAgICAgICk7CiAgICAgIGNvbnN0IGhEaW0gPSBtYXhpbXVtSGVpZ2h0IC0gbWluaW11bUhlaWdodDsKICAgICAgY29uc3QgbWF4RGltID0gTWF0aC5tYXgoQ2FydGVzaWFuM19kZWZhdWx0Lm1heGltdW1Db21wb25lbnQoZGltZW5zaW9ucyksIGhEaW0pOwogICAgICBpZiAobWF4RGltIDwgU0hJRlRfTEVGVF8xMiAtIDEpIHsKICAgICAgICBxdWFudGl6YXRpb24gPSBUZXJyYWluUXVhbnRpemF0aW9uX2RlZmF1bHQuQklUUzEyOwogICAgICB9IGVsc2UgewogICAgICAgIHF1YW50aXphdGlvbiA9IFRlcnJhaW5RdWFudGl6YXRpb25fZGVmYXVsdC5OT05FOwogICAgICB9CiAgICAgIHRvRU5VID0gTWF0cml4NF9kZWZhdWx0LmludmVyc2VUcmFuc2Zvcm1hdGlvbihmcm9tRU5VLCBuZXcgTWF0cml4NF9kZWZhdWx0KCkpOwogICAgICBjb25zdCB0cmFuc2xhdGlvbjIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubmVnYXRlKG1pbmltdW0sIGNhcnRlc2lhbjNTY3JhdGNoKTsKICAgICAgTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5KAogICAgICAgIE1hdHJpeDRfZGVmYXVsdC5mcm9tVHJhbnNsYXRpb24odHJhbnNsYXRpb24yLCBtYXRyaXg0U2NyYXRjaCksCiAgICAgICAgdG9FTlUsCiAgICAgICAgdG9FTlUKICAgICAgKTsKICAgICAgY29uc3Qgc2NhbGUgPSBjYXJ0ZXNpYW4zU2NyYXRjaDsKICAgICAgc2NhbGUueCA9IDEgLyBkaW1lbnNpb25zLng7CiAgICAgIHNjYWxlLnkgPSAxIC8gZGltZW5zaW9ucy55OwogICAgICBzY2FsZS56ID0gMSAvIGRpbWVuc2lvbnMuejsKICAgICAgTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5KE1hdHJpeDRfZGVmYXVsdC5mcm9tU2NhbGUoc2NhbGUsIG1hdHJpeDRTY3JhdGNoKSwgdG9FTlUsIHRvRU5VKTsKICAgICAgbWF0cml4ID0gTWF0cml4NF9kZWZhdWx0LmNsb25lKGZyb21FTlUpOwogICAgICBNYXRyaXg0X2RlZmF1bHQuc2V0VHJhbnNsYXRpb24obWF0cml4LCBDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTywgbWF0cml4KTsKICAgICAgZnJvbUVOVSA9IE1hdHJpeDRfZGVmYXVsdC5jbG9uZShmcm9tRU5VLCBuZXcgTWF0cml4NF9kZWZhdWx0KCkpOwogICAgICBjb25zdCB0cmFuc2xhdGlvbk1hdHJpeCA9IE1hdHJpeDRfZGVmYXVsdC5mcm9tVHJhbnNsYXRpb24obWluaW11bSwgbWF0cml4NFNjcmF0Y2gpOwogICAgICBjb25zdCBzY2FsZU1hdHJpeDIgPSBNYXRyaXg0X2RlZmF1bHQuZnJvbVNjYWxlKGRpbWVuc2lvbnMsIG1hdHJpeDRTY3JhdGNoMik7CiAgICAgIGNvbnN0IHN0ID0gTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5KHRyYW5zbGF0aW9uTWF0cml4LCBzY2FsZU1hdHJpeDIsIG1hdHJpeDRTY3JhdGNoKTsKICAgICAgTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5KGZyb21FTlUsIHN0LCBmcm9tRU5VKTsKICAgICAgTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5KG1hdHJpeCwgc3QsIG1hdHJpeCk7CiAgICB9CiAgICB0aGlzLnF1YW50aXphdGlvbiA9IHF1YW50aXphdGlvbjsKICAgIHRoaXMubWluaW11bUhlaWdodCA9IG1pbmltdW1IZWlnaHQ7CiAgICB0aGlzLm1heGltdW1IZWlnaHQgPSBtYXhpbXVtSGVpZ2h0OwogICAgdGhpcy5jZW50ZXIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuY2xvbmUoY2VudGVyKTsKICAgIHRoaXMudG9TY2FsZWRFTlUgPSB0b0VOVTsKICAgIHRoaXMuZnJvbVNjYWxlZEVOVSA9IGZyb21FTlU7CiAgICB0aGlzLm1hdHJpeCA9IG1hdHJpeDsKICAgIHRoaXMuaGFzVmVydGV4Tm9ybWFscyA9IGhhc1ZlcnRleE5vcm1hbHM7CiAgICB0aGlzLmhhc1dlYk1lcmNhdG9yVCA9IGhhc1dlYk1lcmNhdG9yVCA/PyBmYWxzZTsKICAgIHRoaXMuaGFzR2VvZGV0aWNTdXJmYWNlTm9ybWFscyA9IGhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHMgPz8gZmFsc2U7CiAgICB0aGlzLmV4YWdnZXJhdGlvbiA9IGV4YWdnZXJhdGlvbiA/PyAxOwogICAgdGhpcy5leGFnZ2VyYXRpb25SZWxhdGl2ZUhlaWdodCA9IGV4YWdnZXJhdGlvblJlbGF0aXZlSGVpZ2h0ID8/IDA7CiAgICB0aGlzLnN0cmlkZSA9IDA7CiAgICB0aGlzLl9vZmZzZXRHZW9kZXRpY1N1cmZhY2VOb3JtYWwgPSAwOwogICAgdGhpcy5fb2Zmc2V0VmVydGV4Tm9ybWFsID0gMDsKICAgIHRoaXMuX2NhbGN1bGF0ZVN0cmlkZUFuZE9mZnNldHMoKTsKICB9CiAgdmFyIGNhcnRlc2lhbjNTY3JhdGNoLCBjYXJ0ZXNpYW4zRGltU2NyYXRjaCwgY2FydGVzaWFuMlNjcmF0Y2gsIG1hdHJpeDRTY3JhdGNoLCBtYXRyaXg0U2NyYXRjaDIsIFNISUZUX0xFRlRfMTIsIHNjcmF0Y2hQb3NpdGlvbjYsIHNjcmF0Y2hHZW9kZXRpY1N1cmZhY2VOb3JtYWwsIGF0dHJpYnV0ZXNJbmRpY2VzTm9uZSwgYXR0cmlidXRlc0luZGljZXNCaXRzMTIsIFRlcnJhaW5FbmNvZGluZ19kZWZhdWx0OwogIHZhciBpbml0X1RlcnJhaW5FbmNvZGluZyA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvVGVycmFpbkVuY29kaW5nLmpzIigpIHsKICAgICAgaW5pdF9BdHRyaWJ1dGVDb21wcmVzc2lvbigpOwogICAgICBpbml0X0NhcnRlc2lhbjIoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ29tcG9uZW50RGF0YXR5cGUoKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBpbml0X01hdHJpeDQoKTsKICAgICAgaW5pdF9WZXJ0aWNhbEV4YWdnZXJhdGlvbigpOwogICAgICBpbml0X1RlcnJhaW5RdWFudGl6YXRpb24oKTsKICAgICAgY2FydGVzaWFuM1NjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGNhcnRlc2lhbjNEaW1TY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYXJ0ZXNpYW4yU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4yX2RlZmF1bHQoKTsKICAgICAgbWF0cml4NFNjcmF0Y2ggPSBuZXcgTWF0cml4NF9kZWZhdWx0KCk7CiAgICAgIG1hdHJpeDRTY3JhdGNoMiA9IG5ldyBNYXRyaXg0X2RlZmF1bHQoKTsKICAgICAgU0hJRlRfTEVGVF8xMiA9IE1hdGgucG93KDIsIDEyKTsKICAgICAgVGVycmFpbkVuY29kaW5nLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbih2ZXJ0ZXhCdWZmZXIsIGJ1ZmZlckluZGV4LCBwb3NpdGlvbiwgdXYsIGhlaWdodCwgbm9ybWFsVG9QYWNrLCB3ZWJNZXJjYXRvclQsIGdlb2RldGljU3VyZmFjZU5vcm1hbCkgewogICAgICAgIGNvbnN0IHUzID0gdXYueDsKICAgICAgICBjb25zdCB2MyA9IHV2Lnk7CiAgICAgICAgaWYgKHRoaXMucXVhbnRpemF0aW9uID09PSBUZXJyYWluUXVhbnRpemF0aW9uX2RlZmF1bHQuQklUUzEyKSB7CiAgICAgICAgICBwb3NpdGlvbiA9IE1hdHJpeDRfZGVmYXVsdC5tdWx0aXBseUJ5UG9pbnQoCiAgICAgICAgICAgIHRoaXMudG9TY2FsZWRFTlUsCiAgICAgICAgICAgIHBvc2l0aW9uLAogICAgICAgICAgICBjYXJ0ZXNpYW4zU2NyYXRjaAogICAgICAgICAgKTsKICAgICAgICAgIHBvc2l0aW9uLnggPSBNYXRoX2RlZmF1bHQuY2xhbXAocG9zaXRpb24ueCwgMCwgMSk7CiAgICAgICAgICBwb3NpdGlvbi55ID0gTWF0aF9kZWZhdWx0LmNsYW1wKHBvc2l0aW9uLnksIDAsIDEpOwogICAgICAgICAgcG9zaXRpb24ueiA9IE1hdGhfZGVmYXVsdC5jbGFtcChwb3NpdGlvbi56LCAwLCAxKTsKICAgICAgICAgIGNvbnN0IGhEaW0gPSB0aGlzLm1heGltdW1IZWlnaHQgLSB0aGlzLm1pbmltdW1IZWlnaHQ7CiAgICAgICAgICBjb25zdCBoID0gTWF0aF9kZWZhdWx0LmNsYW1wKChoZWlnaHQgLSB0aGlzLm1pbmltdW1IZWlnaHQpIC8gaERpbSwgMCwgMSk7CiAgICAgICAgICBDYXJ0ZXNpYW4yX2RlZmF1bHQuZnJvbUVsZW1lbnRzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIGNhcnRlc2lhbjJTY3JhdGNoKTsKICAgICAgICAgIGNvbnN0IGNvbXByZXNzZWQwID0gQXR0cmlidXRlQ29tcHJlc3Npb25fZGVmYXVsdC5jb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyhjYXJ0ZXNpYW4yU2NyYXRjaCk7CiAgICAgICAgICBDYXJ0ZXNpYW4yX2RlZmF1bHQuZnJvbUVsZW1lbnRzKHBvc2l0aW9uLnosIGgsIGNhcnRlc2lhbjJTY3JhdGNoKTsKICAgICAgICAgIGNvbnN0IGNvbXByZXNzZWQxID0gQXR0cmlidXRlQ29tcHJlc3Npb25fZGVmYXVsdC5jb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyhjYXJ0ZXNpYW4yU2NyYXRjaCk7CiAgICAgICAgICBDYXJ0ZXNpYW4yX2RlZmF1bHQuZnJvbUVsZW1lbnRzKHUzLCB2MywgY2FydGVzaWFuMlNjcmF0Y2gpOwogICAgICAgICAgY29uc3QgY29tcHJlc3NlZDIgPSBBdHRyaWJ1dGVDb21wcmVzc2lvbl9kZWZhdWx0LmNvbXByZXNzVGV4dHVyZUNvb3JkaW5hdGVzKGNhcnRlc2lhbjJTY3JhdGNoKTsKICAgICAgICAgIHZlcnRleEJ1ZmZlcltidWZmZXJJbmRleCsrXSA9IGNvbXByZXNzZWQwOwogICAgICAgICAgdmVydGV4QnVmZmVyW2J1ZmZlckluZGV4KytdID0gY29tcHJlc3NlZDE7CiAgICAgICAgICB2ZXJ0ZXhCdWZmZXJbYnVmZmVySW5kZXgrK10gPSBjb21wcmVzc2VkMjsKICAgICAgICAgIGlmICh0aGlzLmhhc1dlYk1lcmNhdG9yVCkgewogICAgICAgICAgICBDYXJ0ZXNpYW4yX2RlZmF1bHQuZnJvbUVsZW1lbnRzKHdlYk1lcmNhdG9yVCwgMCwgY2FydGVzaWFuMlNjcmF0Y2gpOwogICAgICAgICAgICBjb25zdCBjb21wcmVzc2VkMyA9IEF0dHJpYnV0ZUNvbXByZXNzaW9uX2RlZmF1bHQuY29tcHJlc3NUZXh0dXJlQ29vcmRpbmF0ZXMoY2FydGVzaWFuMlNjcmF0Y2gpOwogICAgICAgICAgICB2ZXJ0ZXhCdWZmZXJbYnVmZmVySW5kZXgrK10gPSBjb21wcmVzc2VkMzsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KHBvc2l0aW9uLCB0aGlzLmNlbnRlciwgY2FydGVzaWFuM1NjcmF0Y2gpOwogICAgICAgICAgdmVydGV4QnVmZmVyW2J1ZmZlckluZGV4KytdID0gY2FydGVzaWFuM1NjcmF0Y2gueDsKICAgICAgICAgIHZlcnRleEJ1ZmZlcltidWZmZXJJbmRleCsrXSA9IGNhcnRlc2lhbjNTY3JhdGNoLnk7CiAgICAgICAgICB2ZXJ0ZXhCdWZmZXJbYnVmZmVySW5kZXgrK10gPSBjYXJ0ZXNpYW4zU2NyYXRjaC56OwogICAgICAgICAgdmVydGV4QnVmZmVyW2J1ZmZlckluZGV4KytdID0gaGVpZ2h0OwogICAgICAgICAgdmVydGV4QnVmZmVyW2J1ZmZlckluZGV4KytdID0gdTM7CiAgICAgICAgICB2ZXJ0ZXhCdWZmZXJbYnVmZmVySW5kZXgrK10gPSB2MzsKICAgICAgICAgIGlmICh0aGlzLmhhc1dlYk1lcmNhdG9yVCkgewogICAgICAgICAgICB2ZXJ0ZXhCdWZmZXJbYnVmZmVySW5kZXgrK10gPSB3ZWJNZXJjYXRvclQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmhhc1ZlcnRleE5vcm1hbHMpIHsKICAgICAgICAgIHZlcnRleEJ1ZmZlcltidWZmZXJJbmRleCsrXSA9IEF0dHJpYnV0ZUNvbXByZXNzaW9uX2RlZmF1bHQub2N0UGFja0Zsb2F0KG5vcm1hbFRvUGFjayk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHMpIHsKICAgICAgICAgIHZlcnRleEJ1ZmZlcltidWZmZXJJbmRleCsrXSA9IGdlb2RldGljU3VyZmFjZU5vcm1hbC54OwogICAgICAgICAgdmVydGV4QnVmZmVyW2J1ZmZlckluZGV4KytdID0gZ2VvZGV0aWNTdXJmYWNlTm9ybWFsLnk7CiAgICAgICAgICB2ZXJ0ZXhCdWZmZXJbYnVmZmVySW5kZXgrK10gPSBnZW9kZXRpY1N1cmZhY2VOb3JtYWwuejsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ1ZmZlckluZGV4OwogICAgICB9OwogICAgICBzY3JhdGNoUG9zaXRpb242ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoR2VvZGV0aWNTdXJmYWNlTm9ybWFsID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBUZXJyYWluRW5jb2RpbmcucHJvdG90eXBlLmFkZEdlb2RldGljU3VyZmFjZU5vcm1hbHMgPSBmdW5jdGlvbihvbGRCdWZmZXIsIG5ld0J1ZmZlciwgZWxsaXBzb2lkKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzR2VvZGV0aWNTdXJmYWNlTm9ybWFscykgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBvbGRTdHJpZGUgPSB0aGlzLnN0cmlkZTsKICAgICAgICBjb25zdCB2ZXJ0ZXhDb3VudCA9IG9sZEJ1ZmZlci5sZW5ndGggLyBvbGRTdHJpZGU7CiAgICAgICAgdGhpcy5oYXNHZW9kZXRpY1N1cmZhY2VOb3JtYWxzID0gdHJ1ZTsKICAgICAgICB0aGlzLl9jYWxjdWxhdGVTdHJpZGVBbmRPZmZzZXRzKCk7CiAgICAgICAgY29uc3QgbmV3U3RyaWRlID0gdGhpcy5zdHJpZGU7CiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHZlcnRleENvdW50OyBpbmRleCsrKSB7CiAgICAgICAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBvbGRTdHJpZGU7IG9mZnNldCsrKSB7CiAgICAgICAgICAgIGNvbnN0IG9sZEluZGV4ID0gaW5kZXggKiBvbGRTdHJpZGUgKyBvZmZzZXQ7CiAgICAgICAgICAgIGNvbnN0IG5ld0luZGV4ID0gaW5kZXggKiBuZXdTdHJpZGUgKyBvZmZzZXQ7CiAgICAgICAgICAgIG5ld0J1ZmZlcltuZXdJbmRleF0gPSBvbGRCdWZmZXJbb2xkSW5kZXhdOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmRlY29kZVBvc2l0aW9uKG5ld0J1ZmZlciwgaW5kZXgsIHNjcmF0Y2hQb3NpdGlvbjYpOwogICAgICAgICAgY29uc3QgZ2VvZGV0aWNTdXJmYWNlTm9ybWFsID0gZWxsaXBzb2lkLmdlb2RldGljU3VyZmFjZU5vcm1hbCgKICAgICAgICAgICAgcG9zaXRpb24sCiAgICAgICAgICAgIHNjcmF0Y2hHZW9kZXRpY1N1cmZhY2VOb3JtYWwKICAgICAgICAgICk7CiAgICAgICAgICBjb25zdCBidWZmZXJJbmRleCA9IGluZGV4ICogbmV3U3RyaWRlICsgdGhpcy5fb2Zmc2V0R2VvZGV0aWNTdXJmYWNlTm9ybWFsOwogICAgICAgICAgbmV3QnVmZmVyW2J1ZmZlckluZGV4XSA9IGdlb2RldGljU3VyZmFjZU5vcm1hbC54OwogICAgICAgICAgbmV3QnVmZmVyW2J1ZmZlckluZGV4ICsgMV0gPSBnZW9kZXRpY1N1cmZhY2VOb3JtYWwueTsKICAgICAgICAgIG5ld0J1ZmZlcltidWZmZXJJbmRleCArIDJdID0gZ2VvZGV0aWNTdXJmYWNlTm9ybWFsLno7CiAgICAgICAgfQogICAgICB9OwogICAgICBUZXJyYWluRW5jb2RpbmcucHJvdG90eXBlLnJlbW92ZUdlb2RldGljU3VyZmFjZU5vcm1hbHMgPSBmdW5jdGlvbihvbGRCdWZmZXIsIG5ld0J1ZmZlcikgewogICAgICAgIGlmICghdGhpcy5oYXNHZW9kZXRpY1N1cmZhY2VOb3JtYWxzKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IG9sZFN0cmlkZSA9IHRoaXMuc3RyaWRlOwogICAgICAgIGNvbnN0IHZlcnRleENvdW50ID0gb2xkQnVmZmVyLmxlbmd0aCAvIG9sZFN0cmlkZTsKICAgICAgICB0aGlzLmhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHMgPSBmYWxzZTsKICAgICAgICB0aGlzLl9jYWxjdWxhdGVTdHJpZGVBbmRPZmZzZXRzKCk7CiAgICAgICAgY29uc3QgbmV3U3RyaWRlID0gdGhpcy5zdHJpZGU7CiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHZlcnRleENvdW50OyBpbmRleCsrKSB7CiAgICAgICAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBuZXdTdHJpZGU7IG9mZnNldCsrKSB7CiAgICAgICAgICAgIGNvbnN0IG9sZEluZGV4ID0gaW5kZXggKiBvbGRTdHJpZGUgKyBvZmZzZXQ7CiAgICAgICAgICAgIGNvbnN0IG5ld0luZGV4ID0gaW5kZXggKiBuZXdTdHJpZGUgKyBvZmZzZXQ7CiAgICAgICAgICAgIG5ld0J1ZmZlcltuZXdJbmRleF0gPSBvbGRCdWZmZXJbb2xkSW5kZXhdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgVGVycmFpbkVuY29kaW5nLnByb3RvdHlwZS5kZWNvZGVQb3NpdGlvbiA9IGZ1bmN0aW9uKGJ1ZmZlciwgaW5kZXgsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgICB9CiAgICAgICAgaW5kZXggKj0gdGhpcy5zdHJpZGU7CiAgICAgICAgaWYgKHRoaXMucXVhbnRpemF0aW9uID09PSBUZXJyYWluUXVhbnRpemF0aW9uX2RlZmF1bHQuQklUUzEyKSB7CiAgICAgICAgICBjb25zdCB4eSA9IEF0dHJpYnV0ZUNvbXByZXNzaW9uX2RlZmF1bHQuZGVjb21wcmVzc1RleHR1cmVDb29yZGluYXRlcygKICAgICAgICAgICAgYnVmZmVyW2luZGV4XSwKICAgICAgICAgICAgY2FydGVzaWFuMlNjcmF0Y2gKICAgICAgICAgICk7CiAgICAgICAgICByZXN1bHQueCA9IHh5Lng7CiAgICAgICAgICByZXN1bHQueSA9IHh5Lnk7CiAgICAgICAgICBjb25zdCB6aCA9IEF0dHJpYnV0ZUNvbXByZXNzaW9uX2RlZmF1bHQuZGVjb21wcmVzc1RleHR1cmVDb29yZGluYXRlcygKICAgICAgICAgICAgYnVmZmVyW2luZGV4ICsgMV0sCiAgICAgICAgICAgIGNhcnRlc2lhbjJTY3JhdGNoCiAgICAgICAgICApOwogICAgICAgICAgcmVzdWx0LnogPSB6aC54OwogICAgICAgICAgcmV0dXJuIE1hdHJpeDRfZGVmYXVsdC5tdWx0aXBseUJ5UG9pbnQodGhpcy5mcm9tU2NhbGVkRU5VLCByZXN1bHQsIHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC54ID0gYnVmZmVyW2luZGV4XTsKICAgICAgICByZXN1bHQueSA9IGJ1ZmZlcltpbmRleCArIDFdOwogICAgICAgIHJlc3VsdC56ID0gYnVmZmVyW2luZGV4ICsgMl07CiAgICAgICAgcmV0dXJuIENhcnRlc2lhbjNfZGVmYXVsdC5hZGQocmVzdWx0LCB0aGlzLmNlbnRlciwgcmVzdWx0KTsKICAgICAgfTsKICAgICAgVGVycmFpbkVuY29kaW5nLnByb3RvdHlwZS5nZXRFeGFnZ2VyYXRlZFBvc2l0aW9uID0gZnVuY3Rpb24oYnVmZmVyLCBpbmRleCwgcmVzdWx0KSB7CiAgICAgICAgcmVzdWx0ID0gdGhpcy5kZWNvZGVQb3NpdGlvbihidWZmZXIsIGluZGV4LCByZXN1bHQpOwogICAgICAgIGNvbnN0IGV4YWdnZXJhdGlvbiA9IHRoaXMuZXhhZ2dlcmF0aW9uOwogICAgICAgIGNvbnN0IGV4YWdnZXJhdGlvblJlbGF0aXZlSGVpZ2h0ID0gdGhpcy5leGFnZ2VyYXRpb25SZWxhdGl2ZUhlaWdodDsKICAgICAgICBjb25zdCBoYXNFeGFnZ2VyYXRpb24gPSBleGFnZ2VyYXRpb24gIT09IDE7CiAgICAgICAgaWYgKGhhc0V4YWdnZXJhdGlvbiAmJiB0aGlzLmhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHMpIHsKICAgICAgICAgIGNvbnN0IGdlb2RldGljU3VyZmFjZU5vcm1hbCA9IHRoaXMuZGVjb2RlR2VvZGV0aWNTdXJmYWNlTm9ybWFsKAogICAgICAgICAgICBidWZmZXIsCiAgICAgICAgICAgIGluZGV4LAogICAgICAgICAgICBzY3JhdGNoR2VvZGV0aWNTdXJmYWNlTm9ybWFsCiAgICAgICAgICApOwogICAgICAgICAgY29uc3QgcmF3SGVpZ2h0ID0gdGhpcy5kZWNvZGVIZWlnaHQoYnVmZmVyLCBpbmRleCk7CiAgICAgICAgICBjb25zdCBoZWlnaHREaWZmZXJlbmNlID0gVmVydGljYWxFeGFnZ2VyYXRpb25fZGVmYXVsdC5nZXRIZWlnaHQoCiAgICAgICAgICAgIHJhd0hlaWdodCwKICAgICAgICAgICAgZXhhZ2dlcmF0aW9uLAogICAgICAgICAgICBleGFnZ2VyYXRpb25SZWxhdGl2ZUhlaWdodAogICAgICAgICAgKSAtIHJhd0hlaWdodDsKICAgICAgICAgIHJlc3VsdC54ICs9IGdlb2RldGljU3VyZmFjZU5vcm1hbC54ICogaGVpZ2h0RGlmZmVyZW5jZTsKICAgICAgICAgIHJlc3VsdC55ICs9IGdlb2RldGljU3VyZmFjZU5vcm1hbC55ICogaGVpZ2h0RGlmZmVyZW5jZTsKICAgICAgICAgIHJlc3VsdC56ICs9IGdlb2RldGljU3VyZmFjZU5vcm1hbC56ICogaGVpZ2h0RGlmZmVyZW5jZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgVGVycmFpbkVuY29kaW5nLnByb3RvdHlwZS5kZWNvZGVUZXh0dXJlQ29vcmRpbmF0ZXMgPSBmdW5jdGlvbihidWZmZXIsIGluZGV4LCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIGluZGV4ICo9IHRoaXMuc3RyaWRlOwogICAgICAgIGlmICh0aGlzLnF1YW50aXphdGlvbiA9PT0gVGVycmFpblF1YW50aXphdGlvbl9kZWZhdWx0LkJJVFMxMikgewogICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUNvbXByZXNzaW9uX2RlZmF1bHQuZGVjb21wcmVzc1RleHR1cmVDb29yZGluYXRlcygKICAgICAgICAgICAgYnVmZmVyW2luZGV4ICsgMl0sCiAgICAgICAgICAgIHJlc3VsdAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIENhcnRlc2lhbjJfZGVmYXVsdC5mcm9tRWxlbWVudHMoYnVmZmVyW2luZGV4ICsgNF0sIGJ1ZmZlcltpbmRleCArIDVdLCByZXN1bHQpOwogICAgICB9OwogICAgICBUZXJyYWluRW5jb2RpbmcucHJvdG90eXBlLmRlY29kZUhlaWdodCA9IGZ1bmN0aW9uKGJ1ZmZlciwgaW5kZXgpIHsKICAgICAgICBpbmRleCAqPSB0aGlzLnN0cmlkZTsKICAgICAgICBpZiAodGhpcy5xdWFudGl6YXRpb24gPT09IFRlcnJhaW5RdWFudGl6YXRpb25fZGVmYXVsdC5CSVRTMTIpIHsKICAgICAgICAgIGNvbnN0IHpoID0gQXR0cmlidXRlQ29tcHJlc3Npb25fZGVmYXVsdC5kZWNvbXByZXNzVGV4dHVyZUNvb3JkaW5hdGVzKAogICAgICAgICAgICBidWZmZXJbaW5kZXggKyAxXSwKICAgICAgICAgICAgY2FydGVzaWFuMlNjcmF0Y2gKICAgICAgICAgICk7CiAgICAgICAgICByZXR1cm4gemgueSAqICh0aGlzLm1heGltdW1IZWlnaHQgLSB0aGlzLm1pbmltdW1IZWlnaHQpICsgdGhpcy5taW5pbXVtSGVpZ2h0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyW2luZGV4ICsgM107CiAgICAgIH07CiAgICAgIFRlcnJhaW5FbmNvZGluZy5wcm90b3R5cGUuZGVjb2RlV2ViTWVyY2F0b3JUID0gZnVuY3Rpb24oYnVmZmVyLCBpbmRleCkgewogICAgICAgIGluZGV4ICo9IHRoaXMuc3RyaWRlOwogICAgICAgIGlmICh0aGlzLnF1YW50aXphdGlvbiA9PT0gVGVycmFpblF1YW50aXphdGlvbl9kZWZhdWx0LkJJVFMxMikgewogICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUNvbXByZXNzaW9uX2RlZmF1bHQuZGVjb21wcmVzc1RleHR1cmVDb29yZGluYXRlcygKICAgICAgICAgICAgYnVmZmVyW2luZGV4ICsgM10sCiAgICAgICAgICAgIGNhcnRlc2lhbjJTY3JhdGNoCiAgICAgICAgICApLng7CiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXJbaW5kZXggKyA2XTsKICAgICAgfTsKICAgICAgVGVycmFpbkVuY29kaW5nLnByb3RvdHlwZS5nZXRPY3RFbmNvZGVkTm9ybWFsID0gZnVuY3Rpb24oYnVmZmVyLCBpbmRleCwgcmVzdWx0KSB7CiAgICAgICAgaW5kZXggPSBpbmRleCAqIHRoaXMuc3RyaWRlICsgdGhpcy5fb2Zmc2V0VmVydGV4Tm9ybWFsOwogICAgICAgIGNvbnN0IHRlbXAgPSBidWZmZXJbaW5kZXhdIC8gMjU2OwogICAgICAgIGNvbnN0IHggPSBNYXRoLmZsb29yKHRlbXApOwogICAgICAgIGNvbnN0IHkgPSAodGVtcCAtIHgpICogMjU2OwogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4yX2RlZmF1bHQuZnJvbUVsZW1lbnRzKHgsIHksIHJlc3VsdCk7CiAgICAgIH07CiAgICAgIFRlcnJhaW5FbmNvZGluZy5wcm90b3R5cGUuZGVjb2RlR2VvZGV0aWNTdXJmYWNlTm9ybWFsID0gZnVuY3Rpb24oYnVmZmVyLCBpbmRleCwgcmVzdWx0KSB7CiAgICAgICAgaW5kZXggPSBpbmRleCAqIHRoaXMuc3RyaWRlICsgdGhpcy5fb2Zmc2V0R2VvZGV0aWNTdXJmYWNlTm9ybWFsOwogICAgICAgIHJlc3VsdC54ID0gYnVmZmVyW2luZGV4XTsKICAgICAgICByZXN1bHQueSA9IGJ1ZmZlcltpbmRleCArIDFdOwogICAgICAgIHJlc3VsdC56ID0gYnVmZmVyW2luZGV4ICsgMl07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgVGVycmFpbkVuY29kaW5nLnByb3RvdHlwZS5fY2FsY3VsYXRlU3RyaWRlQW5kT2Zmc2V0cyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGxldCB2ZXJ0ZXhTdHJpZGUgPSAwOwogICAgICAgIHN3aXRjaCAodGhpcy5xdWFudGl6YXRpb24pIHsKICAgICAgICAgIGNhc2UgVGVycmFpblF1YW50aXphdGlvbl9kZWZhdWx0LkJJVFMxMjoKICAgICAgICAgICAgdmVydGV4U3RyaWRlICs9IDM7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdmVydGV4U3RyaWRlICs9IDY7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmhhc1dlYk1lcmNhdG9yVCkgewogICAgICAgICAgdmVydGV4U3RyaWRlICs9IDE7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmhhc1ZlcnRleE5vcm1hbHMpIHsKICAgICAgICAgIHRoaXMuX29mZnNldFZlcnRleE5vcm1hbCA9IHZlcnRleFN0cmlkZTsKICAgICAgICAgIHZlcnRleFN0cmlkZSArPSAxOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5oYXNHZW9kZXRpY1N1cmZhY2VOb3JtYWxzKSB7CiAgICAgICAgICB0aGlzLl9vZmZzZXRHZW9kZXRpY1N1cmZhY2VOb3JtYWwgPSB2ZXJ0ZXhTdHJpZGU7CiAgICAgICAgICB2ZXJ0ZXhTdHJpZGUgKz0gMzsKICAgICAgICB9CiAgICAgICAgdGhpcy5zdHJpZGUgPSB2ZXJ0ZXhTdHJpZGU7CiAgICAgIH07CiAgICAgIGF0dHJpYnV0ZXNJbmRpY2VzTm9uZSA9IHsKICAgICAgICBwb3NpdGlvbjNEQW5kSGVpZ2h0OiAwLAogICAgICAgIHRleHR1cmVDb29yZEFuZEVuY29kZWROb3JtYWxzOiAxLAogICAgICAgIGdlb2RldGljU3VyZmFjZU5vcm1hbDogMgogICAgICB9OwogICAgICBhdHRyaWJ1dGVzSW5kaWNlc0JpdHMxMiA9IHsKICAgICAgICBjb21wcmVzc2VkMDogMCwKICAgICAgICBjb21wcmVzc2VkMTogMSwKICAgICAgICBnZW9kZXRpY1N1cmZhY2VOb3JtYWw6IDIKICAgICAgfTsKICAgICAgVGVycmFpbkVuY29kaW5nLnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVzID0gZnVuY3Rpb24oYnVmZmVyKSB7CiAgICAgICAgY29uc3QgZGF0YXR5cGUgPSBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FUOwogICAgICAgIGNvbnN0IHNpemVJbkJ5dGVzID0gQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5nZXRTaXplSW5CeXRlcyhkYXRhdHlwZSk7CiAgICAgICAgY29uc3Qgc3RyaWRlSW5CeXRlcyA9IHRoaXMuc3RyaWRlICogc2l6ZUluQnl0ZXM7CiAgICAgICAgbGV0IG9mZnNldEluQnl0ZXMgPSAwOwogICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbXTsKICAgICAgICBmdW5jdGlvbiBhZGRBdHRyaWJ1dGUoaW5kZXgsIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGUpIHsKICAgICAgICAgIGF0dHJpYnV0ZXMucHVzaCh7CiAgICAgICAgICAgIGluZGV4LAogICAgICAgICAgICB2ZXJ0ZXhCdWZmZXI6IGJ1ZmZlciwKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IGRhdGF0eXBlLAogICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlLAogICAgICAgICAgICBvZmZzZXRJbkJ5dGVzLAogICAgICAgICAgICBzdHJpZGVJbkJ5dGVzCiAgICAgICAgICB9KTsKICAgICAgICAgIG9mZnNldEluQnl0ZXMgKz0gY29tcG9uZW50c1BlckF0dHJpYnV0ZSAqIHNpemVJbkJ5dGVzOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5xdWFudGl6YXRpb24gPT09IFRlcnJhaW5RdWFudGl6YXRpb25fZGVmYXVsdC5OT05FKSB7CiAgICAgICAgICBhZGRBdHRyaWJ1dGUoYXR0cmlidXRlc0luZGljZXNOb25lLnBvc2l0aW9uM0RBbmRIZWlnaHQsIDQpOwogICAgICAgICAgbGV0IGNvbXBvbmVudHNUZXhDb29yZEFuZE5vcm1hbHMgPSAyOwogICAgICAgICAgY29tcG9uZW50c1RleENvb3JkQW5kTm9ybWFscyArPSB0aGlzLmhhc1dlYk1lcmNhdG9yVCA/IDEgOiAwOwogICAgICAgICAgY29tcG9uZW50c1RleENvb3JkQW5kTm9ybWFscyArPSB0aGlzLmhhc1ZlcnRleE5vcm1hbHMgPyAxIDogMDsKICAgICAgICAgIGFkZEF0dHJpYnV0ZSgKICAgICAgICAgICAgYXR0cmlidXRlc0luZGljZXNOb25lLnRleHR1cmVDb29yZEFuZEVuY29kZWROb3JtYWxzLAogICAgICAgICAgICBjb21wb25lbnRzVGV4Q29vcmRBbmROb3JtYWxzCiAgICAgICAgICApOwogICAgICAgICAgaWYgKHRoaXMuaGFzR2VvZGV0aWNTdXJmYWNlTm9ybWFscykgewogICAgICAgICAgICBhZGRBdHRyaWJ1dGUoYXR0cmlidXRlc0luZGljZXNOb25lLmdlb2RldGljU3VyZmFjZU5vcm1hbCwgMyk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IHVzaW5nQXR0cmlidXRlMENvbXBvbmVudDQgPSB0aGlzLmhhc1dlYk1lcmNhdG9yVCB8fCB0aGlzLmhhc1ZlcnRleE5vcm1hbHM7CiAgICAgICAgICBjb25zdCB1c2luZ0F0dHJpYnV0ZTFDb21wb25lbnQxID0gdGhpcy5oYXNXZWJNZXJjYXRvclQgJiYgdGhpcy5oYXNWZXJ0ZXhOb3JtYWxzOwogICAgICAgICAgYWRkQXR0cmlidXRlKAogICAgICAgICAgICBhdHRyaWJ1dGVzSW5kaWNlc0JpdHMxMi5jb21wcmVzc2VkMCwKICAgICAgICAgICAgdXNpbmdBdHRyaWJ1dGUwQ29tcG9uZW50NCA/IDQgOiAzCiAgICAgICAgICApOwogICAgICAgICAgaWYgKHVzaW5nQXR0cmlidXRlMUNvbXBvbmVudDEpIHsKICAgICAgICAgICAgYWRkQXR0cmlidXRlKGF0dHJpYnV0ZXNJbmRpY2VzQml0czEyLmNvbXByZXNzZWQxLCAxKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLmhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHMpIHsKICAgICAgICAgICAgYWRkQXR0cmlidXRlKGF0dHJpYnV0ZXNJbmRpY2VzQml0czEyLmdlb2RldGljU3VyZmFjZU5vcm1hbCwgMyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOwogICAgICB9OwogICAgICBUZXJyYWluRW5jb2RpbmcucHJvdG90eXBlLmdldEF0dHJpYnV0ZUxvY2F0aW9ucyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLnF1YW50aXphdGlvbiA9PT0gVGVycmFpblF1YW50aXphdGlvbl9kZWZhdWx0Lk5PTkUpIHsKICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzSW5kaWNlc05vbmU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhdHRyaWJ1dGVzSW5kaWNlc0JpdHMxMjsKICAgICAgfTsKICAgICAgVGVycmFpbkVuY29kaW5nLmNsb25lID0gZnVuY3Rpb24oZW5jb2RpbmcsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGVuY29kaW5nKSkgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IFRlcnJhaW5FbmNvZGluZygpOwogICAgICAgIH0KICAgICAgICByZXN1bHQucXVhbnRpemF0aW9uID0gZW5jb2RpbmcucXVhbnRpemF0aW9uOwogICAgICAgIHJlc3VsdC5taW5pbXVtSGVpZ2h0ID0gZW5jb2RpbmcubWluaW11bUhlaWdodDsKICAgICAgICByZXN1bHQubWF4aW11bUhlaWdodCA9IGVuY29kaW5nLm1heGltdW1IZWlnaHQ7CiAgICAgICAgcmVzdWx0LmNlbnRlciA9IENhcnRlc2lhbjNfZGVmYXVsdC5jbG9uZShlbmNvZGluZy5jZW50ZXIpOwogICAgICAgIHJlc3VsdC50b1NjYWxlZEVOVSA9IE1hdHJpeDRfZGVmYXVsdC5jbG9uZShlbmNvZGluZy50b1NjYWxlZEVOVSk7CiAgICAgICAgcmVzdWx0LmZyb21TY2FsZWRFTlUgPSBNYXRyaXg0X2RlZmF1bHQuY2xvbmUoZW5jb2RpbmcuZnJvbVNjYWxlZEVOVSk7CiAgICAgICAgcmVzdWx0Lm1hdHJpeCA9IE1hdHJpeDRfZGVmYXVsdC5jbG9uZShlbmNvZGluZy5tYXRyaXgpOwogICAgICAgIHJlc3VsdC5oYXNWZXJ0ZXhOb3JtYWxzID0gZW5jb2RpbmcuaGFzVmVydGV4Tm9ybWFsczsKICAgICAgICByZXN1bHQuaGFzV2ViTWVyY2F0b3JUID0gZW5jb2RpbmcuaGFzV2ViTWVyY2F0b3JUOwogICAgICAgIHJlc3VsdC5oYXNHZW9kZXRpY1N1cmZhY2VOb3JtYWxzID0gZW5jb2RpbmcuaGFzR2VvZGV0aWNTdXJmYWNlTm9ybWFsczsKICAgICAgICByZXN1bHQuZXhhZ2dlcmF0aW9uID0gZW5jb2RpbmcuZXhhZ2dlcmF0aW9uOwogICAgICAgIHJlc3VsdC5leGFnZ2VyYXRpb25SZWxhdGl2ZUhlaWdodCA9IGVuY29kaW5nLmV4YWdnZXJhdGlvblJlbGF0aXZlSGVpZ2h0OwogICAgICAgIHJlc3VsdC5fY2FsY3VsYXRlU3RyaWRlQW5kT2Zmc2V0cygpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFRlcnJhaW5FbmNvZGluZ19kZWZhdWx0ID0gVGVycmFpbkVuY29kaW5nOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlVmVydGljZXNGcm9tR29vZ2xlRWFydGhFbnRlcnByaXNlQnVmZmVyLmpzCiAgdmFyIGNyZWF0ZVZlcnRpY2VzRnJvbUdvb2dsZUVhcnRoRW50ZXJwcmlzZUJ1ZmZlcl9leHBvcnRzID0ge307CiAgX19leHBvcnQoY3JlYXRlVmVydGljZXNGcm9tR29vZ2xlRWFydGhFbnRlcnByaXNlQnVmZmVyX2V4cG9ydHMsIHsKICAgIGRlZmF1bHQ6ICgpID0+IGNyZWF0ZVZlcnRpY2VzRnJvbUdvb2dsZUVhcnRoRW50ZXJwcmlzZUJ1ZmZlcl9kZWZhdWx0CiAgfSk7CiAgZnVuY3Rpb24gaW5kZXhPZkVwc2lsb24oYXJyLCBlbGVtLCBlbGVtVHlwZSkgewogICAgZWxlbVR5cGUgPSBlbGVtVHlwZSA/PyBNYXRoX2RlZmF1bHQ7CiAgICBjb25zdCBjb3VudCA9IGFyci5sZW5ndGg7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgaWYgKGVsZW1UeXBlLmVxdWFsc0Vwc2lsb24oYXJyW2ldLCBlbGVtLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjEyKSkgewogICAgICAgIHJldHVybiBpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZVZlcnRpY2VzRnJvbUdvb2dsZUVhcnRoRW50ZXJwcmlzZUJ1ZmZlcihwYXJhbWV0ZXJzLCB0cmFuc2ZlcmFibGVPYmplY3RzKSB7CiAgICBwYXJhbWV0ZXJzLmVsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKHBhcmFtZXRlcnMuZWxsaXBzb2lkKTsKICAgIHBhcmFtZXRlcnMucmVjdGFuZ2xlID0gUmVjdGFuZ2xlX2RlZmF1bHQuY2xvbmUocGFyYW1ldGVycy5yZWN0YW5nbGUpOwogICAgY29uc3Qgc3RhdGlzdGljczIgPSBwcm9jZXNzQnVmZmVyKAogICAgICBwYXJhbWV0ZXJzLmJ1ZmZlciwKICAgICAgcGFyYW1ldGVycy5yZWxhdGl2ZVRvQ2VudGVyLAogICAgICBwYXJhbWV0ZXJzLmVsbGlwc29pZCwKICAgICAgcGFyYW1ldGVycy5yZWN0YW5nbGUsCiAgICAgIHBhcmFtZXRlcnMubmF0aXZlUmVjdGFuZ2xlLAogICAgICBwYXJhbWV0ZXJzLmV4YWdnZXJhdGlvbiwKICAgICAgcGFyYW1ldGVycy5leGFnZ2VyYXRpb25SZWxhdGl2ZUhlaWdodCwKICAgICAgcGFyYW1ldGVycy5za2lydEhlaWdodCwKICAgICAgcGFyYW1ldGVycy5pbmNsdWRlV2ViTWVyY2F0b3JULAogICAgICBwYXJhbWV0ZXJzLm5lZ2F0aXZlQWx0aXR1ZGVFeHBvbmVudEJpYXMsCiAgICAgIHBhcmFtZXRlcnMubmVnYXRpdmVFbGV2YXRpb25UaHJlc2hvbGQKICAgICk7CiAgICBjb25zdCB2ZXJ0aWNlcyA9IHN0YXRpc3RpY3MyLnZlcnRpY2VzOwogICAgdHJhbnNmZXJhYmxlT2JqZWN0cy5wdXNoKHZlcnRpY2VzLmJ1ZmZlcik7CiAgICBjb25zdCBpbmRpY2VzID0gc3RhdGlzdGljczIuaW5kaWNlczsKICAgIHRyYW5zZmVyYWJsZU9iamVjdHMucHVzaChpbmRpY2VzLmJ1ZmZlcik7CiAgICByZXR1cm4gewogICAgICB2ZXJ0aWNlczogdmVydGljZXMuYnVmZmVyLAogICAgICBpbmRpY2VzOiBpbmRpY2VzLmJ1ZmZlciwKICAgICAgbnVtYmVyT2ZBdHRyaWJ1dGVzOiBzdGF0aXN0aWNzMi5lbmNvZGluZy5zdHJpZGUsCiAgICAgIG1pbmltdW1IZWlnaHQ6IHN0YXRpc3RpY3MyLm1pbmltdW1IZWlnaHQsCiAgICAgIG1heGltdW1IZWlnaHQ6IHN0YXRpc3RpY3MyLm1heGltdW1IZWlnaHQsCiAgICAgIGJvdW5kaW5nU3BoZXJlM0Q6IHN0YXRpc3RpY3MyLmJvdW5kaW5nU3BoZXJlM0QsCiAgICAgIG9yaWVudGVkQm91bmRpbmdCb3g6IHN0YXRpc3RpY3MyLm9yaWVudGVkQm91bmRpbmdCb3gsCiAgICAgIG9jY2x1ZGVlUG9pbnRJblNjYWxlZFNwYWNlOiBzdGF0aXN0aWNzMi5vY2NsdWRlZVBvaW50SW5TY2FsZWRTcGFjZSwKICAgICAgZW5jb2Rpbmc6IHN0YXRpc3RpY3MyLmVuY29kaW5nLAogICAgICB2ZXJ0ZXhDb3VudFdpdGhvdXRTa2lydHM6IHN0YXRpc3RpY3MyLnZlcnRleENvdW50V2l0aG91dFNraXJ0cywKICAgICAgaW5kZXhDb3VudFdpdGhvdXRTa2lydHM6IHN0YXRpc3RpY3MyLmluZGV4Q291bnRXaXRob3V0U2tpcnRzLAogICAgICB3ZXN0SW5kaWNlc1NvdXRoVG9Ob3J0aDogc3RhdGlzdGljczIud2VzdEluZGljZXNTb3V0aFRvTm9ydGgsCiAgICAgIHNvdXRoSW5kaWNlc0Vhc3RUb1dlc3Q6IHN0YXRpc3RpY3MyLnNvdXRoSW5kaWNlc0Vhc3RUb1dlc3QsCiAgICAgIGVhc3RJbmRpY2VzTm9ydGhUb1NvdXRoOiBzdGF0aXN0aWNzMi5lYXN0SW5kaWNlc05vcnRoVG9Tb3V0aCwKICAgICAgbm9ydGhJbmRpY2VzV2VzdFRvRWFzdDogc3RhdGlzdGljczIubm9ydGhJbmRpY2VzV2VzdFRvRWFzdAogICAgfTsKICB9CiAgZnVuY3Rpb24gcHJvY2Vzc0J1ZmZlcihidWZmZXIsIHJlbGF0aXZlVG9DZW50ZXIsIGVsbGlwc29pZCwgcmVjdGFuZ2xlLCBuYXRpdmVSZWN0YW5nbGUsIGV4YWdnZXJhdGlvbiwgZXhhZ2dlcmF0aW9uUmVsYXRpdmVIZWlnaHQsIHNraXJ0SGVpZ2h0LCBpbmNsdWRlV2ViTWVyY2F0b3JULCBuZWdhdGl2ZUFsdGl0dWRlRXhwb25lbnRCaWFzLCBuZWdhdGl2ZUVsZXZhdGlvblRocmVzaG9sZCkgewogICAgbGV0IGdlb2dyYXBoaWNXZXN0OwogICAgbGV0IGdlb2dyYXBoaWNTb3V0aDsKICAgIGxldCBnZW9ncmFwaGljRWFzdDsKICAgIGxldCBnZW9ncmFwaGljTm9ydGg7CiAgICBsZXQgcmVjdGFuZ2xlV2lkdGgsIHJlY3RhbmdsZUhlaWdodDsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlY3RhbmdsZSkpIHsKICAgICAgZ2VvZ3JhcGhpY1dlc3QgPSBNYXRoX2RlZmF1bHQudG9SYWRpYW5zKG5hdGl2ZVJlY3RhbmdsZS53ZXN0KTsKICAgICAgZ2VvZ3JhcGhpY1NvdXRoID0gTWF0aF9kZWZhdWx0LnRvUmFkaWFucyhuYXRpdmVSZWN0YW5nbGUuc291dGgpOwogICAgICBnZW9ncmFwaGljRWFzdCA9IE1hdGhfZGVmYXVsdC50b1JhZGlhbnMobmF0aXZlUmVjdGFuZ2xlLmVhc3QpOwogICAgICBnZW9ncmFwaGljTm9ydGggPSBNYXRoX2RlZmF1bHQudG9SYWRpYW5zKG5hdGl2ZVJlY3RhbmdsZS5ub3J0aCk7CiAgICAgIHJlY3RhbmdsZVdpZHRoID0gTWF0aF9kZWZhdWx0LnRvUmFkaWFucyhyZWN0YW5nbGUud2lkdGgpOwogICAgICByZWN0YW5nbGVIZWlnaHQgPSBNYXRoX2RlZmF1bHQudG9SYWRpYW5zKHJlY3RhbmdsZS5oZWlnaHQpOwogICAgfSBlbHNlIHsKICAgICAgZ2VvZ3JhcGhpY1dlc3QgPSByZWN0YW5nbGUud2VzdDsKICAgICAgZ2VvZ3JhcGhpY1NvdXRoID0gcmVjdGFuZ2xlLnNvdXRoOwogICAgICBnZW9ncmFwaGljRWFzdCA9IHJlY3RhbmdsZS5lYXN0OwogICAgICBnZW9ncmFwaGljTm9ydGggPSByZWN0YW5nbGUubm9ydGg7CiAgICAgIHJlY3RhbmdsZVdpZHRoID0gcmVjdGFuZ2xlLndpZHRoOwogICAgICByZWN0YW5nbGVIZWlnaHQgPSByZWN0YW5nbGUuaGVpZ2h0OwogICAgfQogICAgY29uc3QgcXVhZEJvcmRlckxhdGl0dWRlcyA9IFtnZW9ncmFwaGljU291dGgsIGdlb2dyYXBoaWNOb3J0aF07CiAgICBjb25zdCBxdWFkQm9yZGVyTG9uZ2l0dWRlcyA9IFtnZW9ncmFwaGljV2VzdCwgZ2VvZ3JhcGhpY0Vhc3RdOwogICAgY29uc3QgZnJvbUVOVSA9IFRyYW5zZm9ybXNfZGVmYXVsdC5lYXN0Tm9ydGhVcFRvRml4ZWRGcmFtZSgKICAgICAgcmVsYXRpdmVUb0NlbnRlciwKICAgICAgZWxsaXBzb2lkCiAgICApOwogICAgY29uc3QgdG9FTlUgPSBNYXRyaXg0X2RlZmF1bHQuaW52ZXJzZVRyYW5zZm9ybWF0aW9uKGZyb21FTlUsIG1hdHJpeDRTY3JhdGNoMyk7CiAgICBsZXQgc291dGhNZXJjYXRvclk7CiAgICBsZXQgb25lT3Zlck1lcmNhdG9ySGVpZ2h0OwogICAgaWYgKGluY2x1ZGVXZWJNZXJjYXRvclQpIHsKICAgICAgc291dGhNZXJjYXRvclkgPSBXZWJNZXJjYXRvclByb2plY3Rpb25fZGVmYXVsdC5nZW9kZXRpY0xhdGl0dWRlVG9NZXJjYXRvckFuZ2xlKGdlb2dyYXBoaWNTb3V0aCk7CiAgICAgIG9uZU92ZXJNZXJjYXRvckhlaWdodCA9IDEgLyAoV2ViTWVyY2F0b3JQcm9qZWN0aW9uX2RlZmF1bHQuZ2VvZGV0aWNMYXRpdHVkZVRvTWVyY2F0b3JBbmdsZShnZW9ncmFwaGljTm9ydGgpIC0gc291dGhNZXJjYXRvclkpOwogICAgfQogICAgY29uc3QgaGFzRXhhZ2dlcmF0aW9uID0gZXhhZ2dlcmF0aW9uICE9PSAxOwogICAgY29uc3QgaW5jbHVkZUdlb2RldGljU3VyZmFjZU5vcm1hbHMgPSBoYXNFeGFnZ2VyYXRpb247CiAgICBjb25zdCBkdiA9IG5ldyBEYXRhVmlldyhidWZmZXIpOwogICAgbGV0IG1pbkhlaWdodCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgIGxldCBtYXhIZWlnaHQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7CiAgICBjb25zdCBtaW5pbXVtID0gbWluaW11bVNjcmF0Y2g7CiAgICBtaW5pbXVtLnggPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICBtaW5pbXVtLnkgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICBtaW5pbXVtLnogPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICBjb25zdCBtYXhpbXVtID0gbWF4aW11bVNjcmF0Y2g7CiAgICBtYXhpbXVtLnggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7CiAgICBtYXhpbXVtLnkgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7CiAgICBtYXhpbXVtLnogPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGxldCBzaXplID0gMDsKICAgIGxldCBpbmRpY2VzU2l6ZSA9IDA7CiAgICBsZXQgcXVhZFNpemU7CiAgICBsZXQgcXVhZDsKICAgIGZvciAocXVhZCA9IDA7IHF1YWQgPCA0OyArK3F1YWQpIHsKICAgICAgbGV0IG8gPSBvZmZzZXQ7CiAgICAgIHF1YWRTaXplID0gZHYuZ2V0VWludDMyKG8sIHRydWUpOwogICAgICBvICs9IHNpemVPZlVpbnQzMjsKICAgICAgY29uc3QgeCA9IE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoZHYuZ2V0RmxvYXQ2NChvLCB0cnVlKSAqIDE4MCk7CiAgICAgIG8gKz0gc2l6ZU9mRG91YmxlOwogICAgICBpZiAoaW5kZXhPZkVwc2lsb24ocXVhZEJvcmRlckxvbmdpdHVkZXMsIHgpID09PSAtMSkgewogICAgICAgIHF1YWRCb3JkZXJMb25naXR1ZGVzLnB1c2goeCk7CiAgICAgIH0KICAgICAgY29uc3QgeSA9IE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoZHYuZ2V0RmxvYXQ2NChvLCB0cnVlKSAqIDE4MCk7CiAgICAgIG8gKz0gc2l6ZU9mRG91YmxlOwogICAgICBpZiAoaW5kZXhPZkVwc2lsb24ocXVhZEJvcmRlckxhdGl0dWRlcywgeSkgPT09IC0xKSB7CiAgICAgICAgcXVhZEJvcmRlckxhdGl0dWRlcy5wdXNoKHkpOwogICAgICB9CiAgICAgIG8gKz0gMiAqIHNpemVPZkRvdWJsZTsKICAgICAgbGV0IGMgPSBkdi5nZXRJbnQzMihvLCB0cnVlKTsKICAgICAgbyArPSBzaXplT2ZJbnQzMjsKICAgICAgc2l6ZSArPSBjOwogICAgICBjID0gZHYuZ2V0SW50MzIobywgdHJ1ZSk7CiAgICAgIGluZGljZXNTaXplICs9IGMgKiAzOwogICAgICBvZmZzZXQgKz0gcXVhZFNpemUgKyBzaXplT2ZVaW50MzI7CiAgICB9CiAgICBjb25zdCBxdWFkQm9yZGVyUG9pbnRzID0gW107CiAgICBjb25zdCBxdWFkQm9yZGVySW5kaWNlcyA9IFtdOwogICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEFycmF5KHNpemUpOwogICAgY29uc3QgdXZzID0gbmV3IEFycmF5KHNpemUpOwogICAgY29uc3QgaGVpZ2h0cyA9IG5ldyBBcnJheShzaXplKTsKICAgIGNvbnN0IHdlYk1lcmNhdG9yVHMgPSBpbmNsdWRlV2ViTWVyY2F0b3JUID8gbmV3IEFycmF5KHNpemUpIDogW107CiAgICBjb25zdCBnZW9kZXRpY1N1cmZhY2VOb3JtYWxzID0gaW5jbHVkZUdlb2RldGljU3VyZmFjZU5vcm1hbHMgPyBuZXcgQXJyYXkoc2l6ZSkgOiBbXTsKICAgIGNvbnN0IGluZGljZXMgPSBuZXcgQXJyYXkoaW5kaWNlc1NpemUpOwogICAgY29uc3Qgd2VzdEJvcmRlciA9IFtdOwogICAgY29uc3Qgc291dGhCb3JkZXIgPSBbXTsKICAgIGNvbnN0IGVhc3RCb3JkZXIgPSBbXTsKICAgIGNvbnN0IG5vcnRoQm9yZGVyID0gW107CiAgICBsZXQgcG9pbnRPZmZzZXQgPSAwOwogICAgbGV0IGluZGljZXNPZmZzZXQgPSAwOwogICAgb2Zmc2V0ID0gMDsKICAgIGZvciAocXVhZCA9IDA7IHF1YWQgPCA0OyArK3F1YWQpIHsKICAgICAgcXVhZFNpemUgPSBkdi5nZXRVaW50MzIob2Zmc2V0LCB0cnVlKTsKICAgICAgb2Zmc2V0ICs9IHNpemVPZlVpbnQzMjsKICAgICAgY29uc3Qgc3RhcnRRdWFkID0gb2Zmc2V0OwogICAgICBjb25zdCBvcmlnaW5YID0gTWF0aF9kZWZhdWx0LnRvUmFkaWFucyhkdi5nZXRGbG9hdDY0KG9mZnNldCwgdHJ1ZSkgKiAxODApOwogICAgICBvZmZzZXQgKz0gc2l6ZU9mRG91YmxlOwogICAgICBjb25zdCBvcmlnaW5ZID0gTWF0aF9kZWZhdWx0LnRvUmFkaWFucyhkdi5nZXRGbG9hdDY0KG9mZnNldCwgdHJ1ZSkgKiAxODApOwogICAgICBvZmZzZXQgKz0gc2l6ZU9mRG91YmxlOwogICAgICBjb25zdCBzdGVwWCA9IE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoZHYuZ2V0RmxvYXQ2NChvZmZzZXQsIHRydWUpICogMTgwKTsKICAgICAgY29uc3QgaGFsZlN0ZXBYID0gc3RlcFggKiAwLjU7CiAgICAgIG9mZnNldCArPSBzaXplT2ZEb3VibGU7CiAgICAgIGNvbnN0IHN0ZXBZID0gTWF0aF9kZWZhdWx0LnRvUmFkaWFucyhkdi5nZXRGbG9hdDY0KG9mZnNldCwgdHJ1ZSkgKiAxODApOwogICAgICBjb25zdCBoYWxmU3RlcFkgPSBzdGVwWSAqIDAuNTsKICAgICAgb2Zmc2V0ICs9IHNpemVPZkRvdWJsZTsKICAgICAgY29uc3QgbnVtUG9pbnRzID0gZHYuZ2V0SW50MzIob2Zmc2V0LCB0cnVlKTsKICAgICAgb2Zmc2V0ICs9IHNpemVPZkludDMyOwogICAgICBjb25zdCBudW1GYWNlcyA9IGR2LmdldEludDMyKG9mZnNldCwgdHJ1ZSk7CiAgICAgIG9mZnNldCArPSBzaXplT2ZJbnQzMjsKICAgICAgb2Zmc2V0ICs9IHNpemVPZkludDMyOwogICAgICBjb25zdCBpbmRpY2VzTWFwcGluZyA9IG5ldyBBcnJheShudW1Qb2ludHMpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVBvaW50czsgKytpKSB7CiAgICAgICAgY29uc3QgbG9uZ2l0dWRlID0gb3JpZ2luWCArIGR2LmdldFVpbnQ4KG9mZnNldCsrKSAqIHN0ZXBYOwogICAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWM3LmxvbmdpdHVkZSA9IGxvbmdpdHVkZTsKICAgICAgICBjb25zdCBsYXRpdHVkZSA9IG9yaWdpblkgKyBkdi5nZXRVaW50OChvZmZzZXQrKykgKiBzdGVwWTsKICAgICAgICBzY3JhdGNoQ2FydG9ncmFwaGljNy5sYXRpdHVkZSA9IGxhdGl0dWRlOwogICAgICAgIGxldCBoZWlnaHQgPSBkdi5nZXRGbG9hdDMyKG9mZnNldCwgdHJ1ZSk7CiAgICAgICAgb2Zmc2V0ICs9IHNpemVPZkZsb2F0OwogICAgICAgIGlmIChoZWlnaHQgIT09IDAgJiYgaGVpZ2h0IDwgbmVnYXRpdmVFbGV2YXRpb25UaHJlc2hvbGQpIHsKICAgICAgICAgIGhlaWdodCAqPSAtTWF0aC5wb3coMiwgbmVnYXRpdmVBbHRpdHVkZUV4cG9uZW50Qmlhcyk7CiAgICAgICAgfQogICAgICAgIGhlaWdodCAqPSA2MzcxMDEwOwogICAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWM3LmhlaWdodCA9IGhlaWdodDsKICAgICAgICBpZiAoaW5kZXhPZkVwc2lsb24ocXVhZEJvcmRlckxvbmdpdHVkZXMsIGxvbmdpdHVkZSkgIT09IC0xIHx8IGluZGV4T2ZFcHNpbG9uKHF1YWRCb3JkZXJMYXRpdHVkZXMsIGxhdGl0dWRlKSAhPT0gLTEpIHsKICAgICAgICAgIGNvbnN0IGluZGV4ID0gaW5kZXhPZkVwc2lsb24oCiAgICAgICAgICAgIHF1YWRCb3JkZXJQb2ludHMsCiAgICAgICAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWM3LAogICAgICAgICAgICBDYXJ0b2dyYXBoaWNfZGVmYXVsdAogICAgICAgICAgKTsKICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHsKICAgICAgICAgICAgcXVhZEJvcmRlclBvaW50cy5wdXNoKENhcnRvZ3JhcGhpY19kZWZhdWx0LmNsb25lKHNjcmF0Y2hDYXJ0b2dyYXBoaWM3KSk7CiAgICAgICAgICAgIHF1YWRCb3JkZXJJbmRpY2VzLnB1c2gocG9pbnRPZmZzZXQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW5kaWNlc01hcHBpbmdbaV0gPSBxdWFkQm9yZGVySW5kaWNlc1tpbmRleF07CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpbmRpY2VzTWFwcGluZ1tpXSA9IHBvaW50T2Zmc2V0OwogICAgICAgIGlmIChNYXRoLmFicyhsb25naXR1ZGUgLSBnZW9ncmFwaGljV2VzdCkgPCBoYWxmU3RlcFgpIHsKICAgICAgICAgIHdlc3RCb3JkZXIucHVzaCh7CiAgICAgICAgICAgIGluZGV4OiBwb2ludE9mZnNldCwKICAgICAgICAgICAgY2FydG9ncmFwaGljOiBDYXJ0b2dyYXBoaWNfZGVmYXVsdC5jbG9uZShzY3JhdGNoQ2FydG9ncmFwaGljNykKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMobG9uZ2l0dWRlIC0gZ2VvZ3JhcGhpY0Vhc3QpIDwgaGFsZlN0ZXBYKSB7CiAgICAgICAgICBlYXN0Qm9yZGVyLnB1c2goewogICAgICAgICAgICBpbmRleDogcG9pbnRPZmZzZXQsCiAgICAgICAgICAgIGNhcnRvZ3JhcGhpYzogQ2FydG9ncmFwaGljX2RlZmF1bHQuY2xvbmUoc2NyYXRjaENhcnRvZ3JhcGhpYzcpCiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGxhdGl0dWRlIC0gZ2VvZ3JhcGhpY1NvdXRoKSA8IGhhbGZTdGVwWSkgewogICAgICAgICAgc291dGhCb3JkZXIucHVzaCh7CiAgICAgICAgICAgIGluZGV4OiBwb2ludE9mZnNldCwKICAgICAgICAgICAgY2FydG9ncmFwaGljOiBDYXJ0b2dyYXBoaWNfZGVmYXVsdC5jbG9uZShzY3JhdGNoQ2FydG9ncmFwaGljNykKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMobGF0aXR1ZGUgLSBnZW9ncmFwaGljTm9ydGgpIDwgaGFsZlN0ZXBZKSB7CiAgICAgICAgICBub3J0aEJvcmRlci5wdXNoKHsKICAgICAgICAgICAgaW5kZXg6IHBvaW50T2Zmc2V0LAogICAgICAgICAgICBjYXJ0b2dyYXBoaWM6IENhcnRvZ3JhcGhpY19kZWZhdWx0LmNsb25lKHNjcmF0Y2hDYXJ0b2dyYXBoaWM3KQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIG1pbkhlaWdodCA9IE1hdGgubWluKGhlaWdodCwgbWluSGVpZ2h0KTsKICAgICAgICBtYXhIZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIG1heEhlaWdodCk7CiAgICAgICAgaGVpZ2h0c1twb2ludE9mZnNldF0gPSBoZWlnaHQ7CiAgICAgICAgY29uc3QgcG9zID0gZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKHNjcmF0Y2hDYXJ0b2dyYXBoaWM3KTsKICAgICAgICBwb3NpdGlvbnNbcG9pbnRPZmZzZXRdID0gcG9zOwogICAgICAgIGlmIChpbmNsdWRlV2ViTWVyY2F0b3JUKSB7CiAgICAgICAgICB3ZWJNZXJjYXRvclRzW3BvaW50T2Zmc2V0XSA9IChXZWJNZXJjYXRvclByb2plY3Rpb25fZGVmYXVsdC5nZW9kZXRpY0xhdGl0dWRlVG9NZXJjYXRvckFuZ2xlKGxhdGl0dWRlKSAtIHNvdXRoTWVyY2F0b3JZKSAqIG9uZU92ZXJNZXJjYXRvckhlaWdodDsKICAgICAgICB9CiAgICAgICAgaWYgKGluY2x1ZGVHZW9kZXRpY1N1cmZhY2VOb3JtYWxzKSB7CiAgICAgICAgICBjb25zdCBub3JtYWwyID0gZWxsaXBzb2lkLmdlb2RldGljU3VyZmFjZU5vcm1hbChwb3MpOwogICAgICAgICAgZ2VvZGV0aWNTdXJmYWNlTm9ybWFsc1twb2ludE9mZnNldF0gPSBub3JtYWwyOwogICAgICAgIH0KICAgICAgICBNYXRyaXg0X2RlZmF1bHQubXVsdGlwbHlCeVBvaW50KHRvRU5VLCBwb3MsIHNjcmF0Y2hDYXJ0ZXNpYW4yMCk7CiAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm1pbmltdW1CeUNvbXBvbmVudChzY3JhdGNoQ2FydGVzaWFuMjAsIG1pbmltdW0sIG1pbmltdW0pOwogICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5tYXhpbXVtQnlDb21wb25lbnQoc2NyYXRjaENhcnRlc2lhbjIwLCBtYXhpbXVtLCBtYXhpbXVtKTsKICAgICAgICBsZXQgdTMgPSAobG9uZ2l0dWRlIC0gZ2VvZ3JhcGhpY1dlc3QpIC8gKGdlb2dyYXBoaWNFYXN0IC0gZ2VvZ3JhcGhpY1dlc3QpOwogICAgICAgIHUzID0gTWF0aF9kZWZhdWx0LmNsYW1wKHUzLCAwLCAxKTsKICAgICAgICBsZXQgdjMgPSAobGF0aXR1ZGUgLSBnZW9ncmFwaGljU291dGgpIC8gKGdlb2dyYXBoaWNOb3J0aCAtIGdlb2dyYXBoaWNTb3V0aCk7CiAgICAgICAgdjMgPSBNYXRoX2RlZmF1bHQuY2xhbXAodjMsIDAsIDEpOwogICAgICAgIHV2c1twb2ludE9mZnNldF0gPSBuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KHUzLCB2Myk7CiAgICAgICAgKytwb2ludE9mZnNldDsKICAgICAgfQogICAgICBjb25zdCBmYWNlc0VsZW1lbnRDb3VudCA9IG51bUZhY2VzICogMzsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBmYWNlc0VsZW1lbnRDb3VudDsgKytqLCArK2luZGljZXNPZmZzZXQpIHsKICAgICAgICBpbmRpY2VzW2luZGljZXNPZmZzZXRdID0gaW5kaWNlc01hcHBpbmdbZHYuZ2V0VWludDE2KG9mZnNldCwgdHJ1ZSldOwogICAgICAgIG9mZnNldCArPSBzaXplT2ZVaW50MTY7CiAgICAgIH0KICAgICAgaWYgKHF1YWRTaXplICE9PSBvZmZzZXQgLSBzdGFydFF1YWQpIHsKICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yX2RlZmF1bHQoIkludmFsaWQgdGVycmFpbiB0aWxlLiIpOwogICAgICB9CiAgICB9CiAgICBwb3NpdGlvbnMubGVuZ3RoID0gcG9pbnRPZmZzZXQ7CiAgICB1dnMubGVuZ3RoID0gcG9pbnRPZmZzZXQ7CiAgICBoZWlnaHRzLmxlbmd0aCA9IHBvaW50T2Zmc2V0OwogICAgaWYgKGluY2x1ZGVXZWJNZXJjYXRvclQpIHsKICAgICAgd2ViTWVyY2F0b3JUcy5sZW5ndGggPSBwb2ludE9mZnNldDsKICAgIH0KICAgIGlmIChpbmNsdWRlR2VvZGV0aWNTdXJmYWNlTm9ybWFscykgewogICAgICBnZW9kZXRpY1N1cmZhY2VOb3JtYWxzLmxlbmd0aCA9IHBvaW50T2Zmc2V0OwogICAgfQogICAgY29uc3QgdmVydGV4Q291bnRXaXRob3V0U2tpcnRzID0gcG9pbnRPZmZzZXQ7CiAgICBjb25zdCBpbmRleENvdW50V2l0aG91dFNraXJ0cyA9IGluZGljZXNPZmZzZXQ7CiAgICBjb25zdCBza2lydE9wdGlvbnMgPSB7CiAgICAgIGhNaW46IG1pbkhlaWdodCwKICAgICAgbGFzdEJvcmRlclBvaW50OiB2b2lkIDAsCiAgICAgIHNraXJ0SGVpZ2h0LAogICAgICB0b0VOVSwKICAgICAgZWxsaXBzb2lkLAogICAgICBtaW5pbXVtLAogICAgICBtYXhpbXVtCiAgICB9OwogICAgd2VzdEJvcmRlci5zb3J0KGZ1bmN0aW9uKGEzLCBiKSB7CiAgICAgIHJldHVybiBiLmNhcnRvZ3JhcGhpYy5sYXRpdHVkZSAtIGEzLmNhcnRvZ3JhcGhpYy5sYXRpdHVkZTsKICAgIH0pOwogICAgc291dGhCb3JkZXIuc29ydChmdW5jdGlvbihhMywgYikgewogICAgICByZXR1cm4gYTMuY2FydG9ncmFwaGljLmxvbmdpdHVkZSAtIGIuY2FydG9ncmFwaGljLmxvbmdpdHVkZTsKICAgIH0pOwogICAgZWFzdEJvcmRlci5zb3J0KGZ1bmN0aW9uKGEzLCBiKSB7CiAgICAgIHJldHVybiBhMy5jYXJ0b2dyYXBoaWMubGF0aXR1ZGUgLSBiLmNhcnRvZ3JhcGhpYy5sYXRpdHVkZTsKICAgIH0pOwogICAgbm9ydGhCb3JkZXIuc29ydChmdW5jdGlvbihhMywgYikgewogICAgICByZXR1cm4gYi5jYXJ0b2dyYXBoaWMubG9uZ2l0dWRlIC0gYTMuY2FydG9ncmFwaGljLmxvbmdpdHVkZTsKICAgIH0pOwogICAgY29uc3QgcGVyY2VudGFnZSA9IDFlLTU7CiAgICBhZGRTa2lydCgKICAgICAgcG9zaXRpb25zLAogICAgICBoZWlnaHRzLAogICAgICB1dnMsCiAgICAgIHdlYk1lcmNhdG9yVHMsCiAgICAgIGdlb2RldGljU3VyZmFjZU5vcm1hbHMsCiAgICAgIGluZGljZXMsCiAgICAgIHNraXJ0T3B0aW9ucywKICAgICAgd2VzdEJvcmRlciwKICAgICAgLXBlcmNlbnRhZ2UgKiByZWN0YW5nbGVXaWR0aCwKICAgICAgdHJ1ZSwKICAgICAgLXBlcmNlbnRhZ2UgKiByZWN0YW5nbGVIZWlnaHQKICAgICk7CiAgICBhZGRTa2lydCgKICAgICAgcG9zaXRpb25zLAogICAgICBoZWlnaHRzLAogICAgICB1dnMsCiAgICAgIHdlYk1lcmNhdG9yVHMsCiAgICAgIGdlb2RldGljU3VyZmFjZU5vcm1hbHMsCiAgICAgIGluZGljZXMsCiAgICAgIHNraXJ0T3B0aW9ucywKICAgICAgc291dGhCb3JkZXIsCiAgICAgIC1wZXJjZW50YWdlICogcmVjdGFuZ2xlSGVpZ2h0LAogICAgICBmYWxzZQogICAgKTsKICAgIGFkZFNraXJ0KAogICAgICBwb3NpdGlvbnMsCiAgICAgIGhlaWdodHMsCiAgICAgIHV2cywKICAgICAgd2ViTWVyY2F0b3JUcywKICAgICAgZ2VvZGV0aWNTdXJmYWNlTm9ybWFscywKICAgICAgaW5kaWNlcywKICAgICAgc2tpcnRPcHRpb25zLAogICAgICBlYXN0Qm9yZGVyLAogICAgICBwZXJjZW50YWdlICogcmVjdGFuZ2xlV2lkdGgsCiAgICAgIHRydWUsCiAgICAgIHBlcmNlbnRhZ2UgKiByZWN0YW5nbGVIZWlnaHQKICAgICk7CiAgICBhZGRTa2lydCgKICAgICAgcG9zaXRpb25zLAogICAgICBoZWlnaHRzLAogICAgICB1dnMsCiAgICAgIHdlYk1lcmNhdG9yVHMsCiAgICAgIGdlb2RldGljU3VyZmFjZU5vcm1hbHMsCiAgICAgIGluZGljZXMsCiAgICAgIHNraXJ0T3B0aW9ucywKICAgICAgbm9ydGhCb3JkZXIsCiAgICAgIHBlcmNlbnRhZ2UgKiByZWN0YW5nbGVIZWlnaHQsCiAgICAgIGZhbHNlCiAgICApOwogICAgaWYgKHdlc3RCb3JkZXIubGVuZ3RoID4gMCAmJiBub3J0aEJvcmRlci5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IGZpcnN0Qm9yZGVySW5kZXggPSB3ZXN0Qm9yZGVyWzBdLmluZGV4OwogICAgICBjb25zdCBmaXJzdFNraXJ0SW5kZXggPSB2ZXJ0ZXhDb3VudFdpdGhvdXRTa2lydHM7CiAgICAgIGNvbnN0IGxhc3RCb3JkZXJJbmRleCA9IG5vcnRoQm9yZGVyW25vcnRoQm9yZGVyLmxlbmd0aCAtIDFdLmluZGV4OwogICAgICBjb25zdCBsYXN0U2tpcnRJbmRleCA9IHBvc2l0aW9ucy5sZW5ndGggLSAxOwogICAgICBpbmRpY2VzLnB1c2goCiAgICAgICAgbGFzdEJvcmRlckluZGV4LAogICAgICAgIGxhc3RTa2lydEluZGV4LAogICAgICAgIGZpcnN0U2tpcnRJbmRleCwKICAgICAgICBmaXJzdFNraXJ0SW5kZXgsCiAgICAgICAgZmlyc3RCb3JkZXJJbmRleCwKICAgICAgICBsYXN0Qm9yZGVySW5kZXgKICAgICAgKTsKICAgIH0KICAgIHNpemUgPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgY29uc3QgYm91bmRpbmdTcGhlcmUzRCA9IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQuZnJvbVBvaW50cyhwb3NpdGlvbnMpOwogICAgbGV0IG9yaWVudGVkQm91bmRpbmdCb3g7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHJlY3RhbmdsZSkpIHsKICAgICAgb3JpZW50ZWRCb3VuZGluZ0JveCA9IE9yaWVudGVkQm91bmRpbmdCb3hfZGVmYXVsdC5mcm9tUmVjdGFuZ2xlKAogICAgICAgIHJlY3RhbmdsZSwKICAgICAgICBtaW5IZWlnaHQsCiAgICAgICAgbWF4SGVpZ2h0LAogICAgICAgIGVsbGlwc29pZAogICAgICApOwogICAgfQogICAgY29uc3Qgb2NjbHVkZXIgPSBuZXcgRWxsaXBzb2lkYWxPY2NsdWRlcl9kZWZhdWx0KGVsbGlwc29pZCk7CiAgICBjb25zdCBvY2NsdWRlZVBvaW50SW5TY2FsZWRTcGFjZSA9IG9jY2x1ZGVyLmNvbXB1dGVIb3Jpem9uQ3VsbGluZ1BvaW50UG9zc2libHlVbmRlckVsbGlwc29pZCgKICAgICAgcmVsYXRpdmVUb0NlbnRlciwKICAgICAgcG9zaXRpb25zLAogICAgICBtaW5IZWlnaHQKICAgICk7CiAgICBjb25zdCBhYUJveCA9IG5ldyBBeGlzQWxpZ25lZEJvdW5kaW5nQm94X2RlZmF1bHQobWluaW11bSwgbWF4aW11bSwgcmVsYXRpdmVUb0NlbnRlcik7CiAgICBjb25zdCBlbmNvZGluZyA9IG5ldyBUZXJyYWluRW5jb2RpbmdfZGVmYXVsdCgKICAgICAgcmVsYXRpdmVUb0NlbnRlciwKICAgICAgYWFCb3gsCiAgICAgIHNraXJ0T3B0aW9ucy5oTWluLAogICAgICBtYXhIZWlnaHQsCiAgICAgIGZyb21FTlUsCiAgICAgIGZhbHNlLAogICAgICBpbmNsdWRlV2ViTWVyY2F0b3JULAogICAgICBpbmNsdWRlR2VvZGV0aWNTdXJmYWNlTm9ybWFscywKICAgICAgZXhhZ2dlcmF0aW9uLAogICAgICBleGFnZ2VyYXRpb25SZWxhdGl2ZUhlaWdodAogICAgKTsKICAgIGNvbnN0IHZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheShzaXplICogZW5jb2Rpbmcuc3RyaWRlKTsKICAgIGxldCBidWZmZXJJbmRleCA9IDA7CiAgICBmb3IgKGxldCBrID0gMDsgayA8IHNpemU7ICsraykgewogICAgICBidWZmZXJJbmRleCA9IGVuY29kaW5nLmVuY29kZSgKICAgICAgICB2ZXJ0aWNlcywKICAgICAgICBidWZmZXJJbmRleCwKICAgICAgICBwb3NpdGlvbnNba10sCiAgICAgICAgdXZzW2tdLAogICAgICAgIGhlaWdodHNba10sCiAgICAgICAgdm9pZCAwLAogICAgICAgIHdlYk1lcmNhdG9yVHNba10sCiAgICAgICAgZ2VvZGV0aWNTdXJmYWNlTm9ybWFsc1trXQogICAgICApOwogICAgfQogICAgY29uc3Qgd2VzdEluZGljZXNTb3V0aFRvTm9ydGggPSB3ZXN0Qm9yZGVyLm1hcChmdW5jdGlvbih2ZXJ0ZXgpIHsKICAgICAgcmV0dXJuIHZlcnRleC5pbmRleDsKICAgIH0pLnJldmVyc2UoKTsKICAgIGNvbnN0IHNvdXRoSW5kaWNlc0Vhc3RUb1dlc3QgPSBzb3V0aEJvcmRlci5tYXAoZnVuY3Rpb24odmVydGV4KSB7CiAgICAgIHJldHVybiB2ZXJ0ZXguaW5kZXg7CiAgICB9KS5yZXZlcnNlKCk7CiAgICBjb25zdCBlYXN0SW5kaWNlc05vcnRoVG9Tb3V0aCA9IGVhc3RCb3JkZXIubWFwKGZ1bmN0aW9uKHZlcnRleCkgewogICAgICByZXR1cm4gdmVydGV4LmluZGV4OwogICAgfSkucmV2ZXJzZSgpOwogICAgY29uc3Qgbm9ydGhJbmRpY2VzV2VzdFRvRWFzdCA9IG5vcnRoQm9yZGVyLm1hcChmdW5jdGlvbih2ZXJ0ZXgpIHsKICAgICAgcmV0dXJuIHZlcnRleC5pbmRleDsKICAgIH0pLnJldmVyc2UoKTsKICAgIHNvdXRoSW5kaWNlc0Vhc3RUb1dlc3QudW5zaGlmdCgKICAgICAgZWFzdEluZGljZXNOb3J0aFRvU291dGhbZWFzdEluZGljZXNOb3J0aFRvU291dGgubGVuZ3RoIC0gMV0KICAgICk7CiAgICBzb3V0aEluZGljZXNFYXN0VG9XZXN0LnB1c2god2VzdEluZGljZXNTb3V0aFRvTm9ydGhbMF0pOwogICAgbm9ydGhJbmRpY2VzV2VzdFRvRWFzdC51bnNoaWZ0KAogICAgICB3ZXN0SW5kaWNlc1NvdXRoVG9Ob3J0aFt3ZXN0SW5kaWNlc1NvdXRoVG9Ob3J0aC5sZW5ndGggLSAxXQogICAgKTsKICAgIG5vcnRoSW5kaWNlc1dlc3RUb0Vhc3QucHVzaChlYXN0SW5kaWNlc05vcnRoVG9Tb3V0aFswXSk7CiAgICByZXR1cm4gewogICAgICB2ZXJ0aWNlcywKICAgICAgaW5kaWNlczogbmV3IFVpbnQxNkFycmF5KGluZGljZXMpLAogICAgICBtYXhpbXVtSGVpZ2h0OiBtYXhIZWlnaHQsCiAgICAgIG1pbmltdW1IZWlnaHQ6IG1pbkhlaWdodCwKICAgICAgZW5jb2RpbmcsCiAgICAgIGJvdW5kaW5nU3BoZXJlM0QsCiAgICAgIG9yaWVudGVkQm91bmRpbmdCb3gsCiAgICAgIG9jY2x1ZGVlUG9pbnRJblNjYWxlZFNwYWNlLAogICAgICB2ZXJ0ZXhDb3VudFdpdGhvdXRTa2lydHMsCiAgICAgIGluZGV4Q291bnRXaXRob3V0U2tpcnRzLAogICAgICB3ZXN0SW5kaWNlc1NvdXRoVG9Ob3J0aCwKICAgICAgc291dGhJbmRpY2VzRWFzdFRvV2VzdCwKICAgICAgZWFzdEluZGljZXNOb3J0aFRvU291dGgsCiAgICAgIG5vcnRoSW5kaWNlc1dlc3RUb0Vhc3QKICAgIH07CiAgfQogIGZ1bmN0aW9uIGFkZFNraXJ0KHBvc2l0aW9ucywgaGVpZ2h0cywgdXZzLCB3ZWJNZXJjYXRvclRzLCBnZW9kZXRpY1N1cmZhY2VOb3JtYWxzLCBpbmRpY2VzLCBza2lydE9wdGlvbnMsIGJvcmRlclBvaW50cywgZnVkZ2VGYWN0b3IsIGVhc3RPcldlc3QsIGNvcm5lckZ1ZGdlKSB7CiAgICBjb25zdCBjb3VudCA9IGJvcmRlclBvaW50cy5sZW5ndGg7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvdW50OyArK2opIHsKICAgICAgY29uc3QgYm9yZGVyUG9pbnQgPSBib3JkZXJQb2ludHNbal07CiAgICAgIGNvbnN0IGJvcmRlckNhcnRvZ3JhcGhpYyA9IGJvcmRlclBvaW50LmNhcnRvZ3JhcGhpYzsKICAgICAgY29uc3QgYm9yZGVySW5kZXggPSBib3JkZXJQb2ludC5pbmRleDsKICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gcG9zaXRpb25zLmxlbmd0aDsKICAgICAgY29uc3QgbG9uZ2l0dWRlID0gYm9yZGVyQ2FydG9ncmFwaGljLmxvbmdpdHVkZTsKICAgICAgbGV0IGxhdGl0dWRlID0gYm9yZGVyQ2FydG9ncmFwaGljLmxhdGl0dWRlOwogICAgICBsYXRpdHVkZSA9IE1hdGhfZGVmYXVsdC5jbGFtcCgKICAgICAgICBsYXRpdHVkZSwKICAgICAgICAtTWF0aF9kZWZhdWx0LlBJX09WRVJfVFdPLAogICAgICAgIE1hdGhfZGVmYXVsdC5QSV9PVkVSX1RXTwogICAgICApOwogICAgICBjb25zdCBoZWlnaHQgPSBib3JkZXJDYXJ0b2dyYXBoaWMuaGVpZ2h0IC0gc2tpcnRPcHRpb25zLnNraXJ0SGVpZ2h0OwogICAgICBza2lydE9wdGlvbnMuaE1pbiA9IE1hdGgubWluKHNraXJ0T3B0aW9ucy5oTWluLCBoZWlnaHQpOwogICAgICBDYXJ0b2dyYXBoaWNfZGVmYXVsdC5mcm9tUmFkaWFucyhsb25naXR1ZGUsIGxhdGl0dWRlLCBoZWlnaHQsIHNjcmF0Y2hDYXJ0b2dyYXBoaWM3KTsKICAgICAgaWYgKGVhc3RPcldlc3QpIHsKICAgICAgICBzY3JhdGNoQ2FydG9ncmFwaGljNy5sb25naXR1ZGUgKz0gZnVkZ2VGYWN0b3I7CiAgICAgIH0KICAgICAgaWYgKCFlYXN0T3JXZXN0KSB7CiAgICAgICAgc2NyYXRjaENhcnRvZ3JhcGhpYzcubGF0aXR1ZGUgKz0gZnVkZ2VGYWN0b3I7CiAgICAgIH0gZWxzZSBpZiAoaiA9PT0gY291bnQgLSAxKSB7CiAgICAgICAgc2NyYXRjaENhcnRvZ3JhcGhpYzcubGF0aXR1ZGUgKz0gY29ybmVyRnVkZ2U7CiAgICAgIH0gZWxzZSBpZiAoaiA9PT0gMCkgewogICAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWM3LmxhdGl0dWRlIC09IGNvcm5lckZ1ZGdlOwogICAgICB9CiAgICAgIGNvbnN0IHBvcyA9IHNraXJ0T3B0aW9ucy5lbGxpcHNvaWQuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oc2NyYXRjaENhcnRvZ3JhcGhpYzcpOwogICAgICBwb3NpdGlvbnMucHVzaChwb3MpOwogICAgICBoZWlnaHRzLnB1c2goaGVpZ2h0KTsKICAgICAgdXZzLnB1c2goQ2FydGVzaWFuMl9kZWZhdWx0LmNsb25lKHV2c1tib3JkZXJJbmRleF0pKTsKICAgICAgaWYgKHdlYk1lcmNhdG9yVHMubGVuZ3RoID4gMCkgewogICAgICAgIHdlYk1lcmNhdG9yVHMucHVzaCh3ZWJNZXJjYXRvclRzW2JvcmRlckluZGV4XSk7CiAgICAgIH0KICAgICAgaWYgKGdlb2RldGljU3VyZmFjZU5vcm1hbHMubGVuZ3RoID4gMCkgewogICAgICAgIGdlb2RldGljU3VyZmFjZU5vcm1hbHMucHVzaChnZW9kZXRpY1N1cmZhY2VOb3JtYWxzW2JvcmRlckluZGV4XSk7CiAgICAgIH0KICAgICAgTWF0cml4NF9kZWZhdWx0Lm11bHRpcGx5QnlQb2ludChza2lydE9wdGlvbnMudG9FTlUsIHBvcywgc2NyYXRjaENhcnRlc2lhbjIwKTsKICAgICAgY29uc3QgbWluaW11bSA9IHNraXJ0T3B0aW9ucy5taW5pbXVtOwogICAgICBjb25zdCBtYXhpbXVtID0gc2tpcnRPcHRpb25zLm1heGltdW07CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5taW5pbXVtQnlDb21wb25lbnQoc2NyYXRjaENhcnRlc2lhbjIwLCBtaW5pbXVtLCBtaW5pbXVtKTsKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm1heGltdW1CeUNvbXBvbmVudChzY3JhdGNoQ2FydGVzaWFuMjAsIG1heGltdW0sIG1heGltdW0pOwogICAgICBjb25zdCBsYXN0Qm9yZGVyUG9pbnQgPSBza2lydE9wdGlvbnMubGFzdEJvcmRlclBvaW50OwogICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGxhc3RCb3JkZXJQb2ludCkpIHsKICAgICAgICBjb25zdCBsYXN0Qm9yZGVySW5kZXggPSBsYXN0Qm9yZGVyUG9pbnQuaW5kZXg7CiAgICAgICAgaW5kaWNlcy5wdXNoKAogICAgICAgICAgbGFzdEJvcmRlckluZGV4LAogICAgICAgICAgY3VycmVudEluZGV4IC0gMSwKICAgICAgICAgIGN1cnJlbnRJbmRleCwKICAgICAgICAgIGN1cnJlbnRJbmRleCwKICAgICAgICAgIGJvcmRlckluZGV4LAogICAgICAgICAgbGFzdEJvcmRlckluZGV4CiAgICAgICAgKTsKICAgICAgfQogICAgICBza2lydE9wdGlvbnMubGFzdEJvcmRlclBvaW50ID0gYm9yZGVyUG9pbnQ7CiAgICB9CiAgfQogIHZhciBzaXplT2ZVaW50MTYsIHNpemVPZkludDMyLCBzaXplT2ZVaW50MzIsIHNpemVPZkZsb2F0LCBzaXplT2ZEb3VibGUsIHNjcmF0Y2hDYXJ0b2dyYXBoaWM3LCBzY3JhdGNoQ2FydGVzaWFuMjAsIG1pbmltdW1TY3JhdGNoLCBtYXhpbXVtU2NyYXRjaCwgbWF0cml4NFNjcmF0Y2gzLCBjcmVhdGVWZXJ0aWNlc0Zyb21Hb29nbGVFYXJ0aEVudGVycHJpc2VCdWZmZXJfZGVmYXVsdDsKICB2YXIgaW5pdF9jcmVhdGVWZXJ0aWNlc0Zyb21Hb29nbGVFYXJ0aEVudGVycHJpc2VCdWZmZXIgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVZlcnRpY2VzRnJvbUdvb2dsZUVhcnRoRW50ZXJwcmlzZUJ1ZmZlci5qcyIoKSB7CiAgICAgIGluaXRfQXhpc0FsaWduZWRCb3VuZGluZ0JveCgpOwogICAgICBpbml0X0JvdW5kaW5nU3BoZXJlKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMigpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DYXJ0b2dyYXBoaWMoKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfRWxsaXBzb2lkYWxPY2NsdWRlcigpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9NYXRyaXg0KCk7CiAgICAgIGluaXRfT3JpZW50ZWRCb3VuZGluZ0JveCgpOwogICAgICBpbml0X1JlY3RhbmdsZSgpOwogICAgICBpbml0X1J1bnRpbWVFcnJvcigpOwogICAgICBpbml0X1RlcnJhaW5FbmNvZGluZygpOwogICAgICBpbml0X1RyYW5zZm9ybXMoKTsKICAgICAgaW5pdF9XZWJNZXJjYXRvclByb2plY3Rpb24oKTsKICAgICAgaW5pdF9jcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyKCk7CiAgICAgIHNpemVPZlVpbnQxNiA9IFVpbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOwogICAgICBzaXplT2ZJbnQzMiA9IEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7CiAgICAgIHNpemVPZlVpbnQzMiA9IFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOwogICAgICBzaXplT2ZGbG9hdCA9IEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsKICAgICAgc2l6ZU9mRG91YmxlID0gRmxvYXQ2NEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOwogICAgICBzY3JhdGNoQ2FydG9ncmFwaGljNyA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydGVzaWFuMjAgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIG1pbmltdW1TY3JhdGNoID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBtYXhpbXVtU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgbWF0cml4NFNjcmF0Y2gzID0gbmV3IE1hdHJpeDRfZGVmYXVsdCgpOwogICAgICBjcmVhdGVWZXJ0aWNlc0Zyb21Hb29nbGVFYXJ0aEVudGVycHJpc2VCdWZmZXJfZGVmYXVsdCA9IGNyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXJfZGVmYXVsdCgKICAgICAgICBjcmVhdGVWZXJ0aWNlc0Zyb21Hb29nbGVFYXJ0aEVudGVycHJpc2VCdWZmZXIKICAgICAgKTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0hlaWdodG1hcEVuY29kaW5nLmpzCiAgdmFyIEhlaWdodG1hcEVuY29kaW5nLCBIZWlnaHRtYXBFbmNvZGluZ19kZWZhdWx0OwogIHZhciBpbml0X0hlaWdodG1hcEVuY29kaW5nID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9IZWlnaHRtYXBFbmNvZGluZy5qcyIoKSB7CiAgICAgIEhlaWdodG1hcEVuY29kaW5nID0gewogICAgICAgIC8qKgogICAgICAgICAqIE5vIGVuY29kaW5nCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIE5PTkU6IDAsCiAgICAgICAgLyoqCiAgICAgICAgICogTEVSQyBlbmNvZGluZwogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKgogICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9Fc3JpL2xlcmN8VGhlIExFUkMgc3BlY2lmaWNhdGlvbn0KICAgICAgICAgKi8KICAgICAgICBMRVJDOiAxCiAgICAgIH07CiAgICAgIEhlaWdodG1hcEVuY29kaW5nX2RlZmF1bHQgPSBPYmplY3QuZnJlZXplKEhlaWdodG1hcEVuY29kaW5nKTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0hlaWdodG1hcFRlc3NlbGxhdG9yLmpzCiAgdmFyIEhlaWdodG1hcFRlc3NlbGxhdG9yLCBjYXJ0ZXNpYW4zU2NyYXRjaDcsIG1hdHJpeDRTY3JhdGNoNCwgbWluaW11bVNjcmF0Y2gyLCBtYXhpbXVtU2NyYXRjaDIsIEhlaWdodG1hcFRlc3NlbGxhdG9yX2RlZmF1bHQ7CiAgdmFyIGluaXRfSGVpZ2h0bWFwVGVzc2VsbGF0b3IgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0hlaWdodG1hcFRlc3NlbGxhdG9yLmpzIigpIHsKICAgICAgaW5pdF9BeGlzQWxpZ25lZEJvdW5kaW5nQm94KCk7CiAgICAgIGluaXRfQm91bmRpbmdTcGhlcmUoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4yKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X0VsbGlwc29pZGFsT2NjbHVkZXIoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGluaXRfTWF0cml4NCgpOwogICAgICBpbml0X09yaWVudGVkQm91bmRpbmdCb3goKTsKICAgICAgaW5pdF9SZWN0YW5nbGUoKTsKICAgICAgaW5pdF9UZXJyYWluRW5jb2RpbmcoKTsKICAgICAgaW5pdF9UcmFuc2Zvcm1zKCk7CiAgICAgIGluaXRfV2ViTWVyY2F0b3JQcm9qZWN0aW9uKCk7CiAgICAgIEhlaWdodG1hcFRlc3NlbGxhdG9yID0ge307CiAgICAgIEhlaWdodG1hcFRlc3NlbGxhdG9yLkRFRkFVTFRfU1RSVUNUVVJFID0gT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgaGVpZ2h0U2NhbGU6IDEsCiAgICAgICAgaGVpZ2h0T2Zmc2V0OiAwLAogICAgICAgIGVsZW1lbnRzUGVySGVpZ2h0OiAxLAogICAgICAgIHN0cmlkZTogMSwKICAgICAgICBlbGVtZW50TXVsdGlwbGllcjogMjU2LAogICAgICAgIGlzQmlnRW5kaWFuOiBmYWxzZQogICAgICB9KTsKICAgICAgY2FydGVzaWFuM1NjcmF0Y2g3ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBtYXRyaXg0U2NyYXRjaDQgPSBuZXcgTWF0cml4NF9kZWZhdWx0KCk7CiAgICAgIG1pbmltdW1TY3JhdGNoMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgbWF4aW11bVNjcmF0Y2gyID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBIZWlnaHRtYXBUZXNzZWxsYXRvci5jb21wdXRlVmVydGljZXMgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQob3B0aW9ucykgfHwgIWRlZmluZWRfZGVmYXVsdChvcHRpb25zLmhlaWdodG1hcCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJvcHRpb25zLmhlaWdodG1hcCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQob3B0aW9ucy53aWR0aCkgfHwgIWRlZmluZWRfZGVmYXVsdChvcHRpb25zLmhlaWdodCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJvcHRpb25zLndpZHRoIGFuZCBvcHRpb25zLmhlaWdodCBhcmUgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KG9wdGlvbnMubmF0aXZlUmVjdGFuZ2xlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm9wdGlvbnMubmF0aXZlUmVjdGFuZ2xlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChvcHRpb25zLnNraXJ0SGVpZ2h0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm9wdGlvbnMuc2tpcnRIZWlnaHQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNvczQgPSBNYXRoLmNvczsKICAgICAgICBjb25zdCBzaW40ID0gTWF0aC5zaW47CiAgICAgICAgY29uc3Qgc3FydDIgPSBNYXRoLnNxcnQ7CiAgICAgICAgY29uc3QgYXRhbiA9IE1hdGguYXRhbjsKICAgICAgICBjb25zdCBleHAgPSBNYXRoLmV4cDsKICAgICAgICBjb25zdCBwaU92ZXJUd28gPSBNYXRoX2RlZmF1bHQuUElfT1ZFUl9UV087CiAgICAgICAgY29uc3QgdG9SYWRpYW5zID0gTWF0aF9kZWZhdWx0LnRvUmFkaWFuczsKICAgICAgICBjb25zdCBoZWlnaHRtYXAgPSBvcHRpb25zLmhlaWdodG1hcDsKICAgICAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGg7CiAgICAgICAgY29uc3QgaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQ7CiAgICAgICAgY29uc3Qgc2tpcnRIZWlnaHQgPSBvcHRpb25zLnNraXJ0SGVpZ2h0OwogICAgICAgIGNvbnN0IGhhc1NraXJ0cyA9IHNraXJ0SGVpZ2h0ID4gMDsKICAgICAgICBjb25zdCBpc0dlb2dyYXBoaWMgPSBvcHRpb25zLmlzR2VvZ3JhcGhpYyA/PyB0cnVlOwogICAgICAgIGNvbnN0IGVsbGlwc29pZCA9IG9wdGlvbnMuZWxsaXBzb2lkID8/IEVsbGlwc29pZF9kZWZhdWx0LmRlZmF1bHQ7CiAgICAgICAgY29uc3Qgb25lT3Zlckdsb2JlU2VtaW1ham9yQXhpcyA9IDEgLyBlbGxpcHNvaWQubWF4aW11bVJhZGl1czsKICAgICAgICBjb25zdCBuYXRpdmVSZWN0YW5nbGUgPSBSZWN0YW5nbGVfZGVmYXVsdC5jbG9uZShvcHRpb25zLm5hdGl2ZVJlY3RhbmdsZSk7CiAgICAgICAgY29uc3QgcmVjdGFuZ2xlID0gUmVjdGFuZ2xlX2RlZmF1bHQuY2xvbmUob3B0aW9ucy5yZWN0YW5nbGUpOwogICAgICAgIGxldCBnZW9ncmFwaGljV2VzdDsKICAgICAgICBsZXQgZ2VvZ3JhcGhpY1NvdXRoOwogICAgICAgIGxldCBnZW9ncmFwaGljRWFzdDsKICAgICAgICBsZXQgZ2VvZ3JhcGhpY05vcnRoOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlY3RhbmdsZSkpIHsKICAgICAgICAgIGlmIChpc0dlb2dyYXBoaWMpIHsKICAgICAgICAgICAgZ2VvZ3JhcGhpY1dlc3QgPSB0b1JhZGlhbnMobmF0aXZlUmVjdGFuZ2xlLndlc3QpOwogICAgICAgICAgICBnZW9ncmFwaGljU291dGggPSB0b1JhZGlhbnMobmF0aXZlUmVjdGFuZ2xlLnNvdXRoKTsKICAgICAgICAgICAgZ2VvZ3JhcGhpY0Vhc3QgPSB0b1JhZGlhbnMobmF0aXZlUmVjdGFuZ2xlLmVhc3QpOwogICAgICAgICAgICBnZW9ncmFwaGljTm9ydGggPSB0b1JhZGlhbnMobmF0aXZlUmVjdGFuZ2xlLm5vcnRoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdlb2dyYXBoaWNXZXN0ID0gbmF0aXZlUmVjdGFuZ2xlLndlc3QgKiBvbmVPdmVyR2xvYmVTZW1pbWFqb3JBeGlzOwogICAgICAgICAgICBnZW9ncmFwaGljU291dGggPSBwaU92ZXJUd28gLSAyICogYXRhbihleHAoLW5hdGl2ZVJlY3RhbmdsZS5zb3V0aCAqIG9uZU92ZXJHbG9iZVNlbWltYWpvckF4aXMpKTsKICAgICAgICAgICAgZ2VvZ3JhcGhpY0Vhc3QgPSBuYXRpdmVSZWN0YW5nbGUuZWFzdCAqIG9uZU92ZXJHbG9iZVNlbWltYWpvckF4aXM7CiAgICAgICAgICAgIGdlb2dyYXBoaWNOb3J0aCA9IHBpT3ZlclR3byAtIDIgKiBhdGFuKGV4cCgtbmF0aXZlUmVjdGFuZ2xlLm5vcnRoICogb25lT3Zlckdsb2JlU2VtaW1ham9yQXhpcykpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBnZW9ncmFwaGljV2VzdCA9IHJlY3RhbmdsZS53ZXN0OwogICAgICAgICAgZ2VvZ3JhcGhpY1NvdXRoID0gcmVjdGFuZ2xlLnNvdXRoOwogICAgICAgICAgZ2VvZ3JhcGhpY0Vhc3QgPSByZWN0YW5nbGUuZWFzdDsKICAgICAgICAgIGdlb2dyYXBoaWNOb3J0aCA9IHJlY3RhbmdsZS5ub3J0aDsKICAgICAgICB9CiAgICAgICAgbGV0IHJlbGF0aXZlVG9DZW50ZXIgPSBvcHRpb25zLnJlbGF0aXZlVG9DZW50ZXI7CiAgICAgICAgY29uc3QgaGFzUmVsYXRpdmVUb0NlbnRlciA9IGRlZmluZWRfZGVmYXVsdChyZWxhdGl2ZVRvQ2VudGVyKTsKICAgICAgICByZWxhdGl2ZVRvQ2VudGVyID0gaGFzUmVsYXRpdmVUb0NlbnRlciA/IHJlbGF0aXZlVG9DZW50ZXIgOiBDYXJ0ZXNpYW4zX2RlZmF1bHQuWkVSTzsKICAgICAgICBjb25zdCBpbmNsdWRlV2ViTWVyY2F0b3JUID0gb3B0aW9ucy5pbmNsdWRlV2ViTWVyY2F0b3JUID8/IGZhbHNlOwogICAgICAgIGNvbnN0IGV4YWdnZXJhdGlvbiA9IG9wdGlvbnMuZXhhZ2dlcmF0aW9uID8/IDE7CiAgICAgICAgY29uc3QgZXhhZ2dlcmF0aW9uUmVsYXRpdmVIZWlnaHQgPSBvcHRpb25zLmV4YWdnZXJhdGlvblJlbGF0aXZlSGVpZ2h0ID8/IDA7CiAgICAgICAgY29uc3QgaGFzRXhhZ2dlcmF0aW9uID0gZXhhZ2dlcmF0aW9uICE9PSAxOwogICAgICAgIGNvbnN0IGluY2x1ZGVHZW9kZXRpY1N1cmZhY2VOb3JtYWxzID0gaGFzRXhhZ2dlcmF0aW9uOwogICAgICAgIGNvbnN0IHN0cnVjdHVyZSA9IG9wdGlvbnMuc3RydWN0dXJlID8/IEhlaWdodG1hcFRlc3NlbGxhdG9yLkRFRkFVTFRfU1RSVUNUVVJFOwogICAgICAgIGNvbnN0IGhlaWdodFNjYWxlID0gc3RydWN0dXJlLmhlaWdodFNjYWxlID8/IEhlaWdodG1hcFRlc3NlbGxhdG9yLkRFRkFVTFRfU1RSVUNUVVJFLmhlaWdodFNjYWxlOwogICAgICAgIGNvbnN0IGhlaWdodE9mZnNldCA9IHN0cnVjdHVyZS5oZWlnaHRPZmZzZXQgPz8gSGVpZ2h0bWFwVGVzc2VsbGF0b3IuREVGQVVMVF9TVFJVQ1RVUkUuaGVpZ2h0T2Zmc2V0OwogICAgICAgIGNvbnN0IGVsZW1lbnRzUGVySGVpZ2h0ID0gc3RydWN0dXJlLmVsZW1lbnRzUGVySGVpZ2h0ID8/IEhlaWdodG1hcFRlc3NlbGxhdG9yLkRFRkFVTFRfU1RSVUNUVVJFLmVsZW1lbnRzUGVySGVpZ2h0OwogICAgICAgIGNvbnN0IHN0cmlkZSA9IHN0cnVjdHVyZS5zdHJpZGUgPz8gSGVpZ2h0bWFwVGVzc2VsbGF0b3IuREVGQVVMVF9TVFJVQ1RVUkUuc3RyaWRlOwogICAgICAgIGNvbnN0IGVsZW1lbnRNdWx0aXBsaWVyID0gc3RydWN0dXJlLmVsZW1lbnRNdWx0aXBsaWVyID8/IEhlaWdodG1hcFRlc3NlbGxhdG9yLkRFRkFVTFRfU1RSVUNUVVJFLmVsZW1lbnRNdWx0aXBsaWVyOwogICAgICAgIGNvbnN0IGlzQmlnRW5kaWFuID0gc3RydWN0dXJlLmlzQmlnRW5kaWFuID8/IEhlaWdodG1hcFRlc3NlbGxhdG9yLkRFRkFVTFRfU1RSVUNUVVJFLmlzQmlnRW5kaWFuOwogICAgICAgIGxldCByZWN0YW5nbGVXaWR0aCA9IFJlY3RhbmdsZV9kZWZhdWx0LmNvbXB1dGVXaWR0aChuYXRpdmVSZWN0YW5nbGUpOwogICAgICAgIGxldCByZWN0YW5nbGVIZWlnaHQgPSBSZWN0YW5nbGVfZGVmYXVsdC5jb21wdXRlSGVpZ2h0KG5hdGl2ZVJlY3RhbmdsZSk7CiAgICAgICAgY29uc3QgZ3JhbnVsYXJpdHlYID0gcmVjdGFuZ2xlV2lkdGggLyAod2lkdGggLSAxKTsKICAgICAgICBjb25zdCBncmFudWxhcml0eVkgPSByZWN0YW5nbGVIZWlnaHQgLyAoaGVpZ2h0IC0gMSk7CiAgICAgICAgaWYgKCFpc0dlb2dyYXBoaWMpIHsKICAgICAgICAgIHJlY3RhbmdsZVdpZHRoICo9IG9uZU92ZXJHbG9iZVNlbWltYWpvckF4aXM7CiAgICAgICAgICByZWN0YW5nbGVIZWlnaHQgKj0gb25lT3Zlckdsb2JlU2VtaW1ham9yQXhpczsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmFkaWlTcXVhcmVkID0gZWxsaXBzb2lkLnJhZGlpU3F1YXJlZDsKICAgICAgICBjb25zdCByYWRpaVNxdWFyZWRYID0gcmFkaWlTcXVhcmVkLng7CiAgICAgICAgY29uc3QgcmFkaWlTcXVhcmVkWSA9IHJhZGlpU3F1YXJlZC55OwogICAgICAgIGNvbnN0IHJhZGlpU3F1YXJlZFogPSByYWRpaVNxdWFyZWQuejsKICAgICAgICBsZXQgbWluaW11bUhlaWdodCA9IDY1NTM2OwogICAgICAgIGxldCBtYXhpbXVtSGVpZ2h0ID0gLTY1NTM2OwogICAgICAgIGNvbnN0IGZyb21FTlUgPSBUcmFuc2Zvcm1zX2RlZmF1bHQuZWFzdE5vcnRoVXBUb0ZpeGVkRnJhbWUoCiAgICAgICAgICByZWxhdGl2ZVRvQ2VudGVyLAogICAgICAgICAgZWxsaXBzb2lkCiAgICAgICAgKTsKICAgICAgICBjb25zdCB0b0VOVSA9IE1hdHJpeDRfZGVmYXVsdC5pbnZlcnNlVHJhbnNmb3JtYXRpb24oZnJvbUVOVSwgbWF0cml4NFNjcmF0Y2g0KTsKICAgICAgICBsZXQgc291dGhNZXJjYXRvclk7CiAgICAgICAgbGV0IG9uZU92ZXJNZXJjYXRvckhlaWdodDsKICAgICAgICBpZiAoaW5jbHVkZVdlYk1lcmNhdG9yVCkgewogICAgICAgICAgc291dGhNZXJjYXRvclkgPSBXZWJNZXJjYXRvclByb2plY3Rpb25fZGVmYXVsdC5nZW9kZXRpY0xhdGl0dWRlVG9NZXJjYXRvckFuZ2xlKGdlb2dyYXBoaWNTb3V0aCk7CiAgICAgICAgICBvbmVPdmVyTWVyY2F0b3JIZWlnaHQgPSAxIC8gKFdlYk1lcmNhdG9yUHJvamVjdGlvbl9kZWZhdWx0Lmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGUoZ2VvZ3JhcGhpY05vcnRoKSAtIHNvdXRoTWVyY2F0b3JZKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWluaW11bSA9IG1pbmltdW1TY3JhdGNoMjsKICAgICAgICBtaW5pbXVtLnggPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICAgICAgbWluaW11bS55ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgICAgIG1pbmltdW0ueiA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgICBjb25zdCBtYXhpbXVtID0gbWF4aW11bVNjcmF0Y2gyOwogICAgICAgIG1heGltdW0ueCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTsKICAgICAgICBtYXhpbXVtLnkgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7CiAgICAgICAgbWF4aW11bS56ID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOwogICAgICAgIGxldCBoTWluID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgICAgIGNvbnN0IGdyaWRWZXJ0ZXhDb3VudCA9IHdpZHRoICogaGVpZ2h0OwogICAgICAgIGNvbnN0IGVkZ2VWZXJ0ZXhDb3VudCA9IHNraXJ0SGVpZ2h0ID4gMCA/IHdpZHRoICogMiArIGhlaWdodCAqIDIgOiAwOwogICAgICAgIGNvbnN0IHZlcnRleENvdW50ID0gZ3JpZFZlcnRleENvdW50ICsgZWRnZVZlcnRleENvdW50OwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBBcnJheSh2ZXJ0ZXhDb3VudCk7CiAgICAgICAgY29uc3QgaGVpZ2h0cyA9IG5ldyBBcnJheSh2ZXJ0ZXhDb3VudCk7CiAgICAgICAgY29uc3QgdXZzID0gbmV3IEFycmF5KHZlcnRleENvdW50KTsKICAgICAgICBjb25zdCB3ZWJNZXJjYXRvclRzID0gaW5jbHVkZVdlYk1lcmNhdG9yVCA/IG5ldyBBcnJheSh2ZXJ0ZXhDb3VudCkgOiBbXTsKICAgICAgICBjb25zdCBnZW9kZXRpY1N1cmZhY2VOb3JtYWxzID0gaW5jbHVkZUdlb2RldGljU3VyZmFjZU5vcm1hbHMgPyBuZXcgQXJyYXkodmVydGV4Q291bnQpIDogW107CiAgICAgICAgbGV0IHN0YXJ0Um93ID0gMDsKICAgICAgICBsZXQgZW5kUm93ID0gaGVpZ2h0OwogICAgICAgIGxldCBzdGFydENvbCA9IDA7CiAgICAgICAgbGV0IGVuZENvbCA9IHdpZHRoOwogICAgICAgIGlmIChoYXNTa2lydHMpIHsKICAgICAgICAgIC0tc3RhcnRSb3c7CiAgICAgICAgICArK2VuZFJvdzsKICAgICAgICAgIC0tc3RhcnRDb2w7CiAgICAgICAgICArK2VuZENvbDsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc2tpcnRPZmZzZXRQZXJjZW50YWdlID0gMWUtNTsKICAgICAgICBmb3IgKGxldCByb3dJbmRleCA9IHN0YXJ0Um93OyByb3dJbmRleCA8IGVuZFJvdzsgKytyb3dJbmRleCkgewogICAgICAgICAgbGV0IHJvdyA9IHJvd0luZGV4OwogICAgICAgICAgaWYgKHJvdyA8IDApIHsKICAgICAgICAgICAgcm93ID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChyb3cgPj0gaGVpZ2h0KSB7CiAgICAgICAgICAgIHJvdyA9IGhlaWdodCAtIDE7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgbGF0aXR1ZGUgPSBuYXRpdmVSZWN0YW5nbGUubm9ydGggLSBncmFudWxhcml0eVkgKiByb3c7CiAgICAgICAgICBpZiAoIWlzR2VvZ3JhcGhpYykgewogICAgICAgICAgICBsYXRpdHVkZSA9IHBpT3ZlclR3byAtIDIgKiBhdGFuKGV4cCgtbGF0aXR1ZGUgKiBvbmVPdmVyR2xvYmVTZW1pbWFqb3JBeGlzKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsYXRpdHVkZSA9IHRvUmFkaWFucyhsYXRpdHVkZSk7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgdjMgPSAobGF0aXR1ZGUgLSBnZW9ncmFwaGljU291dGgpIC8gKGdlb2dyYXBoaWNOb3J0aCAtIGdlb2dyYXBoaWNTb3V0aCk7CiAgICAgICAgICB2MyA9IE1hdGhfZGVmYXVsdC5jbGFtcCh2MywgMCwgMSk7CiAgICAgICAgICBjb25zdCBpc05vcnRoRWRnZSA9IHJvd0luZGV4ID09PSBzdGFydFJvdzsKICAgICAgICAgIGNvbnN0IGlzU291dGhFZGdlID0gcm93SW5kZXggPT09IGVuZFJvdyAtIDE7CiAgICAgICAgICBpZiAoc2tpcnRIZWlnaHQgPiAwKSB7CiAgICAgICAgICAgIGlmIChpc05vcnRoRWRnZSkgewogICAgICAgICAgICAgIGxhdGl0dWRlICs9IHNraXJ0T2Zmc2V0UGVyY2VudGFnZSAqIHJlY3RhbmdsZUhlaWdodDsKICAgICAgICAgICAgfSBlbHNlIGlmIChpc1NvdXRoRWRnZSkgewogICAgICAgICAgICAgIGxhdGl0dWRlIC09IHNraXJ0T2Zmc2V0UGVyY2VudGFnZSAqIHJlY3RhbmdsZUhlaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY29uc3QgY29zTGF0aXR1ZGUgPSBjb3M0KGxhdGl0dWRlKTsKICAgICAgICAgIGNvbnN0IG5aID0gc2luNChsYXRpdHVkZSk7CiAgICAgICAgICBjb25zdCBrWiA9IHJhZGlpU3F1YXJlZFogKiBuWjsKICAgICAgICAgIGxldCB3ZWJNZXJjYXRvclQ7CiAgICAgICAgICBpZiAoaW5jbHVkZVdlYk1lcmNhdG9yVCkgewogICAgICAgICAgICB3ZWJNZXJjYXRvclQgPSAoV2ViTWVyY2F0b3JQcm9qZWN0aW9uX2RlZmF1bHQuZ2VvZGV0aWNMYXRpdHVkZVRvTWVyY2F0b3JBbmdsZShsYXRpdHVkZSkgLSBzb3V0aE1lcmNhdG9yWSkgKiBvbmVPdmVyTWVyY2F0b3JIZWlnaHQ7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGxldCBjb2xJbmRleCA9IHN0YXJ0Q29sOyBjb2xJbmRleCA8IGVuZENvbDsgKytjb2xJbmRleCkgewogICAgICAgICAgICBsZXQgY29sID0gY29sSW5kZXg7CiAgICAgICAgICAgIGlmIChjb2wgPCAwKSB7CiAgICAgICAgICAgICAgY29sID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29sID49IHdpZHRoKSB7CiAgICAgICAgICAgICAgY29sID0gd2lkdGggLSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHRlcnJhaW5PZmZzZXQgPSByb3cgKiAod2lkdGggKiBzdHJpZGUpICsgY29sICogc3RyaWRlOwogICAgICAgICAgICBsZXQgaGVpZ2h0U2FtcGxlOwogICAgICAgICAgICBpZiAoZWxlbWVudHNQZXJIZWlnaHQgPT09IDEpIHsKICAgICAgICAgICAgICBoZWlnaHRTYW1wbGUgPSBoZWlnaHRtYXBbdGVycmFpbk9mZnNldF07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaGVpZ2h0U2FtcGxlID0gMDsKICAgICAgICAgICAgICBsZXQgZWxlbWVudE9mZnNldDsKICAgICAgICAgICAgICBpZiAoaXNCaWdFbmRpYW4pIHsKICAgICAgICAgICAgICAgIGZvciAoZWxlbWVudE9mZnNldCA9IDA7IGVsZW1lbnRPZmZzZXQgPCBlbGVtZW50c1BlckhlaWdodDsgKytlbGVtZW50T2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgIGhlaWdodFNhbXBsZSA9IGhlaWdodFNhbXBsZSAqIGVsZW1lbnRNdWx0aXBsaWVyICsgaGVpZ2h0bWFwW3RlcnJhaW5PZmZzZXQgKyBlbGVtZW50T2Zmc2V0XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yIChlbGVtZW50T2Zmc2V0ID0gZWxlbWVudHNQZXJIZWlnaHQgLSAxOyBlbGVtZW50T2Zmc2V0ID49IDA7IC0tZWxlbWVudE9mZnNldCkgewogICAgICAgICAgICAgICAgICBoZWlnaHRTYW1wbGUgPSBoZWlnaHRTYW1wbGUgKiBlbGVtZW50TXVsdGlwbGllciArIGhlaWdodG1hcFt0ZXJyYWluT2Zmc2V0ICsgZWxlbWVudE9mZnNldF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGhlaWdodFNhbXBsZSA9IGhlaWdodFNhbXBsZSAqIGhlaWdodFNjYWxlICsgaGVpZ2h0T2Zmc2V0OwogICAgICAgICAgICBtYXhpbXVtSGVpZ2h0ID0gTWF0aC5tYXgobWF4aW11bUhlaWdodCwgaGVpZ2h0U2FtcGxlKTsKICAgICAgICAgICAgbWluaW11bUhlaWdodCA9IE1hdGgubWluKG1pbmltdW1IZWlnaHQsIGhlaWdodFNhbXBsZSk7CiAgICAgICAgICAgIGxldCBsb25naXR1ZGUgPSBuYXRpdmVSZWN0YW5nbGUud2VzdCArIGdyYW51bGFyaXR5WCAqIGNvbDsKICAgICAgICAgICAgaWYgKCFpc0dlb2dyYXBoaWMpIHsKICAgICAgICAgICAgICBsb25naXR1ZGUgPSBsb25naXR1ZGUgKiBvbmVPdmVyR2xvYmVTZW1pbWFqb3JBeGlzOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGxvbmdpdHVkZSA9IHRvUmFkaWFucyhsb25naXR1ZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCB1MyA9IChsb25naXR1ZGUgLSBnZW9ncmFwaGljV2VzdCkgLyAoZ2VvZ3JhcGhpY0Vhc3QgLSBnZW9ncmFwaGljV2VzdCk7CiAgICAgICAgICAgIHUzID0gTWF0aF9kZWZhdWx0LmNsYW1wKHUzLCAwLCAxKTsKICAgICAgICAgICAgbGV0IGluZGV4ID0gcm93ICogd2lkdGggKyBjb2w7CiAgICAgICAgICAgIGlmIChza2lydEhlaWdodCA+IDApIHsKICAgICAgICAgICAgICBjb25zdCBpc1dlc3RFZGdlID0gY29sSW5kZXggPT09IHN0YXJ0Q29sOwogICAgICAgICAgICAgIGNvbnN0IGlzRWFzdEVkZ2UgPSBjb2xJbmRleCA9PT0gZW5kQ29sIC0gMTsKICAgICAgICAgICAgICBjb25zdCBpc0VkZ2UyID0gaXNOb3J0aEVkZ2UgfHwgaXNTb3V0aEVkZ2UgfHwgaXNXZXN0RWRnZSB8fCBpc0Vhc3RFZGdlOwogICAgICAgICAgICAgIGNvbnN0IGlzQ29ybmVyID0gKGlzTm9ydGhFZGdlIHx8IGlzU291dGhFZGdlKSAmJiAoaXNXZXN0RWRnZSB8fCBpc0Vhc3RFZGdlKTsKICAgICAgICAgICAgICBpZiAoaXNDb3JuZXIpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNFZGdlMikgewogICAgICAgICAgICAgICAgaGVpZ2h0U2FtcGxlIC09IHNraXJ0SGVpZ2h0OwogICAgICAgICAgICAgICAgaWYgKGlzV2VzdEVkZ2UpIHsKICAgICAgICAgICAgICAgICAgaW5kZXggPSBncmlkVmVydGV4Q291bnQgKyAoaGVpZ2h0IC0gcm93IC0gMSk7CiAgICAgICAgICAgICAgICAgIGxvbmdpdHVkZSAtPSBza2lydE9mZnNldFBlcmNlbnRhZ2UgKiByZWN0YW5nbGVXaWR0aDsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNTb3V0aEVkZ2UpIHsKICAgICAgICAgICAgICAgICAgaW5kZXggPSBncmlkVmVydGV4Q291bnQgKyBoZWlnaHQgKyAod2lkdGggLSBjb2wgLSAxKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNFYXN0RWRnZSkgewogICAgICAgICAgICAgICAgICBpbmRleCA9IGdyaWRWZXJ0ZXhDb3VudCArIGhlaWdodCArIHdpZHRoICsgcm93OwogICAgICAgICAgICAgICAgICBsb25naXR1ZGUgKz0gc2tpcnRPZmZzZXRQZXJjZW50YWdlICogcmVjdGFuZ2xlV2lkdGg7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTm9ydGhFZGdlKSB7CiAgICAgICAgICAgICAgICAgIGluZGV4ID0gZ3JpZFZlcnRleENvdW50ICsgaGVpZ2h0ICsgd2lkdGggKyBoZWlnaHQgKyBjb2w7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IG5YID0gY29zTGF0aXR1ZGUgKiBjb3M0KGxvbmdpdHVkZSk7CiAgICAgICAgICAgIGNvbnN0IG5ZID0gY29zTGF0aXR1ZGUgKiBzaW40KGxvbmdpdHVkZSk7CiAgICAgICAgICAgIGNvbnN0IGtYID0gcmFkaWlTcXVhcmVkWCAqIG5YOwogICAgICAgICAgICBjb25zdCBrWSA9IHJhZGlpU3F1YXJlZFkgKiBuWTsKICAgICAgICAgICAgY29uc3QgZ2FtbWEgPSBzcXJ0MihrWCAqIG5YICsga1kgKiBuWSArIGtaICogblopOwogICAgICAgICAgICBjb25zdCBvbmVPdmVyR2FtbWEgPSAxIC8gZ2FtbWE7CiAgICAgICAgICAgIGNvbnN0IHJTdXJmYWNlWCA9IGtYICogb25lT3ZlckdhbW1hOwogICAgICAgICAgICBjb25zdCByU3VyZmFjZVkgPSBrWSAqIG9uZU92ZXJHYW1tYTsKICAgICAgICAgICAgY29uc3QgclN1cmZhY2VaID0ga1ogKiBvbmVPdmVyR2FtbWE7CiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICAgICAgICBwb3NpdGlvbi54ID0gclN1cmZhY2VYICsgblggKiBoZWlnaHRTYW1wbGU7CiAgICAgICAgICAgIHBvc2l0aW9uLnkgPSByU3VyZmFjZVkgKyBuWSAqIGhlaWdodFNhbXBsZTsKICAgICAgICAgICAgcG9zaXRpb24ueiA9IHJTdXJmYWNlWiArIG5aICogaGVpZ2h0U2FtcGxlOwogICAgICAgICAgICBNYXRyaXg0X2RlZmF1bHQubXVsdGlwbHlCeVBvaW50KHRvRU5VLCBwb3NpdGlvbiwgY2FydGVzaWFuM1NjcmF0Y2g3KTsKICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm1pbmltdW1CeUNvbXBvbmVudChjYXJ0ZXNpYW4zU2NyYXRjaDcsIG1pbmltdW0sIG1pbmltdW0pOwogICAgICAgICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubWF4aW11bUJ5Q29tcG9uZW50KGNhcnRlc2lhbjNTY3JhdGNoNywgbWF4aW11bSwgbWF4aW11bSk7CiAgICAgICAgICAgIGhNaW4gPSBNYXRoLm1pbihoTWluLCBoZWlnaHRTYW1wbGUpOwogICAgICAgICAgICBwb3NpdGlvbnNbaW5kZXhdID0gcG9zaXRpb247CiAgICAgICAgICAgIHV2c1tpbmRleF0gPSBuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KHUzLCB2Myk7CiAgICAgICAgICAgIGhlaWdodHNbaW5kZXhdID0gaGVpZ2h0U2FtcGxlOwogICAgICAgICAgICBpZiAoaW5jbHVkZVdlYk1lcmNhdG9yVCkgewogICAgICAgICAgICAgIHdlYk1lcmNhdG9yVHNbaW5kZXhdID0gd2ViTWVyY2F0b3JUOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbmNsdWRlR2VvZGV0aWNTdXJmYWNlTm9ybWFscykgewogICAgICAgICAgICAgIGdlb2RldGljU3VyZmFjZU5vcm1hbHNbaW5kZXhdID0gZWxsaXBzb2lkLmdlb2RldGljU3VyZmFjZU5vcm1hbChwb3NpdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgYm91bmRpbmdTcGhlcmUzRCA9IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQuZnJvbVBvaW50cyhwb3NpdGlvbnMpOwogICAgICAgIGxldCBvcmllbnRlZEJvdW5kaW5nQm94OwogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQocmVjdGFuZ2xlKSkgewogICAgICAgICAgb3JpZW50ZWRCb3VuZGluZ0JveCA9IE9yaWVudGVkQm91bmRpbmdCb3hfZGVmYXVsdC5mcm9tUmVjdGFuZ2xlKAogICAgICAgICAgICByZWN0YW5nbGUsCiAgICAgICAgICAgIG1pbmltdW1IZWlnaHQsCiAgICAgICAgICAgIG1heGltdW1IZWlnaHQsCiAgICAgICAgICAgIGVsbGlwc29pZAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbGV0IG9jY2x1ZGVlUG9pbnRJblNjYWxlZFNwYWNlOwogICAgICAgIGlmIChoYXNSZWxhdGl2ZVRvQ2VudGVyKSB7CiAgICAgICAgICBjb25zdCBvY2NsdWRlciA9IG5ldyBFbGxpcHNvaWRhbE9jY2x1ZGVyX2RlZmF1bHQoZWxsaXBzb2lkKTsKICAgICAgICAgIG9jY2x1ZGVlUG9pbnRJblNjYWxlZFNwYWNlID0gb2NjbHVkZXIuY29tcHV0ZUhvcml6b25DdWxsaW5nUG9pbnRQb3NzaWJseVVuZGVyRWxsaXBzb2lkKAogICAgICAgICAgICByZWxhdGl2ZVRvQ2VudGVyLAogICAgICAgICAgICBwb3NpdGlvbnMsCiAgICAgICAgICAgIG1pbmltdW1IZWlnaHQKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGFhQm94ID0gbmV3IEF4aXNBbGlnbmVkQm91bmRpbmdCb3hfZGVmYXVsdChtaW5pbXVtLCBtYXhpbXVtLCByZWxhdGl2ZVRvQ2VudGVyKTsKICAgICAgICBjb25zdCBlbmNvZGluZyA9IG5ldyBUZXJyYWluRW5jb2RpbmdfZGVmYXVsdCgKICAgICAgICAgIHJlbGF0aXZlVG9DZW50ZXIsCiAgICAgICAgICBhYUJveCwKICAgICAgICAgIGhNaW4sCiAgICAgICAgICBtYXhpbXVtSGVpZ2h0LAogICAgICAgICAgZnJvbUVOVSwKICAgICAgICAgIGZhbHNlLAogICAgICAgICAgaW5jbHVkZVdlYk1lcmNhdG9yVCwKICAgICAgICAgIGluY2x1ZGVHZW9kZXRpY1N1cmZhY2VOb3JtYWxzLAogICAgICAgICAgZXhhZ2dlcmF0aW9uLAogICAgICAgICAgZXhhZ2dlcmF0aW9uUmVsYXRpdmVIZWlnaHQKICAgICAgICApOwogICAgICAgIGNvbnN0IHZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheSh2ZXJ0ZXhDb3VudCAqIGVuY29kaW5nLnN0cmlkZSk7CiAgICAgICAgbGV0IGJ1ZmZlckluZGV4ID0gMDsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHZlcnRleENvdW50OyArK2opIHsKICAgICAgICAgIGJ1ZmZlckluZGV4ID0gZW5jb2RpbmcuZW5jb2RlKAogICAgICAgICAgICB2ZXJ0aWNlcywKICAgICAgICAgICAgYnVmZmVySW5kZXgsCiAgICAgICAgICAgIHBvc2l0aW9uc1tqXSwKICAgICAgICAgICAgdXZzW2pdLAogICAgICAgICAgICBoZWlnaHRzW2pdLAogICAgICAgICAgICB2b2lkIDAsCiAgICAgICAgICAgIHdlYk1lcmNhdG9yVHNbal0sCiAgICAgICAgICAgIGdlb2RldGljU3VyZmFjZU5vcm1hbHNbal0KICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICB2ZXJ0aWNlcywKICAgICAgICAgIG1heGltdW1IZWlnaHQsCiAgICAgICAgICBtaW5pbXVtSGVpZ2h0LAogICAgICAgICAgZW5jb2RpbmcsCiAgICAgICAgICBib3VuZGluZ1NwaGVyZTNELAogICAgICAgICAgb3JpZW50ZWRCb3VuZGluZ0JveCwKICAgICAgICAgIG9jY2x1ZGVlUG9pbnRJblNjYWxlZFNwYWNlCiAgICAgICAgfTsKICAgICAgfTsKICAgICAgSGVpZ2h0bWFwVGVzc2VsbGF0b3JfZGVmYXVsdCA9IEhlaWdodG1hcFRlc3NlbGxhdG9yOwogICAgfQogIH0pOwoKICAvLyBub2RlX21vZHVsZXMvbGVyYy9MZXJjRGVjb2RlLmpzCiAgdmFyIHJlcXVpcmVfTGVyY0RlY29kZSA9IF9fY29tbW9uSlMoewogICAgIm5vZGVfbW9kdWxlcy9sZXJjL0xlcmNEZWNvZGUuanMiKGV4cG9ydHMyLCBtb2R1bGUpIHsKICAgICAgLyogQ29weXJpZ2h0IDIwMTUtMjAxOCBFc3JpLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIEBwcmVzZXJ2ZSAqLwogICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIExlcmNEZWNvZGUgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgQ250WkltYWdlID0ge307CiAgICAgICAgICBDbnRaSW1hZ2UuZGVmYXVsdE5vRGF0YVZhbHVlID0gLTM0MDI3OTk5Mzg3OTAxNDg0ZTIyOwogICAgICAgICAgQ250WkltYWdlLmRlY29kZSA9IGZ1bmN0aW9uKGlucHV0LCBvcHRpb25zKSB7CiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgICAgICB2YXIgc2tpcE1hc2sgPSBvcHRpb25zLmVuY29kZWRNYXNrRGF0YSB8fCBvcHRpb25zLmVuY29kZWRNYXNrRGF0YSA9PT0gbnVsbDsKICAgICAgICAgICAgdmFyIHBhcnNlZERhdGEgPSBwYXJzZShpbnB1dCwgb3B0aW9ucy5pbnB1dE9mZnNldCB8fCAwLCBza2lwTWFzayk7CiAgICAgICAgICAgIHZhciBub0RhdGFWYWx1ZSA9IG9wdGlvbnMubm9EYXRhVmFsdWUgIT09IG51bGwgPyBvcHRpb25zLm5vRGF0YVZhbHVlIDogQ250WkltYWdlLmRlZmF1bHROb0RhdGFWYWx1ZTsKICAgICAgICAgICAgdmFyIHVuY29tcHJlc3NlZERhdGEgPSB1bmNvbXByZXNzUGl4ZWxWYWx1ZXMoCiAgICAgICAgICAgICAgcGFyc2VkRGF0YSwKICAgICAgICAgICAgICBvcHRpb25zLnBpeGVsVHlwZSB8fCBGbG9hdDMyQXJyYXksCiAgICAgICAgICAgICAgb3B0aW9ucy5lbmNvZGVkTWFza0RhdGEsCiAgICAgICAgICAgICAgbm9EYXRhVmFsdWUsCiAgICAgICAgICAgICAgb3B0aW9ucy5yZXR1cm5NYXNrCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSB7CiAgICAgICAgICAgICAgd2lkdGg6IHBhcnNlZERhdGEud2lkdGgsCiAgICAgICAgICAgICAgaGVpZ2h0OiBwYXJzZWREYXRhLmhlaWdodCwKICAgICAgICAgICAgICBwaXhlbERhdGE6IHVuY29tcHJlc3NlZERhdGEucmVzdWx0UGl4ZWxzLAogICAgICAgICAgICAgIG1pblZhbHVlOiB1bmNvbXByZXNzZWREYXRhLm1pblZhbHVlLAogICAgICAgICAgICAgIG1heFZhbHVlOiBwYXJzZWREYXRhLnBpeGVscy5tYXhWYWx1ZSwKICAgICAgICAgICAgICBub0RhdGFWYWx1ZQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodW5jb21wcmVzc2VkRGF0YS5yZXN1bHRNYXNrKSB7CiAgICAgICAgICAgICAgcmVzdWx0Lm1hc2tEYXRhID0gdW5jb21wcmVzc2VkRGF0YS5yZXN1bHRNYXNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJldHVybkVuY29kZWRNYXNrICYmIHBhcnNlZERhdGEubWFzaykgewogICAgICAgICAgICAgIHJlc3VsdC5lbmNvZGVkTWFza0RhdGEgPSBwYXJzZWREYXRhLm1hc2suYml0c2V0ID8gcGFyc2VkRGF0YS5tYXNrLmJpdHNldCA6IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG9wdGlvbnMucmV0dXJuRmlsZUluZm8pIHsKICAgICAgICAgICAgICByZXN1bHQuZmlsZUluZm8gPSBmb3JtYXRGaWxlSW5mbyhwYXJzZWREYXRhKTsKICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jb21wdXRlVXNlZEJpdERlcHRocykgewogICAgICAgICAgICAgICAgcmVzdWx0LmZpbGVJbmZvLmJpdERlcHRocyA9IGNvbXB1dGVVc2VkQml0RGVwdGhzKHBhcnNlZERhdGEpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgfTsKICAgICAgICAgIHZhciB1bmNvbXByZXNzUGl4ZWxWYWx1ZXMgPSBmdW5jdGlvbihkYXRhLCBUeXBlZEFycmF5Q2xhc3MsIG1hc2tCaXRzZXQsIG5vRGF0YVZhbHVlLCBzdG9yZURlY29kZWRNYXNrKSB7CiAgICAgICAgICAgIHZhciBibG9ja0lkeCA9IDA7CiAgICAgICAgICAgIHZhciBudW1YID0gZGF0YS5waXhlbHMubnVtQmxvY2tzWDsKICAgICAgICAgICAgdmFyIG51bVkgPSBkYXRhLnBpeGVscy5udW1CbG9ja3NZOwogICAgICAgICAgICB2YXIgYmxvY2tXaWR0aCA9IE1hdGguZmxvb3IoZGF0YS53aWR0aCAvIG51bVgpOwogICAgICAgICAgICB2YXIgYmxvY2tIZWlnaHQgPSBNYXRoLmZsb29yKGRhdGEuaGVpZ2h0IC8gbnVtWSk7CiAgICAgICAgICAgIHZhciBzY2FsZSA9IDIgKiBkYXRhLm1heFpFcnJvcjsKICAgICAgICAgICAgdmFyIG1pblZhbHVlID0gTnVtYmVyLk1BWF9WQUxVRSwgY3VycmVudFZhbHVlOwogICAgICAgICAgICBtYXNrQml0c2V0ID0gbWFza0JpdHNldCB8fCAoZGF0YS5tYXNrID8gZGF0YS5tYXNrLmJpdHNldCA6IG51bGwpOwogICAgICAgICAgICB2YXIgcmVzdWx0UGl4ZWxzLCByZXN1bHRNYXNrOwogICAgICAgICAgICByZXN1bHRQaXhlbHMgPSBuZXcgVHlwZWRBcnJheUNsYXNzKGRhdGEud2lkdGggKiBkYXRhLmhlaWdodCk7CiAgICAgICAgICAgIGlmIChzdG9yZURlY29kZWRNYXNrICYmIG1hc2tCaXRzZXQpIHsKICAgICAgICAgICAgICByZXN1bHRNYXNrID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS53aWR0aCAqIGRhdGEuaGVpZ2h0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYmxvY2tEYXRhQnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheShibG9ja1dpZHRoICogYmxvY2tIZWlnaHQpOwogICAgICAgICAgICB2YXIgeHgsIHl5OwogICAgICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8PSBudW1ZOyB5KyspIHsKICAgICAgICAgICAgICB2YXIgdGhpc0Jsb2NrSGVpZ2h0ID0geSAhPT0gbnVtWSA/IGJsb2NrSGVpZ2h0IDogZGF0YS5oZWlnaHQgJSBudW1ZOwogICAgICAgICAgICAgIGlmICh0aGlzQmxvY2tIZWlnaHQgPT09IDApIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8PSBudW1YOyB4KyspIHsKICAgICAgICAgICAgICAgIHZhciB0aGlzQmxvY2tXaWR0aCA9IHggIT09IG51bVggPyBibG9ja1dpZHRoIDogZGF0YS53aWR0aCAlIG51bVg7CiAgICAgICAgICAgICAgICBpZiAodGhpc0Jsb2NrV2lkdGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgb3V0UHRyID0geSAqIGRhdGEud2lkdGggKiBibG9ja0hlaWdodCArIHggKiBibG9ja1dpZHRoOwogICAgICAgICAgICAgICAgdmFyIG91dFN0cmlkZSA9IGRhdGEud2lkdGggLSB0aGlzQmxvY2tXaWR0aDsKICAgICAgICAgICAgICAgIHZhciBibG9jayA9IGRhdGEucGl4ZWxzLmJsb2Nrc1tibG9ja0lkeF07CiAgICAgICAgICAgICAgICB2YXIgYmxvY2tEYXRhLCBibG9ja1B0ciwgY29uc3RWYWx1ZTsKICAgICAgICAgICAgICAgIGlmIChibG9jay5lbmNvZGluZyA8IDIpIHsKICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrLmVuY29kaW5nID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgYmxvY2tEYXRhID0gYmxvY2sucmF3RGF0YTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB1bnN0dWZmKGJsb2NrLnN0dWZmZWREYXRhLCBibG9jay5iaXRzUGVyUGl4ZWwsIGJsb2NrLm51bVZhbGlkUGl4ZWxzLCBibG9jay5vZmZzZXQsIHNjYWxlLCBibG9ja0RhdGFCdWZmZXIsIGRhdGEucGl4ZWxzLm1heFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBibG9ja0RhdGEgPSBibG9ja0RhdGFCdWZmZXI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYmxvY2tQdHIgPSAwOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChibG9jay5lbmNvZGluZyA9PT0gMikgewogICAgICAgICAgICAgICAgICBjb25zdFZhbHVlID0gMDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGNvbnN0VmFsdWUgPSBibG9jay5vZmZzZXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbWFza0J5dGU7CiAgICAgICAgICAgICAgICBpZiAobWFza0JpdHNldCkgewogICAgICAgICAgICAgICAgICBmb3IgKHl5ID0gMDsgeXkgPCB0aGlzQmxvY2tIZWlnaHQ7IHl5KyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAob3V0UHRyICYgNykgewogICAgICAgICAgICAgICAgICAgICAgbWFza0J5dGUgPSBtYXNrQml0c2V0W291dFB0ciA+PiAzXTsKICAgICAgICAgICAgICAgICAgICAgIG1hc2tCeXRlIDw8PSBvdXRQdHIgJiA3OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKHh4ID0gMDsgeHggPCB0aGlzQmxvY2tXaWR0aDsgeHgrKykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCEob3V0UHRyICYgNykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFza0J5dGUgPSBtYXNrQml0c2V0W291dFB0ciA+PiAzXTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXNrQnl0ZSAmIDEyOCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0TWFzaykgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdE1hc2tbb3V0UHRyXSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlID0gYmxvY2suZW5jb2RpbmcgPCAyID8gYmxvY2tEYXRhW2Jsb2NrUHRyKytdIDogY29uc3RWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgbWluVmFsdWUgPSBtaW5WYWx1ZSA+IGN1cnJlbnRWYWx1ZSA/IGN1cnJlbnRWYWx1ZSA6IG1pblZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRQaXhlbHNbb3V0UHRyKytdID0gY3VycmVudFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdE1hc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRNYXNrW291dFB0cl0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFBpeGVsc1tvdXRQdHIrK10gPSBub0RhdGFWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG1hc2tCeXRlIDw8PSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvdXRQdHIgKz0gb3V0U3RyaWRlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiAoYmxvY2suZW5jb2RpbmcgPCAyKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh5eSA9IDA7IHl5IDwgdGhpc0Jsb2NrSGVpZ2h0OyB5eSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICBmb3IgKHh4ID0gMDsgeHggPCB0aGlzQmxvY2tXaWR0aDsgeHgrKykgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBibG9ja0RhdGFbYmxvY2tQdHIrK107CiAgICAgICAgICAgICAgICAgICAgICAgIG1pblZhbHVlID0gbWluVmFsdWUgPiBjdXJyZW50VmFsdWUgPyBjdXJyZW50VmFsdWUgOiBtaW5WYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0UGl4ZWxzW291dFB0cisrXSA9IGN1cnJlbnRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG91dFB0ciArPSBvdXRTdHJpZGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG1pblZhbHVlID0gbWluVmFsdWUgPiBjb25zdFZhbHVlID8gY29uc3RWYWx1ZSA6IG1pblZhbHVlOwogICAgICAgICAgICAgICAgICAgIGZvciAoeXkgPSAwOyB5eSA8IHRoaXNCbG9ja0hlaWdodDsgeXkrKykgewogICAgICAgICAgICAgICAgICAgICAgZm9yICh4eCA9IDA7IHh4IDwgdGhpc0Jsb2NrV2lkdGg7IHh4KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0UGl4ZWxzW291dFB0cisrXSA9IGNvbnN0VmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBvdXRQdHIgKz0gb3V0U3RyaWRlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGJsb2NrLmVuY29kaW5nID09PSAxICYmIGJsb2NrUHRyICE9PSBibG9jay5udW1WYWxpZFBpeGVscykgewogICAgICAgICAgICAgICAgICB0aHJvdyAiQmxvY2sgYW5kIE1hc2sgZG8gbm90IG1hdGNoIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJsb2NrSWR4Kys7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgcmVzdWx0UGl4ZWxzLAogICAgICAgICAgICAgIHJlc3VsdE1hc2ssCiAgICAgICAgICAgICAgbWluVmFsdWUKICAgICAgICAgICAgfTsKICAgICAgICAgIH07CiAgICAgICAgICB2YXIgZm9ybWF0RmlsZUluZm8gPSBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgImZpbGVJZGVudGlmaWVyU3RyaW5nIjogZGF0YS5maWxlSWRlbnRpZmllclN0cmluZywKICAgICAgICAgICAgICAiZmlsZVZlcnNpb24iOiBkYXRhLmZpbGVWZXJzaW9uLAogICAgICAgICAgICAgICJpbWFnZVR5cGUiOiBkYXRhLmltYWdlVHlwZSwKICAgICAgICAgICAgICAiaGVpZ2h0IjogZGF0YS5oZWlnaHQsCiAgICAgICAgICAgICAgIndpZHRoIjogZGF0YS53aWR0aCwKICAgICAgICAgICAgICAibWF4WkVycm9yIjogZGF0YS5tYXhaRXJyb3IsCiAgICAgICAgICAgICAgImVvZk9mZnNldCI6IGRhdGEuZW9mT2Zmc2V0LAogICAgICAgICAgICAgICJtYXNrIjogZGF0YS5tYXNrID8gewogICAgICAgICAgICAgICAgIm51bUJsb2Nrc1giOiBkYXRhLm1hc2subnVtQmxvY2tzWCwKICAgICAgICAgICAgICAgICJudW1CbG9ja3NZIjogZGF0YS5tYXNrLm51bUJsb2Nrc1ksCiAgICAgICAgICAgICAgICAibnVtQnl0ZXMiOiBkYXRhLm1hc2subnVtQnl0ZXMsCiAgICAgICAgICAgICAgICAibWF4VmFsdWUiOiBkYXRhLm1hc2subWF4VmFsdWUKICAgICAgICAgICAgICB9IDogbnVsbCwKICAgICAgICAgICAgICAicGl4ZWxzIjogewogICAgICAgICAgICAgICAgIm51bUJsb2Nrc1giOiBkYXRhLnBpeGVscy5udW1CbG9ja3NYLAogICAgICAgICAgICAgICAgIm51bUJsb2Nrc1kiOiBkYXRhLnBpeGVscy5udW1CbG9ja3NZLAogICAgICAgICAgICAgICAgIm51bUJ5dGVzIjogZGF0YS5waXhlbHMubnVtQnl0ZXMsCiAgICAgICAgICAgICAgICAibWF4VmFsdWUiOiBkYXRhLnBpeGVscy5tYXhWYWx1ZSwKICAgICAgICAgICAgICAgICJub0RhdGFWYWx1ZSI6IGRhdGEubm9EYXRhVmFsdWUKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICB9OwogICAgICAgICAgdmFyIGNvbXB1dGVVc2VkQml0RGVwdGhzID0gZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICB2YXIgbnVtQmxvY2tzID0gZGF0YS5waXhlbHMubnVtQmxvY2tzWCAqIGRhdGEucGl4ZWxzLm51bUJsb2Nrc1k7CiAgICAgICAgICAgIHZhciBiaXREZXB0aHMgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1CbG9ja3M7IGkrKykgewogICAgICAgICAgICAgIHZhciBibG9jayA9IGRhdGEucGl4ZWxzLmJsb2Nrc1tpXTsKICAgICAgICAgICAgICBpZiAoYmxvY2suZW5jb2RpbmcgPT09IDApIHsKICAgICAgICAgICAgICAgIGJpdERlcHRocy5mbG9hdDMyID0gdHJ1ZTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJsb2NrLmVuY29kaW5nID09PSAxKSB7CiAgICAgICAgICAgICAgICBiaXREZXB0aHNbYmxvY2suYml0c1BlclBpeGVsXSA9IHRydWU7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGJpdERlcHRoc1swXSA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhiaXREZXB0aHMpOwogICAgICAgICAgfTsKICAgICAgICAgIHZhciBwYXJzZSA9IGZ1bmN0aW9uKGlucHV0LCBmcCwgc2tpcE1hc2spIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSB7fTsKICAgICAgICAgICAgdmFyIGZpbGVJZFZpZXcgPSBuZXcgVWludDhBcnJheShpbnB1dCwgZnAsIDEwKTsKICAgICAgICAgICAgZGF0YS5maWxlSWRlbnRpZmllclN0cmluZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgZmlsZUlkVmlldyk7CiAgICAgICAgICAgIGlmIChkYXRhLmZpbGVJZGVudGlmaWVyU3RyaW5nLnRyaW0oKSAhPT0gIkNudFpJbWFnZSIpIHsKICAgICAgICAgICAgICB0aHJvdyAiVW5leHBlY3RlZCBmaWxlIGlkZW50aWZpZXIgc3RyaW5nOiAiICsgZGF0YS5maWxlSWRlbnRpZmllclN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcCArPSAxMDsKICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcoaW5wdXQsIGZwLCAyNCk7CiAgICAgICAgICAgIGRhdGEuZmlsZVZlcnNpb24gPSB2aWV3LmdldEludDMyKDAsIHRydWUpOwogICAgICAgICAgICBkYXRhLmltYWdlVHlwZSA9IHZpZXcuZ2V0SW50MzIoNCwgdHJ1ZSk7CiAgICAgICAgICAgIGRhdGEuaGVpZ2h0ID0gdmlldy5nZXRVaW50MzIoOCwgdHJ1ZSk7CiAgICAgICAgICAgIGRhdGEud2lkdGggPSB2aWV3LmdldFVpbnQzMigxMiwgdHJ1ZSk7CiAgICAgICAgICAgIGRhdGEubWF4WkVycm9yID0gdmlldy5nZXRGbG9hdDY0KDE2LCB0cnVlKTsKICAgICAgICAgICAgZnAgKz0gMjQ7CiAgICAgICAgICAgIGlmICghc2tpcE1hc2spIHsKICAgICAgICAgICAgICB2aWV3ID0gbmV3IERhdGFWaWV3KGlucHV0LCBmcCwgMTYpOwogICAgICAgICAgICAgIGRhdGEubWFzayA9IHt9OwogICAgICAgICAgICAgIGRhdGEubWFzay5udW1CbG9ja3NZID0gdmlldy5nZXRVaW50MzIoMCwgdHJ1ZSk7CiAgICAgICAgICAgICAgZGF0YS5tYXNrLm51bUJsb2Nrc1ggPSB2aWV3LmdldFVpbnQzMig0LCB0cnVlKTsKICAgICAgICAgICAgICBkYXRhLm1hc2subnVtQnl0ZXMgPSB2aWV3LmdldFVpbnQzMig4LCB0cnVlKTsKICAgICAgICAgICAgICBkYXRhLm1hc2subWF4VmFsdWUgPSB2aWV3LmdldEZsb2F0MzIoMTIsIHRydWUpOwogICAgICAgICAgICAgIGZwICs9IDE2OwogICAgICAgICAgICAgIGlmIChkYXRhLm1hc2subnVtQnl0ZXMgPiAwKSB7CiAgICAgICAgICAgICAgICB2YXIgYml0c2V0ID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKGRhdGEud2lkdGggKiBkYXRhLmhlaWdodCAvIDgpKTsKICAgICAgICAgICAgICAgIHZpZXcgPSBuZXcgRGF0YVZpZXcoaW5wdXQsIGZwLCBkYXRhLm1hc2subnVtQnl0ZXMpOwogICAgICAgICAgICAgICAgdmFyIGNudCA9IHZpZXcuZ2V0SW50MTYoMCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB2YXIgaXAgPSAyLCBvcCA9IDA7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgIGlmIChjbnQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNudC0tKSB7CiAgICAgICAgICAgICAgICAgICAgICBiaXRzZXRbb3ArK10gPSB2aWV3LmdldFVpbnQ4KGlwKyspOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gdmlldy5nZXRVaW50OChpcCsrKTsKICAgICAgICAgICAgICAgICAgICBjbnQgPSAtY250OwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbnQtLSkgewogICAgICAgICAgICAgICAgICAgICAgYml0c2V0W29wKytdID0gdmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBjbnQgPSB2aWV3LmdldEludDE2KGlwLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgaXAgKz0gMjsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGlwIDwgZGF0YS5tYXNrLm51bUJ5dGVzKTsKICAgICAgICAgICAgICAgIGlmIChjbnQgIT09IC0zMjc2OCB8fCBvcCA8IGJpdHNldC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgdGhyb3cgIlVuZXhwZWN0ZWQgZW5kIG9mIG1hc2sgUkxFIGVuY29kaW5nIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEubWFzay5iaXRzZXQgPSBiaXRzZXQ7CiAgICAgICAgICAgICAgICBmcCArPSBkYXRhLm1hc2subnVtQnl0ZXM7CiAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZGF0YS5tYXNrLm51bUJ5dGVzIHwgZGF0YS5tYXNrLm51bUJsb2Nrc1kgfCBkYXRhLm1hc2subWF4VmFsdWUpID09PSAwKSB7CiAgICAgICAgICAgICAgICBkYXRhLm1hc2suYml0c2V0ID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKGRhdGEud2lkdGggKiBkYXRhLmhlaWdodCAvIDgpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmlldyA9IG5ldyBEYXRhVmlldyhpbnB1dCwgZnAsIDE2KTsKICAgICAgICAgICAgZGF0YS5waXhlbHMgPSB7fTsKICAgICAgICAgICAgZGF0YS5waXhlbHMubnVtQmxvY2tzWSA9IHZpZXcuZ2V0VWludDMyKDAsIHRydWUpOwogICAgICAgICAgICBkYXRhLnBpeGVscy5udW1CbG9ja3NYID0gdmlldy5nZXRVaW50MzIoNCwgdHJ1ZSk7CiAgICAgICAgICAgIGRhdGEucGl4ZWxzLm51bUJ5dGVzID0gdmlldy5nZXRVaW50MzIoOCwgdHJ1ZSk7CiAgICAgICAgICAgIGRhdGEucGl4ZWxzLm1heFZhbHVlID0gdmlldy5nZXRGbG9hdDMyKDEyLCB0cnVlKTsKICAgICAgICAgICAgZnAgKz0gMTY7CiAgICAgICAgICAgIHZhciBudW1CbG9ja3NYID0gZGF0YS5waXhlbHMubnVtQmxvY2tzWDsKICAgICAgICAgICAgdmFyIG51bUJsb2Nrc1kgPSBkYXRhLnBpeGVscy5udW1CbG9ja3NZOwogICAgICAgICAgICB2YXIgYWN0dWFsTnVtQmxvY2tzWCA9IG51bUJsb2Nrc1ggKyAoZGF0YS53aWR0aCAlIG51bUJsb2Nrc1ggPiAwID8gMSA6IDApOwogICAgICAgICAgICB2YXIgYWN0dWFsTnVtQmxvY2tzWSA9IG51bUJsb2Nrc1kgKyAoZGF0YS5oZWlnaHQgJSBudW1CbG9ja3NZID4gMCA/IDEgOiAwKTsKICAgICAgICAgICAgZGF0YS5waXhlbHMuYmxvY2tzID0gbmV3IEFycmF5KGFjdHVhbE51bUJsb2Nrc1ggKiBhY3R1YWxOdW1CbG9ja3NZKTsKICAgICAgICAgICAgdmFyIGJsb2NrSSA9IDA7CiAgICAgICAgICAgIGZvciAodmFyIGJsb2NrWSA9IDA7IGJsb2NrWSA8IGFjdHVhbE51bUJsb2Nrc1k7IGJsb2NrWSsrKSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgYmxvY2tYID0gMDsgYmxvY2tYIDwgYWN0dWFsTnVtQmxvY2tzWDsgYmxvY2tYKyspIHsKICAgICAgICAgICAgICAgIHZhciBzaXplID0gMDsKICAgICAgICAgICAgICAgIHZhciBieXRlc0xlZnQgPSBpbnB1dC5ieXRlTGVuZ3RoIC0gZnA7CiAgICAgICAgICAgICAgICB2aWV3ID0gbmV3IERhdGFWaWV3KGlucHV0LCBmcCwgTWF0aC5taW4oMTAsIGJ5dGVzTGVmdCkpOwogICAgICAgICAgICAgICAgdmFyIGJsb2NrID0ge307CiAgICAgICAgICAgICAgICBkYXRhLnBpeGVscy5ibG9ja3NbYmxvY2tJKytdID0gYmxvY2s7CiAgICAgICAgICAgICAgICB2YXIgaGVhZGVyQnl0ZSA9IHZpZXcuZ2V0VWludDgoMCk7CiAgICAgICAgICAgICAgICBzaXplKys7CiAgICAgICAgICAgICAgICBibG9jay5lbmNvZGluZyA9IGhlYWRlckJ5dGUgJiA2MzsKICAgICAgICAgICAgICAgIGlmIChibG9jay5lbmNvZGluZyA+IDMpIHsKICAgICAgICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgYmxvY2sgZW5jb2RpbmcgKCIgKyBibG9jay5lbmNvZGluZyArICIpIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChibG9jay5lbmNvZGluZyA9PT0gMikgewogICAgICAgICAgICAgICAgICBmcCsrOwogICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChoZWFkZXJCeXRlICE9PSAwICYmIGhlYWRlckJ5dGUgIT09IDIpIHsKICAgICAgICAgICAgICAgICAgaGVhZGVyQnl0ZSA+Pj0gNjsKICAgICAgICAgICAgICAgICAgYmxvY2sub2Zmc2V0VHlwZSA9IGhlYWRlckJ5dGU7CiAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXJCeXRlID09PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgYmxvY2sub2Zmc2V0ID0gdmlldy5nZXRJbnQ4KDEpOwogICAgICAgICAgICAgICAgICAgIHNpemUrKzsKICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXJCeXRlID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgYmxvY2sub2Zmc2V0ID0gdmlldy5nZXRJbnQxNigxLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBzaXplICs9IDI7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyQnl0ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIGJsb2NrLm9mZnNldCA9IHZpZXcuZ2V0RmxvYXQzMigxLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBzaXplICs9IDQ7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgYmxvY2sgb2Zmc2V0IHR5cGUiOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChibG9jay5lbmNvZGluZyA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgIGhlYWRlckJ5dGUgPSB2aWV3LmdldFVpbnQ4KHNpemUpOwogICAgICAgICAgICAgICAgICAgIHNpemUrKzsKICAgICAgICAgICAgICAgICAgICBibG9jay5iaXRzUGVyUGl4ZWwgPSBoZWFkZXJCeXRlICYgNjM7CiAgICAgICAgICAgICAgICAgICAgaGVhZGVyQnl0ZSA+Pj0gNjsKICAgICAgICAgICAgICAgICAgICBibG9jay5udW1WYWxpZFBpeGVsc1R5cGUgPSBoZWFkZXJCeXRlOwogICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXJCeXRlID09PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICBibG9jay5udW1WYWxpZFBpeGVscyA9IHZpZXcuZ2V0VWludDgoc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICBzaXplKys7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXJCeXRlID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICBibG9jay5udW1WYWxpZFBpeGVscyA9IHZpZXcuZ2V0VWludDE2KHNpemUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSAyOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyQnl0ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgYmxvY2subnVtVmFsaWRQaXhlbHMgPSB2aWV3LmdldFVpbnQzMihzaXplLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gNDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgdmFsaWQgcGl4ZWwgY291bnQgdHlwZSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmcCArPSBzaXplOwogICAgICAgICAgICAgICAgaWYgKGJsb2NrLmVuY29kaW5nID09PSAzKSB7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGFycmF5QnVmLCBzdG9yZTg7CiAgICAgICAgICAgICAgICBpZiAoYmxvY2suZW5jb2RpbmcgPT09IDApIHsKICAgICAgICAgICAgICAgICAgdmFyIG51bVBpeGVscyA9IChkYXRhLnBpeGVscy5udW1CeXRlcyAtIDEpIC8gNDsKICAgICAgICAgICAgICAgICAgaWYgKG51bVBpeGVscyAhPT0gTWF0aC5mbG9vcihudW1QaXhlbHMpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgInVuY29tcHJlc3NlZCBibG9jayBoYXMgaW52YWxpZCBsZW5ndGgiOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGFycmF5QnVmID0gbmV3IEFycmF5QnVmZmVyKG51bVBpeGVscyAqIDQpOwogICAgICAgICAgICAgICAgICBzdG9yZTggPSBuZXcgVWludDhBcnJheShhcnJheUJ1Zik7CiAgICAgICAgICAgICAgICAgIHN0b3JlOC5zZXQobmV3IFVpbnQ4QXJyYXkoaW5wdXQsIGZwLCBudW1QaXhlbHMgKiA0KSk7CiAgICAgICAgICAgICAgICAgIHZhciByYXdEYXRhID0gbmV3IEZsb2F0MzJBcnJheShhcnJheUJ1Zik7CiAgICAgICAgICAgICAgICAgIGJsb2NrLnJhd0RhdGEgPSByYXdEYXRhOwogICAgICAgICAgICAgICAgICBmcCArPSBudW1QaXhlbHMgKiA0OwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChibG9jay5lbmNvZGluZyA9PT0gMSkgewogICAgICAgICAgICAgICAgICB2YXIgZGF0YUJ5dGVzID0gTWF0aC5jZWlsKGJsb2NrLm51bVZhbGlkUGl4ZWxzICogYmxvY2suYml0c1BlclBpeGVsIC8gOCk7CiAgICAgICAgICAgICAgICAgIHZhciBkYXRhV29yZHMgPSBNYXRoLmNlaWwoZGF0YUJ5dGVzIC8gNCk7CiAgICAgICAgICAgICAgICAgIGFycmF5QnVmID0gbmV3IEFycmF5QnVmZmVyKGRhdGFXb3JkcyAqIDQpOwogICAgICAgICAgICAgICAgICBzdG9yZTggPSBuZXcgVWludDhBcnJheShhcnJheUJ1Zik7CiAgICAgICAgICAgICAgICAgIHN0b3JlOC5zZXQobmV3IFVpbnQ4QXJyYXkoaW5wdXQsIGZwLCBkYXRhQnl0ZXMpKTsKICAgICAgICAgICAgICAgICAgYmxvY2suc3R1ZmZlZERhdGEgPSBuZXcgVWludDMyQXJyYXkoYXJyYXlCdWYpOwogICAgICAgICAgICAgICAgICBmcCArPSBkYXRhQnl0ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGRhdGEuZW9mT2Zmc2V0ID0gZnA7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgfTsKICAgICAgICAgIHZhciB1bnN0dWZmID0gZnVuY3Rpb24oc3JjLCBiaXRzUGVyUGl4ZWwsIG51bVBpeGVscywgb2Zmc2V0LCBzY2FsZSwgZGVzdCwgbWF4VmFsdWUpIHsKICAgICAgICAgICAgdmFyIGJpdE1hc2sgPSAoMSA8PCBiaXRzUGVyUGl4ZWwpIC0gMTsKICAgICAgICAgICAgdmFyIGkgPSAwLCBvOwogICAgICAgICAgICB2YXIgYml0c0xlZnQgPSAwOwogICAgICAgICAgICB2YXIgbiwgYnVmZmVyOwogICAgICAgICAgICB2YXIgbm1heCA9IE1hdGguY2VpbCgobWF4VmFsdWUgLSBvZmZzZXQpIC8gc2NhbGUpOwogICAgICAgICAgICB2YXIgbnVtSW52YWxpZFRhaWxCeXRlcyA9IHNyYy5sZW5ndGggKiA0IC0gTWF0aC5jZWlsKGJpdHNQZXJQaXhlbCAqIG51bVBpeGVscyAvIDgpOwogICAgICAgICAgICBzcmNbc3JjLmxlbmd0aCAtIDFdIDw8PSA4ICogbnVtSW52YWxpZFRhaWxCeXRlczsKICAgICAgICAgICAgZm9yIChvID0gMDsgbyA8IG51bVBpeGVsczsgbysrKSB7CiAgICAgICAgICAgICAgaWYgKGJpdHNMZWZ0ID09PSAwKSB7CiAgICAgICAgICAgICAgICBidWZmZXIgPSBzcmNbaSsrXTsKICAgICAgICAgICAgICAgIGJpdHNMZWZ0ID0gMzI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChiaXRzTGVmdCA+PSBiaXRzUGVyUGl4ZWwpIHsKICAgICAgICAgICAgICAgIG4gPSBidWZmZXIgPj4+IGJpdHNMZWZ0IC0gYml0c1BlclBpeGVsICYgYml0TWFzazsKICAgICAgICAgICAgICAgIGJpdHNMZWZ0IC09IGJpdHNQZXJQaXhlbDsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIG1pc3NpbmdCaXRzID0gYml0c1BlclBpeGVsIC0gYml0c0xlZnQ7CiAgICAgICAgICAgICAgICBuID0gKGJ1ZmZlciAmIGJpdE1hc2spIDw8IG1pc3NpbmdCaXRzICYgYml0TWFzazsKICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHNyY1tpKytdOwogICAgICAgICAgICAgICAgYml0c0xlZnQgPSAzMiAtIG1pc3NpbmdCaXRzOwogICAgICAgICAgICAgICAgbiArPSBidWZmZXIgPj4+IGJpdHNMZWZ0OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBkZXN0W29dID0gbiA8IG5tYXggPyBvZmZzZXQgKyBuICogc2NhbGUgOiBtYXhWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGVzdDsKICAgICAgICAgIH07CiAgICAgICAgICByZXR1cm4gQ250WkltYWdlOwogICAgICAgIH0pKCk7CiAgICAgICAgdmFyIExlcmMyRGVjb2RlID0gKGZ1bmN0aW9uKCkgewogICAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgICAgdmFyIEJpdFN0dWZmZXIgPSB7CiAgICAgICAgICAgIC8vbWV0aG9kcyBlbmRpbmcgd2l0aCAyIGFyZSBmb3IgdGhlIG5ldyBieXRlIG9yZGVyIHVzZWQgYnkgTGVyYzIuMyBhbmQgYWJvdmUuCiAgICAgICAgICAgIC8vb3JpZ2luYWxVbnN0dWZmIGlzIHVzZWQgdG8gdW5wYWNrIEh1ZmZtYW4gY29kZSB0YWJsZS4gY29kZSBpcyBkdXBsaWNhdGVkIHRvIHVuc3R1ZmZ4IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgogICAgICAgICAgICB1bnN0dWZmOiBmdW5jdGlvbihzcmMsIGRlc3QsIGJpdHNQZXJQaXhlbCwgbnVtUGl4ZWxzLCBsdXRBcnIsIG9mZnNldCwgc2NhbGUsIG1heFZhbHVlKSB7CiAgICAgICAgICAgICAgdmFyIGJpdE1hc2sgPSAoMSA8PCBiaXRzUGVyUGl4ZWwpIC0gMTsKICAgICAgICAgICAgICB2YXIgaSA9IDAsIG87CiAgICAgICAgICAgICAgdmFyIGJpdHNMZWZ0ID0gMDsKICAgICAgICAgICAgICB2YXIgbiwgYnVmZmVyLCBtaXNzaW5nQml0cywgbm1heDsKICAgICAgICAgICAgICB2YXIgbnVtSW52YWxpZFRhaWxCeXRlcyA9IHNyYy5sZW5ndGggKiA0IC0gTWF0aC5jZWlsKGJpdHNQZXJQaXhlbCAqIG51bVBpeGVscyAvIDgpOwogICAgICAgICAgICAgIHNyY1tzcmMubGVuZ3RoIC0gMV0gPDw9IDggKiBudW1JbnZhbGlkVGFpbEJ5dGVzOwogICAgICAgICAgICAgIGlmIChsdXRBcnIpIHsKICAgICAgICAgICAgICAgIGZvciAobyA9IDA7IG8gPCBudW1QaXhlbHM7IG8rKykgewogICAgICAgICAgICAgICAgICBpZiAoYml0c0xlZnQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBzcmNbaSsrXTsKICAgICAgICAgICAgICAgICAgICBiaXRzTGVmdCA9IDMyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChiaXRzTGVmdCA+PSBiaXRzUGVyUGl4ZWwpIHsKICAgICAgICAgICAgICAgICAgICBuID0gYnVmZmVyID4+PiBiaXRzTGVmdCAtIGJpdHNQZXJQaXhlbCAmIGJpdE1hc2s7CiAgICAgICAgICAgICAgICAgICAgYml0c0xlZnQgLT0gYml0c1BlclBpeGVsOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG1pc3NpbmdCaXRzID0gYml0c1BlclBpeGVsIC0gYml0c0xlZnQ7CiAgICAgICAgICAgICAgICAgICAgbiA9IChidWZmZXIgJiBiaXRNYXNrKSA8PCBtaXNzaW5nQml0cyAmIGJpdE1hc2s7CiAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gc3JjW2krK107CiAgICAgICAgICAgICAgICAgICAgYml0c0xlZnQgPSAzMiAtIG1pc3NpbmdCaXRzOwogICAgICAgICAgICAgICAgICAgIG4gKz0gYnVmZmVyID4+PiBiaXRzTGVmdDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBkZXN0W29dID0gbHV0QXJyW25dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBubWF4ID0gTWF0aC5jZWlsKChtYXhWYWx1ZSAtIG9mZnNldCkgLyBzY2FsZSk7CiAgICAgICAgICAgICAgICBmb3IgKG8gPSAwOyBvIDwgbnVtUGl4ZWxzOyBvKyspIHsKICAgICAgICAgICAgICAgICAgaWYgKGJpdHNMZWZ0ID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gc3JjW2krK107CiAgICAgICAgICAgICAgICAgICAgYml0c0xlZnQgPSAzMjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoYml0c0xlZnQgPj0gYml0c1BlclBpeGVsKSB7CiAgICAgICAgICAgICAgICAgICAgbiA9IGJ1ZmZlciA+Pj4gYml0c0xlZnQgLSBiaXRzUGVyUGl4ZWwgJiBiaXRNYXNrOwogICAgICAgICAgICAgICAgICAgIGJpdHNMZWZ0IC09IGJpdHNQZXJQaXhlbDsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtaXNzaW5nQml0cyA9IGJpdHNQZXJQaXhlbCAtIGJpdHNMZWZ0OwogICAgICAgICAgICAgICAgICAgIG4gPSAoYnVmZmVyICYgYml0TWFzaykgPDwgbWlzc2luZ0JpdHMgJiBiaXRNYXNrOwogICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHNyY1tpKytdOwogICAgICAgICAgICAgICAgICAgIGJpdHNMZWZ0ID0gMzIgLSBtaXNzaW5nQml0czsKICAgICAgICAgICAgICAgICAgICBuICs9IGJ1ZmZlciA+Pj4gYml0c0xlZnQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZGVzdFtvXSA9IG4gPCBubWF4ID8gb2Zmc2V0ICsgbiAqIHNjYWxlIDogbWF4VmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB1bnN0dWZmTFVUOiBmdW5jdGlvbihzcmMsIGJpdHNQZXJQaXhlbCwgbnVtUGl4ZWxzLCBvZmZzZXQsIHNjYWxlLCBtYXhWYWx1ZSkgewogICAgICAgICAgICAgIHZhciBiaXRNYXNrID0gKDEgPDwgYml0c1BlclBpeGVsKSAtIDE7CiAgICAgICAgICAgICAgdmFyIGkgPSAwLCBvID0gMCwgbWlzc2luZ0JpdHMgPSAwLCBiaXRzTGVmdCA9IDAsIG4gPSAwOwogICAgICAgICAgICAgIHZhciBidWZmZXI7CiAgICAgICAgICAgICAgdmFyIGRlc3QgPSBbXTsKICAgICAgICAgICAgICB2YXIgbnVtSW52YWxpZFRhaWxCeXRlcyA9IHNyYy5sZW5ndGggKiA0IC0gTWF0aC5jZWlsKGJpdHNQZXJQaXhlbCAqIG51bVBpeGVscyAvIDgpOwogICAgICAgICAgICAgIHNyY1tzcmMubGVuZ3RoIC0gMV0gPDw9IDggKiBudW1JbnZhbGlkVGFpbEJ5dGVzOwogICAgICAgICAgICAgIHZhciBubWF4ID0gTWF0aC5jZWlsKChtYXhWYWx1ZSAtIG9mZnNldCkgLyBzY2FsZSk7CiAgICAgICAgICAgICAgZm9yIChvID0gMDsgbyA8IG51bVBpeGVsczsgbysrKSB7CiAgICAgICAgICAgICAgICBpZiAoYml0c0xlZnQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgYnVmZmVyID0gc3JjW2krK107CiAgICAgICAgICAgICAgICAgIGJpdHNMZWZ0ID0gMzI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYml0c0xlZnQgPj0gYml0c1BlclBpeGVsKSB7CiAgICAgICAgICAgICAgICAgIG4gPSBidWZmZXIgPj4+IGJpdHNMZWZ0IC0gYml0c1BlclBpeGVsICYgYml0TWFzazsKICAgICAgICAgICAgICAgICAgYml0c0xlZnQgLT0gYml0c1BlclBpeGVsOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgbWlzc2luZ0JpdHMgPSBiaXRzUGVyUGl4ZWwgLSBiaXRzTGVmdDsKICAgICAgICAgICAgICAgICAgbiA9IChidWZmZXIgJiBiaXRNYXNrKSA8PCBtaXNzaW5nQml0cyAmIGJpdE1hc2s7CiAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHNyY1tpKytdOwogICAgICAgICAgICAgICAgICBiaXRzTGVmdCA9IDMyIC0gbWlzc2luZ0JpdHM7CiAgICAgICAgICAgICAgICAgIG4gKz0gYnVmZmVyID4+PiBiaXRzTGVmdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlc3Rbb10gPSBuIDwgbm1heCA/IG9mZnNldCArIG4gKiBzY2FsZSA6IG1heFZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBkZXN0LnVuc2hpZnQob2Zmc2V0KTsKICAgICAgICAgICAgICByZXR1cm4gZGVzdDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdW5zdHVmZjI6IGZ1bmN0aW9uKHNyYywgZGVzdCwgYml0c1BlclBpeGVsLCBudW1QaXhlbHMsIGx1dEFyciwgb2Zmc2V0LCBzY2FsZSwgbWF4VmFsdWUpIHsKICAgICAgICAgICAgICB2YXIgYml0TWFzayA9ICgxIDw8IGJpdHNQZXJQaXhlbCkgLSAxOwogICAgICAgICAgICAgIHZhciBpID0gMCwgbzsKICAgICAgICAgICAgICB2YXIgYml0c0xlZnQgPSAwLCBiaXRQb3MgPSAwOwogICAgICAgICAgICAgIHZhciBuLCBidWZmZXIsIG1pc3NpbmdCaXRzOwogICAgICAgICAgICAgIGlmIChsdXRBcnIpIHsKICAgICAgICAgICAgICAgIGZvciAobyA9IDA7IG8gPCBudW1QaXhlbHM7IG8rKykgewogICAgICAgICAgICAgICAgICBpZiAoYml0c0xlZnQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBzcmNbaSsrXTsKICAgICAgICAgICAgICAgICAgICBiaXRzTGVmdCA9IDMyOwogICAgICAgICAgICAgICAgICAgIGJpdFBvcyA9IDA7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGJpdHNMZWZ0ID49IGJpdHNQZXJQaXhlbCkgewogICAgICAgICAgICAgICAgICAgIG4gPSBidWZmZXIgPj4+IGJpdFBvcyAmIGJpdE1hc2s7CiAgICAgICAgICAgICAgICAgICAgYml0c0xlZnQgLT0gYml0c1BlclBpeGVsOwogICAgICAgICAgICAgICAgICAgIGJpdFBvcyArPSBiaXRzUGVyUGl4ZWw7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbWlzc2luZ0JpdHMgPSBiaXRzUGVyUGl4ZWwgLSBiaXRzTGVmdDsKICAgICAgICAgICAgICAgICAgICBuID0gYnVmZmVyID4+PiBiaXRQb3MgJiBiaXRNYXNrOwogICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHNyY1tpKytdOwogICAgICAgICAgICAgICAgICAgIGJpdHNMZWZ0ID0gMzIgLSBtaXNzaW5nQml0czsKICAgICAgICAgICAgICAgICAgICBuIHw9IChidWZmZXIgJiAoMSA8PCBtaXNzaW5nQml0cykgLSAxKSA8PCBiaXRzUGVyUGl4ZWwgLSBtaXNzaW5nQml0czsKICAgICAgICAgICAgICAgICAgICBiaXRQb3MgPSBtaXNzaW5nQml0czsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBkZXN0W29dID0gbHV0QXJyW25dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgbm1heCA9IE1hdGguY2VpbCgobWF4VmFsdWUgLSBvZmZzZXQpIC8gc2NhbGUpOwogICAgICAgICAgICAgICAgZm9yIChvID0gMDsgbyA8IG51bVBpeGVsczsgbysrKSB7CiAgICAgICAgICAgICAgICAgIGlmIChiaXRzTGVmdCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHNyY1tpKytdOwogICAgICAgICAgICAgICAgICAgIGJpdHNMZWZ0ID0gMzI7CiAgICAgICAgICAgICAgICAgICAgYml0UG9zID0gMDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoYml0c0xlZnQgPj0gYml0c1BlclBpeGVsKSB7CiAgICAgICAgICAgICAgICAgICAgbiA9IGJ1ZmZlciA+Pj4gYml0UG9zICYgYml0TWFzazsKICAgICAgICAgICAgICAgICAgICBiaXRzTGVmdCAtPSBiaXRzUGVyUGl4ZWw7CiAgICAgICAgICAgICAgICAgICAgYml0UG9zICs9IGJpdHNQZXJQaXhlbDsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtaXNzaW5nQml0cyA9IGJpdHNQZXJQaXhlbCAtIGJpdHNMZWZ0OwogICAgICAgICAgICAgICAgICAgIG4gPSBidWZmZXIgPj4+IGJpdFBvcyAmIGJpdE1hc2s7CiAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gc3JjW2krK107CiAgICAgICAgICAgICAgICAgICAgYml0c0xlZnQgPSAzMiAtIG1pc3NpbmdCaXRzOwogICAgICAgICAgICAgICAgICAgIG4gfD0gKGJ1ZmZlciAmICgxIDw8IG1pc3NpbmdCaXRzKSAtIDEpIDw8IGJpdHNQZXJQaXhlbCAtIG1pc3NpbmdCaXRzOwogICAgICAgICAgICAgICAgICAgIGJpdFBvcyA9IG1pc3NpbmdCaXRzOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGRlc3Rbb10gPSBuIDwgbm1heCA/IG9mZnNldCArIG4gKiBzY2FsZSA6IG1heFZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gZGVzdDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdW5zdHVmZkxVVDI6IGZ1bmN0aW9uKHNyYywgYml0c1BlclBpeGVsLCBudW1QaXhlbHMsIG9mZnNldCwgc2NhbGUsIG1heFZhbHVlKSB7CiAgICAgICAgICAgICAgdmFyIGJpdE1hc2sgPSAoMSA8PCBiaXRzUGVyUGl4ZWwpIC0gMTsKICAgICAgICAgICAgICB2YXIgaSA9IDAsIG8gPSAwLCBtaXNzaW5nQml0cyA9IDAsIGJpdHNMZWZ0ID0gMCwgbiA9IDAsIGJpdFBvcyA9IDA7CiAgICAgICAgICAgICAgdmFyIGJ1ZmZlcjsKICAgICAgICAgICAgICB2YXIgZGVzdCA9IFtdOwogICAgICAgICAgICAgIHZhciBubWF4ID0gTWF0aC5jZWlsKChtYXhWYWx1ZSAtIG9mZnNldCkgLyBzY2FsZSk7CiAgICAgICAgICAgICAgZm9yIChvID0gMDsgbyA8IG51bVBpeGVsczsgbysrKSB7CiAgICAgICAgICAgICAgICBpZiAoYml0c0xlZnQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgYnVmZmVyID0gc3JjW2krK107CiAgICAgICAgICAgICAgICAgIGJpdHNMZWZ0ID0gMzI7CiAgICAgICAgICAgICAgICAgIGJpdFBvcyA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYml0c0xlZnQgPj0gYml0c1BlclBpeGVsKSB7CiAgICAgICAgICAgICAgICAgIG4gPSBidWZmZXIgPj4+IGJpdFBvcyAmIGJpdE1hc2s7CiAgICAgICAgICAgICAgICAgIGJpdHNMZWZ0IC09IGJpdHNQZXJQaXhlbDsKICAgICAgICAgICAgICAgICAgYml0UG9zICs9IGJpdHNQZXJQaXhlbDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIG1pc3NpbmdCaXRzID0gYml0c1BlclBpeGVsIC0gYml0c0xlZnQ7CiAgICAgICAgICAgICAgICAgIG4gPSBidWZmZXIgPj4+IGJpdFBvcyAmIGJpdE1hc2s7CiAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHNyY1tpKytdOwogICAgICAgICAgICAgICAgICBiaXRzTGVmdCA9IDMyIC0gbWlzc2luZ0JpdHM7CiAgICAgICAgICAgICAgICAgIG4gfD0gKGJ1ZmZlciAmICgxIDw8IG1pc3NpbmdCaXRzKSAtIDEpIDw8IGJpdHNQZXJQaXhlbCAtIG1pc3NpbmdCaXRzOwogICAgICAgICAgICAgICAgICBiaXRQb3MgPSBtaXNzaW5nQml0czsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlc3Rbb10gPSBuIDwgbm1heCA/IG9mZnNldCArIG4gKiBzY2FsZSA6IG1heFZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBkZXN0LnVuc2hpZnQob2Zmc2V0KTsKICAgICAgICAgICAgICByZXR1cm4gZGVzdDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb3JpZ2luYWxVbnN0dWZmOiBmdW5jdGlvbihzcmMsIGRlc3QsIGJpdHNQZXJQaXhlbCwgbnVtUGl4ZWxzKSB7CiAgICAgICAgICAgICAgdmFyIGJpdE1hc2sgPSAoMSA8PCBiaXRzUGVyUGl4ZWwpIC0gMTsKICAgICAgICAgICAgICB2YXIgaSA9IDAsIG87CiAgICAgICAgICAgICAgdmFyIGJpdHNMZWZ0ID0gMDsKICAgICAgICAgICAgICB2YXIgbiwgYnVmZmVyLCBtaXNzaW5nQml0czsKICAgICAgICAgICAgICB2YXIgbnVtSW52YWxpZFRhaWxCeXRlcyA9IHNyYy5sZW5ndGggKiA0IC0gTWF0aC5jZWlsKGJpdHNQZXJQaXhlbCAqIG51bVBpeGVscyAvIDgpOwogICAgICAgICAgICAgIHNyY1tzcmMubGVuZ3RoIC0gMV0gPDw9IDggKiBudW1JbnZhbGlkVGFpbEJ5dGVzOwogICAgICAgICAgICAgIGZvciAobyA9IDA7IG8gPCBudW1QaXhlbHM7IG8rKykgewogICAgICAgICAgICAgICAgaWYgKGJpdHNMZWZ0ID09PSAwKSB7CiAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHNyY1tpKytdOwogICAgICAgICAgICAgICAgICBiaXRzTGVmdCA9IDMyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGJpdHNMZWZ0ID49IGJpdHNQZXJQaXhlbCkgewogICAgICAgICAgICAgICAgICBuID0gYnVmZmVyID4+PiBiaXRzTGVmdCAtIGJpdHNQZXJQaXhlbCAmIGJpdE1hc2s7CiAgICAgICAgICAgICAgICAgIGJpdHNMZWZ0IC09IGJpdHNQZXJQaXhlbDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIG1pc3NpbmdCaXRzID0gYml0c1BlclBpeGVsIC0gYml0c0xlZnQ7CiAgICAgICAgICAgICAgICAgIG4gPSAoYnVmZmVyICYgYml0TWFzaykgPDwgbWlzc2luZ0JpdHMgJiBiaXRNYXNrOwogICAgICAgICAgICAgICAgICBidWZmZXIgPSBzcmNbaSsrXTsKICAgICAgICAgICAgICAgICAgYml0c0xlZnQgPSAzMiAtIG1pc3NpbmdCaXRzOwogICAgICAgICAgICAgICAgICBuICs9IGJ1ZmZlciA+Pj4gYml0c0xlZnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZXN0W29dID0gbjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGRlc3Q7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9yaWdpbmFsVW5zdHVmZjI6IGZ1bmN0aW9uKHNyYywgZGVzdCwgYml0c1BlclBpeGVsLCBudW1QaXhlbHMpIHsKICAgICAgICAgICAgICB2YXIgYml0TWFzayA9ICgxIDw8IGJpdHNQZXJQaXhlbCkgLSAxOwogICAgICAgICAgICAgIHZhciBpID0gMCwgbzsKICAgICAgICAgICAgICB2YXIgYml0c0xlZnQgPSAwLCBiaXRQb3MgPSAwOwogICAgICAgICAgICAgIHZhciBuLCBidWZmZXIsIG1pc3NpbmdCaXRzOwogICAgICAgICAgICAgIGZvciAobyA9IDA7IG8gPCBudW1QaXhlbHM7IG8rKykgewogICAgICAgICAgICAgICAgaWYgKGJpdHNMZWZ0ID09PSAwKSB7CiAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHNyY1tpKytdOwogICAgICAgICAgICAgICAgICBiaXRzTGVmdCA9IDMyOwogICAgICAgICAgICAgICAgICBiaXRQb3MgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGJpdHNMZWZ0ID49IGJpdHNQZXJQaXhlbCkgewogICAgICAgICAgICAgICAgICBuID0gYnVmZmVyID4+PiBiaXRQb3MgJiBiaXRNYXNrOwogICAgICAgICAgICAgICAgICBiaXRzTGVmdCAtPSBiaXRzUGVyUGl4ZWw7CiAgICAgICAgICAgICAgICAgIGJpdFBvcyArPSBiaXRzUGVyUGl4ZWw7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBtaXNzaW5nQml0cyA9IGJpdHNQZXJQaXhlbCAtIGJpdHNMZWZ0OwogICAgICAgICAgICAgICAgICBuID0gYnVmZmVyID4+PiBiaXRQb3MgJiBiaXRNYXNrOwogICAgICAgICAgICAgICAgICBidWZmZXIgPSBzcmNbaSsrXTsKICAgICAgICAgICAgICAgICAgYml0c0xlZnQgPSAzMiAtIG1pc3NpbmdCaXRzOwogICAgICAgICAgICAgICAgICBuIHw9IChidWZmZXIgJiAoMSA8PCBtaXNzaW5nQml0cykgLSAxKSA8PCBiaXRzUGVyUGl4ZWwgLSBtaXNzaW5nQml0czsKICAgICAgICAgICAgICAgICAgYml0UG9zID0gbWlzc2luZ0JpdHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZXN0W29dID0gbjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGRlc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICB2YXIgTGVyYzJIZWxwZXJzID0gewogICAgICAgICAgICBIVUZGTUFOX0xVVF9CSVRTX01BWDogMTIsCiAgICAgICAgICAgIC8vdXNlIDJeMTIgbHV0LCB0cmVhdCBpdCBsaWtlIGNvbnN0YW50CiAgICAgICAgICAgIGNvbXB1dGVDaGVja3N1bUZsZXRjaGVyMzI6IGZ1bmN0aW9uKGlucHV0KSB7CiAgICAgICAgICAgICAgdmFyIHN1bTEgPSA2NTUzNSwgc3VtMiA9IDY1NTM1OwogICAgICAgICAgICAgIHZhciBsZW4gPSBpbnB1dC5sZW5ndGg7CiAgICAgICAgICAgICAgdmFyIHdvcmRzID0gTWF0aC5mbG9vcihsZW4gLyAyKTsKICAgICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgICAgd2hpbGUgKHdvcmRzKSB7CiAgICAgICAgICAgICAgICB2YXIgdGxlbiA9IHdvcmRzID49IDM1OSA/IDM1OSA6IHdvcmRzOwogICAgICAgICAgICAgICAgd29yZHMgLT0gdGxlbjsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgc3VtMSArPSBpbnB1dFtpKytdIDw8IDg7CiAgICAgICAgICAgICAgICAgIHN1bTIgKz0gc3VtMSArPSBpbnB1dFtpKytdOwogICAgICAgICAgICAgICAgfSB3aGlsZSAoLS10bGVuKTsKICAgICAgICAgICAgICAgIHN1bTEgPSAoc3VtMSAmIDY1NTM1KSArIChzdW0xID4+PiAxNik7CiAgICAgICAgICAgICAgICBzdW0yID0gKHN1bTIgJiA2NTUzNSkgKyAoc3VtMiA+Pj4gMTYpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGVuICYgMSkgewogICAgICAgICAgICAgICAgc3VtMiArPSBzdW0xICs9IGlucHV0W2ldIDw8IDg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN1bTEgPSAoc3VtMSAmIDY1NTM1KSArIChzdW0xID4+PiAxNik7CiAgICAgICAgICAgICAgc3VtMiA9IChzdW0yICYgNjU1MzUpICsgKHN1bTIgPj4+IDE2KTsKICAgICAgICAgICAgICByZXR1cm4gKHN1bTIgPDwgMTYgfCBzdW0xKSA+Pj4gMDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVhZEhlYWRlckluZm86IGZ1bmN0aW9uKGlucHV0LCBkYXRhKSB7CiAgICAgICAgICAgICAgdmFyIHB0ciA9IGRhdGEucHRyOwogICAgICAgICAgICAgIHZhciBmaWxlSWRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoaW5wdXQsIHB0ciwgNik7CiAgICAgICAgICAgICAgdmFyIGhlYWRlckluZm8gPSB7fTsKICAgICAgICAgICAgICBoZWFkZXJJbmZvLmZpbGVJZGVudGlmaWVyU3RyaW5nID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBmaWxlSWRWaWV3KTsKICAgICAgICAgICAgICBpZiAoaGVhZGVySW5mby5maWxlSWRlbnRpZmllclN0cmluZy5sYXN0SW5kZXhPZigiTGVyYzIiLCAwKSAhPT0gMCkgewogICAgICAgICAgICAgICAgdGhyb3cgIlVuZXhwZWN0ZWQgZmlsZSBpZGVudGlmaWVyIHN0cmluZyAoZXhwZWN0IExlcmMyICk6ICIgKyBoZWFkZXJJbmZvLmZpbGVJZGVudGlmaWVyU3RyaW5nOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwdHIgKz0gNjsKICAgICAgICAgICAgICB2YXIgdmlldyA9IG5ldyBEYXRhVmlldyhpbnB1dCwgcHRyLCA4KTsKICAgICAgICAgICAgICB2YXIgZmlsZVZlcnNpb24gPSB2aWV3LmdldEludDMyKDAsIHRydWUpOwogICAgICAgICAgICAgIGhlYWRlckluZm8uZmlsZVZlcnNpb24gPSBmaWxlVmVyc2lvbjsKICAgICAgICAgICAgICBwdHIgKz0gNDsKICAgICAgICAgICAgICBpZiAoZmlsZVZlcnNpb24gPj0gMykgewogICAgICAgICAgICAgICAgaGVhZGVySW5mby5jaGVja3N1bSA9IHZpZXcuZ2V0VWludDMyKDQsIHRydWUpOwogICAgICAgICAgICAgICAgcHRyICs9IDQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZpZXcgPSBuZXcgRGF0YVZpZXcoaW5wdXQsIHB0ciwgMTIpOwogICAgICAgICAgICAgIGhlYWRlckluZm8uaGVpZ2h0ID0gdmlldy5nZXRVaW50MzIoMCwgdHJ1ZSk7CiAgICAgICAgICAgICAgaGVhZGVySW5mby53aWR0aCA9IHZpZXcuZ2V0VWludDMyKDQsIHRydWUpOwogICAgICAgICAgICAgIHB0ciArPSA4OwogICAgICAgICAgICAgIGlmIChmaWxlVmVyc2lvbiA+PSA0KSB7CiAgICAgICAgICAgICAgICBoZWFkZXJJbmZvLm51bURpbXMgPSB2aWV3LmdldFVpbnQzMig4LCB0cnVlKTsKICAgICAgICAgICAgICAgIHB0ciArPSA0OwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBoZWFkZXJJbmZvLm51bURpbXMgPSAxOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB2aWV3ID0gbmV3IERhdGFWaWV3KGlucHV0LCBwdHIsIDQwKTsKICAgICAgICAgICAgICBoZWFkZXJJbmZvLm51bVZhbGlkUGl4ZWwgPSB2aWV3LmdldFVpbnQzMigwLCB0cnVlKTsKICAgICAgICAgICAgICBoZWFkZXJJbmZvLm1pY3JvQmxvY2tTaXplID0gdmlldy5nZXRJbnQzMig0LCB0cnVlKTsKICAgICAgICAgICAgICBoZWFkZXJJbmZvLmJsb2JTaXplID0gdmlldy5nZXRJbnQzMig4LCB0cnVlKTsKICAgICAgICAgICAgICBoZWFkZXJJbmZvLmltYWdlVHlwZSA9IHZpZXcuZ2V0SW50MzIoMTIsIHRydWUpOwogICAgICAgICAgICAgIGhlYWRlckluZm8ubWF4WkVycm9yID0gdmlldy5nZXRGbG9hdDY0KDE2LCB0cnVlKTsKICAgICAgICAgICAgICBoZWFkZXJJbmZvLnpNaW4gPSB2aWV3LmdldEZsb2F0NjQoMjQsIHRydWUpOwogICAgICAgICAgICAgIGhlYWRlckluZm8uek1heCA9IHZpZXcuZ2V0RmxvYXQ2NCgzMiwgdHJ1ZSk7CiAgICAgICAgICAgICAgcHRyICs9IDQwOwogICAgICAgICAgICAgIGRhdGEuaGVhZGVySW5mbyA9IGhlYWRlckluZm87CiAgICAgICAgICAgICAgZGF0YS5wdHIgPSBwdHI7CiAgICAgICAgICAgICAgdmFyIGNoZWNrc3VtLCBrZXlMZW5ndGg7CiAgICAgICAgICAgICAgaWYgKGZpbGVWZXJzaW9uID49IDMpIHsKICAgICAgICAgICAgICAgIGtleUxlbmd0aCA9IGZpbGVWZXJzaW9uID49IDQgPyA1MiA6IDQ4OwogICAgICAgICAgICAgICAgY2hlY2tzdW0gPSB0aGlzLmNvbXB1dGVDaGVja3N1bUZsZXRjaGVyMzIobmV3IFVpbnQ4QXJyYXkoaW5wdXQsIHB0ciAtIGtleUxlbmd0aCwgaGVhZGVySW5mby5ibG9iU2l6ZSAtIDE0KSk7CiAgICAgICAgICAgICAgICBpZiAoY2hlY2tzdW0gIT09IGhlYWRlckluZm8uY2hlY2tzdW0pIHsKICAgICAgICAgICAgICAgICAgdGhyb3cgIkNoZWNrc3VtIGZhaWxlZC4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2hlY2tNaW5NYXhSYW5nZXM6IGZ1bmN0aW9uKGlucHV0LCBkYXRhKSB7CiAgICAgICAgICAgICAgdmFyIGhlYWRlckluZm8gPSBkYXRhLmhlYWRlckluZm87CiAgICAgICAgICAgICAgdmFyIE91dFBpeGVsVHlwZUFycmF5ID0gdGhpcy5nZXREYXRhVHlwZUFycmF5KGhlYWRlckluZm8uaW1hZ2VUeXBlKTsKICAgICAgICAgICAgICB2YXIgcmFuZ2VCeXRlcyA9IGhlYWRlckluZm8ubnVtRGltcyAqIHRoaXMuZ2V0RGF0YVR5cGVTaXplKGhlYWRlckluZm8uaW1hZ2VUeXBlKTsKICAgICAgICAgICAgICB2YXIgbWluVmFsdWVzID0gdGhpcy5yZWFkU3ViQXJyYXkoaW5wdXQsIGRhdGEucHRyLCBPdXRQaXhlbFR5cGVBcnJheSwgcmFuZ2VCeXRlcyk7CiAgICAgICAgICAgICAgdmFyIG1heFZhbHVlcyA9IHRoaXMucmVhZFN1YkFycmF5KGlucHV0LCBkYXRhLnB0ciArIHJhbmdlQnl0ZXMsIE91dFBpeGVsVHlwZUFycmF5LCByYW5nZUJ5dGVzKTsKICAgICAgICAgICAgICBkYXRhLnB0ciArPSAyICogcmFuZ2VCeXRlczsKICAgICAgICAgICAgICB2YXIgaSwgZXF1YWwgPSB0cnVlOwogICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWFkZXJJbmZvLm51bURpbXM7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKG1pblZhbHVlc1tpXSAhPT0gbWF4VmFsdWVzW2ldKSB7CiAgICAgICAgICAgICAgICAgIGVxdWFsID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBoZWFkZXJJbmZvLm1pblZhbHVlcyA9IG1pblZhbHVlczsKICAgICAgICAgICAgICBoZWFkZXJJbmZvLm1heFZhbHVlcyA9IG1heFZhbHVlczsKICAgICAgICAgICAgICByZXR1cm4gZXF1YWw7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlYWRTdWJBcnJheTogZnVuY3Rpb24oaW5wdXQsIHB0ciwgT3V0UGl4ZWxUeXBlQXJyYXksIG51bUJ5dGVzKSB7CiAgICAgICAgICAgICAgdmFyIHJhd0RhdGE7CiAgICAgICAgICAgICAgaWYgKE91dFBpeGVsVHlwZUFycmF5ID09PSBVaW50OEFycmF5KSB7CiAgICAgICAgICAgICAgICByYXdEYXRhID0gbmV3IFVpbnQ4QXJyYXkoaW5wdXQsIHB0ciwgbnVtQnl0ZXMpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgYXJyYXlCdWYgPSBuZXcgQXJyYXlCdWZmZXIobnVtQnl0ZXMpOwogICAgICAgICAgICAgICAgdmFyIHN0b3JlOCA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmKTsKICAgICAgICAgICAgICAgIHN0b3JlOC5zZXQobmV3IFVpbnQ4QXJyYXkoaW5wdXQsIHB0ciwgbnVtQnl0ZXMpKTsKICAgICAgICAgICAgICAgIHJhd0RhdGEgPSBuZXcgT3V0UGl4ZWxUeXBlQXJyYXkoYXJyYXlCdWYpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gcmF3RGF0YTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVhZE1hc2s6IGZ1bmN0aW9uKGlucHV0LCBkYXRhKSB7CiAgICAgICAgICAgICAgdmFyIHB0ciA9IGRhdGEucHRyOwogICAgICAgICAgICAgIHZhciBoZWFkZXJJbmZvID0gZGF0YS5oZWFkZXJJbmZvOwogICAgICAgICAgICAgIHZhciBudW1QaXhlbHMgPSBoZWFkZXJJbmZvLndpZHRoICogaGVhZGVySW5mby5oZWlnaHQ7CiAgICAgICAgICAgICAgdmFyIG51bVZhbGlkUGl4ZWwgPSBoZWFkZXJJbmZvLm51bVZhbGlkUGl4ZWw7CiAgICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcoaW5wdXQsIHB0ciwgNCk7CiAgICAgICAgICAgICAgdmFyIG1hc2sgPSB7fTsKICAgICAgICAgICAgICBtYXNrLm51bUJ5dGVzID0gdmlldy5nZXRVaW50MzIoMCwgdHJ1ZSk7CiAgICAgICAgICAgICAgcHRyICs9IDQ7CiAgICAgICAgICAgICAgaWYgKCgwID09PSBudW1WYWxpZFBpeGVsIHx8IG51bVBpeGVscyA9PT0gbnVtVmFsaWRQaXhlbCkgJiYgMCAhPT0gbWFzay5udW1CeXRlcykgewogICAgICAgICAgICAgICAgdGhyb3cgImludmFsaWQgbWFzayI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciBiaXRzZXQsIHJlc3VsdE1hc2s7CiAgICAgICAgICAgICAgaWYgKG51bVZhbGlkUGl4ZWwgPT09IDApIHsKICAgICAgICAgICAgICAgIGJpdHNldCA9IG5ldyBVaW50OEFycmF5KE1hdGguY2VpbChudW1QaXhlbHMgLyA4KSk7CiAgICAgICAgICAgICAgICBtYXNrLmJpdHNldCA9IGJpdHNldDsKICAgICAgICAgICAgICAgIHJlc3VsdE1hc2sgPSBuZXcgVWludDhBcnJheShudW1QaXhlbHMpOwogICAgICAgICAgICAgICAgZGF0YS5waXhlbHMucmVzdWx0TWFzayA9IHJlc3VsdE1hc2s7CiAgICAgICAgICAgICAgICBwdHIgKz0gbWFzay5udW1CeXRlczsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hc2subnVtQnl0ZXMgPiAwKSB7CiAgICAgICAgICAgICAgICBiaXRzZXQgPSBuZXcgVWludDhBcnJheShNYXRoLmNlaWwobnVtUGl4ZWxzIC8gOCkpOwogICAgICAgICAgICAgICAgdmlldyA9IG5ldyBEYXRhVmlldyhpbnB1dCwgcHRyLCBtYXNrLm51bUJ5dGVzKTsKICAgICAgICAgICAgICAgIHZhciBjbnQgPSB2aWV3LmdldEludDE2KDAsIHRydWUpOwogICAgICAgICAgICAgICAgdmFyIGlwID0gMiwgb3AgPSAwLCB2YWwgPSAwOwogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICBpZiAoY250ID4gMCkgewogICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbnQtLSkgewogICAgICAgICAgICAgICAgICAgICAgYml0c2V0W29wKytdID0gdmlldy5nZXRVaW50OChpcCsrKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gdmlldy5nZXRVaW50OChpcCsrKTsKICAgICAgICAgICAgICAgICAgICBjbnQgPSAtY250OwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbnQtLSkgewogICAgICAgICAgICAgICAgICAgICAgYml0c2V0W29wKytdID0gdmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBjbnQgPSB2aWV3LmdldEludDE2KGlwLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgaXAgKz0gMjsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGlwIDwgbWFzay5udW1CeXRlcyk7CiAgICAgICAgICAgICAgICBpZiAoY250ICE9PSAtMzI3NjggfHwgb3AgPCBiaXRzZXQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgIHRocm93ICJVbmV4cGVjdGVkIGVuZCBvZiBtYXNrIFJMRSBlbmNvZGluZyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXN1bHRNYXNrID0gbmV3IFVpbnQ4QXJyYXkobnVtUGl4ZWxzKTsKICAgICAgICAgICAgICAgIHZhciBtYiA9IDAsIGsgPSAwOwogICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG51bVBpeGVsczsgaysrKSB7CiAgICAgICAgICAgICAgICAgIGlmIChrICYgNykgewogICAgICAgICAgICAgICAgICAgIG1iID0gYml0c2V0W2sgPj4gM107CiAgICAgICAgICAgICAgICAgICAgbWIgPDw9IGsgJiA3OwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG1iID0gYml0c2V0W2sgPj4gM107CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKG1iICYgMTI4KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0TWFza1trXSA9IDE7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEucGl4ZWxzLnJlc3VsdE1hc2sgPSByZXN1bHRNYXNrOwogICAgICAgICAgICAgICAgbWFzay5iaXRzZXQgPSBiaXRzZXQ7CiAgICAgICAgICAgICAgICBwdHIgKz0gbWFzay5udW1CeXRlczsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZGF0YS5wdHIgPSBwdHI7CiAgICAgICAgICAgICAgZGF0YS5tYXNrID0gbWFzazsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVhZERhdGFPbmVTd2VlcDogZnVuY3Rpb24oaW5wdXQsIGRhdGEsIE91dFBpeGVsVHlwZUFycmF5KSB7CiAgICAgICAgICAgICAgdmFyIHB0ciA9IGRhdGEucHRyOwogICAgICAgICAgICAgIHZhciBoZWFkZXJJbmZvID0gZGF0YS5oZWFkZXJJbmZvOwogICAgICAgICAgICAgIHZhciBudW1EaW1zID0gaGVhZGVySW5mby5udW1EaW1zOwogICAgICAgICAgICAgIHZhciBudW1QaXhlbHMgPSBoZWFkZXJJbmZvLndpZHRoICogaGVhZGVySW5mby5oZWlnaHQ7CiAgICAgICAgICAgICAgdmFyIGltYWdlVHlwZSA9IGhlYWRlckluZm8uaW1hZ2VUeXBlOwogICAgICAgICAgICAgIHZhciBudW1CeXRlcyA9IGhlYWRlckluZm8ubnVtVmFsaWRQaXhlbCAqIExlcmMySGVscGVycy5nZXREYXRhVHlwZVNpemUoaW1hZ2VUeXBlKSAqIG51bURpbXM7CiAgICAgICAgICAgICAgdmFyIHJhd0RhdGE7CiAgICAgICAgICAgICAgdmFyIG1hc2sgPSBkYXRhLnBpeGVscy5yZXN1bHRNYXNrOwogICAgICAgICAgICAgIGlmIChPdXRQaXhlbFR5cGVBcnJheSA9PT0gVWludDhBcnJheSkgewogICAgICAgICAgICAgICAgcmF3RGF0YSA9IG5ldyBVaW50OEFycmF5KGlucHV0LCBwdHIsIG51bUJ5dGVzKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGFycmF5QnVmID0gbmV3IEFycmF5QnVmZmVyKG51bUJ5dGVzKTsKICAgICAgICAgICAgICAgIHZhciBzdG9yZTggPSBuZXcgVWludDhBcnJheShhcnJheUJ1Zik7CiAgICAgICAgICAgICAgICBzdG9yZTguc2V0KG5ldyBVaW50OEFycmF5KGlucHV0LCBwdHIsIG51bUJ5dGVzKSk7CiAgICAgICAgICAgICAgICByYXdEYXRhID0gbmV3IE91dFBpeGVsVHlwZUFycmF5KGFycmF5QnVmKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHJhd0RhdGEubGVuZ3RoID09PSBudW1QaXhlbHMgKiBudW1EaW1zKSB7CiAgICAgICAgICAgICAgICBkYXRhLnBpeGVscy5yZXN1bHRQaXhlbHMgPSByYXdEYXRhOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLnBpeGVscy5yZXN1bHRQaXhlbHMgPSBuZXcgT3V0UGl4ZWxUeXBlQXJyYXkobnVtUGl4ZWxzICogbnVtRGltcyk7CiAgICAgICAgICAgICAgICB2YXIgeiA9IDAsIGsgPSAwLCBpID0gMCwgblN0YXJ0ID0gMDsKICAgICAgICAgICAgICAgIGlmIChudW1EaW1zID4gMSkgewogICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtRGltczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgblN0YXJ0ID0gaSAqIG51bVBpeGVsczsKICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbnVtUGl4ZWxzOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXNrW2tdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucGl4ZWxzLnJlc3VsdFBpeGVsc1tuU3RhcnQgKyBrXSA9IHJhd0RhdGFbeisrXTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBudW1QaXhlbHM7IGsrKykgewogICAgICAgICAgICAgICAgICAgIGlmIChtYXNrW2tdKSB7CiAgICAgICAgICAgICAgICAgICAgICBkYXRhLnBpeGVscy5yZXN1bHRQaXhlbHNba10gPSByYXdEYXRhW3orK107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHB0ciArPSBudW1CeXRlczsKICAgICAgICAgICAgICBkYXRhLnB0ciA9IHB0cjsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVhZEh1ZmZtYW5UcmVlOiBmdW5jdGlvbihpbnB1dCwgZGF0YSkgewogICAgICAgICAgICAgIHZhciBCSVRTX01BWCA9IHRoaXMuSFVGRk1BTl9MVVRfQklUU19NQVg7CiAgICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcoaW5wdXQsIGRhdGEucHRyLCAxNik7CiAgICAgICAgICAgICAgZGF0YS5wdHIgKz0gMTY7CiAgICAgICAgICAgICAgdmFyIHZlcnNpb24gPSB2aWV3LmdldEludDMyKDAsIHRydWUpOwogICAgICAgICAgICAgIGlmICh2ZXJzaW9uIDwgMikgewogICAgICAgICAgICAgICAgdGhyb3cgInVuc3VwcG9ydGVkIEh1ZmZtYW4gdmVyc2lvbiI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciBzaXplID0gdmlldy5nZXRJbnQzMig0LCB0cnVlKTsKICAgICAgICAgICAgICB2YXIgaTAgPSB2aWV3LmdldEludDMyKDgsIHRydWUpOwogICAgICAgICAgICAgIHZhciBpMSA9IHZpZXcuZ2V0SW50MzIoMTIsIHRydWUpOwogICAgICAgICAgICAgIGlmIChpMCA+PSBpMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB2YXIgYmxvY2tEYXRhQnVmZmVyID0gbmV3IFVpbnQzMkFycmF5KGkxIC0gaTApOwogICAgICAgICAgICAgIExlcmMySGVscGVycy5kZWNvZGVCaXRzKGlucHV0LCBkYXRhLCBibG9ja0RhdGFCdWZmZXIpOwogICAgICAgICAgICAgIHZhciBjb2RlVGFibGUgPSBbXTsKICAgICAgICAgICAgICB2YXIgaSwgaiwgaywgbGVuOwogICAgICAgICAgICAgIGZvciAoaSA9IGkwOyBpIDwgaTE7IGkrKykgewogICAgICAgICAgICAgICAgaiA9IGkgLSAoaSA8IHNpemUgPyAwIDogc2l6ZSk7CiAgICAgICAgICAgICAgICBjb2RlVGFibGVbal0gPSB7IGZpcnN0OiBibG9ja0RhdGFCdWZmZXJbaSAtIGkwXSwgc2Vjb25kOiBudWxsIH07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciBkYXRhQnl0ZXMgPSBpbnB1dC5ieXRlTGVuZ3RoIC0gZGF0YS5wdHI7CiAgICAgICAgICAgICAgdmFyIGRhdGFXb3JkcyA9IE1hdGguY2VpbChkYXRhQnl0ZXMgLyA0KTsKICAgICAgICAgICAgICB2YXIgYXJyYXlCdWYgPSBuZXcgQXJyYXlCdWZmZXIoZGF0YVdvcmRzICogNCk7CiAgICAgICAgICAgICAgdmFyIHN0b3JlOCA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmKTsKICAgICAgICAgICAgICBzdG9yZTguc2V0KG5ldyBVaW50OEFycmF5KGlucHV0LCBkYXRhLnB0ciwgZGF0YUJ5dGVzKSk7CiAgICAgICAgICAgICAgdmFyIHN0dWZmZWREYXRhID0gbmV3IFVpbnQzMkFycmF5KGFycmF5QnVmKTsKICAgICAgICAgICAgICB2YXIgYml0UG9zID0gMCwgd29yZCwgc3JjUHRyID0gMDsKICAgICAgICAgICAgICB3b3JkID0gc3R1ZmZlZERhdGFbMF07CiAgICAgICAgICAgICAgZm9yIChpID0gaTA7IGkgPCBpMTsgaSsrKSB7CiAgICAgICAgICAgICAgICBqID0gaSAtIChpIDwgc2l6ZSA/IDAgOiBzaXplKTsKICAgICAgICAgICAgICAgIGxlbiA9IGNvZGVUYWJsZVtqXS5maXJzdDsKICAgICAgICAgICAgICAgIGlmIChsZW4gPiAwKSB7CiAgICAgICAgICAgICAgICAgIGNvZGVUYWJsZVtqXS5zZWNvbmQgPSB3b3JkIDw8IGJpdFBvcyA+Pj4gMzIgLSBsZW47CiAgICAgICAgICAgICAgICAgIGlmICgzMiAtIGJpdFBvcyA+PSBsZW4pIHsKICAgICAgICAgICAgICAgICAgICBiaXRQb3MgKz0gbGVuOwogICAgICAgICAgICAgICAgICAgIGlmIChiaXRQb3MgPT09IDMyKSB7CiAgICAgICAgICAgICAgICAgICAgICBiaXRQb3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgc3JjUHRyKys7CiAgICAgICAgICAgICAgICAgICAgICB3b3JkID0gc3R1ZmZlZERhdGFbc3JjUHRyXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYml0UG9zICs9IGxlbiAtIDMyOwogICAgICAgICAgICAgICAgICAgIHNyY1B0cisrOwogICAgICAgICAgICAgICAgICAgIHdvcmQgPSBzdHVmZmVkRGF0YVtzcmNQdHJdOwogICAgICAgICAgICAgICAgICAgIGNvZGVUYWJsZVtqXS5zZWNvbmQgfD0gd29yZCA+Pj4gMzIgLSBiaXRQb3M7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIG51bUJpdHNMVVQgPSAwLCBudW1CaXRzTFVUUWljayA9IDA7CiAgICAgICAgICAgICAgdmFyIHRyZWUgPSBuZXcgVHJlZU5vZGUoKTsKICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29kZVRhYmxlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoY29kZVRhYmxlW2ldICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgICAgICAgbnVtQml0c0xVVCA9IE1hdGgubWF4KG51bUJpdHNMVVQsIGNvZGVUYWJsZVtpXS5maXJzdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChudW1CaXRzTFVUID49IEJJVFNfTUFYKSB7CiAgICAgICAgICAgICAgICBudW1CaXRzTFVUUWljayA9IEJJVFNfTUFYOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBudW1CaXRzTFVUUWljayA9IG51bUJpdHNMVVQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChudW1CaXRzTFVUID49IDMwKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiV0FSbmluZywgbGFyZ2UgTlVNIExVVCBCSVRTIElTICIgKyBudW1CaXRzTFVUKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIGRlY29kZUx1dCA9IFtdLCBlbnRyeSwgY29kZSwgbnVtRW50cmllcywgamosIGN1cnJlbnRCaXQsIG5vZGU7CiAgICAgICAgICAgICAgZm9yIChpID0gaTA7IGkgPCBpMTsgaSsrKSB7CiAgICAgICAgICAgICAgICBqID0gaSAtIChpIDwgc2l6ZSA/IDAgOiBzaXplKTsKICAgICAgICAgICAgICAgIGxlbiA9IGNvZGVUYWJsZVtqXS5maXJzdDsKICAgICAgICAgICAgICAgIGlmIChsZW4gPiAwKSB7CiAgICAgICAgICAgICAgICAgIGVudHJ5ID0gW2xlbiwgal07CiAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gbnVtQml0c0xVVFFpY2spIHsKICAgICAgICAgICAgICAgICAgICBjb2RlID0gY29kZVRhYmxlW2pdLnNlY29uZCA8PCBudW1CaXRzTFVUUWljayAtIGxlbjsKICAgICAgICAgICAgICAgICAgICBudW1FbnRyaWVzID0gMSA8PCBudW1CaXRzTFVUUWljayAtIGxlbjsKICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbnVtRW50cmllczsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVMdXRbY29kZSB8IGtdID0gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlVGFibGVbal0uc2Vjb25kOwogICAgICAgICAgICAgICAgICAgIG5vZGUgPSB0cmVlOwogICAgICAgICAgICAgICAgICAgIGZvciAoamogPSBsZW4gLSAxOyBqaiA+PSAwOyBqai0tKSB7CiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Qml0ID0gY29kZSA+Pj4gamogJiAxOwogICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLnJpZ2h0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodCA9IG5ldyBUcmVlTm9kZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnJpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLmxlZnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnQgPSBuZXcgVHJlZU5vZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5sZWZ0OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgaWYgKGpqID09PSAwICYmICFub2RlLnZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICBub2RlLnZhbCA9IGVudHJ5WzFdOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgZGVjb2RlTHV0LAogICAgICAgICAgICAgICAgbnVtQml0c0xVVFFpY2ssCiAgICAgICAgICAgICAgICBudW1CaXRzTFVULAogICAgICAgICAgICAgICAgdHJlZSwKICAgICAgICAgICAgICAgIHN0dWZmZWREYXRhLAogICAgICAgICAgICAgICAgc3JjUHRyLAogICAgICAgICAgICAgICAgYml0UG9zCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVhZEh1ZmZtYW46IGZ1bmN0aW9uKGlucHV0LCBkYXRhLCBPdXRQaXhlbFR5cGVBcnJheSkgewogICAgICAgICAgICAgIHZhciBoZWFkZXJJbmZvID0gZGF0YS5oZWFkZXJJbmZvOwogICAgICAgICAgICAgIHZhciBudW1EaW1zID0gaGVhZGVySW5mby5udW1EaW1zOwogICAgICAgICAgICAgIHZhciBoZWlnaHQgPSBkYXRhLmhlYWRlckluZm8uaGVpZ2h0OwogICAgICAgICAgICAgIHZhciB3aWR0aCA9IGRhdGEuaGVhZGVySW5mby53aWR0aDsKICAgICAgICAgICAgICB2YXIgbnVtUGl4ZWxzID0gd2lkdGggKiBoZWlnaHQ7CiAgICAgICAgICAgICAgdmFyIGh1ZmZtYW5JbmZvID0gdGhpcy5yZWFkSHVmZm1hblRyZWUoaW5wdXQsIGRhdGEpOwogICAgICAgICAgICAgIHZhciBkZWNvZGVMdXQgPSBodWZmbWFuSW5mby5kZWNvZGVMdXQ7CiAgICAgICAgICAgICAgdmFyIHRyZWUgPSBodWZmbWFuSW5mby50cmVlOwogICAgICAgICAgICAgIHZhciBzdHVmZmVkRGF0YSA9IGh1ZmZtYW5JbmZvLnN0dWZmZWREYXRhOwogICAgICAgICAgICAgIHZhciBzcmNQdHIgPSBodWZmbWFuSW5mby5zcmNQdHI7CiAgICAgICAgICAgICAgdmFyIGJpdFBvcyA9IGh1ZmZtYW5JbmZvLmJpdFBvczsKICAgICAgICAgICAgICB2YXIgbnVtQml0c0xVVFFpY2sgPSBodWZmbWFuSW5mby5udW1CaXRzTFVUUWljazsKICAgICAgICAgICAgICB2YXIgbnVtQml0c0xVVCA9IGh1ZmZtYW5JbmZvLm51bUJpdHNMVVQ7CiAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IGRhdGEuaGVhZGVySW5mby5pbWFnZVR5cGUgPT09IDAgPyAxMjggOiAwOwogICAgICAgICAgICAgIHZhciBub2RlLCB2YWwsIGRlbHRhLCBtYXNrID0gZGF0YS5waXhlbHMucmVzdWx0TWFzaywgdmFsVG1wLCB2YWxUbXBRdWljaywgY3VycmVudEJpdDsKICAgICAgICAgICAgICB2YXIgaSwgaiwgaywgaWk7CiAgICAgICAgICAgICAgdmFyIHByZXZWYWwgPSAwOwogICAgICAgICAgICAgIGlmIChiaXRQb3MgPiAwKSB7CiAgICAgICAgICAgICAgICBzcmNQdHIrKzsKICAgICAgICAgICAgICAgIGJpdFBvcyA9IDA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciB3b3JkID0gc3R1ZmZlZERhdGFbc3JjUHRyXTsKICAgICAgICAgICAgICB2YXIgZGVsdGFFbmNvZGUgPSBkYXRhLmVuY29kZU1vZGUgPT09IDE7CiAgICAgICAgICAgICAgdmFyIHJlc3VsdFBpeGVsc0FsbERpbSA9IG5ldyBPdXRQaXhlbFR5cGVBcnJheShudW1QaXhlbHMgKiBudW1EaW1zKTsKICAgICAgICAgICAgICB2YXIgcmVzdWx0UGl4ZWxzID0gcmVzdWx0UGl4ZWxzQWxsRGltOwogICAgICAgICAgICAgIHZhciBpRGltOwogICAgICAgICAgICAgIGZvciAoaURpbSA9IDA7IGlEaW0gPCBoZWFkZXJJbmZvLm51bURpbXM7IGlEaW0rKykgewogICAgICAgICAgICAgICAgaWYgKG51bURpbXMgPiAxKSB7CiAgICAgICAgICAgICAgICAgIHJlc3VsdFBpeGVscyA9IG5ldyBPdXRQaXhlbFR5cGVBcnJheShyZXN1bHRQaXhlbHNBbGxEaW0uYnVmZmVyLCBudW1QaXhlbHMgKiBpRGltLCBudW1QaXhlbHMpOwogICAgICAgICAgICAgICAgICBwcmV2VmFsID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChkYXRhLmhlYWRlckluZm8ubnVtVmFsaWRQaXhlbCA9PT0gd2lkdGggKiBoZWlnaHQpIHsKICAgICAgICAgICAgICAgICAgZm9yIChrID0gMCwgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrLCBrKyspIHsKICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICB2YWxUbXAgPSB3b3JkIDw8IGJpdFBvcyA+Pj4gMzIgLSBudW1CaXRzTFVUUWljazsKICAgICAgICAgICAgICAgICAgICAgIHZhbFRtcFF1aWNrID0gdmFsVG1wOwogICAgICAgICAgICAgICAgICAgICAgaWYgKDMyIC0gYml0UG9zIDwgbnVtQml0c0xVVFFpY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsVG1wIHw9IHN0dWZmZWREYXRhW3NyY1B0ciArIDFdID4+PiA2NCAtIGJpdFBvcyAtIG51bUJpdHNMVVRRaWNrOwogICAgICAgICAgICAgICAgICAgICAgICB2YWxUbXBRdWljayA9IHZhbFRtcDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVMdXRbdmFsVG1wUXVpY2tdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGRlY29kZUx1dFt2YWxUbXBRdWlja11bMV07CiAgICAgICAgICAgICAgICAgICAgICAgIGJpdFBvcyArPSBkZWNvZGVMdXRbdmFsVG1wUXVpY2tdWzBdOwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsVG1wID0gd29yZCA8PCBiaXRQb3MgPj4+IDMyIC0gbnVtQml0c0xVVDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsVG1wUXVpY2sgPSB2YWxUbXA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgzMiAtIGJpdFBvcyA8IG51bUJpdHNMVVQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxUbXAgfD0gc3R1ZmZlZERhdGFbc3JjUHRyICsgMV0gPj4+IDY0IC0gYml0UG9zIC0gbnVtQml0c0xVVDsKICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxUbXBRdWljayA9IHZhbFRtcDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gdHJlZTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgbnVtQml0c0xVVDsgaWkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCaXQgPSB2YWxUbXAgPj4+IG51bUJpdHNMVVQgLSBpaSAtIDEgJiAxOwogICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBjdXJyZW50Qml0ID8gbm9kZS5yaWdodCA6IG5vZGUubGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShub2RlLmxlZnQgfHwgbm9kZS5yaWdodCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IG5vZGUudmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UG9zID0gYml0UG9zICsgaWkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0UG9zID49IDMyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJpdFBvcyAtPSAzMjsKICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQgPSBzdHVmZmVkRGF0YVtzcmNQdHJdOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSB2YWwgLSBvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFFbmNvZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgKz0gcHJldlZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhICs9IHJlc3VsdFBpeGVsc1trIC0gd2lkdGhdOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhICs9IHByZXZWYWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgJj0gMjU1OwogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRQaXhlbHNba10gPSBkZWx0YTsKICAgICAgICAgICAgICAgICAgICAgICAgcHJldlZhbCA9IGRlbHRhOwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0UGl4ZWxzW2tdID0gZGVsdGE7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwLCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyssIGsrKykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKG1hc2tba10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsVG1wID0gd29yZCA8PCBiaXRQb3MgPj4+IDMyIC0gbnVtQml0c0xVVFFpY2s7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbFRtcFF1aWNrID0gdmFsVG1wOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMzIgLSBiaXRQb3MgPCBudW1CaXRzTFVUUWljaykgewogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbFRtcCB8PSBzdHVmZmVkRGF0YVtzcmNQdHIgKyAxXSA+Pj4gNjQgLSBiaXRQb3MgLSBudW1CaXRzTFVUUWljazsKICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxUbXBRdWljayA9IHZhbFRtcDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlTHV0W3ZhbFRtcFF1aWNrXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGRlY29kZUx1dFt2YWxUbXBRdWlja11bMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UG9zICs9IGRlY29kZUx1dFt2YWxUbXBRdWlja11bMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsVG1wID0gd29yZCA8PCBiaXRQb3MgPj4+IDMyIC0gbnVtQml0c0xVVDsKICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxUbXBRdWljayA9IHZhbFRtcDsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMzIgLSBiaXRQb3MgPCBudW1CaXRzTFVUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxUbXAgfD0gc3R1ZmZlZERhdGFbc3JjUHRyICsgMV0gPj4+IDY0IC0gYml0UG9zIC0gbnVtQml0c0xVVDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbFRtcFF1aWNrID0gdmFsVG1wOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gdHJlZTsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBudW1CaXRzTFVUOyBpaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Qml0ID0gdmFsVG1wID4+PiBudW1CaXRzTFVUIC0gaWkgLSAxICYgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBjdXJyZW50Qml0ID8gbm9kZS5yaWdodCA6IG5vZGUubGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG5vZGUubGVmdCB8fCBub2RlLnJpZ2h0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBub2RlLnZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UG9zID0gYml0UG9zICsgaWkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdFBvcyA+PSAzMikgewogICAgICAgICAgICAgICAgICAgICAgICAgIGJpdFBvcyAtPSAzMjsKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkID0gc3R1ZmZlZERhdGFbc3JjUHRyXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IHZhbCAtIG9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhRW5jb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPiAwICYmIG1hc2tbayAtIDFdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSArPSBwcmV2VmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA+IDAgJiYgbWFza1trIC0gd2lkdGhdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSArPSByZXN1bHRQaXhlbHNbayAtIHdpZHRoXTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgKz0gcHJldlZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgJj0gMjU1OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFBpeGVsc1trXSA9IGRlbHRhOwogICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZWYWwgPSBkZWx0YTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRQaXhlbHNba10gPSBkZWx0YTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YS5wdHIgPSBkYXRhLnB0ciArIChzcmNQdHIgKyAxKSAqIDQgKyAoYml0UG9zID4gMCA/IDQgOiAwKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZGF0YS5waXhlbHMucmVzdWx0UGl4ZWxzID0gcmVzdWx0UGl4ZWxzQWxsRGltOwogICAgICAgICAgICB9LAogICAgICAgICAgICBkZWNvZGVCaXRzOiBmdW5jdGlvbihpbnB1dCwgZGF0YSwgYmxvY2tEYXRhQnVmZmVyLCBvZmZzZXQsIGlEaW0pIHsKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaGVhZGVySW5mbyA9IGRhdGEuaGVhZGVySW5mbzsKICAgICAgICAgICAgICAgIHZhciBmaWxlVmVyc2lvbiA9IGhlYWRlckluZm8uZmlsZVZlcnNpb247CiAgICAgICAgICAgICAgICB2YXIgYmxvY2tQdHIgPSAwOwogICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcoaW5wdXQsIGRhdGEucHRyLCA1KTsKICAgICAgICAgICAgICAgIHZhciBoZWFkZXJCeXRlID0gdmlldy5nZXRVaW50OCgwKTsKICAgICAgICAgICAgICAgIGJsb2NrUHRyKys7CiAgICAgICAgICAgICAgICB2YXIgYml0czY3ID0gaGVhZGVyQnl0ZSA+PiA2OwogICAgICAgICAgICAgICAgdmFyIG4gPSBiaXRzNjcgPT09IDAgPyA0IDogMyAtIGJpdHM2NzsKICAgICAgICAgICAgICAgIHZhciBkb0x1dCA9IChoZWFkZXJCeXRlICYgMzIpID4gMCA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgICAgIHZhciBudW1CaXRzID0gaGVhZGVyQnl0ZSAmIDMxOwogICAgICAgICAgICAgICAgdmFyIG51bUVsZW1lbnRzID0gMDsKICAgICAgICAgICAgICAgIGlmIChuID09PSAxKSB7CiAgICAgICAgICAgICAgICAgIG51bUVsZW1lbnRzID0gdmlldy5nZXRVaW50OChibG9ja1B0cik7CiAgICAgICAgICAgICAgICAgIGJsb2NrUHRyKys7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT09IDIpIHsKICAgICAgICAgICAgICAgICAgbnVtRWxlbWVudHMgPSB2aWV3LmdldFVpbnQxNihibG9ja1B0ciwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgIGJsb2NrUHRyICs9IDI7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT09IDQpIHsKICAgICAgICAgICAgICAgICAgbnVtRWxlbWVudHMgPSB2aWV3LmdldFVpbnQzMihibG9ja1B0ciwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgIGJsb2NrUHRyICs9IDQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICB0aHJvdyAiSW52YWxpZCB2YWxpZCBwaXhlbCBjb3VudCB0eXBlIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBzY2FsZSA9IDIgKiBoZWFkZXJJbmZvLm1heFpFcnJvcjsKICAgICAgICAgICAgICAgIHZhciBzdHVmZmVkRGF0YSwgYXJyYXlCdWYsIHN0b3JlOCwgZGF0YUJ5dGVzLCBkYXRhV29yZHM7CiAgICAgICAgICAgICAgICB2YXIgbHV0QXJyLCBsdXREYXRhLCBsdXRCeXRlcywgbHV0Qml0c1BlckVsZW1lbnQsIGJpdHNQZXJQaXhlbDsKICAgICAgICAgICAgICAgIHZhciB6TWF4ID0gaGVhZGVySW5mby5udW1EaW1zID4gMSA/IGhlYWRlckluZm8ubWF4VmFsdWVzW2lEaW1dIDogaGVhZGVySW5mby56TWF4OwogICAgICAgICAgICAgICAgaWYgKGRvTHV0KSB7CiAgICAgICAgICAgICAgICAgIGRhdGEuY291bnRlci5sdXQrKzsKICAgICAgICAgICAgICAgICAgbHV0Qnl0ZXMgPSB2aWV3LmdldFVpbnQ4KGJsb2NrUHRyKTsKICAgICAgICAgICAgICAgICAgbHV0Qml0c1BlckVsZW1lbnQgPSBudW1CaXRzOwogICAgICAgICAgICAgICAgICBibG9ja1B0cisrOwogICAgICAgICAgICAgICAgICBkYXRhQnl0ZXMgPSBNYXRoLmNlaWwoKGx1dEJ5dGVzIC0gMSkgKiBudW1CaXRzIC8gOCk7CiAgICAgICAgICAgICAgICAgIGRhdGFXb3JkcyA9IE1hdGguY2VpbChkYXRhQnl0ZXMgLyA0KTsKICAgICAgICAgICAgICAgICAgYXJyYXlCdWYgPSBuZXcgQXJyYXlCdWZmZXIoZGF0YVdvcmRzICogNCk7CiAgICAgICAgICAgICAgICAgIHN0b3JlOCA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmKTsKICAgICAgICAgICAgICAgICAgZGF0YS5wdHIgKz0gYmxvY2tQdHI7CiAgICAgICAgICAgICAgICAgIHN0b3JlOC5zZXQobmV3IFVpbnQ4QXJyYXkoaW5wdXQsIGRhdGEucHRyLCBkYXRhQnl0ZXMpKTsKICAgICAgICAgICAgICAgICAgbHV0RGF0YSA9IG5ldyBVaW50MzJBcnJheShhcnJheUJ1Zik7CiAgICAgICAgICAgICAgICAgIGRhdGEucHRyICs9IGRhdGFCeXRlczsKICAgICAgICAgICAgICAgICAgYml0c1BlclBpeGVsID0gMDsKICAgICAgICAgICAgICAgICAgd2hpbGUgKGx1dEJ5dGVzIC0gMSA+Pj4gYml0c1BlclBpeGVsKSB7CiAgICAgICAgICAgICAgICAgICAgYml0c1BlclBpeGVsKys7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZGF0YUJ5dGVzID0gTWF0aC5jZWlsKG51bUVsZW1lbnRzICogYml0c1BlclBpeGVsIC8gOCk7CiAgICAgICAgICAgICAgICAgIGRhdGFXb3JkcyA9IE1hdGguY2VpbChkYXRhQnl0ZXMgLyA0KTsKICAgICAgICAgICAgICAgICAgYXJyYXlCdWYgPSBuZXcgQXJyYXlCdWZmZXIoZGF0YVdvcmRzICogNCk7CiAgICAgICAgICAgICAgICAgIHN0b3JlOCA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmKTsKICAgICAgICAgICAgICAgICAgc3RvcmU4LnNldChuZXcgVWludDhBcnJheShpbnB1dCwgZGF0YS5wdHIsIGRhdGFCeXRlcykpOwogICAgICAgICAgICAgICAgICBzdHVmZmVkRGF0YSA9IG5ldyBVaW50MzJBcnJheShhcnJheUJ1Zik7CiAgICAgICAgICAgICAgICAgIGRhdGEucHRyICs9IGRhdGFCeXRlczsKICAgICAgICAgICAgICAgICAgaWYgKGZpbGVWZXJzaW9uID49IDMpIHsKICAgICAgICAgICAgICAgICAgICBsdXRBcnIgPSBCaXRTdHVmZmVyLnVuc3R1ZmZMVVQyKGx1dERhdGEsIG51bUJpdHMsIGx1dEJ5dGVzIC0gMSwgb2Zmc2V0LCBzY2FsZSwgek1heCk7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbHV0QXJyID0gQml0U3R1ZmZlci51bnN0dWZmTFVUKGx1dERhdGEsIG51bUJpdHMsIGx1dEJ5dGVzIC0gMSwgb2Zmc2V0LCBzY2FsZSwgek1heCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGZpbGVWZXJzaW9uID49IDMpIHsKICAgICAgICAgICAgICAgICAgICBCaXRTdHVmZmVyLnVuc3R1ZmYyKHN0dWZmZWREYXRhLCBibG9ja0RhdGFCdWZmZXIsIGJpdHNQZXJQaXhlbCwgbnVtRWxlbWVudHMsIGx1dEFycik7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgQml0U3R1ZmZlci51bnN0dWZmKHN0dWZmZWREYXRhLCBibG9ja0RhdGFCdWZmZXIsIGJpdHNQZXJQaXhlbCwgbnVtRWxlbWVudHMsIGx1dEFycik7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGRhdGEuY291bnRlci5iaXRzdHVmZmVyKys7CiAgICAgICAgICAgICAgICAgIGJpdHNQZXJQaXhlbCA9IG51bUJpdHM7CiAgICAgICAgICAgICAgICAgIGRhdGEucHRyICs9IGJsb2NrUHRyOwogICAgICAgICAgICAgICAgICBpZiAoYml0c1BlclBpeGVsID4gMCkgewogICAgICAgICAgICAgICAgICAgIGRhdGFCeXRlcyA9IE1hdGguY2VpbChudW1FbGVtZW50cyAqIGJpdHNQZXJQaXhlbCAvIDgpOwogICAgICAgICAgICAgICAgICAgIGRhdGFXb3JkcyA9IE1hdGguY2VpbChkYXRhQnl0ZXMgLyA0KTsKICAgICAgICAgICAgICAgICAgICBhcnJheUJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihkYXRhV29yZHMgKiA0KTsKICAgICAgICAgICAgICAgICAgICBzdG9yZTggPSBuZXcgVWludDhBcnJheShhcnJheUJ1Zik7CiAgICAgICAgICAgICAgICAgICAgc3RvcmU4LnNldChuZXcgVWludDhBcnJheShpbnB1dCwgZGF0YS5wdHIsIGRhdGFCeXRlcykpOwogICAgICAgICAgICAgICAgICAgIHN0dWZmZWREYXRhID0gbmV3IFVpbnQzMkFycmF5KGFycmF5QnVmKTsKICAgICAgICAgICAgICAgICAgICBkYXRhLnB0ciArPSBkYXRhQnl0ZXM7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVWZXJzaW9uID49IDMpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBCaXRTdHVmZmVyLm9yaWdpbmFsVW5zdHVmZjIoc3R1ZmZlZERhdGEsIGJsb2NrRGF0YUJ1ZmZlciwgYml0c1BlclBpeGVsLCBudW1FbGVtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBCaXRTdHVmZmVyLnVuc3R1ZmYyKHN0dWZmZWREYXRhLCBibG9ja0RhdGFCdWZmZXIsIGJpdHNQZXJQaXhlbCwgbnVtRWxlbWVudHMsIGZhbHNlLCBvZmZzZXQsIHNjYWxlLCB6TWF4KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEJpdFN0dWZmZXIub3JpZ2luYWxVbnN0dWZmKHN0dWZmZWREYXRhLCBibG9ja0RhdGFCdWZmZXIsIGJpdHNQZXJQaXhlbCwgbnVtRWxlbWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgQml0U3R1ZmZlci51bnN0dWZmKHN0dWZmZWREYXRhLCBibG9ja0RhdGFCdWZmZXIsIGJpdHNQZXJQaXhlbCwgbnVtRWxlbWVudHMsIGZhbHNlLCBvZmZzZXQsIHNjYWxlLCB6TWF4KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlYWRUaWxlczogZnVuY3Rpb24oaW5wdXQsIGRhdGEsIE91dFBpeGVsVHlwZUFycmF5KSB7CiAgICAgICAgICAgICAgdmFyIGhlYWRlckluZm8gPSBkYXRhLmhlYWRlckluZm87CiAgICAgICAgICAgICAgdmFyIHdpZHRoID0gaGVhZGVySW5mby53aWR0aDsKICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gaGVhZGVySW5mby5oZWlnaHQ7CiAgICAgICAgICAgICAgdmFyIG1pY3JvQmxvY2tTaXplID0gaGVhZGVySW5mby5taWNyb0Jsb2NrU2l6ZTsKICAgICAgICAgICAgICB2YXIgaW1hZ2VUeXBlID0gaGVhZGVySW5mby5pbWFnZVR5cGU7CiAgICAgICAgICAgICAgdmFyIGRhdGFUeXBlU2l6ZSA9IExlcmMySGVscGVycy5nZXREYXRhVHlwZVNpemUoaW1hZ2VUeXBlKTsKICAgICAgICAgICAgICB2YXIgbnVtQmxvY2tzWCA9IE1hdGguY2VpbCh3aWR0aCAvIG1pY3JvQmxvY2tTaXplKTsKICAgICAgICAgICAgICB2YXIgbnVtQmxvY2tzWSA9IE1hdGguY2VpbChoZWlnaHQgLyBtaWNyb0Jsb2NrU2l6ZSk7CiAgICAgICAgICAgICAgZGF0YS5waXhlbHMubnVtQmxvY2tzWSA9IG51bUJsb2Nrc1k7CiAgICAgICAgICAgICAgZGF0YS5waXhlbHMubnVtQmxvY2tzWCA9IG51bUJsb2Nrc1g7CiAgICAgICAgICAgICAgZGF0YS5waXhlbHMucHRyID0gMDsKICAgICAgICAgICAgICB2YXIgcm93ID0gMCwgY29sID0gMCwgYmxvY2tZID0gMCwgYmxvY2tYID0gMCwgdGhpc0Jsb2NrSGVpZ2h0ID0gMCwgdGhpc0Jsb2NrV2lkdGggPSAwLCBieXRlc0xlZnQgPSAwLCBoZWFkZXJCeXRlID0gMCwgYml0czY3ID0gMCwgdGVzdENvZGUgPSAwLCBvdXRQdHIgPSAwLCBvdXRTdHJpZGUgPSAwLCBudW1CeXRlcyA9IDAsIGJ5dGVzbGVmdCA9IDAsIHogPSAwLCBibG9ja1B0ciA9IDA7CiAgICAgICAgICAgICAgdmFyIHZpZXcsIGJsb2NrLCBhcnJheUJ1Ziwgc3RvcmU4LCByYXdEYXRhOwogICAgICAgICAgICAgIHZhciBibG9ja0VuY29kaW5nOwogICAgICAgICAgICAgIHZhciBibG9ja0RhdGFCdWZmZXIgPSBuZXcgT3V0UGl4ZWxUeXBlQXJyYXkobWljcm9CbG9ja1NpemUgKiBtaWNyb0Jsb2NrU2l6ZSk7CiAgICAgICAgICAgICAgdmFyIGxhc3RCbG9ja0hlaWdodCA9IGhlaWdodCAlIG1pY3JvQmxvY2tTaXplIHx8IG1pY3JvQmxvY2tTaXplOwogICAgICAgICAgICAgIHZhciBsYXN0QmxvY2tXaWR0aCA9IHdpZHRoICUgbWljcm9CbG9ja1NpemUgfHwgbWljcm9CbG9ja1NpemU7CiAgICAgICAgICAgICAgdmFyIG9mZnNldFR5cGUsIG9mZnNldDsKICAgICAgICAgICAgICB2YXIgbnVtRGltcyA9IGhlYWRlckluZm8ubnVtRGltcywgaURpbTsKICAgICAgICAgICAgICB2YXIgbWFzayA9IGRhdGEucGl4ZWxzLnJlc3VsdE1hc2s7CiAgICAgICAgICAgICAgdmFyIHJlc3VsdFBpeGVscyA9IGRhdGEucGl4ZWxzLnJlc3VsdFBpeGVsczsKICAgICAgICAgICAgICBmb3IgKGJsb2NrWSA9IDA7IGJsb2NrWSA8IG51bUJsb2Nrc1k7IGJsb2NrWSsrKSB7CiAgICAgICAgICAgICAgICB0aGlzQmxvY2tIZWlnaHQgPSBibG9ja1kgIT09IG51bUJsb2Nrc1kgLSAxID8gbWljcm9CbG9ja1NpemUgOiBsYXN0QmxvY2tIZWlnaHQ7CiAgICAgICAgICAgICAgICBmb3IgKGJsb2NrWCA9IDA7IGJsb2NrWCA8IG51bUJsb2Nrc1g7IGJsb2NrWCsrKSB7CiAgICAgICAgICAgICAgICAgIHRoaXNCbG9ja1dpZHRoID0gYmxvY2tYICE9PSBudW1CbG9ja3NYIC0gMSA/IG1pY3JvQmxvY2tTaXplIDogbGFzdEJsb2NrV2lkdGg7CiAgICAgICAgICAgICAgICAgIG91dFB0ciA9IGJsb2NrWSAqIHdpZHRoICogbWljcm9CbG9ja1NpemUgKyBibG9ja1ggKiBtaWNyb0Jsb2NrU2l6ZTsKICAgICAgICAgICAgICAgICAgb3V0U3RyaWRlID0gd2lkdGggLSB0aGlzQmxvY2tXaWR0aDsKICAgICAgICAgICAgICAgICAgZm9yIChpRGltID0gMDsgaURpbSA8IG51bURpbXM7IGlEaW0rKykgewogICAgICAgICAgICAgICAgICAgIGlmIChudW1EaW1zID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0UGl4ZWxzID0gbmV3IE91dFBpeGVsVHlwZUFycmF5KGRhdGEucGl4ZWxzLnJlc3VsdFBpeGVscy5idWZmZXIsIHdpZHRoICogaGVpZ2h0ICogaURpbSAqIGRhdGFUeXBlU2l6ZSwgd2lkdGggKiBoZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBieXRlc0xlZnQgPSBpbnB1dC5ieXRlTGVuZ3RoIC0gZGF0YS5wdHI7CiAgICAgICAgICAgICAgICAgICAgdmlldyA9IG5ldyBEYXRhVmlldyhpbnB1dCwgZGF0YS5wdHIsIE1hdGgubWluKDEwLCBieXRlc0xlZnQpKTsKICAgICAgICAgICAgICAgICAgICBibG9jayA9IHt9OwogICAgICAgICAgICAgICAgICAgIGJsb2NrUHRyID0gMDsKICAgICAgICAgICAgICAgICAgICBoZWFkZXJCeXRlID0gdmlldy5nZXRVaW50OCgwKTsKICAgICAgICAgICAgICAgICAgICBibG9ja1B0cisrOwogICAgICAgICAgICAgICAgICAgIGJpdHM2NyA9IGhlYWRlckJ5dGUgPj4gNiAmIDI1NTsKICAgICAgICAgICAgICAgICAgICB0ZXN0Q29kZSA9IGhlYWRlckJ5dGUgPj4gMiAmIDE1OwogICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0Q29kZSAhPT0gKGJsb2NrWCAqIG1pY3JvQmxvY2tTaXplID4+IDMgJiAxNSkpIHsKICAgICAgICAgICAgICAgICAgICAgIHRocm93ICJpbnRlZ3JpdHkgaXNzdWUiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBibG9ja0VuY29kaW5nID0gaGVhZGVyQnl0ZSAmIDM7CiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrRW5jb2RpbmcgPiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB0ciArPSBibG9ja1B0cjsKICAgICAgICAgICAgICAgICAgICAgIHRocm93ICJJbnZhbGlkIGJsb2NrIGVuY29kaW5nICgiICsgYmxvY2tFbmNvZGluZyArICIpIjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJsb2NrRW5jb2RpbmcgPT09IDIpIHsKICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY291bnRlci5jb25zdGFudCsrOwogICAgICAgICAgICAgICAgICAgICAgZGF0YS5wdHIgKz0gYmxvY2tQdHI7CiAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJsb2NrRW5jb2RpbmcgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY291bnRlci51bmNvbXByZXNzZWQrKzsKICAgICAgICAgICAgICAgICAgICAgIGRhdGEucHRyICs9IGJsb2NrUHRyOwogICAgICAgICAgICAgICAgICAgICAgbnVtQnl0ZXMgPSB0aGlzQmxvY2tIZWlnaHQgKiB0aGlzQmxvY2tXaWR0aCAqIGRhdGFUeXBlU2l6ZTsKICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzbGVmdCA9IGlucHV0LmJ5dGVMZW5ndGggLSBkYXRhLnB0cjsKICAgICAgICAgICAgICAgICAgICAgIG51bUJ5dGVzID0gbnVtQnl0ZXMgPCBieXRlc2xlZnQgPyBudW1CeXRlcyA6IGJ5dGVzbGVmdDsKICAgICAgICAgICAgICAgICAgICAgIGFycmF5QnVmID0gbmV3IEFycmF5QnVmZmVyKG51bUJ5dGVzICUgZGF0YVR5cGVTaXplID09PSAwID8gbnVtQnl0ZXMgOiBudW1CeXRlcyArIGRhdGFUeXBlU2l6ZSAtIG51bUJ5dGVzICUgZGF0YVR5cGVTaXplKTsKICAgICAgICAgICAgICAgICAgICAgIHN0b3JlOCA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmKTsKICAgICAgICAgICAgICAgICAgICAgIHN0b3JlOC5zZXQobmV3IFVpbnQ4QXJyYXkoaW5wdXQsIGRhdGEucHRyLCBudW1CeXRlcykpOwogICAgICAgICAgICAgICAgICAgICAgcmF3RGF0YSA9IG5ldyBPdXRQaXhlbFR5cGVBcnJheShhcnJheUJ1Zik7CiAgICAgICAgICAgICAgICAgICAgICB6ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocm93ID0gMDsgcm93IDwgdGhpc0Jsb2NrSGVpZ2h0OyByb3crKykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgdGhpc0Jsb2NrV2lkdGg7IGNvbCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFza1tvdXRQdHJdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFBpeGVsc1tvdXRQdHJdID0gcmF3RGF0YVt6KytdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHRyKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIG91dFB0ciArPSBvdXRTdHJpZGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocm93ID0gMDsgcm93IDwgdGhpc0Jsb2NrSGVpZ2h0OyByb3crKykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgdGhpc0Jsb2NrV2lkdGg7IGNvbCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRQaXhlbHNbb3V0UHRyKytdID0gcmF3RGF0YVt6KytdOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQdHIgKz0gb3V0U3RyaWRlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB0ciArPSB6ICogZGF0YVR5cGVTaXplOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRUeXBlID0gTGVyYzJIZWxwZXJzLmdldERhdGFUeXBlVXNlZChpbWFnZVR5cGUsIGJpdHM2Nyk7CiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBMZXJjMkhlbHBlcnMuZ2V0T25lUGl4ZWwoYmxvY2ssIGJsb2NrUHRyLCBvZmZzZXRUeXBlLCB2aWV3KTsKICAgICAgICAgICAgICAgICAgICAgIGJsb2NrUHRyICs9IExlcmMySGVscGVycy5nZXREYXRhVHlwZVNpemUob2Zmc2V0VHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tFbmNvZGluZyA9PT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB0ciArPSBibG9ja1B0cjsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5jb3VudGVyLmNvbnN0YW50b2Zmc2V0Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCB0aGlzQmxvY2tIZWlnaHQ7IHJvdysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHRoaXNCbG9ja1dpZHRoOyBjb2wrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFza1tvdXRQdHJdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0UGl4ZWxzW291dFB0cl0gPSBvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHRyKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQdHIgKz0gb3V0U3RyaWRlOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IHRoaXNCbG9ja0hlaWdodDsgcm93KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgdGhpc0Jsb2NrV2lkdGg7IGNvbCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFBpeGVsc1tvdXRQdHIrK10gPSBvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQdHIgKz0gb3V0U3RyaWRlOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wdHIgKz0gYmxvY2tQdHI7CiAgICAgICAgICAgICAgICAgICAgICAgIExlcmMySGVscGVycy5kZWNvZGVCaXRzKGlucHV0LCBkYXRhLCBibG9ja0RhdGFCdWZmZXIsIG9mZnNldCwgaURpbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrUHRyID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IHRoaXNCbG9ja0hlaWdodDsgcm93KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgdGhpc0Jsb2NrV2lkdGg7IGNvbCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXNrW291dFB0cl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRQaXhlbHNbb3V0UHRyXSA9IGJsb2NrRGF0YUJ1ZmZlcltibG9ja1B0cisrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQdHIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFB0ciArPSBvdXRTdHJpZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocm93ID0gMDsgcm93IDwgdGhpc0Jsb2NrSGVpZ2h0OyByb3crKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCB0aGlzQmxvY2tXaWR0aDsgY29sKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0UGl4ZWxzW291dFB0cisrXSA9IGJsb2NrRGF0YUJ1ZmZlcltibG9ja1B0cisrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFB0ciArPSBvdXRTdHJpZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgKiAgcHJpdmF0ZSBtZXRob2RzIChoZWxwZXIgbWV0aG9kcykKICAgICAgICAgICAgKioqKioqKioqKioqKioqKiovCiAgICAgICAgICAgIGZvcm1hdEZpbGVJbmZvOiBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJmaWxlSWRlbnRpZmllclN0cmluZyI6IGRhdGEuaGVhZGVySW5mby5maWxlSWRlbnRpZmllclN0cmluZywKICAgICAgICAgICAgICAgICJmaWxlVmVyc2lvbiI6IGRhdGEuaGVhZGVySW5mby5maWxlVmVyc2lvbiwKICAgICAgICAgICAgICAgICJpbWFnZVR5cGUiOiBkYXRhLmhlYWRlckluZm8uaW1hZ2VUeXBlLAogICAgICAgICAgICAgICAgImhlaWdodCI6IGRhdGEuaGVhZGVySW5mby5oZWlnaHQsCiAgICAgICAgICAgICAgICAid2lkdGgiOiBkYXRhLmhlYWRlckluZm8ud2lkdGgsCiAgICAgICAgICAgICAgICAibnVtVmFsaWRQaXhlbCI6IGRhdGEuaGVhZGVySW5mby5udW1WYWxpZFBpeGVsLAogICAgICAgICAgICAgICAgIm1pY3JvQmxvY2tTaXplIjogZGF0YS5oZWFkZXJJbmZvLm1pY3JvQmxvY2tTaXplLAogICAgICAgICAgICAgICAgImJsb2JTaXplIjogZGF0YS5oZWFkZXJJbmZvLmJsb2JTaXplLAogICAgICAgICAgICAgICAgIm1heFpFcnJvciI6IGRhdGEuaGVhZGVySW5mby5tYXhaRXJyb3IsCiAgICAgICAgICAgICAgICAicGl4ZWxUeXBlIjogTGVyYzJIZWxwZXJzLmdldFBpeGVsVHlwZShkYXRhLmhlYWRlckluZm8uaW1hZ2VUeXBlKSwKICAgICAgICAgICAgICAgICJlb2ZPZmZzZXQiOiBkYXRhLmVvZk9mZnNldCwKICAgICAgICAgICAgICAgICJtYXNrIjogZGF0YS5tYXNrID8gewogICAgICAgICAgICAgICAgICAibnVtQnl0ZXMiOiBkYXRhLm1hc2subnVtQnl0ZXMKICAgICAgICAgICAgICAgIH0gOiBudWxsLAogICAgICAgICAgICAgICAgInBpeGVscyI6IHsKICAgICAgICAgICAgICAgICAgIm51bUJsb2Nrc1giOiBkYXRhLnBpeGVscy5udW1CbG9ja3NYLAogICAgICAgICAgICAgICAgICAibnVtQmxvY2tzWSI6IGRhdGEucGl4ZWxzLm51bUJsb2Nrc1ksCiAgICAgICAgICAgICAgICAgIC8vIm51bUJ5dGVzIjogZGF0YS5waXhlbHMubnVtQnl0ZXMsCiAgICAgICAgICAgICAgICAgICJtYXhWYWx1ZSI6IGRhdGEuaGVhZGVySW5mby56TWF4LAogICAgICAgICAgICAgICAgICAibWluVmFsdWUiOiBkYXRhLmhlYWRlckluZm8uek1pbiwKICAgICAgICAgICAgICAgICAgIm5vRGF0YVZhbHVlIjogZGF0YS5ub0RhdGFWYWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNvbnN0cnVjdENvbnN0YW50U3VyZmFjZTogZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgIHZhciB2YWwgPSBkYXRhLmhlYWRlckluZm8uek1heDsKICAgICAgICAgICAgICB2YXIgbnVtRGltcyA9IGRhdGEuaGVhZGVySW5mby5udW1EaW1zOwogICAgICAgICAgICAgIHZhciBudW1QaXhlbHMgPSBkYXRhLmhlYWRlckluZm8uaGVpZ2h0ICogZGF0YS5oZWFkZXJJbmZvLndpZHRoOwogICAgICAgICAgICAgIHZhciBudW1QaXhlbEFsbERpbXMgPSBudW1QaXhlbHMgKiBudW1EaW1zOwogICAgICAgICAgICAgIHZhciBpID0gMCwgayA9IDAsIG5TdGFydCA9IDA7CiAgICAgICAgICAgICAgdmFyIG1hc2sgPSBkYXRhLnBpeGVscy5yZXN1bHRNYXNrOwogICAgICAgICAgICAgIGlmIChtYXNrKSB7CiAgICAgICAgICAgICAgICBpZiAobnVtRGltcyA+IDEpIHsKICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bURpbXM7IGkrKykgewogICAgICAgICAgICAgICAgICAgIG5TdGFydCA9IGkgKiBudW1QaXhlbHM7CiAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG51bVBpeGVsczsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAobWFza1trXSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnBpeGVscy5yZXN1bHRQaXhlbHNbblN0YXJ0ICsga10gPSB2YWw7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbnVtUGl4ZWxzOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAobWFza1trXSkgewogICAgICAgICAgICAgICAgICAgICAgZGF0YS5waXhlbHMucmVzdWx0UGl4ZWxzW2tdID0gdmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5waXhlbHMucmVzdWx0UGl4ZWxzLmZpbGwpIHsKICAgICAgICAgICAgICAgICAgZGF0YS5waXhlbHMucmVzdWx0UGl4ZWxzLmZpbGwodmFsKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBudW1QaXhlbEFsbERpbXM7IGsrKykgewogICAgICAgICAgICAgICAgICAgIGRhdGEucGl4ZWxzLnJlc3VsdFBpeGVsc1trXSA9IHZhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGdldERhdGFUeXBlQXJyYXk6IGZ1bmN0aW9uKHQpIHsKICAgICAgICAgICAgICB2YXIgdHA7CiAgICAgICAgICAgICAgc3dpdGNoICh0KSB7CiAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgIHRwID0gSW50OEFycmF5OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgdHAgPSBVaW50OEFycmF5OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgdHAgPSBJbnQxNkFycmF5OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgdHAgPSBVaW50MTZBcnJheTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgIHRwID0gSW50MzJBcnJheTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgIHRwID0gVWludDMyQXJyYXk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICB0cCA9IEZsb2F0MzJBcnJheTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgIHRwID0gRmxvYXQ2NEFycmF5OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgIHRwID0gRmxvYXQzMkFycmF5OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gdHA7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGdldFBpeGVsVHlwZTogZnVuY3Rpb24odCkgewogICAgICAgICAgICAgIHZhciB0cDsKICAgICAgICAgICAgICBzd2l0Y2ggKHQpIHsKICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgdHAgPSAiUzgiOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgdHAgPSAiVTgiOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgdHAgPSAiUzE2IjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgIHRwID0gIlUxNiI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICB0cCA9ICJTMzIiOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgdHAgPSAiVTMyIjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgIHRwID0gIkYzMiI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICB0cCA9ICJGNjQiOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgIHRwID0gIkYzMiI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiB0cDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaXNWYWxpZFBpeGVsVmFsdWU6IGZ1bmN0aW9uKHQsIHZhbCkgewogICAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB2YXIgaXNWYWxpZDsKICAgICAgICAgICAgICBzd2l0Y2ggKHQpIHsKICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHZhbCA+PSAtMTI4ICYmIHZhbCA8PSAxMjc7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdmFsID49IDAgJiYgdmFsIDw9IDI1NTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSB2YWwgPj0gLTMyNzY4ICYmIHZhbCA8PSAzMjc2NzsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSB2YWwgPj0gMCAmJiB2YWwgPD0gNjU1MzY7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdmFsID49IC0yMTQ3NDgzNjQ4ICYmIHZhbCA8PSAyMTQ3NDgzNjQ3OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHZhbCA+PSAwICYmIHZhbCA8PSA0Mjk0OTY3Mjk2OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHZhbCA+PSAtMzQwMjc5OTkzODc5MDE0ODRlMjIgJiYgdmFsIDw9IDM0MDI3OTk5Mzg3OTAxNDg0ZTIyOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHZhbCA+PSA1ZS0zMjQgJiYgdmFsIDw9IDE3OTc2OTMxMzQ4NjIzMTU3ZTI5MjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgICAgICB9LAogICAgICAgICAgICBnZXREYXRhVHlwZVNpemU6IGZ1bmN0aW9uKHQpIHsKICAgICAgICAgICAgICB2YXIgcyA9IDA7CiAgICAgICAgICAgICAgc3dpdGNoICh0KSB7CiAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAvL3VieXRlCiAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgIHMgPSAxOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIC8vc2hvcnQKICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgcyA9IDI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICBzID0gNDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgIHMgPSA4OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgIHMgPSB0OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZ2V0RGF0YVR5cGVVc2VkOiBmdW5jdGlvbihkdCwgdGMpIHsKICAgICAgICAgICAgICB2YXIgdCA9IGR0OwogICAgICAgICAgICAgIHN3aXRjaCAoZHQpIHsKICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIC8vc2hvcnQKICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgdCA9IGR0IC0gdGM7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgLy91c2hvcnQKICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgdCA9IGR0IC0gMiAqIHRjOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IHRjKSB7CiAgICAgICAgICAgICAgICAgICAgdCA9IGR0OwogICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKDEgPT09IHRjKSB7CiAgICAgICAgICAgICAgICAgICAgdCA9IDI7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdCA9IDE7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgIGlmICgwID09PSB0YykgewogICAgICAgICAgICAgICAgICAgIHQgPSBkdDsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0ID0gZHQgLSAyICogdGMgKyAxOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgdCA9IGR0OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGdldE9uZVBpeGVsOiBmdW5jdGlvbihibG9jaywgYmxvY2tQdHIsIG9mZnNldFR5cGUsIHZpZXcpIHsKICAgICAgICAgICAgICB2YXIgdGVtcCA9IDA7CiAgICAgICAgICAgICAgc3dpdGNoIChvZmZzZXRUeXBlKSB7CiAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgIHRlbXAgPSB2aWV3LmdldEludDgoYmxvY2tQdHIpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgdGVtcCA9IHZpZXcuZ2V0VWludDgoYmxvY2tQdHIpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgdGVtcCA9IHZpZXcuZ2V0SW50MTYoYmxvY2tQdHIsIHRydWUpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgdGVtcCA9IHZpZXcuZ2V0VWludDE2KGJsb2NrUHRyLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgIHRlbXAgPSB2aWV3LmdldEludDMyKGJsb2NrUHRyLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgIHRlbXAgPSB2aWV3LmdldFVJbnQzMihibG9ja1B0ciwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICB0ZW1wID0gdmlldy5nZXRGbG9hdDMyKGJsb2NrUHRyLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgIHRlbXAgPSB2aWV3LmdldEZsb2F0NjQoYmxvY2tQdHIsIHRydWUpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgIHRocm93ICJ0aGUgZGVjb2RlciBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoaXMgcGl4ZWwgdHlwZSI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiB0ZW1wOwogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgdmFyIFRyZWVOb2RlID0gZnVuY3Rpb24odmFsLCBsZWZ0LCByaWdodCkgewogICAgICAgICAgICB0aGlzLnZhbCA9IHZhbDsKICAgICAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDsKICAgICAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0OwogICAgICAgICAgfTsKICAgICAgICAgIHZhciBMZXJjMkRlY29kZTIgPSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICogKioqKioqKipyZW1vdmVkIG9wdGlvbnMgY29tcGFyZWQgdG8gTEVSQzEuIFdlIGNhbiBicmluZyBzb21lIG9mIHRoZW0gYmFjayBpZiBuZWVkZWQuCiAgICAgICAgICAgICAqIHJlbW92ZWQgcGl4ZWwgdHlwZS4gTEVSQzIgaXMgdHlwZWQgYW5kIGRvZXNuJ3QgcmVxdWlyZSB1c2VyIHRvIGdpdmUgcGl4ZWwgdHlwZQogICAgICAgICAgICAgKiBjaGFuZ2VkIGVuY29kZWRNYXNrRGF0YSB0byBtYXNrRGF0YS4gTEVSQzIgJ3MganMgdmVyc2lvbiBtYWtlIGl0IGZhc3RlciB0byB1c2UgbWFza0RhdGEgZGlyZWN0bHkuCiAgICAgICAgICAgICAqIHJlbW92ZWQgcmV0dXJuTWFzay4gbWFzayBpcyB1c2VkIGJ5IExFUkMyIGludGVybmFsbHkgYW5kIGlzIGNvc3QgZnJlZS4gSW4gY2FzZSBvZiB1c2VyIGlucHV0IG1hc2ssIGl0J3MgcmV0dXJuZWQgYXMgd2VsbCBhbmQgaGFzIG5lZ2xpYmxlIGNvc3QuCiAgICAgICAgICAgICAqIHJlbW92ZWQgbm9kYXRhdmFsdWUuIEJlY2F1c2UgTEVSQzIgcGl4ZWxzIGFyZSB0eXBlZCwgbm9kYXRhdmFsdWUgd2lsbCBzYWNyaWZ5IGEgdXNlZnVsIHZhbHVlIGZvciBtYW55IHR5cGVzICg4Yml0LCAxNmJpdCkgZXRjLAogICAgICAgICAgICAgKiAgICAgICB1c2VyIGhhcyB0byBiZSBrbm93bGVkZ2FibGUgZW5vdWdoIGFib3V0IHJhc3RlciBhbmQgdGhlaXIgZGF0YSB0byBhdm9pZCB1c2FiaWxpdHkgaXNzdWVzLiBzbyBub2RhdGEgdmFsdWUgaXMgc2ltcGx5IHJlbW92ZWQgbm93LgogICAgICAgICAgICAgKiAgICAgICBXZSBjYW4gYWRkIGl0IGJhY2sgbGF0ZXIgaWYgdGhlaXIncyBhIGNsZWFyIHJlcXVpcmVtZW50LgogICAgICAgICAgICAgKiByZW1vdmVkIGVuY29kZWRNYXNrLiBUaGlzIG9wdGlvbiB3YXMgbm90IGltcGxlbWVudGVkIGluIExlcmNEZWNvZGUuIEl0IGNhbiBiZSBkb25lIGFmdGVyIGRlY29kaW5nIChsZXNzIGVmZmljaWVudCkKICAgICAgICAgICAgICogcmVtb3ZlZCBjb21wdXRlVXNlZEJpdERlcHRocy4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogcmVzcG9uc2UgY2hhbmdlcyBjb21wYXJlZCB0byBMRVJDMQogICAgICAgICAgICAgKiAxLiBlbmNvZGVkTWFza0RhdGEgaXMgbm90IGF2YWlsYWJsZQogICAgICAgICAgICAgKiAyLiBub0RhdGFWYWx1ZSBpcyBvcHRpb25hbCAocmV0dXJucyBvbmx5IGlmIHVzZXIncyBub0RhdGFWYWx1ZSBpcyB3aXRoIGluIHRoZSB2YWxpZCBkYXRhIHR5cGUgcmFuZ2UpCiAgICAgICAgICAgICAqIDMuIG1hc2tEYXRhIGlzIGFsd2F5cyBhdmFpbGFibGUKICAgICAgICAgICAgKi8KICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICogIHB1YmxpYyBwcm9wZXJ0aWVzCiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKi8KICAgICAgICAgICAgLy9IVUZGTUFOX0xVVF9CSVRTX01BWDogMTIsIC8vdXNlIDJeMTIgbHV0LCBub3QgY29uZmlndXJhYmxlCiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKgogICAgICAgICAgICAqICBwdWJsaWMgbWV0aG9kcwogICAgICAgICAgICAqKioqKioqKioqKioqKioqKi8KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIERlY29kZSBhIExFUkMyIGJ5dGUgc3RyZWFtIGFuZCByZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBpeGVsIGRhdGEgYW5kIG9wdGlvbmFsIG1ldGFkYXRhLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBpbnB1dCBUaGUgTEVSQyBpbnB1dCBieXRlIHN0cmVhbQogICAgICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIG9wdGlvbnMgRGVjb2Rpbmcgb3B0aW9ucwogICAgICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuaW5wdXRPZmZzZXRdIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcCBpbiB0aGUgaW5wdXQgYnl0ZSBzdHJlYW0uIEEgdmFsaWQgTEVSQyBmaWxlIGlzIGV4cGVjdGVkIGF0IHRoYXQgcG9zaXRpb24KICAgICAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5yZXR1cm5GaWxlSW5mb10gSWYgdHJ1ZSwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGhhdmUgYSBmaWxlSW5mbyBwcm9wZXJ0eSB0aGF0IGNvbnRhaW5zIG1ldGFkYXRhIG9idGFpbmVkIGZyb20gdGhlIExFUkMgaGVhZGVycyBhbmQgdGhlIGRlY29kaW5nIHByb2Nlc3MKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRlY29kZTogZnVuY3Rpb24oaW5wdXQsIG9wdGlvbnMpIHsKICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICAgICAgICB2YXIgbm9EYXRhVmFsdWUgPSBvcHRpb25zLm5vRGF0YVZhbHVlOwogICAgICAgICAgICAgIHZhciBpID0gMCwgZGF0YSA9IHt9OwogICAgICAgICAgICAgIGRhdGEucHRyID0gb3B0aW9ucy5pbnB1dE9mZnNldCB8fCAwOwogICAgICAgICAgICAgIGRhdGEucGl4ZWxzID0ge307CiAgICAgICAgICAgICAgaWYgKCFMZXJjMkhlbHBlcnMucmVhZEhlYWRlckluZm8oaW5wdXQsIGRhdGEpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciBoZWFkZXJJbmZvID0gZGF0YS5oZWFkZXJJbmZvOwogICAgICAgICAgICAgIHZhciBmaWxlVmVyc2lvbiA9IGhlYWRlckluZm8uZmlsZVZlcnNpb247CiAgICAgICAgICAgICAgdmFyIE91dFBpeGVsVHlwZUFycmF5ID0gTGVyYzJIZWxwZXJzLmdldERhdGFUeXBlQXJyYXkoaGVhZGVySW5mby5pbWFnZVR5cGUpOwogICAgICAgICAgICAgIExlcmMySGVscGVycy5yZWFkTWFzayhpbnB1dCwgZGF0YSk7CiAgICAgICAgICAgICAgaWYgKGhlYWRlckluZm8ubnVtVmFsaWRQaXhlbCAhPT0gaGVhZGVySW5mby53aWR0aCAqIGhlYWRlckluZm8uaGVpZ2h0ICYmICFkYXRhLnBpeGVscy5yZXN1bHRNYXNrKSB7CiAgICAgICAgICAgICAgICBkYXRhLnBpeGVscy5yZXN1bHRNYXNrID0gb3B0aW9ucy5tYXNrRGF0YTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIG51bVBpeGVscyA9IGhlYWRlckluZm8ud2lkdGggKiBoZWFkZXJJbmZvLmhlaWdodDsKICAgICAgICAgICAgICBkYXRhLnBpeGVscy5yZXN1bHRQaXhlbHMgPSBuZXcgT3V0UGl4ZWxUeXBlQXJyYXkobnVtUGl4ZWxzICogaGVhZGVySW5mby5udW1EaW1zKTsKICAgICAgICAgICAgICBkYXRhLmNvdW50ZXIgPSB7CiAgICAgICAgICAgICAgICBvbmVzd2VlcDogMCwKICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZDogMCwKICAgICAgICAgICAgICAgIGx1dDogMCwKICAgICAgICAgICAgICAgIGJpdHN0dWZmZXI6IDAsCiAgICAgICAgICAgICAgICBjb25zdGFudDogMCwKICAgICAgICAgICAgICAgIGNvbnN0YW50b2Zmc2V0OiAwCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBpZiAoaGVhZGVySW5mby5udW1WYWxpZFBpeGVsICE9PSAwKSB7CiAgICAgICAgICAgICAgICBpZiAoaGVhZGVySW5mby56TWF4ID09PSBoZWFkZXJJbmZvLnpNaW4pIHsKICAgICAgICAgICAgICAgICAgTGVyYzJIZWxwZXJzLmNvbnN0cnVjdENvbnN0YW50U3VyZmFjZShkYXRhKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZVZlcnNpb24gPj0gNCAmJiBMZXJjMkhlbHBlcnMuY2hlY2tNaW5NYXhSYW5nZXMoaW5wdXQsIGRhdGEpKSB7CiAgICAgICAgICAgICAgICAgIExlcmMySGVscGVycy5jb25zdHJ1Y3RDb25zdGFudFN1cmZhY2UoZGF0YSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICB2YXIgdmlldyA9IG5ldyBEYXRhVmlldyhpbnB1dCwgZGF0YS5wdHIsIDIpOwogICAgICAgICAgICAgICAgICB2YXIgYlJlYWREYXRhT25lU3dlZXAgPSB2aWV3LmdldFVpbnQ4KDApOwogICAgICAgICAgICAgICAgICBkYXRhLnB0cisrOwogICAgICAgICAgICAgICAgICBpZiAoYlJlYWREYXRhT25lU3dlZXApIHsKICAgICAgICAgICAgICAgICAgICBMZXJjMkhlbHBlcnMucmVhZERhdGFPbmVTd2VlcChpbnB1dCwgZGF0YSwgT3V0UGl4ZWxUeXBlQXJyYXkpOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlVmVyc2lvbiA+IDEgJiYgaGVhZGVySW5mby5pbWFnZVR5cGUgPD0gMSAmJiBNYXRoLmFicyhoZWFkZXJJbmZvLm1heFpFcnJvciAtIDAuNSkgPCAxZS01KSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgZmxhZ0h1ZmZtYW4gPSB2aWV3LmdldFVpbnQ4KDEpOwogICAgICAgICAgICAgICAgICAgICAgZGF0YS5wdHIrKzsKICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZW5jb2RlTW9kZSA9IGZsYWdIdWZmbWFuOwogICAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWdIdWZmbWFuID4gMiB8fCBmaWxlVmVyc2lvbiA8IDQgJiYgZmxhZ0h1ZmZtYW4gPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICJJbnZhbGlkIEh1ZmZtYW4gZmxhZyAiICsgZmxhZ0h1ZmZtYW47CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ0h1ZmZtYW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGVyYzJIZWxwZXJzLnJlYWRIdWZmbWFuKGlucHV0LCBkYXRhLCBPdXRQaXhlbFR5cGVBcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBMZXJjMkhlbHBlcnMucmVhZFRpbGVzKGlucHV0LCBkYXRhLCBPdXRQaXhlbFR5cGVBcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIExlcmMySGVscGVycy5yZWFkVGlsZXMoaW5wdXQsIGRhdGEsIE91dFBpeGVsVHlwZUFycmF5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZGF0YS5lb2ZPZmZzZXQgPSBkYXRhLnB0cjsKICAgICAgICAgICAgICB2YXIgZGlmZjsKICAgICAgICAgICAgICBpZiAob3B0aW9ucy5pbnB1dE9mZnNldCkgewogICAgICAgICAgICAgICAgZGlmZiA9IGRhdGEuaGVhZGVySW5mby5ibG9iU2l6ZSArIG9wdGlvbnMuaW5wdXRPZmZzZXQgLSBkYXRhLnB0cjsKICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhkaWZmKSA+PSAxKSB7CiAgICAgICAgICAgICAgICAgIGRhdGEuZW9mT2Zmc2V0ID0gb3B0aW9ucy5pbnB1dE9mZnNldCArIGRhdGEuaGVhZGVySW5mby5ibG9iU2l6ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGlmZiA9IGRhdGEuaGVhZGVySW5mby5ibG9iU2l6ZSAtIGRhdGEucHRyOwogICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGRpZmYpID49IDEpIHsKICAgICAgICAgICAgICAgICAgZGF0YS5lb2ZPZmZzZXQgPSBkYXRhLmhlYWRlckluZm8uYmxvYlNpemU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciByZXN1bHQgPSB7CiAgICAgICAgICAgICAgICB3aWR0aDogaGVhZGVySW5mby53aWR0aCwKICAgICAgICAgICAgICAgIGhlaWdodDogaGVhZGVySW5mby5oZWlnaHQsCiAgICAgICAgICAgICAgICBwaXhlbERhdGE6IGRhdGEucGl4ZWxzLnJlc3VsdFBpeGVscywKICAgICAgICAgICAgICAgIG1pblZhbHVlOiBoZWFkZXJJbmZvLnpNaW4sCiAgICAgICAgICAgICAgICBtYXhWYWx1ZTogaGVhZGVySW5mby56TWF4LAogICAgICAgICAgICAgICAgdmFsaWRQaXhlbENvdW50OiBoZWFkZXJJbmZvLm51bVZhbGlkUGl4ZWwsCiAgICAgICAgICAgICAgICBkaW1Db3VudDogaGVhZGVySW5mby5udW1EaW1zLAogICAgICAgICAgICAgICAgZGltU3RhdHM6IHsKICAgICAgICAgICAgICAgICAgbWluVmFsdWVzOiBoZWFkZXJJbmZvLm1pblZhbHVlcywKICAgICAgICAgICAgICAgICAgbWF4VmFsdWVzOiBoZWFkZXJJbmZvLm1heFZhbHVlcwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG1hc2tEYXRhOiBkYXRhLnBpeGVscy5yZXN1bHRNYXNrCiAgICAgICAgICAgICAgICAvL25vRGF0YVZhbHVlOiBub0RhdGFWYWx1ZQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgaWYgKGRhdGEucGl4ZWxzLnJlc3VsdE1hc2sgJiYgTGVyYzJIZWxwZXJzLmlzVmFsaWRQaXhlbFZhbHVlKGhlYWRlckluZm8uaW1hZ2VUeXBlLCBub0RhdGFWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHZhciBtYXNrID0gZGF0YS5waXhlbHMucmVzdWx0TWFzazsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1QaXhlbHM7IGkrKykgewogICAgICAgICAgICAgICAgICBpZiAoIW1hc2tbaV0pIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQucGl4ZWxEYXRhW2ldID0gbm9EYXRhVmFsdWU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlc3VsdC5ub0RhdGFWYWx1ZSA9IG5vRGF0YVZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBkYXRhLm5vRGF0YVZhbHVlID0gbm9EYXRhVmFsdWU7CiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmV0dXJuRmlsZUluZm8pIHsKICAgICAgICAgICAgICAgIHJlc3VsdC5maWxlSW5mbyA9IExlcmMySGVscGVycy5mb3JtYXRGaWxlSW5mbyhkYXRhKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZ2V0QmFuZENvdW50OiBmdW5jdGlvbihpbnB1dCkgewogICAgICAgICAgICAgIHZhciBjb3VudCA9IDA7CiAgICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICAgIHZhciB0ZW1wID0ge307CiAgICAgICAgICAgICAgdGVtcC5wdHIgPSAwOwogICAgICAgICAgICAgIHRlbXAucGl4ZWxzID0ge307CiAgICAgICAgICAgICAgd2hpbGUgKGkgPCBpbnB1dC5ieXRlTGVuZ3RoIC0gNTgpIHsKICAgICAgICAgICAgICAgIExlcmMySGVscGVycy5yZWFkSGVhZGVySW5mbyhpbnB1dCwgdGVtcCk7CiAgICAgICAgICAgICAgICBpICs9IHRlbXAuaGVhZGVySW5mby5ibG9iU2l6ZTsKICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICB0ZW1wLnB0ciA9IGk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIHJldHVybiBMZXJjMkRlY29kZTI7CiAgICAgICAgfSkoKTsKICAgICAgICB2YXIgaXNQbGF0Zm9ybUxpdHRsZUVuZGlhbiA9IChmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBhMyA9IG5ldyBBcnJheUJ1ZmZlcig0KTsKICAgICAgICAgIHZhciBiID0gbmV3IFVpbnQ4QXJyYXkoYTMpOwogICAgICAgICAgdmFyIGMgPSBuZXcgVWludDMyQXJyYXkoYTMpOwogICAgICAgICAgY1swXSA9IDE7CiAgICAgICAgICByZXR1cm4gYlswXSA9PT0gMTsKICAgICAgICB9KSgpOwogICAgICAgIHZhciBMZXJjMiA9IHsKICAgICAgICAgIC8qKioqKioqKioqKip3cmFwcGVyKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAgIC8qKgogICAgICAgICAgICogQSB3cmFwcGVyIGZvciBkZWNvZGluZyBib3RoIExFUkMxIGFuZCBMRVJDMiBieXRlIHN0cmVhbXMgY2FwYWJsZSBvZiBoYW5kbGluZyBtdWx0aWJhbmQgcGl4ZWwgYmxvY2tzIGZvciB2YXJpb3VzIHBpeGVsIHR5cGVzLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBhbGlhcyBtb2R1bGU6TGVyYwogICAgICAgICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gaW5wdXQgVGhlIExFUkMgaW5wdXQgYnl0ZSBzdHJlYW0KICAgICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gVGhlIGRlY29kaW5nIG9wdGlvbnMgYmVsb3cgYXJlIG9wdGlvbmFsLgogICAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmlucHV0T2Zmc2V0XSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgaW4gdGhlIGlucHV0IGJ5dGUgc3RyZWFtLiBBIHZhbGlkIExlcmMgZmlsZSBpcyBleHBlY3RlZCBhdCB0aGF0IHBvc2l0aW9uLgogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnBpeGVsVHlwZV0gKExFUkMxIG9ubHkpIERlZmF1bHQgdmFsdWUgaXMgRjMyLiBWYWxpZCBwaXhlbCB0eXBlcyBmb3IgaW5wdXQgYXJlIFU4L1M4L1MxNi9VMTYvUzMyL1UzMi9GMzIuCiAgICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubm9EYXRhVmFsdWVdIChMRVJDMSBvbmx5KS4gSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSByZXR1cm5lZCBtYXNrIGluc3RlYWQgb2Ygc2V0dGluZyB0aGlzIHZhbHVlLgogICAgICAgICAgICogQHJldHVybnMge3t3aWR0aCwgaGVpZ2h0LCBwaXhlbHMsIHBpeGVsVHlwZSwgbWFzaywgc3RhdGlzdGljc319CiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCBXaWR0aCBvZiBkZWNvZGVkIGltYWdlLgogICAgICAgICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gaGVpZ2h0IEhlaWdodCBvZiBkZWNvZGVkIGltYWdlLgogICAgICAgICAgICAgKiBAcHJvcGVydHkge2FycmF5fSBwaXhlbHMgW2JhbmQxLCBiYW5kMiwg4oCmXSBFYWNoIGJhbmQgaXMgYSB0eXBlZCBhcnJheSBvZiB3aWR0aCpoZWlnaHQuCiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwaXhlbFR5cGUgVGhlIHR5cGUgb2YgcGl4ZWxzIHJlcHJlc2VudGVkIGluIHRoZSBvdXRwdXQuCiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7bWFza30gbWFzayBUeXBlZCBhcnJheSB3aXRoIGEgc2l6ZSBvZiB3aWR0aCpoZWlnaHQsIG9yIG51bGwgaWYgYWxsIHBpeGVscyBhcmUgdmFsaWQuCiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7YXJyYXl9IHN0YXRpc3RpY3MgW3N0YXRpc3RpY3NfYmFuZDEsIHN0YXRpc3RpY3NfYmFuZDIsIOKApl0gRWFjaCBlbGVtZW50IGlzIGEgc3RhdGlzdGljcyBvYmplY3QgcmVwcmVzZW50aW5nIG1pbiBhbmQgbWF4IHZhbHVlcwogICAgICAgICAgKiovCiAgICAgICAgICBkZWNvZGU6IGZ1bmN0aW9uKGVuY29kZWREYXRhLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICghaXNQbGF0Zm9ybUxpdHRsZUVuZGlhbikgewogICAgICAgICAgICAgIHRocm93ICJCaWcgZW5kaWFuIHN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgICAgIHZhciBpbnB1dE9mZnNldCA9IG9wdGlvbnMuaW5wdXRPZmZzZXQgfHwgMDsKICAgICAgICAgICAgdmFyIGZpbGVJZFZpZXcgPSBuZXcgVWludDhBcnJheShlbmNvZGVkRGF0YSwgaW5wdXRPZmZzZXQsIDEwKTsKICAgICAgICAgICAgdmFyIGZpbGVJZGVudGlmaWVyU3RyaW5nID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBmaWxlSWRWaWV3KTsKICAgICAgICAgICAgdmFyIGxlcmMsIG1ham9yVmVyc2lvbjsKICAgICAgICAgICAgaWYgKGZpbGVJZGVudGlmaWVyU3RyaW5nLnRyaW0oKSA9PT0gIkNudFpJbWFnZSIpIHsKICAgICAgICAgICAgICBsZXJjID0gTGVyY0RlY29kZTsKICAgICAgICAgICAgICBtYWpvclZlcnNpb24gPSAxOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVJZGVudGlmaWVyU3RyaW5nLnN1YnN0cmluZygwLCA1KSA9PT0gIkxlcmMyIikgewogICAgICAgICAgICAgIGxlcmMgPSBMZXJjMkRlY29kZTsKICAgICAgICAgICAgICBtYWpvclZlcnNpb24gPSAyOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRocm93ICJVbmV4cGVjdGVkIGZpbGUgaWRlbnRpZmllciBzdHJpbmc6ICIgKyBmaWxlSWRlbnRpZmllclN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgaVBsYW5lID0gMCwgZW9mID0gZW5jb2RlZERhdGEuYnl0ZUxlbmd0aCAtIDEwLCBlbmNvZGVkTWFza0RhdGEsIGJhbmRNYXNrcyA9IFtdLCBiYW5kTWFzaywgbWFza0RhdGE7CiAgICAgICAgICAgIHZhciBkZWNvZGVkUGl4ZWxCbG9jayA9IHsKICAgICAgICAgICAgICB3aWR0aDogMCwKICAgICAgICAgICAgICBoZWlnaHQ6IDAsCiAgICAgICAgICAgICAgcGl4ZWxzOiBbXSwKICAgICAgICAgICAgICBwaXhlbFR5cGU6IG9wdGlvbnMucGl4ZWxUeXBlLAogICAgICAgICAgICAgIG1hc2s6IG51bGwsCiAgICAgICAgICAgICAgc3RhdGlzdGljczogW10KICAgICAgICAgICAgfTsKICAgICAgICAgICAgd2hpbGUgKGlucHV0T2Zmc2V0IDwgZW9mKSB7CiAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGxlcmMuZGVjb2RlKGVuY29kZWREYXRhLCB7CiAgICAgICAgICAgICAgICBpbnB1dE9mZnNldCwKICAgICAgICAgICAgICAgIC8vZm9yIGJvdGggbGVyYzEgYW5kIGxlcmMyCiAgICAgICAgICAgICAgICBlbmNvZGVkTWFza0RhdGEsCiAgICAgICAgICAgICAgICAvL2xlcmMxIG9ubHkKICAgICAgICAgICAgICAgIG1hc2tEYXRhLAogICAgICAgICAgICAgICAgLy9sZXJjMiBvbmx5CiAgICAgICAgICAgICAgICByZXR1cm5NYXNrOiBpUGxhbmUgPT09IDAgPyB0cnVlIDogZmFsc2UsCiAgICAgICAgICAgICAgICAvL2xlcmMxIG9ubHkKICAgICAgICAgICAgICAgIHJldHVybkVuY29kZWRNYXNrOiBpUGxhbmUgPT09IDAgPyB0cnVlIDogZmFsc2UsCiAgICAgICAgICAgICAgICAvL2xlcmMxIG9ubHkKICAgICAgICAgICAgICAgIHJldHVybkZpbGVJbmZvOiB0cnVlLAogICAgICAgICAgICAgICAgLy9mb3IgYm90aCBsZXJjMSBhbmQgbGVyYzIKICAgICAgICAgICAgICAgIHBpeGVsVHlwZTogb3B0aW9ucy5waXhlbFR5cGUgfHwgbnVsbCwKICAgICAgICAgICAgICAgIC8vbGVyYzEgb25seQogICAgICAgICAgICAgICAgbm9EYXRhVmFsdWU6IG9wdGlvbnMubm9EYXRhVmFsdWUgfHwgbnVsbAogICAgICAgICAgICAgICAgLy9sZXJjMSBvbmx5CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgaW5wdXRPZmZzZXQgPSByZXN1bHQuZmlsZUluZm8uZW9mT2Zmc2V0OwogICAgICAgICAgICAgIGlmIChpUGxhbmUgPT09IDApIHsKICAgICAgICAgICAgICAgIGVuY29kZWRNYXNrRGF0YSA9IHJlc3VsdC5lbmNvZGVkTWFza0RhdGE7CiAgICAgICAgICAgICAgICBtYXNrRGF0YSA9IHJlc3VsdC5tYXNrRGF0YTsKICAgICAgICAgICAgICAgIGRlY29kZWRQaXhlbEJsb2NrLndpZHRoID0gcmVzdWx0LndpZHRoOwogICAgICAgICAgICAgICAgZGVjb2RlZFBpeGVsQmxvY2suaGVpZ2h0ID0gcmVzdWx0LmhlaWdodDsKICAgICAgICAgICAgICAgIGRlY29kZWRQaXhlbEJsb2NrLmRpbUNvdW50ID0gcmVzdWx0LmRpbUNvdW50IHx8IDE7CiAgICAgICAgICAgICAgICBkZWNvZGVkUGl4ZWxCbG9jay5waXhlbFR5cGUgPSByZXN1bHQucGl4ZWxUeXBlIHx8IHJlc3VsdC5maWxlSW5mby5waXhlbFR5cGU7CiAgICAgICAgICAgICAgICBkZWNvZGVkUGl4ZWxCbG9jay5tYXNrID0gcmVzdWx0Lm1hc2tEYXRhOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobWFqb3JWZXJzaW9uID4gMSAmJiByZXN1bHQuZmlsZUluZm8ubWFzayAmJiByZXN1bHQuZmlsZUluZm8ubWFzay5udW1CeXRlcyA+IDApIHsKICAgICAgICAgICAgICAgIGJhbmRNYXNrcy5wdXNoKHJlc3VsdC5tYXNrRGF0YSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlQbGFuZSsrOwogICAgICAgICAgICAgIGRlY29kZWRQaXhlbEJsb2NrLnBpeGVscy5wdXNoKHJlc3VsdC5waXhlbERhdGEpOwogICAgICAgICAgICAgIGRlY29kZWRQaXhlbEJsb2NrLnN0YXRpc3RpY3MucHVzaCh7CiAgICAgICAgICAgICAgICBtaW5WYWx1ZTogcmVzdWx0Lm1pblZhbHVlLAogICAgICAgICAgICAgICAgbWF4VmFsdWU6IHJlc3VsdC5tYXhWYWx1ZSwKICAgICAgICAgICAgICAgIG5vRGF0YVZhbHVlOiByZXN1bHQubm9EYXRhVmFsdWUsCiAgICAgICAgICAgICAgICBkaW1TdGF0czogcmVzdWx0LmRpbVN0YXRzCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGksIGosIG51bVBpeGVsczsKICAgICAgICAgICAgaWYgKG1ham9yVmVyc2lvbiA+IDEgJiYgYmFuZE1hc2tzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICBudW1QaXhlbHMgPSBkZWNvZGVkUGl4ZWxCbG9jay53aWR0aCAqIGRlY29kZWRQaXhlbEJsb2NrLmhlaWdodDsKICAgICAgICAgICAgICBkZWNvZGVkUGl4ZWxCbG9jay5iYW5kTWFza3MgPSBiYW5kTWFza3M7CiAgICAgICAgICAgICAgbWFza0RhdGEgPSBuZXcgVWludDhBcnJheShudW1QaXhlbHMpOwogICAgICAgICAgICAgIG1hc2tEYXRhLnNldChiYW5kTWFza3NbMF0pOwogICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBiYW5kTWFza3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGJhbmRNYXNrID0gYmFuZE1hc2tzW2ldOwogICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bVBpeGVsczsgaisrKSB7CiAgICAgICAgICAgICAgICAgIG1hc2tEYXRhW2pdID0gbWFza0RhdGFbal0gJiBiYW5kTWFza1tqXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZGVjb2RlZFBpeGVsQmxvY2subWFza0RhdGEgPSBtYXNrRGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGVjb2RlZFBpeGVsQmxvY2s7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgICBkZWZpbmUoW10sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gTGVyYzI7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZS5leHBvcnRzKSB7CiAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IExlcmMyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLkxlcmMgPSBMZXJjMjsKICAgICAgICB9CiAgICAgIH0pKCk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVWZXJ0aWNlc0Zyb21IZWlnaHRtYXAuanMKICB2YXIgY3JlYXRlVmVydGljZXNGcm9tSGVpZ2h0bWFwX2V4cG9ydHMgPSB7fTsKICBfX2V4cG9ydChjcmVhdGVWZXJ0aWNlc0Zyb21IZWlnaHRtYXBfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gY3JlYXRlVmVydGljZXNGcm9tSGVpZ2h0bWFwX2RlZmF1bHQKICB9KTsKICBmdW5jdGlvbiBjcmVhdGVWZXJ0aWNlc0Zyb21IZWlnaHRtYXAocGFyYW1ldGVycywgdHJhbnNmZXJhYmxlT2JqZWN0cykgewogICAgaWYgKHBhcmFtZXRlcnMuZW5jb2RpbmcgPT09IEhlaWdodG1hcEVuY29kaW5nX2RlZmF1bHQuTEVSQykgewogICAgICBsZXQgcmVzdWx0OwogICAgICB0cnkgewogICAgICAgIHJlc3VsdCA9IGltcG9ydF9sZXJjLmRlZmF1bHQuZGVjb2RlKHBhcmFtZXRlcnMuaGVpZ2h0bWFwKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yX2RlZmF1bHQoZXJyb3IpOwogICAgICB9CiAgICAgIGNvbnN0IGxlcmNTdGF0aXN0aWNzID0gcmVzdWx0LnN0YXRpc3RpY3NbMF07CiAgICAgIGlmIChsZXJjU3RhdGlzdGljcy5taW5WYWx1ZSA9PT0gTnVtYmVyLk1BWF9WQUxVRSkgewogICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3JfZGVmYXVsdCgiSW52YWxpZCB0aWxlIGRhdGEiKTsKICAgICAgfQogICAgICBwYXJhbWV0ZXJzLmhlaWdodG1hcCA9IHJlc3VsdC5waXhlbHNbMF07CiAgICAgIHBhcmFtZXRlcnMud2lkdGggPSByZXN1bHQud2lkdGg7CiAgICAgIHBhcmFtZXRlcnMuaGVpZ2h0ID0gcmVzdWx0LmhlaWdodDsKICAgIH0KICAgIHBhcmFtZXRlcnMuZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUocGFyYW1ldGVycy5lbGxpcHNvaWQpOwogICAgcGFyYW1ldGVycy5yZWN0YW5nbGUgPSBSZWN0YW5nbGVfZGVmYXVsdC5jbG9uZShwYXJhbWV0ZXJzLnJlY3RhbmdsZSk7CiAgICBjb25zdCBzdGF0aXN0aWNzMiA9IEhlaWdodG1hcFRlc3NlbGxhdG9yX2RlZmF1bHQuY29tcHV0ZVZlcnRpY2VzKHBhcmFtZXRlcnMpOwogICAgY29uc3QgdmVydGljZXMgPSBzdGF0aXN0aWNzMi52ZXJ0aWNlczsKICAgIHRyYW5zZmVyYWJsZU9iamVjdHMucHVzaCh2ZXJ0aWNlcy5idWZmZXIpOwogICAgcmV0dXJuIHsKICAgICAgdmVydGljZXM6IHZlcnRpY2VzLmJ1ZmZlciwKICAgICAgbnVtYmVyT2ZBdHRyaWJ1dGVzOiBzdGF0aXN0aWNzMi5lbmNvZGluZy5zdHJpZGUsCiAgICAgIG1pbmltdW1IZWlnaHQ6IHN0YXRpc3RpY3MyLm1pbmltdW1IZWlnaHQsCiAgICAgIG1heGltdW1IZWlnaHQ6IHN0YXRpc3RpY3MyLm1heGltdW1IZWlnaHQsCiAgICAgIGdyaWRXaWR0aDogcGFyYW1ldGVycy53aWR0aCwKICAgICAgZ3JpZEhlaWdodDogcGFyYW1ldGVycy5oZWlnaHQsCiAgICAgIGJvdW5kaW5nU3BoZXJlM0Q6IHN0YXRpc3RpY3MyLmJvdW5kaW5nU3BoZXJlM0QsCiAgICAgIG9yaWVudGVkQm91bmRpbmdCb3g6IHN0YXRpc3RpY3MyLm9yaWVudGVkQm91bmRpbmdCb3gsCiAgICAgIG9jY2x1ZGVlUG9pbnRJblNjYWxlZFNwYWNlOiBzdGF0aXN0aWNzMi5vY2NsdWRlZVBvaW50SW5TY2FsZWRTcGFjZSwKICAgICAgZW5jb2Rpbmc6IHN0YXRpc3RpY3MyLmVuY29kaW5nLAogICAgICB3ZXN0SW5kaWNlc1NvdXRoVG9Ob3J0aDogc3RhdGlzdGljczIud2VzdEluZGljZXNTb3V0aFRvTm9ydGgsCiAgICAgIHNvdXRoSW5kaWNlc0Vhc3RUb1dlc3Q6IHN0YXRpc3RpY3MyLnNvdXRoSW5kaWNlc0Vhc3RUb1dlc3QsCiAgICAgIGVhc3RJbmRpY2VzTm9ydGhUb1NvdXRoOiBzdGF0aXN0aWNzMi5lYXN0SW5kaWNlc05vcnRoVG9Tb3V0aCwKICAgICAgbm9ydGhJbmRpY2VzV2VzdFRvRWFzdDogc3RhdGlzdGljczIubm9ydGhJbmRpY2VzV2VzdFRvRWFzdAogICAgfTsKICB9CiAgdmFyIGltcG9ydF9sZXJjLCBjcmVhdGVWZXJ0aWNlc0Zyb21IZWlnaHRtYXBfZGVmYXVsdDsKICB2YXIgaW5pdF9jcmVhdGVWZXJ0aWNlc0Zyb21IZWlnaHRtYXAgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVZlcnRpY2VzRnJvbUhlaWdodG1hcC5qcyIoKSB7CiAgICAgIGluaXRfRWxsaXBzb2lkKCk7CiAgICAgIGluaXRfSGVpZ2h0bWFwRW5jb2RpbmcoKTsKICAgICAgaW5pdF9IZWlnaHRtYXBUZXNzZWxsYXRvcigpOwogICAgICBpbml0X1JlY3RhbmdsZSgpOwogICAgICBpbml0X1J1bnRpbWVFcnJvcigpOwogICAgICBpbXBvcnRfbGVyYyA9IF9fdG9FU00ocmVxdWlyZV9MZXJjRGVjb2RlKCksIDEpOwogICAgICBpbml0X2NyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXIoKTsKICAgICAgY3JlYXRlVmVydGljZXNGcm9tSGVpZ2h0bWFwX2RlZmF1bHQgPSBjcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyX2RlZmF1bHQoY3JlYXRlVmVydGljZXNGcm9tSGVpZ2h0bWFwKTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1RlcnJhaW5Qcm92aWRlci5qcwogIGZ1bmN0aW9uIFRlcnJhaW5Qcm92aWRlcigpIHsKICAgIERldmVsb3BlckVycm9yX2RlZmF1bHQudGhyb3dJbnN0YW50aWF0aW9uRXJyb3IoKTsKICB9CiAgZnVuY3Rpb24gZ2V0RWRnZUluZGljZXMod2lkdGgsIGhlaWdodCkgewogICAgY29uc3Qgd2VzdEluZGljZXNTb3V0aFRvTm9ydGggPSBuZXcgQXJyYXkoaGVpZ2h0KTsKICAgIGNvbnN0IHNvdXRoSW5kaWNlc0Vhc3RUb1dlc3QgPSBuZXcgQXJyYXkod2lkdGgpOwogICAgY29uc3QgZWFzdEluZGljZXNOb3J0aFRvU291dGggPSBuZXcgQXJyYXkoaGVpZ2h0KTsKICAgIGNvbnN0IG5vcnRoSW5kaWNlc1dlc3RUb0Vhc3QgPSBuZXcgQXJyYXkod2lkdGgpOwogICAgbGV0IGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgewogICAgICBub3J0aEluZGljZXNXZXN0VG9FYXN0W2ldID0gaTsKICAgICAgc291dGhJbmRpY2VzRWFzdFRvV2VzdFtpXSA9IHdpZHRoICogaGVpZ2h0IC0gMSAtIGk7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKICAgICAgZWFzdEluZGljZXNOb3J0aFRvU291dGhbaV0gPSAoaSArIDEpICogd2lkdGggLSAxOwogICAgICB3ZXN0SW5kaWNlc1NvdXRoVG9Ob3J0aFtpXSA9IChoZWlnaHQgLSBpIC0gMSkgKiB3aWR0aDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHdlc3RJbmRpY2VzU291dGhUb05vcnRoLAogICAgICBzb3V0aEluZGljZXNFYXN0VG9XZXN0LAogICAgICBlYXN0SW5kaWNlc05vcnRoVG9Tb3V0aCwKICAgICAgbm9ydGhJbmRpY2VzV2VzdFRvRWFzdAogICAgfTsKICB9CiAgZnVuY3Rpb24gYWRkUmVndWxhckdyaWRJbmRpY2VzKHdpZHRoLCBoZWlnaHQsIGluZGljZXMsIG9mZnNldCkgewogICAgbGV0IGluZGV4ID0gMDsKICAgIGZvciAobGV0IGogPSAwOyBqIDwgaGVpZ2h0IC0gMTsgKytqKSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGggLSAxOyArK2kpIHsKICAgICAgICBjb25zdCB1cHBlckxlZnQgPSBpbmRleDsKICAgICAgICBjb25zdCBsb3dlckxlZnQgPSB1cHBlckxlZnQgKyB3aWR0aDsKICAgICAgICBjb25zdCBsb3dlclJpZ2h0ID0gbG93ZXJMZWZ0ICsgMTsKICAgICAgICBjb25zdCB1cHBlclJpZ2h0ID0gdXBwZXJMZWZ0ICsgMTsKICAgICAgICBpbmRpY2VzW29mZnNldCsrXSA9IHVwcGVyTGVmdDsKICAgICAgICBpbmRpY2VzW29mZnNldCsrXSA9IGxvd2VyTGVmdDsKICAgICAgICBpbmRpY2VzW29mZnNldCsrXSA9IHVwcGVyUmlnaHQ7CiAgICAgICAgaW5kaWNlc1tvZmZzZXQrK10gPSB1cHBlclJpZ2h0OwogICAgICAgIGluZGljZXNbb2Zmc2V0KytdID0gbG93ZXJMZWZ0OwogICAgICAgIGluZGljZXNbb2Zmc2V0KytdID0gbG93ZXJSaWdodDsKICAgICAgICArK2luZGV4OwogICAgICB9CiAgICAgICsraW5kZXg7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGFkZFNraXJ0SW5kaWNlcyhlZGdlSW5kaWNlcywgdmVydGV4SW5kZXgsIGluZGljZXMsIG9mZnNldCkgewogICAgbGV0IHByZXZpb3VzSW5kZXggPSBlZGdlSW5kaWNlc1swXTsKICAgIGNvbnN0IGxlbmd0aCA9IGVkZ2VJbmRpY2VzLmxlbmd0aDsKICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgY29uc3QgaW5kZXggPSBlZGdlSW5kaWNlc1tpXTsKICAgICAgaW5kaWNlc1tvZmZzZXQrK10gPSBwcmV2aW91c0luZGV4OwogICAgICBpbmRpY2VzW29mZnNldCsrXSA9IGluZGV4OwogICAgICBpbmRpY2VzW29mZnNldCsrXSA9IHZlcnRleEluZGV4OwogICAgICBpbmRpY2VzW29mZnNldCsrXSA9IHZlcnRleEluZGV4OwogICAgICBpbmRpY2VzW29mZnNldCsrXSA9IGluZGV4OwogICAgICBpbmRpY2VzW29mZnNldCsrXSA9IHZlcnRleEluZGV4ICsgMTsKICAgICAgcHJldmlvdXNJbmRleCA9IGluZGV4OwogICAgICArK3ZlcnRleEluZGV4OwogICAgfQogICAgcmV0dXJuIG9mZnNldDsKICB9CiAgdmFyIHJlZ3VsYXJHcmlkSW5kaWNlc0NhY2hlLCByZWd1bGFyR3JpZEFuZEVkZ2VJbmRpY2VzQ2FjaGUsIHJlZ3VsYXJHcmlkQW5kU2tpcnRBbmRFZGdlSW5kaWNlc0NhY2hlLCBUZXJyYWluUHJvdmlkZXJfZGVmYXVsdDsKICB2YXIgaW5pdF9UZXJyYWluUHJvdmlkZXIgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1RlcnJhaW5Qcm92aWRlci5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfSW5kZXhEYXRhdHlwZSgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVGVycmFpblByb3ZpZGVyLnByb3RvdHlwZSwgewogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgYW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiB0aGUgdGVycmFpbiBwcm92aWRlciBlbmNvdW50ZXJzIGFuIGFzeW5jaHJvbm91cyBlcnJvci4gIEJ5IHN1YnNjcmliaW5nCiAgICAgICAgICogdG8gdGhlIGV2ZW50LCB5b3Ugd2lsbCBiZSBub3RpZmllZCBvZiB0aGUgZXJyb3IgYW5kIGNhbiBwb3RlbnRpYWxseSByZWNvdmVyIGZyb20gaXQuICBFdmVudCBsaXN0ZW5lcnMKICAgICAgICAgKiBhcmUgcGFzc2VkIGFuIGluc3RhbmNlIG9mIHtAbGluayBUaWxlUHJvdmlkZXJFcnJvcn0uCiAgICAgICAgICogQG1lbWJlcm9mIFRlcnJhaW5Qcm92aWRlci5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7RXZlbnQ8VGVycmFpblByb3ZpZGVyLkVycm9yRXZlbnQ+fQogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqLwogICAgICAgIGVycm9yRXZlbnQ6IHsKICAgICAgICAgIGdldDogRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdC50aHJvd0luc3RhbnRpYXRpb25FcnJvcgogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgY3JlZGl0IHRvIGRpc3BsYXkgd2hlbiB0aGlzIHRlcnJhaW4gcHJvdmlkZXIgaXMgYWN0aXZlLiAgVHlwaWNhbGx5IHRoaXMgaXMgdXNlZCB0byBjcmVkaXQKICAgICAgICAgKiB0aGUgc291cmNlIG9mIHRoZSB0ZXJyYWluLgogICAgICAgICAqIEBtZW1iZXJvZiBUZXJyYWluUHJvdmlkZXIucHJvdG90eXBlCiAgICAgICAgICogQHR5cGUge0NyZWRpdH0KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKi8KICAgICAgICBjcmVkaXQ6IHsKICAgICAgICAgIGdldDogRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdC50aHJvd0luc3RhbnRpYXRpb25FcnJvcgogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgdGlsaW5nIHNjaGVtZSB1c2VkIGJ5IHRoZSBwcm92aWRlci4KICAgICAgICAgKiBAbWVtYmVyb2YgVGVycmFpblByb3ZpZGVyLnByb3RvdHlwZQogICAgICAgICAqIEB0eXBlIHtUaWxpbmdTY2hlbWV9CiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICovCiAgICAgICAgdGlsaW5nU2NoZW1lOiB7CiAgICAgICAgICBnZXQ6IERldmVsb3BlckVycm9yX2RlZmF1bHQudGhyb3dJbnN0YW50aWF0aW9uRXJyb3IKICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBwcm92aWRlciBpbmNsdWRlcyBhIHdhdGVyIG1hc2suICBUaGUgd2F0ZXIgbWFzawogICAgICAgICAqIGluZGljYXRlcyB3aGljaCBhcmVhcyBvZiB0aGUgZ2xvYmUgYXJlIHdhdGVyIHJhdGhlciB0aGFuIGxhbmQsIHNvIHRoZXkgY2FuIGJlIHJlbmRlcmVkCiAgICAgICAgICogYXMgYSByZWZsZWN0aXZlIHN1cmZhY2Ugd2l0aCBhbmltYXRlZCB3YXZlcy4KICAgICAgICAgKiBAbWVtYmVyb2YgVGVycmFpblByb3ZpZGVyLnByb3RvdHlwZQogICAgICAgICAqIEB0eXBlIHtib29sZWFufQogICAgICAgICAqIEByZWFkb25seQogICAgICAgICAqLwogICAgICAgIGhhc1dhdGVyTWFzazogewogICAgICAgICAgZ2V0OiBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0LnRocm93SW5zdGFudGlhdGlvbkVycm9yCiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVxdWVzdGVkIHRpbGVzIGluY2x1ZGUgdmVydGV4IG5vcm1hbHMuCiAgICAgICAgICogQG1lbWJlcm9mIFRlcnJhaW5Qcm92aWRlci5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0KICAgICAgICAgKiBAcmVhZG9ubHkKICAgICAgICAgKi8KICAgICAgICBoYXNWZXJ0ZXhOb3JtYWxzOiB7CiAgICAgICAgICBnZXQ6IERldmVsb3BlckVycm9yX2RlZmF1bHQudGhyb3dJbnN0YW50aWF0aW9uRXJyb3IKICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGF2YWlsYWJpbGl0eSBvZiB0ZXJyYWluIGZyb20gdGhpcyBwcm92aWRlciwgc3VjaCBhcwogICAgICAgICAqIGF0IHBvaW50cyBhbmQgaW4gcmVjdGFuZ2xlcy4gVGhpcyBwcm9wZXJ0eSBtYXkgYmUgdW5kZWZpbmVkIGlmIGF2YWlsYWJpbGl0eQogICAgICAgICAqIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuCiAgICAgICAgICogQG1lbWJlcm9mIFRlcnJhaW5Qcm92aWRlci5wcm90b3R5cGUKICAgICAgICAgKiBAdHlwZSB7VGlsZUF2YWlsYWJpbGl0eXx1bmRlZmluZWR9CiAgICAgICAgICogQHJlYWRvbmx5CiAgICAgICAgICovCiAgICAgICAgYXZhaWxhYmlsaXR5OiB7CiAgICAgICAgICBnZXQ6IERldmVsb3BlckVycm9yX2RlZmF1bHQudGhyb3dJbnN0YW50aWF0aW9uRXJyb3IKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZWd1bGFyR3JpZEluZGljZXNDYWNoZSA9IFtdOwogICAgICBUZXJyYWluUHJvdmlkZXIuZ2V0UmVndWxhckdyaWRJbmRpY2VzID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCkgewogICAgICAgIGlmICh3aWR0aCAqIGhlaWdodCA+PSBNYXRoX2RlZmF1bHQuRk9VUl9HSUdBQllURVMpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAiVGhlIHRvdGFsIG51bWJlciBvZiB2ZXJ0aWNlcyAod2lkdGggKiBoZWlnaHQpIG11c3QgYmUgbGVzcyB0aGFuIDQsMjk0LDk2NywyOTYuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbGV0IGJ5V2lkdGggPSByZWd1bGFyR3JpZEluZGljZXNDYWNoZVt3aWR0aF07CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYnlXaWR0aCkpIHsKICAgICAgICAgIHJlZ3VsYXJHcmlkSW5kaWNlc0NhY2hlW3dpZHRoXSA9IGJ5V2lkdGggPSBbXTsKICAgICAgICB9CiAgICAgICAgbGV0IGluZGljZXMgPSBieVdpZHRoW2hlaWdodF07CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaW5kaWNlcykpIHsKICAgICAgICAgIGlmICh3aWR0aCAqIGhlaWdodCA8IE1hdGhfZGVmYXVsdC5TSVhUWV9GT1VSX0tJTE9CWVRFUykgewogICAgICAgICAgICBpbmRpY2VzID0gYnlXaWR0aFtoZWlnaHRdID0gbmV3IFVpbnQxNkFycmF5KAogICAgICAgICAgICAgICh3aWR0aCAtIDEpICogKGhlaWdodCAtIDEpICogNgogICAgICAgICAgICApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW5kaWNlcyA9IGJ5V2lkdGhbaGVpZ2h0XSA9IG5ldyBVaW50MzJBcnJheSgKICAgICAgICAgICAgICAod2lkdGggLSAxKSAqIChoZWlnaHQgLSAxKSAqIDYKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICAgIGFkZFJlZ3VsYXJHcmlkSW5kaWNlcyh3aWR0aCwgaGVpZ2h0LCBpbmRpY2VzLCAwKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluZGljZXM7CiAgICAgIH07CiAgICAgIHJlZ3VsYXJHcmlkQW5kRWRnZUluZGljZXNDYWNoZSA9IFtdOwogICAgICBUZXJyYWluUHJvdmlkZXIuZ2V0UmVndWxhckdyaWRJbmRpY2VzQW5kRWRnZUluZGljZXMgPSBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgaWYgKHdpZHRoICogaGVpZ2h0ID49IE1hdGhfZGVmYXVsdC5GT1VSX0dJR0FCWVRFUykgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJUaGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzICh3aWR0aCAqIGhlaWdodCkgbXVzdCBiZSBsZXNzIHRoYW4gNCwyOTQsOTY3LDI5Ni4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBsZXQgYnlXaWR0aCA9IHJlZ3VsYXJHcmlkQW5kRWRnZUluZGljZXNDYWNoZVt3aWR0aF07CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYnlXaWR0aCkpIHsKICAgICAgICAgIHJlZ3VsYXJHcmlkQW5kRWRnZUluZGljZXNDYWNoZVt3aWR0aF0gPSBieVdpZHRoID0gW107CiAgICAgICAgfQogICAgICAgIGxldCBpbmRpY2VzQW5kRWRnZXMgPSBieVdpZHRoW2hlaWdodF07CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoaW5kaWNlc0FuZEVkZ2VzKSkgewogICAgICAgICAgY29uc3QgaW5kaWNlcyA9IFRlcnJhaW5Qcm92aWRlci5nZXRSZWd1bGFyR3JpZEluZGljZXMod2lkdGgsIGhlaWdodCk7CiAgICAgICAgICBjb25zdCBlZGdlSW5kaWNlcyA9IGdldEVkZ2VJbmRpY2VzKHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgY29uc3Qgd2VzdEluZGljZXNTb3V0aFRvTm9ydGggPSBlZGdlSW5kaWNlcy53ZXN0SW5kaWNlc1NvdXRoVG9Ob3J0aDsKICAgICAgICAgIGNvbnN0IHNvdXRoSW5kaWNlc0Vhc3RUb1dlc3QgPSBlZGdlSW5kaWNlcy5zb3V0aEluZGljZXNFYXN0VG9XZXN0OwogICAgICAgICAgY29uc3QgZWFzdEluZGljZXNOb3J0aFRvU291dGggPSBlZGdlSW5kaWNlcy5lYXN0SW5kaWNlc05vcnRoVG9Tb3V0aDsKICAgICAgICAgIGNvbnN0IG5vcnRoSW5kaWNlc1dlc3RUb0Vhc3QgPSBlZGdlSW5kaWNlcy5ub3J0aEluZGljZXNXZXN0VG9FYXN0OwogICAgICAgICAgaW5kaWNlc0FuZEVkZ2VzID0gYnlXaWR0aFtoZWlnaHRdID0gewogICAgICAgICAgICBpbmRpY2VzLAogICAgICAgICAgICB3ZXN0SW5kaWNlc1NvdXRoVG9Ob3J0aCwKICAgICAgICAgICAgc291dGhJbmRpY2VzRWFzdFRvV2VzdCwKICAgICAgICAgICAgZWFzdEluZGljZXNOb3J0aFRvU291dGgsCiAgICAgICAgICAgIG5vcnRoSW5kaWNlc1dlc3RUb0Vhc3QKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBpbmRpY2VzQW5kRWRnZXM7CiAgICAgIH07CiAgICAgIHJlZ3VsYXJHcmlkQW5kU2tpcnRBbmRFZGdlSW5kaWNlc0NhY2hlID0gW107CiAgICAgIFRlcnJhaW5Qcm92aWRlci5nZXRSZWd1bGFyR3JpZEFuZFNraXJ0SW5kaWNlc0FuZEVkZ2VJbmRpY2VzID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCkgewogICAgICAgIGlmICh3aWR0aCAqIGhlaWdodCA+PSBNYXRoX2RlZmF1bHQuRk9VUl9HSUdBQllURVMpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAiVGhlIHRvdGFsIG51bWJlciBvZiB2ZXJ0aWNlcyAod2lkdGggKiBoZWlnaHQpIG11c3QgYmUgbGVzcyB0aGFuIDQsMjk0LDk2NywyOTYuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbGV0IGJ5V2lkdGggPSByZWd1bGFyR3JpZEFuZFNraXJ0QW5kRWRnZUluZGljZXNDYWNoZVt3aWR0aF07CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYnlXaWR0aCkpIHsKICAgICAgICAgIHJlZ3VsYXJHcmlkQW5kU2tpcnRBbmRFZGdlSW5kaWNlc0NhY2hlW3dpZHRoXSA9IGJ5V2lkdGggPSBbXTsKICAgICAgICB9CiAgICAgICAgbGV0IGluZGljZXNBbmRFZGdlcyA9IGJ5V2lkdGhbaGVpZ2h0XTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChpbmRpY2VzQW5kRWRnZXMpKSB7CiAgICAgICAgICBjb25zdCBncmlkVmVydGV4Q291bnQgPSB3aWR0aCAqIGhlaWdodDsKICAgICAgICAgIGNvbnN0IGdyaWRJbmRleENvdW50ID0gKHdpZHRoIC0gMSkgKiAoaGVpZ2h0IC0gMSkgKiA2OwogICAgICAgICAgY29uc3QgZWRnZVZlcnRleENvdW50ID0gd2lkdGggKiAyICsgaGVpZ2h0ICogMjsKICAgICAgICAgIGNvbnN0IGVkZ2VJbmRleENvdW50ID0gTWF0aC5tYXgoMCwgZWRnZVZlcnRleENvdW50IC0gNCkgKiA2OwogICAgICAgICAgY29uc3QgdmVydGV4Q291bnQgPSBncmlkVmVydGV4Q291bnQgKyBlZGdlVmVydGV4Q291bnQ7CiAgICAgICAgICBjb25zdCBpbmRleENvdW50ID0gZ3JpZEluZGV4Q291bnQgKyBlZGdlSW5kZXhDb3VudDsKICAgICAgICAgIGNvbnN0IGVkZ2VJbmRpY2VzID0gZ2V0RWRnZUluZGljZXMod2lkdGgsIGhlaWdodCk7CiAgICAgICAgICBjb25zdCB3ZXN0SW5kaWNlc1NvdXRoVG9Ob3J0aCA9IGVkZ2VJbmRpY2VzLndlc3RJbmRpY2VzU291dGhUb05vcnRoOwogICAgICAgICAgY29uc3Qgc291dGhJbmRpY2VzRWFzdFRvV2VzdCA9IGVkZ2VJbmRpY2VzLnNvdXRoSW5kaWNlc0Vhc3RUb1dlc3Q7CiAgICAgICAgICBjb25zdCBlYXN0SW5kaWNlc05vcnRoVG9Tb3V0aCA9IGVkZ2VJbmRpY2VzLmVhc3RJbmRpY2VzTm9ydGhUb1NvdXRoOwogICAgICAgICAgY29uc3Qgbm9ydGhJbmRpY2VzV2VzdFRvRWFzdCA9IGVkZ2VJbmRpY2VzLm5vcnRoSW5kaWNlc1dlc3RUb0Vhc3Q7CiAgICAgICAgICBjb25zdCBpbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkodmVydGV4Q291bnQsIGluZGV4Q291bnQpOwogICAgICAgICAgYWRkUmVndWxhckdyaWRJbmRpY2VzKHdpZHRoLCBoZWlnaHQsIGluZGljZXMsIDApOwogICAgICAgICAgVGVycmFpblByb3ZpZGVyLmFkZFNraXJ0SW5kaWNlcygKICAgICAgICAgICAgd2VzdEluZGljZXNTb3V0aFRvTm9ydGgsCiAgICAgICAgICAgIHNvdXRoSW5kaWNlc0Vhc3RUb1dlc3QsCiAgICAgICAgICAgIGVhc3RJbmRpY2VzTm9ydGhUb1NvdXRoLAogICAgICAgICAgICBub3J0aEluZGljZXNXZXN0VG9FYXN0LAogICAgICAgICAgICBncmlkVmVydGV4Q291bnQsCiAgICAgICAgICAgIGluZGljZXMsCiAgICAgICAgICAgIGdyaWRJbmRleENvdW50CiAgICAgICAgICApOwogICAgICAgICAgaW5kaWNlc0FuZEVkZ2VzID0gYnlXaWR0aFtoZWlnaHRdID0gewogICAgICAgICAgICBpbmRpY2VzLAogICAgICAgICAgICB3ZXN0SW5kaWNlc1NvdXRoVG9Ob3J0aCwKICAgICAgICAgICAgc291dGhJbmRpY2VzRWFzdFRvV2VzdCwKICAgICAgICAgICAgZWFzdEluZGljZXNOb3J0aFRvU291dGgsCiAgICAgICAgICAgIG5vcnRoSW5kaWNlc1dlc3RUb0Vhc3QsCiAgICAgICAgICAgIGluZGV4Q291bnRXaXRob3V0U2tpcnRzOiBncmlkSW5kZXhDb3VudAogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluZGljZXNBbmRFZGdlczsKICAgICAgfTsKICAgICAgVGVycmFpblByb3ZpZGVyLmFkZFNraXJ0SW5kaWNlcyA9IGZ1bmN0aW9uKHdlc3RJbmRpY2VzU291dGhUb05vcnRoLCBzb3V0aEluZGljZXNFYXN0VG9XZXN0LCBlYXN0SW5kaWNlc05vcnRoVG9Tb3V0aCwgbm9ydGhJbmRpY2VzV2VzdFRvRWFzdCwgdmVydGV4Q291bnQsIGluZGljZXMsIG9mZnNldCkgewogICAgICAgIGxldCB2ZXJ0ZXhJbmRleCA9IHZlcnRleENvdW50OwogICAgICAgIG9mZnNldCA9IGFkZFNraXJ0SW5kaWNlcygKICAgICAgICAgIHdlc3RJbmRpY2VzU291dGhUb05vcnRoLAogICAgICAgICAgdmVydGV4SW5kZXgsCiAgICAgICAgICBpbmRpY2VzLAogICAgICAgICAgb2Zmc2V0CiAgICAgICAgKTsKICAgICAgICB2ZXJ0ZXhJbmRleCArPSB3ZXN0SW5kaWNlc1NvdXRoVG9Ob3J0aC5sZW5ndGg7CiAgICAgICAgb2Zmc2V0ID0gYWRkU2tpcnRJbmRpY2VzKAogICAgICAgICAgc291dGhJbmRpY2VzRWFzdFRvV2VzdCwKICAgICAgICAgIHZlcnRleEluZGV4LAogICAgICAgICAgaW5kaWNlcywKICAgICAgICAgIG9mZnNldAogICAgICAgICk7CiAgICAgICAgdmVydGV4SW5kZXggKz0gc291dGhJbmRpY2VzRWFzdFRvV2VzdC5sZW5ndGg7CiAgICAgICAgb2Zmc2V0ID0gYWRkU2tpcnRJbmRpY2VzKAogICAgICAgICAgZWFzdEluZGljZXNOb3J0aFRvU291dGgsCiAgICAgICAgICB2ZXJ0ZXhJbmRleCwKICAgICAgICAgIGluZGljZXMsCiAgICAgICAgICBvZmZzZXQKICAgICAgICApOwogICAgICAgIHZlcnRleEluZGV4ICs9IGVhc3RJbmRpY2VzTm9ydGhUb1NvdXRoLmxlbmd0aDsKICAgICAgICBhZGRTa2lydEluZGljZXMobm9ydGhJbmRpY2VzV2VzdFRvRWFzdCwgdmVydGV4SW5kZXgsIGluZGljZXMsIG9mZnNldCk7CiAgICAgIH07CiAgICAgIFRlcnJhaW5Qcm92aWRlci5oZWlnaHRtYXBUZXJyYWluUXVhbGl0eSA9IDAuMjU7CiAgICAgIFRlcnJhaW5Qcm92aWRlci5nZXRFc3RpbWF0ZWRMZXZlbFplcm9HZW9tZXRyaWNFcnJvckZvckFIZWlnaHRtYXAgPSBmdW5jdGlvbihlbGxpcHNvaWQsIHRpbGVJbWFnZVdpZHRoLCBudW1iZXJPZlRpbGVzQXRMZXZlbFplcm8pIHsKICAgICAgICByZXR1cm4gZWxsaXBzb2lkLm1heGltdW1SYWRpdXMgKiAyICogTWF0aC5QSSAqIFRlcnJhaW5Qcm92aWRlci5oZWlnaHRtYXBUZXJyYWluUXVhbGl0eSAvICh0aWxlSW1hZ2VXaWR0aCAqIG51bWJlck9mVGlsZXNBdExldmVsWmVybyk7CiAgICAgIH07CiAgICAgIFRlcnJhaW5Qcm92aWRlci5wcm90b3R5cGUucmVxdWVzdFRpbGVHZW9tZXRyeSA9IERldmVsb3BlckVycm9yX2RlZmF1bHQudGhyb3dJbnN0YW50aWF0aW9uRXJyb3I7CiAgICAgIFRlcnJhaW5Qcm92aWRlci5wcm90b3R5cGUuZ2V0TGV2ZWxNYXhpbXVtR2VvbWV0cmljRXJyb3IgPSBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0LnRocm93SW5zdGFudGlhdGlvbkVycm9yOwogICAgICBUZXJyYWluUHJvdmlkZXIucHJvdG90eXBlLmdldFRpbGVEYXRhQXZhaWxhYmxlID0gRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdC50aHJvd0luc3RhbnRpYXRpb25FcnJvcjsKICAgICAgVGVycmFpblByb3ZpZGVyLnByb3RvdHlwZS5sb2FkVGlsZURhdGFBdmFpbGFiaWxpdHkgPSBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0LnRocm93SW5zdGFudGlhdGlvbkVycm9yOwogICAgICBUZXJyYWluUHJvdmlkZXJfZGVmYXVsdCA9IFRlcnJhaW5Qcm92aWRlcjsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVZlcnRpY2VzRnJvbVF1YW50aXplZFRlcnJhaW5NZXNoLmpzCiAgdmFyIGNyZWF0ZVZlcnRpY2VzRnJvbVF1YW50aXplZFRlcnJhaW5NZXNoX2V4cG9ydHMgPSB7fTsKICBfX2V4cG9ydChjcmVhdGVWZXJ0aWNlc0Zyb21RdWFudGl6ZWRUZXJyYWluTWVzaF9leHBvcnRzLCB7CiAgICBkZWZhdWx0OiAoKSA9PiBjcmVhdGVWZXJ0aWNlc0Zyb21RdWFudGl6ZWRUZXJyYWluTWVzaF9kZWZhdWx0CiAgfSk7CiAgZnVuY3Rpb24gY3JlYXRlVmVydGljZXNGcm9tUXVhbnRpemVkVGVycmFpbk1lc2gocGFyYW1ldGVycywgdHJhbnNmZXJhYmxlT2JqZWN0cykgewogICAgY29uc3QgcXVhbnRpemVkVmVydGljZXMgPSBwYXJhbWV0ZXJzLnF1YW50aXplZFZlcnRpY2VzOwogICAgY29uc3QgcXVhbnRpemVkVmVydGV4Q291bnQgPSBxdWFudGl6ZWRWZXJ0aWNlcy5sZW5ndGggLyAzOwogICAgY29uc3Qgb2N0RW5jb2RlZE5vcm1hbHMgPSBwYXJhbWV0ZXJzLm9jdEVuY29kZWROb3JtYWxzOwogICAgY29uc3QgZWRnZVZlcnRleENvdW50ID0gcGFyYW1ldGVycy53ZXN0SW5kaWNlcy5sZW5ndGggKyBwYXJhbWV0ZXJzLmVhc3RJbmRpY2VzLmxlbmd0aCArIHBhcmFtZXRlcnMuc291dGhJbmRpY2VzLmxlbmd0aCArIHBhcmFtZXRlcnMubm9ydGhJbmRpY2VzLmxlbmd0aDsKICAgIGNvbnN0IGluY2x1ZGVXZWJNZXJjYXRvclQgPSBwYXJhbWV0ZXJzLmluY2x1ZGVXZWJNZXJjYXRvclQ7CiAgICBjb25zdCBleGFnZ2VyYXRpb24gPSBwYXJhbWV0ZXJzLmV4YWdnZXJhdGlvbjsKICAgIGNvbnN0IGV4YWdnZXJhdGlvblJlbGF0aXZlSGVpZ2h0ID0gcGFyYW1ldGVycy5leGFnZ2VyYXRpb25SZWxhdGl2ZUhlaWdodDsKICAgIGNvbnN0IGhhc0V4YWdnZXJhdGlvbiA9IGV4YWdnZXJhdGlvbiAhPT0gMTsKICAgIGNvbnN0IGluY2x1ZGVHZW9kZXRpY1N1cmZhY2VOb3JtYWxzID0gaGFzRXhhZ2dlcmF0aW9uOwogICAgY29uc3QgcmVjdGFuZ2xlID0gUmVjdGFuZ2xlX2RlZmF1bHQuY2xvbmUocGFyYW1ldGVycy5yZWN0YW5nbGUpOwogICAgY29uc3Qgd2VzdCA9IHJlY3RhbmdsZS53ZXN0OwogICAgY29uc3Qgc291dGggPSByZWN0YW5nbGUuc291dGg7CiAgICBjb25zdCBlYXN0ID0gcmVjdGFuZ2xlLmVhc3Q7CiAgICBjb25zdCBub3J0aCA9IHJlY3RhbmdsZS5ub3J0aDsKICAgIGNvbnN0IGVsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKHBhcmFtZXRlcnMuZWxsaXBzb2lkKTsKICAgIGNvbnN0IG1pbmltdW1IZWlnaHQgPSBwYXJhbWV0ZXJzLm1pbmltdW1IZWlnaHQ7CiAgICBjb25zdCBtYXhpbXVtSGVpZ2h0ID0gcGFyYW1ldGVycy5tYXhpbXVtSGVpZ2h0OwogICAgY29uc3QgY2VudGVyID0gcGFyYW1ldGVycy5yZWxhdGl2ZVRvQ2VudGVyOwogICAgY29uc3QgZnJvbUVOVSA9IFRyYW5zZm9ybXNfZGVmYXVsdC5lYXN0Tm9ydGhVcFRvRml4ZWRGcmFtZShjZW50ZXIsIGVsbGlwc29pZCk7CiAgICBjb25zdCB0b0VOVSA9IE1hdHJpeDRfZGVmYXVsdC5pbnZlcnNlVHJhbnNmb3JtYXRpb24oZnJvbUVOVSwgbmV3IE1hdHJpeDRfZGVmYXVsdCgpKTsKICAgIGxldCBzb3V0aE1lcmNhdG9yWTsKICAgIGxldCBvbmVPdmVyTWVyY2F0b3JIZWlnaHQ7CiAgICBpZiAoaW5jbHVkZVdlYk1lcmNhdG9yVCkgewogICAgICBzb3V0aE1lcmNhdG9yWSA9IFdlYk1lcmNhdG9yUHJvamVjdGlvbl9kZWZhdWx0Lmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGUoc291dGgpOwogICAgICBvbmVPdmVyTWVyY2F0b3JIZWlnaHQgPSAxIC8gKFdlYk1lcmNhdG9yUHJvamVjdGlvbl9kZWZhdWx0Lmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGUobm9ydGgpIC0gc291dGhNZXJjYXRvclkpOwogICAgfQogICAgY29uc3QgdUJ1ZmZlciA9IHF1YW50aXplZFZlcnRpY2VzLnN1YmFycmF5KDAsIHF1YW50aXplZFZlcnRleENvdW50KTsKICAgIGNvbnN0IHZCdWZmZXIgPSBxdWFudGl6ZWRWZXJ0aWNlcy5zdWJhcnJheSgKICAgICAgcXVhbnRpemVkVmVydGV4Q291bnQsCiAgICAgIDIgKiBxdWFudGl6ZWRWZXJ0ZXhDb3VudAogICAgKTsKICAgIGNvbnN0IGhlaWdodEJ1ZmZlciA9IHF1YW50aXplZFZlcnRpY2VzLnN1YmFycmF5KAogICAgICBxdWFudGl6ZWRWZXJ0ZXhDb3VudCAqIDIsCiAgICAgIDMgKiBxdWFudGl6ZWRWZXJ0ZXhDb3VudAogICAgKTsKICAgIGNvbnN0IGhhc1ZlcnRleE5vcm1hbHMgPSBkZWZpbmVkX2RlZmF1bHQob2N0RW5jb2RlZE5vcm1hbHMpOwogICAgY29uc3QgdXZzID0gbmV3IEFycmF5KHF1YW50aXplZFZlcnRleENvdW50KTsKICAgIGNvbnN0IGhlaWdodHMgPSBuZXcgQXJyYXkocXVhbnRpemVkVmVydGV4Q291bnQpOwogICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEFycmF5KHF1YW50aXplZFZlcnRleENvdW50KTsKICAgIGNvbnN0IHdlYk1lcmNhdG9yVHMgPSBpbmNsdWRlV2ViTWVyY2F0b3JUID8gbmV3IEFycmF5KHF1YW50aXplZFZlcnRleENvdW50KSA6IFtdOwogICAgY29uc3QgZ2VvZGV0aWNTdXJmYWNlTm9ybWFscyA9IGluY2x1ZGVHZW9kZXRpY1N1cmZhY2VOb3JtYWxzID8gbmV3IEFycmF5KHF1YW50aXplZFZlcnRleENvdW50KSA6IFtdOwogICAgY29uc3QgbWluaW11bSA9IHNjcmF0Y2hNaW5pbXVtOwogICAgbWluaW11bS54ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgbWluaW11bS55ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgbWluaW11bS56ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgY29uc3QgbWF4aW11bSA9IHNjcmF0Y2hNYXhpbXVtOwogICAgbWF4aW11bS54ID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOwogICAgbWF4aW11bS55ID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOwogICAgbWF4aW11bS56ID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOwogICAgbGV0IG1pbkxvbmdpdHVkZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgIGxldCBtYXhMb25naXR1ZGUgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7CiAgICBsZXQgbWluTGF0aXR1ZGUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICBsZXQgbWF4TGF0aXR1ZGUgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YW50aXplZFZlcnRleENvdW50OyArK2kpIHsKICAgICAgY29uc3QgcmF3VSA9IHVCdWZmZXJbaV07CiAgICAgIGNvbnN0IHJhd1YgPSB2QnVmZmVyW2ldOwogICAgICBjb25zdCB1MyA9IHJhd1UgLyBtYXhTaG9ydDQ7CiAgICAgIGNvbnN0IHYzID0gcmF3ViAvIG1heFNob3J0NDsKICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aF9kZWZhdWx0LmxlcnAoCiAgICAgICAgbWluaW11bUhlaWdodCwKICAgICAgICBtYXhpbXVtSGVpZ2h0LAogICAgICAgIGhlaWdodEJ1ZmZlcltpXSAvIG1heFNob3J0NAogICAgICApOwogICAgICBjYXJ0b2dyYXBoaWNTY3JhdGNoLmxvbmdpdHVkZSA9IE1hdGhfZGVmYXVsdC5sZXJwKHdlc3QsIGVhc3QsIHUzKTsKICAgICAgY2FydG9ncmFwaGljU2NyYXRjaC5sYXRpdHVkZSA9IE1hdGhfZGVmYXVsdC5sZXJwKHNvdXRoLCBub3J0aCwgdjMpOwogICAgICBjYXJ0b2dyYXBoaWNTY3JhdGNoLmhlaWdodCA9IGhlaWdodDsKICAgICAgbWluTG9uZ2l0dWRlID0gTWF0aC5taW4oY2FydG9ncmFwaGljU2NyYXRjaC5sb25naXR1ZGUsIG1pbkxvbmdpdHVkZSk7CiAgICAgIG1heExvbmdpdHVkZSA9IE1hdGgubWF4KGNhcnRvZ3JhcGhpY1NjcmF0Y2gubG9uZ2l0dWRlLCBtYXhMb25naXR1ZGUpOwogICAgICBtaW5MYXRpdHVkZSA9IE1hdGgubWluKGNhcnRvZ3JhcGhpY1NjcmF0Y2gubGF0aXR1ZGUsIG1pbkxhdGl0dWRlKTsKICAgICAgbWF4TGF0aXR1ZGUgPSBNYXRoLm1heChjYXJ0b2dyYXBoaWNTY3JhdGNoLmxhdGl0dWRlLCBtYXhMYXRpdHVkZSk7CiAgICAgIGNvbnN0IHBvc2l0aW9uID0gZWxsaXBzb2lkLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGNhcnRvZ3JhcGhpY1NjcmF0Y2gpOwogICAgICB1dnNbaV0gPSBuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KHUzLCB2Myk7CiAgICAgIGhlaWdodHNbaV0gPSBoZWlnaHQ7CiAgICAgIHBvc2l0aW9uc1tpXSA9IHBvc2l0aW9uOwogICAgICBpZiAoaW5jbHVkZVdlYk1lcmNhdG9yVCkgewogICAgICAgIHdlYk1lcmNhdG9yVHNbaV0gPSAoV2ViTWVyY2F0b3JQcm9qZWN0aW9uX2RlZmF1bHQuZ2VvZGV0aWNMYXRpdHVkZVRvTWVyY2F0b3JBbmdsZSgKICAgICAgICAgIGNhcnRvZ3JhcGhpY1NjcmF0Y2gubGF0aXR1ZGUKICAgICAgICApIC0gc291dGhNZXJjYXRvclkpICogb25lT3Zlck1lcmNhdG9ySGVpZ2h0OwogICAgICB9CiAgICAgIGlmIChpbmNsdWRlR2VvZGV0aWNTdXJmYWNlTm9ybWFscykgewogICAgICAgIGdlb2RldGljU3VyZmFjZU5vcm1hbHNbaV0gPSBlbGxpcHNvaWQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKHBvc2l0aW9uKTsKICAgICAgfQogICAgICBNYXRyaXg0X2RlZmF1bHQubXVsdGlwbHlCeVBvaW50KHRvRU5VLCBwb3NpdGlvbiwgY2FydGVzaWFuM1NjcmF0Y2g4KTsKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm1pbmltdW1CeUNvbXBvbmVudChjYXJ0ZXNpYW4zU2NyYXRjaDgsIG1pbmltdW0sIG1pbmltdW0pOwogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubWF4aW11bUJ5Q29tcG9uZW50KGNhcnRlc2lhbjNTY3JhdGNoOCwgbWF4aW11bSwgbWF4aW11bSk7CiAgICB9CiAgICBjb25zdCB3ZXN0SW5kaWNlc1NvdXRoVG9Ob3J0aCA9IGNvcHlBbmRTb3J0KAogICAgICBwYXJhbWV0ZXJzLndlc3RJbmRpY2VzLAogICAgICBmdW5jdGlvbihhMywgYikgewogICAgICAgIHJldHVybiB1dnNbYTNdLnkgLSB1dnNbYl0ueTsKICAgICAgfQogICAgKTsKICAgIGNvbnN0IGVhc3RJbmRpY2VzTm9ydGhUb1NvdXRoID0gY29weUFuZFNvcnQoCiAgICAgIHBhcmFtZXRlcnMuZWFzdEluZGljZXMsCiAgICAgIGZ1bmN0aW9uKGEzLCBiKSB7CiAgICAgICAgcmV0dXJuIHV2c1tiXS55IC0gdXZzW2EzXS55OwogICAgICB9CiAgICApOwogICAgY29uc3Qgc291dGhJbmRpY2VzRWFzdFRvV2VzdCA9IGNvcHlBbmRTb3J0KAogICAgICBwYXJhbWV0ZXJzLnNvdXRoSW5kaWNlcywKICAgICAgZnVuY3Rpb24oYTMsIGIpIHsKICAgICAgICByZXR1cm4gdXZzW2JdLnggLSB1dnNbYTNdLng7CiAgICAgIH0KICAgICk7CiAgICBjb25zdCBub3J0aEluZGljZXNXZXN0VG9FYXN0ID0gY29weUFuZFNvcnQoCiAgICAgIHBhcmFtZXRlcnMubm9ydGhJbmRpY2VzLAogICAgICBmdW5jdGlvbihhMywgYikgewogICAgICAgIHJldHVybiB1dnNbYTNdLnggLSB1dnNbYl0ueDsKICAgICAgfQogICAgKTsKICAgIGxldCBvY2NsdWRlZVBvaW50SW5TY2FsZWRTcGFjZTsKICAgIGlmIChtaW5pbXVtSGVpZ2h0IDwgMCkgewogICAgICBjb25zdCBvY2NsdWRlciA9IG5ldyBFbGxpcHNvaWRhbE9jY2x1ZGVyX2RlZmF1bHQoZWxsaXBzb2lkKTsKICAgICAgb2NjbHVkZWVQb2ludEluU2NhbGVkU3BhY2UgPSBvY2NsdWRlci5jb21wdXRlSG9yaXpvbkN1bGxpbmdQb2ludFBvc3NpYmx5VW5kZXJFbGxpcHNvaWQoCiAgICAgICAgY2VudGVyLAogICAgICAgIHBvc2l0aW9ucywKICAgICAgICBtaW5pbXVtSGVpZ2h0CiAgICAgICk7CiAgICB9CiAgICBsZXQgaE1pbiA9IG1pbmltdW1IZWlnaHQ7CiAgICBoTWluID0gTWF0aC5taW4oCiAgICAgIGhNaW4sCiAgICAgIGZpbmRNaW5NYXhTa2lydHMoCiAgICAgICAgcGFyYW1ldGVycy53ZXN0SW5kaWNlcywKICAgICAgICBwYXJhbWV0ZXJzLndlc3RTa2lydEhlaWdodCwKICAgICAgICBoZWlnaHRzLAogICAgICAgIHV2cywKICAgICAgICByZWN0YW5nbGUsCiAgICAgICAgZWxsaXBzb2lkLAogICAgICAgIHRvRU5VLAogICAgICAgIG1pbmltdW0sCiAgICAgICAgbWF4aW11bQogICAgICApCiAgICApOwogICAgaE1pbiA9IE1hdGgubWluKAogICAgICBoTWluLAogICAgICBmaW5kTWluTWF4U2tpcnRzKAogICAgICAgIHBhcmFtZXRlcnMuc291dGhJbmRpY2VzLAogICAgICAgIHBhcmFtZXRlcnMuc291dGhTa2lydEhlaWdodCwKICAgICAgICBoZWlnaHRzLAogICAgICAgIHV2cywKICAgICAgICByZWN0YW5nbGUsCiAgICAgICAgZWxsaXBzb2lkLAogICAgICAgIHRvRU5VLAogICAgICAgIG1pbmltdW0sCiAgICAgICAgbWF4aW11bQogICAgICApCiAgICApOwogICAgaE1pbiA9IE1hdGgubWluKAogICAgICBoTWluLAogICAgICBmaW5kTWluTWF4U2tpcnRzKAogICAgICAgIHBhcmFtZXRlcnMuZWFzdEluZGljZXMsCiAgICAgICAgcGFyYW1ldGVycy5lYXN0U2tpcnRIZWlnaHQsCiAgICAgICAgaGVpZ2h0cywKICAgICAgICB1dnMsCiAgICAgICAgcmVjdGFuZ2xlLAogICAgICAgIGVsbGlwc29pZCwKICAgICAgICB0b0VOVSwKICAgICAgICBtaW5pbXVtLAogICAgICAgIG1heGltdW0KICAgICAgKQogICAgKTsKICAgIGhNaW4gPSBNYXRoLm1pbigKICAgICAgaE1pbiwKICAgICAgZmluZE1pbk1heFNraXJ0cygKICAgICAgICBwYXJhbWV0ZXJzLm5vcnRoSW5kaWNlcywKICAgICAgICBwYXJhbWV0ZXJzLm5vcnRoU2tpcnRIZWlnaHQsCiAgICAgICAgaGVpZ2h0cywKICAgICAgICB1dnMsCiAgICAgICAgcmVjdGFuZ2xlLAogICAgICAgIGVsbGlwc29pZCwKICAgICAgICB0b0VOVSwKICAgICAgICBtaW5pbXVtLAogICAgICAgIG1heGltdW0KICAgICAgKQogICAgKTsKICAgIGNvbnN0IGFhQm94ID0gbmV3IEF4aXNBbGlnbmVkQm91bmRpbmdCb3hfZGVmYXVsdChtaW5pbXVtLCBtYXhpbXVtLCBjZW50ZXIpOwogICAgY29uc3QgZW5jb2RpbmcgPSBuZXcgVGVycmFpbkVuY29kaW5nX2RlZmF1bHQoCiAgICAgIGNlbnRlciwKICAgICAgYWFCb3gsCiAgICAgIGhNaW4sCiAgICAgIG1heGltdW1IZWlnaHQsCiAgICAgIGZyb21FTlUsCiAgICAgIGhhc1ZlcnRleE5vcm1hbHMsCiAgICAgIGluY2x1ZGVXZWJNZXJjYXRvclQsCiAgICAgIGluY2x1ZGVHZW9kZXRpY1N1cmZhY2VOb3JtYWxzLAogICAgICBleGFnZ2VyYXRpb24sCiAgICAgIGV4YWdnZXJhdGlvblJlbGF0aXZlSGVpZ2h0CiAgICApOwogICAgY29uc3QgdmVydGV4U3RyaWRlID0gZW5jb2Rpbmcuc3RyaWRlOwogICAgY29uc3Qgc2l6ZSA9IHF1YW50aXplZFZlcnRleENvdW50ICogdmVydGV4U3RyaWRlICsgZWRnZVZlcnRleENvdW50ICogdmVydGV4U3RyaWRlOwogICAgY29uc3QgdmVydGV4QnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheShzaXplKTsKICAgIGxldCBidWZmZXJJbmRleCA9IDA7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHF1YW50aXplZFZlcnRleENvdW50OyArK2opIHsKICAgICAgaWYgKGhhc1ZlcnRleE5vcm1hbHMpIHsKICAgICAgICBjb25zdCBuID0gaiAqIDI7CiAgICAgICAgdG9QYWNrLnggPSBvY3RFbmNvZGVkTm9ybWFsc1tuXTsKICAgICAgICB0b1BhY2sueSA9IG9jdEVuY29kZWROb3JtYWxzW24gKyAxXTsKICAgICAgfQogICAgICBidWZmZXJJbmRleCA9IGVuY29kaW5nLmVuY29kZSgKICAgICAgICB2ZXJ0ZXhCdWZmZXIsCiAgICAgICAgYnVmZmVySW5kZXgsCiAgICAgICAgcG9zaXRpb25zW2pdLAogICAgICAgIHV2c1tqXSwKICAgICAgICBoZWlnaHRzW2pdLAogICAgICAgIHRvUGFjaywKICAgICAgICB3ZWJNZXJjYXRvclRzW2pdLAogICAgICAgIGdlb2RldGljU3VyZmFjZU5vcm1hbHNbal0KICAgICAgKTsKICAgIH0KICAgIGNvbnN0IGVkZ2VUcmlhbmdsZUNvdW50ID0gTWF0aC5tYXgoMCwgKGVkZ2VWZXJ0ZXhDb3VudCAtIDQpICogMik7CiAgICBjb25zdCBpbmRleEJ1ZmZlckxlbmd0aCA9IHBhcmFtZXRlcnMuaW5kaWNlcy5sZW5ndGggKyBlZGdlVHJpYW5nbGVDb3VudCAqIDM7CiAgICBjb25zdCBpbmRleEJ1ZmZlciA9IEluZGV4RGF0YXR5cGVfZGVmYXVsdC5jcmVhdGVUeXBlZEFycmF5KAogICAgICBxdWFudGl6ZWRWZXJ0ZXhDb3VudCArIGVkZ2VWZXJ0ZXhDb3VudCwKICAgICAgaW5kZXhCdWZmZXJMZW5ndGgKICAgICk7CiAgICBpbmRleEJ1ZmZlci5zZXQocGFyYW1ldGVycy5pbmRpY2VzLCAwKTsKICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAxZS00OwogICAgY29uc3QgbG9uT2Zmc2V0ID0gKG1heExvbmdpdHVkZSAtIG1pbkxvbmdpdHVkZSkgKiBwZXJjZW50YWdlOwogICAgY29uc3QgbGF0T2Zmc2V0ID0gKG1heExhdGl0dWRlIC0gbWluTGF0aXR1ZGUpICogcGVyY2VudGFnZTsKICAgIGNvbnN0IHdlc3RMb25naXR1ZGVPZmZzZXQgPSAtbG9uT2Zmc2V0OwogICAgY29uc3Qgd2VzdExhdGl0dWRlT2Zmc2V0ID0gMDsKICAgIGNvbnN0IGVhc3RMb25naXR1ZGVPZmZzZXQgPSBsb25PZmZzZXQ7CiAgICBjb25zdCBlYXN0TGF0aXR1ZGVPZmZzZXQgPSAwOwogICAgY29uc3Qgbm9ydGhMb25naXR1ZGVPZmZzZXQgPSAwOwogICAgY29uc3Qgbm9ydGhMYXRpdHVkZU9mZnNldCA9IGxhdE9mZnNldDsKICAgIGNvbnN0IHNvdXRoTG9uZ2l0dWRlT2Zmc2V0ID0gMDsKICAgIGNvbnN0IHNvdXRoTGF0aXR1ZGVPZmZzZXQgPSAtbGF0T2Zmc2V0OwogICAgbGV0IHZlcnRleEJ1ZmZlckluZGV4ID0gcXVhbnRpemVkVmVydGV4Q291bnQgKiB2ZXJ0ZXhTdHJpZGU7CiAgICBhZGRTa2lydDIoCiAgICAgIHZlcnRleEJ1ZmZlciwKICAgICAgdmVydGV4QnVmZmVySW5kZXgsCiAgICAgIHdlc3RJbmRpY2VzU291dGhUb05vcnRoLAogICAgICBlbmNvZGluZywKICAgICAgaGVpZ2h0cywKICAgICAgdXZzLAogICAgICBvY3RFbmNvZGVkTm9ybWFscywKICAgICAgZWxsaXBzb2lkLAogICAgICByZWN0YW5nbGUsCiAgICAgIHBhcmFtZXRlcnMud2VzdFNraXJ0SGVpZ2h0LAogICAgICBzb3V0aE1lcmNhdG9yWSwKICAgICAgb25lT3Zlck1lcmNhdG9ySGVpZ2h0LAogICAgICB3ZXN0TG9uZ2l0dWRlT2Zmc2V0LAogICAgICB3ZXN0TGF0aXR1ZGVPZmZzZXQKICAgICk7CiAgICB2ZXJ0ZXhCdWZmZXJJbmRleCArPSBwYXJhbWV0ZXJzLndlc3RJbmRpY2VzLmxlbmd0aCAqIHZlcnRleFN0cmlkZTsKICAgIGFkZFNraXJ0MigKICAgICAgdmVydGV4QnVmZmVyLAogICAgICB2ZXJ0ZXhCdWZmZXJJbmRleCwKICAgICAgc291dGhJbmRpY2VzRWFzdFRvV2VzdCwKICAgICAgZW5jb2RpbmcsCiAgICAgIGhlaWdodHMsCiAgICAgIHV2cywKICAgICAgb2N0RW5jb2RlZE5vcm1hbHMsCiAgICAgIGVsbGlwc29pZCwKICAgICAgcmVjdGFuZ2xlLAogICAgICBwYXJhbWV0ZXJzLnNvdXRoU2tpcnRIZWlnaHQsCiAgICAgIHNvdXRoTWVyY2F0b3JZLAogICAgICBvbmVPdmVyTWVyY2F0b3JIZWlnaHQsCiAgICAgIHNvdXRoTG9uZ2l0dWRlT2Zmc2V0LAogICAgICBzb3V0aExhdGl0dWRlT2Zmc2V0CiAgICApOwogICAgdmVydGV4QnVmZmVySW5kZXggKz0gcGFyYW1ldGVycy5zb3V0aEluZGljZXMubGVuZ3RoICogdmVydGV4U3RyaWRlOwogICAgYWRkU2tpcnQyKAogICAgICB2ZXJ0ZXhCdWZmZXIsCiAgICAgIHZlcnRleEJ1ZmZlckluZGV4LAogICAgICBlYXN0SW5kaWNlc05vcnRoVG9Tb3V0aCwKICAgICAgZW5jb2RpbmcsCiAgICAgIGhlaWdodHMsCiAgICAgIHV2cywKICAgICAgb2N0RW5jb2RlZE5vcm1hbHMsCiAgICAgIGVsbGlwc29pZCwKICAgICAgcmVjdGFuZ2xlLAogICAgICBwYXJhbWV0ZXJzLmVhc3RTa2lydEhlaWdodCwKICAgICAgc291dGhNZXJjYXRvclksCiAgICAgIG9uZU92ZXJNZXJjYXRvckhlaWdodCwKICAgICAgZWFzdExvbmdpdHVkZU9mZnNldCwKICAgICAgZWFzdExhdGl0dWRlT2Zmc2V0CiAgICApOwogICAgdmVydGV4QnVmZmVySW5kZXggKz0gcGFyYW1ldGVycy5lYXN0SW5kaWNlcy5sZW5ndGggKiB2ZXJ0ZXhTdHJpZGU7CiAgICBhZGRTa2lydDIoCiAgICAgIHZlcnRleEJ1ZmZlciwKICAgICAgdmVydGV4QnVmZmVySW5kZXgsCiAgICAgIG5vcnRoSW5kaWNlc1dlc3RUb0Vhc3QsCiAgICAgIGVuY29kaW5nLAogICAgICBoZWlnaHRzLAogICAgICB1dnMsCiAgICAgIG9jdEVuY29kZWROb3JtYWxzLAogICAgICBlbGxpcHNvaWQsCiAgICAgIHJlY3RhbmdsZSwKICAgICAgcGFyYW1ldGVycy5ub3J0aFNraXJ0SGVpZ2h0LAogICAgICBzb3V0aE1lcmNhdG9yWSwKICAgICAgb25lT3Zlck1lcmNhdG9ySGVpZ2h0LAogICAgICBub3J0aExvbmdpdHVkZU9mZnNldCwKICAgICAgbm9ydGhMYXRpdHVkZU9mZnNldAogICAgKTsKICAgIFRlcnJhaW5Qcm92aWRlcl9kZWZhdWx0LmFkZFNraXJ0SW5kaWNlcygKICAgICAgd2VzdEluZGljZXNTb3V0aFRvTm9ydGgsCiAgICAgIHNvdXRoSW5kaWNlc0Vhc3RUb1dlc3QsCiAgICAgIGVhc3RJbmRpY2VzTm9ydGhUb1NvdXRoLAogICAgICBub3J0aEluZGljZXNXZXN0VG9FYXN0LAogICAgICBxdWFudGl6ZWRWZXJ0ZXhDb3VudCwKICAgICAgaW5kZXhCdWZmZXIsCiAgICAgIHBhcmFtZXRlcnMuaW5kaWNlcy5sZW5ndGgKICAgICk7CiAgICB0cmFuc2ZlcmFibGVPYmplY3RzLnB1c2godmVydGV4QnVmZmVyLmJ1ZmZlciwgaW5kZXhCdWZmZXIuYnVmZmVyKTsKICAgIHJldHVybiB7CiAgICAgIHZlcnRpY2VzOiB2ZXJ0ZXhCdWZmZXIuYnVmZmVyLAogICAgICBpbmRpY2VzOiBpbmRleEJ1ZmZlci5idWZmZXIsCiAgICAgIHdlc3RJbmRpY2VzU291dGhUb05vcnRoLAogICAgICBzb3V0aEluZGljZXNFYXN0VG9XZXN0LAogICAgICBlYXN0SW5kaWNlc05vcnRoVG9Tb3V0aCwKICAgICAgbm9ydGhJbmRpY2VzV2VzdFRvRWFzdCwKICAgICAgdmVydGV4U3RyaWRlLAogICAgICBjZW50ZXIsCiAgICAgIG1pbmltdW1IZWlnaHQsCiAgICAgIG1heGltdW1IZWlnaHQsCiAgICAgIG9jY2x1ZGVlUG9pbnRJblNjYWxlZFNwYWNlLAogICAgICBlbmNvZGluZywKICAgICAgaW5kZXhDb3VudFdpdGhvdXRTa2lydHM6IHBhcmFtZXRlcnMuaW5kaWNlcy5sZW5ndGgKICAgIH07CiAgfQogIGZ1bmN0aW9uIGZpbmRNaW5NYXhTa2lydHMoZWRnZUluZGljZXMsIGVkZ2VIZWlnaHQsIGhlaWdodHMsIHV2cywgcmVjdGFuZ2xlLCBlbGxpcHNvaWQsIHRvRU5VLCBtaW5pbXVtLCBtYXhpbXVtKSB7CiAgICBsZXQgaE1pbiA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgIGNvbnN0IG5vcnRoID0gcmVjdGFuZ2xlLm5vcnRoOwogICAgY29uc3Qgc291dGggPSByZWN0YW5nbGUuc291dGg7CiAgICBsZXQgZWFzdCA9IHJlY3RhbmdsZS5lYXN0OwogICAgY29uc3Qgd2VzdCA9IHJlY3RhbmdsZS53ZXN0OwogICAgaWYgKGVhc3QgPCB3ZXN0KSB7CiAgICAgIGVhc3QgKz0gTWF0aF9kZWZhdWx0LlRXT19QSTsKICAgIH0KICAgIGNvbnN0IGxlbmd0aCA9IGVkZ2VJbmRpY2VzLmxlbmd0aDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgY29uc3QgaW5kZXggPSBlZGdlSW5kaWNlc1tpXTsKICAgICAgY29uc3QgaCA9IGhlaWdodHNbaW5kZXhdOwogICAgICBjb25zdCB1diA9IHV2c1tpbmRleF07CiAgICAgIGNhcnRvZ3JhcGhpY1NjcmF0Y2gubG9uZ2l0dWRlID0gTWF0aF9kZWZhdWx0LmxlcnAod2VzdCwgZWFzdCwgdXYueCk7CiAgICAgIGNhcnRvZ3JhcGhpY1NjcmF0Y2gubGF0aXR1ZGUgPSBNYXRoX2RlZmF1bHQubGVycChzb3V0aCwgbm9ydGgsIHV2LnkpOwogICAgICBjYXJ0b2dyYXBoaWNTY3JhdGNoLmhlaWdodCA9IGggLSBlZGdlSGVpZ2h0OwogICAgICBjb25zdCBwb3NpdGlvbiA9IGVsbGlwc29pZC5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbigKICAgICAgICBjYXJ0b2dyYXBoaWNTY3JhdGNoLAogICAgICAgIGNhcnRlc2lhbjNTY3JhdGNoOAogICAgICApOwogICAgICBNYXRyaXg0X2RlZmF1bHQubXVsdGlwbHlCeVBvaW50KHRvRU5VLCBwb3NpdGlvbiwgcG9zaXRpb24pOwogICAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubWluaW11bUJ5Q29tcG9uZW50KHBvc2l0aW9uLCBtaW5pbXVtLCBtaW5pbXVtKTsKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0Lm1heGltdW1CeUNvbXBvbmVudChwb3NpdGlvbiwgbWF4aW11bSwgbWF4aW11bSk7CiAgICAgIGhNaW4gPSBNYXRoLm1pbihoTWluLCBjYXJ0b2dyYXBoaWNTY3JhdGNoLmhlaWdodCk7CiAgICB9CiAgICByZXR1cm4gaE1pbjsKICB9CiAgZnVuY3Rpb24gYWRkU2tpcnQyKHZlcnRleEJ1ZmZlciwgdmVydGV4QnVmZmVySW5kZXgsIGVkZ2VWZXJ0aWNlcywgZW5jb2RpbmcsIGhlaWdodHMsIHV2cywgb2N0RW5jb2RlZE5vcm1hbHMsIGVsbGlwc29pZCwgcmVjdGFuZ2xlLCBza2lydExlbmd0aCwgc291dGhNZXJjYXRvclksIG9uZU92ZXJNZXJjYXRvckhlaWdodCwgbG9uZ2l0dWRlT2Zmc2V0LCBsYXRpdHVkZU9mZnNldCkgewogICAgY29uc3QgaGFzVmVydGV4Tm9ybWFscyA9IGRlZmluZWRfZGVmYXVsdChvY3RFbmNvZGVkTm9ybWFscyk7CiAgICBjb25zdCBub3J0aCA9IHJlY3RhbmdsZS5ub3J0aDsKICAgIGNvbnN0IHNvdXRoID0gcmVjdGFuZ2xlLnNvdXRoOwogICAgbGV0IGVhc3QgPSByZWN0YW5nbGUuZWFzdDsKICAgIGNvbnN0IHdlc3QgPSByZWN0YW5nbGUud2VzdDsKICAgIGlmIChlYXN0IDwgd2VzdCkgewogICAgICBlYXN0ICs9IE1hdGhfZGVmYXVsdC5UV09fUEk7CiAgICB9CiAgICBjb25zdCBsZW5ndGggPSBlZGdlVmVydGljZXMubGVuZ3RoOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBjb25zdCBpbmRleCA9IGVkZ2VWZXJ0aWNlc1tpXTsKICAgICAgY29uc3QgaCA9IGhlaWdodHNbaW5kZXhdOwogICAgICBjb25zdCB1diA9IHV2c1tpbmRleF07CiAgICAgIGNhcnRvZ3JhcGhpY1NjcmF0Y2gubG9uZ2l0dWRlID0gTWF0aF9kZWZhdWx0LmxlcnAod2VzdCwgZWFzdCwgdXYueCkgKyBsb25naXR1ZGVPZmZzZXQ7CiAgICAgIGNhcnRvZ3JhcGhpY1NjcmF0Y2gubGF0aXR1ZGUgPSBNYXRoX2RlZmF1bHQubGVycChzb3V0aCwgbm9ydGgsIHV2LnkpICsgbGF0aXR1ZGVPZmZzZXQ7CiAgICAgIGNhcnRvZ3JhcGhpY1NjcmF0Y2guaGVpZ2h0ID0gaCAtIHNraXJ0TGVuZ3RoOwogICAgICBjb25zdCBwb3NpdGlvbiA9IGVsbGlwc29pZC5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbigKICAgICAgICBjYXJ0b2dyYXBoaWNTY3JhdGNoLAogICAgICAgIGNhcnRlc2lhbjNTY3JhdGNoOAogICAgICApOwogICAgICBpZiAoaGFzVmVydGV4Tm9ybWFscykgewogICAgICAgIGNvbnN0IG4gPSBpbmRleCAqIDI7CiAgICAgICAgdG9QYWNrLnggPSBvY3RFbmNvZGVkTm9ybWFsc1tuXTsKICAgICAgICB0b1BhY2sueSA9IG9jdEVuY29kZWROb3JtYWxzW24gKyAxXTsKICAgICAgfQogICAgICBsZXQgd2ViTWVyY2F0b3JUOwogICAgICBpZiAoZW5jb2RpbmcuaGFzV2ViTWVyY2F0b3JUKSB7CiAgICAgICAgd2ViTWVyY2F0b3JUID0gKFdlYk1lcmNhdG9yUHJvamVjdGlvbl9kZWZhdWx0Lmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGUoCiAgICAgICAgICBjYXJ0b2dyYXBoaWNTY3JhdGNoLmxhdGl0dWRlCiAgICAgICAgKSAtIHNvdXRoTWVyY2F0b3JZKSAqIG9uZU92ZXJNZXJjYXRvckhlaWdodDsKICAgICAgfQogICAgICBsZXQgZ2VvZGV0aWNTdXJmYWNlTm9ybWFsOwogICAgICBpZiAoZW5jb2RpbmcuaGFzR2VvZGV0aWNTdXJmYWNlTm9ybWFscykgewogICAgICAgIGdlb2RldGljU3VyZmFjZU5vcm1hbCA9IGVsbGlwc29pZC5nZW9kZXRpY1N1cmZhY2VOb3JtYWwocG9zaXRpb24pOwogICAgICB9CiAgICAgIHZlcnRleEJ1ZmZlckluZGV4ID0gZW5jb2RpbmcuZW5jb2RlKAogICAgICAgIHZlcnRleEJ1ZmZlciwKICAgICAgICB2ZXJ0ZXhCdWZmZXJJbmRleCwKICAgICAgICBwb3NpdGlvbiwKICAgICAgICB1diwKICAgICAgICBjYXJ0b2dyYXBoaWNTY3JhdGNoLmhlaWdodCwKICAgICAgICB0b1BhY2ssCiAgICAgICAgd2ViTWVyY2F0b3JULAogICAgICAgIGdlb2RldGljU3VyZmFjZU5vcm1hbAogICAgICApOwogICAgfQogIH0KICBmdW5jdGlvbiBjb3B5QW5kU29ydCh0eXBlZEFycmF5LCBjb21wYXJhdG9yKSB7CiAgICBsZXQgY29weTsKICAgIGlmICh0eXBlb2YgdHlwZWRBcnJheS5zbGljZSA9PT0gImZ1bmN0aW9uIikgewogICAgICBjb3B5ID0gdHlwZWRBcnJheS5zbGljZSgpOwogICAgICBpZiAodHlwZW9mIGNvcHkuc29ydCAhPT0gImZ1bmN0aW9uIikgewogICAgICAgIGNvcHkgPSB2b2lkIDA7CiAgICAgIH0KICAgIH0KICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGNvcHkpKSB7CiAgICAgIGNvcHkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0eXBlZEFycmF5KTsKICAgIH0KICAgIGNvcHkuc29ydChjb21wYXJhdG9yKTsKICAgIHJldHVybiBjb3B5OwogIH0KICB2YXIgbWF4U2hvcnQ0LCBjYXJ0ZXNpYW4zU2NyYXRjaDgsIHNjcmF0Y2hNaW5pbXVtLCBzY3JhdGNoTWF4aW11bSwgY2FydG9ncmFwaGljU2NyYXRjaCwgdG9QYWNrLCBjcmVhdGVWZXJ0aWNlc0Zyb21RdWFudGl6ZWRUZXJyYWluTWVzaF9kZWZhdWx0OwogIHZhciBpbml0X2NyZWF0ZVZlcnRpY2VzRnJvbVF1YW50aXplZFRlcnJhaW5NZXNoID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVWZXJ0aWNlc0Zyb21RdWFudGl6ZWRUZXJyYWluTWVzaC5qcyIoKSB7CiAgICAgIGluaXRfQXhpc0FsaWduZWRCb3VuZGluZ0JveCgpOwogICAgICBpbml0X0NhcnRlc2lhbjIoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ2FydG9ncmFwaGljKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X0VsbGlwc29pZGFsT2NjbHVkZXIoKTsKICAgICAgaW5pdF9JbmRleERhdGF0eXBlKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBpbml0X01hdHJpeDQoKTsKICAgICAgaW5pdF9SZWN0YW5nbGUoKTsKICAgICAgaW5pdF9UZXJyYWluRW5jb2RpbmcoKTsKICAgICAgaW5pdF9UZXJyYWluUHJvdmlkZXIoKTsKICAgICAgaW5pdF9UcmFuc2Zvcm1zKCk7CiAgICAgIGluaXRfV2ViTWVyY2F0b3JQcm9qZWN0aW9uKCk7CiAgICAgIGluaXRfY3JlYXRlVGFza1Byb2Nlc3NvcldvcmtlcigpOwogICAgICBtYXhTaG9ydDQgPSAzMjc2NzsKICAgICAgY2FydGVzaWFuM1NjcmF0Y2g4ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoTWluaW11bSA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaE1heGltdW0gPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGNhcnRvZ3JhcGhpY1NjcmF0Y2ggPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgdG9QYWNrID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICBjcmVhdGVWZXJ0aWNlc0Zyb21RdWFudGl6ZWRUZXJyYWluTWVzaF9kZWZhdWx0ID0gY3JlYXRlVGFza1Byb2Nlc3Nvcldvcmtlcl9kZWZhdWx0KAogICAgICAgIGNyZWF0ZVZlcnRpY2VzRnJvbVF1YW50aXplZFRlcnJhaW5NZXNoCiAgICAgICk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9XYWxsR2VvbWV0cnlMaWJyYXJ5LmpzCiAgZnVuY3Rpb24gbGF0TG9uRXF1YWxzKGMwLCBjMSkgewogICAgcmV0dXJuIE1hdGhfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKGMwLmxhdGl0dWRlLCBjMS5sYXRpdHVkZSwgTWF0aF9kZWZhdWx0LkVQU0lMT04xMCkgJiYgTWF0aF9kZWZhdWx0LmVxdWFsc0Vwc2lsb24oYzAubG9uZ2l0dWRlLCBjMS5sb25naXR1ZGUsIE1hdGhfZGVmYXVsdC5FUFNJTE9OMTApOwogIH0KICBmdW5jdGlvbiByZW1vdmVEdXBsaWNhdGVzMihlbGxpcHNvaWQsIHBvc2l0aW9ucywgdG9wSGVpZ2h0cywgYm90dG9tSGVpZ2h0cykgewogICAgcG9zaXRpb25zID0gYXJyYXlSZW1vdmVEdXBsaWNhdGVzX2RlZmF1bHQocG9zaXRpb25zLCBDYXJ0ZXNpYW4zX2RlZmF1bHQuZXF1YWxzRXBzaWxvbik7CiAgICBjb25zdCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgaWYgKGxlbmd0aCA8IDIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgaGFzQm90dG9tSGVpZ2h0cyA9IGRlZmluZWRfZGVmYXVsdChib3R0b21IZWlnaHRzKTsKICAgIGNvbnN0IGhhc1RvcEhlaWdodHMgPSBkZWZpbmVkX2RlZmF1bHQodG9wSGVpZ2h0cyk7CiAgICBjb25zdCBjbGVhbmVkUG9zaXRpb25zID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICBjb25zdCBjbGVhbmVkVG9wSGVpZ2h0cyA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgY29uc3QgY2xlYW5lZEJvdHRvbUhlaWdodHMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKICAgIGNvbnN0IHYwMiA9IHBvc2l0aW9uc1swXTsKICAgIGNsZWFuZWRQb3NpdGlvbnNbMF0gPSB2MDI7CiAgICBjb25zdCBjMCA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh2MDIsIHNjcmF0Y2hDYXJ0b2dyYXBoaWMxMyk7CiAgICBpZiAoaGFzVG9wSGVpZ2h0cykgewogICAgICBjMC5oZWlnaHQgPSB0b3BIZWlnaHRzWzBdOwogICAgfQogICAgY2xlYW5lZFRvcEhlaWdodHNbMF0gPSBjMC5oZWlnaHQ7CiAgICBpZiAoaGFzQm90dG9tSGVpZ2h0cykgewogICAgICBjbGVhbmVkQm90dG9tSGVpZ2h0c1swXSA9IGJvdHRvbUhlaWdodHNbMF07CiAgICB9IGVsc2UgewogICAgICBjbGVhbmVkQm90dG9tSGVpZ2h0c1swXSA9IDA7CiAgICB9CiAgICBjb25zdCBzdGFydFRvcEhlaWdodCA9IGNsZWFuZWRUb3BIZWlnaHRzWzBdOwogICAgY29uc3Qgc3RhcnRCb3R0b21IZWlnaHQgPSBjbGVhbmVkQm90dG9tSGVpZ2h0c1swXTsKICAgIGxldCBoYXNBbGxTYW1lSGVpZ2h0cyA9IHN0YXJ0VG9wSGVpZ2h0ID09PSBzdGFydEJvdHRvbUhlaWdodDsKICAgIGxldCBpbmRleCA9IDE7CiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIGNvbnN0IHYxMiA9IHBvc2l0aW9uc1tpXTsKICAgICAgY29uc3QgYzEgPSBlbGxpcHNvaWQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWModjEyLCBzY3JhdGNoQ2FydG9ncmFwaGljMjMpOwogICAgICBpZiAoaGFzVG9wSGVpZ2h0cykgewogICAgICAgIGMxLmhlaWdodCA9IHRvcEhlaWdodHNbaV07CiAgICAgIH0KICAgICAgaGFzQWxsU2FtZUhlaWdodHMgPSBoYXNBbGxTYW1lSGVpZ2h0cyAmJiBjMS5oZWlnaHQgPT09IDA7CiAgICAgIGlmICghbGF0TG9uRXF1YWxzKGMwLCBjMSkpIHsKICAgICAgICBjbGVhbmVkUG9zaXRpb25zW2luZGV4XSA9IHYxMjsKICAgICAgICBjbGVhbmVkVG9wSGVpZ2h0c1tpbmRleF0gPSBjMS5oZWlnaHQ7CiAgICAgICAgaWYgKGhhc0JvdHRvbUhlaWdodHMpIHsKICAgICAgICAgIGNsZWFuZWRCb3R0b21IZWlnaHRzW2luZGV4XSA9IGJvdHRvbUhlaWdodHNbaV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNsZWFuZWRCb3R0b21IZWlnaHRzW2luZGV4XSA9IDA7CiAgICAgICAgfQogICAgICAgIGhhc0FsbFNhbWVIZWlnaHRzID0gaGFzQWxsU2FtZUhlaWdodHMgJiYgY2xlYW5lZFRvcEhlaWdodHNbaW5kZXhdID09PSBjbGVhbmVkQm90dG9tSGVpZ2h0c1tpbmRleF07CiAgICAgICAgQ2FydG9ncmFwaGljX2RlZmF1bHQuY2xvbmUoYzEsIGMwKTsKICAgICAgICArK2luZGV4OwogICAgICB9IGVsc2UgaWYgKGMwLmhlaWdodCA8IGMxLmhlaWdodCkgewogICAgICAgIGNsZWFuZWRUb3BIZWlnaHRzW2luZGV4IC0gMV0gPSBjMS5oZWlnaHQ7CiAgICAgIH0KICAgIH0KICAgIGlmIChoYXNBbGxTYW1lSGVpZ2h0cyB8fCBpbmRleCA8IDIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY2xlYW5lZFBvc2l0aW9ucy5sZW5ndGggPSBpbmRleDsKICAgIGNsZWFuZWRUb3BIZWlnaHRzLmxlbmd0aCA9IGluZGV4OwogICAgY2xlYW5lZEJvdHRvbUhlaWdodHMubGVuZ3RoID0gaW5kZXg7CiAgICByZXR1cm4gewogICAgICBwb3NpdGlvbnM6IGNsZWFuZWRQb3NpdGlvbnMsCiAgICAgIHRvcEhlaWdodHM6IGNsZWFuZWRUb3BIZWlnaHRzLAogICAgICBib3R0b21IZWlnaHRzOiBjbGVhbmVkQm90dG9tSGVpZ2h0cwogICAgfTsKICB9CiAgdmFyIFdhbGxHZW9tZXRyeUxpYnJhcnksIHNjcmF0Y2hDYXJ0b2dyYXBoaWMxMywgc2NyYXRjaENhcnRvZ3JhcGhpYzIzLCBwb3NpdGlvbnNBcnJheVNjcmF0Y2gsIGhlaWdodHNBcnJheVNjcmF0Y2gsIGdlbmVyYXRlQXJjT3B0aW9uc1NjcmF0Y2gyLCBXYWxsR2VvbWV0cnlMaWJyYXJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfV2FsbEdlb21ldHJ5TGlicmFyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvV2FsbEdlb21ldHJ5TGlicmFyeS5qcyIoKSB7CiAgICAgIGluaXRfYXJyYXlSZW1vdmVEdXBsaWNhdGVzKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRvZ3JhcGhpYygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGluaXRfUG9seWxpbmVQaXBlbGluZSgpOwogICAgICBXYWxsR2VvbWV0cnlMaWJyYXJ5ID0ge307CiAgICAgIHNjcmF0Y2hDYXJ0b2dyYXBoaWMxMyA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydG9ncmFwaGljMjMgPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgcG9zaXRpb25zQXJyYXlTY3JhdGNoID0gbmV3IEFycmF5KDIpOwogICAgICBoZWlnaHRzQXJyYXlTY3JhdGNoID0gbmV3IEFycmF5KDIpOwogICAgICBnZW5lcmF0ZUFyY09wdGlvbnNTY3JhdGNoMiA9IHsKICAgICAgICBwb3NpdGlvbnM6IHZvaWQgMCwKICAgICAgICBoZWlnaHQ6IHZvaWQgMCwKICAgICAgICBncmFudWxhcml0eTogdm9pZCAwLAogICAgICAgIGVsbGlwc29pZDogdm9pZCAwCiAgICAgIH07CiAgICAgIFdhbGxHZW9tZXRyeUxpYnJhcnkuY29tcHV0ZVBvc2l0aW9ucyA9IGZ1bmN0aW9uKGVsbGlwc29pZCwgd2FsbFBvc2l0aW9ucywgbWF4aW11bUhlaWdodHMsIG1pbmltdW1IZWlnaHRzLCBncmFudWxhcml0eSwgZHVwbGljYXRlQ29ybmVycykgewogICAgICAgIGNvbnN0IG8gPSByZW1vdmVEdXBsaWNhdGVzMigKICAgICAgICAgIGVsbGlwc29pZCwKICAgICAgICAgIHdhbGxQb3NpdGlvbnMsCiAgICAgICAgICBtYXhpbXVtSGVpZ2h0cywKICAgICAgICAgIG1pbmltdW1IZWlnaHRzCiAgICAgICAgKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChvKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB3YWxsUG9zaXRpb25zID0gby5wb3NpdGlvbnM7CiAgICAgICAgbWF4aW11bUhlaWdodHMgPSBvLnRvcEhlaWdodHM7CiAgICAgICAgbWluaW11bUhlaWdodHMgPSBvLmJvdHRvbUhlaWdodHM7CiAgICAgICAgY29uc3QgbGVuZ3RoID0gd2FsbFBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgY29uc3QgbnVtQ29ybmVycyA9IGxlbmd0aCAtIDI7CiAgICAgICAgbGV0IHRvcFBvc2l0aW9uczsKICAgICAgICBsZXQgYm90dG9tUG9zaXRpb25zOwogICAgICAgIGNvbnN0IG1pbkRpc3RhbmNlID0gTWF0aF9kZWZhdWx0LmNob3JkTGVuZ3RoKAogICAgICAgICAgZ3JhbnVsYXJpdHksCiAgICAgICAgICBlbGxpcHNvaWQubWF4aW11bVJhZGl1cwogICAgICAgICk7CiAgICAgICAgY29uc3QgZ2VuZXJhdGVBcmNPcHRpb25zID0gZ2VuZXJhdGVBcmNPcHRpb25zU2NyYXRjaDI7CiAgICAgICAgZ2VuZXJhdGVBcmNPcHRpb25zLm1pbkRpc3RhbmNlID0gbWluRGlzdGFuY2U7CiAgICAgICAgZ2VuZXJhdGVBcmNPcHRpb25zLmVsbGlwc29pZCA9IGVsbGlwc29pZDsKICAgICAgICBpZiAoZHVwbGljYXRlQ29ybmVycykgewogICAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICAgIGxldCBpOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgICBjb3VudCArPSBQb2x5bGluZVBpcGVsaW5lX2RlZmF1bHQubnVtYmVyT2ZQb2ludHMoCiAgICAgICAgICAgICAgd2FsbFBvc2l0aW9uc1tpXSwKICAgICAgICAgICAgICB3YWxsUG9zaXRpb25zW2kgKyAxXSwKICAgICAgICAgICAgICBtaW5EaXN0YW5jZQogICAgICAgICAgICApICsgMTsKICAgICAgICAgIH0KICAgICAgICAgIHRvcFBvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkoY291bnQgKiAzKTsKICAgICAgICAgIGJvdHRvbVBvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkoY291bnQgKiAzKTsKICAgICAgICAgIGNvbnN0IGdlbmVyYXRlQXJjUG9zaXRpb25zID0gcG9zaXRpb25zQXJyYXlTY3JhdGNoOwogICAgICAgICAgY29uc3QgZ2VuZXJhdGVBcmNIZWlnaHRzID0gaGVpZ2h0c0FycmF5U2NyYXRjaDsKICAgICAgICAgIGdlbmVyYXRlQXJjT3B0aW9ucy5wb3NpdGlvbnMgPSBnZW5lcmF0ZUFyY1Bvc2l0aW9uczsKICAgICAgICAgIGdlbmVyYXRlQXJjT3B0aW9ucy5oZWlnaHQgPSBnZW5lcmF0ZUFyY0hlaWdodHM7CiAgICAgICAgICBsZXQgb2Zmc2V0ID0gMDsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggLSAxOyBpKyspIHsKICAgICAgICAgICAgZ2VuZXJhdGVBcmNQb3NpdGlvbnNbMF0gPSB3YWxsUG9zaXRpb25zW2ldOwogICAgICAgICAgICBnZW5lcmF0ZUFyY1Bvc2l0aW9uc1sxXSA9IHdhbGxQb3NpdGlvbnNbaSArIDFdOwogICAgICAgICAgICBnZW5lcmF0ZUFyY0hlaWdodHNbMF0gPSBtYXhpbXVtSGVpZ2h0c1tpXTsKICAgICAgICAgICAgZ2VuZXJhdGVBcmNIZWlnaHRzWzFdID0gbWF4aW11bUhlaWdodHNbaSArIDFdOwogICAgICAgICAgICBjb25zdCBwb3MgPSBQb2x5bGluZVBpcGVsaW5lX2RlZmF1bHQuZ2VuZXJhdGVBcmMoZ2VuZXJhdGVBcmNPcHRpb25zKTsKICAgICAgICAgICAgdG9wUG9zaXRpb25zLnNldChwb3MsIG9mZnNldCk7CiAgICAgICAgICAgIGdlbmVyYXRlQXJjSGVpZ2h0c1swXSA9IG1pbmltdW1IZWlnaHRzW2ldOwogICAgICAgICAgICBnZW5lcmF0ZUFyY0hlaWdodHNbMV0gPSBtaW5pbXVtSGVpZ2h0c1tpICsgMV07CiAgICAgICAgICAgIGJvdHRvbVBvc2l0aW9ucy5zZXQoCiAgICAgICAgICAgICAgUG9seWxpbmVQaXBlbGluZV9kZWZhdWx0LmdlbmVyYXRlQXJjKGdlbmVyYXRlQXJjT3B0aW9ucyksCiAgICAgICAgICAgICAgb2Zmc2V0CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG9mZnNldCArPSBwb3MubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBnZW5lcmF0ZUFyY09wdGlvbnMucG9zaXRpb25zID0gd2FsbFBvc2l0aW9uczsKICAgICAgICAgIGdlbmVyYXRlQXJjT3B0aW9ucy5oZWlnaHQgPSBtYXhpbXVtSGVpZ2h0czsKICAgICAgICAgIHRvcFBvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkoCiAgICAgICAgICAgIFBvbHlsaW5lUGlwZWxpbmVfZGVmYXVsdC5nZW5lcmF0ZUFyYyhnZW5lcmF0ZUFyY09wdGlvbnMpCiAgICAgICAgICApOwogICAgICAgICAgZ2VuZXJhdGVBcmNPcHRpb25zLmhlaWdodCA9IG1pbmltdW1IZWlnaHRzOwogICAgICAgICAgYm90dG9tUG9zaXRpb25zID0gbmV3IEZsb2F0NjRBcnJheSgKICAgICAgICAgICAgUG9seWxpbmVQaXBlbGluZV9kZWZhdWx0LmdlbmVyYXRlQXJjKGdlbmVyYXRlQXJjT3B0aW9ucykKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICBib3R0b21Qb3NpdGlvbnMsCiAgICAgICAgICB0b3BQb3NpdGlvbnMsCiAgICAgICAgICBudW1Db3JuZXJzCiAgICAgICAgfTsKICAgICAgfTsKICAgICAgV2FsbEdlb21ldHJ5TGlicmFyeV9kZWZhdWx0ID0gV2FsbEdlb21ldHJ5TGlicmFyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1dhbGxHZW9tZXRyeS5qcwogIGZ1bmN0aW9uIFdhbGxHZW9tZXRyeShvcHRpb25zKSB7CiAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICBjb25zdCB3YWxsUG9zaXRpb25zID0gb3B0aW9ucy5wb3NpdGlvbnM7CiAgICBjb25zdCBtYXhpbXVtSGVpZ2h0cyA9IG9wdGlvbnMubWF4aW11bUhlaWdodHM7CiAgICBjb25zdCBtaW5pbXVtSGVpZ2h0cyA9IG9wdGlvbnMubWluaW11bUhlaWdodHM7CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh3YWxsUG9zaXRpb25zKSkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgib3B0aW9ucy5wb3NpdGlvbnMgaXMgcmVxdWlyZWQuIik7CiAgICB9CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG1heGltdW1IZWlnaHRzKSAmJiBtYXhpbXVtSGVpZ2h0cy5sZW5ndGggIT09IHdhbGxQb3NpdGlvbnMubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICJvcHRpb25zLnBvc2l0aW9ucyBhbmQgb3B0aW9ucy5tYXhpbXVtSGVpZ2h0cyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoLiIKICAgICAgKTsKICAgIH0KICAgIGlmIChkZWZpbmVkX2RlZmF1bHQobWluaW11bUhlaWdodHMpICYmIG1pbmltdW1IZWlnaHRzLmxlbmd0aCAhPT0gd2FsbFBvc2l0aW9ucy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgIm9wdGlvbnMucG9zaXRpb25zIGFuZCBvcHRpb25zLm1pbmltdW1IZWlnaHRzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGguIgogICAgICApOwogICAgfQogICAgY29uc3QgdmVydGV4Rm9ybWF0ID0gb3B0aW9ucy52ZXJ0ZXhGb3JtYXQgPz8gVmVydGV4Rm9ybWF0X2RlZmF1bHQuREVGQVVMVDsKICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gb3B0aW9ucy5ncmFudWxhcml0eSA/PyBNYXRoX2RlZmF1bHQuUkFESUFOU19QRVJfREVHUkVFOwogICAgY29uc3QgZWxsaXBzb2lkID0gb3B0aW9ucy5lbGxpcHNvaWQgPz8gRWxsaXBzb2lkX2RlZmF1bHQuZGVmYXVsdDsKICAgIHRoaXMuX3Bvc2l0aW9ucyA9IHdhbGxQb3NpdGlvbnM7CiAgICB0aGlzLl9taW5pbXVtSGVpZ2h0cyA9IG1pbmltdW1IZWlnaHRzOwogICAgdGhpcy5fbWF4aW11bUhlaWdodHMgPSBtYXhpbXVtSGVpZ2h0czsKICAgIHRoaXMuX3ZlcnRleEZvcm1hdCA9IFZlcnRleEZvcm1hdF9kZWZhdWx0LmNsb25lKHZlcnRleEZvcm1hdCk7CiAgICB0aGlzLl9ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwogICAgdGhpcy5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUoZWxsaXBzb2lkKTsKICAgIHRoaXMuX3dvcmtlck5hbWUgPSAiY3JlYXRlV2FsbEdlb21ldHJ5IjsKICAgIGxldCBudW1Db21wb25lbnRzID0gMSArIHdhbGxQb3NpdGlvbnMubGVuZ3RoICogQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aCArIDI7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG1pbmltdW1IZWlnaHRzKSkgewogICAgICBudW1Db21wb25lbnRzICs9IG1pbmltdW1IZWlnaHRzLmxlbmd0aDsKICAgIH0KICAgIGlmIChkZWZpbmVkX2RlZmF1bHQobWF4aW11bUhlaWdodHMpKSB7CiAgICAgIG51bUNvbXBvbmVudHMgKz0gbWF4aW11bUhlaWdodHMubGVuZ3RoOwogICAgfQogICAgdGhpcy5wYWNrZWRMZW5ndGggPSBudW1Db21wb25lbnRzICsgRWxsaXBzb2lkX2RlZmF1bHQucGFja2VkTGVuZ3RoICsgVmVydGV4Rm9ybWF0X2RlZmF1bHQucGFja2VkTGVuZ3RoICsgMTsKICB9CiAgdmFyIHNjcmF0Y2hDYXJ0ZXNpYW4zUG9zaXRpb24xLCBzY3JhdGNoQ2FydGVzaWFuM1Bvc2l0aW9uMiwgc2NyYXRjaENhcnRlc2lhbjNQb3NpdGlvbjQsIHNjcmF0Y2hDYXJ0ZXNpYW4zUG9zaXRpb241LCBzY3JhdGNoQml0YW5nZW50NSwgc2NyYXRjaFRhbmdlbnQ1LCBzY3JhdGNoTm9ybWFsOCwgc2NyYXRjaEVsbGlwc29pZDE3LCBzY3JhdGNoVmVydGV4Rm9ybWF0MTMsIHNjcmF0Y2hPcHRpb25zMjMsIFdhbGxHZW9tZXRyeV9kZWZhdWx0OwogIHZhciBpbml0X1dhbGxHZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvV2FsbEdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9Cb3VuZGluZ1NwaGVyZSgpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9Db21wb25lbnREYXRhdHlwZSgpOwogICAgICBpbml0X0Zyb3plbigpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X0dlb21ldHJ5KCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGUoKTsKICAgICAgaW5pdF9HZW9tZXRyeUF0dHJpYnV0ZXMoKTsKICAgICAgaW5pdF9JbmRleERhdGF0eXBlKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBpbml0X1ByaW1pdGl2ZVR5cGUoKTsKICAgICAgaW5pdF9WZXJ0ZXhGb3JtYXQoKTsKICAgICAgaW5pdF9XYWxsR2VvbWV0cnlMaWJyYXJ5KCk7CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zUG9zaXRpb24xID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQ2FydGVzaWFuM1Bvc2l0aW9uMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaENhcnRlc2lhbjNQb3NpdGlvbjQgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zUG9zaXRpb241ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoQml0YW5nZW50NSA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaFRhbmdlbnQ1ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBzY3JhdGNoTm9ybWFsOCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgV2FsbEdlb21ldHJ5LnBhY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh2YWx1ZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJ2YWx1ZSBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhcnJheSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhcnJheSBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGxldCBpOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHZhbHVlLl9wb3NpdGlvbnM7CiAgICAgICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IGxlbmd0aDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2ksIHN0YXJ0aW5nSW5kZXggKz0gQ2FydGVzaWFuM19kZWZhdWx0LnBhY2tlZExlbmd0aCkgewogICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2socG9zaXRpb25zW2ldLCBhcnJheSwgc3RhcnRpbmdJbmRleCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1pbmltdW1IZWlnaHRzID0gdmFsdWUuX21pbmltdW1IZWlnaHRzOwogICAgICAgIGxlbmd0aCA9IGRlZmluZWRfZGVmYXVsdChtaW5pbXVtSGVpZ2h0cykgPyBtaW5pbXVtSGVpZ2h0cy5sZW5ndGggOiAwOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSBsZW5ndGg7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChtaW5pbXVtSGVpZ2h0cykpIHsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gbWluaW11bUhlaWdodHNbaV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1heGltdW1IZWlnaHRzID0gdmFsdWUuX21heGltdW1IZWlnaHRzOwogICAgICAgIGxlbmd0aCA9IGRlZmluZWRfZGVmYXVsdChtYXhpbXVtSGVpZ2h0cykgPyBtYXhpbXVtSGVpZ2h0cy5sZW5ndGggOiAwOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSBsZW5ndGg7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChtYXhpbXVtSGVpZ2h0cykpIHsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gbWF4aW11bUhlaWdodHNbaV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIEVsbGlwc29pZF9kZWZhdWx0LnBhY2sodmFsdWUuX2VsbGlwc29pZCwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gRWxsaXBzb2lkX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIFZlcnRleEZvcm1hdF9kZWZhdWx0LnBhY2sodmFsdWUuX3ZlcnRleEZvcm1hdCwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gVmVydGV4Rm9ybWF0X2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXhdID0gdmFsdWUuX2dyYW51bGFyaXR5OwogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfTsKICAgICAgc2NyYXRjaEVsbGlwc29pZDE3ID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUoRWxsaXBzb2lkX2RlZmF1bHQuVU5JVF9TUEhFUkUpOwogICAgICBzY3JhdGNoVmVydGV4Rm9ybWF0MTMgPSBuZXcgVmVydGV4Rm9ybWF0X2RlZmF1bHQoKTsKICAgICAgc2NyYXRjaE9wdGlvbnMyMyA9IHsKICAgICAgICBwb3NpdGlvbnM6IHZvaWQgMCwKICAgICAgICBtaW5pbXVtSGVpZ2h0czogdm9pZCAwLAogICAgICAgIG1heGltdW1IZWlnaHRzOiB2b2lkIDAsCiAgICAgICAgZWxsaXBzb2lkOiBzY3JhdGNoRWxsaXBzb2lkMTcsCiAgICAgICAgdmVydGV4Rm9ybWF0OiBzY3JhdGNoVmVydGV4Rm9ybWF0MTMsCiAgICAgICAgZ3JhbnVsYXJpdHk6IHZvaWQgMAogICAgICB9OwogICAgICBXYWxsR2VvbWV0cnkudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFycmF5KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFycmF5IGlzIHJlcXVpcmVkIik7CiAgICAgICAgfQogICAgICAgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4ID8/IDA7CiAgICAgICAgbGV0IGk7CiAgICAgICAgbGV0IGxlbmd0aCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpLCBzdGFydGluZ0luZGV4ICs9IENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGgpIHsKICAgICAgICAgIHBvc2l0aW9uc1tpXSA9IENhcnRlc2lhbjNfZGVmYXVsdC51bnBhY2soYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGxldCBtaW5pbXVtSGVpZ2h0czsKICAgICAgICBpZiAobGVuZ3RoID4gMCkgewogICAgICAgICAgbWluaW11bUhlaWdodHMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgICBtaW5pbXVtSGVpZ2h0c1tpXSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxlbmd0aCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgbGV0IG1heGltdW1IZWlnaHRzOwogICAgICAgIGlmIChsZW5ndGggPiAwKSB7CiAgICAgICAgICBtYXhpbXVtSGVpZ2h0cyA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgIG1heGltdW1IZWlnaHRzW2ldID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQudW5wYWNrKGFycmF5LCBzdGFydGluZ0luZGV4LCBzY3JhdGNoRWxsaXBzb2lkMTcpOwogICAgICAgIHN0YXJ0aW5nSW5kZXggKz0gRWxsaXBzb2lkX2RlZmF1bHQucGFja2VkTGVuZ3RoOwogICAgICAgIGNvbnN0IHZlcnRleEZvcm1hdCA9IFZlcnRleEZvcm1hdF9kZWZhdWx0LnVucGFjaygKICAgICAgICAgIGFycmF5LAogICAgICAgICAgc3RhcnRpbmdJbmRleCwKICAgICAgICAgIHNjcmF0Y2hWZXJ0ZXhGb3JtYXQxMwogICAgICAgICk7CiAgICAgICAgc3RhcnRpbmdJbmRleCArPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5wYWNrZWRMZW5ndGg7CiAgICAgICAgY29uc3QgZ3JhbnVsYXJpdHkgPSBhcnJheVtzdGFydGluZ0luZGV4XTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICBzY3JhdGNoT3B0aW9uczIzLnBvc2l0aW9ucyA9IHBvc2l0aW9uczsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMjMubWluaW11bUhlaWdodHMgPSBtaW5pbXVtSGVpZ2h0czsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMjMubWF4aW11bUhlaWdodHMgPSBtYXhpbXVtSGVpZ2h0czsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMjMuZ3JhbnVsYXJpdHkgPSBncmFudWxhcml0eTsKICAgICAgICAgIHJldHVybiBuZXcgV2FsbEdlb21ldHJ5KHNjcmF0Y2hPcHRpb25zMjMpOwogICAgICAgIH0KICAgICAgICByZXN1bHQuX3Bvc2l0aW9ucyA9IHBvc2l0aW9uczsKICAgICAgICByZXN1bHQuX21pbmltdW1IZWlnaHRzID0gbWluaW11bUhlaWdodHM7CiAgICAgICAgcmVzdWx0Ll9tYXhpbXVtSGVpZ2h0cyA9IG1heGltdW1IZWlnaHRzOwogICAgICAgIHJlc3VsdC5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUoZWxsaXBzb2lkLCByZXN1bHQuX2VsbGlwc29pZCk7CiAgICAgICAgcmVzdWx0Ll92ZXJ0ZXhGb3JtYXQgPSBWZXJ0ZXhGb3JtYXRfZGVmYXVsdC5jbG9uZSh2ZXJ0ZXhGb3JtYXQsIHJlc3VsdC5fdmVydGV4Rm9ybWF0KTsKICAgICAgICByZXN1bHQuX2dyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgV2FsbEdlb21ldHJ5LmZyb21Db25zdGFudEhlaWdodHMgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgPz8gRnJvemVuX2RlZmF1bHQuRU1QVFlfT0JKRUNUOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IG9wdGlvbnMucG9zaXRpb25zOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHBvc2l0aW9ucykpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJvcHRpb25zLnBvc2l0aW9ucyBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgbGV0IG1pbkhlaWdodHM7CiAgICAgICAgbGV0IG1heEhlaWdodHM7CiAgICAgICAgY29uc3QgbWluMyA9IG9wdGlvbnMubWluaW11bUhlaWdodDsKICAgICAgICBjb25zdCBtYXgzID0gb3B0aW9ucy5tYXhpbXVtSGVpZ2h0OwogICAgICAgIGNvbnN0IGRvTWluID0gZGVmaW5lZF9kZWZhdWx0KG1pbjMpOwogICAgICAgIGNvbnN0IGRvTWF4ID0gZGVmaW5lZF9kZWZhdWx0KG1heDMpOwogICAgICAgIGlmIChkb01pbiB8fCBkb01heCkgewogICAgICAgICAgY29uc3QgbGVuZ3RoID0gcG9zaXRpb25zLmxlbmd0aDsKICAgICAgICAgIG1pbkhlaWdodHMgPSBkb01pbiA/IG5ldyBBcnJheShsZW5ndGgpIDogdm9pZCAwOwogICAgICAgICAgbWF4SGVpZ2h0cyA9IGRvTWF4ID8gbmV3IEFycmF5KGxlbmd0aCkgOiB2b2lkIDA7CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgIGlmIChkb01pbikgewogICAgICAgICAgICAgIG1pbkhlaWdodHNbaV0gPSBtaW4zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkb01heCkgewogICAgICAgICAgICAgIG1heEhlaWdodHNbaV0gPSBtYXgzOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IG5ld09wdGlvbnMgPSB7CiAgICAgICAgICBwb3NpdGlvbnMsCiAgICAgICAgICBtYXhpbXVtSGVpZ2h0czogbWF4SGVpZ2h0cywKICAgICAgICAgIG1pbmltdW1IZWlnaHRzOiBtaW5IZWlnaHRzLAogICAgICAgICAgZWxsaXBzb2lkOiBvcHRpb25zLmVsbGlwc29pZCwKICAgICAgICAgIHZlcnRleEZvcm1hdDogb3B0aW9ucy52ZXJ0ZXhGb3JtYXQKICAgICAgICB9OwogICAgICAgIHJldHVybiBuZXcgV2FsbEdlb21ldHJ5KG5ld09wdGlvbnMpOwogICAgICB9OwogICAgICBXYWxsR2VvbWV0cnkuY3JlYXRlR2VvbWV0cnkgPSBmdW5jdGlvbih3YWxsR2VvbWV0cnkpIHsKICAgICAgICBjb25zdCB3YWxsUG9zaXRpb25zID0gd2FsbEdlb21ldHJ5Ll9wb3NpdGlvbnM7CiAgICAgICAgY29uc3QgbWluaW11bUhlaWdodHMgPSB3YWxsR2VvbWV0cnkuX21pbmltdW1IZWlnaHRzOwogICAgICAgIGNvbnN0IG1heGltdW1IZWlnaHRzID0gd2FsbEdlb21ldHJ5Ll9tYXhpbXVtSGVpZ2h0czsKICAgICAgICBjb25zdCB2ZXJ0ZXhGb3JtYXQgPSB3YWxsR2VvbWV0cnkuX3ZlcnRleEZvcm1hdDsKICAgICAgICBjb25zdCBncmFudWxhcml0eSA9IHdhbGxHZW9tZXRyeS5fZ3JhbnVsYXJpdHk7CiAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gd2FsbEdlb21ldHJ5Ll9lbGxpcHNvaWQ7CiAgICAgICAgY29uc3QgcG9zID0gV2FsbEdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmNvbXB1dGVQb3NpdGlvbnMoCiAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICB3YWxsUG9zaXRpb25zLAogICAgICAgICAgbWF4aW11bUhlaWdodHMsCiAgICAgICAgICBtaW5pbXVtSGVpZ2h0cywKICAgICAgICAgIGdyYW51bGFyaXR5LAogICAgICAgICAgdHJ1ZQogICAgICAgICk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocG9zKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBib3R0b21Qb3NpdGlvbnMgPSBwb3MuYm90dG9tUG9zaXRpb25zOwogICAgICAgIGNvbnN0IHRvcFBvc2l0aW9ucyA9IHBvcy50b3BQb3NpdGlvbnM7CiAgICAgICAgY29uc3QgbnVtQ29ybmVycyA9IHBvcy5udW1Db3JuZXJzOwogICAgICAgIGxldCBsZW5ndGggPSB0b3BQb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGxldCBzaXplID0gbGVuZ3RoICogMjsKICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSB2ZXJ0ZXhGb3JtYXQucG9zaXRpb24gPyBuZXcgRmxvYXQ2NEFycmF5KHNpemUpIDogdm9pZCAwOwogICAgICAgIGNvbnN0IG5vcm1hbHMgPSB2ZXJ0ZXhGb3JtYXQubm9ybWFsID8gbmV3IEZsb2F0MzJBcnJheShzaXplKSA6IHZvaWQgMDsKICAgICAgICBjb25zdCB0YW5nZW50cyA9IHZlcnRleEZvcm1hdC50YW5nZW50ID8gbmV3IEZsb2F0MzJBcnJheShzaXplKSA6IHZvaWQgMDsKICAgICAgICBjb25zdCBiaXRhbmdlbnRzID0gdmVydGV4Rm9ybWF0LmJpdGFuZ2VudCA/IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSkgOiB2b2lkIDA7CiAgICAgICAgY29uc3QgdGV4dHVyZUNvb3JkaW5hdGVzID0gdmVydGV4Rm9ybWF0LnN0ID8gbmV3IEZsb2F0MzJBcnJheShzaXplIC8gMyAqIDIpIDogdm9pZCAwOwogICAgICAgIGxldCBwb3NpdGlvbkluZGV4ID0gMDsKICAgICAgICBsZXQgbm9ybWFsSW5kZXggPSAwOwogICAgICAgIGxldCBiaXRhbmdlbnRJbmRleCA9IDA7CiAgICAgICAgbGV0IHRhbmdlbnRJbmRleCA9IDA7CiAgICAgICAgbGV0IHN0SW5kZXggPSAwOwogICAgICAgIGxldCBub3JtYWwyID0gc2NyYXRjaE5vcm1hbDg7CiAgICAgICAgbGV0IHRhbmdlbnQgPSBzY3JhdGNoVGFuZ2VudDU7CiAgICAgICAgbGV0IGJpdGFuZ2VudCA9IHNjcmF0Y2hCaXRhbmdlbnQ1OwogICAgICAgIGxldCByZWNvbXB1dGVOb3JtYWwgPSB0cnVlOwogICAgICAgIGxlbmd0aCAvPSAzOwogICAgICAgIGxldCBpOwogICAgICAgIGxldCBzID0gMDsKICAgICAgICBjb25zdCBkcyA9IDEgLyAobGVuZ3RoIC0gbnVtQ29ybmVycyAtIDEpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgY29uc3QgaTMgPSBpICogMzsKICAgICAgICAgIGNvbnN0IHRvcFBvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheSgKICAgICAgICAgICAgdG9wUG9zaXRpb25zLAogICAgICAgICAgICBpMywKICAgICAgICAgICAgc2NyYXRjaENhcnRlc2lhbjNQb3NpdGlvbjEKICAgICAgICAgICk7CiAgICAgICAgICBjb25zdCBib3R0b21Qb3NpdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoCiAgICAgICAgICAgIGJvdHRvbVBvc2l0aW9ucywKICAgICAgICAgICAgaTMsCiAgICAgICAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zUG9zaXRpb24yCiAgICAgICAgICApOwogICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5wb3NpdGlvbikgewogICAgICAgICAgICBwb3NpdGlvbnNbcG9zaXRpb25JbmRleCsrXSA9IGJvdHRvbVBvc2l0aW9uLng7CiAgICAgICAgICAgIHBvc2l0aW9uc1twb3NpdGlvbkluZGV4KytdID0gYm90dG9tUG9zaXRpb24ueTsKICAgICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSBib3R0b21Qb3NpdGlvbi56OwogICAgICAgICAgICBwb3NpdGlvbnNbcG9zaXRpb25JbmRleCsrXSA9IHRvcFBvc2l0aW9uLng7CiAgICAgICAgICAgIHBvc2l0aW9uc1twb3NpdGlvbkluZGV4KytdID0gdG9wUG9zaXRpb24ueTsKICAgICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSB0b3BQb3NpdGlvbi56OwogICAgICAgICAgfQogICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5zdCkgewogICAgICAgICAgICB0ZXh0dXJlQ29vcmRpbmF0ZXNbc3RJbmRleCsrXSA9IHM7CiAgICAgICAgICAgIHRleHR1cmVDb29yZGluYXRlc1tzdEluZGV4KytdID0gMDsKICAgICAgICAgICAgdGV4dHVyZUNvb3JkaW5hdGVzW3N0SW5kZXgrK10gPSBzOwogICAgICAgICAgICB0ZXh0dXJlQ29vcmRpbmF0ZXNbc3RJbmRleCsrXSA9IDE7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmVydGV4Rm9ybWF0Lm5vcm1hbCB8fCB2ZXJ0ZXhGb3JtYXQudGFuZ2VudCB8fCB2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgICAgICAgIGxldCBuZXh0VG9wID0gQ2FydGVzaWFuM19kZWZhdWx0LmNsb25lKAogICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5aRVJPLAogICAgICAgICAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zUG9zaXRpb241CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNvbnN0IGdyb3VuZFBvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KAogICAgICAgICAgICAgIHRvcFBvc2l0aW9uLAogICAgICAgICAgICAgIGVsbGlwc29pZC5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoCiAgICAgICAgICAgICAgICB0b3BQb3NpdGlvbiwKICAgICAgICAgICAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zUG9zaXRpb24yCiAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICBzY3JhdGNoQ2FydGVzaWFuM1Bvc2l0aW9uMgogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoaSArIDEgPCBsZW5ndGgpIHsKICAgICAgICAgICAgICBuZXh0VG9wID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheSgKICAgICAgICAgICAgICAgIHRvcFBvc2l0aW9ucywKICAgICAgICAgICAgICAgIGkzICsgMywKICAgICAgICAgICAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zUG9zaXRpb241CiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmVjb21wdXRlTm9ybWFsKSB7CiAgICAgICAgICAgICAgY29uc3Qgc2NhbGVkbmV4dFBvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KAogICAgICAgICAgICAgICAgbmV4dFRvcCwKICAgICAgICAgICAgICAgIHRvcFBvc2l0aW9uLAogICAgICAgICAgICAgICAgc2NyYXRjaENhcnRlc2lhbjNQb3NpdGlvbjQKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIGNvbnN0IHNjYWxlZEdyb3VuZFBvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KAogICAgICAgICAgICAgICAgZ3JvdW5kUG9zaXRpb24sCiAgICAgICAgICAgICAgICB0b3BQb3NpdGlvbiwKICAgICAgICAgICAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zUG9zaXRpb24xCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICBub3JtYWwyID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhzY2FsZWRHcm91bmRQb3NpdGlvbiwgc2NhbGVkbmV4dFBvc2l0aW9uLCBub3JtYWwyKSwKICAgICAgICAgICAgICAgIG5vcm1hbDIKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIHJlY29tcHV0ZU5vcm1hbCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChDYXJ0ZXNpYW4zX2RlZmF1bHQuZXF1YWxzRXBzaWxvbih0b3BQb3NpdGlvbiwgbmV4dFRvcCwgTWF0aF9kZWZhdWx0LkVQU0lMT04xMCkpIHsKICAgICAgICAgICAgICByZWNvbXB1dGVOb3JtYWwgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHMgKz0gZHM7CiAgICAgICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC50YW5nZW50KSB7CiAgICAgICAgICAgICAgICB0YW5nZW50ID0gQ2FydGVzaWFuM19kZWZhdWx0Lm5vcm1hbGl6ZSgKICAgICAgICAgICAgICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KG5leHRUb3AsIHRvcFBvc2l0aW9uLCB0YW5nZW50KSwKICAgICAgICAgICAgICAgICAgdGFuZ2VudAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5iaXRhbmdlbnQpIHsKICAgICAgICAgICAgICAgIGJpdGFuZ2VudCA9IENhcnRlc2lhbjNfZGVmYXVsdC5ub3JtYWxpemUoCiAgICAgICAgICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhub3JtYWwyLCB0YW5nZW50LCBiaXRhbmdlbnQpLAogICAgICAgICAgICAgICAgICBiaXRhbmdlbnQKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQubm9ybWFsKSB7CiAgICAgICAgICAgICAgbm9ybWFsc1tub3JtYWxJbmRleCsrXSA9IG5vcm1hbDIueDsKICAgICAgICAgICAgICBub3JtYWxzW25vcm1hbEluZGV4KytdID0gbm9ybWFsMi55OwogICAgICAgICAgICAgIG5vcm1hbHNbbm9ybWFsSW5kZXgrK10gPSBub3JtYWwyLno7CiAgICAgICAgICAgICAgbm9ybWFsc1tub3JtYWxJbmRleCsrXSA9IG5vcm1hbDIueDsKICAgICAgICAgICAgICBub3JtYWxzW25vcm1hbEluZGV4KytdID0gbm9ybWFsMi55OwogICAgICAgICAgICAgIG5vcm1hbHNbbm9ybWFsSW5kZXgrK10gPSBub3JtYWwyLno7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC50YW5nZW50KSB7CiAgICAgICAgICAgICAgdGFuZ2VudHNbdGFuZ2VudEluZGV4KytdID0gdGFuZ2VudC54OwogICAgICAgICAgICAgIHRhbmdlbnRzW3RhbmdlbnRJbmRleCsrXSA9IHRhbmdlbnQueTsKICAgICAgICAgICAgICB0YW5nZW50c1t0YW5nZW50SW5kZXgrK10gPSB0YW5nZW50Lno7CiAgICAgICAgICAgICAgdGFuZ2VudHNbdGFuZ2VudEluZGV4KytdID0gdGFuZ2VudC54OwogICAgICAgICAgICAgIHRhbmdlbnRzW3RhbmdlbnRJbmRleCsrXSA9IHRhbmdlbnQueTsKICAgICAgICAgICAgICB0YW5nZW50c1t0YW5nZW50SW5kZXgrK10gPSB0YW5nZW50Lno7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5iaXRhbmdlbnQpIHsKICAgICAgICAgICAgICBiaXRhbmdlbnRzW2JpdGFuZ2VudEluZGV4KytdID0gYml0YW5nZW50Lng7CiAgICAgICAgICAgICAgYml0YW5nZW50c1tiaXRhbmdlbnRJbmRleCsrXSA9IGJpdGFuZ2VudC55OwogICAgICAgICAgICAgIGJpdGFuZ2VudHNbYml0YW5nZW50SW5kZXgrK10gPSBiaXRhbmdlbnQuejsKICAgICAgICAgICAgICBiaXRhbmdlbnRzW2JpdGFuZ2VudEluZGV4KytdID0gYml0YW5nZW50Lng7CiAgICAgICAgICAgICAgYml0YW5nZW50c1tiaXRhbmdlbnRJbmRleCsrXSA9IGJpdGFuZ2VudC55OwogICAgICAgICAgICAgIGJpdGFuZ2VudHNbYml0YW5nZW50SW5kZXgrK10gPSBiaXRhbmdlbnQuejsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlc19kZWZhdWx0KCk7CiAgICAgICAgaWYgKHZlcnRleEZvcm1hdC5wb3NpdGlvbikgewogICAgICAgICAgYXR0cmlidXRlcy5wb3NpdGlvbiA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRE9VQkxFLAogICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAzLAogICAgICAgICAgICB2YWx1ZXM6IHBvc2l0aW9ucwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQubm9ybWFsKSB7CiAgICAgICAgICBhdHRyaWJ1dGVzLm5vcm1hbCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgICAgIHZhbHVlczogbm9ybWFscwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQudGFuZ2VudCkgewogICAgICAgICAgYXR0cmlidXRlcy50YW5nZW50ID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlX2RlZmF1bHQoewogICAgICAgICAgICBjb21wb25lbnREYXRhdHlwZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5GTE9BVCwKICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgICAgdmFsdWVzOiB0YW5nZW50cwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuYml0YW5nZW50KSB7CiAgICAgICAgICBhdHRyaWJ1dGVzLmJpdGFuZ2VudCA9IG5ldyBHZW9tZXRyeUF0dHJpYnV0ZV9kZWZhdWx0KHsKICAgICAgICAgICAgY29tcG9uZW50RGF0YXR5cGU6IENvbXBvbmVudERhdGF0eXBlX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgICAgIGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6IDMsCiAgICAgICAgICAgIHZhbHVlczogYml0YW5nZW50cwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmICh2ZXJ0ZXhGb3JtYXQuc3QpIHsKICAgICAgICAgIGF0dHJpYnV0ZXMuc3QgPSBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkZMT0FULAogICAgICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiAyLAogICAgICAgICAgICB2YWx1ZXM6IHRleHR1cmVDb29yZGluYXRlcwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG51bVZlcnRpY2VzID0gc2l6ZSAvIDM7CiAgICAgICAgc2l6ZSAtPSA2ICogKG51bUNvcm5lcnMgKyAxKTsKICAgICAgICBjb25zdCBpbmRpY2VzID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkobnVtVmVydGljZXMsIHNpemUpOwogICAgICAgIGxldCBlZGdlSW5kZXggPSAwOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1WZXJ0aWNlcyAtIDI7IGkgKz0gMikgewogICAgICAgICAgY29uc3QgTEwgPSBpOwogICAgICAgICAgY29uc3QgTFIgPSBpICsgMjsKICAgICAgICAgIGNvbnN0IHBsID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheSgKICAgICAgICAgICAgcG9zaXRpb25zLAogICAgICAgICAgICBMTCAqIDMsCiAgICAgICAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zUG9zaXRpb24xCiAgICAgICAgICApOwogICAgICAgICAgY29uc3QgcHIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KAogICAgICAgICAgICBwb3NpdGlvbnMsCiAgICAgICAgICAgIExSICogMywKICAgICAgICAgICAgc2NyYXRjaENhcnRlc2lhbjNQb3NpdGlvbjIKICAgICAgICAgICk7CiAgICAgICAgICBpZiAoQ2FydGVzaWFuM19kZWZhdWx0LmVxdWFsc0Vwc2lsb24ocGwsIHByLCBNYXRoX2RlZmF1bHQuRVBTSUxPTjEwKSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IFVMID0gaSArIDE7CiAgICAgICAgICBjb25zdCBVUiA9IGkgKyAzOwogICAgICAgICAgaW5kaWNlc1tlZGdlSW5kZXgrK10gPSBVTDsKICAgICAgICAgIGluZGljZXNbZWRnZUluZGV4KytdID0gTEw7CiAgICAgICAgICBpbmRpY2VzW2VkZ2VJbmRleCsrXSA9IFVSOwogICAgICAgICAgaW5kaWNlc1tlZGdlSW5kZXgrK10gPSBVUjsKICAgICAgICAgIGluZGljZXNbZWRnZUluZGV4KytdID0gTEw7CiAgICAgICAgICBpbmRpY2VzW2VkZ2VJbmRleCsrXSA9IExSOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IEdlb21ldHJ5X2RlZmF1bHQoewogICAgICAgICAgYXR0cmlidXRlcywKICAgICAgICAgIGluZGljZXMsCiAgICAgICAgICBwcmltaXRpdmVUeXBlOiBQcmltaXRpdmVUeXBlX2RlZmF1bHQuVFJJQU5HTEVTLAogICAgICAgICAgYm91bmRpbmdTcGhlcmU6IG5ldyBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LmZyb21WZXJ0aWNlcyhwb3NpdGlvbnMpCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIFdhbGxHZW9tZXRyeV9kZWZhdWx0ID0gV2FsbEdlb21ldHJ5OwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlV2FsbEdlb21ldHJ5LmpzCiAgdmFyIGNyZWF0ZVdhbGxHZW9tZXRyeV9leHBvcnRzID0ge307CiAgX19leHBvcnQoY3JlYXRlV2FsbEdlb21ldHJ5X2V4cG9ydHMsIHsKICAgIGRlZmF1bHQ6ICgpID0+IGNyZWF0ZVdhbGxHZW9tZXRyeV9kZWZhdWx0CiAgfSk7CiAgZnVuY3Rpb24gY3JlYXRlV2FsbEdlb21ldHJ5KHdhbGxHZW9tZXRyeSwgb2Zmc2V0KSB7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG9mZnNldCkpIHsKICAgICAgd2FsbEdlb21ldHJ5ID0gV2FsbEdlb21ldHJ5X2RlZmF1bHQudW5wYWNrKHdhbGxHZW9tZXRyeSwgb2Zmc2V0KTsKICAgIH0KICAgIHdhbGxHZW9tZXRyeS5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUod2FsbEdlb21ldHJ5Ll9lbGxpcHNvaWQpOwogICAgcmV0dXJuIFdhbGxHZW9tZXRyeV9kZWZhdWx0LmNyZWF0ZUdlb21ldHJ5KHdhbGxHZW9tZXRyeSk7CiAgfQogIHZhciBjcmVhdGVXYWxsR2VvbWV0cnlfZGVmYXVsdDsKICB2YXIgaW5pdF9jcmVhdGVXYWxsR2VvbWV0cnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZVdhbGxHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X1dhbGxHZW9tZXRyeSgpOwogICAgICBjcmVhdGVXYWxsR2VvbWV0cnlfZGVmYXVsdCA9IGNyZWF0ZVdhbGxHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1dhbGxPdXRsaW5lR2VvbWV0cnkuanMKICBmdW5jdGlvbiBXYWxsT3V0bGluZUdlb21ldHJ5KG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IEZyb3plbl9kZWZhdWx0LkVNUFRZX09CSkVDVDsKICAgIGNvbnN0IHdhbGxQb3NpdGlvbnMgPSBvcHRpb25zLnBvc2l0aW9uczsKICAgIGNvbnN0IG1heGltdW1IZWlnaHRzID0gb3B0aW9ucy5tYXhpbXVtSGVpZ2h0czsKICAgIGNvbnN0IG1pbmltdW1IZWlnaHRzID0gb3B0aW9ucy5taW5pbXVtSGVpZ2h0czsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHdhbGxQb3NpdGlvbnMpKSB7CiAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJvcHRpb25zLnBvc2l0aW9ucyBpcyByZXF1aXJlZC4iKTsKICAgIH0KICAgIGlmIChkZWZpbmVkX2RlZmF1bHQobWF4aW11bUhlaWdodHMpICYmIG1heGltdW1IZWlnaHRzLmxlbmd0aCAhPT0gd2FsbFBvc2l0aW9ucy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgIm9wdGlvbnMucG9zaXRpb25zIGFuZCBvcHRpb25zLm1heGltdW1IZWlnaHRzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGguIgogICAgICApOwogICAgfQogICAgaWYgKGRlZmluZWRfZGVmYXVsdChtaW5pbXVtSGVpZ2h0cykgJiYgbWluaW11bUhlaWdodHMubGVuZ3RoICE9PSB3YWxsUG9zaXRpb25zLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAib3B0aW9ucy5wb3NpdGlvbnMgYW5kIG9wdGlvbnMubWluaW11bUhlaWdodHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aC4iCiAgICAgICk7CiAgICB9CiAgICBjb25zdCBncmFudWxhcml0eSA9IG9wdGlvbnMuZ3JhbnVsYXJpdHkgPz8gTWF0aF9kZWZhdWx0LlJBRElBTlNfUEVSX0RFR1JFRTsKICAgIGNvbnN0IGVsbGlwc29pZCA9IG9wdGlvbnMuZWxsaXBzb2lkID8/IEVsbGlwc29pZF9kZWZhdWx0LmRlZmF1bHQ7CiAgICB0aGlzLl9wb3NpdGlvbnMgPSB3YWxsUG9zaXRpb25zOwogICAgdGhpcy5fbWluaW11bUhlaWdodHMgPSBtaW5pbXVtSGVpZ2h0czsKICAgIHRoaXMuX21heGltdW1IZWlnaHRzID0gbWF4aW11bUhlaWdodHM7CiAgICB0aGlzLl9ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwogICAgdGhpcy5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUoZWxsaXBzb2lkKTsKICAgIHRoaXMuX3dvcmtlck5hbWUgPSAiY3JlYXRlV2FsbE91dGxpbmVHZW9tZXRyeSI7CiAgICBsZXQgbnVtQ29tcG9uZW50cyA9IDEgKyB3YWxsUG9zaXRpb25zLmxlbmd0aCAqIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGggKyAyOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdChtaW5pbXVtSGVpZ2h0cykpIHsKICAgICAgbnVtQ29tcG9uZW50cyArPSBtaW5pbXVtSGVpZ2h0cy5sZW5ndGg7CiAgICB9CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG1heGltdW1IZWlnaHRzKSkgewogICAgICBudW1Db21wb25lbnRzICs9IG1heGltdW1IZWlnaHRzLmxlbmd0aDsKICAgIH0KICAgIHRoaXMucGFja2VkTGVuZ3RoID0gbnVtQ29tcG9uZW50cyArIEVsbGlwc29pZF9kZWZhdWx0LnBhY2tlZExlbmd0aCArIDE7CiAgfQogIHZhciBzY3JhdGNoQ2FydGVzaWFuM1Bvc2l0aW9uMTIsIHNjcmF0Y2hDYXJ0ZXNpYW4zUG9zaXRpb24yMiwgc2NyYXRjaEVsbGlwc29pZDE4LCBzY3JhdGNoT3B0aW9uczI0LCBXYWxsT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfV2FsbE91dGxpbmVHZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvV2FsbE91dGxpbmVHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfQm91bmRpbmdTcGhlcmUoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4zKCk7CiAgICAgIGluaXRfQ29tcG9uZW50RGF0YXR5cGUoKTsKICAgICAgaW5pdF9Gcm96ZW4oKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9HZW9tZXRyeSgpOwogICAgICBpbml0X0dlb21ldHJ5QXR0cmlidXRlKCk7CiAgICAgIGluaXRfR2VvbWV0cnlBdHRyaWJ1dGVzKCk7CiAgICAgIGluaXRfSW5kZXhEYXRhdHlwZSgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9QcmltaXRpdmVUeXBlKCk7CiAgICAgIGluaXRfV2FsbEdlb21ldHJ5TGlicmFyeSgpOwogICAgICBzY3JhdGNoQ2FydGVzaWFuM1Bvc2l0aW9uMTIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zUG9zaXRpb24yMiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgV2FsbE91dGxpbmVHZW9tZXRyeS5wYWNrID0gZnVuY3Rpb24odmFsdWUsIGFycmF5LCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodmFsdWUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgidmFsdWUgaXMgcmVxdWlyZWQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYXJyYXkpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXJyYXkgaXMgcmVxdWlyZWQiKTsKICAgICAgICB9CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBsZXQgaTsKICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSB2YWx1ZS5fcG9zaXRpb25zOwogICAgICAgIGxldCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSBsZW5ndGg7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpLCBzdGFydGluZ0luZGV4ICs9IENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrZWRMZW5ndGgpIHsKICAgICAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKHBvc2l0aW9uc1tpXSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgIH0KICAgICAgICBjb25zdCBtaW5pbXVtSGVpZ2h0cyA9IHZhbHVlLl9taW5pbXVtSGVpZ2h0czsKICAgICAgICBsZW5ndGggPSBkZWZpbmVkX2RlZmF1bHQobWluaW11bUhlaWdodHMpID8gbWluaW11bUhlaWdodHMubGVuZ3RoIDogMDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gbGVuZ3RoOwogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQobWluaW11bUhlaWdodHMpKSB7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IG1pbmltdW1IZWlnaHRzW2ldOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBtYXhpbXVtSGVpZ2h0cyA9IHZhbHVlLl9tYXhpbXVtSGVpZ2h0czsKICAgICAgICBsZW5ndGggPSBkZWZpbmVkX2RlZmF1bHQobWF4aW11bUhlaWdodHMpID8gbWF4aW11bUhlaWdodHMubGVuZ3RoIDogMDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gbGVuZ3RoOwogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQobWF4aW11bUhlaWdodHMpKSB7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IG1heGltdW1IZWlnaHRzW2ldOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBFbGxpcHNvaWRfZGVmYXVsdC5wYWNrKHZhbHVlLl9lbGxpcHNvaWQsIGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IEVsbGlwc29pZF9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4XSA9IHZhbHVlLl9ncmFudWxhcml0eTsKICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH07CiAgICAgIHNjcmF0Y2hFbGxpcHNvaWQxOCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKEVsbGlwc29pZF9kZWZhdWx0LlVOSVRfU1BIRVJFKTsKICAgICAgc2NyYXRjaE9wdGlvbnMyNCA9IHsKICAgICAgICBwb3NpdGlvbnM6IHZvaWQgMCwKICAgICAgICBtaW5pbXVtSGVpZ2h0czogdm9pZCAwLAogICAgICAgIG1heGltdW1IZWlnaHRzOiB2b2lkIDAsCiAgICAgICAgZWxsaXBzb2lkOiBzY3JhdGNoRWxsaXBzb2lkMTgsCiAgICAgICAgZ3JhbnVsYXJpdHk6IHZvaWQgMAogICAgICB9OwogICAgICBXYWxsT3V0bGluZUdlb21ldHJ5LnVucGFjayA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydGluZ0luZGV4LCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhcnJheSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhcnJheSBpcyByZXF1aXJlZCIpOwogICAgICAgIH0KICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGxldCBpOwogICAgICAgIGxldCBsZW5ndGggPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSwgc3RhcnRpbmdJbmRleCArPSBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFja2VkTGVuZ3RoKSB7CiAgICAgICAgICBwb3NpdGlvbnNbaV0gPSBDYXJ0ZXNpYW4zX2RlZmF1bHQudW5wYWNrKGFycmF5LCBzdGFydGluZ0luZGV4KTsKICAgICAgICB9CiAgICAgICAgbGVuZ3RoID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICBsZXQgbWluaW11bUhlaWdodHM7CiAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgICAgIG1pbmltdW1IZWlnaHRzID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgbWluaW11bUhlaWdodHNbaV0gPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIGxldCBtYXhpbXVtSGVpZ2h0czsKICAgICAgICBpZiAobGVuZ3RoID4gMCkgewogICAgICAgICAgbWF4aW11bUhlaWdodHMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgICBtYXhpbXVtSGVpZ2h0c1tpXSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LnVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCwgc2NyYXRjaEVsbGlwc29pZDE4KTsKICAgICAgICBzdGFydGluZ0luZGV4ICs9IEVsbGlwc29pZF9kZWZhdWx0LnBhY2tlZExlbmd0aDsKICAgICAgICBjb25zdCBncmFudWxhcml0eSA9IGFycmF5W3N0YXJ0aW5nSW5kZXhdOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHNjcmF0Y2hPcHRpb25zMjQucG9zaXRpb25zID0gcG9zaXRpb25zOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMyNC5taW5pbXVtSGVpZ2h0cyA9IG1pbmltdW1IZWlnaHRzOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMyNC5tYXhpbXVtSGVpZ2h0cyA9IG1heGltdW1IZWlnaHRzOwogICAgICAgICAgc2NyYXRjaE9wdGlvbnMyNC5ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwogICAgICAgICAgcmV0dXJuIG5ldyBXYWxsT3V0bGluZUdlb21ldHJ5KHNjcmF0Y2hPcHRpb25zMjQpOwogICAgICAgIH0KICAgICAgICByZXN1bHQuX3Bvc2l0aW9ucyA9IHBvc2l0aW9uczsKICAgICAgICByZXN1bHQuX21pbmltdW1IZWlnaHRzID0gbWluaW11bUhlaWdodHM7CiAgICAgICAgcmVzdWx0Ll9tYXhpbXVtSGVpZ2h0cyA9IG1heGltdW1IZWlnaHRzOwogICAgICAgIHJlc3VsdC5fZWxsaXBzb2lkID0gRWxsaXBzb2lkX2RlZmF1bHQuY2xvbmUoZWxsaXBzb2lkLCByZXN1bHQuX2VsbGlwc29pZCk7CiAgICAgICAgcmVzdWx0Ll9ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIFdhbGxPdXRsaW5lR2VvbWV0cnkuZnJvbUNvbnN0YW50SGVpZ2h0cyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyA/PyBGcm96ZW5fZGVmYXVsdC5FTVBUWV9PQkpFQ1Q7CiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gb3B0aW9ucy5wb3NpdGlvbnM7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocG9zaXRpb25zKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm9wdGlvbnMucG9zaXRpb25zIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBsZXQgbWluSGVpZ2h0czsKICAgICAgICBsZXQgbWF4SGVpZ2h0czsKICAgICAgICBjb25zdCBtaW4zID0gb3B0aW9ucy5taW5pbXVtSGVpZ2h0OwogICAgICAgIGNvbnN0IG1heDMgPSBvcHRpb25zLm1heGltdW1IZWlnaHQ7CiAgICAgICAgY29uc3QgZG9NaW4gPSBkZWZpbmVkX2RlZmF1bHQobWluMyk7CiAgICAgICAgY29uc3QgZG9NYXggPSBkZWZpbmVkX2RlZmF1bHQobWF4Myk7CiAgICAgICAgaWYgKGRvTWluIHx8IGRvTWF4KSB7CiAgICAgICAgICBjb25zdCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwogICAgICAgICAgbWluSGVpZ2h0cyA9IGRvTWluID8gbmV3IEFycmF5KGxlbmd0aCkgOiB2b2lkIDA7CiAgICAgICAgICBtYXhIZWlnaHRzID0gZG9NYXggPyBuZXcgQXJyYXkobGVuZ3RoKSA6IHZvaWQgMDsKICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgaWYgKGRvTWluKSB7CiAgICAgICAgICAgICAgbWluSGVpZ2h0c1tpXSA9IG1pbjM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRvTWF4KSB7CiAgICAgICAgICAgICAgbWF4SGVpZ2h0c1tpXSA9IG1heDM7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgbmV3T3B0aW9ucyA9IHsKICAgICAgICAgIHBvc2l0aW9ucywKICAgICAgICAgIG1heGltdW1IZWlnaHRzOiBtYXhIZWlnaHRzLAogICAgICAgICAgbWluaW11bUhlaWdodHM6IG1pbkhlaWdodHMsCiAgICAgICAgICBlbGxpcHNvaWQ6IG9wdGlvbnMuZWxsaXBzb2lkCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gbmV3IFdhbGxPdXRsaW5lR2VvbWV0cnkobmV3T3B0aW9ucyk7CiAgICAgIH07CiAgICAgIFdhbGxPdXRsaW5lR2VvbWV0cnkuY3JlYXRlR2VvbWV0cnkgPSBmdW5jdGlvbih3YWxsR2VvbWV0cnkpIHsKICAgICAgICBjb25zdCB3YWxsUG9zaXRpb25zID0gd2FsbEdlb21ldHJ5Ll9wb3NpdGlvbnM7CiAgICAgICAgY29uc3QgbWluaW11bUhlaWdodHMgPSB3YWxsR2VvbWV0cnkuX21pbmltdW1IZWlnaHRzOwogICAgICAgIGNvbnN0IG1heGltdW1IZWlnaHRzID0gd2FsbEdlb21ldHJ5Ll9tYXhpbXVtSGVpZ2h0czsKICAgICAgICBjb25zdCBncmFudWxhcml0eSA9IHdhbGxHZW9tZXRyeS5fZ3JhbnVsYXJpdHk7CiAgICAgICAgY29uc3QgZWxsaXBzb2lkID0gd2FsbEdlb21ldHJ5Ll9lbGxpcHNvaWQ7CiAgICAgICAgY29uc3QgcG9zID0gV2FsbEdlb21ldHJ5TGlicmFyeV9kZWZhdWx0LmNvbXB1dGVQb3NpdGlvbnMoCiAgICAgICAgICBlbGxpcHNvaWQsCiAgICAgICAgICB3YWxsUG9zaXRpb25zLAogICAgICAgICAgbWF4aW11bUhlaWdodHMsCiAgICAgICAgICBtaW5pbXVtSGVpZ2h0cywKICAgICAgICAgIGdyYW51bGFyaXR5LAogICAgICAgICAgZmFsc2UKICAgICAgICApOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHBvcykpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgYm90dG9tUG9zaXRpb25zID0gcG9zLmJvdHRvbVBvc2l0aW9uczsKICAgICAgICBjb25zdCB0b3BQb3NpdGlvbnMgPSBwb3MudG9wUG9zaXRpb25zOwogICAgICAgIGxldCBsZW5ndGggPSB0b3BQb3NpdGlvbnMubGVuZ3RoOwogICAgICAgIGxldCBzaXplID0gbGVuZ3RoICogMjsKICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQ2NEFycmF5KHNpemUpOwogICAgICAgIGxldCBwb3NpdGlvbkluZGV4ID0gMDsKICAgICAgICBsZW5ndGggLz0gMzsKICAgICAgICBsZXQgaTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgIGNvbnN0IGkzID0gaSAqIDM7CiAgICAgICAgICBjb25zdCB0b3BQb3NpdGlvbiA9IENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkoCiAgICAgICAgICAgIHRvcFBvc2l0aW9ucywKICAgICAgICAgICAgaTMsCiAgICAgICAgICAgIHNjcmF0Y2hDYXJ0ZXNpYW4zUG9zaXRpb24xMgogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IGJvdHRvbVBvc2l0aW9uID0gQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheSgKICAgICAgICAgICAgYm90dG9tUG9zaXRpb25zLAogICAgICAgICAgICBpMywKICAgICAgICAgICAgc2NyYXRjaENhcnRlc2lhbjNQb3NpdGlvbjIyCiAgICAgICAgICApOwogICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSBib3R0b21Qb3NpdGlvbi54OwogICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSBib3R0b21Qb3NpdGlvbi55OwogICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSBib3R0b21Qb3NpdGlvbi56OwogICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSB0b3BQb3NpdGlvbi54OwogICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSB0b3BQb3NpdGlvbi55OwogICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uSW5kZXgrK10gPSB0b3BQb3NpdGlvbi56OwogICAgICAgIH0KICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbmV3IEdlb21ldHJ5QXR0cmlidXRlc19kZWZhdWx0KHsKICAgICAgICAgIHBvc2l0aW9uOiBuZXcgR2VvbWV0cnlBdHRyaWJ1dGVfZGVmYXVsdCh7CiAgICAgICAgICAgIGNvbXBvbmVudERhdGF0eXBlOiBDb21wb25lbnREYXRhdHlwZV9kZWZhdWx0LkRPVUJMRSwKICAgICAgICAgICAgY29tcG9uZW50c1BlckF0dHJpYnV0ZTogMywKICAgICAgICAgICAgdmFsdWVzOiBwb3NpdGlvbnMKICAgICAgICAgIH0pCiAgICAgICAgfSk7CiAgICAgICAgY29uc3QgbnVtVmVydGljZXMgPSBzaXplIC8gMzsKICAgICAgICBzaXplID0gMiAqIG51bVZlcnRpY2VzIC0gNCArIG51bVZlcnRpY2VzOwogICAgICAgIGNvbnN0IGluZGljZXMgPSBJbmRleERhdGF0eXBlX2RlZmF1bHQuY3JlYXRlVHlwZWRBcnJheShudW1WZXJ0aWNlcywgc2l6ZSk7CiAgICAgICAgbGV0IGVkZ2VJbmRleCA9IDA7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVZlcnRpY2VzIC0gMjsgaSArPSAyKSB7CiAgICAgICAgICBjb25zdCBMTCA9IGk7CiAgICAgICAgICBjb25zdCBMUiA9IGkgKyAyOwogICAgICAgICAgY29uc3QgcGwgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KAogICAgICAgICAgICBwb3NpdGlvbnMsCiAgICAgICAgICAgIExMICogMywKICAgICAgICAgICAgc2NyYXRjaENhcnRlc2lhbjNQb3NpdGlvbjEyCiAgICAgICAgICApOwogICAgICAgICAgY29uc3QgcHIgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KAogICAgICAgICAgICBwb3NpdGlvbnMsCiAgICAgICAgICAgIExSICogMywKICAgICAgICAgICAgc2NyYXRjaENhcnRlc2lhbjNQb3NpdGlvbjIyCiAgICAgICAgICApOwogICAgICAgICAgaWYgKENhcnRlc2lhbjNfZGVmYXVsdC5lcXVhbHNFcHNpbG9uKHBsLCBwciwgTWF0aF9kZWZhdWx0LkVQU0lMT04xMCkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBVTCA9IGkgKyAxOwogICAgICAgICAgY29uc3QgVVIgPSBpICsgMzsKICAgICAgICAgIGluZGljZXNbZWRnZUluZGV4KytdID0gVUw7CiAgICAgICAgICBpbmRpY2VzW2VkZ2VJbmRleCsrXSA9IExMOwogICAgICAgICAgaW5kaWNlc1tlZGdlSW5kZXgrK10gPSBVTDsKICAgICAgICAgIGluZGljZXNbZWRnZUluZGV4KytdID0gVVI7CiAgICAgICAgICBpbmRpY2VzW2VkZ2VJbmRleCsrXSA9IExMOwogICAgICAgICAgaW5kaWNlc1tlZGdlSW5kZXgrK10gPSBMUjsKICAgICAgICB9CiAgICAgICAgaW5kaWNlc1tlZGdlSW5kZXgrK10gPSBudW1WZXJ0aWNlcyAtIDI7CiAgICAgICAgaW5kaWNlc1tlZGdlSW5kZXgrK10gPSBudW1WZXJ0aWNlcyAtIDE7CiAgICAgICAgcmV0dXJuIG5ldyBHZW9tZXRyeV9kZWZhdWx0KHsKICAgICAgICAgIGF0dHJpYnV0ZXMsCiAgICAgICAgICBpbmRpY2VzLAogICAgICAgICAgcHJpbWl0aXZlVHlwZTogUHJpbWl0aXZlVHlwZV9kZWZhdWx0LkxJTkVTLAogICAgICAgICAgYm91bmRpbmdTcGhlcmU6IG5ldyBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0LmZyb21WZXJ0aWNlcyhwb3NpdGlvbnMpCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIFdhbGxPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdCA9IFdhbGxPdXRsaW5lR2VvbWV0cnk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVXYWxsT3V0bGluZUdlb21ldHJ5LmpzCiAgdmFyIGNyZWF0ZVdhbGxPdXRsaW5lR2VvbWV0cnlfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGNyZWF0ZVdhbGxPdXRsaW5lR2VvbWV0cnlfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gY3JlYXRlV2FsbE91dGxpbmVHZW9tZXRyeV9kZWZhdWx0CiAgfSk7CiAgZnVuY3Rpb24gY3JlYXRlV2FsbE91dGxpbmVHZW9tZXRyeSh3YWxsR2VvbWV0cnksIG9mZnNldCkgewogICAgaWYgKGRlZmluZWRfZGVmYXVsdChvZmZzZXQpKSB7CiAgICAgIHdhbGxHZW9tZXRyeSA9IFdhbGxPdXRsaW5lR2VvbWV0cnlfZGVmYXVsdC51bnBhY2sod2FsbEdlb21ldHJ5LCBvZmZzZXQpOwogICAgfQogICAgd2FsbEdlb21ldHJ5Ll9lbGxpcHNvaWQgPSBFbGxpcHNvaWRfZGVmYXVsdC5jbG9uZSh3YWxsR2VvbWV0cnkuX2VsbGlwc29pZCk7CiAgICByZXR1cm4gV2FsbE91dGxpbmVHZW9tZXRyeV9kZWZhdWx0LmNyZWF0ZUdlb21ldHJ5KHdhbGxHZW9tZXRyeSk7CiAgfQogIHZhciBjcmVhdGVXYWxsT3V0bGluZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfY3JlYXRlV2FsbE91dGxpbmVHZW9tZXRyeSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlV2FsbE91dGxpbmVHZW9tZXRyeS5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X1dhbGxPdXRsaW5lR2VvbWV0cnkoKTsKICAgICAgY3JlYXRlV2FsbE91dGxpbmVHZW9tZXRyeV9kZWZhdWx0ID0gY3JlYXRlV2FsbE91dGxpbmVHZW9tZXRyeTsKICAgIH0KICB9KTsKCiAgLy8gbm9kZV9tb2R1bGVzL2RyYWNvM2QvZHJhY29fZGVjb2Rlcl9ub2RlanMuanMKICB2YXIgcmVxdWlyZV9kcmFjb19kZWNvZGVyX25vZGVqcyA9IF9fY29tbW9uSlMoewogICAgIm5vZGVfbW9kdWxlcy9kcmFjbzNkL2RyYWNvX2RlY29kZXJfbm9kZWpzLmpzIihleHBvcnRzMiwgbW9kdWxlKSB7CiAgICAgIHZhciAkanNjb21wID0gJGpzY29tcCB8fCB7fTsKICAgICAgJGpzY29tcC5zY29wZSA9IHt9OwogICAgICAkanNjb21wLmFycmF5SXRlcmF0b3JJbXBsID0gZnVuY3Rpb24oaykgewogICAgICAgIHZhciBuID0gMDsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gbiA8IGsubGVuZ3RoID8geyBkb25lOiBmYWxzZSwgdmFsdWU6IGtbbisrXSB9IDogeyBkb25lOiB0cnVlIH07CiAgICAgICAgfTsKICAgICAgfTsKICAgICAgJGpzY29tcC5hcnJheUl0ZXJhdG9yID0gZnVuY3Rpb24oaykgewogICAgICAgIHJldHVybiB7IG5leHQ6ICRqc2NvbXAuYXJyYXlJdGVyYXRvckltcGwoaykgfTsKICAgICAgfTsKICAgICAgJGpzY29tcC5tYWtlSXRlcmF0b3IgPSBmdW5jdGlvbihrKSB7CiAgICAgICAgdmFyIG4gPSAidW5kZWZpbmVkIiAhPSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvciAmJiBrW1N5bWJvbC5pdGVyYXRvcl07CiAgICAgICAgcmV0dXJuIG4gPyBuLmNhbGwoaykgOiAkanNjb21wLmFycmF5SXRlcmF0b3Ioayk7CiAgICAgIH07CiAgICAgICRqc2NvbXAuQVNTVU1FX0VTNSA9IGZhbHNlOwogICAgICAkanNjb21wLkFTU1VNRV9OT19OQVRJVkVfTUFQID0gZmFsc2U7CiAgICAgICRqc2NvbXAuQVNTVU1FX05PX05BVElWRV9TRVQgPSBmYWxzZTsKICAgICAgJGpzY29tcC5TSU1QTEVfRlJPVU5EX1BPTFlGSUxMID0gZmFsc2U7CiAgICAgICRqc2NvbXAuSVNPTEFURV9QT0xZRklMTFMgPSBmYWxzZTsKICAgICAgJGpzY29tcC5GT1JDRV9QT0xZRklMTF9QUk9NSVNFID0gZmFsc2U7CiAgICAgICRqc2NvbXAuRk9SQ0VfUE9MWUZJTExfUFJPTUlTRV9XSEVOX05PX1VOSEFORExFRF9SRUpFQ1RJT04gPSBmYWxzZTsKICAgICAgJGpzY29tcC5nZXRHbG9iYWwgPSBmdW5jdGlvbihrKSB7CiAgICAgICAgayA9IFsib2JqZWN0IiA9PSB0eXBlb2YgZ2xvYmFsVGhpcyAmJiBnbG9iYWxUaGlzLCBrLCAib2JqZWN0IiA9PSB0eXBlb2Ygd2luZG93ICYmIHdpbmRvdywgIm9iamVjdCIgPT0gdHlwZW9mIHNlbGYgJiYgc2VsZiwgIm9iamVjdCIgPT0gdHlwZW9mIGdsb2JhbCAmJiBnbG9iYWxdOwogICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgay5sZW5ndGg7ICsrbikgewogICAgICAgICAgdmFyIGwgPSBrW25dOwogICAgICAgICAgaWYgKGwgJiYgbC5NYXRoID09IE1hdGgpIHJldHVybiBsOwogICAgICAgIH0KICAgICAgICB0aHJvdyBFcnJvcigiQ2Fubm90IGZpbmQgZ2xvYmFsIG9iamVjdCIpOwogICAgICB9OwogICAgICAkanNjb21wLmdsb2JhbCA9ICRqc2NvbXAuZ2V0R2xvYmFsKGV4cG9ydHMyKTsKICAgICAgJGpzY29tcC5kZWZpbmVQcm9wZXJ0eSA9ICRqc2NvbXAuQVNTVU1FX0VTNSB8fCAiZnVuY3Rpb24iID09IHR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uKGssIG4sIGwpIHsKICAgICAgICBpZiAoayA9PSBBcnJheS5wcm90b3R5cGUgfHwgayA9PSBPYmplY3QucHJvdG90eXBlKSByZXR1cm4gazsKICAgICAgICBrW25dID0gbC52YWx1ZTsKICAgICAgICByZXR1cm4gazsKICAgICAgfTsKICAgICAgJGpzY29tcC5JU19TWU1CT0xfTkFUSVZFID0gImZ1bmN0aW9uIiA9PT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PT0gdHlwZW9mIFN5bWJvbCgieCIpOwogICAgICAkanNjb21wLlRSVVNUX0VTNl9QT0xZRklMTFMgPSAhJGpzY29tcC5JU09MQVRFX1BPTFlGSUxMUyB8fCAkanNjb21wLklTX1NZTUJPTF9OQVRJVkU7CiAgICAgICRqc2NvbXAucG9seWZpbGxzID0ge307CiAgICAgICRqc2NvbXAucHJvcGVydHlUb1BvbHlmaWxsU3ltYm9sID0ge307CiAgICAgICRqc2NvbXAuUE9MWUZJTExfUFJFRklYID0gIiRqc2NwJCI7CiAgICAgICRqc2NvbXAucG9seWZpbGwgPSBmdW5jdGlvbihrLCBuLCBsLCBwKSB7CiAgICAgICAgbiAmJiAoJGpzY29tcC5JU09MQVRFX1BPTFlGSUxMUyA/ICRqc2NvbXAucG9seWZpbGxJc29sYXRlZChrLCBuLCBsLCBwKSA6ICRqc2NvbXAucG9seWZpbGxVbmlzb2xhdGVkKGssIG4sIGwsIHApKTsKICAgICAgfTsKICAgICAgJGpzY29tcC5wb2x5ZmlsbFVuaXNvbGF0ZWQgPSBmdW5jdGlvbihrLCBuLCBsLCBwKSB7CiAgICAgICAgbCA9ICRqc2NvbXAuZ2xvYmFsOwogICAgICAgIGsgPSBrLnNwbGl0KCIuIik7CiAgICAgICAgZm9yIChwID0gMDsgcCA8IGsubGVuZ3RoIC0gMTsgcCsrKSB7CiAgICAgICAgICB2YXIgaCA9IGtbcF07CiAgICAgICAgICBpZiAoIShoIGluIGwpKSByZXR1cm47CiAgICAgICAgICBsID0gbFtoXTsKICAgICAgICB9CiAgICAgICAgayA9IGtbay5sZW5ndGggLSAxXTsKICAgICAgICBwID0gbFtrXTsKICAgICAgICBuID0gbihwKTsKICAgICAgICBuICE9IHAgJiYgbnVsbCAhPSBuICYmICRqc2NvbXAuZGVmaW5lUHJvcGVydHkobCwgaywgeyBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogbiB9KTsKICAgICAgfTsKICAgICAgJGpzY29tcC5wb2x5ZmlsbElzb2xhdGVkID0gZnVuY3Rpb24oaywgbiwgbCwgcCkgewogICAgICAgIHZhciBoID0gay5zcGxpdCgiLiIpOwogICAgICAgIGsgPSAxID09PSBoLmxlbmd0aDsKICAgICAgICBwID0gaFswXTsKICAgICAgICBwID0gIWsgJiYgcCBpbiAkanNjb21wLnBvbHlmaWxscyA/ICRqc2NvbXAucG9seWZpbGxzIDogJGpzY29tcC5nbG9iYWw7CiAgICAgICAgZm9yICh2YXIgQSA9IDA7IEEgPCBoLmxlbmd0aCAtIDE7IEErKykgewogICAgICAgICAgdmFyIGYgPSBoW0FdOwogICAgICAgICAgaWYgKCEoZiBpbiBwKSkgcmV0dXJuOwogICAgICAgICAgcCA9IHBbZl07CiAgICAgICAgfQogICAgICAgIGggPSBoW2gubGVuZ3RoIC0gMV07CiAgICAgICAgbCA9ICRqc2NvbXAuSVNfU1lNQk9MX05BVElWRSAmJiAiZXM2IiA9PT0gbCA/IHBbaF0gOiBudWxsOwogICAgICAgIG4gPSBuKGwpOwogICAgICAgIG51bGwgIT0gbiAmJiAoayA/ICRqc2NvbXAuZGVmaW5lUHJvcGVydHkoJGpzY29tcC5wb2x5ZmlsbHMsIGgsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IG4gfSkgOiBuICE9PSBsICYmICh2b2lkIDAgPT09ICRqc2NvbXAucHJvcGVydHlUb1BvbHlmaWxsU3ltYm9sW2hdICYmIChsID0gMWU5ICogTWF0aC5yYW5kb20oKSA+Pj4gMCwgJGpzY29tcC5wcm9wZXJ0eVRvUG9seWZpbGxTeW1ib2xbaF0gPSAkanNjb21wLklTX1NZTUJPTF9OQVRJVkUgPyAkanNjb21wLmdsb2JhbC5TeW1ib2woaCkgOiAkanNjb21wLlBPTFlGSUxMX1BSRUZJWCArIGwgKyAiJCIgKyBoKSwgJGpzY29tcC5kZWZpbmVQcm9wZXJ0eShwLCAkanNjb21wLnByb3BlcnR5VG9Qb2x5ZmlsbFN5bWJvbFtoXSwgeyBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogbiB9KSkpOwogICAgICB9OwogICAgICAkanNjb21wLnBvbHlmaWxsKCJQcm9taXNlIiwgZnVuY3Rpb24oaykgewogICAgICAgIGZ1bmN0aW9uIG4oKSB7CiAgICAgICAgICB0aGlzLmJhdGNoXyA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGwoZikgewogICAgICAgICAgcmV0dXJuIGYgaW5zdGFuY2VvZiBoID8gZiA6IG5ldyBoKGZ1bmN0aW9uKHEsIHYzKSB7CiAgICAgICAgICAgIHEoZik7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKGsgJiYgKCEoJGpzY29tcC5GT1JDRV9QT0xZRklMTF9QUk9NSVNFIHx8ICRqc2NvbXAuRk9SQ0VfUE9MWUZJTExfUFJPTUlTRV9XSEVOX05PX1VOSEFORExFRF9SRUpFQ1RJT04gJiYgInVuZGVmaW5lZCIgPT09IHR5cGVvZiAkanNjb21wLmdsb2JhbC5Qcm9taXNlUmVqZWN0aW9uRXZlbnQpIHx8ICEkanNjb21wLmdsb2JhbC5Qcm9taXNlIHx8IC0xID09PSAkanNjb21wLmdsb2JhbC5Qcm9taXNlLnRvU3RyaW5nKCkuaW5kZXhPZigiW25hdGl2ZSBjb2RlXSIpKSkgcmV0dXJuIGs7CiAgICAgICAgbi5wcm90b3R5cGUuYXN5bmNFeGVjdXRlID0gZnVuY3Rpb24oZikgewogICAgICAgICAgaWYgKG51bGwgPT0gdGhpcy5iYXRjaF8pIHsKICAgICAgICAgICAgdGhpcy5iYXRjaF8gPSBbXTsKICAgICAgICAgICAgdmFyIHEgPSB0aGlzOwogICAgICAgICAgICB0aGlzLmFzeW5jRXhlY3V0ZUZ1bmN0aW9uKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHEuZXhlY3V0ZUJhdGNoXygpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuYmF0Y2hfLnB1c2goZik7CiAgICAgICAgfTsKICAgICAgICB2YXIgcCA9ICRqc2NvbXAuZ2xvYmFsLnNldFRpbWVvdXQ7CiAgICAgICAgbi5wcm90b3R5cGUuYXN5bmNFeGVjdXRlRnVuY3Rpb24gPSBmdW5jdGlvbihmKSB7CiAgICAgICAgICBwKGYsIDApOwogICAgICAgIH07CiAgICAgICAgbi5wcm90b3R5cGUuZXhlY3V0ZUJhdGNoXyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgZm9yICg7IHRoaXMuYmF0Y2hfICYmIHRoaXMuYmF0Y2hfLmxlbmd0aDsgKSB7CiAgICAgICAgICAgIHZhciBmID0gdGhpcy5iYXRjaF87CiAgICAgICAgICAgIHRoaXMuYmF0Y2hfID0gW107CiAgICAgICAgICAgIGZvciAodmFyIHEgPSAwOyBxIDwgZi5sZW5ndGg7ICsrcSkgewogICAgICAgICAgICAgIHZhciB2MyA9IGZbcV07CiAgICAgICAgICAgICAgZltxXSA9IG51bGw7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHYzKCk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoeikgewogICAgICAgICAgICAgICAgdGhpcy5hc3luY1Rocm93Xyh6KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuYmF0Y2hfID0gbnVsbDsKICAgICAgICB9OwogICAgICAgIG4ucHJvdG90eXBlLmFzeW5jVGhyb3dfID0gZnVuY3Rpb24oZikgewogICAgICAgICAgdGhpcy5hc3luY0V4ZWN1dGVGdW5jdGlvbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhyb3cgZjsKICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgdmFyIGggPSBmdW5jdGlvbihmKSB7CiAgICAgICAgICB0aGlzLnN0YXRlXyA9IDA7CiAgICAgICAgICB0aGlzLnJlc3VsdF8gPSB2b2lkIDA7CiAgICAgICAgICB0aGlzLm9uU2V0dGxlZENhbGxiYWNrc18gPSBbXTsKICAgICAgICAgIHRoaXMuaXNSZWplY3Rpb25IYW5kbGVkXyA9IGZhbHNlOwogICAgICAgICAgdmFyIHEgPSB0aGlzLmNyZWF0ZVJlc29sdmVBbmRSZWplY3RfKCk7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBmKHEucmVzb2x2ZSwgcS5yZWplY3QpOwogICAgICAgICAgfSBjYXRjaCAodjMpIHsKICAgICAgICAgICAgcS5yZWplY3QodjMpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgaC5wcm90b3R5cGUuY3JlYXRlUmVzb2x2ZUFuZFJlamVjdF8gPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGZ1bmN0aW9uIGYoeikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oTykgewogICAgICAgICAgICAgIHYzIHx8ICh2MyA9IHRydWUsIHouY2FsbChxLCBPKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgcSA9IHRoaXMsIHYzID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4geyByZXNvbHZlOiBmKHRoaXMucmVzb2x2ZVRvXyksIHJlamVjdDogZih0aGlzLnJlamVjdF8pIH07CiAgICAgICAgfTsKICAgICAgICBoLnByb3RvdHlwZS5yZXNvbHZlVG9fID0gZnVuY3Rpb24oZikgewogICAgICAgICAgaWYgKGYgPT09IHRoaXMpIHRoaXMucmVqZWN0XyhuZXcgVHlwZUVycm9yKCJBIFByb21pc2UgY2Fubm90IHJlc29sdmUgdG8gaXRzZWxmIikpOwogICAgICAgICAgZWxzZSBpZiAoZiBpbnN0YW5jZW9mIGgpIHRoaXMuc2V0dGxlU2FtZUFzUHJvbWlzZV8oZik7CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYTogc3dpdGNoICh0eXBlb2YgZikgewogICAgICAgICAgICAgIGNhc2UgIm9iamVjdCI6CiAgICAgICAgICAgICAgICB2YXIgcSA9IG51bGwgIT0gZjsKICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgY2FzZSAiZnVuY3Rpb24iOgogICAgICAgICAgICAgICAgcSA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhayBhOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBxID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcSA/IHRoaXMucmVzb2x2ZVRvTm9uUHJvbWlzZU9ial8oZikgOiB0aGlzLmZ1bGZpbGxfKGYpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgaC5wcm90b3R5cGUucmVzb2x2ZVRvTm9uUHJvbWlzZU9ial8gPSBmdW5jdGlvbihmKSB7CiAgICAgICAgICB2YXIgcSA9IHZvaWQgMDsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHEgPSBmLnRoZW47CiAgICAgICAgICB9IGNhdGNoICh2MykgewogICAgICAgICAgICB0aGlzLnJlamVjdF8odjMpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICAiZnVuY3Rpb24iID09IHR5cGVvZiBxID8gdGhpcy5zZXR0bGVTYW1lQXNUaGVuYWJsZV8ocSwgZikgOiB0aGlzLmZ1bGZpbGxfKGYpOwogICAgICAgIH07CiAgICAgICAgaC5wcm90b3R5cGUucmVqZWN0XyA9IGZ1bmN0aW9uKGYpIHsKICAgICAgICAgIHRoaXMuc2V0dGxlXygyLCBmKTsKICAgICAgICB9OwogICAgICAgIGgucHJvdG90eXBlLmZ1bGZpbGxfID0gZnVuY3Rpb24oZikgewogICAgICAgICAgdGhpcy5zZXR0bGVfKDEsIGYpOwogICAgICAgIH07CiAgICAgICAgaC5wcm90b3R5cGUuc2V0dGxlXyA9IGZ1bmN0aW9uKGYsIHEpIHsKICAgICAgICAgIGlmICgwICE9IHRoaXMuc3RhdGVfKSB0aHJvdyBFcnJvcigiQ2Fubm90IHNldHRsZSgiICsgZiArICIsICIgKyBxICsgIik6IFByb21pc2UgYWxyZWFkeSBzZXR0bGVkIGluIHN0YXRlIiArIHRoaXMuc3RhdGVfKTsKICAgICAgICAgIHRoaXMuc3RhdGVfID0gZjsKICAgICAgICAgIHRoaXMucmVzdWx0XyA9IHE7CiAgICAgICAgICAyID09PSB0aGlzLnN0YXRlXyAmJiB0aGlzLnNjaGVkdWxlVW5oYW5kbGVkUmVqZWN0aW9uQ2hlY2tfKCk7CiAgICAgICAgICB0aGlzLmV4ZWN1dGVPblNldHRsZWRDYWxsYmFja3NfKCk7CiAgICAgICAgfTsKICAgICAgICBoLnByb3RvdHlwZS5zY2hlZHVsZVVuaGFuZGxlZFJlamVjdGlvbkNoZWNrXyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGYgPSB0aGlzOwogICAgICAgICAgcChmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKGYubm90aWZ5VW5oYW5kbGVkUmVqZWN0aW9uXygpKSB7CiAgICAgICAgICAgICAgdmFyIHEgPSAkanNjb21wLmdsb2JhbC5jb25zb2xlOwogICAgICAgICAgICAgICJ1bmRlZmluZWQiICE9PSB0eXBlb2YgcSAmJiBxLmVycm9yKGYucmVzdWx0Xyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIDEpOwogICAgICAgIH07CiAgICAgICAgaC5wcm90b3R5cGUubm90aWZ5VW5oYW5kbGVkUmVqZWN0aW9uXyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKHRoaXMuaXNSZWplY3Rpb25IYW5kbGVkXykgcmV0dXJuIGZhbHNlOwogICAgICAgICAgdmFyIGYgPSAkanNjb21wLmdsb2JhbC5DdXN0b21FdmVudCwgcSA9ICRqc2NvbXAuZ2xvYmFsLkV2ZW50LCB2MyA9ICRqc2NvbXAuZ2xvYmFsLmRpc3BhdGNoRXZlbnQ7CiAgICAgICAgICBpZiAoInVuZGVmaW5lZCIgPT09IHR5cGVvZiB2MykgcmV0dXJuIHRydWU7CiAgICAgICAgICAiZnVuY3Rpb24iID09PSB0eXBlb2YgZiA/IGYgPSBuZXcgZigidW5oYW5kbGVkcmVqZWN0aW9uIiwgeyBjYW5jZWxhYmxlOiB0cnVlIH0pIDogImZ1bmN0aW9uIiA9PT0gdHlwZW9mIHEgPyBmID0gbmV3IHEoInVuaGFuZGxlZHJlamVjdGlvbiIsIHsgY2FuY2VsYWJsZTogdHJ1ZSB9KSA6IChmID0gJGpzY29tcC5nbG9iYWwuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksIGYuaW5pdEN1c3RvbUV2ZW50KCJ1bmhhbmRsZWRyZWplY3Rpb24iLCBmYWxzZSwgdHJ1ZSwgZikpOwogICAgICAgICAgZi5wcm9taXNlID0gdGhpczsKICAgICAgICAgIGYucmVhc29uID0gdGhpcy5yZXN1bHRfOwogICAgICAgICAgcmV0dXJuIHYzKGYpOwogICAgICAgIH07CiAgICAgICAgaC5wcm90b3R5cGUuZXhlY3V0ZU9uU2V0dGxlZENhbGxiYWNrc18gPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChudWxsICE9IHRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXykgewogICAgICAgICAgICBmb3IgKHZhciBmID0gMDsgZiA8IHRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXy5sZW5ndGg7ICsrZikgQS5hc3luY0V4ZWN1dGUodGhpcy5vblNldHRsZWRDYWxsYmFja3NfW2ZdKTsKICAgICAgICAgICAgdGhpcy5vblNldHRsZWRDYWxsYmFja3NfID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHZhciBBID0gbmV3IG4oKTsKICAgICAgICBoLnByb3RvdHlwZS5zZXR0bGVTYW1lQXNQcm9taXNlXyA9IGZ1bmN0aW9uKGYpIHsKICAgICAgICAgIHZhciBxID0gdGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpOwogICAgICAgICAgZi5jYWxsV2hlblNldHRsZWRfKHEucmVzb2x2ZSwgcS5yZWplY3QpOwogICAgICAgIH07CiAgICAgICAgaC5wcm90b3R5cGUuc2V0dGxlU2FtZUFzVGhlbmFibGVfID0gZnVuY3Rpb24oZiwgcSkgewogICAgICAgICAgdmFyIHYzID0gdGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZi5jYWxsKHEsIHYzLnJlc29sdmUsIHYzLnJlamVjdCk7CiAgICAgICAgICB9IGNhdGNoICh6KSB7CiAgICAgICAgICAgIHYzLnJlamVjdCh6KTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGgucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbihmLCBxKSB7CiAgICAgICAgICBmdW5jdGlvbiB2Myh0LCB4KSB7CiAgICAgICAgICAgIHJldHVybiAiZnVuY3Rpb24iID09IHR5cGVvZiB0ID8gZnVuY3Rpb24oRCkgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB6KHQoRCkpOwogICAgICAgICAgICAgIH0gY2F0Y2ggKFIpIHsKICAgICAgICAgICAgICAgIE8oUik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IDogeDsKICAgICAgICAgIH0KICAgICAgICAgIHZhciB6LCBPLCBiYSA9IG5ldyBoKGZ1bmN0aW9uKHQsIHgpIHsKICAgICAgICAgICAgeiA9IHQ7CiAgICAgICAgICAgIE8gPSB4OwogICAgICAgICAgfSk7CiAgICAgICAgICB0aGlzLmNhbGxXaGVuU2V0dGxlZF8odjMoZiwgeiksIHYzKHEsIE8pKTsKICAgICAgICAgIHJldHVybiBiYTsKICAgICAgICB9OwogICAgICAgIGgucHJvdG90eXBlLmNhdGNoID0gZnVuY3Rpb24oZikgewogICAgICAgICAgcmV0dXJuIHRoaXMudGhlbih2b2lkIDAsIGYpOwogICAgICAgIH07CiAgICAgICAgaC5wcm90b3R5cGUuY2FsbFdoZW5TZXR0bGVkXyA9IGZ1bmN0aW9uKGYsIHEpIHsKICAgICAgICAgIGZ1bmN0aW9uIHYzKCkgewogICAgICAgICAgICBzd2l0Y2ggKHouc3RhdGVfKSB7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgZih6LnJlc3VsdF8pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgcSh6LnJlc3VsdF8pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCJVbmV4cGVjdGVkIHN0YXRlOiAiICsgei5zdGF0ZV8pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgeiA9IHRoaXM7CiAgICAgICAgICBudWxsID09IHRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXyA/IEEuYXN5bmNFeGVjdXRlKHYzKSA6IHRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXy5wdXNoKHYzKTsKICAgICAgICAgIHRoaXMuaXNSZWplY3Rpb25IYW5kbGVkXyA9IHRydWU7CiAgICAgICAgfTsKICAgICAgICBoLnJlc29sdmUgPSBsOwogICAgICAgIGgucmVqZWN0ID0gZnVuY3Rpb24oZikgewogICAgICAgICAgcmV0dXJuIG5ldyBoKGZ1bmN0aW9uKHEsIHYzKSB7CiAgICAgICAgICAgIHYzKGYpOwogICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBoLnJhY2UgPSBmdW5jdGlvbihmKSB7CiAgICAgICAgICByZXR1cm4gbmV3IGgoZnVuY3Rpb24ocSwgdjMpIHsKICAgICAgICAgICAgZm9yICh2YXIgeiA9ICRqc2NvbXAubWFrZUl0ZXJhdG9yKGYpLCBPID0gei5uZXh0KCk7ICFPLmRvbmU7IE8gPSB6Lm5leHQoKSkgbChPLnZhbHVlKS5jYWxsV2hlblNldHRsZWRfKHEsIHYzKTsKICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgaC5hbGwgPSBmdW5jdGlvbihmKSB7CiAgICAgICAgICB2YXIgcSA9ICRqc2NvbXAubWFrZUl0ZXJhdG9yKGYpLCB2MyA9IHEubmV4dCgpOwogICAgICAgICAgcmV0dXJuIHYzLmRvbmUgPyBsKFtdKSA6IG5ldyBoKGZ1bmN0aW9uKHosIE8pIHsKICAgICAgICAgICAgZnVuY3Rpb24gYmEoRCkgewogICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihSKSB7CiAgICAgICAgICAgICAgICB0W0RdID0gUjsKICAgICAgICAgICAgICAgIHgtLTsKICAgICAgICAgICAgICAgIDAgPT0geCAmJiB6KHQpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHQgPSBbXSwgeCA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgICAgdC5wdXNoKHZvaWQgMCksIHgrKywgbCh2My52YWx1ZSkuY2FsbFdoZW5TZXR0bGVkXyhiYSh0Lmxlbmd0aCAtIDEpLCBPKSwgdjMgPSBxLm5leHQoKTsKICAgICAgICAgICAgd2hpbGUgKCF2My5kb25lKTsKICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGg7CiAgICAgIH0sICJlczYiLCAiZXMzIik7CiAgICAgICRqc2NvbXAub3ducyA9IGZ1bmN0aW9uKGssIG4pIHsKICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGssIG4pOwogICAgICB9OwogICAgICAkanNjb21wLmFzc2lnbiA9ICRqc2NvbXAuVFJVU1RfRVM2X1BPTFlGSUxMUyAmJiAiZnVuY3Rpb24iID09IHR5cGVvZiBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uKGssIG4pIHsKICAgICAgICBmb3IgKHZhciBsID0gMTsgbCA8IGFyZ3VtZW50cy5sZW5ndGg7IGwrKykgewogICAgICAgICAgdmFyIHAgPSBhcmd1bWVudHNbbF07CiAgICAgICAgICBpZiAocCkgZm9yICh2YXIgaCBpbiBwKSAkanNjb21wLm93bnMocCwgaCkgJiYgKGtbaF0gPSBwW2hdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGs7CiAgICAgIH07CiAgICAgICRqc2NvbXAucG9seWZpbGwoIk9iamVjdC5hc3NpZ24iLCBmdW5jdGlvbihrKSB7CiAgICAgICAgcmV0dXJuIGsgfHwgJGpzY29tcC5hc3NpZ247CiAgICAgIH0sICJlczYiLCAiZXMzIik7CiAgICAgICRqc2NvbXAuY2hlY2tTdHJpbmdBcmdzID0gZnVuY3Rpb24oaywgbiwgbCkgewogICAgICAgIGlmIChudWxsID09IGspIHRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSAndGhpcycgdmFsdWUgZm9yIFN0cmluZy5wcm90b3R5cGUuIiArIGwgKyAiIG11c3Qgbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkIik7CiAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBSZWdFeHApIHRocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IHRvIFN0cmluZy5wcm90b3R5cGUuIiArIGwgKyAiIG11c3Qgbm90IGJlIGEgcmVndWxhciBleHByZXNzaW9uIik7CiAgICAgICAgcmV0dXJuIGsgKyAiIjsKICAgICAgfTsKICAgICAgJGpzY29tcC5wb2x5ZmlsbCgiU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoIiwgZnVuY3Rpb24oaykgewogICAgICAgIHJldHVybiBrID8gayA6IGZ1bmN0aW9uKG4sIGwpIHsKICAgICAgICAgIHZhciBwID0gJGpzY29tcC5jaGVja1N0cmluZ0FyZ3ModGhpcywgbiwgInN0YXJ0c1dpdGgiKTsKICAgICAgICAgIG4gKz0gIiI7CiAgICAgICAgICB2YXIgaCA9IHAubGVuZ3RoLCBBID0gbi5sZW5ndGg7CiAgICAgICAgICBsID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obCB8IDAsIHAubGVuZ3RoKSk7CiAgICAgICAgICBmb3IgKHZhciBmID0gMDsgZiA8IEEgJiYgbCA8IGg7ICkgaWYgKHBbbCsrXSAhPSBuW2YrK10pIHJldHVybiBmYWxzZTsKICAgICAgICAgIHJldHVybiBmID49IEE7CiAgICAgICAgfTsKICAgICAgfSwgImVzNiIsICJlczMiKTsKICAgICAgJGpzY29tcC5wb2x5ZmlsbCgiQXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4iLCBmdW5jdGlvbihrKSB7CiAgICAgICAgZnVuY3Rpb24gbihsKSB7CiAgICAgICAgICBsID0gTnVtYmVyKGwpOwogICAgICAgICAgcmV0dXJuIEluZmluaXR5ID09PSBsIHx8IC1JbmZpbml0eSA9PT0gbCA/IGwgOiBsIHwgMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGsgPyBrIDogZnVuY3Rpb24obCwgcCwgaCkgewogICAgICAgICAgdmFyIEEgPSB0aGlzLmxlbmd0aDsKICAgICAgICAgIGwgPSBuKGwpOwogICAgICAgICAgcCA9IG4ocCk7CiAgICAgICAgICBoID0gdm9pZCAwID09PSBoID8gQSA6IG4oaCk7CiAgICAgICAgICBsID0gMCA+IGwgPyBNYXRoLm1heChBICsgbCwgMCkgOiBNYXRoLm1pbihsLCBBKTsKICAgICAgICAgIHAgPSAwID4gcCA/IE1hdGgubWF4KEEgKyBwLCAwKSA6IE1hdGgubWluKHAsIEEpOwogICAgICAgICAgaCA9IDAgPiBoID8gTWF0aC5tYXgoQSArIGgsIDApIDogTWF0aC5taW4oaCwgQSk7CiAgICAgICAgICBpZiAobCA8IHApIGZvciAoOyBwIDwgaDsgKSBwIGluIHRoaXMgPyB0aGlzW2wrK10gPSB0aGlzW3ArK10gOiAoZGVsZXRlIHRoaXNbbCsrXSwgcCsrKTsKICAgICAgICAgIGVsc2UgZm9yIChoID0gTWF0aC5taW4oaCwgQSArIHAgLSBsKSwgbCArPSBoIC0gcDsgaCA+IHA7ICkgLS1oIGluIHRoaXMgPyB0aGlzWy0tbF0gPSB0aGlzW2hdIDogZGVsZXRlIHRoaXNbLS1sXTsKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgIH0sICJlczYiLCAiZXMzIik7CiAgICAgICRqc2NvbXAudHlwZWRBcnJheUNvcHlXaXRoaW4gPSBmdW5jdGlvbihrKSB7CiAgICAgICAgcmV0dXJuIGsgPyBrIDogQXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW47CiAgICAgIH07CiAgICAgICRqc2NvbXAucG9seWZpbGwoIkludDhBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiIsICRqc2NvbXAudHlwZWRBcnJheUNvcHlXaXRoaW4sICJlczYiLCAiZXM1Iik7CiAgICAgICRqc2NvbXAucG9seWZpbGwoIlVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4iLCAkanNjb21wLnR5cGVkQXJyYXlDb3B5V2l0aGluLCAiZXM2IiwgImVzNSIpOwogICAgICAkanNjb21wLnBvbHlmaWxsKCJVaW50OENsYW1wZWRBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiIsICRqc2NvbXAudHlwZWRBcnJheUNvcHlXaXRoaW4sICJlczYiLCAiZXM1Iik7CiAgICAgICRqc2NvbXAucG9seWZpbGwoIkludDE2QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4iLCAkanNjb21wLnR5cGVkQXJyYXlDb3B5V2l0aGluLCAiZXM2IiwgImVzNSIpOwogICAgICAkanNjb21wLnBvbHlmaWxsKCJVaW50MTZBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiIsICRqc2NvbXAudHlwZWRBcnJheUNvcHlXaXRoaW4sICJlczYiLCAiZXM1Iik7CiAgICAgICRqc2NvbXAucG9seWZpbGwoIkludDMyQXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4iLCAkanNjb21wLnR5cGVkQXJyYXlDb3B5V2l0aGluLCAiZXM2IiwgImVzNSIpOwogICAgICAkanNjb21wLnBvbHlmaWxsKCJVaW50MzJBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiIsICRqc2NvbXAudHlwZWRBcnJheUNvcHlXaXRoaW4sICJlczYiLCAiZXM1Iik7CiAgICAgICRqc2NvbXAucG9seWZpbGwoIkZsb2F0MzJBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiIsICRqc2NvbXAudHlwZWRBcnJheUNvcHlXaXRoaW4sICJlczYiLCAiZXM1Iik7CiAgICAgICRqc2NvbXAucG9seWZpbGwoIkZsb2F0NjRBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiIsICRqc2NvbXAudHlwZWRBcnJheUNvcHlXaXRoaW4sICJlczYiLCAiZXM1Iik7CiAgICAgIHZhciBEcmFjb0RlY29kZXJNb2R1bGUgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGsgPSAidW5kZWZpbmVkIiAhPT0gdHlwZW9mIGRvY3VtZW50ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgPyBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyA6IHZvaWQgMDsKICAgICAgICAidW5kZWZpbmVkIiAhPT0gdHlwZW9mIF9fZmlsZW5hbWUgJiYgKGsgPSBrIHx8IF9fZmlsZW5hbWUpOwogICAgICAgIHJldHVybiBmdW5jdGlvbihuKSB7CiAgICAgICAgICBmdW5jdGlvbiBsKGUpIHsKICAgICAgICAgICAgcmV0dXJuIGEzLmxvY2F0ZUZpbGUgPyBhMy5sb2NhdGVGaWxlKGUsIFUpIDogVSArIGU7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBwKGUsIGIsIGMpIHsKICAgICAgICAgICAgdmFyIGQgPSBiICsgYzsKICAgICAgICAgICAgZm9yIChjID0gYjsgZVtjXSAmJiAhKGMgPj0gZCk7ICkgKytjOwogICAgICAgICAgICBpZiAoMTYgPCBjIC0gYiAmJiBlLmJ1ZmZlciAmJiB2YSkgcmV0dXJuIHZhLmRlY29kZShlLnN1YmFycmF5KGIsIGMpKTsKICAgICAgICAgICAgZm9yIChkID0gIiI7IGIgPCBjOyApIHsKICAgICAgICAgICAgICB2YXIgZyA9IGVbYisrXTsKICAgICAgICAgICAgICBpZiAoZyAmIDEyOCkgewogICAgICAgICAgICAgICAgdmFyIHUzID0gZVtiKytdICYgNjM7CiAgICAgICAgICAgICAgICBpZiAoMTkyID09IChnICYgMjI0KSkgZCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChnICYgMzEpIDw8IDYgfCB1Myk7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgdmFyIFggPSBlW2IrK10gJiA2MzsKICAgICAgICAgICAgICAgICAgZyA9IDIyNCA9PSAoZyAmIDI0MCkgPyAoZyAmIDE1KSA8PCAxMiB8IHUzIDw8IDYgfCBYIDogKGcgJiA3KSA8PCAxOCB8IHUzIDw8IDEyIHwgWCA8PCA2IHwgZVtiKytdICYgNjM7CiAgICAgICAgICAgICAgICAgIDY1NTM2ID4gZyA/IGQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShnKSA6IChnIC09IDY1NTM2LCBkICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTYgfCBnID4+IDEwLCA1NjMyMCB8IGcgJiAxMDIzKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIGQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIGgoZSwgYikgewogICAgICAgICAgICByZXR1cm4gZSA/IHAoZWEsIGUsIGIpIDogIiI7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBBKCkgewogICAgICAgICAgICB2YXIgZSA9IGphLmJ1ZmZlcjsKICAgICAgICAgICAgYTMuSEVBUDggPSBZID0gbmV3IEludDhBcnJheShlKTsKICAgICAgICAgICAgYTMuSEVBUDE2ID0gbmV3IEludDE2QXJyYXkoZSk7CiAgICAgICAgICAgIGEzLkhFQVAzMiA9IGNhID0gbmV3IEludDMyQXJyYXkoZSk7CiAgICAgICAgICAgIGEzLkhFQVBVOCA9IGVhID0gbmV3IFVpbnQ4QXJyYXkoZSk7CiAgICAgICAgICAgIGEzLkhFQVBVMTYgPSBuZXcgVWludDE2QXJyYXkoZSk7CiAgICAgICAgICAgIGEzLkhFQVBVMzIgPSBWID0gbmV3IFVpbnQzMkFycmF5KGUpOwogICAgICAgICAgICBhMy5IRUFQRjMyID0gbmV3IEZsb2F0MzJBcnJheShlKTsKICAgICAgICAgICAgYTMuSEVBUEY2NCA9IG5ldyBGbG9hdDY0QXJyYXkoZSk7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBmKGUpIHsKICAgICAgICAgICAgaWYgKGEzLm9uQWJvcnQpIGEzLm9uQWJvcnQoZSk7CiAgICAgICAgICAgIGUgPSAiQWJvcnRlZCgiICsgZSArICIpIjsKICAgICAgICAgICAgZGEoZSk7CiAgICAgICAgICAgIHdhID0gdHJ1ZTsKICAgICAgICAgICAgZSA9IG5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3IoZSArICIuIEJ1aWxkIHdpdGggLXNBU1NFUlRJT05TIGZvciBtb3JlIGluZm8uIik7CiAgICAgICAgICAgIGthKGUpOwogICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gcShlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgaWYgKGUgPT0gUCAmJiBmYSkgcmV0dXJuIG5ldyBVaW50OEFycmF5KGZhKTsKICAgICAgICAgICAgICBpZiAobWEpIHJldHVybiBtYShlKTsKICAgICAgICAgICAgICB0aHJvdyAiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQiOwogICAgICAgICAgICB9IGNhdGNoIChiKSB7CiAgICAgICAgICAgICAgZihiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gdjMoKSB7CiAgICAgICAgICAgIGlmICghZmEgJiYgKHhhIHx8IGhhKSkgewogICAgICAgICAgICAgIGlmICgiZnVuY3Rpb24iID09IHR5cGVvZiBmZXRjaCAmJiAhUC5zdGFydHNXaXRoKCJmaWxlOi8vIikpIHJldHVybiBmZXRjaChQLCB7IGNyZWRlbnRpYWxzOiAic2FtZS1vcmlnaW4iIH0pLnRoZW4oZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKCFlLm9rKSB0aHJvdyAiZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnIiArIFAgKyAiJyI7CiAgICAgICAgICAgICAgICByZXR1cm4gZS5hcnJheUJ1ZmZlcigpOwogICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHEoUCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgaWYgKG5hKSByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSwgYikgewogICAgICAgICAgICAgICAgbmEoUCwgZnVuY3Rpb24oYykgewogICAgICAgICAgICAgICAgICBlKG5ldyBVaW50OEFycmF5KGMpKTsKICAgICAgICAgICAgICAgIH0sIGIpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiBxKFApOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIHooZSkgewogICAgICAgICAgICBmb3IgKDsgMCA8IGUubGVuZ3RoOyApIGUuc2hpZnQoKShhMyk7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBPKGUpIHsKICAgICAgICAgICAgdGhpcy5leGNQdHIgPSBlOwogICAgICAgICAgICB0aGlzLnB0ciA9IGUgLSAyNDsKICAgICAgICAgICAgdGhpcy5zZXRfdHlwZSA9IGZ1bmN0aW9uKGIpIHsKICAgICAgICAgICAgICBWW3RoaXMucHRyICsgNCA+PiAyXSA9IGI7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuZ2V0X3R5cGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICByZXR1cm4gVlt0aGlzLnB0ciArIDQgPj4gMl07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuc2V0X2Rlc3RydWN0b3IgPSBmdW5jdGlvbihiKSB7CiAgICAgICAgICAgICAgVlt0aGlzLnB0ciArIDggPj4gMl0gPSBiOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLmdldF9kZXN0cnVjdG9yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgcmV0dXJuIFZbdGhpcy5wdHIgKyA4ID4+IDJdOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLnNldF9yZWZjb3VudCA9IGZ1bmN0aW9uKGIpIHsKICAgICAgICAgICAgICBjYVt0aGlzLnB0ciA+PiAyXSA9IGI7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuc2V0X2NhdWdodCA9IGZ1bmN0aW9uKGIpIHsKICAgICAgICAgICAgICBZW3RoaXMucHRyICsgMTIgPj4gMF0gPSBiID8gMSA6IDA7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuZ2V0X2NhdWdodCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiAwICE9IFlbdGhpcy5wdHIgKyAxMiA+PiAwXTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5zZXRfcmV0aHJvd24gPSBmdW5jdGlvbihiKSB7CiAgICAgICAgICAgICAgWVt0aGlzLnB0ciArIDEzID4+IDBdID0gYiA/IDEgOiAwOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLmdldF9yZXRocm93biA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiAwICE9IFlbdGhpcy5wdHIgKyAxMyA+PiAwXTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5pbml0ID0gZnVuY3Rpb24oYiwgYykgewogICAgICAgICAgICAgIHRoaXMuc2V0X2FkanVzdGVkX3B0cigwKTsKICAgICAgICAgICAgICB0aGlzLnNldF90eXBlKGIpOwogICAgICAgICAgICAgIHRoaXMuc2V0X2Rlc3RydWN0b3IoYyk7CiAgICAgICAgICAgICAgdGhpcy5zZXRfcmVmY291bnQoMCk7CiAgICAgICAgICAgICAgdGhpcy5zZXRfY2F1Z2h0KGZhbHNlKTsKICAgICAgICAgICAgICB0aGlzLnNldF9yZXRocm93bihmYWxzZSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuYWRkX3JlZiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNhW3RoaXMucHRyID4+IDJdICs9IDE7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMucmVsZWFzZV9yZWYgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICB2YXIgYiA9IGNhW3RoaXMucHRyID4+IDJdOwogICAgICAgICAgICAgIGNhW3RoaXMucHRyID4+IDJdID0gYiAtIDE7CiAgICAgICAgICAgICAgcmV0dXJuIDEgPT09IGI7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuc2V0X2FkanVzdGVkX3B0ciA9IGZ1bmN0aW9uKGIpIHsKICAgICAgICAgICAgICBWW3RoaXMucHRyICsgMTYgPj4gMl0gPSBiOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLmdldF9hZGp1c3RlZF9wdHIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICByZXR1cm4gVlt0aGlzLnB0ciArIDE2ID4+IDJdOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLmdldF9leGNlcHRpb25fcHRyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgaWYgKHlhKHRoaXMuZ2V0X3R5cGUoKSkpIHJldHVybiBWW3RoaXMuZXhjUHRyID4+IDJdOwogICAgICAgICAgICAgIHZhciBiID0gdGhpcy5nZXRfYWRqdXN0ZWRfcHRyKCk7CiAgICAgICAgICAgICAgcmV0dXJuIDAgIT09IGIgPyBiIDogdGhpcy5leGNQdHI7CiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBiYSgpIHsKICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICBpZiAoIWxhICYmIChsYSA9IHRydWUsIGEzLmNhbGxlZFJ1biA9IHRydWUsICF3YSkpIHsKICAgICAgICAgICAgICAgIHphID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHoob2EpOwogICAgICAgICAgICAgICAgQWEoYTMpOwogICAgICAgICAgICAgICAgaWYgKGEzLm9uUnVudGltZUluaXRpYWxpemVkKSBhMy5vblJ1bnRpbWVJbml0aWFsaXplZCgpOwogICAgICAgICAgICAgICAgaWYgKGEzLnBvc3RSdW4pIGZvciAoImZ1bmN0aW9uIiA9PSB0eXBlb2YgYTMucG9zdFJ1biAmJiAoYTMucG9zdFJ1biA9IFthMy5wb3N0UnVuXSk7IGEzLnBvc3RSdW4ubGVuZ3RoOyApIEJhLnVuc2hpZnQoYTMucG9zdFJ1bi5zaGlmdCgpKTsKICAgICAgICAgICAgICAgIHooQmEpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoISgwIDwgYWEpKSB7CiAgICAgICAgICAgICAgaWYgKGEzLnByZVJ1bikgZm9yICgiZnVuY3Rpb24iID09IHR5cGVvZiBhMy5wcmVSdW4gJiYgKGEzLnByZVJ1biA9IFthMy5wcmVSdW5dKTsgYTMucHJlUnVuLmxlbmd0aDsgKSBDYS51bnNoaWZ0KGEzLnByZVJ1bi5zaGlmdCgpKTsKICAgICAgICAgICAgICB6KENhKTsKICAgICAgICAgICAgICAwIDwgYWEgfHwgKGEzLnNldFN0YXR1cyA/IChhMy5zZXRTdGF0dXMoIlJ1bm5pbmcuLi4iKSwgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgIGEzLnNldFN0YXR1cygiIik7CiAgICAgICAgICAgICAgICB9LCAxKTsKICAgICAgICAgICAgICAgIGUoKTsKICAgICAgICAgICAgICB9LCAxKSkgOiBlKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24geChlKSB7CiAgICAgICAgICAgIHJldHVybiAoZSB8fCB0KS5fX2NhY2hlX187CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBEKGUsIGIpIHsKICAgICAgICAgICAgdmFyIGMgPSB4KGIpLCBkID0gY1tlXTsKICAgICAgICAgICAgaWYgKGQpIHJldHVybiBkOwogICAgICAgICAgICBkID0gT2JqZWN0LmNyZWF0ZSgoYiB8fCB0KS5wcm90b3R5cGUpOwogICAgICAgICAgICBkLnB0ciA9IGU7CiAgICAgICAgICAgIHJldHVybiBjW2VdID0gZDsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIFIoZSkgewogICAgICAgICAgICBpZiAoInN0cmluZyIgPT09IHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgYiA9IDAsIGMgPSAwOyBjIDwgZS5sZW5ndGg7ICsrYykgewogICAgICAgICAgICAgICAgdmFyIGQgPSBlLmNoYXJDb2RlQXQoYyk7CiAgICAgICAgICAgICAgICAxMjcgPj0gZCA/IGIrKyA6IDIwNDcgPj0gZCA/IGIgKz0gMiA6IDU1Mjk2IDw9IGQgJiYgNTczNDMgPj0gZCA/IChiICs9IDQsICsrYykgOiBiICs9IDM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGIgPSBBcnJheShiICsgMSk7CiAgICAgICAgICAgICAgYyA9IDA7CiAgICAgICAgICAgICAgZCA9IGIubGVuZ3RoOwogICAgICAgICAgICAgIGlmICgwIDwgZCkgewogICAgICAgICAgICAgICAgZCA9IGMgKyBkIC0gMTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGcgPSAwOyBnIDwgZS5sZW5ndGg7ICsrZykgewogICAgICAgICAgICAgICAgICB2YXIgdTMgPSBlLmNoYXJDb2RlQXQoZyk7CiAgICAgICAgICAgICAgICAgIGlmICg1NTI5NiA8PSB1MyAmJiA1NzM0MyA+PSB1MykgewogICAgICAgICAgICAgICAgICAgIHZhciBYID0gZS5jaGFyQ29kZUF0KCsrZyk7CiAgICAgICAgICAgICAgICAgICAgdTMgPSA2NTUzNiArICgodTMgJiAxMDIzKSA8PCAxMCkgfCBYICYgMTAyMzsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoMTI3ID49IHUzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGMgPj0gZCkgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgYltjKytdID0gdTM7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKDIwNDcgPj0gdTMpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmIChjICsgMSA+PSBkKSBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGJbYysrXSA9IDE5MiB8IHUzID4+IDY7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICg2NTUzNSA+PSB1MykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyArIDIgPj0gZCkgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGJbYysrXSA9IDIyNCB8IHUzID4+IDEyOwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgKyAzID49IGQpIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBiW2MrK10gPSAyNDAgfCB1MyA+PiAxODsKICAgICAgICAgICAgICAgICAgICAgICAgYltjKytdID0gMTI4IHwgdTMgPj4gMTIgJiA2MzsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGJbYysrXSA9IDEyOCB8IHUzID4+IDYgJiA2MzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYltjKytdID0gMTI4IHwgdTMgJiA2MzsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYltjXSA9IDA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGUgPSByLmFsbG9jKGIsIFkpOwogICAgICAgICAgICAgIHIuY29weShiLCBZLCBlKTsKICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIHBhKGUpIHsKICAgICAgICAgICAgaWYgKCJvYmplY3QiID09PSB0eXBlb2YgZSkgewogICAgICAgICAgICAgIHZhciBiID0gci5hbGxvYyhlLCBZKTsKICAgICAgICAgICAgICByLmNvcHkoZSwgWSwgYik7CiAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBaKCkgewogICAgICAgICAgICB0aHJvdyAiY2Fubm90IGNvbnN0cnVjdCBhIFZvaWRQdHIsIG5vIGNvbnN0cnVjdG9yIGluIElETCI7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBTKCkgewogICAgICAgICAgICB0aGlzLnB0ciA9IERhKCk7CiAgICAgICAgICAgIHgoUylbdGhpcy5wdHJdID0gdGhpczsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIFEoKSB7CiAgICAgICAgICAgIHRoaXMucHRyID0gRWEoKTsKICAgICAgICAgICAgeChRKVt0aGlzLnB0cl0gPSB0aGlzOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gVygpIHsKICAgICAgICAgICAgdGhpcy5wdHIgPSBGYSgpOwogICAgICAgICAgICB4KFcpW3RoaXMucHRyXSA9IHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiB3KCkgewogICAgICAgICAgICB0aGlzLnB0ciA9IEdhKCk7CiAgICAgICAgICAgIHgodylbdGhpcy5wdHJdID0gdGhpczsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIEMoKSB7CiAgICAgICAgICAgIHRoaXMucHRyID0gSGEoKTsKICAgICAgICAgICAgeChDKVt0aGlzLnB0cl0gPSB0aGlzOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gRigpIHsKICAgICAgICAgICAgdGhpcy5wdHIgPSBJYSgpOwogICAgICAgICAgICB4KEYpW3RoaXMucHRyXSA9IHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBHKCkgewogICAgICAgICAgICB0aGlzLnB0ciA9IEphKCk7CiAgICAgICAgICAgIHgoRylbdGhpcy5wdHJdID0gdGhpczsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIEUoKSB7CiAgICAgICAgICAgIHRoaXMucHRyID0gS2EoKTsKICAgICAgICAgICAgeChFKVt0aGlzLnB0cl0gPSB0aGlzOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gVCgpIHsKICAgICAgICAgICAgdGhpcy5wdHIgPSBMYSgpOwogICAgICAgICAgICB4KFQpW3RoaXMucHRyXSA9IHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBCKCkgewogICAgICAgICAgICB0aHJvdyAiY2Fubm90IGNvbnN0cnVjdCBhIFN0YXR1cywgbm8gY29uc3RydWN0b3IgaW4gSURMIjsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIEgoKSB7CiAgICAgICAgICAgIHRoaXMucHRyID0gTWEoKTsKICAgICAgICAgICAgeChIKVt0aGlzLnB0cl0gPSB0aGlzOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gSSgpIHsKICAgICAgICAgICAgdGhpcy5wdHIgPSBOYSgpOwogICAgICAgICAgICB4KEkpW3RoaXMucHRyXSA9IHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBKKCkgewogICAgICAgICAgICB0aGlzLnB0ciA9IE9hKCk7CiAgICAgICAgICAgIHgoSilbdGhpcy5wdHJdID0gdGhpczsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIEsoKSB7CiAgICAgICAgICAgIHRoaXMucHRyID0gUGEoKTsKICAgICAgICAgICAgeChLKVt0aGlzLnB0cl0gPSB0aGlzOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gTCgpIHsKICAgICAgICAgICAgdGhpcy5wdHIgPSBRYSgpOwogICAgICAgICAgICB4KEwpW3RoaXMucHRyXSA9IHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBNKCkgewogICAgICAgICAgICB0aGlzLnB0ciA9IFJhKCk7CiAgICAgICAgICAgIHgoTSlbdGhpcy5wdHJdID0gdGhpczsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIE4oKSB7CiAgICAgICAgICAgIHRoaXMucHRyID0gU2EoKTsKICAgICAgICAgICAgeChOKVt0aGlzLnB0cl0gPSB0aGlzOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24geSgpIHsKICAgICAgICAgICAgdGhpcy5wdHIgPSBUYSgpOwogICAgICAgICAgICB4KHkpW3RoaXMucHRyXSA9IHRoaXM7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBtKCkgewogICAgICAgICAgICB0aGlzLnB0ciA9IFVhKCk7CiAgICAgICAgICAgIHgobSlbdGhpcy5wdHJdID0gdGhpczsKICAgICAgICAgIH0KICAgICAgICAgIG4gPSB2b2lkIDAgPT09IG4gPyB7fSA6IG47CiAgICAgICAgICB2YXIgYTMgPSAidW5kZWZpbmVkIiAhPSB0eXBlb2YgbiA/IG4gOiB7fSwgQWEsIGthOwogICAgICAgICAgYTMucmVhZHkgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihlLCBiKSB7CiAgICAgICAgICAgIEFhID0gZTsKICAgICAgICAgICAga2EgPSBiOwogICAgICAgICAgfSk7CiAgICAgICAgICB2YXIgVmEgPSBmYWxzZSwgV2EgPSBmYWxzZTsKICAgICAgICAgIGEzLm9uUnVudGltZUluaXRpYWxpemVkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFZhID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKFdhICYmICJmdW5jdGlvbiIgPT09IHR5cGVvZiBhMy5vbk1vZHVsZUxvYWRlZCkgYTMub25Nb2R1bGVMb2FkZWQoYTMpOwogICAgICAgICAgfTsKICAgICAgICAgIGEzLm9uTW9kdWxlUGFyc2VkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFdhID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKFZhICYmICJmdW5jdGlvbiIgPT09IHR5cGVvZiBhMy5vbk1vZHVsZUxvYWRlZCkgYTMub25Nb2R1bGVMb2FkZWQoYTMpOwogICAgICAgICAgfTsKICAgICAgICAgIGEzLmlzVmVyc2lvblN1cHBvcnRlZCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgaWYgKCJzdHJpbmciICE9PSB0eXBlb2YgZSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICBlID0gZS5zcGxpdCgiLiIpOwogICAgICAgICAgICByZXR1cm4gMiA+IGUubGVuZ3RoIHx8IDMgPCBlLmxlbmd0aCA/IGZhbHNlIDogMSA9PSBlWzBdICYmIDAgPD0gZVsxXSAmJiA1ID49IGVbMV0gPyB0cnVlIDogMCAhPSBlWzBdIHx8IDEwIDwgZVsxXSA/IGZhbHNlIDogdHJ1ZTsKICAgICAgICAgIH07CiAgICAgICAgICB2YXIgWGEgPSBPYmplY3QuYXNzaWduKHt9LCBhMyksIHhhID0gIm9iamVjdCIgPT0gdHlwZW9mIHdpbmRvdywgaGEgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBpbXBvcnRTY3JpcHRzLCBZYSA9ICJvYmplY3QiID09IHR5cGVvZiBwcm9jZXNzICYmICJvYmplY3QiID09IHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zICYmICJzdHJpbmciID09IHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUsIFUgPSAiIjsKICAgICAgICAgIGlmIChZYSkgewogICAgICAgICAgICB2YXIgWmEgPSBfX3JlcXVpcmUoImZzIiksIHFhID0gX19yZXF1aXJlKCJwYXRoIik7CiAgICAgICAgICAgIFUgPSBoYSA/IHFhLmRpcm5hbWUoVSkgKyAiLyIgOiBfX2Rpcm5hbWUgKyAiLyI7CiAgICAgICAgICAgIHZhciAkYSA9IGZ1bmN0aW9uKGUsIGIpIHsKICAgICAgICAgICAgICBlID0gZS5zdGFydHNXaXRoKCJmaWxlOi8vIikgPyBuZXcgVVJMKGUpIDogcWEubm9ybWFsaXplKGUpOwogICAgICAgICAgICAgIHJldHVybiBaYS5yZWFkRmlsZVN5bmMoZSwgYiA/IHZvaWQgMCA6ICJ1dGY4Iik7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBtYSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICBlID0gJGEoZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgZS5idWZmZXIgfHwgKGUgPSBuZXcgVWludDhBcnJheShlKSk7CiAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBuYSA9IGZ1bmN0aW9uKGUsIGIsIGMpIHsKICAgICAgICAgICAgICBlID0gZS5zdGFydHNXaXRoKCJmaWxlOi8vIikgPyBuZXcgVVJMKGUpIDogcWEubm9ybWFsaXplKGUpOwogICAgICAgICAgICAgIFphLnJlYWRGaWxlKGUsIGZ1bmN0aW9uKGQsIGcpIHsKICAgICAgICAgICAgICAgIGQgPyBjKGQpIDogYihnLmJ1ZmZlcik7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIDEgPCBwcm9jZXNzLmFyZ3YubGVuZ3RoICYmIHByb2Nlc3MuYXJndlsxXS5yZXBsYWNlKC9cXC9nLCAiLyIpOwogICAgICAgICAgICBwcm9jZXNzLmFyZ3Yuc2xpY2UoMik7CiAgICAgICAgICAgIGEzLmluc3BlY3QgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICByZXR1cm4gIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIjsKICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSBpZiAoeGEgfHwgaGEpIGhhID8gVSA9IHNlbGYubG9jYXRpb24uaHJlZiA6ICJ1bmRlZmluZWQiICE9IHR5cGVvZiBkb2N1bWVudCAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmIChVID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLCBrICYmIChVID0gayksIFUgPSAwICE9PSBVLmluZGV4T2YoImJsb2I6IikgPyBVLnN1YnN0cigwLCBVLnJlcGxhY2UoL1s/I10uKi8sICIiKS5sYXN0SW5kZXhPZigiLyIpICsgMSkgOiAiIiwgJGEgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBiID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgIGIub3BlbigiR0VUIiwgZSwgZmFsc2UpOwogICAgICAgICAgICBiLnNlbmQobnVsbCk7CiAgICAgICAgICAgIHJldHVybiBiLnJlc3BvbnNlVGV4dDsKICAgICAgICAgIH0sIGhhICYmIChtYSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgdmFyIGIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgYi5vcGVuKCJHRVQiLCBlLCBmYWxzZSk7CiAgICAgICAgICAgIGIucmVzcG9uc2VUeXBlID0gImFycmF5YnVmZmVyIjsKICAgICAgICAgICAgYi5zZW5kKG51bGwpOwogICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYi5yZXNwb25zZSk7CiAgICAgICAgICB9KSwgbmEgPSBmdW5jdGlvbihlLCBiLCBjKSB7CiAgICAgICAgICAgIHZhciBkID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgIGQub3BlbigiR0VUIiwgZSwgdHJ1ZSk7CiAgICAgICAgICAgIGQucmVzcG9uc2VUeXBlID0gImFycmF5YnVmZmVyIjsKICAgICAgICAgICAgZC5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAyMDAgPT0gZC5zdGF0dXMgfHwgMCA9PSBkLnN0YXR1cyAmJiBkLnJlc3BvbnNlID8gYihkLnJlc3BvbnNlKSA6IGMoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZC5vbmVycm9yID0gYzsKICAgICAgICAgICAgZC5zZW5kKG51bGwpOwogICAgICAgICAgfTsKICAgICAgICAgIHZhciB1ZCA9IGEzLnByaW50IHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksIGRhID0gYTMucHJpbnRFcnIgfHwgY29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7CiAgICAgICAgICBPYmplY3QuYXNzaWduKGEzLCBYYSk7CiAgICAgICAgICBYYSA9IG51bGw7CiAgICAgICAgICB2YXIgZmE7CiAgICAgICAgICBhMy53YXNtQmluYXJ5ICYmIChmYSA9IGEzLndhc21CaW5hcnkpOwogICAgICAgICAgIm9iamVjdCIgIT0gdHlwZW9mIFdlYkFzc2VtYmx5ICYmIGYoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKTsKICAgICAgICAgIHZhciBqYSwgd2EgPSBmYWxzZSwgdmEgPSAidW5kZWZpbmVkIiAhPSB0eXBlb2YgVGV4dERlY29kZXIgPyBuZXcgVGV4dERlY29kZXIoInV0ZjgiKSA6IHZvaWQgMCwgWSwgZWEsIGNhLCBWLCBDYSA9IFtdLCBvYSA9IFtdLCBCYSA9IFtdLCB6YSA9IGZhbHNlLCBhYSA9IDAsIHJhID0gbnVsbCwgaWEgPSBudWxsOwogICAgICAgICAgdmFyIFAgPSAiZHJhY29fZGVjb2Rlci53YXNtIjsKICAgICAgICAgIFAuc3RhcnRzV2l0aCgiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCIpIHx8IChQID0gbChQKSk7CiAgICAgICAgICB2YXIgdmQgPSAwLCB3ZCA9IFtudWxsLCBbXSwgW11dLCB4ZCA9IHsgYjogZnVuY3Rpb24oZSwgYiwgYykgewogICAgICAgICAgICBuZXcgTyhlKS5pbml0KGIsIGMpOwogICAgICAgICAgICB2ZCsrOwogICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgfSwgYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGYoIiIpOwogICAgICAgICAgfSwgZzogZnVuY3Rpb24oZSwgYiwgYykgewogICAgICAgICAgICBlYS5jb3B5V2l0aGluKGUsIGIsIGIgKyBjKTsKICAgICAgICAgIH0sIGU6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgdmFyIGIgPSBlYS5sZW5ndGg7CiAgICAgICAgICAgIGUgPj4+PSAwOwogICAgICAgICAgICBpZiAoMjE0NzQ4MzY0OCA8IGUpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgZm9yICh2YXIgYyA9IDE7IDQgPj0gYzsgYyAqPSAyKSB7CiAgICAgICAgICAgICAgdmFyIGQgPSBiICogKDEgKyAwLjIgLyBjKTsKICAgICAgICAgICAgICBkID0gTWF0aC5taW4oZCwgZSArIDEwMDY2MzI5Nik7CiAgICAgICAgICAgICAgdmFyIGcgPSBNYXRoOwogICAgICAgICAgICAgIGQgPSBNYXRoLm1heChlLCBkKTsKICAgICAgICAgICAgICBnID0gZy5taW4uY2FsbChnLCAyMTQ3NDgzNjQ4LCBkICsgKDY1NTM2IC0gZCAlIDY1NTM2KSAlIDY1NTM2KTsKICAgICAgICAgICAgICBhOiB7CiAgICAgICAgICAgICAgICBkID0gamEuYnVmZmVyOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgamEuZ3JvdyhnIC0gZC5ieXRlTGVuZ3RoICsgNjU1MzUgPj4+IDE2KTsKICAgICAgICAgICAgICAgICAgQSgpOwogICAgICAgICAgICAgICAgICB2YXIgdTMgPSAxOwogICAgICAgICAgICAgICAgICBicmVhayBhOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoWCkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdTMgPSB2b2lkIDA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICh1MykgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfSwgZjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICByZXR1cm4gNTI7CiAgICAgICAgICB9LCBkOiBmdW5jdGlvbihlLCBiLCBjLCBkLCBnKSB7CiAgICAgICAgICAgIHJldHVybiA3MDsKICAgICAgICAgIH0sIGM6IGZ1bmN0aW9uKGUsIGIsIGMsIGQpIHsKICAgICAgICAgICAgZm9yICh2YXIgZyA9IDAsIHUzID0gMDsgdTMgPCBjOyB1MysrKSB7CiAgICAgICAgICAgICAgdmFyIFggPSBWW2IgPj4gMl0sIGFiID0gVltiICsgNCA+PiAyXTsKICAgICAgICAgICAgICBiICs9IDg7CiAgICAgICAgICAgICAgZm9yICh2YXIgc2EgPSAwOyBzYSA8IGFiOyBzYSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgdGEgPSBlYVtYICsgc2FdLCB1YSA9IHdkW2VdOwogICAgICAgICAgICAgICAgMCA9PT0gdGEgfHwgMTAgPT09IHRhID8gKCgxID09PSBlID8gdWQgOiBkYSkocCh1YSwgMCkpLCB1YS5sZW5ndGggPSAwKSA6IHVhLnB1c2godGEpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBnICs9IGFiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFZbZCA+PiAyXSA9IGc7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfSB9OwogICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmdW5jdGlvbiBlKGcsIHUzKSB7CiAgICAgICAgICAgICAgYTMuYXNtID0gZy5leHBvcnRzOwogICAgICAgICAgICAgIGphID0gYTMuYXNtLmg7CiAgICAgICAgICAgICAgQSgpOwogICAgICAgICAgICAgIG9hLnVuc2hpZnQoYTMuYXNtLmkpOwogICAgICAgICAgICAgIGFhLS07CiAgICAgICAgICAgICAgYTMubW9uaXRvclJ1bkRlcGVuZGVuY2llcyAmJiBhMy5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKGFhKTsKICAgICAgICAgICAgICAwID09IGFhICYmIChudWxsICE9PSByYSAmJiAoY2xlYXJJbnRlcnZhbChyYSksIHJhID0gbnVsbCksIGlhICYmIChnID0gaWEsIGlhID0gbnVsbCwgZygpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYihnKSB7CiAgICAgICAgICAgICAgZShnLmluc3RhbmNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjKGcpIHsKICAgICAgICAgICAgICByZXR1cm4gdjMoKS50aGVuKGZ1bmN0aW9uKHUzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUodTMsIGQpOwogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24odTMpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1MzsKICAgICAgICAgICAgICB9KS50aGVuKGcsIGZ1bmN0aW9uKHUzKSB7CiAgICAgICAgICAgICAgICBkYSgiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIiArIHUzKTsKICAgICAgICAgICAgICAgIGYodTMpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBkID0geyBhOiB4ZCB9OwogICAgICAgICAgICBhYSsrOwogICAgICAgICAgICBhMy5tb25pdG9yUnVuRGVwZW5kZW5jaWVzICYmIGEzLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoYWEpOwogICAgICAgICAgICBpZiAoYTMuaW5zdGFudGlhdGVXYXNtKSB0cnkgewogICAgICAgICAgICAgIHJldHVybiBhMy5pbnN0YW50aWF0ZVdhc20oZCwgZSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGcpIHsKICAgICAgICAgICAgICBkYSgiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIiArIGcpLCBrYShnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhIHx8ICJmdW5jdGlvbiIgIT0gdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nIHx8IFAuc3RhcnRzV2l0aCgiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCIpIHx8IFAuc3RhcnRzV2l0aCgiZmlsZTovLyIpIHx8IFlhIHx8ICJmdW5jdGlvbiIgIT0gdHlwZW9mIGZldGNoID8gYyhiKSA6IGZldGNoKFAsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkudGhlbihmdW5jdGlvbihnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcoZywgZCkudGhlbihiLCBmdW5jdGlvbih1MykgewogICAgICAgICAgICAgICAgICBkYSgid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIgKyB1Myk7CiAgICAgICAgICAgICAgICAgIGRhKCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpOwogICAgICAgICAgICAgICAgICByZXR1cm4gYyhiKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpLmNhdGNoKGthKTsKICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgfSkoKTsKICAgICAgICAgIHZhciBiYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfVm9pZFB0cl9fX2Rlc3Ryb3lfX18wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoYmIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX1ZvaWRQdHJfX19kZXN0cm95X19fMCA9IGEzLmFzbS5rKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgRGEgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJCdWZmZXJfRGVjb2RlckJ1ZmZlcl8wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoRGEgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJCdWZmZXJfRGVjb2RlckJ1ZmZlcl8wID0gYTMuYXNtLmwpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBjYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2RlckJ1ZmZlcl9Jbml0XzIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChjYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2RlckJ1ZmZlcl9Jbml0XzIgPSBhMy5hc20ubSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIGRiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyQnVmZmVyX19fZGVzdHJveV9fXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChkYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2RlckJ1ZmZlcl9fX2Rlc3Ryb3lfX18wID0gYTMuYXNtLm4pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBFYSA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlVHJhbnNmb3JtRGF0YV9BdHRyaWJ1dGVUcmFuc2Zvcm1EYXRhXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChFYSA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlVHJhbnNmb3JtRGF0YV9BdHRyaWJ1dGVUcmFuc2Zvcm1EYXRhXzAgPSBhMy5hc20ubykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIGViID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVUcmFuc2Zvcm1EYXRhX3RyYW5zZm9ybV90eXBlXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChlYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlVHJhbnNmb3JtRGF0YV90cmFuc2Zvcm1fdHlwZV8wID0gYTMuYXNtLnApLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBmYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlVHJhbnNmb3JtRGF0YV9fX2Rlc3Ryb3lfX18wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoZmIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZVRyYW5zZm9ybURhdGFfX19kZXN0cm95X19fMCA9IGEzLmFzbS5xKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgRmEgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0dlb21ldHJ5QXR0cmlidXRlX0dlb21ldHJ5QXR0cmlidXRlXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChGYSA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfR2VvbWV0cnlBdHRyaWJ1dGVfR2VvbWV0cnlBdHRyaWJ1dGVfMCA9IGEzLmFzbS5yKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgZ2IgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0dlb21ldHJ5QXR0cmlidXRlX19fZGVzdHJveV9fXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChnYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfR2VvbWV0cnlBdHRyaWJ1dGVfX19kZXN0cm95X19fMCA9IGEzLmFzbS5zKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgR2EgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX1BvaW50QXR0cmlidXRlXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChHYSA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfUG9pbnRBdHRyaWJ1dGVfMCA9IGEzLmFzbS50KS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgaGIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX3NpemVfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKGhiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9zaXplXzAgPSBhMy5hc20udSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIGliID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9HZXRBdHRyaWJ1dGVUcmFuc2Zvcm1EYXRhXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChpYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfR2V0QXR0cmlidXRlVHJhbnNmb3JtRGF0YV8wID0gYTMuYXNtLnYpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBqYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfYXR0cmlidXRlX3R5cGVfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKGpiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9hdHRyaWJ1dGVfdHlwZV8wID0gYTMuYXNtLncpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBrYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfZGF0YV90eXBlXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChrYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfZGF0YV90eXBlXzAgPSBhMy5hc20ueCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIGxiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9udW1fY29tcG9uZW50c18wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAobGIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX251bV9jb21wb25lbnRzXzAgPSBhMy5hc20ueSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIG1iID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9ub3JtYWxpemVkXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChtYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfbm9ybWFsaXplZF8wID0gYTMuYXNtLnopLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBuYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfYnl0ZV9zdHJpZGVfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKG5iID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9ieXRlX3N0cmlkZV8wID0gYTMuYXNtLkEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBvYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfYnl0ZV9vZmZzZXRfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKG9iID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9ieXRlX29mZnNldF8wID0gYTMuYXNtLkIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBwYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfdW5pcXVlX2lkXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChwYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfdW5pcXVlX2lkXzAgPSBhMy5hc20uQykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIHFiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9fX2Rlc3Ryb3lfX18wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAocWIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX19fZGVzdHJveV9fXzAgPSBhMy5hc20uRCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIEhhID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1fQXR0cmlidXRlUXVhbnRpemF0aW9uVHJhbnNmb3JtXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChIYSA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlUXVhbnRpemF0aW9uVHJhbnNmb3JtX0F0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybV8wID0gYTMuYXNtLkUpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCByYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlUXVhbnRpemF0aW9uVHJhbnNmb3JtX0luaXRGcm9tQXR0cmlidXRlXzEgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChyYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlUXVhbnRpemF0aW9uVHJhbnNmb3JtX0luaXRGcm9tQXR0cmlidXRlXzEgPSBhMy5hc20uRikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIHNiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1fcXVhbnRpemF0aW9uX2JpdHNfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKHNiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1fcXVhbnRpemF0aW9uX2JpdHNfMCA9IGEzLmFzbS5HKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgdGIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybV9taW5fdmFsdWVfMSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKHRiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1fbWluX3ZhbHVlXzEgPSBhMy5hc20uSCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIHViID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1fcmFuZ2VfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKHViID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1fcmFuZ2VfMCA9IGEzLmFzbS5JKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgdmIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybV9fX2Rlc3Ryb3lfX18wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAodmIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybV9fX2Rlc3Ryb3lfX18wID0gYTMuYXNtLkopLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBJYSA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlT2N0YWhlZHJvblRyYW5zZm9ybV9BdHRyaWJ1dGVPY3RhaGVkcm9uVHJhbnNmb3JtXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChJYSA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlT2N0YWhlZHJvblRyYW5zZm9ybV9BdHRyaWJ1dGVPY3RhaGVkcm9uVHJhbnNmb3JtXzAgPSBhMy5hc20uSykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIHdiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVPY3RhaGVkcm9uVHJhbnNmb3JtX0luaXRGcm9tQXR0cmlidXRlXzEgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICh3YiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlT2N0YWhlZHJvblRyYW5zZm9ybV9Jbml0RnJvbUF0dHJpYnV0ZV8xID0gYTMuYXNtLkwpLmFwcGx5KAogICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICk7CiAgICAgICAgICB9LCB4YiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlT2N0YWhlZHJvblRyYW5zZm9ybV9xdWFudGl6YXRpb25fYml0c18wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoeGIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZU9jdGFoZWRyb25UcmFuc2Zvcm1fcXVhbnRpemF0aW9uX2JpdHNfMCA9IGEzLmFzbS5NKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgeWIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZU9jdGFoZWRyb25UcmFuc2Zvcm1fX19kZXN0cm95X19fMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKHliID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVPY3RhaGVkcm9uVHJhbnNmb3JtX19fZGVzdHJveV9fXzAgPSBhMy5hc20uTikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIEphID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludENsb3VkX1BvaW50Q2xvdWRfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKEphID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludENsb3VkX1BvaW50Q2xvdWRfMCA9IGEzLmFzbS5PKS5hcHBseSgKICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgIGFyZ3VtZW50cwogICAgICAgICAgICApOwogICAgICAgICAgfSwgemIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX1BvaW50Q2xvdWRfbnVtX2F0dHJpYnV0ZXNfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKHpiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludENsb3VkX251bV9hdHRyaWJ1dGVzXzAgPSBhMy5hc20uUCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIEFiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludENsb3VkX251bV9wb2ludHNfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKEFiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludENsb3VkX251bV9wb2ludHNfMCA9IGEzLmFzbS5RKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgQmIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX1BvaW50Q2xvdWRfX19kZXN0cm95X19fMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKEJiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludENsb3VkX19fZGVzdHJveV9fXzAgPSBhMy5hc20uUikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIEthID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9NZXNoX01lc2hfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKEthID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9NZXNoX01lc2hfMCA9IGEzLmFzbS5TKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgQ2IgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX01lc2hfbnVtX2ZhY2VzXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChDYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfTWVzaF9udW1fZmFjZXNfMCA9IGEzLmFzbS5UKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgRGIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX01lc2hfbnVtX2F0dHJpYnV0ZXNfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKERiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9NZXNoX251bV9hdHRyaWJ1dGVzXzAgPSBhMy5hc20uVSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIEViID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9NZXNoX251bV9wb2ludHNfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKEViID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9NZXNoX251bV9wb2ludHNfMCA9IGEzLmFzbS5WKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgRmIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX01lc2hfX19kZXN0cm95X19fMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKEZiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9NZXNoX19fZGVzdHJveV9fXzAgPSBhMy5hc20uVykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIExhID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YV9NZXRhZGF0YV8wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoTGEgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhX01ldGFkYXRhXzAgPSBhMy5hc20uWCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIEdiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YV9fX2Rlc3Ryb3lfX18wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoR2IgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhX19fZGVzdHJveV9fXzAgPSBhMy5hc20uWSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIEhiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9TdGF0dXNfY29kZV8wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoSGIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX1N0YXR1c19jb2RlXzAgPSBhMy5hc20uWikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIEliID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9TdGF0dXNfb2tfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKEliID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9TdGF0dXNfb2tfMCA9IGEzLmFzbS5fKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgSmIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX1N0YXR1c19lcnJvcl9tc2dfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKEpiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9TdGF0dXNfZXJyb3JfbXNnXzAgPSBhMy5hc20uJCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIEtiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9TdGF0dXNfX19kZXN0cm95X19fMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKEtiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9TdGF0dXNfX19kZXN0cm95X19fMCA9IGEzLmFzbS5hYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIE1hID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0Zsb2F0MzJBcnJheV9EcmFjb0Zsb2F0MzJBcnJheV8wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoTWEgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvRmxvYXQzMkFycmF5X0RyYWNvRmxvYXQzMkFycmF5XzAgPSBhMy5hc20uYmEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBMYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29GbG9hdDMyQXJyYXlfR2V0VmFsdWVfMSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKExiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0Zsb2F0MzJBcnJheV9HZXRWYWx1ZV8xID0gYTMuYXNtLmNhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgTWIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvRmxvYXQzMkFycmF5X3NpemVfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKE1iID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0Zsb2F0MzJBcnJheV9zaXplXzAgPSBhMy5hc20uZGEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBOYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29GbG9hdDMyQXJyYXlfX19kZXN0cm95X19fMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKE5iID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0Zsb2F0MzJBcnJheV9fX2Rlc3Ryb3lfX18wID0gYTMuYXNtLmVhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgTmEgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50OEFycmF5X0RyYWNvSW50OEFycmF5XzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChOYSA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQ4QXJyYXlfRHJhY29JbnQ4QXJyYXlfMCA9IGEzLmFzbS5mYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIE9iID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDhBcnJheV9HZXRWYWx1ZV8xID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoT2IgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50OEFycmF5X0dldFZhbHVlXzEgPSBhMy5hc20uZ2EpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBQYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQ4QXJyYXlfc2l6ZV8wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoUGIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50OEFycmF5X3NpemVfMCA9IGEzLmFzbS5oYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIFFiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDhBcnJheV9fX2Rlc3Ryb3lfX18wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoUWIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50OEFycmF5X19fZGVzdHJveV9fXzAgPSBhMy5hc20uaWEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBPYSA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50OEFycmF5X0RyYWNvVUludDhBcnJheV8wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoT2EgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDhBcnJheV9EcmFjb1VJbnQ4QXJyYXlfMCA9IGEzLmFzbS5qYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIFJiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQ4QXJyYXlfR2V0VmFsdWVfMSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKFJiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQ4QXJyYXlfR2V0VmFsdWVfMSA9IGEzLmFzbS5rYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIFNiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQ4QXJyYXlfc2l6ZV8wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoU2IgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDhBcnJheV9zaXplXzAgPSBhMy5hc20ubGEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBUYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50OEFycmF5X19fZGVzdHJveV9fXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChUYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50OEFycmF5X19fZGVzdHJveV9fXzAgPSBhMy5hc20ubWEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBQYSA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQxNkFycmF5X0RyYWNvSW50MTZBcnJheV8wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoUGEgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50MTZBcnJheV9EcmFjb0ludDE2QXJyYXlfMCA9IGEzLmFzbS5uYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIFViID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDE2QXJyYXlfR2V0VmFsdWVfMSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKFViID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDE2QXJyYXlfR2V0VmFsdWVfMSA9IGEzLmFzbS5vYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIFZiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDE2QXJyYXlfc2l6ZV8wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoVmIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50MTZBcnJheV9zaXplXzAgPSBhMy5hc20ucGEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBXYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQxNkFycmF5X19fZGVzdHJveV9fXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChXYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQxNkFycmF5X19fZGVzdHJveV9fXzAgPSBhMy5hc20ucWEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBRYSA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MTZBcnJheV9EcmFjb1VJbnQxNkFycmF5XzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChRYSA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MTZBcnJheV9EcmFjb1VJbnQxNkFycmF5XzAgPSBhMy5hc20ucmEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBYYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MTZBcnJheV9HZXRWYWx1ZV8xID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoWGIgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDE2QXJyYXlfR2V0VmFsdWVfMSA9IGEzLmFzbS5zYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIFliID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQxNkFycmF5X3NpemVfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKFliID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQxNkFycmF5X3NpemVfMCA9IGEzLmFzbS50YSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIFpiID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQxNkFycmF5X19fZGVzdHJveV9fXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChaYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MTZBcnJheV9fX2Rlc3Ryb3lfX18wID0gYTMuYXNtLnVhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgUmEgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50MzJBcnJheV9EcmFjb0ludDMyQXJyYXlfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKFJhID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDMyQXJyYXlfRHJhY29JbnQzMkFycmF5XzAgPSBhMy5hc20udmEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCAkYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQzMkFycmF5X0dldFZhbHVlXzEgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICgkYiA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQzMkFycmF5X0dldFZhbHVlXzEgPSBhMy5hc20ud2EpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBhYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQzMkFycmF5X3NpemVfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKGFjID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDMyQXJyYXlfc2l6ZV8wID0gYTMuYXNtLnhhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgYmMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50MzJBcnJheV9fX2Rlc3Ryb3lfX18wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoYmMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50MzJBcnJheV9fX2Rlc3Ryb3lfX18wID0gYTMuYXNtLnlhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgU2EgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDMyQXJyYXlfRHJhY29VSW50MzJBcnJheV8wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoU2EgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDMyQXJyYXlfRHJhY29VSW50MzJBcnJheV8wID0gYTMuYXNtLnphKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgY2MgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDMyQXJyYXlfR2V0VmFsdWVfMSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKGNjID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQzMkFycmF5X0dldFZhbHVlXzEgPSBhMy5hc20uQWEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBkYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MzJBcnJheV9zaXplXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChkYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MzJBcnJheV9zaXplXzAgPSBhMy5hc20uQmEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBlYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MzJBcnJheV9fX2Rlc3Ryb3lfX18wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoZWMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDMyQXJyYXlfX19kZXN0cm95X19fMCA9IGEzLmFzbS5DYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIFRhID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfTWV0YWRhdGFRdWVyaWVyXzAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChUYSA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfTWV0YWRhdGFRdWVyaWVyX01ldGFkYXRhUXVlcmllcl8wID0gYTMuYXNtLkRhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgZmMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9IYXNFbnRyeV8yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoZmMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9IYXNFbnRyeV8yID0gYTMuYXNtLkVhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgZ2MgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9HZXRJbnRFbnRyeV8yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoZ2MgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9HZXRJbnRFbnRyeV8yID0gYTMuYXNtLkZhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgaGMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9HZXRJbnRFbnRyeUFycmF5XzMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChoYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfTWV0YWRhdGFRdWVyaWVyX0dldEludEVudHJ5QXJyYXlfMyA9IGEzLmFzbS5HYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIGljID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfR2V0RG91YmxlRW50cnlfMiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKGljID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfR2V0RG91YmxlRW50cnlfMiA9IGEzLmFzbS5IYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIGpjID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfR2V0U3RyaW5nRW50cnlfMiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKGpjID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfR2V0U3RyaW5nRW50cnlfMiA9IGEzLmFzbS5JYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIGtjID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfTnVtRW50cmllc18xID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoa2MgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9OdW1FbnRyaWVzXzEgPSBhMy5hc20uSmEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBsYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfTWV0YWRhdGFRdWVyaWVyX0dldEVudHJ5TmFtZV8yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAobGMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9HZXRFbnRyeU5hbWVfMiA9IGEzLmFzbS5LYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIG1jID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfX19kZXN0cm95X19fMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKG1jID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfX19kZXN0cm95X19fMCA9IGEzLmFzbS5MYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIFVhID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0RlY29kZXJfMCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKFVhID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0RlY29kZXJfMCA9IGEzLmFzbS5NYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIG5jID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0RlY29kZUFycmF5VG9Qb2ludENsb3VkXzMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChuYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9EZWNvZGVBcnJheVRvUG9pbnRDbG91ZF8zID0gYTMuYXNtLk5hKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgb2MgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfRGVjb2RlQXJyYXlUb01lc2hfMyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKG9jID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0RlY29kZUFycmF5VG9NZXNoXzMgPSBhMy5hc20uT2EpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBwYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVJZF8yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAocGMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlSWRfMiA9IGEzLmFzbS5QYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIHFjID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZUlkQnlOYW1lXzIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChxYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVJZEJ5TmFtZV8yID0gYTMuYXNtLlFhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgcmMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlSWRCeU1ldGFkYXRhRW50cnlfMyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKHJjID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZUlkQnlNZXRhZGF0YUVudHJ5XzMgPSBhMy5hc20uUmEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBzYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVfMiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKHNjID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZV8yID0gYTMuYXNtLlNhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgdGMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlQnlVbmlxdWVJZF8yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAodGMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlQnlVbmlxdWVJZF8yID0gYTMuYXNtLlRhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgdWMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0TWV0YWRhdGFfMSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKHVjID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldE1ldGFkYXRhXzEgPSBhMy5hc20uVWEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCB2YyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVNZXRhZGF0YV8yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAodmMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlTWV0YWRhdGFfMiA9IGEzLmFzbS5WYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIHdjID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEZhY2VGcm9tTWVzaF8zID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAod2MgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0RmFjZUZyb21NZXNoXzMgPSBhMy5hc20uV2EpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCB4YyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRUcmlhbmdsZVN0cmlwc0Zyb21NZXNoXzIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICh4YyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRUcmlhbmdsZVN0cmlwc0Zyb21NZXNoXzIgPSBhMy5hc20uWGEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCB5YyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRUcmlhbmdsZXNVSW50MTZBcnJheV8zID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoeWMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0VHJpYW5nbGVzVUludDE2QXJyYXlfMyA9IGEzLmFzbS5ZYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIHpjID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldFRyaWFuZ2xlc1VJbnQzMkFycmF5XzMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICh6YyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRUcmlhbmdsZXNVSW50MzJBcnJheV8zID0gYTMuYXNtLlphKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgQWMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlRmxvYXRfMyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKEFjID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZUZsb2F0XzMgPSBhMy5hc20uX2EpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBCYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVGbG9hdEZvckFsbFBvaW50c18zID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoQmMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlRmxvYXRGb3JBbGxQb2ludHNfMyA9IGEzLmFzbS4kYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIENjID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZUludEZvckFsbFBvaW50c18zID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoQ2MgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlSW50Rm9yQWxsUG9pbnRzXzMgPSBhMy5hc20uYWIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBEYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVJbnQ4Rm9yQWxsUG9pbnRzXzMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChEYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVJbnQ4Rm9yQWxsUG9pbnRzXzMgPSBhMy5hc20uYmIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBFYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVVSW50OEZvckFsbFBvaW50c18zID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoRWMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlVUludDhGb3JBbGxQb2ludHNfMyA9IGEzLmFzbS5jYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIEZjID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZUludDE2Rm9yQWxsUG9pbnRzXzMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChGYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVJbnQxNkZvckFsbFBvaW50c18zID0gYTMuYXNtLmRiKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgR2MgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlVUludDE2Rm9yQWxsUG9pbnRzXzMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChHYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVVSW50MTZGb3JBbGxQb2ludHNfMyA9IGEzLmFzbS5lYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIEhjID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZUludDMyRm9yQWxsUG9pbnRzXzMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChIYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVJbnQzMkZvckFsbFBvaW50c18zID0gYTMuYXNtLmZiKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgSWMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlVUludDMyRm9yQWxsUG9pbnRzXzMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChJYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVVSW50MzJGb3JBbGxQb2ludHNfMyA9IGEzLmFzbS5nYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIEpjID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZURhdGFBcnJheUZvckFsbFBvaW50c181ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoSmMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlRGF0YUFycmF5Rm9yQWxsUG9pbnRzXzUgPSBhMy5hc20uaGIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBLYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9Ta2lwQXR0cmlidXRlVHJhbnNmb3JtXzEgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChLYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9Ta2lwQXR0cmlidXRlVHJhbnNmb3JtXzEgPSBhMy5hc20uaWIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBMYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRFbmNvZGVkR2VvbWV0cnlUeXBlX0RlcHJlY2F0ZWRfMSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKExjID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEVuY29kZWRHZW9tZXRyeVR5cGVfRGVwcmVjYXRlZF8xID0gYTMuYXNtLmpiKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgTWMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfRGVjb2RlQnVmZmVyVG9Qb2ludENsb3VkXzIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChNYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9EZWNvZGVCdWZmZXJUb1BvaW50Q2xvdWRfMiA9IGEzLmFzbS5rYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIE5jID0gYTMuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0RlY29kZUJ1ZmZlclRvTWVzaF8yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoTmMgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfRGVjb2RlQnVmZmVyVG9NZXNoXzIgPSBhMy5hc20ubGIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBPYyA9IGEzLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9fX2Rlc3Ryb3lfX18wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoT2MgPSBhMy5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfX19kZXN0cm95X19fMCA9IGEzLmFzbS5tYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIFBjID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19BdHRyaWJ1dGVUcmFuc2Zvcm1UeXBlX0FUVFJJQlVURV9JTlZBTElEX1RSQU5TRk9STSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKFBjID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19BdHRyaWJ1dGVUcmFuc2Zvcm1UeXBlX0FUVFJJQlVURV9JTlZBTElEX1RSQU5TRk9STSA9IGEzLmFzbS5uYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIFFjID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19BdHRyaWJ1dGVUcmFuc2Zvcm1UeXBlX0FUVFJJQlVURV9OT19UUkFOU0ZPUk0gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChRYyA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fQXR0cmlidXRlVHJhbnNmb3JtVHlwZV9BVFRSSUJVVEVfTk9fVFJBTlNGT1JNID0gYTMuYXNtLm9iKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgUmMgPSBhMy5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0F0dHJpYnV0ZVRyYW5zZm9ybVR5cGVfQVRUUklCVVRFX1FVQU5USVpBVElPTl9UUkFOU0ZPUk0gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChSYyA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fQXR0cmlidXRlVHJhbnNmb3JtVHlwZV9BVFRSSUJVVEVfUVVBTlRJWkFUSU9OX1RSQU5TRk9STSA9IGEzLmFzbS5wYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIFNjID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19BdHRyaWJ1dGVUcmFuc2Zvcm1UeXBlX0FUVFJJQlVURV9PQ1RBSEVEUk9OX1RSQU5TRk9STSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKFNjID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19BdHRyaWJ1dGVUcmFuc2Zvcm1UeXBlX0FUVFJJQlVURV9PQ1RBSEVEUk9OX1RSQU5TRk9STSA9IGEzLmFzbS5xYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIFRjID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19HZW9tZXRyeUF0dHJpYnV0ZV9UeXBlX0lOVkFMSUQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChUYyA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fR2VvbWV0cnlBdHRyaWJ1dGVfVHlwZV9JTlZBTElEID0gYTMuYXNtLnJiKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgVWMgPSBhMy5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0dlb21ldHJ5QXR0cmlidXRlX1R5cGVfUE9TSVRJT04gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChVYyA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fR2VvbWV0cnlBdHRyaWJ1dGVfVHlwZV9QT1NJVElPTiA9IGEzLmFzbS5zYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIFZjID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19HZW9tZXRyeUF0dHJpYnV0ZV9UeXBlX05PUk1BTCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKFZjID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19HZW9tZXRyeUF0dHJpYnV0ZV9UeXBlX05PUk1BTCA9IGEzLmFzbS50YikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIFdjID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19HZW9tZXRyeUF0dHJpYnV0ZV9UeXBlX0NPTE9SID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoV2MgPSBhMy5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0dlb21ldHJ5QXR0cmlidXRlX1R5cGVfQ09MT1IgPSBhMy5hc20udWIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBYYyA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fR2VvbWV0cnlBdHRyaWJ1dGVfVHlwZV9URVhfQ09PUkQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChYYyA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fR2VvbWV0cnlBdHRyaWJ1dGVfVHlwZV9URVhfQ09PUkQgPSBhMy5hc20udmIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBZYyA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fR2VvbWV0cnlBdHRyaWJ1dGVfVHlwZV9HRU5FUklDID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoWWMgPSBhMy5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0dlb21ldHJ5QXR0cmlidXRlX1R5cGVfR0VORVJJQyA9IGEzLmFzbS53YikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIFpjID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19FbmNvZGVkR2VvbWV0cnlUeXBlX0lOVkFMSURfR0VPTUVUUllfVFlQRSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKFpjID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19FbmNvZGVkR2VvbWV0cnlUeXBlX0lOVkFMSURfR0VPTUVUUllfVFlQRSA9IGEzLmFzbS54YikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sICRjID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19FbmNvZGVkR2VvbWV0cnlUeXBlX1BPSU5UX0NMT1VEID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoJGMgPSBhMy5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0VuY29kZWRHZW9tZXRyeVR5cGVfUE9JTlRfQ0xPVUQgPSBhMy5hc20ueWIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBhZCA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRW5jb2RlZEdlb21ldHJ5VHlwZV9UUklBTkdVTEFSX01FU0ggPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChhZCA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRW5jb2RlZEdlb21ldHJ5VHlwZV9UUklBTkdVTEFSX01FU0ggPSBhMy5hc20uemIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBiZCA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfSU5WQUxJRCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKGJkID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9JTlZBTElEID0gYTMuYXNtLkFiKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgY2QgPSBhMy5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX0lOVDggPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChjZCA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfSU5UOCA9IGEzLmFzbS5CYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIGRkID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9VSU5UOCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKGRkID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9VSU5UOCA9IGEzLmFzbS5DYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIGVkID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9JTlQxNiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKGVkID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9JTlQxNiA9IGEzLmFzbS5EYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIGZkID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9VSU5UMTYgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChmZCA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfVUlOVDE2ID0gYTMuYXNtLkViKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgZ2QgPSBhMy5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX0lOVDMyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoZ2QgPSBhMy5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX0lOVDMyID0gYTMuYXNtLkZiKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgaGQgPSBhMy5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX1VJTlQzMiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKGhkID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9VSU5UMzIgPSBhMy5hc20uR2IpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBpZCA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfSU5UNjQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChpZCA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfSU5UNjQgPSBhMy5hc20uSGIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBqZCA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfVUlOVDY0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoamQgPSBhMy5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX1VJTlQ2NCA9IGEzLmFzbS5JYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIGtkID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9GTE9BVDMyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoa2QgPSBhMy5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX0ZMT0FUMzIgPSBhMy5hc20uSmIpLmFwcGx5KAogICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICk7CiAgICAgICAgICB9LCBsZCA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfRkxPQVQ2NCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKGxkID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9GTE9BVDY0ID0gYTMuYXNtLktiKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgbWQgPSBhMy5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX0JPT0wgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChtZCA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfQk9PTCA9IGEzLmFzbS5MYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIG5kID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9UWVBFU19DT1VOVCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKG5kID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9UWVBFU19DT1VOVCA9IGEzLmFzbS5NYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIG9kID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19TdGF0dXNDb2RlX09LID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAob2QgPSBhMy5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX1N0YXR1c0NvZGVfT0sgPSBhMy5hc20uTmIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBwZCA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fU3RhdHVzQ29kZV9EUkFDT19FUlJPUiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKHBkID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19TdGF0dXNDb2RlX0RSQUNPX0VSUk9SID0gYTMuYXNtLk9iKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfSwgcWQgPSBhMy5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX1N0YXR1c0NvZGVfSU9fRVJST1IgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChxZCA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fU3RhdHVzQ29kZV9JT19FUlJPUiA9IGEzLmFzbS5QYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIHJkID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19TdGF0dXNDb2RlX0lOVkFMSURfUEFSQU1FVEVSID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAocmQgPSBhMy5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX1N0YXR1c0NvZGVfSU5WQUxJRF9QQVJBTUVURVIgPSBhMy5hc20uUWIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9LCBzZCA9IGEzLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fU3RhdHVzQ29kZV9VTlNVUFBPUlRFRF9WRVJTSU9OID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoc2QgPSBhMy5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX1N0YXR1c0NvZGVfVU5TVVBQT1JURURfVkVSU0lPTiA9IGEzLmFzbS5SYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH0sIHRkID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19TdGF0dXNDb2RlX1VOS05PV05fVkVSU0lPTiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKHRkID0gYTMuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19TdGF0dXNDb2RlX1VOS05PV05fVkVSU0lPTiA9IGEzLmFzbS5TYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH07CiAgICAgICAgICBhMy5fbWFsbG9jID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoYTMuX21hbGxvYyA9IGEzLmFzbS5UYikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH07CiAgICAgICAgICBhMy5fZnJlZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKGEzLl9mcmVlID0gYTMuYXNtLlViKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfTsKICAgICAgICAgIHZhciB5YSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKHlhID0gYTMuYXNtLlZiKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfTsKICAgICAgICAgIGEzLl9fX3N0YXJ0X2VtX2pzID0gMTU4NTY7CiAgICAgICAgICBhMy5fX19zdG9wX2VtX2pzID0gMTU5NTQ7CiAgICAgICAgICB2YXIgbGE7CiAgICAgICAgICBpYSA9IGZ1bmN0aW9uIGIoKSB7CiAgICAgICAgICAgIGxhIHx8IGJhKCk7CiAgICAgICAgICAgIGxhIHx8IChpYSA9IGIpOwogICAgICAgICAgfTsKICAgICAgICAgIGlmIChhMy5wcmVJbml0KSBmb3IgKCJmdW5jdGlvbiIgPT0gdHlwZW9mIGEzLnByZUluaXQgJiYgKGEzLnByZUluaXQgPSBbYTMucHJlSW5pdF0pOyAwIDwgYTMucHJlSW5pdC5sZW5ndGg7ICkgYTMucHJlSW5pdC5wb3AoKSgpOwogICAgICAgICAgYmEoKTsKICAgICAgICAgIHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSk7CiAgICAgICAgICB0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHQ7CiAgICAgICAgICB0LnByb3RvdHlwZS5fX2NsYXNzX18gPSB0OwogICAgICAgICAgdC5fX2NhY2hlX18gPSB7fTsKICAgICAgICAgIGEzLldyYXBwZXJPYmplY3QgPSB0OwogICAgICAgICAgYTMuZ2V0Q2FjaGUgPSB4OwogICAgICAgICAgYTMud3JhcFBvaW50ZXIgPSBEOwogICAgICAgICAgYTMuY2FzdE9iamVjdCA9IGZ1bmN0aW9uKGIsIGMpIHsKICAgICAgICAgICAgcmV0dXJuIEQoYi5wdHIsIGMpOwogICAgICAgICAgfTsKICAgICAgICAgIGEzLk5VTEwgPSBEKDApOwogICAgICAgICAgYTMuZGVzdHJveSA9IGZ1bmN0aW9uKGIpIHsKICAgICAgICAgICAgaWYgKCFiLl9fZGVzdHJveV9fKSB0aHJvdyAiRXJyb3I6IENhbm5vdCBkZXN0cm95IG9iamVjdC4gKERpZCB5b3UgY3JlYXRlIGl0IHlvdXJzZWxmPykiOwogICAgICAgICAgICBiLl9fZGVzdHJveV9fKCk7CiAgICAgICAgICAgIGRlbGV0ZSB4KGIuX19jbGFzc19fKVtiLnB0cl07CiAgICAgICAgICB9OwogICAgICAgICAgYTMuY29tcGFyZSA9IGZ1bmN0aW9uKGIsIGMpIHsKICAgICAgICAgICAgcmV0dXJuIGIucHRyID09PSBjLnB0cjsKICAgICAgICAgIH07CiAgICAgICAgICBhMy5nZXRQb2ludGVyID0gZnVuY3Rpb24oYikgewogICAgICAgICAgICByZXR1cm4gYi5wdHI7CiAgICAgICAgICB9OwogICAgICAgICAgYTMuZ2V0Q2xhc3MgPSBmdW5jdGlvbihiKSB7CiAgICAgICAgICAgIHJldHVybiBiLl9fY2xhc3NfXzsKICAgICAgICAgIH07CiAgICAgICAgICB2YXIgciA9IHsgYnVmZmVyOiAwLCBzaXplOiAwLCBwb3M6IDAsIHRlbXBzOiBbXSwgbmVlZGVkOiAwLCBwcmVwYXJlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKHIubmVlZGVkKSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgYiA9IDA7IGIgPCByLnRlbXBzLmxlbmd0aDsgYisrKSBhMy5fZnJlZShyLnRlbXBzW2JdKTsKICAgICAgICAgICAgICByLnRlbXBzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgYTMuX2ZyZWUoci5idWZmZXIpOwogICAgICAgICAgICAgIHIuYnVmZmVyID0gMDsKICAgICAgICAgICAgICByLnNpemUgKz0gci5uZWVkZWQ7CiAgICAgICAgICAgICAgci5uZWVkZWQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHIuYnVmZmVyIHx8IChyLnNpemUgKz0gMTI4LCByLmJ1ZmZlciA9IGEzLl9tYWxsb2Moci5zaXplKSwgci5idWZmZXIgfHwgZih2b2lkIDApKTsKICAgICAgICAgICAgci5wb3MgPSAwOwogICAgICAgICAgfSwgYWxsb2M6IGZ1bmN0aW9uKGIsIGMpIHsKICAgICAgICAgICAgci5idWZmZXIgfHwgZih2b2lkIDApOwogICAgICAgICAgICBiID0gYi5sZW5ndGggKiBjLkJZVEVTX1BFUl9FTEVNRU5UOwogICAgICAgICAgICBiID0gYiArIDcgJiAtODsKICAgICAgICAgICAgci5wb3MgKyBiID49IHIuc2l6ZSA/ICgwIDwgYiB8fCBmKHZvaWQgMCksIHIubmVlZGVkICs9IGIsIGMgPSBhMy5fbWFsbG9jKGIpLCByLnRlbXBzLnB1c2goYykpIDogKGMgPSByLmJ1ZmZlciArIHIucG9zLCByLnBvcyArPSBiKTsKICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICB9LCBjb3B5OiBmdW5jdGlvbihiLCBjLCBkKSB7CiAgICAgICAgICAgIGQgPj4+PSAwOwogICAgICAgICAgICBzd2l0Y2ggKGMuQllURVNfUEVSX0VMRU1FTlQpIHsKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBkID4+Pj0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIGQgPj4+PSAyOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgZCA+Pj49IDM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBiLmxlbmd0aDsgZysrKSBjW2QgKyBnXSA9IGJbZ107CiAgICAgICAgICB9IH07CiAgICAgICAgICBaLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpOwogICAgICAgICAgWi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBaOwogICAgICAgICAgWi5wcm90b3R5cGUuX19jbGFzc19fID0gWjsKICAgICAgICAgIFouX19jYWNoZV9fID0ge307CiAgICAgICAgICBhMy5Wb2lkUHRyID0gWjsKICAgICAgICAgIFoucHJvdG90eXBlLl9fZGVzdHJveV9fID0gWi5wcm90b3R5cGUuX19kZXN0cm95X18gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgYmIodGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIFMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSk7CiAgICAgICAgICBTLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFM7CiAgICAgICAgICBTLnByb3RvdHlwZS5fX2NsYXNzX18gPSBTOwogICAgICAgICAgUy5fX2NhY2hlX18gPSB7fTsKICAgICAgICAgIGEzLkRlY29kZXJCdWZmZXIgPSBTOwogICAgICAgICAgUy5wcm90b3R5cGUuSW5pdCA9IFMucHJvdG90eXBlLkluaXQgPSBmdW5jdGlvbihiLCBjKSB7CiAgICAgICAgICAgIHZhciBkID0gdGhpcy5wdHI7CiAgICAgICAgICAgIHIucHJlcGFyZSgpOwogICAgICAgICAgICAib2JqZWN0IiA9PSB0eXBlb2YgYiAmJiAoYiA9IHBhKGIpKTsKICAgICAgICAgICAgYyAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGMgJiYgKGMgPSBjLnB0cik7CiAgICAgICAgICAgIGNiKGQsIGIsIGMpOwogICAgICAgICAgfTsKICAgICAgICAgIFMucHJvdG90eXBlLl9fZGVzdHJveV9fID0gUy5wcm90b3R5cGUuX19kZXN0cm95X18gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZGIodGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIFEucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSk7CiAgICAgICAgICBRLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFE7CiAgICAgICAgICBRLnByb3RvdHlwZS5fX2NsYXNzX18gPSBROwogICAgICAgICAgUS5fX2NhY2hlX18gPSB7fTsKICAgICAgICAgIGEzLkF0dHJpYnV0ZVRyYW5zZm9ybURhdGEgPSBROwogICAgICAgICAgUS5wcm90b3R5cGUudHJhbnNmb3JtX3R5cGUgPSBRLnByb3RvdHlwZS50cmFuc2Zvcm1fdHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gZWIodGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIFEucHJvdG90eXBlLl9fZGVzdHJveV9fID0gUS5wcm90b3R5cGUuX19kZXN0cm95X18gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZmIodGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIFcucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSk7CiAgICAgICAgICBXLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFc7CiAgICAgICAgICBXLnByb3RvdHlwZS5fX2NsYXNzX18gPSBXOwogICAgICAgICAgVy5fX2NhY2hlX18gPSB7fTsKICAgICAgICAgIGEzLkdlb21ldHJ5QXR0cmlidXRlID0gVzsKICAgICAgICAgIFcucHJvdG90eXBlLl9fZGVzdHJveV9fID0gVy5wcm90b3R5cGUuX19kZXN0cm95X18gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZ2IodGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIHcucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSk7CiAgICAgICAgICB3LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHc7CiAgICAgICAgICB3LnByb3RvdHlwZS5fX2NsYXNzX18gPSB3OwogICAgICAgICAgdy5fX2NhY2hlX18gPSB7fTsKICAgICAgICAgIGEzLlBvaW50QXR0cmlidXRlID0gdzsKICAgICAgICAgIHcucHJvdG90eXBlLnNpemUgPSB3LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBoYih0aGlzLnB0cik7CiAgICAgICAgICB9OwogICAgICAgICAgdy5wcm90b3R5cGUuR2V0QXR0cmlidXRlVHJhbnNmb3JtRGF0YSA9IHcucHJvdG90eXBlLkdldEF0dHJpYnV0ZVRyYW5zZm9ybURhdGEgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEQoaWIodGhpcy5wdHIpLCBRKTsKICAgICAgICAgIH07CiAgICAgICAgICB3LnByb3RvdHlwZS5hdHRyaWJ1dGVfdHlwZSA9IHcucHJvdG90eXBlLmF0dHJpYnV0ZV90eXBlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBqYih0aGlzLnB0cik7CiAgICAgICAgICB9OwogICAgICAgICAgdy5wcm90b3R5cGUuZGF0YV90eXBlID0gdy5wcm90b3R5cGUuZGF0YV90eXBlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBrYih0aGlzLnB0cik7CiAgICAgICAgICB9OwogICAgICAgICAgdy5wcm90b3R5cGUubnVtX2NvbXBvbmVudHMgPSB3LnByb3RvdHlwZS5udW1fY29tcG9uZW50cyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gbGIodGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIHcucHJvdG90eXBlLm5vcm1hbGl6ZWQgPSB3LnByb3RvdHlwZS5ub3JtYWxpemVkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAhIW1iKHRoaXMucHRyKTsKICAgICAgICAgIH07CiAgICAgICAgICB3LnByb3RvdHlwZS5ieXRlX3N0cmlkZSA9IHcucHJvdG90eXBlLmJ5dGVfc3RyaWRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBuYih0aGlzLnB0cik7CiAgICAgICAgICB9OwogICAgICAgICAgdy5wcm90b3R5cGUuYnl0ZV9vZmZzZXQgPSB3LnByb3RvdHlwZS5ieXRlX29mZnNldCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gb2IodGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIHcucHJvdG90eXBlLnVuaXF1ZV9pZCA9IHcucHJvdG90eXBlLnVuaXF1ZV9pZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gcGIodGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIHcucHJvdG90eXBlLl9fZGVzdHJveV9fID0gdy5wcm90b3R5cGUuX19kZXN0cm95X18gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcWIodGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIEMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSk7CiAgICAgICAgICBDLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEM7CiAgICAgICAgICBDLnByb3RvdHlwZS5fX2NsYXNzX18gPSBDOwogICAgICAgICAgQy5fX2NhY2hlX18gPSB7fTsKICAgICAgICAgIGEzLkF0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybSA9IEM7CiAgICAgICAgICBDLnByb3RvdHlwZS5Jbml0RnJvbUF0dHJpYnV0ZSA9IEMucHJvdG90eXBlLkluaXRGcm9tQXR0cmlidXRlID0gZnVuY3Rpb24oYikgewogICAgICAgICAgICB2YXIgYyA9IHRoaXMucHRyOwogICAgICAgICAgICBiICYmICJvYmplY3QiID09PSB0eXBlb2YgYiAmJiAoYiA9IGIucHRyKTsKICAgICAgICAgICAgcmV0dXJuICEhcmIoYywgYik7CiAgICAgICAgICB9OwogICAgICAgICAgQy5wcm90b3R5cGUucXVhbnRpemF0aW9uX2JpdHMgPSBDLnByb3RvdHlwZS5xdWFudGl6YXRpb25fYml0cyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gc2IodGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIEMucHJvdG90eXBlLm1pbl92YWx1ZSA9IEMucHJvdG90eXBlLm1pbl92YWx1ZSA9IGZ1bmN0aW9uKGIpIHsKICAgICAgICAgICAgdmFyIGMgPSB0aGlzLnB0cjsKICAgICAgICAgICAgYiAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGIgJiYgKGIgPSBiLnB0cik7CiAgICAgICAgICAgIHJldHVybiB0YihjLCBiKTsKICAgICAgICAgIH07CiAgICAgICAgICBDLnByb3RvdHlwZS5yYW5nZSA9IEMucHJvdG90eXBlLnJhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB1Yih0aGlzLnB0cik7CiAgICAgICAgICB9OwogICAgICAgICAgQy5wcm90b3R5cGUuX19kZXN0cm95X18gPSBDLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2Yih0aGlzLnB0cik7CiAgICAgICAgICB9OwogICAgICAgICAgRi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTsKICAgICAgICAgIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRjsKICAgICAgICAgIEYucHJvdG90eXBlLl9fY2xhc3NfXyA9IEY7CiAgICAgICAgICBGLl9fY2FjaGVfXyA9IHt9OwogICAgICAgICAgYTMuQXR0cmlidXRlT2N0YWhlZHJvblRyYW5zZm9ybSA9IEY7CiAgICAgICAgICBGLnByb3RvdHlwZS5Jbml0RnJvbUF0dHJpYnV0ZSA9IEYucHJvdG90eXBlLkluaXRGcm9tQXR0cmlidXRlID0gZnVuY3Rpb24oYikgewogICAgICAgICAgICB2YXIgYyA9IHRoaXMucHRyOwogICAgICAgICAgICBiICYmICJvYmplY3QiID09PSB0eXBlb2YgYiAmJiAoYiA9IGIucHRyKTsKICAgICAgICAgICAgcmV0dXJuICEhd2IoYywgYik7CiAgICAgICAgICB9OwogICAgICAgICAgRi5wcm90b3R5cGUucXVhbnRpemF0aW9uX2JpdHMgPSBGLnByb3RvdHlwZS5xdWFudGl6YXRpb25fYml0cyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4geGIodGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIEYucHJvdG90eXBlLl9fZGVzdHJveV9fID0gRi5wcm90b3R5cGUuX19kZXN0cm95X18gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgeWIodGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIEcucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSk7CiAgICAgICAgICBHLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEc7CiAgICAgICAgICBHLnByb3RvdHlwZS5fX2NsYXNzX18gPSBHOwogICAgICAgICAgRy5fX2NhY2hlX18gPSB7fTsKICAgICAgICAgIGEzLlBvaW50Q2xvdWQgPSBHOwogICAgICAgICAgRy5wcm90b3R5cGUubnVtX2F0dHJpYnV0ZXMgPSBHLnByb3RvdHlwZS5udW1fYXR0cmlidXRlcyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gemIodGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIEcucHJvdG90eXBlLm51bV9wb2ludHMgPSBHLnByb3RvdHlwZS5udW1fcG9pbnRzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBYih0aGlzLnB0cik7CiAgICAgICAgICB9OwogICAgICAgICAgRy5wcm90b3R5cGUuX19kZXN0cm95X18gPSBHLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBCYih0aGlzLnB0cik7CiAgICAgICAgICB9OwogICAgICAgICAgRS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTsKICAgICAgICAgIEUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRTsKICAgICAgICAgIEUucHJvdG90eXBlLl9fY2xhc3NfXyA9IEU7CiAgICAgICAgICBFLl9fY2FjaGVfXyA9IHt9OwogICAgICAgICAgYTMuTWVzaCA9IEU7CiAgICAgICAgICBFLnByb3RvdHlwZS5udW1fZmFjZXMgPSBFLnByb3RvdHlwZS5udW1fZmFjZXMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIENiKHRoaXMucHRyKTsKICAgICAgICAgIH07CiAgICAgICAgICBFLnByb3RvdHlwZS5udW1fYXR0cmlidXRlcyA9IEUucHJvdG90eXBlLm51bV9hdHRyaWJ1dGVzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBEYih0aGlzLnB0cik7CiAgICAgICAgICB9OwogICAgICAgICAgRS5wcm90b3R5cGUubnVtX3BvaW50cyA9IEUucHJvdG90eXBlLm51bV9wb2ludHMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEViKHRoaXMucHRyKTsKICAgICAgICAgIH07CiAgICAgICAgICBFLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXyA9IEUucHJvdG90eXBlLl9fZGVzdHJveV9fID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIEZiKHRoaXMucHRyKTsKICAgICAgICAgIH07CiAgICAgICAgICBULnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpOwogICAgICAgICAgVC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUOwogICAgICAgICAgVC5wcm90b3R5cGUuX19jbGFzc19fID0gVDsKICAgICAgICAgIFQuX19jYWNoZV9fID0ge307CiAgICAgICAgICBhMy5NZXRhZGF0YSA9IFQ7CiAgICAgICAgICBULnByb3RvdHlwZS5fX2Rlc3Ryb3lfXyA9IFQucHJvdG90eXBlLl9fZGVzdHJveV9fID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIEdiKHRoaXMucHRyKTsKICAgICAgICAgIH07CiAgICAgICAgICBCLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpOwogICAgICAgICAgQi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCOwogICAgICAgICAgQi5wcm90b3R5cGUuX19jbGFzc19fID0gQjsKICAgICAgICAgIEIuX19jYWNoZV9fID0ge307CiAgICAgICAgICBhMy5TdGF0dXMgPSBCOwogICAgICAgICAgQi5wcm90b3R5cGUuY29kZSA9IEIucHJvdG90eXBlLmNvZGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEhiKHRoaXMucHRyKTsKICAgICAgICAgIH07CiAgICAgICAgICBCLnByb3RvdHlwZS5vayA9IEIucHJvdG90eXBlLm9rID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAhIUliKHRoaXMucHRyKTsKICAgICAgICAgIH07CiAgICAgICAgICBCLnByb3RvdHlwZS5lcnJvcl9tc2cgPSBCLnByb3RvdHlwZS5lcnJvcl9tc2cgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGgoSmIodGhpcy5wdHIpKTsKICAgICAgICAgIH07CiAgICAgICAgICBCLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXyA9IEIucHJvdG90eXBlLl9fZGVzdHJveV9fID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIEtiKHRoaXMucHRyKTsKICAgICAgICAgIH07CiAgICAgICAgICBILnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpOwogICAgICAgICAgSC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBIOwogICAgICAgICAgSC5wcm90b3R5cGUuX19jbGFzc19fID0gSDsKICAgICAgICAgIEguX19jYWNoZV9fID0ge307CiAgICAgICAgICBhMy5EcmFjb0Zsb2F0MzJBcnJheSA9IEg7CiAgICAgICAgICBILnByb3RvdHlwZS5HZXRWYWx1ZSA9IEgucHJvdG90eXBlLkdldFZhbHVlID0gZnVuY3Rpb24oYikgewogICAgICAgICAgICB2YXIgYyA9IHRoaXMucHRyOwogICAgICAgICAgICBiICYmICJvYmplY3QiID09PSB0eXBlb2YgYiAmJiAoYiA9IGIucHRyKTsKICAgICAgICAgICAgcmV0dXJuIExiKGMsIGIpOwogICAgICAgICAgfTsKICAgICAgICAgIEgucHJvdG90eXBlLnNpemUgPSBILnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBNYih0aGlzLnB0cik7CiAgICAgICAgICB9OwogICAgICAgICAgSC5wcm90b3R5cGUuX19kZXN0cm95X18gPSBILnByb3RvdHlwZS5fX2Rlc3Ryb3lfXyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBOYih0aGlzLnB0cik7CiAgICAgICAgICB9OwogICAgICAgICAgSS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTsKICAgICAgICAgIEkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSTsKICAgICAgICAgIEkucHJvdG90eXBlLl9fY2xhc3NfXyA9IEk7CiAgICAgICAgICBJLl9fY2FjaGVfXyA9IHt9OwogICAgICAgICAgYTMuRHJhY29JbnQ4QXJyYXkgPSBJOwogICAgICAgICAgSS5wcm90b3R5cGUuR2V0VmFsdWUgPSBJLnByb3RvdHlwZS5HZXRWYWx1ZSA9IGZ1bmN0aW9uKGIpIHsKICAgICAgICAgICAgdmFyIGMgPSB0aGlzLnB0cjsKICAgICAgICAgICAgYiAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGIgJiYgKGIgPSBiLnB0cik7CiAgICAgICAgICAgIHJldHVybiBPYihjLCBiKTsKICAgICAgICAgIH07CiAgICAgICAgICBJLnByb3RvdHlwZS5zaXplID0gSS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gUGIodGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIEkucHJvdG90eXBlLl9fZGVzdHJveV9fID0gSS5wcm90b3R5cGUuX19kZXN0cm95X18gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgUWIodGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIEoucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSk7CiAgICAgICAgICBKLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEo7CiAgICAgICAgICBKLnByb3RvdHlwZS5fX2NsYXNzX18gPSBKOwogICAgICAgICAgSi5fX2NhY2hlX18gPSB7fTsKICAgICAgICAgIGEzLkRyYWNvVUludDhBcnJheSA9IEo7CiAgICAgICAgICBKLnByb3RvdHlwZS5HZXRWYWx1ZSA9IEoucHJvdG90eXBlLkdldFZhbHVlID0gZnVuY3Rpb24oYikgewogICAgICAgICAgICB2YXIgYyA9IHRoaXMucHRyOwogICAgICAgICAgICBiICYmICJvYmplY3QiID09PSB0eXBlb2YgYiAmJiAoYiA9IGIucHRyKTsKICAgICAgICAgICAgcmV0dXJuIFJiKGMsIGIpOwogICAgICAgICAgfTsKICAgICAgICAgIEoucHJvdG90eXBlLnNpemUgPSBKLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBTYih0aGlzLnB0cik7CiAgICAgICAgICB9OwogICAgICAgICAgSi5wcm90b3R5cGUuX19kZXN0cm95X18gPSBKLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBUYih0aGlzLnB0cik7CiAgICAgICAgICB9OwogICAgICAgICAgSy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTsKICAgICAgICAgIEsucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSzsKICAgICAgICAgIEsucHJvdG90eXBlLl9fY2xhc3NfXyA9IEs7CiAgICAgICAgICBLLl9fY2FjaGVfXyA9IHt9OwogICAgICAgICAgYTMuRHJhY29JbnQxNkFycmF5ID0gSzsKICAgICAgICAgIEsucHJvdG90eXBlLkdldFZhbHVlID0gSy5wcm90b3R5cGUuR2V0VmFsdWUgPSBmdW5jdGlvbihiKSB7CiAgICAgICAgICAgIHZhciBjID0gdGhpcy5wdHI7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICByZXR1cm4gVWIoYywgYik7CiAgICAgICAgICB9OwogICAgICAgICAgSy5wcm90b3R5cGUuc2l6ZSA9IEsucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIFZiKHRoaXMucHRyKTsKICAgICAgICAgIH07CiAgICAgICAgICBLLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXyA9IEsucHJvdG90eXBlLl9fZGVzdHJveV9fID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFdiKHRoaXMucHRyKTsKICAgICAgICAgIH07CiAgICAgICAgICBMLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpOwogICAgICAgICAgTC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMOwogICAgICAgICAgTC5wcm90b3R5cGUuX19jbGFzc19fID0gTDsKICAgICAgICAgIEwuX19jYWNoZV9fID0ge307CiAgICAgICAgICBhMy5EcmFjb1VJbnQxNkFycmF5ID0gTDsKICAgICAgICAgIEwucHJvdG90eXBlLkdldFZhbHVlID0gTC5wcm90b3R5cGUuR2V0VmFsdWUgPSBmdW5jdGlvbihiKSB7CiAgICAgICAgICAgIHZhciBjID0gdGhpcy5wdHI7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICByZXR1cm4gWGIoYywgYik7CiAgICAgICAgICB9OwogICAgICAgICAgTC5wcm90b3R5cGUuc2l6ZSA9IEwucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIFliKHRoaXMucHRyKTsKICAgICAgICAgIH07CiAgICAgICAgICBMLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXyA9IEwucHJvdG90eXBlLl9fZGVzdHJveV9fID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFpiKHRoaXMucHRyKTsKICAgICAgICAgIH07CiAgICAgICAgICBNLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpOwogICAgICAgICAgTS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNOwogICAgICAgICAgTS5wcm90b3R5cGUuX19jbGFzc19fID0gTTsKICAgICAgICAgIE0uX19jYWNoZV9fID0ge307CiAgICAgICAgICBhMy5EcmFjb0ludDMyQXJyYXkgPSBNOwogICAgICAgICAgTS5wcm90b3R5cGUuR2V0VmFsdWUgPSBNLnByb3RvdHlwZS5HZXRWYWx1ZSA9IGZ1bmN0aW9uKGIpIHsKICAgICAgICAgICAgdmFyIGMgPSB0aGlzLnB0cjsKICAgICAgICAgICAgYiAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGIgJiYgKGIgPSBiLnB0cik7CiAgICAgICAgICAgIHJldHVybiAkYihjLCBiKTsKICAgICAgICAgIH07CiAgICAgICAgICBNLnByb3RvdHlwZS5zaXplID0gTS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gYWModGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIE0ucHJvdG90eXBlLl9fZGVzdHJveV9fID0gTS5wcm90b3R5cGUuX19kZXN0cm95X18gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgYmModGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIE4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSk7CiAgICAgICAgICBOLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE47CiAgICAgICAgICBOLnByb3RvdHlwZS5fX2NsYXNzX18gPSBOOwogICAgICAgICAgTi5fX2NhY2hlX18gPSB7fTsKICAgICAgICAgIGEzLkRyYWNvVUludDMyQXJyYXkgPSBOOwogICAgICAgICAgTi5wcm90b3R5cGUuR2V0VmFsdWUgPSBOLnByb3RvdHlwZS5HZXRWYWx1ZSA9IGZ1bmN0aW9uKGIpIHsKICAgICAgICAgICAgdmFyIGMgPSB0aGlzLnB0cjsKICAgICAgICAgICAgYiAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGIgJiYgKGIgPSBiLnB0cik7CiAgICAgICAgICAgIHJldHVybiBjYyhjLCBiKTsKICAgICAgICAgIH07CiAgICAgICAgICBOLnByb3RvdHlwZS5zaXplID0gTi5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gZGModGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIE4ucHJvdG90eXBlLl9fZGVzdHJveV9fID0gTi5wcm90b3R5cGUuX19kZXN0cm95X18gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZWModGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIHkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSk7CiAgICAgICAgICB5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHk7CiAgICAgICAgICB5LnByb3RvdHlwZS5fX2NsYXNzX18gPSB5OwogICAgICAgICAgeS5fX2NhY2hlX18gPSB7fTsKICAgICAgICAgIGEzLk1ldGFkYXRhUXVlcmllciA9IHk7CiAgICAgICAgICB5LnByb3RvdHlwZS5IYXNFbnRyeSA9IHkucHJvdG90eXBlLkhhc0VudHJ5ID0gZnVuY3Rpb24oYiwgYykgewogICAgICAgICAgICB2YXIgZCA9IHRoaXMucHRyOwogICAgICAgICAgICByLnByZXBhcmUoKTsKICAgICAgICAgICAgYiAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGIgJiYgKGIgPSBiLnB0cik7CiAgICAgICAgICAgIGMgPSBjICYmICJvYmplY3QiID09PSB0eXBlb2YgYyA/IGMucHRyIDogUihjKTsKICAgICAgICAgICAgcmV0dXJuICEhZmMoZCwgYiwgYyk7CiAgICAgICAgICB9OwogICAgICAgICAgeS5wcm90b3R5cGUuR2V0SW50RW50cnkgPSB5LnByb3RvdHlwZS5HZXRJbnRFbnRyeSA9IGZ1bmN0aW9uKGIsIGMpIHsKICAgICAgICAgICAgdmFyIGQgPSB0aGlzLnB0cjsKICAgICAgICAgICAgci5wcmVwYXJlKCk7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICBjID0gYyAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGMgPyBjLnB0ciA6IFIoYyk7CiAgICAgICAgICAgIHJldHVybiBnYyhkLCBiLCBjKTsKICAgICAgICAgIH07CiAgICAgICAgICB5LnByb3RvdHlwZS5HZXRJbnRFbnRyeUFycmF5ID0geS5wcm90b3R5cGUuR2V0SW50RW50cnlBcnJheSA9IGZ1bmN0aW9uKGIsIGMsIGQpIHsKICAgICAgICAgICAgdmFyIGcgPSB0aGlzLnB0cjsKICAgICAgICAgICAgci5wcmVwYXJlKCk7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICBjID0gYyAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGMgPyBjLnB0ciA6IFIoYyk7CiAgICAgICAgICAgIGQgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBkICYmIChkID0gZC5wdHIpOwogICAgICAgICAgICBoYyhnLCBiLCBjLCBkKTsKICAgICAgICAgIH07CiAgICAgICAgICB5LnByb3RvdHlwZS5HZXREb3VibGVFbnRyeSA9IHkucHJvdG90eXBlLkdldERvdWJsZUVudHJ5ID0gZnVuY3Rpb24oYiwgYykgewogICAgICAgICAgICB2YXIgZCA9IHRoaXMucHRyOwogICAgICAgICAgICByLnByZXBhcmUoKTsKICAgICAgICAgICAgYiAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGIgJiYgKGIgPSBiLnB0cik7CiAgICAgICAgICAgIGMgPSBjICYmICJvYmplY3QiID09PSB0eXBlb2YgYyA/IGMucHRyIDogUihjKTsKICAgICAgICAgICAgcmV0dXJuIGljKGQsIGIsIGMpOwogICAgICAgICAgfTsKICAgICAgICAgIHkucHJvdG90eXBlLkdldFN0cmluZ0VudHJ5ID0geS5wcm90b3R5cGUuR2V0U3RyaW5nRW50cnkgPSBmdW5jdGlvbihiLCBjKSB7CiAgICAgICAgICAgIHZhciBkID0gdGhpcy5wdHI7CiAgICAgICAgICAgIHIucHJlcGFyZSgpOwogICAgICAgICAgICBiICYmICJvYmplY3QiID09PSB0eXBlb2YgYiAmJiAoYiA9IGIucHRyKTsKICAgICAgICAgICAgYyA9IGMgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBjID8gYy5wdHIgOiBSKGMpOwogICAgICAgICAgICByZXR1cm4gaChqYyhkLCBiLCBjKSk7CiAgICAgICAgICB9OwogICAgICAgICAgeS5wcm90b3R5cGUuTnVtRW50cmllcyA9IHkucHJvdG90eXBlLk51bUVudHJpZXMgPSBmdW5jdGlvbihiKSB7CiAgICAgICAgICAgIHZhciBjID0gdGhpcy5wdHI7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICByZXR1cm4ga2MoYywgYik7CiAgICAgICAgICB9OwogICAgICAgICAgeS5wcm90b3R5cGUuR2V0RW50cnlOYW1lID0geS5wcm90b3R5cGUuR2V0RW50cnlOYW1lID0gZnVuY3Rpb24oYiwgYykgewogICAgICAgICAgICB2YXIgZCA9IHRoaXMucHRyOwogICAgICAgICAgICBiICYmICJvYmplY3QiID09PSB0eXBlb2YgYiAmJiAoYiA9IGIucHRyKTsKICAgICAgICAgICAgYyAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGMgJiYgKGMgPSBjLnB0cik7CiAgICAgICAgICAgIHJldHVybiBoKGxjKGQsIGIsIGMpKTsKICAgICAgICAgIH07CiAgICAgICAgICB5LnByb3RvdHlwZS5fX2Rlc3Ryb3lfXyA9IHkucHJvdG90eXBlLl9fZGVzdHJveV9fID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIG1jKHRoaXMucHRyKTsKICAgICAgICAgIH07CiAgICAgICAgICBtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpOwogICAgICAgICAgbS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBtOwogICAgICAgICAgbS5wcm90b3R5cGUuX19jbGFzc19fID0gbTsKICAgICAgICAgIG0uX19jYWNoZV9fID0ge307CiAgICAgICAgICBhMy5EZWNvZGVyID0gbTsKICAgICAgICAgIG0ucHJvdG90eXBlLkRlY29kZUFycmF5VG9Qb2ludENsb3VkID0gbS5wcm90b3R5cGUuRGVjb2RlQXJyYXlUb1BvaW50Q2xvdWQgPSBmdW5jdGlvbihiLCBjLCBkKSB7CiAgICAgICAgICAgIHZhciBnID0gdGhpcy5wdHI7CiAgICAgICAgICAgIHIucHJlcGFyZSgpOwogICAgICAgICAgICAib2JqZWN0IiA9PSB0eXBlb2YgYiAmJiAoYiA9IHBhKGIpKTsKICAgICAgICAgICAgYyAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGMgJiYgKGMgPSBjLnB0cik7CiAgICAgICAgICAgIGQgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBkICYmIChkID0gZC5wdHIpOwogICAgICAgICAgICByZXR1cm4gRChuYyhnLCBiLCBjLCBkKSwgQik7CiAgICAgICAgICB9OwogICAgICAgICAgbS5wcm90b3R5cGUuRGVjb2RlQXJyYXlUb01lc2ggPSBtLnByb3RvdHlwZS5EZWNvZGVBcnJheVRvTWVzaCA9IGZ1bmN0aW9uKGIsIGMsIGQpIHsKICAgICAgICAgICAgdmFyIGcgPSB0aGlzLnB0cjsKICAgICAgICAgICAgci5wcmVwYXJlKCk7CiAgICAgICAgICAgICJvYmplY3QiID09IHR5cGVvZiBiICYmIChiID0gcGEoYikpOwogICAgICAgICAgICBjICYmICJvYmplY3QiID09PSB0eXBlb2YgYyAmJiAoYyA9IGMucHRyKTsKICAgICAgICAgICAgZCAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGQgJiYgKGQgPSBkLnB0cik7CiAgICAgICAgICAgIHJldHVybiBEKG9jKGcsIGIsIGMsIGQpLCBCKTsKICAgICAgICAgIH07CiAgICAgICAgICBtLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVJZCA9IG0ucHJvdG90eXBlLkdldEF0dHJpYnV0ZUlkID0gZnVuY3Rpb24oYiwgYykgewogICAgICAgICAgICB2YXIgZCA9IHRoaXMucHRyOwogICAgICAgICAgICBiICYmICJvYmplY3QiID09PSB0eXBlb2YgYiAmJiAoYiA9IGIucHRyKTsKICAgICAgICAgICAgYyAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGMgJiYgKGMgPSBjLnB0cik7CiAgICAgICAgICAgIHJldHVybiBwYyhkLCBiLCBjKTsKICAgICAgICAgIH07CiAgICAgICAgICBtLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVJZEJ5TmFtZSA9IG0ucHJvdG90eXBlLkdldEF0dHJpYnV0ZUlkQnlOYW1lID0gZnVuY3Rpb24oYiwgYykgewogICAgICAgICAgICB2YXIgZCA9IHRoaXMucHRyOwogICAgICAgICAgICByLnByZXBhcmUoKTsKICAgICAgICAgICAgYiAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGIgJiYgKGIgPSBiLnB0cik7CiAgICAgICAgICAgIGMgPSBjICYmICJvYmplY3QiID09PSB0eXBlb2YgYyA/IGMucHRyIDogUihjKTsKICAgICAgICAgICAgcmV0dXJuIHFjKGQsIGIsIGMpOwogICAgICAgICAgfTsKICAgICAgICAgIG0ucHJvdG90eXBlLkdldEF0dHJpYnV0ZUlkQnlNZXRhZGF0YUVudHJ5ID0gbS5wcm90b3R5cGUuR2V0QXR0cmlidXRlSWRCeU1ldGFkYXRhRW50cnkgPSBmdW5jdGlvbihiLCBjLCBkKSB7CiAgICAgICAgICAgIHZhciBnID0gdGhpcy5wdHI7CiAgICAgICAgICAgIHIucHJlcGFyZSgpOwogICAgICAgICAgICBiICYmICJvYmplY3QiID09PSB0eXBlb2YgYiAmJiAoYiA9IGIucHRyKTsKICAgICAgICAgICAgYyA9IGMgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBjID8gYy5wdHIgOiBSKGMpOwogICAgICAgICAgICBkID0gZCAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGQgPyBkLnB0ciA6IFIoZCk7CiAgICAgICAgICAgIHJldHVybiByYyhnLCBiLCBjLCBkKTsKICAgICAgICAgIH07CiAgICAgICAgICBtLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGUgPSBtLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbihiLCBjKSB7CiAgICAgICAgICAgIHZhciBkID0gdGhpcy5wdHI7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICBjICYmICJvYmplY3QiID09PSB0eXBlb2YgYyAmJiAoYyA9IGMucHRyKTsKICAgICAgICAgICAgcmV0dXJuIEQoc2MoZCwgYiwgYyksIHcpOwogICAgICAgICAgfTsKICAgICAgICAgIG0ucHJvdG90eXBlLkdldEF0dHJpYnV0ZUJ5VW5pcXVlSWQgPSBtLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVCeVVuaXF1ZUlkID0gZnVuY3Rpb24oYiwgYykgewogICAgICAgICAgICB2YXIgZCA9IHRoaXMucHRyOwogICAgICAgICAgICBiICYmICJvYmplY3QiID09PSB0eXBlb2YgYiAmJiAoYiA9IGIucHRyKTsKICAgICAgICAgICAgYyAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGMgJiYgKGMgPSBjLnB0cik7CiAgICAgICAgICAgIHJldHVybiBEKHRjKGQsIGIsIGMpLCB3KTsKICAgICAgICAgIH07CiAgICAgICAgICBtLnByb3RvdHlwZS5HZXRNZXRhZGF0YSA9IG0ucHJvdG90eXBlLkdldE1ldGFkYXRhID0gZnVuY3Rpb24oYikgewogICAgICAgICAgICB2YXIgYyA9IHRoaXMucHRyOwogICAgICAgICAgICBiICYmICJvYmplY3QiID09PSB0eXBlb2YgYiAmJiAoYiA9IGIucHRyKTsKICAgICAgICAgICAgcmV0dXJuIEQodWMoYywgYiksIFQpOwogICAgICAgICAgfTsKICAgICAgICAgIG0ucHJvdG90eXBlLkdldEF0dHJpYnV0ZU1ldGFkYXRhID0gbS5wcm90b3R5cGUuR2V0QXR0cmlidXRlTWV0YWRhdGEgPSBmdW5jdGlvbihiLCBjKSB7CiAgICAgICAgICAgIHZhciBkID0gdGhpcy5wdHI7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICBjICYmICJvYmplY3QiID09PSB0eXBlb2YgYyAmJiAoYyA9IGMucHRyKTsKICAgICAgICAgICAgcmV0dXJuIEQodmMoZCwgYiwgYyksIFQpOwogICAgICAgICAgfTsKICAgICAgICAgIG0ucHJvdG90eXBlLkdldEZhY2VGcm9tTWVzaCA9IG0ucHJvdG90eXBlLkdldEZhY2VGcm9tTWVzaCA9IGZ1bmN0aW9uKGIsIGMsIGQpIHsKICAgICAgICAgICAgdmFyIGcgPSB0aGlzLnB0cjsKICAgICAgICAgICAgYiAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGIgJiYgKGIgPSBiLnB0cik7CiAgICAgICAgICAgIGMgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBjICYmIChjID0gYy5wdHIpOwogICAgICAgICAgICBkICYmICJvYmplY3QiID09PSB0eXBlb2YgZCAmJiAoZCA9IGQucHRyKTsKICAgICAgICAgICAgcmV0dXJuICEhd2MoZywgYiwgYywgZCk7CiAgICAgICAgICB9OwogICAgICAgICAgbS5wcm90b3R5cGUuR2V0VHJpYW5nbGVTdHJpcHNGcm9tTWVzaCA9IG0ucHJvdG90eXBlLkdldFRyaWFuZ2xlU3RyaXBzRnJvbU1lc2ggPSBmdW5jdGlvbihiLCBjKSB7CiAgICAgICAgICAgIHZhciBkID0gdGhpcy5wdHI7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICBjICYmICJvYmplY3QiID09PSB0eXBlb2YgYyAmJiAoYyA9IGMucHRyKTsKICAgICAgICAgICAgcmV0dXJuIHhjKGQsIGIsIGMpOwogICAgICAgICAgfTsKICAgICAgICAgIG0ucHJvdG90eXBlLkdldFRyaWFuZ2xlc1VJbnQxNkFycmF5ID0gbS5wcm90b3R5cGUuR2V0VHJpYW5nbGVzVUludDE2QXJyYXkgPSBmdW5jdGlvbihiLCBjLCBkKSB7CiAgICAgICAgICAgIHZhciBnID0gdGhpcy5wdHI7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICBjICYmICJvYmplY3QiID09PSB0eXBlb2YgYyAmJiAoYyA9IGMucHRyKTsKICAgICAgICAgICAgZCAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGQgJiYgKGQgPSBkLnB0cik7CiAgICAgICAgICAgIHJldHVybiAhIXljKGcsIGIsIGMsIGQpOwogICAgICAgICAgfTsKICAgICAgICAgIG0ucHJvdG90eXBlLkdldFRyaWFuZ2xlc1VJbnQzMkFycmF5ID0gbS5wcm90b3R5cGUuR2V0VHJpYW5nbGVzVUludDMyQXJyYXkgPSBmdW5jdGlvbihiLCBjLCBkKSB7CiAgICAgICAgICAgIHZhciBnID0gdGhpcy5wdHI7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICBjICYmICJvYmplY3QiID09PSB0eXBlb2YgYyAmJiAoYyA9IGMucHRyKTsKICAgICAgICAgICAgZCAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGQgJiYgKGQgPSBkLnB0cik7CiAgICAgICAgICAgIHJldHVybiAhIXpjKGcsIGIsIGMsIGQpOwogICAgICAgICAgfTsKICAgICAgICAgIG0ucHJvdG90eXBlLkdldEF0dHJpYnV0ZUZsb2F0ID0gbS5wcm90b3R5cGUuR2V0QXR0cmlidXRlRmxvYXQgPSBmdW5jdGlvbihiLCBjLCBkKSB7CiAgICAgICAgICAgIHZhciBnID0gdGhpcy5wdHI7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICBjICYmICJvYmplY3QiID09PSB0eXBlb2YgYyAmJiAoYyA9IGMucHRyKTsKICAgICAgICAgICAgZCAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGQgJiYgKGQgPSBkLnB0cik7CiAgICAgICAgICAgIHJldHVybiAhIUFjKGcsIGIsIGMsIGQpOwogICAgICAgICAgfTsKICAgICAgICAgIG0ucHJvdG90eXBlLkdldEF0dHJpYnV0ZUZsb2F0Rm9yQWxsUG9pbnRzID0gbS5wcm90b3R5cGUuR2V0QXR0cmlidXRlRmxvYXRGb3JBbGxQb2ludHMgPSBmdW5jdGlvbihiLCBjLCBkKSB7CiAgICAgICAgICAgIHZhciBnID0gdGhpcy5wdHI7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICBjICYmICJvYmplY3QiID09PSB0eXBlb2YgYyAmJiAoYyA9IGMucHRyKTsKICAgICAgICAgICAgZCAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGQgJiYgKGQgPSBkLnB0cik7CiAgICAgICAgICAgIHJldHVybiAhIUJjKGcsIGIsIGMsIGQpOwogICAgICAgICAgfTsKICAgICAgICAgIG0ucHJvdG90eXBlLkdldEF0dHJpYnV0ZUludEZvckFsbFBvaW50cyA9IG0ucHJvdG90eXBlLkdldEF0dHJpYnV0ZUludEZvckFsbFBvaW50cyA9IGZ1bmN0aW9uKGIsIGMsIGQpIHsKICAgICAgICAgICAgdmFyIGcgPSB0aGlzLnB0cjsKICAgICAgICAgICAgYiAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGIgJiYgKGIgPSBiLnB0cik7CiAgICAgICAgICAgIGMgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBjICYmIChjID0gYy5wdHIpOwogICAgICAgICAgICBkICYmICJvYmplY3QiID09PSB0eXBlb2YgZCAmJiAoZCA9IGQucHRyKTsKICAgICAgICAgICAgcmV0dXJuICEhQ2MoZywgYiwgYywgZCk7CiAgICAgICAgICB9OwogICAgICAgICAgbS5wcm90b3R5cGUuR2V0QXR0cmlidXRlSW50OEZvckFsbFBvaW50cyA9IG0ucHJvdG90eXBlLkdldEF0dHJpYnV0ZUludDhGb3JBbGxQb2ludHMgPSBmdW5jdGlvbihiLCBjLCBkKSB7CiAgICAgICAgICAgIHZhciBnID0gdGhpcy5wdHI7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICBjICYmICJvYmplY3QiID09PSB0eXBlb2YgYyAmJiAoYyA9IGMucHRyKTsKICAgICAgICAgICAgZCAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGQgJiYgKGQgPSBkLnB0cik7CiAgICAgICAgICAgIHJldHVybiAhIURjKGcsIGIsIGMsIGQpOwogICAgICAgICAgfTsKICAgICAgICAgIG0ucHJvdG90eXBlLkdldEF0dHJpYnV0ZVVJbnQ4Rm9yQWxsUG9pbnRzID0gbS5wcm90b3R5cGUuR2V0QXR0cmlidXRlVUludDhGb3JBbGxQb2ludHMgPSBmdW5jdGlvbihiLCBjLCBkKSB7CiAgICAgICAgICAgIHZhciBnID0gdGhpcy5wdHI7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICBjICYmICJvYmplY3QiID09PSB0eXBlb2YgYyAmJiAoYyA9IGMucHRyKTsKICAgICAgICAgICAgZCAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGQgJiYgKGQgPSBkLnB0cik7CiAgICAgICAgICAgIHJldHVybiAhIUVjKGcsIGIsIGMsIGQpOwogICAgICAgICAgfTsKICAgICAgICAgIG0ucHJvdG90eXBlLkdldEF0dHJpYnV0ZUludDE2Rm9yQWxsUG9pbnRzID0gbS5wcm90b3R5cGUuR2V0QXR0cmlidXRlSW50MTZGb3JBbGxQb2ludHMgPSBmdW5jdGlvbihiLCBjLCBkKSB7CiAgICAgICAgICAgIHZhciBnID0gdGhpcy5wdHI7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICBjICYmICJvYmplY3QiID09PSB0eXBlb2YgYyAmJiAoYyA9IGMucHRyKTsKICAgICAgICAgICAgZCAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGQgJiYgKGQgPSBkLnB0cik7CiAgICAgICAgICAgIHJldHVybiAhIUZjKGcsIGIsIGMsIGQpOwogICAgICAgICAgfTsKICAgICAgICAgIG0ucHJvdG90eXBlLkdldEF0dHJpYnV0ZVVJbnQxNkZvckFsbFBvaW50cyA9IG0ucHJvdG90eXBlLkdldEF0dHJpYnV0ZVVJbnQxNkZvckFsbFBvaW50cyA9IGZ1bmN0aW9uKGIsIGMsIGQpIHsKICAgICAgICAgICAgdmFyIGcgPSB0aGlzLnB0cjsKICAgICAgICAgICAgYiAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGIgJiYgKGIgPSBiLnB0cik7CiAgICAgICAgICAgIGMgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBjICYmIChjID0gYy5wdHIpOwogICAgICAgICAgICBkICYmICJvYmplY3QiID09PSB0eXBlb2YgZCAmJiAoZCA9IGQucHRyKTsKICAgICAgICAgICAgcmV0dXJuICEhR2MoZywgYiwgYywgZCk7CiAgICAgICAgICB9OwogICAgICAgICAgbS5wcm90b3R5cGUuR2V0QXR0cmlidXRlSW50MzJGb3JBbGxQb2ludHMgPSBtLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVJbnQzMkZvckFsbFBvaW50cyA9IGZ1bmN0aW9uKGIsIGMsIGQpIHsKICAgICAgICAgICAgdmFyIGcgPSB0aGlzLnB0cjsKICAgICAgICAgICAgYiAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGIgJiYgKGIgPSBiLnB0cik7CiAgICAgICAgICAgIGMgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBjICYmIChjID0gYy5wdHIpOwogICAgICAgICAgICBkICYmICJvYmplY3QiID09PSB0eXBlb2YgZCAmJiAoZCA9IGQucHRyKTsKICAgICAgICAgICAgcmV0dXJuICEhSGMoZywgYiwgYywgZCk7CiAgICAgICAgICB9OwogICAgICAgICAgbS5wcm90b3R5cGUuR2V0QXR0cmlidXRlVUludDMyRm9yQWxsUG9pbnRzID0gbS5wcm90b3R5cGUuR2V0QXR0cmlidXRlVUludDMyRm9yQWxsUG9pbnRzID0gZnVuY3Rpb24oYiwgYywgZCkgewogICAgICAgICAgICB2YXIgZyA9IHRoaXMucHRyOwogICAgICAgICAgICBiICYmICJvYmplY3QiID09PSB0eXBlb2YgYiAmJiAoYiA9IGIucHRyKTsKICAgICAgICAgICAgYyAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGMgJiYgKGMgPSBjLnB0cik7CiAgICAgICAgICAgIGQgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBkICYmIChkID0gZC5wdHIpOwogICAgICAgICAgICByZXR1cm4gISFJYyhnLCBiLCBjLCBkKTsKICAgICAgICAgIH07CiAgICAgICAgICBtLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVEYXRhQXJyYXlGb3JBbGxQb2ludHMgPSBtLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVEYXRhQXJyYXlGb3JBbGxQb2ludHMgPSBmdW5jdGlvbihiLCBjLCBkLCBnLCB1MykgewogICAgICAgICAgICB2YXIgWCA9IHRoaXMucHRyOwogICAgICAgICAgICBiICYmICJvYmplY3QiID09PSB0eXBlb2YgYiAmJiAoYiA9IGIucHRyKTsKICAgICAgICAgICAgYyAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGMgJiYgKGMgPSBjLnB0cik7CiAgICAgICAgICAgIGQgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBkICYmIChkID0gZC5wdHIpOwogICAgICAgICAgICBnICYmICJvYmplY3QiID09PSB0eXBlb2YgZyAmJiAoZyA9IGcucHRyKTsKICAgICAgICAgICAgdTMgJiYgIm9iamVjdCIgPT09IHR5cGVvZiB1MyAmJiAodTMgPSB1My5wdHIpOwogICAgICAgICAgICByZXR1cm4gISFKYyhYLCBiLCBjLCBkLCBnLCB1Myk7CiAgICAgICAgICB9OwogICAgICAgICAgbS5wcm90b3R5cGUuU2tpcEF0dHJpYnV0ZVRyYW5zZm9ybSA9IG0ucHJvdG90eXBlLlNraXBBdHRyaWJ1dGVUcmFuc2Zvcm0gPSBmdW5jdGlvbihiKSB7CiAgICAgICAgICAgIHZhciBjID0gdGhpcy5wdHI7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICBLYyhjLCBiKTsKICAgICAgICAgIH07CiAgICAgICAgICBtLnByb3RvdHlwZS5HZXRFbmNvZGVkR2VvbWV0cnlUeXBlX0RlcHJlY2F0ZWQgPSBtLnByb3RvdHlwZS5HZXRFbmNvZGVkR2VvbWV0cnlUeXBlX0RlcHJlY2F0ZWQgPSBmdW5jdGlvbihiKSB7CiAgICAgICAgICAgIHZhciBjID0gdGhpcy5wdHI7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICByZXR1cm4gTGMoYywgYik7CiAgICAgICAgICB9OwogICAgICAgICAgbS5wcm90b3R5cGUuRGVjb2RlQnVmZmVyVG9Qb2ludENsb3VkID0gbS5wcm90b3R5cGUuRGVjb2RlQnVmZmVyVG9Qb2ludENsb3VkID0gZnVuY3Rpb24oYiwgYykgewogICAgICAgICAgICB2YXIgZCA9IHRoaXMucHRyOwogICAgICAgICAgICBiICYmICJvYmplY3QiID09PSB0eXBlb2YgYiAmJiAoYiA9IGIucHRyKTsKICAgICAgICAgICAgYyAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIGMgJiYgKGMgPSBjLnB0cik7CiAgICAgICAgICAgIHJldHVybiBEKE1jKGQsIGIsIGMpLCBCKTsKICAgICAgICAgIH07CiAgICAgICAgICBtLnByb3RvdHlwZS5EZWNvZGVCdWZmZXJUb01lc2ggPSBtLnByb3RvdHlwZS5EZWNvZGVCdWZmZXJUb01lc2ggPSBmdW5jdGlvbihiLCBjKSB7CiAgICAgICAgICAgIHZhciBkID0gdGhpcy5wdHI7CiAgICAgICAgICAgIGIgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBiICYmIChiID0gYi5wdHIpOwogICAgICAgICAgICBjICYmICJvYmplY3QiID09PSB0eXBlb2YgYyAmJiAoYyA9IGMucHRyKTsKICAgICAgICAgICAgcmV0dXJuIEQoTmMoZCwgYiwgYyksIEIpOwogICAgICAgICAgfTsKICAgICAgICAgIG0ucHJvdG90eXBlLl9fZGVzdHJveV9fID0gbS5wcm90b3R5cGUuX19kZXN0cm95X18gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgT2ModGhpcy5wdHIpOwogICAgICAgICAgfTsKICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgZnVuY3Rpb24gYigpIHsKICAgICAgICAgICAgICBhMy5BVFRSSUJVVEVfSU5WQUxJRF9UUkFOU0ZPUk0gPSBQYygpOwogICAgICAgICAgICAgIGEzLkFUVFJJQlVURV9OT19UUkFOU0ZPUk0gPSBRYygpOwogICAgICAgICAgICAgIGEzLkFUVFJJQlVURV9RVUFOVElaQVRJT05fVFJBTlNGT1JNID0gUmMoKTsKICAgICAgICAgICAgICBhMy5BVFRSSUJVVEVfT0NUQUhFRFJPTl9UUkFOU0ZPUk0gPSBTYygpOwogICAgICAgICAgICAgIGEzLklOVkFMSUQgPSBUYygpOwogICAgICAgICAgICAgIGEzLlBPU0lUSU9OID0gVWMoKTsKICAgICAgICAgICAgICBhMy5OT1JNQUwgPSBWYygpOwogICAgICAgICAgICAgIGEzLkNPTE9SID0gV2MoKTsKICAgICAgICAgICAgICBhMy5URVhfQ09PUkQgPSBYYygpOwogICAgICAgICAgICAgIGEzLkdFTkVSSUMgPSBZYygpOwogICAgICAgICAgICAgIGEzLklOVkFMSURfR0VPTUVUUllfVFlQRSA9IFpjKCk7CiAgICAgICAgICAgICAgYTMuUE9JTlRfQ0xPVUQgPSAkYygpOwogICAgICAgICAgICAgIGEzLlRSSUFOR1VMQVJfTUVTSCA9IGFkKCk7CiAgICAgICAgICAgICAgYTMuRFRfSU5WQUxJRCA9IGJkKCk7CiAgICAgICAgICAgICAgYTMuRFRfSU5UOCA9IGNkKCk7CiAgICAgICAgICAgICAgYTMuRFRfVUlOVDggPSBkZCgpOwogICAgICAgICAgICAgIGEzLkRUX0lOVDE2ID0gZWQoKTsKICAgICAgICAgICAgICBhMy5EVF9VSU5UMTYgPSBmZCgpOwogICAgICAgICAgICAgIGEzLkRUX0lOVDMyID0gZ2QoKTsKICAgICAgICAgICAgICBhMy5EVF9VSU5UMzIgPSBoZCgpOwogICAgICAgICAgICAgIGEzLkRUX0lOVDY0ID0gaWQoKTsKICAgICAgICAgICAgICBhMy5EVF9VSU5UNjQgPSBqZCgpOwogICAgICAgICAgICAgIGEzLkRUX0ZMT0FUMzIgPSBrZCgpOwogICAgICAgICAgICAgIGEzLkRUX0ZMT0FUNjQgPSBsZCgpOwogICAgICAgICAgICAgIGEzLkRUX0JPT0wgPSBtZCgpOwogICAgICAgICAgICAgIGEzLkRUX1RZUEVTX0NPVU5UID0gbmQoKTsKICAgICAgICAgICAgICBhMy5PSyA9IG9kKCk7CiAgICAgICAgICAgICAgYTMuRFJBQ09fRVJST1IgPSBwZCgpOwogICAgICAgICAgICAgIGEzLklPX0VSUk9SID0gcWQoKTsKICAgICAgICAgICAgICBhMy5JTlZBTElEX1BBUkFNRVRFUiA9IHJkKCk7CiAgICAgICAgICAgICAgYTMuVU5TVVBQT1JURURfVkVSU0lPTiA9IHNkKCk7CiAgICAgICAgICAgICAgYTMuVU5LTk9XTl9WRVJTSU9OID0gdGQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB6YSA/IGIoKSA6IG9hLnVuc2hpZnQoYik7CiAgICAgICAgICB9KSgpOwogICAgICAgICAgaWYgKCJmdW5jdGlvbiIgPT09IHR5cGVvZiBhMy5vbk1vZHVsZVBhcnNlZCkgYTMub25Nb2R1bGVQYXJzZWQoKTsKICAgICAgICAgIGEzLkRlY29kZXIucHJvdG90eXBlLkdldEVuY29kZWRHZW9tZXRyeVR5cGUgPSBmdW5jdGlvbihiKSB7CiAgICAgICAgICAgIGlmIChiLl9fY2xhc3NfXyAmJiBiLl9fY2xhc3NfXyA9PT0gYTMuRGVjb2RlckJ1ZmZlcikgcmV0dXJuIGEzLkRlY29kZXIucHJvdG90eXBlLkdldEVuY29kZWRHZW9tZXRyeVR5cGVfRGVwcmVjYXRlZChiKTsKICAgICAgICAgICAgaWYgKDggPiBiLmJ5dGVMZW5ndGgpIHJldHVybiBhMy5JTlZBTElEX0dFT01FVFJZX1RZUEU7CiAgICAgICAgICAgIHN3aXRjaCAoYls3XSkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHJldHVybiBhMy5QT0lOVF9DTE9VRDsKICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICByZXR1cm4gYTMuVFJJQU5HVUxBUl9NRVNIOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gYTMuSU5WQUxJRF9HRU9NRVRSWV9UWVBFOwogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIG4ucmVhZHk7CiAgICAgICAgfTsKICAgICAgfSkoKTsKICAgICAgIm9iamVjdCIgPT09IHR5cGVvZiBleHBvcnRzMiAmJiAib2JqZWN0IiA9PT0gdHlwZW9mIG1vZHVsZSA/IG1vZHVsZS5leHBvcnRzID0gRHJhY29EZWNvZGVyTW9kdWxlIDogImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGRlZmluZSAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFtdLCBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gRHJhY29EZWNvZGVyTW9kdWxlOwogICAgICB9KSA6ICJvYmplY3QiID09PSB0eXBlb2YgZXhwb3J0czIgJiYgKGV4cG9ydHMyLkRyYWNvRGVjb2Rlck1vZHVsZSA9IERyYWNvRGVjb2Rlck1vZHVsZSk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9kZWNvZGVEcmFjby5qcwogIHZhciBkZWNvZGVEcmFjb19leHBvcnRzID0ge307CiAgX19leHBvcnQoZGVjb2RlRHJhY29fZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gZGVjb2RlRHJhY29fZGVmYXVsdAogIH0pOwogIGZ1bmN0aW9uIGRlY29kZUluZGV4QXJyYXkoZHJhY29HZW9tZXRyeSwgZHJhY29EZWNvZGVyKSB7CiAgICBjb25zdCBudW1Qb2ludHMgPSBkcmFjb0dlb21ldHJ5Lm51bV9wb2ludHMoKTsKICAgIGNvbnN0IG51bUZhY2VzID0gZHJhY29HZW9tZXRyeS5udW1fZmFjZXMoKTsKICAgIGNvbnN0IGZhY2VJbmRpY2VzID0gbmV3IGRyYWNvLkRyYWNvSW50MzJBcnJheSgpOwogICAgY29uc3QgbnVtSW5kaWNlcyA9IG51bUZhY2VzICogMzsKICAgIGNvbnN0IGluZGV4QXJyYXkgPSBJbmRleERhdGF0eXBlX2RlZmF1bHQuY3JlYXRlVHlwZWRBcnJheShudW1Qb2ludHMsIG51bUluZGljZXMpOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUZhY2VzOyArK2kpIHsKICAgICAgZHJhY29EZWNvZGVyLkdldEZhY2VGcm9tTWVzaChkcmFjb0dlb21ldHJ5LCBpLCBmYWNlSW5kaWNlcyk7CiAgICAgIGluZGV4QXJyYXlbb2Zmc2V0ICsgMF0gPSBmYWNlSW5kaWNlcy5HZXRWYWx1ZSgwKTsKICAgICAgaW5kZXhBcnJheVtvZmZzZXQgKyAxXSA9IGZhY2VJbmRpY2VzLkdldFZhbHVlKDEpOwogICAgICBpbmRleEFycmF5W29mZnNldCArIDJdID0gZmFjZUluZGljZXMuR2V0VmFsdWUoMik7CiAgICAgIG9mZnNldCArPSAzOwogICAgfQogICAgZHJhY28uZGVzdHJveShmYWNlSW5kaWNlcyk7CiAgICByZXR1cm4gewogICAgICB0eXBlZEFycmF5OiBpbmRleEFycmF5LAogICAgICBudW1iZXJPZkluZGljZXM6IG51bUluZGljZXMKICAgIH07CiAgfQogIGZ1bmN0aW9uIGRlY29kZVF1YW50aXplZERyYWNvVHlwZWRBcnJheShkcmFjb0dlb21ldHJ5LCBkcmFjb0RlY29kZXIsIGRyYWNvQXR0cmlidXRlLCBxdWFudGl6YXRpb24sIHZlcnRleEFycmF5TGVuZ3RoKSB7CiAgICBsZXQgdmVydGV4QXJyYXk7CiAgICBsZXQgYXR0cmlidXRlRGF0YTsKICAgIGlmIChxdWFudGl6YXRpb24ucXVhbnRpemF0aW9uQml0cyA8PSA4KSB7CiAgICAgIGF0dHJpYnV0ZURhdGEgPSBuZXcgZHJhY28uRHJhY29VSW50OEFycmF5KCk7CiAgICAgIHZlcnRleEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkodmVydGV4QXJyYXlMZW5ndGgpOwogICAgICBkcmFjb0RlY29kZXIuR2V0QXR0cmlidXRlVUludDhGb3JBbGxQb2ludHMoCiAgICAgICAgZHJhY29HZW9tZXRyeSwKICAgICAgICBkcmFjb0F0dHJpYnV0ZSwKICAgICAgICBhdHRyaWJ1dGVEYXRhCiAgICAgICk7CiAgICB9IGVsc2UgaWYgKHF1YW50aXphdGlvbi5xdWFudGl6YXRpb25CaXRzIDw9IDE2KSB7CiAgICAgIGF0dHJpYnV0ZURhdGEgPSBuZXcgZHJhY28uRHJhY29VSW50MTZBcnJheSgpOwogICAgICB2ZXJ0ZXhBcnJheSA9IG5ldyBVaW50MTZBcnJheSh2ZXJ0ZXhBcnJheUxlbmd0aCk7CiAgICAgIGRyYWNvRGVjb2Rlci5HZXRBdHRyaWJ1dGVVSW50MTZGb3JBbGxQb2ludHMoCiAgICAgICAgZHJhY29HZW9tZXRyeSwKICAgICAgICBkcmFjb0F0dHJpYnV0ZSwKICAgICAgICBhdHRyaWJ1dGVEYXRhCiAgICAgICk7CiAgICB9IGVsc2UgewogICAgICBhdHRyaWJ1dGVEYXRhID0gbmV3IGRyYWNvLkRyYWNvRmxvYXQzMkFycmF5KCk7CiAgICAgIHZlcnRleEFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSh2ZXJ0ZXhBcnJheUxlbmd0aCk7CiAgICAgIGRyYWNvRGVjb2Rlci5HZXRBdHRyaWJ1dGVGbG9hdEZvckFsbFBvaW50cygKICAgICAgICBkcmFjb0dlb21ldHJ5LAogICAgICAgIGRyYWNvQXR0cmlidXRlLAogICAgICAgIGF0dHJpYnV0ZURhdGEKICAgICAgKTsKICAgIH0KICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4QXJyYXlMZW5ndGg7ICsraSkgewogICAgICB2ZXJ0ZXhBcnJheVtpXSA9IGF0dHJpYnV0ZURhdGEuR2V0VmFsdWUoaSk7CiAgICB9CiAgICBkcmFjby5kZXN0cm95KGF0dHJpYnV0ZURhdGEpOwogICAgcmV0dXJuIHZlcnRleEFycmF5OwogIH0KICBmdW5jdGlvbiBkZWNvZGVEcmFjb1R5cGVkQXJyYXkoZHJhY29HZW9tZXRyeSwgZHJhY29EZWNvZGVyLCBkcmFjb0F0dHJpYnV0ZSwgdmVydGV4QXJyYXlMZW5ndGgpIHsKICAgIGxldCB2ZXJ0ZXhBcnJheTsKICAgIGxldCBhdHRyaWJ1dGVEYXRhOwogICAgc3dpdGNoIChkcmFjb0F0dHJpYnV0ZS5kYXRhX3R5cGUoKSkgewogICAgICBjYXNlIDE6CiAgICAgIGNhc2UgMTE6CiAgICAgICAgYXR0cmlidXRlRGF0YSA9IG5ldyBkcmFjby5EcmFjb0ludDhBcnJheSgpOwogICAgICAgIHZlcnRleEFycmF5ID0gbmV3IEludDhBcnJheSh2ZXJ0ZXhBcnJheUxlbmd0aCk7CiAgICAgICAgZHJhY29EZWNvZGVyLkdldEF0dHJpYnV0ZUludDhGb3JBbGxQb2ludHMoCiAgICAgICAgICBkcmFjb0dlb21ldHJ5LAogICAgICAgICAgZHJhY29BdHRyaWJ1dGUsCiAgICAgICAgICBhdHRyaWJ1dGVEYXRhCiAgICAgICAgKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAyOgogICAgICAgIGF0dHJpYnV0ZURhdGEgPSBuZXcgZHJhY28uRHJhY29VSW50OEFycmF5KCk7CiAgICAgICAgdmVydGV4QXJyYXkgPSBuZXcgVWludDhBcnJheSh2ZXJ0ZXhBcnJheUxlbmd0aCk7CiAgICAgICAgZHJhY29EZWNvZGVyLkdldEF0dHJpYnV0ZVVJbnQ4Rm9yQWxsUG9pbnRzKAogICAgICAgICAgZHJhY29HZW9tZXRyeSwKICAgICAgICAgIGRyYWNvQXR0cmlidXRlLAogICAgICAgICAgYXR0cmlidXRlRGF0YQogICAgICAgICk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMzoKICAgICAgICBhdHRyaWJ1dGVEYXRhID0gbmV3IGRyYWNvLkRyYWNvSW50MTZBcnJheSgpOwogICAgICAgIHZlcnRleEFycmF5ID0gbmV3IEludDE2QXJyYXkodmVydGV4QXJyYXlMZW5ndGgpOwogICAgICAgIGRyYWNvRGVjb2Rlci5HZXRBdHRyaWJ1dGVJbnQxNkZvckFsbFBvaW50cygKICAgICAgICAgIGRyYWNvR2VvbWV0cnksCiAgICAgICAgICBkcmFjb0F0dHJpYnV0ZSwKICAgICAgICAgIGF0dHJpYnV0ZURhdGEKICAgICAgICApOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDQ6CiAgICAgICAgYXR0cmlidXRlRGF0YSA9IG5ldyBkcmFjby5EcmFjb1VJbnQxNkFycmF5KCk7CiAgICAgICAgdmVydGV4QXJyYXkgPSBuZXcgVWludDE2QXJyYXkodmVydGV4QXJyYXlMZW5ndGgpOwogICAgICAgIGRyYWNvRGVjb2Rlci5HZXRBdHRyaWJ1dGVVSW50MTZGb3JBbGxQb2ludHMoCiAgICAgICAgICBkcmFjb0dlb21ldHJ5LAogICAgICAgICAgZHJhY29BdHRyaWJ1dGUsCiAgICAgICAgICBhdHRyaWJ1dGVEYXRhCiAgICAgICAgKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA1OgogICAgICBjYXNlIDc6CiAgICAgICAgYXR0cmlidXRlRGF0YSA9IG5ldyBkcmFjby5EcmFjb0ludDMyQXJyYXkoKTsKICAgICAgICB2ZXJ0ZXhBcnJheSA9IG5ldyBJbnQzMkFycmF5KHZlcnRleEFycmF5TGVuZ3RoKTsKICAgICAgICBkcmFjb0RlY29kZXIuR2V0QXR0cmlidXRlSW50MzJGb3JBbGxQb2ludHMoCiAgICAgICAgICBkcmFjb0dlb21ldHJ5LAogICAgICAgICAgZHJhY29BdHRyaWJ1dGUsCiAgICAgICAgICBhdHRyaWJ1dGVEYXRhCiAgICAgICAgKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA2OgogICAgICBjYXNlIDg6CiAgICAgICAgYXR0cmlidXRlRGF0YSA9IG5ldyBkcmFjby5EcmFjb1VJbnQzMkFycmF5KCk7CiAgICAgICAgdmVydGV4QXJyYXkgPSBuZXcgVWludDMyQXJyYXkodmVydGV4QXJyYXlMZW5ndGgpOwogICAgICAgIGRyYWNvRGVjb2Rlci5HZXRBdHRyaWJ1dGVVSW50MzJGb3JBbGxQb2ludHMoCiAgICAgICAgICBkcmFjb0dlb21ldHJ5LAogICAgICAgICAgZHJhY29BdHRyaWJ1dGUsCiAgICAgICAgICBhdHRyaWJ1dGVEYXRhCiAgICAgICAgKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA5OgogICAgICBjYXNlIDEwOgogICAgICAgIGF0dHJpYnV0ZURhdGEgPSBuZXcgZHJhY28uRHJhY29GbG9hdDMyQXJyYXkoKTsKICAgICAgICB2ZXJ0ZXhBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkodmVydGV4QXJyYXlMZW5ndGgpOwogICAgICAgIGRyYWNvRGVjb2Rlci5HZXRBdHRyaWJ1dGVGbG9hdEZvckFsbFBvaW50cygKICAgICAgICAgIGRyYWNvR2VvbWV0cnksCiAgICAgICAgICBkcmFjb0F0dHJpYnV0ZSwKICAgICAgICAgIGF0dHJpYnV0ZURhdGEKICAgICAgICApOwogICAgICAgIGJyZWFrOwogICAgfQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhBcnJheUxlbmd0aDsgKytpKSB7CiAgICAgIHZlcnRleEFycmF5W2ldID0gYXR0cmlidXRlRGF0YS5HZXRWYWx1ZShpKTsKICAgIH0KICAgIGRyYWNvLmRlc3Ryb3koYXR0cmlidXRlRGF0YSk7CiAgICByZXR1cm4gdmVydGV4QXJyYXk7CiAgfQogIGZ1bmN0aW9uIGRlY29kZUF0dHJpYnV0ZShkcmFjb0dlb21ldHJ5LCBkcmFjb0RlY29kZXIsIGRyYWNvQXR0cmlidXRlKSB7CiAgICBjb25zdCBudW1Qb2ludHMgPSBkcmFjb0dlb21ldHJ5Lm51bV9wb2ludHMoKTsKICAgIGNvbnN0IG51bUNvbXBvbmVudHMgPSBkcmFjb0F0dHJpYnV0ZS5udW1fY29tcG9uZW50cygpOwogICAgbGV0IHF1YW50aXphdGlvbjsKICAgIGxldCB0cmFuc2Zvcm0yID0gbmV3IGRyYWNvLkF0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybSgpOwogICAgaWYgKHRyYW5zZm9ybTIuSW5pdEZyb21BdHRyaWJ1dGUoZHJhY29BdHRyaWJ1dGUpKSB7CiAgICAgIGNvbnN0IG1pblZhbHVlcyA9IG5ldyBBcnJheShudW1Db21wb25lbnRzKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db21wb25lbnRzOyArK2kpIHsKICAgICAgICBtaW5WYWx1ZXNbaV0gPSB0cmFuc2Zvcm0yLm1pbl92YWx1ZShpKTsKICAgICAgfQogICAgICBxdWFudGl6YXRpb24gPSB7CiAgICAgICAgcXVhbnRpemF0aW9uQml0czogdHJhbnNmb3JtMi5xdWFudGl6YXRpb25fYml0cygpLAogICAgICAgIG1pblZhbHVlcywKICAgICAgICByYW5nZTogdHJhbnNmb3JtMi5yYW5nZSgpLAogICAgICAgIG9jdEVuY29kZWQ6IGZhbHNlCiAgICAgIH07CiAgICB9CiAgICBkcmFjby5kZXN0cm95KHRyYW5zZm9ybTIpOwogICAgdHJhbnNmb3JtMiA9IG5ldyBkcmFjby5BdHRyaWJ1dGVPY3RhaGVkcm9uVHJhbnNmb3JtKCk7CiAgICBpZiAodHJhbnNmb3JtMi5Jbml0RnJvbUF0dHJpYnV0ZShkcmFjb0F0dHJpYnV0ZSkpIHsKICAgICAgcXVhbnRpemF0aW9uID0gewogICAgICAgIHF1YW50aXphdGlvbkJpdHM6IHRyYW5zZm9ybTIucXVhbnRpemF0aW9uX2JpdHMoKSwKICAgICAgICBvY3RFbmNvZGVkOiB0cnVlCiAgICAgIH07CiAgICB9CiAgICBkcmFjby5kZXN0cm95KHRyYW5zZm9ybTIpOwogICAgY29uc3QgdmVydGV4QXJyYXlMZW5ndGggPSBudW1Qb2ludHMgKiBudW1Db21wb25lbnRzOwogICAgbGV0IHZlcnRleEFycmF5OwogICAgaWYgKGRlZmluZWRfZGVmYXVsdChxdWFudGl6YXRpb24pKSB7CiAgICAgIHZlcnRleEFycmF5ID0gZGVjb2RlUXVhbnRpemVkRHJhY29UeXBlZEFycmF5KAogICAgICAgIGRyYWNvR2VvbWV0cnksCiAgICAgICAgZHJhY29EZWNvZGVyLAogICAgICAgIGRyYWNvQXR0cmlidXRlLAogICAgICAgIHF1YW50aXphdGlvbiwKICAgICAgICB2ZXJ0ZXhBcnJheUxlbmd0aAogICAgICApOwogICAgfSBlbHNlIHsKICAgICAgdmVydGV4QXJyYXkgPSBkZWNvZGVEcmFjb1R5cGVkQXJyYXkoCiAgICAgICAgZHJhY29HZW9tZXRyeSwKICAgICAgICBkcmFjb0RlY29kZXIsCiAgICAgICAgZHJhY29BdHRyaWJ1dGUsCiAgICAgICAgdmVydGV4QXJyYXlMZW5ndGgKICAgICAgKTsKICAgIH0KICAgIGNvbnN0IGNvbXBvbmVudERhdGF0eXBlID0gQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5mcm9tVHlwZWRBcnJheSh2ZXJ0ZXhBcnJheSk7CiAgICByZXR1cm4gewogICAgICBhcnJheTogdmVydGV4QXJyYXksCiAgICAgIGRhdGE6IHsKICAgICAgICBjb21wb25lbnRzUGVyQXR0cmlidXRlOiBudW1Db21wb25lbnRzLAogICAgICAgIGNvbXBvbmVudERhdGF0eXBlLAogICAgICAgIGJ5dGVPZmZzZXQ6IGRyYWNvQXR0cmlidXRlLmJ5dGVfb2Zmc2V0KCksCiAgICAgICAgYnl0ZVN0cmlkZTogQ29tcG9uZW50RGF0YXR5cGVfZGVmYXVsdC5nZXRTaXplSW5CeXRlcyhjb21wb25lbnREYXRhdHlwZSkgKiBudW1Db21wb25lbnRzLAogICAgICAgIG5vcm1hbGl6ZWQ6IGRyYWNvQXR0cmlidXRlLm5vcm1hbGl6ZWQoKSwKICAgICAgICBxdWFudGl6YXRpb24KICAgICAgfQogICAgfTsKICB9CiAgZnVuY3Rpb24gZGVjb2RlUG9pbnRDbG91ZChwYXJhbWV0ZXJzKSB7CiAgICBjb25zdCBkcmFjb0RlY29kZXIgPSBuZXcgZHJhY28uRGVjb2RlcigpOwogICAgaWYgKHBhcmFtZXRlcnMuZGVxdWFudGl6ZUluU2hhZGVyKSB7CiAgICAgIGRyYWNvRGVjb2Rlci5Ta2lwQXR0cmlidXRlVHJhbnNmb3JtKGRyYWNvLlBPU0lUSU9OKTsKICAgICAgZHJhY29EZWNvZGVyLlNraXBBdHRyaWJ1dGVUcmFuc2Zvcm0oZHJhY28uTk9STUFMKTsKICAgIH0KICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBkcmFjby5EZWNvZGVyQnVmZmVyKCk7CiAgICBidWZmZXIuSW5pdChwYXJhbWV0ZXJzLmJ1ZmZlciwgcGFyYW1ldGVycy5idWZmZXIubGVuZ3RoKTsKICAgIGNvbnN0IGdlb21ldHJ5VHlwZSA9IGRyYWNvRGVjb2Rlci5HZXRFbmNvZGVkR2VvbWV0cnlUeXBlKGJ1ZmZlcik7CiAgICBpZiAoZ2VvbWV0cnlUeXBlICE9PSBkcmFjby5QT0lOVF9DTE9VRCkgewogICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yX2RlZmF1bHQoIkRyYWNvIGdlb21ldHJ5IHR5cGUgbXVzdCBiZSBQT0lOVF9DTE9VRC4iKTsKICAgIH0KICAgIGNvbnN0IGRyYWNvUG9pbnRDbG91ZCA9IG5ldyBkcmFjby5Qb2ludENsb3VkKCk7CiAgICBjb25zdCBkZWNvZGluZ1N0YXR1cyA9IGRyYWNvRGVjb2Rlci5EZWNvZGVCdWZmZXJUb1BvaW50Q2xvdWQoCiAgICAgIGJ1ZmZlciwKICAgICAgZHJhY29Qb2ludENsb3VkCiAgICApOwogICAgaWYgKCFkZWNvZGluZ1N0YXR1cy5vaygpIHx8IGRyYWNvUG9pbnRDbG91ZC5wdHIgPT09IDApIHsKICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcl9kZWZhdWx0KAogICAgICAgIGBFcnJvciBkZWNvZGluZyBkcmFjbyBwb2ludCBjbG91ZDogJHtkZWNvZGluZ1N0YXR1cy5lcnJvcl9tc2coKX1gCiAgICAgICk7CiAgICB9CiAgICBkcmFjby5kZXN0cm95KGJ1ZmZlcik7CiAgICBjb25zdCByZXN1bHQgPSB7fTsKICAgIGNvbnN0IHByb3BlcnRpZXMgPSBwYXJhbWV0ZXJzLnByb3BlcnRpZXM7CiAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBpbiBwcm9wZXJ0aWVzKSB7CiAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHByb3BlcnR5TmFtZSkpIHsKICAgICAgICBsZXQgZHJhY29BdHRyaWJ1dGU7CiAgICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PT0gIlBPU0lUSU9OIiB8fCBwcm9wZXJ0eU5hbWUgPT09ICJOT1JNQUwiKSB7CiAgICAgICAgICBjb25zdCBkcmFjb0F0dHJpYnV0ZUlkID0gZHJhY29EZWNvZGVyLkdldEF0dHJpYnV0ZUlkKAogICAgICAgICAgICBkcmFjb1BvaW50Q2xvdWQsCiAgICAgICAgICAgIGRyYWNvW3Byb3BlcnR5TmFtZV0KICAgICAgICAgICk7CiAgICAgICAgICBkcmFjb0F0dHJpYnV0ZSA9IGRyYWNvRGVjb2Rlci5HZXRBdHRyaWJ1dGUoCiAgICAgICAgICAgIGRyYWNvUG9pbnRDbG91ZCwKICAgICAgICAgICAgZHJhY29BdHRyaWJ1dGVJZAogICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgYXR0cmlidXRlSWQgPSBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07CiAgICAgICAgICBkcmFjb0F0dHJpYnV0ZSA9IGRyYWNvRGVjb2Rlci5HZXRBdHRyaWJ1dGVCeVVuaXF1ZUlkKAogICAgICAgICAgICBkcmFjb1BvaW50Q2xvdWQsCiAgICAgICAgICAgIGF0dHJpYnV0ZUlkCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXN1bHRbcHJvcGVydHlOYW1lXSA9IGRlY29kZUF0dHJpYnV0ZSgKICAgICAgICAgIGRyYWNvUG9pbnRDbG91ZCwKICAgICAgICAgIGRyYWNvRGVjb2RlciwKICAgICAgICAgIGRyYWNvQXR0cmlidXRlCiAgICAgICAgKTsKICAgICAgfQogICAgfQogICAgZHJhY28uZGVzdHJveShkcmFjb1BvaW50Q2xvdWQpOwogICAgZHJhY28uZGVzdHJveShkcmFjb0RlY29kZXIpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgZnVuY3Rpb24gZGVjb2RlUHJpbWl0aXZlKHBhcmFtZXRlcnMpIHsKICAgIGNvbnN0IGRyYWNvRGVjb2RlciA9IG5ldyBkcmFjby5EZWNvZGVyKCk7CiAgICBpZiAocGFyYW1ldGVycy5kZXF1YW50aXplSW5TaGFkZXIpIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmF0dHJpYnV0ZXNUb1NraXBUcmFuc2Zvcm0ubGVuZ3RoOyArK2kpIHsKICAgICAgICBkcmFjb0RlY29kZXIuU2tpcEF0dHJpYnV0ZVRyYW5zZm9ybSgKICAgICAgICAgIGRyYWNvW3BhcmFtZXRlcnMuYXR0cmlidXRlc1RvU2tpcFRyYW5zZm9ybVtpXV0KICAgICAgICApOwogICAgICB9CiAgICB9CiAgICBjb25zdCBidWZmZXJWaWV3ID0gcGFyYW1ldGVycy5idWZmZXJWaWV3OwogICAgY29uc3QgYnVmZmVyID0gbmV3IGRyYWNvLkRlY29kZXJCdWZmZXIoKTsKICAgIGJ1ZmZlci5Jbml0KHBhcmFtZXRlcnMuYXJyYXksIGJ1ZmZlclZpZXcuYnl0ZUxlbmd0aCk7CiAgICBjb25zdCBnZW9tZXRyeVR5cGUgPSBkcmFjb0RlY29kZXIuR2V0RW5jb2RlZEdlb21ldHJ5VHlwZShidWZmZXIpOwogICAgaWYgKGdlb21ldHJ5VHlwZSAhPT0gZHJhY28uVFJJQU5HVUxBUl9NRVNIKSB7CiAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3JfZGVmYXVsdCgiVW5zdXBwb3J0ZWQgZHJhY28gbWVzaCBnZW9tZXRyeSB0eXBlLiIpOwogICAgfQogICAgY29uc3QgZHJhY29HZW9tZXRyeSA9IG5ldyBkcmFjby5NZXNoKCk7CiAgICBjb25zdCBkZWNvZGluZ1N0YXR1cyA9IGRyYWNvRGVjb2Rlci5EZWNvZGVCdWZmZXJUb01lc2goYnVmZmVyLCBkcmFjb0dlb21ldHJ5KTsKICAgIGlmICghZGVjb2RpbmdTdGF0dXMub2soKSB8fCBkcmFjb0dlb21ldHJ5LnB0ciA9PT0gMCkgewogICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yX2RlZmF1bHQoCiAgICAgICAgYEVycm9yIGRlY29kaW5nIGRyYWNvIG1lc2ggZ2VvbWV0cnk6ICR7ZGVjb2RpbmdTdGF0dXMuZXJyb3JfbXNnKCl9YAogICAgICApOwogICAgfQogICAgZHJhY28uZGVzdHJveShidWZmZXIpOwogICAgY29uc3QgYXR0cmlidXRlRGF0YSA9IHt9OwogICAgY29uc3QgY29tcHJlc3NlZEF0dHJpYnV0ZXMgPSBwYXJhbWV0ZXJzLmNvbXByZXNzZWRBdHRyaWJ1dGVzOwogICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIGluIGNvbXByZXNzZWRBdHRyaWJ1dGVzKSB7CiAgICAgIGlmIChjb21wcmVzc2VkQXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShhdHRyaWJ1dGVOYW1lKSkgewogICAgICAgIGNvbnN0IGNvbXByZXNzZWRBdHRyaWJ1dGUgPSBjb21wcmVzc2VkQXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXTsKICAgICAgICBjb25zdCBkcmFjb0F0dHJpYnV0ZSA9IGRyYWNvRGVjb2Rlci5HZXRBdHRyaWJ1dGVCeVVuaXF1ZUlkKAogICAgICAgICAgZHJhY29HZW9tZXRyeSwKICAgICAgICAgIGNvbXByZXNzZWRBdHRyaWJ1dGUKICAgICAgICApOwogICAgICAgIGF0dHJpYnV0ZURhdGFbYXR0cmlidXRlTmFtZV0gPSBkZWNvZGVBdHRyaWJ1dGUoCiAgICAgICAgICBkcmFjb0dlb21ldHJ5LAogICAgICAgICAgZHJhY29EZWNvZGVyLAogICAgICAgICAgZHJhY29BdHRyaWJ1dGUKICAgICAgICApOwogICAgICB9CiAgICB9CiAgICBjb25zdCByZXN1bHQgPSB7CiAgICAgIGluZGV4QXJyYXk6IGRlY29kZUluZGV4QXJyYXkoZHJhY29HZW9tZXRyeSwgZHJhY29EZWNvZGVyKSwKICAgICAgYXR0cmlidXRlRGF0YQogICAgfTsKICAgIGRyYWNvLmRlc3Ryb3koZHJhY29HZW9tZXRyeSk7CiAgICBkcmFjby5kZXN0cm95KGRyYWNvRGVjb2Rlcik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBhc3luYyBmdW5jdGlvbiBkZWNvZGUocGFyYW1ldGVycywgdHJhbnNmZXJhYmxlT2JqZWN0cykgewogICAgaWYgKGRlZmluZWRfZGVmYXVsdChwYXJhbWV0ZXJzLmJ1ZmZlclZpZXcpKSB7CiAgICAgIHJldHVybiBkZWNvZGVQcmltaXRpdmUocGFyYW1ldGVycyk7CiAgICB9CiAgICByZXR1cm4gZGVjb2RlUG9pbnRDbG91ZChwYXJhbWV0ZXJzKTsKICB9CiAgYXN5bmMgZnVuY3Rpb24gaW5pdFdvcmtlcihwYXJhbWV0ZXJzLCB0cmFuc2ZlcmFibGVPYmplY3RzKSB7CiAgICBjb25zdCB3YXNtQ29uZmlnID0gcGFyYW1ldGVycy53ZWJBc3NlbWJseUNvbmZpZzsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQod2FzbUNvbmZpZykgJiYgZGVmaW5lZF9kZWZhdWx0KHdhc21Db25maWcud2FzbUJpbmFyeUZpbGUpKSB7CiAgICAgIGRyYWNvID0gYXdhaXQgKDAsIGltcG9ydF9kcmFjb19kZWNvZGVyX25vZGVqcy5kZWZhdWx0KSh3YXNtQ29uZmlnKTsKICAgIH0gZWxzZSB7CiAgICAgIGRyYWNvID0gYXdhaXQgKDAsIGltcG9ydF9kcmFjb19kZWNvZGVyX25vZGVqcy5kZWZhdWx0KSgpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIGFzeW5jIGZ1bmN0aW9uIGRlY29kZURyYWNvKHBhcmFtZXRlcnMsIHRyYW5zZmVyYWJsZU9iamVjdHMpIHsKICAgIGNvbnN0IHdhc21Db25maWcgPSBwYXJhbWV0ZXJzLndlYkFzc2VtYmx5Q29uZmlnOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdCh3YXNtQ29uZmlnKSkgewogICAgICByZXR1cm4gaW5pdFdvcmtlcihwYXJhbWV0ZXJzLCB0cmFuc2ZlcmFibGVPYmplY3RzKTsKICAgIH0KICAgIHJldHVybiBkZWNvZGUocGFyYW1ldGVycywgdHJhbnNmZXJhYmxlT2JqZWN0cyk7CiAgfQogIHZhciBpbXBvcnRfZHJhY29fZGVjb2Rlcl9ub2RlanMsIGRyYWNvLCBkZWNvZGVEcmFjb19kZWZhdWx0OwogIHZhciBpbml0X2RlY29kZURyYWNvID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9kZWNvZGVEcmFjby5qcyIoKSB7CiAgICAgIGluaXRfQ29tcG9uZW50RGF0YXR5cGUoKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfSW5kZXhEYXRhdHlwZSgpOwogICAgICBpbml0X1J1bnRpbWVFcnJvcigpOwogICAgICBpbml0X2NyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXIoKTsKICAgICAgaW1wb3J0X2RyYWNvX2RlY29kZXJfbm9kZWpzID0gX190b0VTTShyZXF1aXJlX2RyYWNvX2RlY29kZXJfbm9kZWpzKCksIDEpOwogICAgICBkZWNvZGVEcmFjb19kZWZhdWx0ID0gY3JlYXRlVGFza1Byb2Nlc3Nvcldvcmtlcl9kZWZhdWx0KGRlY29kZURyYWNvKTsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2RlY29kZUdvb2dsZUVhcnRoRW50ZXJwcmlzZURhdGEuanMKICBmdW5jdGlvbiBkZWNvZGVHb29nbGVFYXJ0aEVudGVycHJpc2VEYXRhKGtleSwgZGF0YSkgewogICAgaWYgKGRlY29kZUdvb2dsZUVhcnRoRW50ZXJwcmlzZURhdGEucGFzc1Rocm91Z2hEYXRhRm9yVGVzdGluZykgewogICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgia2V5Iiwga2V5KTsKICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiZGF0YSIsIGRhdGEpOwogICAgY29uc3Qga2V5TGVuZ3RoID0ga2V5LmJ5dGVMZW5ndGg7CiAgICBpZiAoa2V5TGVuZ3RoID09PSAwIHx8IGtleUxlbmd0aCAlIDQgIT09IDApIHsKICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcl9kZWZhdWx0KAogICAgICAgICJUaGUgbGVuZ3RoIG9mIGtleSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIGFuZCBhIG11bHRpcGxlIG9mIDQuIgogICAgICApOwogICAgfQogICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoZGF0YSk7CiAgICBjb25zdCBtYWdpYyA9IGRhdGFWaWV3LmdldFVpbnQzMigwLCB0cnVlKTsKICAgIGlmIChtYWdpYyA9PT0gY29tcHJlc3NlZE1hZ2ljIHx8IG1hZ2ljID09PSBjb21wcmVzc2VkTWFnaWNTd2FwKSB7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgY29uc3Qga2V5VmlldyA9IG5ldyBEYXRhVmlldyhrZXkpOwogICAgbGV0IGRwID0gMDsKICAgIGNvbnN0IGRwZW5kID0gZGF0YS5ieXRlTGVuZ3RoOwogICAgY29uc3QgZHBlbmQ2NCA9IGRwZW5kIC0gZHBlbmQgJSA4OwogICAgY29uc3Qga3BlbmQgPSBrZXlMZW5ndGg7CiAgICBsZXQga3A7CiAgICBsZXQgb2ZmID0gODsKICAgIHdoaWxlIChkcCA8IGRwZW5kNjQpIHsKICAgICAgb2ZmID0gKG9mZiArIDgpICUgMjQ7CiAgICAgIGtwID0gb2ZmOwogICAgICB3aGlsZSAoZHAgPCBkcGVuZDY0ICYmIGtwIDwga3BlbmQpIHsKICAgICAgICBkYXRhVmlldy5zZXRVaW50MzIoCiAgICAgICAgICBkcCwKICAgICAgICAgIGRhdGFWaWV3LmdldFVpbnQzMihkcCwgdHJ1ZSkgXiBrZXlWaWV3LmdldFVpbnQzMihrcCwgdHJ1ZSksCiAgICAgICAgICB0cnVlCiAgICAgICAgKTsKICAgICAgICBkYXRhVmlldy5zZXRVaW50MzIoCiAgICAgICAgICBkcCArIDQsCiAgICAgICAgICBkYXRhVmlldy5nZXRVaW50MzIoZHAgKyA0LCB0cnVlKSBeIGtleVZpZXcuZ2V0VWludDMyKGtwICsgNCwgdHJ1ZSksCiAgICAgICAgICB0cnVlCiAgICAgICAgKTsKICAgICAgICBkcCArPSA4OwogICAgICAgIGtwICs9IDI0OwogICAgICB9CiAgICB9CiAgICBpZiAoZHAgPCBkcGVuZCkgewogICAgICBpZiAoa3AgPj0ga3BlbmQpIHsKICAgICAgICBvZmYgPSAob2ZmICsgOCkgJSAyNDsKICAgICAgICBrcCA9IG9mZjsKICAgICAgfQogICAgICB3aGlsZSAoZHAgPCBkcGVuZCkgewogICAgICAgIGRhdGFWaWV3LnNldFVpbnQ4KGRwLCBkYXRhVmlldy5nZXRVaW50OChkcCkgXiBrZXlWaWV3LmdldFVpbnQ4KGtwKSk7CiAgICAgICAgZHArKzsKICAgICAgICBrcCsrOwogICAgICB9CiAgICB9CiAgfQogIHZhciBjb21wcmVzc2VkTWFnaWMsIGNvbXByZXNzZWRNYWdpY1N3YXAsIGRlY29kZUdvb2dsZUVhcnRoRW50ZXJwcmlzZURhdGFfZGVmYXVsdDsKICB2YXIgaW5pdF9kZWNvZGVHb29nbGVFYXJ0aEVudGVycHJpc2VEYXRhID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9kZWNvZGVHb29nbGVFYXJ0aEVudGVycHJpc2VEYXRhLmpzIigpIHsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X1J1bnRpbWVFcnJvcigpOwogICAgICBjb21wcmVzc2VkTWFnaWMgPSAxOTUzMDI5ODA1OwogICAgICBjb21wcmVzc2VkTWFnaWNTd2FwID0gMjkxNzAzNDEwMDsKICAgICAgZGVjb2RlR29vZ2xlRWFydGhFbnRlcnByaXNlRGF0YS5wYXNzVGhyb3VnaERhdGFGb3JUZXN0aW5nID0gZmFsc2U7CiAgICAgIGRlY29kZUdvb2dsZUVhcnRoRW50ZXJwcmlzZURhdGFfZGVmYXVsdCA9IGRlY29kZUdvb2dsZUVhcnRoRW50ZXJwcmlzZURhdGE7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9pc0JpdFNldC5qcwogIGZ1bmN0aW9uIGlzQml0U2V0KGJpdHMsIG1hc2spIHsKICAgIHJldHVybiAoYml0cyAmIG1hc2spICE9PSAwOwogIH0KICB2YXIgaXNCaXRTZXRfZGVmYXVsdDsKICB2YXIgaW5pdF9pc0JpdFNldCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvaXNCaXRTZXQuanMiKCkgewogICAgICBpc0JpdFNldF9kZWZhdWx0ID0gaXNCaXRTZXQ7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Hb29nbGVFYXJ0aEVudGVycHJpc2VUaWxlSW5mb3JtYXRpb24uanMKICBmdW5jdGlvbiBHb29nbGVFYXJ0aEVudGVycHJpc2VUaWxlSW5mb3JtYXRpb24oYml0cywgY25vZGVWZXJzaW9uLCBpbWFnZXJ5VmVyc2lvbiwgdGVycmFpblZlcnNpb24sIGltYWdlcnlQcm92aWRlciwgdGVycmFpblByb3ZpZGVyKSB7CiAgICB0aGlzLl9iaXRzID0gYml0czsKICAgIHRoaXMuY25vZGVWZXJzaW9uID0gY25vZGVWZXJzaW9uOwogICAgdGhpcy5pbWFnZXJ5VmVyc2lvbiA9IGltYWdlcnlWZXJzaW9uOwogICAgdGhpcy50ZXJyYWluVmVyc2lvbiA9IHRlcnJhaW5WZXJzaW9uOwogICAgdGhpcy5pbWFnZXJ5UHJvdmlkZXIgPSBpbWFnZXJ5UHJvdmlkZXI7CiAgICB0aGlzLnRlcnJhaW5Qcm92aWRlciA9IHRlcnJhaW5Qcm92aWRlcjsKICAgIHRoaXMuYW5jZXN0b3JIYXNUZXJyYWluID0gZmFsc2U7CiAgICB0aGlzLnRlcnJhaW5TdGF0ZSA9IHZvaWQgMDsKICB9CiAgdmFyIGNoaWxkcmVuQml0bWFza3MsIGFueUNoaWxkQml0bWFzaywgY2FjaGVGbGFnQml0bWFzaywgaW1hZ2VCaXRtYXNrLCB0ZXJyYWluQml0bWFzaywgR29vZ2xlRWFydGhFbnRlcnByaXNlVGlsZUluZm9ybWF0aW9uX2RlZmF1bHQ7CiAgdmFyIGluaXRfR29vZ2xlRWFydGhFbnRlcnByaXNlVGlsZUluZm9ybWF0aW9uID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9Hb29nbGVFYXJ0aEVudGVycHJpc2VUaWxlSW5mb3JtYXRpb24uanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9pc0JpdFNldCgpOwogICAgICBjaGlsZHJlbkJpdG1hc2tzID0gWzEsIDIsIDQsIDhdOwogICAgICBhbnlDaGlsZEJpdG1hc2sgPSAxNTsKICAgICAgY2FjaGVGbGFnQml0bWFzayA9IDE2OwogICAgICBpbWFnZUJpdG1hc2sgPSA2NDsKICAgICAgdGVycmFpbkJpdG1hc2sgPSAxMjg7CiAgICAgIEdvb2dsZUVhcnRoRW50ZXJwcmlzZVRpbGVJbmZvcm1hdGlvbi5jbG9uZSA9IGZ1bmN0aW9uKGluZm8sIHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBHb29nbGVFYXJ0aEVudGVycHJpc2VUaWxlSW5mb3JtYXRpb24oCiAgICAgICAgICAgIGluZm8uX2JpdHMsCiAgICAgICAgICAgIGluZm8uY25vZGVWZXJzaW9uLAogICAgICAgICAgICBpbmZvLmltYWdlcnlWZXJzaW9uLAogICAgICAgICAgICBpbmZvLnRlcnJhaW5WZXJzaW9uLAogICAgICAgICAgICBpbmZvLmltYWdlcnlQcm92aWRlciwKICAgICAgICAgICAgaW5mby50ZXJyYWluUHJvdmlkZXIKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdC5fYml0cyA9IGluZm8uX2JpdHM7CiAgICAgICAgICByZXN1bHQuY25vZGVWZXJzaW9uID0gaW5mby5jbm9kZVZlcnNpb247CiAgICAgICAgICByZXN1bHQuaW1hZ2VyeVZlcnNpb24gPSBpbmZvLmltYWdlcnlWZXJzaW9uOwogICAgICAgICAgcmVzdWx0LnRlcnJhaW5WZXJzaW9uID0gaW5mby50ZXJyYWluVmVyc2lvbjsKICAgICAgICAgIHJlc3VsdC5pbWFnZXJ5UHJvdmlkZXIgPSBpbmZvLmltYWdlcnlQcm92aWRlcjsKICAgICAgICAgIHJlc3VsdC50ZXJyYWluUHJvdmlkZXIgPSBpbmZvLnRlcnJhaW5Qcm92aWRlcjsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LmFuY2VzdG9ySGFzVGVycmFpbiA9IGluZm8uYW5jZXN0b3JIYXNUZXJyYWluOwogICAgICAgIHJlc3VsdC50ZXJyYWluU3RhdGUgPSBpbmZvLnRlcnJhaW5TdGF0ZTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBHb29nbGVFYXJ0aEVudGVycHJpc2VUaWxlSW5mb3JtYXRpb24ucHJvdG90eXBlLnNldFBhcmVudCA9IGZ1bmN0aW9uKHBhcmVudCkgewogICAgICAgIHRoaXMuYW5jZXN0b3JIYXNUZXJyYWluID0gcGFyZW50LmFuY2VzdG9ySGFzVGVycmFpbiB8fCB0aGlzLmhhc1RlcnJhaW4oKTsKICAgICAgfTsKICAgICAgR29vZ2xlRWFydGhFbnRlcnByaXNlVGlsZUluZm9ybWF0aW9uLnByb3RvdHlwZS5oYXNTdWJ0cmVlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGlzQml0U2V0X2RlZmF1bHQodGhpcy5fYml0cywgY2FjaGVGbGFnQml0bWFzayk7CiAgICAgIH07CiAgICAgIEdvb2dsZUVhcnRoRW50ZXJwcmlzZVRpbGVJbmZvcm1hdGlvbi5wcm90b3R5cGUuaGFzSW1hZ2VyeSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBpc0JpdFNldF9kZWZhdWx0KHRoaXMuX2JpdHMsIGltYWdlQml0bWFzayk7CiAgICAgIH07CiAgICAgIEdvb2dsZUVhcnRoRW50ZXJwcmlzZVRpbGVJbmZvcm1hdGlvbi5wcm90b3R5cGUuaGFzVGVycmFpbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBpc0JpdFNldF9kZWZhdWx0KHRoaXMuX2JpdHMsIHRlcnJhaW5CaXRtYXNrKTsKICAgICAgfTsKICAgICAgR29vZ2xlRWFydGhFbnRlcnByaXNlVGlsZUluZm9ybWF0aW9uLnByb3RvdHlwZS5oYXNDaGlsZHJlbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBpc0JpdFNldF9kZWZhdWx0KHRoaXMuX2JpdHMsIGFueUNoaWxkQml0bWFzayk7CiAgICAgIH07CiAgICAgIEdvb2dsZUVhcnRoRW50ZXJwcmlzZVRpbGVJbmZvcm1hdGlvbi5wcm90b3R5cGUuaGFzQ2hpbGQgPSBmdW5jdGlvbihpbmRleCkgewogICAgICAgIHJldHVybiBpc0JpdFNldF9kZWZhdWx0KHRoaXMuX2JpdHMsIGNoaWxkcmVuQml0bWFza3NbaW5kZXhdKTsKICAgICAgfTsKICAgICAgR29vZ2xlRWFydGhFbnRlcnByaXNlVGlsZUluZm9ybWF0aW9uLnByb3RvdHlwZS5nZXRDaGlsZEJpdG1hc2sgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYml0cyAmIGFueUNoaWxkQml0bWFzazsKICAgICAgfTsKICAgICAgR29vZ2xlRWFydGhFbnRlcnByaXNlVGlsZUluZm9ybWF0aW9uX2RlZmF1bHQgPSBHb29nbGVFYXJ0aEVudGVycHJpc2VUaWxlSW5mb3JtYXRpb247CiAgICB9CiAgfSk7CgogIC8vIG5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2FkbGVyMzIuanMKICB2YXIgcmVxdWlyZV9hZGxlcjMyID0gX19jb21tb25KUyh7CiAgICAibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvYWRsZXIzMi5qcyIoZXhwb3J0czIsIG1vZHVsZSkgewogICAgICAidXNlIHN0cmljdCI7CiAgICAgIHZhciBhZGxlcjMyID0gKGFkbGVyLCBidWYsIGxlbiwgcG9zKSA9PiB7CiAgICAgICAgbGV0IHMxID0gYWRsZXIgJiA2NTUzNSB8IDAsIHMyID0gYWRsZXIgPj4+IDE2ICYgNjU1MzUgfCAwLCBuID0gMDsKICAgICAgICB3aGlsZSAobGVuICE9PSAwKSB7CiAgICAgICAgICBuID0gbGVuID4gMmUzID8gMmUzIDogbGVuOwogICAgICAgICAgbGVuIC09IG47CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIHMxID0gczEgKyBidWZbcG9zKytdIHwgMDsKICAgICAgICAgICAgczIgPSBzMiArIHMxIHwgMDsKICAgICAgICAgIH0gd2hpbGUgKC0tbik7CiAgICAgICAgICBzMSAlPSA2NTUyMTsKICAgICAgICAgIHMyICU9IDY1NTIxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gczEgfCBzMiA8PCAxNiB8IDA7CiAgICAgIH07CiAgICAgIG1vZHVsZS5leHBvcnRzID0gYWRsZXIzMjsKICAgIH0KICB9KTsKCiAgLy8gbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY3JjMzIuanMKICB2YXIgcmVxdWlyZV9jcmMzMiA9IF9fY29tbW9uSlMoewogICAgIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2NyYzMyLmpzIihleHBvcnRzMiwgbW9kdWxlKSB7CiAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgdmFyIG1ha2VUYWJsZSA9ICgpID0+IHsKICAgICAgICBsZXQgYywgdGFibGUgPSBbXTsKICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IDI1NjsgbisrKSB7CiAgICAgICAgICBjID0gbjsKICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgODsgaysrKSB7CiAgICAgICAgICAgIGMgPSBjICYgMSA/IDM5ODgyOTIzODQgXiBjID4+PiAxIDogYyA+Pj4gMTsKICAgICAgICAgIH0KICAgICAgICAgIHRhYmxlW25dID0gYzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRhYmxlOwogICAgICB9OwogICAgICB2YXIgY3JjVGFibGUgPSBuZXcgVWludDMyQXJyYXkobWFrZVRhYmxlKCkpOwogICAgICB2YXIgY3JjMzIgPSAoY3JjLCBidWYsIGxlbiwgcG9zKSA9PiB7CiAgICAgICAgY29uc3QgdCA9IGNyY1RhYmxlOwogICAgICAgIGNvbnN0IGVuZCA9IHBvcyArIGxlbjsKICAgICAgICBjcmMgXj0gLTE7CiAgICAgICAgZm9yIChsZXQgaSA9IHBvczsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgICBjcmMgPSBjcmMgPj4+IDggXiB0WyhjcmMgXiBidWZbaV0pICYgMjU1XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNyYyBeIC0xOwogICAgICB9OwogICAgICBtb2R1bGUuZXhwb3J0cyA9IGNyYzMyOwogICAgfQogIH0pOwoKICAvLyBub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZmYXN0LmpzCiAgdmFyIHJlcXVpcmVfaW5mZmFzdCA9IF9fY29tbW9uSlMoewogICAgIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZmZhc3QuanMiKGV4cG9ydHMyLCBtb2R1bGUpIHsKICAgICAgInVzZSBzdHJpY3QiOwogICAgICB2YXIgQkFEID0gMTYyMDk7CiAgICAgIHZhciBUWVBFID0gMTYxOTE7CiAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KSB7CiAgICAgICAgbGV0IF9pbjsKICAgICAgICBsZXQgbGFzdDsKICAgICAgICBsZXQgX291dDsKICAgICAgICBsZXQgYmVnOwogICAgICAgIGxldCBlbmQ7CiAgICAgICAgbGV0IGRtYXg7CiAgICAgICAgbGV0IHdzaXplOwogICAgICAgIGxldCB3aGF2ZTsKICAgICAgICBsZXQgd25leHQ7CiAgICAgICAgbGV0IHNfd2luZG93OwogICAgICAgIGxldCBob2xkOwogICAgICAgIGxldCBiaXRzOwogICAgICAgIGxldCBsY29kZTsKICAgICAgICBsZXQgZGNvZGU7CiAgICAgICAgbGV0IGxtYXNrOwogICAgICAgIGxldCBkbWFzazsKICAgICAgICBsZXQgaGVyZTsKICAgICAgICBsZXQgb3A7CiAgICAgICAgbGV0IGxlbjsKICAgICAgICBsZXQgZGlzdDsKICAgICAgICBsZXQgZnJvbTsKICAgICAgICBsZXQgZnJvbV9zb3VyY2U7CiAgICAgICAgbGV0IGlucHV0LCBvdXRwdXQ7CiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdHJtLnN0YXRlOwogICAgICAgIF9pbiA9IHN0cm0ubmV4dF9pbjsKICAgICAgICBpbnB1dCA9IHN0cm0uaW5wdXQ7CiAgICAgICAgbGFzdCA9IF9pbiArIChzdHJtLmF2YWlsX2luIC0gNSk7CiAgICAgICAgX291dCA9IHN0cm0ubmV4dF9vdXQ7CiAgICAgICAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7CiAgICAgICAgYmVnID0gX291dCAtIChzdGFydCAtIHN0cm0uYXZhaWxfb3V0KTsKICAgICAgICBlbmQgPSBfb3V0ICsgKHN0cm0uYXZhaWxfb3V0IC0gMjU3KTsKICAgICAgICBkbWF4ID0gc3RhdGUuZG1heDsKICAgICAgICB3c2l6ZSA9IHN0YXRlLndzaXplOwogICAgICAgIHdoYXZlID0gc3RhdGUud2hhdmU7CiAgICAgICAgd25leHQgPSBzdGF0ZS53bmV4dDsKICAgICAgICBzX3dpbmRvdyA9IHN0YXRlLndpbmRvdzsKICAgICAgICBob2xkID0gc3RhdGUuaG9sZDsKICAgICAgICBiaXRzID0gc3RhdGUuYml0czsKICAgICAgICBsY29kZSA9IHN0YXRlLmxlbmNvZGU7CiAgICAgICAgZGNvZGUgPSBzdGF0ZS5kaXN0Y29kZTsKICAgICAgICBsbWFzayA9ICgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMTsKICAgICAgICBkbWFzayA9ICgxIDw8IHN0YXRlLmRpc3RiaXRzKSAtIDE7CiAgICAgICAgdG9wOgogICAgICAgICAgZG8gewogICAgICAgICAgICBpZiAoYml0cyA8IDE1KSB7CiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaGVyZSA9IGxjb2RlW2hvbGQgJiBsbWFza107CiAgICAgICAgICAgIGRvbGVuOgogICAgICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICAgICAgb3AgPSBoZXJlID4+PiAyNDsKICAgICAgICAgICAgICAgIGhvbGQgPj4+PSBvcDsKICAgICAgICAgICAgICAgIGJpdHMgLT0gb3A7CiAgICAgICAgICAgICAgICBvcCA9IGhlcmUgPj4+IDE2ICYgMjU1OwogICAgICAgICAgICAgICAgaWYgKG9wID09PSAwKSB7CiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gaGVyZSAmIDY1NTM1OwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcCAmIDE2KSB7CiAgICAgICAgICAgICAgICAgIGxlbiA9IGhlcmUgJiA2NTUzNTsKICAgICAgICAgICAgICAgICAgb3AgJj0gMTU7CiAgICAgICAgICAgICAgICAgIGlmIChvcCkgewogICAgICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKICAgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxlbiArPSBob2xkICYgKDEgPDwgb3ApIC0gMTsKICAgICAgICAgICAgICAgICAgICBob2xkID4+Pj0gb3A7CiAgICAgICAgICAgICAgICAgICAgYml0cyAtPSBvcDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoYml0cyA8IDE1KSB7CiAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaGVyZSA9IGRjb2RlW2hvbGQgJiBkbWFza107CiAgICAgICAgICAgICAgICAgIGRvZGlzdDoKICAgICAgICAgICAgICAgICAgICBmb3IgKDsgOyApIHsKICAgICAgICAgICAgICAgICAgICAgIG9wID0gaGVyZSA+Pj4gMjQ7CiAgICAgICAgICAgICAgICAgICAgICBob2xkID4+Pj0gb3A7CiAgICAgICAgICAgICAgICAgICAgICBiaXRzIC09IG9wOwogICAgICAgICAgICAgICAgICAgICAgb3AgPSBoZXJlID4+PiAxNiAmIDI1NTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCAmIDE2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgPSBoZXJlICYgNjU1MzU7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wICY9IDE1OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZGlzdCArPSBob2xkICYgKDEgPDwgb3ApIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3QgPiBkbWF4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOwogICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgYml0cyAtPSBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBfb3V0IC0gYmVnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdCA+IG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wID4gd2hhdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IHNfd2luZG93OwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3bmV4dCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSAtIG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3bmV4dCA8IG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplICsgd25leHQgLSBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wIC09IHduZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod25leHQgPCBsZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IHduZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKz0gd25leHQgLSBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobGVuID4gMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OwogICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSAzOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiA+IDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGRjb2RlWyhoZXJlICYgNjU1MzUpICsgKGhvbGQgJiAoMSA8PCBvcCkgLSAxKV07CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIGRvZGlzdDsKICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgZGlzdGFuY2UgY29kZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHRvcDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgIGhlcmUgPSBsY29kZVsoaGVyZSAmIDY1NTM1KSArIChob2xkICYgKDEgPDwgb3ApIC0gMSldOwogICAgICAgICAgICAgICAgICBjb250aW51ZSBkb2xlbjsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgJiAzMikgewogICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTsKICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfSB3aGlsZSAoX2luIDwgbGFzdCAmJiBfb3V0IDwgZW5kKTsKICAgICAgICBsZW4gPSBiaXRzID4+IDM7CiAgICAgICAgX2luIC09IGxlbjsKICAgICAgICBiaXRzIC09IGxlbiA8PCAzOwogICAgICAgIGhvbGQgJj0gKDEgPDwgYml0cykgLSAxOwogICAgICAgIHN0cm0ubmV4dF9pbiA9IF9pbjsKICAgICAgICBzdHJtLm5leHRfb3V0ID0gX291dDsKICAgICAgICBzdHJtLmF2YWlsX2luID0gX2luIDwgbGFzdCA/IDUgKyAobGFzdCAtIF9pbikgOiA1IC0gKF9pbiAtIGxhc3QpOwogICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gX291dCA8IGVuZCA/IDI1NyArIChlbmQgLSBfb3V0KSA6IDI1NyAtIChfb3V0IC0gZW5kKTsKICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDsKICAgICAgICBzdGF0ZS5iaXRzID0gYml0czsKICAgICAgICByZXR1cm47CiAgICAgIH07CiAgICB9CiAgfSk7CgogIC8vIG5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZnRyZWVzLmpzCiAgdmFyIHJlcXVpcmVfaW5mdHJlZXMgPSBfX2NvbW1vbkpTKHsKICAgICJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZ0cmVlcy5qcyIoZXhwb3J0czIsIG1vZHVsZSkgewogICAgICAidXNlIHN0cmljdCI7CiAgICAgIHZhciBNQVhCSVRTID0gMTU7CiAgICAgIHZhciBFTk9VR0hfTEVOUyA9IDg1MjsKICAgICAgdmFyIEVOT1VHSF9ESVNUUyA9IDU5MjsKICAgICAgdmFyIENPREVTID0gMDsKICAgICAgdmFyIExFTlMgPSAxOwogICAgICB2YXIgRElTVFMgPSAyOwogICAgICB2YXIgbGJhc2UgPSBuZXcgVWludDE2QXJyYXkoWwogICAgICAgIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBiYXNlICovCiAgICAgICAgMywKICAgICAgICA0LAogICAgICAgIDUsCiAgICAgICAgNiwKICAgICAgICA3LAogICAgICAgIDgsCiAgICAgICAgOSwKICAgICAgICAxMCwKICAgICAgICAxMSwKICAgICAgICAxMywKICAgICAgICAxNSwKICAgICAgICAxNywKICAgICAgICAxOSwKICAgICAgICAyMywKICAgICAgICAyNywKICAgICAgICAzMSwKICAgICAgICAzNSwKICAgICAgICA0MywKICAgICAgICA1MSwKICAgICAgICA1OSwKICAgICAgICA2NywKICAgICAgICA4MywKICAgICAgICA5OSwKICAgICAgICAxMTUsCiAgICAgICAgMTMxLAogICAgICAgIDE2MywKICAgICAgICAxOTUsCiAgICAgICAgMjI3LAogICAgICAgIDI1OCwKICAgICAgICAwLAogICAgICAgIDAKICAgICAgXSk7CiAgICAgIHZhciBsZXh0ID0gbmV3IFVpbnQ4QXJyYXkoWwogICAgICAgIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqLwogICAgICAgIDE2LAogICAgICAgIDE2LAogICAgICAgIDE2LAogICAgICAgIDE2LAogICAgICAgIDE2LAogICAgICAgIDE2LAogICAgICAgIDE2LAogICAgICAgIDE2LAogICAgICAgIDE3LAogICAgICAgIDE3LAogICAgICAgIDE3LAogICAgICAgIDE3LAogICAgICAgIDE4LAogICAgICAgIDE4LAogICAgICAgIDE4LAogICAgICAgIDE4LAogICAgICAgIDE5LAogICAgICAgIDE5LAogICAgICAgIDE5LAogICAgICAgIDE5LAogICAgICAgIDIwLAogICAgICAgIDIwLAogICAgICAgIDIwLAogICAgICAgIDIwLAogICAgICAgIDIxLAogICAgICAgIDIxLAogICAgICAgIDIxLAogICAgICAgIDIxLAogICAgICAgIDE2LAogICAgICAgIDcyLAogICAgICAgIDc4CiAgICAgIF0pOwogICAgICB2YXIgZGJhc2UgPSBuZXcgVWludDE2QXJyYXkoWwogICAgICAgIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGJhc2UgKi8KICAgICAgICAxLAogICAgICAgIDIsCiAgICAgICAgMywKICAgICAgICA0LAogICAgICAgIDUsCiAgICAgICAgNywKICAgICAgICA5LAogICAgICAgIDEzLAogICAgICAgIDE3LAogICAgICAgIDI1LAogICAgICAgIDMzLAogICAgICAgIDQ5LAogICAgICAgIDY1LAogICAgICAgIDk3LAogICAgICAgIDEyOSwKICAgICAgICAxOTMsCiAgICAgICAgMjU3LAogICAgICAgIDM4NSwKICAgICAgICA1MTMsCiAgICAgICAgNzY5LAogICAgICAgIDEwMjUsCiAgICAgICAgMTUzNywKICAgICAgICAyMDQ5LAogICAgICAgIDMwNzMsCiAgICAgICAgNDA5NywKICAgICAgICA2MTQ1LAogICAgICAgIDgxOTMsCiAgICAgICAgMTIyODksCiAgICAgICAgMTYzODUsCiAgICAgICAgMjQ1NzcsCiAgICAgICAgMCwKICAgICAgICAwCiAgICAgIF0pOwogICAgICB2YXIgZGV4dCA9IG5ldyBVaW50OEFycmF5KFsKICAgICAgICAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBleHRyYSAqLwogICAgICAgIDE2LAogICAgICAgIDE2LAogICAgICAgIDE2LAogICAgICAgIDE2LAogICAgICAgIDE3LAogICAgICAgIDE3LAogICAgICAgIDE4LAogICAgICAgIDE4LAogICAgICAgIDE5LAogICAgICAgIDE5LAogICAgICAgIDIwLAogICAgICAgIDIwLAogICAgICAgIDIxLAogICAgICAgIDIxLAogICAgICAgIDIyLAogICAgICAgIDIyLAogICAgICAgIDIzLAogICAgICAgIDIzLAogICAgICAgIDI0LAogICAgICAgIDI0LAogICAgICAgIDI1LAogICAgICAgIDI1LAogICAgICAgIDI2LAogICAgICAgIDI2LAogICAgICAgIDI3LAogICAgICAgIDI3LAogICAgICAgIDI4LAogICAgICAgIDI4LAogICAgICAgIDI5LAogICAgICAgIDI5LAogICAgICAgIDY0LAogICAgICAgIDY0CiAgICAgIF0pOwogICAgICB2YXIgaW5mbGF0ZV90YWJsZSA9ICh0eXBlLCBsZW5zLCBsZW5zX2luZGV4LCBjb2RlcywgdGFibGUsIHRhYmxlX2luZGV4LCB3b3JrLCBvcHRzKSA9PiB7CiAgICAgICAgY29uc3QgYml0cyA9IG9wdHMuYml0czsKICAgICAgICBsZXQgbGVuID0gMDsKICAgICAgICBsZXQgc3ltID0gMDsKICAgICAgICBsZXQgbWluMyA9IDAsIG1heDMgPSAwOwogICAgICAgIGxldCByb290ID0gMDsKICAgICAgICBsZXQgY3VyciA9IDA7CiAgICAgICAgbGV0IGRyb3AgPSAwOwogICAgICAgIGxldCBsZWZ0ID0gMDsKICAgICAgICBsZXQgdXNlZCA9IDA7CiAgICAgICAgbGV0IGh1ZmYgPSAwOwogICAgICAgIGxldCBpbmNyOwogICAgICAgIGxldCBmaWxsOwogICAgICAgIGxldCBsb3c7CiAgICAgICAgbGV0IG1hc2s7CiAgICAgICAgbGV0IG5leHQ7CiAgICAgICAgbGV0IGJhc2UgPSBudWxsOwogICAgICAgIGxldCBtYXRjaDsKICAgICAgICBjb25zdCBjb3VudCA9IG5ldyBVaW50MTZBcnJheShNQVhCSVRTICsgMSk7CiAgICAgICAgY29uc3Qgb2ZmcyA9IG5ldyBVaW50MTZBcnJheShNQVhCSVRTICsgMSk7CiAgICAgICAgbGV0IGV4dHJhID0gbnVsbDsKICAgICAgICBsZXQgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsKICAgICAgICBmb3IgKGxlbiA9IDA7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykgewogICAgICAgICAgY291bnRbbGVuXSA9IDA7CiAgICAgICAgfQogICAgICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7CiAgICAgICAgICBjb3VudFtsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrOwogICAgICAgIH0KICAgICAgICByb290ID0gYml0czsKICAgICAgICBmb3IgKG1heDMgPSBNQVhCSVRTOyBtYXgzID49IDE7IG1heDMtLSkgewogICAgICAgICAgaWYgKGNvdW50W21heDNdICE9PSAwKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocm9vdCA+IG1heDMpIHsKICAgICAgICAgIHJvb3QgPSBtYXgzOwogICAgICAgIH0KICAgICAgICBpZiAobWF4MyA9PT0gMCkgewogICAgICAgICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAxIDw8IDI0IHwgNjQgPDwgMTYgfCAwOwogICAgICAgICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAxIDw8IDI0IHwgNjQgPDwgMTYgfCAwOwogICAgICAgICAgb3B0cy5iaXRzID0gMTsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBmb3IgKG1pbjMgPSAxOyBtaW4zIDwgbWF4MzsgbWluMysrKSB7CiAgICAgICAgICBpZiAoY291bnRbbWluM10gIT09IDApIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChyb290IDwgbWluMykgewogICAgICAgICAgcm9vdCA9IG1pbjM7CiAgICAgICAgfQogICAgICAgIGxlZnQgPSAxOwogICAgICAgIGZvciAobGVuID0gMTsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7CiAgICAgICAgICBsZWZ0IDw8PSAxOwogICAgICAgICAgbGVmdCAtPSBjb3VudFtsZW5dOwogICAgICAgICAgaWYgKGxlZnQgPCAwKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGxlZnQgPiAwICYmICh0eXBlID09PSBDT0RFUyB8fCBtYXgzICE9PSAxKSkgewogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBvZmZzWzFdID0gMDsKICAgICAgICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWEJJVFM7IGxlbisrKSB7CiAgICAgICAgICBvZmZzW2xlbiArIDFdID0gb2Zmc1tsZW5dICsgY291bnRbbGVuXTsKICAgICAgICB9CiAgICAgICAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHsKICAgICAgICAgIGlmIChsZW5zW2xlbnNfaW5kZXggKyBzeW1dICE9PSAwKSB7CiAgICAgICAgICAgIHdvcmtbb2Zmc1tsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrXSA9IHN5bTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHR5cGUgPT09IENPREVTKSB7CiAgICAgICAgICBiYXNlID0gZXh0cmEgPSB3b3JrOwogICAgICAgICAgbWF0Y2ggPSAyMDsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IExFTlMpIHsKICAgICAgICAgIGJhc2UgPSBsYmFzZTsKICAgICAgICAgIGV4dHJhID0gbGV4dDsKICAgICAgICAgIG1hdGNoID0gMjU3OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBiYXNlID0gZGJhc2U7CiAgICAgICAgICBleHRyYSA9IGRleHQ7CiAgICAgICAgICBtYXRjaCA9IDA7CiAgICAgICAgfQogICAgICAgIGh1ZmYgPSAwOwogICAgICAgIHN5bSA9IDA7CiAgICAgICAgbGVuID0gbWluMzsKICAgICAgICBuZXh0ID0gdGFibGVfaW5kZXg7CiAgICAgICAgY3VyciA9IHJvb3Q7CiAgICAgICAgZHJvcCA9IDA7CiAgICAgICAgbG93ID0gLTE7CiAgICAgICAgdXNlZCA9IDEgPDwgcm9vdDsKICAgICAgICBtYXNrID0gdXNlZCAtIDE7CiAgICAgICAgaWYgKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TIHx8IHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpIHsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICBmb3IgKDsgOyApIHsKICAgICAgICAgIGhlcmVfYml0cyA9IGxlbiAtIGRyb3A7CiAgICAgICAgICBpZiAod29ya1tzeW1dICsgMSA8IG1hdGNoKSB7CiAgICAgICAgICAgIGhlcmVfb3AgPSAwOwogICAgICAgICAgICBoZXJlX3ZhbCA9IHdvcmtbc3ltXTsKICAgICAgICAgIH0gZWxzZSBpZiAod29ya1tzeW1dID49IG1hdGNoKSB7CiAgICAgICAgICAgIGhlcmVfb3AgPSBleHRyYVt3b3JrW3N5bV0gLSBtYXRjaF07CiAgICAgICAgICAgIGhlcmVfdmFsID0gYmFzZVt3b3JrW3N5bV0gLSBtYXRjaF07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoZXJlX29wID0gMzIgKyA2NDsKICAgICAgICAgICAgaGVyZV92YWwgPSAwOwogICAgICAgICAgfQogICAgICAgICAgaW5jciA9IDEgPDwgbGVuIC0gZHJvcDsKICAgICAgICAgIGZpbGwgPSAxIDw8IGN1cnI7CiAgICAgICAgICBtaW4zID0gZmlsbDsKICAgICAgICAgIGRvIHsKICAgICAgICAgICAgZmlsbCAtPSBpbmNyOwogICAgICAgICAgICB0YWJsZVtuZXh0ICsgKGh1ZmYgPj4gZHJvcCkgKyBmaWxsXSA9IGhlcmVfYml0cyA8PCAyNCB8IGhlcmVfb3AgPDwgMTYgfCBoZXJlX3ZhbCB8IDA7CiAgICAgICAgICB9IHdoaWxlIChmaWxsICE9PSAwKTsKICAgICAgICAgIGluY3IgPSAxIDw8IGxlbiAtIDE7CiAgICAgICAgICB3aGlsZSAoaHVmZiAmIGluY3IpIHsKICAgICAgICAgICAgaW5jciA+Pj0gMTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpbmNyICE9PSAwKSB7CiAgICAgICAgICAgIGh1ZmYgJj0gaW5jciAtIDE7CiAgICAgICAgICAgIGh1ZmYgKz0gaW5jcjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGh1ZmYgPSAwOwogICAgICAgICAgfQogICAgICAgICAgc3ltKys7CiAgICAgICAgICBpZiAoLS1jb3VudFtsZW5dID09PSAwKSB7CiAgICAgICAgICAgIGlmIChsZW4gPT09IG1heDMpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZW4gPSBsZW5zW2xlbnNfaW5kZXggKyB3b3JrW3N5bV1dOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGxlbiA+IHJvb3QgJiYgKGh1ZmYgJiBtYXNrKSAhPT0gbG93KSB7CiAgICAgICAgICAgIGlmIChkcm9wID09PSAwKSB7CiAgICAgICAgICAgICAgZHJvcCA9IHJvb3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCArPSBtaW4zOwogICAgICAgICAgICBjdXJyID0gbGVuIC0gZHJvcDsKICAgICAgICAgICAgbGVmdCA9IDEgPDwgY3VycjsKICAgICAgICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4MykgewogICAgICAgICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdOwogICAgICAgICAgICAgIGlmIChsZWZ0IDw9IDApIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjdXJyKys7CiAgICAgICAgICAgICAgbGVmdCA8PD0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICB1c2VkICs9IDEgPDwgY3VycjsKICAgICAgICAgICAgaWYgKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TIHx8IHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpIHsKICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsb3cgPSBodWZmICYgbWFzazsKICAgICAgICAgICAgdGFibGVbbG93XSA9IHJvb3QgPDwgMjQgfCBjdXJyIDw8IDE2IHwgbmV4dCAtIHRhYmxlX2luZGV4IHwgMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGh1ZmYgIT09IDApIHsKICAgICAgICAgIHRhYmxlW25leHQgKyBodWZmXSA9IGxlbiAtIGRyb3AgPDwgMjQgfCA2NCA8PCAxNiB8IDA7CiAgICAgICAgfQogICAgICAgIG9wdHMuYml0cyA9IHJvb3Q7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH07CiAgICAgIG1vZHVsZS5leHBvcnRzID0gaW5mbGF0ZV90YWJsZTsKICAgIH0KICB9KTsKCiAgLy8gbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY29uc3RhbnRzLmpzCiAgdmFyIHJlcXVpcmVfY29uc3RhbnRzID0gX19jb21tb25KUyh7CiAgICAibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY29uc3RhbnRzLmpzIihleHBvcnRzMiwgbW9kdWxlKSB7CiAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7CiAgICAgICAgLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqLwogICAgICAgIFpfTk9fRkxVU0g6IDAsCiAgICAgICAgWl9QQVJUSUFMX0ZMVVNIOiAxLAogICAgICAgIFpfU1lOQ19GTFVTSDogMiwKICAgICAgICBaX0ZVTExfRkxVU0g6IDMsCiAgICAgICAgWl9GSU5JU0g6IDQsCiAgICAgICAgWl9CTE9DSzogNSwKICAgICAgICBaX1RSRUVTOiA2LAogICAgICAgIC8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXMKICAgICAgICAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KICAgICAgICAqLwogICAgICAgIFpfT0s6IDAsCiAgICAgICAgWl9TVFJFQU1fRU5EOiAxLAogICAgICAgIFpfTkVFRF9ESUNUOiAyLAogICAgICAgIFpfRVJSTk86IC0xLAogICAgICAgIFpfU1RSRUFNX0VSUk9SOiAtMiwKICAgICAgICBaX0RBVEFfRVJST1I6IC0zLAogICAgICAgIFpfTUVNX0VSUk9SOiAtNCwKICAgICAgICBaX0JVRl9FUlJPUjogLTUsCiAgICAgICAgLy9aX1ZFUlNJT05fRVJST1I6IC02LAogICAgICAgIC8qIGNvbXByZXNzaW9uIGxldmVscyAqLwogICAgICAgIFpfTk9fQ09NUFJFU1NJT046IDAsCiAgICAgICAgWl9CRVNUX1NQRUVEOiAxLAogICAgICAgIFpfQkVTVF9DT01QUkVTU0lPTjogOSwKICAgICAgICBaX0RFRkFVTFRfQ09NUFJFU1NJT046IC0xLAogICAgICAgIFpfRklMVEVSRUQ6IDEsCiAgICAgICAgWl9IVUZGTUFOX09OTFk6IDIsCiAgICAgICAgWl9STEU6IDMsCiAgICAgICAgWl9GSVhFRDogNCwKICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1k6IDAsCiAgICAgICAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqLwogICAgICAgIFpfQklOQVJZOiAwLAogICAgICAgIFpfVEVYVDogMSwKICAgICAgICAvL1pfQVNDSUk6ICAgICAgICAgICAgICAgIDEsIC8vID0gWl9URVhUIChkZXByZWNhdGVkKQogICAgICAgIFpfVU5LTk9XTjogMiwKICAgICAgICAvKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi8KICAgICAgICBaX0RFRkxBVEVEOiA4CiAgICAgICAgLy9aX05VTEw6ICAgICAgICAgICAgICAgICBudWxsIC8vIFVzZSAtMSBvciBudWxsIGlubGluZSwgZGVwZW5kaW5nIG9uIHZhciB0eXBlCiAgICAgIH07CiAgICB9CiAgfSk7CgogIC8vIG5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZmxhdGUuanMKICB2YXIgcmVxdWlyZV9pbmZsYXRlID0gX19jb21tb25KUyh7CiAgICAibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mbGF0ZS5qcyIoZXhwb3J0czIsIG1vZHVsZSkgewogICAgICAidXNlIHN0cmljdCI7CiAgICAgIHZhciBhZGxlcjMyID0gcmVxdWlyZV9hZGxlcjMyKCk7CiAgICAgIHZhciBjcmMzMiA9IHJlcXVpcmVfY3JjMzIoKTsKICAgICAgdmFyIGluZmxhdGVfZmFzdCA9IHJlcXVpcmVfaW5mZmFzdCgpOwogICAgICB2YXIgaW5mbGF0ZV90YWJsZSA9IHJlcXVpcmVfaW5mdHJlZXMoKTsKICAgICAgdmFyIENPREVTID0gMDsKICAgICAgdmFyIExFTlMgPSAxOwogICAgICB2YXIgRElTVFMgPSAyOwogICAgICB2YXIgewogICAgICAgIFpfRklOSVNILAogICAgICAgIFpfQkxPQ0ssCiAgICAgICAgWl9UUkVFUywKICAgICAgICBaX09LLAogICAgICAgIFpfU1RSRUFNX0VORCwKICAgICAgICBaX05FRURfRElDVCwKICAgICAgICBaX1NUUkVBTV9FUlJPUiwKICAgICAgICBaX0RBVEFfRVJST1IsCiAgICAgICAgWl9NRU1fRVJST1IsCiAgICAgICAgWl9CVUZfRVJST1IsCiAgICAgICAgWl9ERUZMQVRFRAogICAgICB9ID0gcmVxdWlyZV9jb25zdGFudHMoKTsKICAgICAgdmFyIEhFQUQgPSAxNjE4MDsKICAgICAgdmFyIEZMQUdTID0gMTYxODE7CiAgICAgIHZhciBUSU1FID0gMTYxODI7CiAgICAgIHZhciBPUyA9IDE2MTgzOwogICAgICB2YXIgRVhMRU4gPSAxNjE4NDsKICAgICAgdmFyIEVYVFJBID0gMTYxODU7CiAgICAgIHZhciBOQU1FID0gMTYxODY7CiAgICAgIHZhciBDT01NRU5UID0gMTYxODc7CiAgICAgIHZhciBIQ1JDID0gMTYxODg7CiAgICAgIHZhciBESUNUSUQgPSAxNjE4OTsKICAgICAgdmFyIERJQ1QgPSAxNjE5MDsKICAgICAgdmFyIFRZUEUgPSAxNjE5MTsKICAgICAgdmFyIFRZUEVETyA9IDE2MTkyOwogICAgICB2YXIgU1RPUkVEID0gMTYxOTM7CiAgICAgIHZhciBDT1BZXyA9IDE2MTk0OwogICAgICB2YXIgQ09QWSA9IDE2MTk1OwogICAgICB2YXIgVEFCTEUgPSAxNjE5NjsKICAgICAgdmFyIExFTkxFTlMgPSAxNjE5NzsKICAgICAgdmFyIENPREVMRU5TID0gMTYxOTg7CiAgICAgIHZhciBMRU5fID0gMTYxOTk7CiAgICAgIHZhciBMRU4gPSAxNjIwMDsKICAgICAgdmFyIExFTkVYVCA9IDE2MjAxOwogICAgICB2YXIgRElTVCA9IDE2MjAyOwogICAgICB2YXIgRElTVEVYVCA9IDE2MjAzOwogICAgICB2YXIgTUFUQ0ggPSAxNjIwNDsKICAgICAgdmFyIExJVCA9IDE2MjA1OwogICAgICB2YXIgQ0hFQ0sgPSAxNjIwNjsKICAgICAgdmFyIExFTkdUSCA9IDE2MjA3OwogICAgICB2YXIgRE9ORSA9IDE2MjA4OwogICAgICB2YXIgQkFEID0gMTYyMDk7CiAgICAgIHZhciBNRU0gPSAxNjIxMDsKICAgICAgdmFyIFNZTkMgPSAxNjIxMTsKICAgICAgdmFyIEVOT1VHSF9MRU5TID0gODUyOwogICAgICB2YXIgRU5PVUdIX0RJU1RTID0gNTkyOwogICAgICB2YXIgTUFYX1dCSVRTID0gMTU7CiAgICAgIHZhciBERUZfV0JJVFMgPSBNQVhfV0JJVFM7CiAgICAgIHZhciB6c3dhcDMyID0gKHEpID0+IHsKICAgICAgICByZXR1cm4gKHEgPj4+IDI0ICYgMjU1KSArIChxID4+PiA4ICYgNjUyODApICsgKChxICYgNjUyODApIDw8IDgpICsgKChxICYgMjU1KSA8PCAyNCk7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIEluZmxhdGVTdGF0ZSgpIHsKICAgICAgICB0aGlzLnN0cm0gPSBudWxsOwogICAgICAgIHRoaXMubW9kZSA9IDA7CiAgICAgICAgdGhpcy5sYXN0ID0gZmFsc2U7CiAgICAgICAgdGhpcy53cmFwID0gMDsKICAgICAgICB0aGlzLmhhdmVkaWN0ID0gZmFsc2U7CiAgICAgICAgdGhpcy5mbGFncyA9IDA7CiAgICAgICAgdGhpcy5kbWF4ID0gMDsKICAgICAgICB0aGlzLmNoZWNrID0gMDsKICAgICAgICB0aGlzLnRvdGFsID0gMDsKICAgICAgICB0aGlzLmhlYWQgPSBudWxsOwogICAgICAgIHRoaXMud2JpdHMgPSAwOwogICAgICAgIHRoaXMud3NpemUgPSAwOwogICAgICAgIHRoaXMud2hhdmUgPSAwOwogICAgICAgIHRoaXMud25leHQgPSAwOwogICAgICAgIHRoaXMud2luZG93ID0gbnVsbDsKICAgICAgICB0aGlzLmhvbGQgPSAwOwogICAgICAgIHRoaXMuYml0cyA9IDA7CiAgICAgICAgdGhpcy5sZW5ndGggPSAwOwogICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKICAgICAgICB0aGlzLmV4dHJhID0gMDsKICAgICAgICB0aGlzLmxlbmNvZGUgPSBudWxsOwogICAgICAgIHRoaXMuZGlzdGNvZGUgPSBudWxsOwogICAgICAgIHRoaXMubGVuYml0cyA9IDA7CiAgICAgICAgdGhpcy5kaXN0Yml0cyA9IDA7CiAgICAgICAgdGhpcy5uY29kZSA9IDA7CiAgICAgICAgdGhpcy5ubGVuID0gMDsKICAgICAgICB0aGlzLm5kaXN0ID0gMDsKICAgICAgICB0aGlzLmhhdmUgPSAwOwogICAgICAgIHRoaXMubmV4dCA9IG51bGw7CiAgICAgICAgdGhpcy5sZW5zID0gbmV3IFVpbnQxNkFycmF5KDMyMCk7CiAgICAgICAgdGhpcy53b3JrID0gbmV3IFVpbnQxNkFycmF5KDI4OCk7CiAgICAgICAgdGhpcy5sZW5keW4gPSBudWxsOwogICAgICAgIHRoaXMuZGlzdGR5biA9IG51bGw7CiAgICAgICAgdGhpcy5zYW5lID0gMDsKICAgICAgICB0aGlzLmJhY2sgPSAwOwogICAgICAgIHRoaXMud2FzID0gMDsKICAgICAgfQogICAgICB2YXIgaW5mbGF0ZVN0YXRlQ2hlY2sgPSAoc3RybSkgPT4gewogICAgICAgIGlmICghc3RybSkgewogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN0YXRlID0gc3RybS5zdGF0ZTsKICAgICAgICBpZiAoIXN0YXRlIHx8IHN0YXRlLnN0cm0gIT09IHN0cm0gfHwgc3RhdGUubW9kZSA8IEhFQUQgfHwgc3RhdGUubW9kZSA+IFNZTkMpIHsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgICAgfTsKICAgICAgdmFyIGluZmxhdGVSZXNldEtlZXAgPSAoc3RybSkgPT4gewogICAgICAgIGlmIChpbmZsYXRlU3RhdGVDaGVjayhzdHJtKSkgewogICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgICAgIH0KICAgICAgICBjb25zdCBzdGF0ZSA9IHN0cm0uc3RhdGU7CiAgICAgICAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gc3RhdGUudG90YWwgPSAwOwogICAgICAgIHN0cm0ubXNnID0gIiI7CiAgICAgICAgaWYgKHN0YXRlLndyYXApIHsKICAgICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS53cmFwICYgMTsKICAgICAgICB9CiAgICAgICAgc3RhdGUubW9kZSA9IEhFQUQ7CiAgICAgICAgc3RhdGUubGFzdCA9IDA7CiAgICAgICAgc3RhdGUuaGF2ZWRpY3QgPSAwOwogICAgICAgIHN0YXRlLmZsYWdzID0gLTE7CiAgICAgICAgc3RhdGUuZG1heCA9IDMyNzY4OwogICAgICAgIHN0YXRlLmhlYWQgPSBudWxsOwogICAgICAgIHN0YXRlLmhvbGQgPSAwOwogICAgICAgIHN0YXRlLmJpdHMgPSAwOwogICAgICAgIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW4gPSBuZXcgSW50MzJBcnJheShFTk9VR0hfTEVOUyk7CiAgICAgICAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluID0gbmV3IEludDMyQXJyYXkoRU5PVUdIX0RJU1RTKTsKICAgICAgICBzdGF0ZS5zYW5lID0gMTsKICAgICAgICBzdGF0ZS5iYWNrID0gLTE7CiAgICAgICAgcmV0dXJuIFpfT0s7CiAgICAgIH07CiAgICAgIHZhciBpbmZsYXRlUmVzZXQgPSAoc3RybSkgPT4gewogICAgICAgIGlmIChpbmZsYXRlU3RhdGVDaGVjayhzdHJtKSkgewogICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgICAgIH0KICAgICAgICBjb25zdCBzdGF0ZSA9IHN0cm0uc3RhdGU7CiAgICAgICAgc3RhdGUud3NpemUgPSAwOwogICAgICAgIHN0YXRlLndoYXZlID0gMDsKICAgICAgICBzdGF0ZS53bmV4dCA9IDA7CiAgICAgICAgcmV0dXJuIGluZmxhdGVSZXNldEtlZXAoc3RybSk7CiAgICAgIH07CiAgICAgIHZhciBpbmZsYXRlUmVzZXQyID0gKHN0cm0sIHdpbmRvd0JpdHMpID0+IHsKICAgICAgICBsZXQgd3JhcDsKICAgICAgICBpZiAoaW5mbGF0ZVN0YXRlQ2hlY2soc3RybSkpIHsKICAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdHJtLnN0YXRlOwogICAgICAgIGlmICh3aW5kb3dCaXRzIDwgMCkgewogICAgICAgICAgd3JhcCA9IDA7CiAgICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdyYXAgPSAod2luZG93Qml0cyA+PiA0KSArIDU7CiAgICAgICAgICBpZiAod2luZG93Qml0cyA8IDQ4KSB7CiAgICAgICAgICAgIHdpbmRvd0JpdHMgJj0gMTU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKSB7CiAgICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS53aW5kb3cgIT09IG51bGwgJiYgc3RhdGUud2JpdHMgIT09IHdpbmRvd0JpdHMpIHsKICAgICAgICAgIHN0YXRlLndpbmRvdyA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHN0YXRlLndyYXAgPSB3cmFwOwogICAgICAgIHN0YXRlLndiaXRzID0gd2luZG93Qml0czsKICAgICAgICByZXR1cm4gaW5mbGF0ZVJlc2V0KHN0cm0pOwogICAgICB9OwogICAgICB2YXIgaW5mbGF0ZUluaXQyID0gKHN0cm0sIHdpbmRvd0JpdHMpID0+IHsKICAgICAgICBpZiAoIXN0cm0pIHsKICAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc3RhdGUgPSBuZXcgSW5mbGF0ZVN0YXRlKCk7CiAgICAgICAgc3RybS5zdGF0ZSA9IHN0YXRlOwogICAgICAgIHN0YXRlLnN0cm0gPSBzdHJtOwogICAgICAgIHN0YXRlLndpbmRvdyA9IG51bGw7CiAgICAgICAgc3RhdGUubW9kZSA9IEhFQUQ7CiAgICAgICAgY29uc3QgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTsKICAgICAgICBpZiAocmV0ICE9PSBaX09LKSB7CiAgICAgICAgICBzdHJtLnN0YXRlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfTsKICAgICAgdmFyIGluZmxhdGVJbml0ID0gKHN0cm0pID0+IHsKICAgICAgICByZXR1cm4gaW5mbGF0ZUluaXQyKHN0cm0sIERFRl9XQklUUyk7CiAgICAgIH07CiAgICAgIHZhciB2aXJnaW4gPSB0cnVlOwogICAgICB2YXIgbGVuZml4OwogICAgICB2YXIgZGlzdGZpeDsKICAgICAgdmFyIGZpeGVkdGFibGVzID0gKHN0YXRlKSA9PiB7CiAgICAgICAgaWYgKHZpcmdpbikgewogICAgICAgICAgbGVuZml4ID0gbmV3IEludDMyQXJyYXkoNTEyKTsKICAgICAgICAgIGRpc3RmaXggPSBuZXcgSW50MzJBcnJheSgzMik7CiAgICAgICAgICBsZXQgc3ltID0gMDsKICAgICAgICAgIHdoaWxlIChzeW0gPCAxNDQpIHsKICAgICAgICAgICAgc3RhdGUubGVuc1tzeW0rK10gPSA4OwogICAgICAgICAgfQogICAgICAgICAgd2hpbGUgKHN5bSA8IDI1NikgewogICAgICAgICAgICBzdGF0ZS5sZW5zW3N5bSsrXSA9IDk7CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoc3ltIDwgMjgwKSB7CiAgICAgICAgICAgIHN0YXRlLmxlbnNbc3ltKytdID0gNzsKICAgICAgICAgIH0KICAgICAgICAgIHdoaWxlIChzeW0gPCAyODgpIHsKICAgICAgICAgICAgc3RhdGUubGVuc1tzeW0rK10gPSA4OwogICAgICAgICAgfQogICAgICAgICAgaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS5sZW5zLCAwLCAyODgsIGxlbmZpeCwgMCwgc3RhdGUud29yaywgeyBiaXRzOiA5IH0pOwogICAgICAgICAgc3ltID0gMDsKICAgICAgICAgIHdoaWxlIChzeW0gPCAzMikgewogICAgICAgICAgICBzdGF0ZS5sZW5zW3N5bSsrXSA9IDU7CiAgICAgICAgICB9CiAgICAgICAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCAwLCAzMiwgZGlzdGZpeCwgMCwgc3RhdGUud29yaywgeyBiaXRzOiA1IH0pOwogICAgICAgICAgdmlyZ2luID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHN0YXRlLmxlbmNvZGUgPSBsZW5maXg7CiAgICAgICAgc3RhdGUubGVuYml0cyA9IDk7CiAgICAgICAgc3RhdGUuZGlzdGNvZGUgPSBkaXN0Zml4OwogICAgICAgIHN0YXRlLmRpc3RiaXRzID0gNTsKICAgICAgfTsKICAgICAgdmFyIHVwZGF0ZXdpbmRvdyA9IChzdHJtLCBzcmMsIGVuZCwgY29weSkgPT4gewogICAgICAgIGxldCBkaXN0OwogICAgICAgIGNvbnN0IHN0YXRlID0gc3RybS5zdGF0ZTsKICAgICAgICBpZiAoc3RhdGUud2luZG93ID09PSBudWxsKSB7CiAgICAgICAgICBzdGF0ZS53c2l6ZSA9IDEgPDwgc3RhdGUud2JpdHM7CiAgICAgICAgICBzdGF0ZS53bmV4dCA9IDA7CiAgICAgICAgICBzdGF0ZS53aGF2ZSA9IDA7CiAgICAgICAgICBzdGF0ZS53aW5kb3cgPSBuZXcgVWludDhBcnJheShzdGF0ZS53c2l6ZSk7CiAgICAgICAgfQogICAgICAgIGlmIChjb3B5ID49IHN0YXRlLndzaXplKSB7CiAgICAgICAgICBzdGF0ZS53aW5kb3cuc2V0KHNyYy5zdWJhcnJheShlbmQgLSBzdGF0ZS53c2l6ZSwgZW5kKSwgMCk7CiAgICAgICAgICBzdGF0ZS53bmV4dCA9IDA7CiAgICAgICAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkaXN0ID0gc3RhdGUud3NpemUgLSBzdGF0ZS53bmV4dDsKICAgICAgICAgIGlmIChkaXN0ID4gY29weSkgewogICAgICAgICAgICBkaXN0ID0gY29weTsKICAgICAgICAgIH0KICAgICAgICAgIHN0YXRlLndpbmRvdy5zZXQoc3JjLnN1YmFycmF5KGVuZCAtIGNvcHksIGVuZCAtIGNvcHkgKyBkaXN0KSwgc3RhdGUud25leHQpOwogICAgICAgICAgY29weSAtPSBkaXN0OwogICAgICAgICAgaWYgKGNvcHkpIHsKICAgICAgICAgICAgc3RhdGUud2luZG93LnNldChzcmMuc3ViYXJyYXkoZW5kIC0gY29weSwgZW5kKSwgMCk7CiAgICAgICAgICAgIHN0YXRlLnduZXh0ID0gY29weTsKICAgICAgICAgICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YXRlLnduZXh0ICs9IGRpc3Q7CiAgICAgICAgICAgIGlmIChzdGF0ZS53bmV4dCA9PT0gc3RhdGUud3NpemUpIHsKICAgICAgICAgICAgICBzdGF0ZS53bmV4dCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0YXRlLndoYXZlIDwgc3RhdGUud3NpemUpIHsKICAgICAgICAgICAgICBzdGF0ZS53aGF2ZSArPSBkaXN0OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwogICAgICB9OwogICAgICB2YXIgaW5mbGF0ZSA9IChzdHJtLCBmbHVzaCkgPT4gewogICAgICAgIGxldCBzdGF0ZTsKICAgICAgICBsZXQgaW5wdXQsIG91dHB1dDsKICAgICAgICBsZXQgbmV4dDsKICAgICAgICBsZXQgcHV0OwogICAgICAgIGxldCBoYXZlLCBsZWZ0OwogICAgICAgIGxldCBob2xkOwogICAgICAgIGxldCBiaXRzOwogICAgICAgIGxldCBfaW4sIF9vdXQ7CiAgICAgICAgbGV0IGNvcHk7CiAgICAgICAgbGV0IGZyb207CiAgICAgICAgbGV0IGZyb21fc291cmNlOwogICAgICAgIGxldCBoZXJlID0gMDsKICAgICAgICBsZXQgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsKICAgICAgICBsZXQgbGFzdF9iaXRzLCBsYXN0X29wLCBsYXN0X3ZhbDsKICAgICAgICBsZXQgbGVuOwogICAgICAgIGxldCByZXQ7CiAgICAgICAgY29uc3QgaGJ1ZiA9IG5ldyBVaW50OEFycmF5KDQpOwogICAgICAgIGxldCBvcHRzOwogICAgICAgIGxldCBuOwogICAgICAgIGNvbnN0IG9yZGVyID0gKAogICAgICAgICAgLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovCiAgICAgICAgICBuZXcgVWludDhBcnJheShbMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNV0pCiAgICAgICAgKTsKICAgICAgICBpZiAoaW5mbGF0ZVN0YXRlQ2hlY2soc3RybSkgfHwgIXN0cm0ub3V0cHV0IHx8ICFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHsKICAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgICAgICB9CiAgICAgICAgc3RhdGUgPSBzdHJtLnN0YXRlOwogICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7CiAgICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRURPOwogICAgICAgIH0KICAgICAgICBwdXQgPSBzdHJtLm5leHRfb3V0OwogICAgICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0OwogICAgICAgIGxlZnQgPSBzdHJtLmF2YWlsX291dDsKICAgICAgICBuZXh0ID0gc3RybS5uZXh0X2luOwogICAgICAgIGlucHV0ID0gc3RybS5pbnB1dDsKICAgICAgICBoYXZlID0gc3RybS5hdmFpbF9pbjsKICAgICAgICBob2xkID0gc3RhdGUuaG9sZDsKICAgICAgICBiaXRzID0gc3RhdGUuYml0czsKICAgICAgICBfaW4gPSBoYXZlOwogICAgICAgIF9vdXQgPSBsZWZ0OwogICAgICAgIHJldCA9IFpfT0s7CiAgICAgICAgaW5mX2xlYXZlOgogICAgICAgICAgZm9yICg7IDsgKSB7CiAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUubW9kZSkgewogICAgICAgICAgICAgIGNhc2UgSEVBRDoKICAgICAgICAgICAgICAgIGlmIChzdGF0ZS53cmFwID09PSAwKSB7CiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFRE87CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikgewogICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUud3JhcCAmIDIgJiYgaG9sZCA9PT0gMzU2MTUpIHsKICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLndiaXRzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUud2JpdHMgPSAxNTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzdGF0ZS5jaGVjayA9IDA7CiAgICAgICAgICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMjU1OwogICAgICAgICAgICAgICAgICBoYnVmWzFdID0gaG9sZCA+Pj4gOCAmIDI1NTsKICAgICAgICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7CiAgICAgICAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICAgICAgICBiaXRzID0gMDsKICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEZMQUdTOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7CiAgICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCEoc3RhdGUud3JhcCAmIDEpIHx8IC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi8KICAgICAgICAgICAgICAgICgoKGhvbGQgJiAyNTUpIDw8IDgpICsgKGhvbGQgPj4gOCkpICUgMzEpIHsKICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW5jb3JyZWN0IGhlYWRlciBjaGVjayI7CiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKChob2xkICYgMTUpICE9PSBaX0RFRkxBVEVEKSB7CiAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIjsKICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBob2xkID4+Pj0gNDsKICAgICAgICAgICAgICAgIGJpdHMgLT0gNDsKICAgICAgICAgICAgICAgIGxlbiA9IChob2xkICYgMTUpICsgODsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZS53Yml0cyA9PT0gMCkgewogICAgICAgICAgICAgICAgICBzdGF0ZS53Yml0cyA9IGxlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxNSB8fCBsZW4gPiBzdGF0ZS53Yml0cykgewogICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIHdpbmRvdyBzaXplIjsKICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdGF0ZS5kbWF4ID0gMSA8PCBzdGF0ZS53Yml0czsKICAgICAgICAgICAgICAgIHN0YXRlLmZsYWdzID0gMDsKICAgICAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDE7CiAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gaG9sZCAmIDUxMiA/IERJQ1RJRCA6IFRZUEU7CiAgICAgICAgICAgICAgICBob2xkID0gMDsKICAgICAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSBGTEFHUzoKICAgICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHsKICAgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3RhdGUuZmxhZ3MgPSBob2xkOwogICAgICAgICAgICAgICAgaWYgKChzdGF0ZS5mbGFncyAmIDI1NSkgIT09IFpfREVGTEFURUQpIHsKICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAidW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QiOwogICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDU3MzQ0KSB7CiAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gInVua25vd24gaGVhZGVyIGZsYWdzIHNldCI7CiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHsKICAgICAgICAgICAgICAgICAgc3RhdGUuaGVhZC50ZXh0ID0gaG9sZCA+PiA4ICYgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDUxMiAmJiBzdGF0ZS53cmFwICYgNCkgewogICAgICAgICAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDI1NTsKICAgICAgICAgICAgICAgICAgaGJ1ZlsxXSA9IGhvbGQgPj4+IDggJiAyNTU7CiAgICAgICAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaG9sZCA9IDA7CiAgICAgICAgICAgICAgICBiaXRzID0gMDsKICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBUSU1FOwogICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KICAgICAgICAgICAgICBjYXNlIFRJTUU6CiAgICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7CiAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7CiAgICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQudGltZSA9IGhvbGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiA1MTIgJiYgc3RhdGUud3JhcCAmIDQpIHsKICAgICAgICAgICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAyNTU7CiAgICAgICAgICAgICAgICAgIGhidWZbMV0gPSBob2xkID4+PiA4ICYgMjU1OwogICAgICAgICAgICAgICAgICBoYnVmWzJdID0gaG9sZCA+Pj4gMTYgJiAyNTU7CiAgICAgICAgICAgICAgICAgIGhidWZbM10gPSBob2xkID4+PiAyNCAmIDI1NTsKICAgICAgICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgNCwgMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBob2xkID0gMDsKICAgICAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IE9TOwogICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KICAgICAgICAgICAgICBjYXNlIE9TOgogICAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikgewogICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkgewogICAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLnhmbGFncyA9IGhvbGQgJiAyNTU7CiAgICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQub3MgPSBob2xkID4+IDg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiA1MTIgJiYgc3RhdGUud3JhcCAmIDQpIHsKICAgICAgICAgICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAyNTU7CiAgICAgICAgICAgICAgICAgIGhidWZbMV0gPSBob2xkID4+PiA4ICYgMjU1OwogICAgICAgICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICAgICAgYml0cyA9IDA7CiAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gRVhMRU47CiAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwogICAgICAgICAgICAgIGNhc2UgRVhMRU46CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAxMDI0KSB7CiAgICAgICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQ7CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9sZW4gPSBob2xkOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDUxMiAmJiBzdGF0ZS53cmFwICYgNCkgewogICAgICAgICAgICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMjU1OwogICAgICAgICAgICAgICAgICAgIGhidWZbMV0gPSBob2xkID4+PiA4ICYgMjU1OwogICAgICAgICAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICAgICAgICBiaXRzID0gMDsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuaGVhZCkgewogICAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBFWFRSQTsKICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovCiAgICAgICAgICAgICAgY2FzZSBFWFRSQToKICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDEwMjQpIHsKICAgICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7CiAgICAgICAgICAgICAgICAgICAgY29weSA9IGhhdmU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGNvcHkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkgewogICAgICAgICAgICAgICAgICAgICAgbGVuID0gc3RhdGUuaGVhZC5leHRyYV9sZW4gLSBzdGF0ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLmhlYWQuZXh0cmEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSA9IG5ldyBVaW50OEFycmF5KHN0YXRlLmhlYWQuZXh0cmFfbGVuKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEuc2V0KAogICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zdWJhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGlzIGxpbWl0ZWQgdG8gNjU1MzYgYnl0ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtIG5vIG5lZWQgZm9yIGFkZGl0aW9uYWwgc2l6ZSBjaGVjawogICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgKyBjb3B5CiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgIC8qbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuID8gc3RhdGUuaGVhZC5leHRyYV9tYXggOiBjb3B5LCovCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbgogICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgNTEyICYmIHN0YXRlLndyYXAgJiA0KSB7CiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3RhdGUubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBOQU1FOwogICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KICAgICAgICAgICAgICBjYXNlIE5BTUU6CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAyMDQ4KSB7CiAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGNvcHkgPSAwOwogICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmIHN0YXRlLmxlbmd0aCA8IDY1NTM2KSB7CiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTsKICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgNTEyICYmIHN0YXRlLndyYXAgJiA0KSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKICAgICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OwogICAgICAgICAgICAgICAgICBpZiAobGVuKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmhlYWQpIHsKICAgICAgICAgICAgICAgICAgc3RhdGUuaGVhZC5uYW1lID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0YXRlLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQ09NTUVOVDsKICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovCiAgICAgICAgICAgICAgY2FzZSBDT01NRU5UOgogICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgNDA5NikgewogICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBjb3B5ID0gMDsKICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJiBzdGF0ZS5sZW5ndGggPCA2NTUzNikgewogICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDUxMiAmJiBzdGF0ZS53cmFwICYgNCkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7CiAgICAgICAgICAgICAgICAgIG5leHQgKz0gY29weTsKICAgICAgICAgICAgICAgICAgaWYgKGxlbikgewogICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7CiAgICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuY29tbWVudCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gSENSQzsKICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovCiAgICAgICAgICAgICAgY2FzZSBIQ1JDOgogICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgNTEyKSB7CiAgICAgICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS53cmFwICYgNCAmJiBob2xkICE9PSAoc3RhdGUuY2hlY2sgJiA2NTUzNSkpIHsKICAgICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJoZWFkZXIgY3JjIG1pc21hdGNoIjsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICAgICAgICBiaXRzID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7CiAgICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuaGNyYyA9IHN0YXRlLmZsYWdzID4+IDkgJiAxOwogICAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMDsKICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSBESUNUSUQ6CiAgICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7CiAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IHpzd2FwMzIoaG9sZCk7CiAgICAgICAgICAgICAgICBob2xkID0gMDsKICAgICAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IERJQ1Q7CiAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwogICAgICAgICAgICAgIGNhc2UgRElDVDoKICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5oYXZlZGljdCA9PT0gMCkgewogICAgICAgICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0OwogICAgICAgICAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7CiAgICAgICAgICAgICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7CiAgICAgICAgICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlOwogICAgICAgICAgICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDsKICAgICAgICAgICAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7CiAgICAgICAgICAgICAgICAgIHJldHVybiBaX05FRURfRElDVDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDE7CiAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTsKICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovCiAgICAgICAgICAgICAgY2FzZSBUWVBFOgogICAgICAgICAgICAgICAgaWYgKGZsdXNoID09PSBaX0JMT0NLIHx8IGZsdXNoID09PSBaX1RSRUVTKSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovCiAgICAgICAgICAgICAgY2FzZSBUWVBFRE86CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUubGFzdCkgewogICAgICAgICAgICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7CiAgICAgICAgICAgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7CiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBDSEVDSzsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHsKICAgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3RhdGUubGFzdCA9IGhvbGQgJiAxOwogICAgICAgICAgICAgICAgaG9sZCA+Pj49IDE7CiAgICAgICAgICAgICAgICBiaXRzIC09IDE7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGhvbGQgJiAzKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gU1RPUkVEOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgZml4ZWR0YWJsZXMoc3RhdGUpOwogICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fOwogICAgICAgICAgICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgewogICAgICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IDI7CiAgICAgICAgICAgICAgICAgICAgICBiaXRzIC09IDI7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IFRBQkxFOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBibG9jayB0eXBlIjsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaG9sZCA+Pj49IDI7CiAgICAgICAgICAgICAgICBiaXRzIC09IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIFNUT1JFRDoKICAgICAgICAgICAgICAgIGhvbGQgPj4+PSBiaXRzICYgNzsKICAgICAgICAgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7CiAgICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7CiAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgoaG9sZCAmIDY1NTM1KSAhPT0gKGhvbGQgPj4+IDE2IF4gNjU1MzUpKSB7CiAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiOwogICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQgJiA2NTUzNTsKICAgICAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICAgICAgYml0cyA9IDA7CiAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQ09QWV87CiAgICAgICAgICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsKICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KICAgICAgICAgICAgICBjYXNlIENPUFlfOgogICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IENPUFk7CiAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwogICAgICAgICAgICAgIGNhc2UgQ09QWToKICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoY29weSkgewogICAgICAgICAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsKICAgICAgICAgICAgICAgICAgICBjb3B5ID0gaGF2ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsKICAgICAgICAgICAgICAgICAgICBjb3B5ID0gbGVmdDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoY29weSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBvdXRwdXQuc2V0KGlucHV0LnN1YmFycmF5KG5leHQsIG5leHQgKyBjb3B5KSwgcHV0KTsKICAgICAgICAgICAgICAgICAgaGF2ZSAtPSBjb3B5OwogICAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7CiAgICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKICAgICAgICAgICAgICAgICAgcHV0ICs9IGNvcHk7CiAgICAgICAgICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSBUQUJMRToKICAgICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTQpIHsKICAgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3RhdGUubmxlbiA9IChob2xkICYgMzEpICsgMjU3OwogICAgICAgICAgICAgICAgaG9sZCA+Pj49IDU7CiAgICAgICAgICAgICAgICBiaXRzIC09IDU7CiAgICAgICAgICAgICAgICBzdGF0ZS5uZGlzdCA9IChob2xkICYgMzEpICsgMTsKICAgICAgICAgICAgICAgIGhvbGQgPj4+PSA1OwogICAgICAgICAgICAgICAgYml0cyAtPSA1OwogICAgICAgICAgICAgICAgc3RhdGUubmNvZGUgPSAoaG9sZCAmIDE1KSArIDQ7CiAgICAgICAgICAgICAgICBob2xkID4+Pj0gNDsKICAgICAgICAgICAgICAgIGJpdHMgLT0gNDsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5ubGVuID4gMjg2IHx8IHN0YXRlLm5kaXN0ID4gMzApIHsKICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAidG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiOwogICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0YXRlLmhhdmUgPSAwOwogICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IExFTkxFTlM7CiAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwogICAgICAgICAgICAgIGNhc2UgTEVOTEVOUzoKICAgICAgICAgICAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmNvZGUpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gaG9sZCAmIDc7CiAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSAzOwogICAgICAgICAgICAgICAgICBiaXRzIC09IDM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IDE5KSB7CiAgICAgICAgICAgICAgICAgIHN0YXRlLmxlbnNbb3JkZXJbc3RhdGUuaGF2ZSsrXV0gPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3RhdGUubGVuY29kZSA9IHN0YXRlLmxlbmR5bjsKICAgICAgICAgICAgICAgIHN0YXRlLmxlbmJpdHMgPSA3OwogICAgICAgICAgICAgICAgb3B0cyA9IHsgYml0czogc3RhdGUubGVuYml0cyB9OwogICAgICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShDT0RFUywgc3RhdGUubGVucywgMCwgMTksIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpOwogICAgICAgICAgICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0czsKICAgICAgICAgICAgICAgIGlmIChyZXQpIHsKICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IjsKICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdGF0ZS5oYXZlID0gMDsKICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBDT0RFTEVOUzsKICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovCiAgICAgICAgICAgICAgY2FzZSBDT0RFTEVOUzoKICAgICAgICAgICAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7CiAgICAgICAgICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDFdOwogICAgICAgICAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0OwogICAgICAgICAgICAgICAgICAgIGhlcmVfb3AgPSBoZXJlID4+PiAxNiAmIDI1NTsKICAgICAgICAgICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiA2NTUzNTsKICAgICAgICAgICAgICAgICAgICBpZiAoaGVyZV9iaXRzIDw9IGJpdHMpIHsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChoZXJlX3ZhbCA8IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0czsKICAgICAgICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0czsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUrK10gPSBoZXJlX3ZhbDsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaGVyZV92YWwgPT09IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMjsKICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUgLSAxXTsKICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAzICsgKGhvbGQgJiAzKTsKICAgICAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSAyOwogICAgICAgICAgICAgICAgICAgICAgYml0cyAtPSAyOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVyZV92YWwgPT09IDE3KSB7CiAgICAgICAgICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMzsKICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7CiAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOwogICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDcpOwogICAgICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IDM7CiAgICAgICAgICAgICAgICAgICAgICBiaXRzIC09IDM7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyA3OwogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7CiAgICAgICAgICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0czsKICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMTEgKyAoaG9sZCAmIDEyNyk7CiAgICAgICAgICAgICAgICAgICAgICBob2xkID4+Pj0gNzsKICAgICAgICAgICAgICAgICAgICAgIGJpdHMgLT0gNzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgKyBjb3B5ID4gc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkgewogICAgICAgICAgICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gbGVuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IEJBRCkgewogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5sZW5zWzI1Nl0gPT09IDApIHsKICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrIjsKICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdGF0ZS5sZW5iaXRzID0gOTsKICAgICAgICAgICAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTsKICAgICAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUubGVucywgMCwgc3RhdGUubmxlbiwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7CiAgICAgICAgICAgICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzOwogICAgICAgICAgICAgICAgaWYgKHJldCkgewogICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiOwogICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0YXRlLmRpc3RiaXRzID0gNjsKICAgICAgICAgICAgICAgIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUuZGlzdGR5bjsKICAgICAgICAgICAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmRpc3RiaXRzIH07CiAgICAgICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCBzdGF0ZS5ubGVuLCBzdGF0ZS5uZGlzdCwgc3RhdGUuZGlzdGNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpOwogICAgICAgICAgICAgICAgc3RhdGUuZGlzdGJpdHMgPSBvcHRzLmJpdHM7CiAgICAgICAgICAgICAgICBpZiAocmV0KSB7CiAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgZGlzdGFuY2VzIHNldCI7CiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IExFTl87CiAgICAgICAgICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsKICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KICAgICAgICAgICAgICBjYXNlIExFTl86CiAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gTEVOOwogICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KICAgICAgICAgICAgICBjYXNlIExFTjoKICAgICAgICAgICAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHsKICAgICAgICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDsKICAgICAgICAgICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0OwogICAgICAgICAgICAgICAgICBzdHJtLm5leHRfaW4gPSBuZXh0OwogICAgICAgICAgICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTsKICAgICAgICAgICAgICAgICAgc3RhdGUuaG9sZCA9IGhvbGQ7CiAgICAgICAgICAgICAgICAgIHN0YXRlLmJpdHMgPSBiaXRzOwogICAgICAgICAgICAgICAgICBpbmZsYXRlX2Zhc3Qoc3RybSwgX291dCk7CiAgICAgICAgICAgICAgICAgIHB1dCA9IHN0cm0ubmV4dF9vdXQ7CiAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0OwogICAgICAgICAgICAgICAgICBsZWZ0ID0gc3RybS5hdmFpbF9vdXQ7CiAgICAgICAgICAgICAgICAgIG5leHQgPSBzdHJtLm5leHRfaW47CiAgICAgICAgICAgICAgICAgIGlucHV0ID0gc3RybS5pbnB1dDsKICAgICAgICAgICAgICAgICAgaGF2ZSA9IHN0cm0uYXZhaWxfaW47CiAgICAgICAgICAgICAgICAgIGhvbGQgPSBzdGF0ZS5ob2xkOwogICAgICAgICAgICAgICAgICBiaXRzID0gc3RhdGUuYml0czsKICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFRZUEUpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdGF0ZS5iYWNrID0gMDsKICAgICAgICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKDEgPDwgc3RhdGUubGVuYml0cykgLSAxXTsKICAgICAgICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7CiAgICAgICAgICAgICAgICAgIGhlcmVfb3AgPSBoZXJlID4+PiAxNiAmIDI1NTsKICAgICAgICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgNjU1MzU7CiAgICAgICAgICAgICAgICAgIGlmIChoZXJlX2JpdHMgPD0gYml0cykgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChoZXJlX29wICYmIChoZXJlX29wICYgMjQwKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7CiAgICAgICAgICAgICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wOwogICAgICAgICAgICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsOwogICAgICAgICAgICAgICAgICBmb3IgKDsgOyApIHsKICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtsYXN0X3ZhbCArICgoaG9sZCAmICgxIDw8IGxhc3RfYml0cyArIGxhc3Rfb3ApIC0gMSkgPj4gbGFzdF9iaXRzKV07CiAgICAgICAgICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7CiAgICAgICAgICAgICAgICAgICAgaGVyZV9vcCA9IGhlcmUgPj4+IDE2ICYgMjU1OwogICAgICAgICAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDY1NTM1OwogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0X2JpdHMgKyBoZXJlX2JpdHMgPD0gYml0cykgewogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0czsKICAgICAgICAgICAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7CiAgICAgICAgICAgICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0czsKICAgICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7CiAgICAgICAgICAgICAgICBzdGF0ZS5sZW5ndGggPSBoZXJlX3ZhbDsKICAgICAgICAgICAgICAgIGlmIChoZXJlX29wID09PSAwKSB7CiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBMSVQ7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGhlcmVfb3AgJiAzMikgewogICAgICAgICAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7CiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChoZXJlX29wICYgNjQpIHsKICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdGF0ZS5leHRyYSA9IGhlcmVfb3AgJiAxNTsKICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBMRU5FWFQ7CiAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwogICAgICAgICAgICAgIGNhc2UgTEVORVhUOgogICAgICAgICAgICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7CiAgICAgICAgICAgICAgICAgIG4gPSBzdGF0ZS5leHRyYTsKICAgICAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzdGF0ZS5sZW5ndGggKz0gaG9sZCAmICgxIDw8IHN0YXRlLmV4dHJhKSAtIDE7CiAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTsKICAgICAgICAgICAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTsKICAgICAgICAgICAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0YXRlLndhcyA9IHN0YXRlLmxlbmd0aDsKICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBESVNUOwogICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KICAgICAgICAgICAgICBjYXNlIERJU1Q6CiAgICAgICAgICAgICAgICBmb3IgKDsgOyApIHsKICAgICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2hvbGQgJiAoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxXTsKICAgICAgICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7CiAgICAgICAgICAgICAgICAgIGhlcmVfb3AgPSBoZXJlID4+PiAxNiAmIDI1NTsKICAgICAgICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgNjU1MzU7CiAgICAgICAgICAgICAgICAgIGlmIChoZXJlX2JpdHMgPD0gYml0cykgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgoaGVyZV9vcCAmIDI0MCkgPT09IDApIHsKICAgICAgICAgICAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgICBsYXN0X29wID0gaGVyZV9vcDsKICAgICAgICAgICAgICAgICAgbGFzdF92YWwgPSBoZXJlX3ZhbDsKICAgICAgICAgICAgICAgICAgZm9yICg7IDsgKSB7CiAgICAgICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2xhc3RfdmFsICsgKChob2xkICYgKDEgPDwgbGFzdF9iaXRzICsgbGFzdF9vcCkgLSAxKSA+PiBsYXN0X2JpdHMpXTsKICAgICAgICAgICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDsKICAgICAgICAgICAgICAgICAgICBoZXJlX29wID0gaGVyZSA+Pj4gMTYgJiAyNTU7CiAgICAgICAgICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgNjU1MzU7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RfYml0cyArIGhlcmVfYml0cyA8PSBiaXRzKSB7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzOwogICAgICAgICAgICAgICAgICBiaXRzIC09IGxhc3RfYml0czsKICAgICAgICAgICAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7CiAgICAgICAgICAgICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0czsKICAgICAgICAgICAgICAgIGlmIChoZXJlX29wICYgNjQpIHsKICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdGF0ZS5vZmZzZXQgPSBoZXJlX3ZhbDsKICAgICAgICAgICAgICAgIHN0YXRlLmV4dHJhID0gaGVyZV9vcCAmIDE1OwogICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IERJU1RFWFQ7CiAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwogICAgICAgICAgICAgIGNhc2UgRElTVEVYVDoKICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5leHRyYSkgewogICAgICAgICAgICAgICAgICBuID0gc3RhdGUuZXh0cmE7CiAgICAgICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikgewogICAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc3RhdGUub2Zmc2V0ICs9IGhvbGQgJiAoMSA8PCBzdGF0ZS5leHRyYSkgLSAxOwogICAgICAgICAgICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7CiAgICAgICAgICAgICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7CiAgICAgICAgICAgICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gc3RhdGUuZG1heCkgewogICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IE1BVENIOwogICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KICAgICAgICAgICAgICBjYXNlIE1BVENIOgogICAgICAgICAgICAgICAgaWYgKGxlZnQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29weSA9IF9vdXQgLSBsZWZ0OwogICAgICAgICAgICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IGNvcHkpIHsKICAgICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLm9mZnNldCAtIGNvcHk7CiAgICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUud2hhdmUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkgewogICAgICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOwogICAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLnduZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgY29weSAtPSBzdGF0ZS53bmV4dDsKICAgICAgICAgICAgICAgICAgICBmcm9tID0gc3RhdGUud3NpemUgLSBjb3B5OwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZyb20gPSBzdGF0ZS53bmV4dCAtIGNvcHk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gc3RhdGUud2luZG93OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7CiAgICAgICAgICAgICAgICAgIGZyb20gPSBwdXQgLSBzdGF0ZS5vZmZzZXQ7CiAgICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsKICAgICAgICAgICAgICAgICAgY29weSA9IGxlZnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZWZ0IC09IGNvcHk7CiAgICAgICAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgb3V0cHV0W3B1dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107CiAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpOwogICAgICAgICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gTEVOOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSBMSVQ6CiAgICAgICAgICAgICAgICBpZiAobGVmdCA9PT0gMCkgewogICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvdXRwdXRbcHV0KytdID0gc3RhdGUubGVuZ3RoOwogICAgICAgICAgICAgICAgbGVmdC0tOwogICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IExFTjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgQ0hFQ0s6CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUud3JhcCkgewogICAgICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgICAgIGhvbGQgfD0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBfb3V0IC09IGxlZnQ7CiAgICAgICAgICAgICAgICAgIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7CiAgICAgICAgICAgICAgICAgIHN0YXRlLnRvdGFsICs9IF9vdXQ7CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS53cmFwICYgNCAmJiBfb3V0KSB7CiAgICAgICAgICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gLypVUERBVEVfQ0hFQ0soc3RhdGUuY2hlY2ssIHB1dCAtIF9vdXQsIF9vdXQpOyovCiAgICAgICAgICAgICAgICAgICAgc3RhdGUuZmxhZ3MgPyBjcmMzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgX291dCA9IGxlZnQ7CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS53cmFwICYgNCAmJiAoc3RhdGUuZmxhZ3MgPyBob2xkIDogenN3YXAzMihob2xkKSkgIT09IHN0YXRlLmNoZWNrKSB7CiAgICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW5jb3JyZWN0IGRhdGEgY2hlY2siOwogICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaG9sZCA9IDA7CiAgICAgICAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IExFTkdUSDsKICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovCiAgICAgICAgICAgICAgY2FzZSBMRU5HVEg6CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUud3JhcCAmJiBzdGF0ZS5mbGFncykgewogICAgICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoc3RhdGUud3JhcCAmIDQgJiYgaG9sZCAhPT0gKHN0YXRlLnRvdGFsICYgNDI5NDk2NzI5NSkpIHsKICAgICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrIjsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICAgICAgICBiaXRzID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBET05FOwogICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KICAgICAgICAgICAgICBjYXNlIERPTkU6CiAgICAgICAgICAgICAgICByZXQgPSBaX1NUUkVBTV9FTkQ7CiAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgY2FzZSBCQUQ6CiAgICAgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CiAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgY2FzZSBNRU06CiAgICAgICAgICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CiAgICAgICAgICAgICAgY2FzZSBTWU5DOgogICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDsKICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7CiAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDsKICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTsKICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDsKICAgICAgICBzdGF0ZS5iaXRzID0gYml0czsKICAgICAgICBpZiAoc3RhdGUud3NpemUgfHwgX291dCAhPT0gc3RybS5hdmFpbF9vdXQgJiYgc3RhdGUubW9kZSA8IEJBRCAmJiAoc3RhdGUubW9kZSA8IENIRUNLIHx8IGZsdXNoICE9PSBaX0ZJTklTSCkpIHsKICAgICAgICAgIGlmICh1cGRhdGV3aW5kb3coc3RybSwgc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQsIF9vdXQgLSBzdHJtLmF2YWlsX291dCkpIHsKICAgICAgICAgICAgc3RhdGUubW9kZSA9IE1FTTsKICAgICAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfaW4gLT0gc3RybS5hdmFpbF9pbjsKICAgICAgICBfb3V0IC09IHN0cm0uYXZhaWxfb3V0OwogICAgICAgIHN0cm0udG90YWxfaW4gKz0gX2luOwogICAgICAgIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7CiAgICAgICAgc3RhdGUudG90YWwgKz0gX291dDsKICAgICAgICBpZiAoc3RhdGUud3JhcCAmIDQgJiYgX291dCkgewogICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gLypVUERBVEVfQ0hFQ0soc3RhdGUuY2hlY2ssIHN0cm0ubmV4dF9vdXQgLSBfb3V0LCBfb3V0KTsqLwogICAgICAgICAgc3RhdGUuZmxhZ3MgPyBjcmMzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KTsKICAgICAgICB9CiAgICAgICAgc3RybS5kYXRhX3R5cGUgPSBzdGF0ZS5iaXRzICsgKHN0YXRlLmxhc3QgPyA2NCA6IDApICsgKHN0YXRlLm1vZGUgPT09IFRZUEUgPyAxMjggOiAwKSArIChzdGF0ZS5tb2RlID09PSBMRU5fIHx8IHN0YXRlLm1vZGUgPT09IENPUFlfID8gMjU2IDogMCk7CiAgICAgICAgaWYgKChfaW4gPT09IDAgJiYgX291dCA9PT0gMCB8fCBmbHVzaCA9PT0gWl9GSU5JU0gpICYmIHJldCA9PT0gWl9PSykgewogICAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH07CiAgICAgIHZhciBpbmZsYXRlRW5kID0gKHN0cm0pID0+IHsKICAgICAgICBpZiAoaW5mbGF0ZVN0YXRlQ2hlY2soc3RybSkpIHsKICAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgICAgICB9CiAgICAgICAgbGV0IHN0YXRlID0gc3RybS5zdGF0ZTsKICAgICAgICBpZiAoc3RhdGUud2luZG93KSB7CiAgICAgICAgICBzdGF0ZS53aW5kb3cgPSBudWxsOwogICAgICAgIH0KICAgICAgICBzdHJtLnN0YXRlID0gbnVsbDsKICAgICAgICByZXR1cm4gWl9PSzsKICAgICAgfTsKICAgICAgdmFyIGluZmxhdGVHZXRIZWFkZXIgPSAoc3RybSwgaGVhZCkgPT4gewogICAgICAgIGlmIChpbmZsYXRlU3RhdGVDaGVjayhzdHJtKSkgewogICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgICAgIH0KICAgICAgICBjb25zdCBzdGF0ZSA9IHN0cm0uc3RhdGU7CiAgICAgICAgaWYgKChzdGF0ZS53cmFwICYgMikgPT09IDApIHsKICAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgICAgICB9CiAgICAgICAgc3RhdGUuaGVhZCA9IGhlYWQ7CiAgICAgICAgaGVhZC5kb25lID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIFpfT0s7CiAgICAgIH07CiAgICAgIHZhciBpbmZsYXRlU2V0RGljdGlvbmFyeSA9IChzdHJtLCBkaWN0aW9uYXJ5KSA9PiB7CiAgICAgICAgY29uc3QgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoOwogICAgICAgIGxldCBzdGF0ZTsKICAgICAgICBsZXQgZGljdGlkOwogICAgICAgIGxldCByZXQ7CiAgICAgICAgaWYgKGluZmxhdGVTdGF0ZUNoZWNrKHN0cm0pKSB7CiAgICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAgICAgICAgfQogICAgICAgIHN0YXRlID0gc3RybS5zdGF0ZTsKICAgICAgICBpZiAoc3RhdGUud3JhcCAhPT0gMCAmJiBzdGF0ZS5tb2RlICE9PSBESUNUKSB7CiAgICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBESUNUKSB7CiAgICAgICAgICBkaWN0aWQgPSAxOwogICAgICAgICAgZGljdGlkID0gYWRsZXIzMihkaWN0aWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApOwogICAgICAgICAgaWYgKGRpY3RpZCAhPT0gc3RhdGUuY2hlY2spIHsKICAgICAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0ID0gdXBkYXRld2luZG93KHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIGRpY3RMZW5ndGgpOwogICAgICAgIGlmIChyZXQpIHsKICAgICAgICAgIHN0YXRlLm1vZGUgPSBNRU07CiAgICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CiAgICAgICAgfQogICAgICAgIHN0YXRlLmhhdmVkaWN0ID0gMTsKICAgICAgICByZXR1cm4gWl9PSzsKICAgICAgfTsKICAgICAgbW9kdWxlLmV4cG9ydHMuaW5mbGF0ZVJlc2V0ID0gaW5mbGF0ZVJlc2V0OwogICAgICBtb2R1bGUuZXhwb3J0cy5pbmZsYXRlUmVzZXQyID0gaW5mbGF0ZVJlc2V0MjsKICAgICAgbW9kdWxlLmV4cG9ydHMuaW5mbGF0ZVJlc2V0S2VlcCA9IGluZmxhdGVSZXNldEtlZXA7CiAgICAgIG1vZHVsZS5leHBvcnRzLmluZmxhdGVJbml0ID0gaW5mbGF0ZUluaXQ7CiAgICAgIG1vZHVsZS5leHBvcnRzLmluZmxhdGVJbml0MiA9IGluZmxhdGVJbml0MjsKICAgICAgbW9kdWxlLmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7CiAgICAgIG1vZHVsZS5leHBvcnRzLmluZmxhdGVFbmQgPSBpbmZsYXRlRW5kOwogICAgICBtb2R1bGUuZXhwb3J0cy5pbmZsYXRlR2V0SGVhZGVyID0gaW5mbGF0ZUdldEhlYWRlcjsKICAgICAgbW9kdWxlLmV4cG9ydHMuaW5mbGF0ZVNldERpY3Rpb25hcnkgPSBpbmZsYXRlU2V0RGljdGlvbmFyeTsKICAgICAgbW9kdWxlLmV4cG9ydHMuaW5mbGF0ZUluZm8gPSAicGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSI7CiAgICB9CiAgfSk7CgogIC8vIG5vZGVfbW9kdWxlcy9wYWtvL2xpYi91dGlscy9jb21tb24uanMKICB2YXIgcmVxdWlyZV9jb21tb24gPSBfX2NvbW1vbkpTKHsKICAgICJub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvY29tbW9uLmpzIihleHBvcnRzMiwgbW9kdWxlKSB7CiAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgdmFyIF9oYXMgPSAob2JqLCBrZXkpID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTsKICAgICAgfTsKICAgICAgbW9kdWxlLmV4cG9ydHMuYXNzaWduID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgY29uc3Qgc291cmNlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgd2hpbGUgKHNvdXJjZXMubGVuZ3RoKSB7CiAgICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzLnNoaWZ0KCk7CiAgICAgICAgICBpZiAoIXNvdXJjZSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAib2JqZWN0IikgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICJtdXN0IGJlIG5vbi1vYmplY3QiKTsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAoY29uc3QgcCBpbiBzb3VyY2UpIHsKICAgICAgICAgICAgaWYgKF9oYXMoc291cmNlLCBwKSkgewogICAgICAgICAgICAgIG9ialtwXSA9IHNvdXJjZVtwXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gb2JqOwogICAgICB9OwogICAgICBtb2R1bGUuZXhwb3J0cy5mbGF0dGVuQ2h1bmtzID0gKGNodW5rcykgPT4gewogICAgICAgIGxldCBsZW4gPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY2h1bmtzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgICAgbGVuICs9IGNodW5rc1tpXS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGxlbik7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICBsZXQgY2h1bmsgPSBjaHVua3NbaV07CiAgICAgICAgICByZXN1bHQuc2V0KGNodW5rLCBwb3MpOwogICAgICAgICAgcG9zICs9IGNodW5rLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgIH0KICB9KTsKCiAgLy8gbm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL3N0cmluZ3MuanMKICB2YXIgcmVxdWlyZV9zdHJpbmdzID0gX19jb21tb25KUyh7CiAgICAibm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL3N0cmluZ3MuanMiKGV4cG9ydHMyLCBtb2R1bGUpIHsKICAgICAgInVzZSBzdHJpY3QiOwogICAgICB2YXIgU1RSX0FQUExZX1VJQV9PSyA9IHRydWU7CiAgICAgIHRyeSB7CiAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheSgxKSk7CiAgICAgIH0gY2F0Y2ggKF9fKSB7CiAgICAgICAgU1RSX0FQUExZX1VJQV9PSyA9IGZhbHNlOwogICAgICB9CiAgICAgIHZhciBfdXRmOGxlbiA9IG5ldyBVaW50OEFycmF5KDI1Nik7CiAgICAgIGZvciAobGV0IHEgPSAwOyBxIDwgMjU2OyBxKyspIHsKICAgICAgICBfdXRmOGxlbltxXSA9IHEgPj0gMjUyID8gNiA6IHEgPj0gMjQ4ID8gNSA6IHEgPj0gMjQwID8gNCA6IHEgPj0gMjI0ID8gMyA6IHEgPj0gMTkyID8gMiA6IDE7CiAgICAgIH0KICAgICAgX3V0ZjhsZW5bMjU0XSA9IF91dGY4bGVuWzI1NF0gPSAxOwogICAgICBtb2R1bGUuZXhwb3J0cy5zdHJpbmcyYnVmID0gKHN0cikgPT4gewogICAgICAgIGlmICh0eXBlb2YgVGV4dEVuY29kZXIgPT09ICJmdW5jdGlvbiIgJiYgVGV4dEVuY29kZXIucHJvdG90eXBlLmVuY29kZSkgewogICAgICAgICAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHIpOwogICAgICAgIH0KICAgICAgICBsZXQgYnVmLCBjLCBjMiwgbV9wb3MsIGksIHN0cl9sZW4gPSBzdHIubGVuZ3RoLCBidWZfbGVuID0gMDsKICAgICAgICBmb3IgKG1fcG9zID0gMDsgbV9wb3MgPCBzdHJfbGVuOyBtX3BvcysrKSB7CiAgICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpOwogICAgICAgICAgaWYgKChjICYgNjQ1MTIpID09PSA1NTI5NiAmJiBtX3BvcyArIDEgPCBzdHJfbGVuKSB7CiAgICAgICAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MgKyAxKTsKICAgICAgICAgICAgaWYgKChjMiAmIDY0NTEyKSA9PT0gNTYzMjApIHsKICAgICAgICAgICAgICBjID0gNjU1MzYgKyAoYyAtIDU1Mjk2IDw8IDEwKSArIChjMiAtIDU2MzIwKTsKICAgICAgICAgICAgICBtX3BvcysrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBidWZfbGVuICs9IGMgPCAxMjggPyAxIDogYyA8IDIwNDggPyAyIDogYyA8IDY1NTM2ID8gMyA6IDQ7CiAgICAgICAgfQogICAgICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGJ1Zl9sZW4pOwogICAgICAgIGZvciAoaSA9IDAsIG1fcG9zID0gMDsgaSA8IGJ1Zl9sZW47IG1fcG9zKyspIHsKICAgICAgICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7CiAgICAgICAgICBpZiAoKGMgJiA2NDUxMikgPT09IDU1Mjk2ICYmIG1fcG9zICsgMSA8IHN0cl9sZW4pIHsKICAgICAgICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpOwogICAgICAgICAgICBpZiAoKGMyICYgNjQ1MTIpID09PSA1NjMyMCkgewogICAgICAgICAgICAgIGMgPSA2NTUzNiArIChjIC0gNTUyOTYgPDwgMTApICsgKGMyIC0gNTYzMjApOwogICAgICAgICAgICAgIG1fcG9zKys7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChjIDwgMTI4KSB7CiAgICAgICAgICAgIGJ1ZltpKytdID0gYzsKICAgICAgICAgIH0gZWxzZSBpZiAoYyA8IDIwNDgpIHsKICAgICAgICAgICAgYnVmW2krK10gPSAxOTIgfCBjID4+PiA2OwogICAgICAgICAgICBidWZbaSsrXSA9IDEyOCB8IGMgJiA2MzsKICAgICAgICAgIH0gZWxzZSBpZiAoYyA8IDY1NTM2KSB7CiAgICAgICAgICAgIGJ1ZltpKytdID0gMjI0IHwgYyA+Pj4gMTI7CiAgICAgICAgICAgIGJ1ZltpKytdID0gMTI4IHwgYyA+Pj4gNiAmIDYzOwogICAgICAgICAgICBidWZbaSsrXSA9IDEyOCB8IGMgJiA2MzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJ1ZltpKytdID0gMjQwIHwgYyA+Pj4gMTg7CiAgICAgICAgICAgIGJ1ZltpKytdID0gMTI4IHwgYyA+Pj4gMTIgJiA2MzsKICAgICAgICAgICAgYnVmW2krK10gPSAxMjggfCBjID4+PiA2ICYgNjM7CiAgICAgICAgICAgIGJ1ZltpKytdID0gMTI4IHwgYyAmIDYzOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmOwogICAgICB9OwogICAgICB2YXIgYnVmMmJpbnN0cmluZyA9IChidWYsIGxlbikgPT4gewogICAgICAgIGlmIChsZW4gPCA2NTUzNCkgewogICAgICAgICAgaWYgKGJ1Zi5zdWJhcnJheSAmJiBTVFJfQVBQTFlfVUlBX09LKSB7CiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGJ1Zi5sZW5ndGggPT09IGxlbiA/IGJ1ZiA6IGJ1Zi5zdWJhcnJheSgwLCBsZW4pKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IHJlc3VsdCA9ICIiOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIG1vZHVsZS5leHBvcnRzLmJ1ZjJzdHJpbmcgPSAoYnVmLCBtYXgzKSA9PiB7CiAgICAgICAgY29uc3QgbGVuID0gbWF4MyB8fCBidWYubGVuZ3RoOwogICAgICAgIGlmICh0eXBlb2YgVGV4dERlY29kZXIgPT09ICJmdW5jdGlvbiIgJiYgVGV4dERlY29kZXIucHJvdG90eXBlLmRlY29kZSkgewogICAgICAgICAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShidWYuc3ViYXJyYXkoMCwgbWF4MykpOwogICAgICAgIH0KICAgICAgICBsZXQgaSwgb3V0OwogICAgICAgIGNvbnN0IHV0ZjE2YnVmID0gbmV3IEFycmF5KGxlbiAqIDIpOwogICAgICAgIGZvciAob3V0ID0gMCwgaSA9IDA7IGkgPCBsZW47ICkgewogICAgICAgICAgbGV0IGMgPSBidWZbaSsrXTsKICAgICAgICAgIGlmIChjIDwgMTI4KSB7CiAgICAgICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGM7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgbGV0IGNfbGVuID0gX3V0ZjhsZW5bY107CiAgICAgICAgICBpZiAoY19sZW4gPiA0KSB7CiAgICAgICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDY1NTMzOwogICAgICAgICAgICBpICs9IGNfbGVuIC0gMTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjICY9IGNfbGVuID09PSAyID8gMzEgOiBjX2xlbiA9PT0gMyA/IDE1IDogNzsKICAgICAgICAgIHdoaWxlIChjX2xlbiA+IDEgJiYgaSA8IGxlbikgewogICAgICAgICAgICBjID0gYyA8PCA2IHwgYnVmW2krK10gJiA2MzsKICAgICAgICAgICAgY19sZW4tLTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjX2xlbiA+IDEpIHsKICAgICAgICAgICAgdXRmMTZidWZbb3V0KytdID0gNjU1MzM7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGMgPCA2NTUzNikgewogICAgICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSBjOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYyAtPSA2NTUzNjsKICAgICAgICAgICAgdXRmMTZidWZbb3V0KytdID0gNTUyOTYgfCBjID4+IDEwICYgMTAyMzsKICAgICAgICAgICAgdXRmMTZidWZbb3V0KytdID0gNTYzMjAgfCBjICYgMTAyMzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ1ZjJiaW5zdHJpbmcodXRmMTZidWYsIG91dCk7CiAgICAgIH07CiAgICAgIG1vZHVsZS5leHBvcnRzLnV0Zjhib3JkZXIgPSAoYnVmLCBtYXgzKSA9PiB7CiAgICAgICAgbWF4MyA9IG1heDMgfHwgYnVmLmxlbmd0aDsKICAgICAgICBpZiAobWF4MyA+IGJ1Zi5sZW5ndGgpIHsKICAgICAgICAgIG1heDMgPSBidWYubGVuZ3RoOwogICAgICAgIH0KICAgICAgICBsZXQgcG9zID0gbWF4MyAtIDE7CiAgICAgICAgd2hpbGUgKHBvcyA+PSAwICYmIChidWZbcG9zXSAmIDE5MikgPT09IDEyOCkgewogICAgICAgICAgcG9zLS07CiAgICAgICAgfQogICAgICAgIGlmIChwb3MgPCAwKSB7CiAgICAgICAgICByZXR1cm4gbWF4MzsKICAgICAgICB9CiAgICAgICAgaWYgKHBvcyA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIG1heDM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwb3MgKyBfdXRmOGxlbltidWZbcG9zXV0gPiBtYXgzID8gcG9zIDogbWF4MzsKICAgICAgfTsKICAgIH0KICB9KTsKCiAgLy8gbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvbWVzc2FnZXMuanMKICB2YXIgcmVxdWlyZV9tZXNzYWdlcyA9IF9fY29tbW9uSlMoewogICAgIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL21lc3NhZ2VzLmpzIihleHBvcnRzMiwgbW9kdWxlKSB7CiAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7CiAgICAgICAgMjogIm5lZWQgZGljdGlvbmFyeSIsCiAgICAgICAgLyogWl9ORUVEX0RJQ1QgICAgICAgMiAgKi8KICAgICAgICAxOiAic3RyZWFtIGVuZCIsCiAgICAgICAgLyogWl9TVFJFQU1fRU5EICAgICAgMSAgKi8KICAgICAgICAwOiAiIiwKICAgICAgICAvKiBaX09LICAgICAgICAgICAgICAwICAqLwogICAgICAgICItMSI6ICJmaWxlIGVycm9yIiwKICAgICAgICAvKiBaX0VSUk5PICAgICAgICAgKC0xKSAqLwogICAgICAgICItMiI6ICJzdHJlYW0gZXJyb3IiLAogICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovCiAgICAgICAgIi0zIjogImRhdGEgZXJyb3IiLAogICAgICAgIC8qIFpfREFUQV9FUlJPUiAgICAoLTMpICovCiAgICAgICAgIi00IjogImluc3VmZmljaWVudCBtZW1vcnkiLAogICAgICAgIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovCiAgICAgICAgIi01IjogImJ1ZmZlciBlcnJvciIsCiAgICAgICAgLyogWl9CVUZfRVJST1IgICAgICgtNSkgKi8KICAgICAgICAiLTYiOiAiaW5jb21wYXRpYmxlIHZlcnNpb24iCiAgICAgICAgLyogWl9WRVJTSU9OX0VSUk9SICgtNikgKi8KICAgICAgfTsKICAgIH0KICB9KTsKCiAgLy8gbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvenN0cmVhbS5qcwogIHZhciByZXF1aXJlX3pzdHJlYW0gPSBfX2NvbW1vbkpTKHsKICAgICJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi96c3RyZWFtLmpzIihleHBvcnRzMiwgbW9kdWxlKSB7CiAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgZnVuY3Rpb24gWlN0cmVhbSgpIHsKICAgICAgICB0aGlzLmlucHV0ID0gbnVsbDsKICAgICAgICB0aGlzLm5leHRfaW4gPSAwOwogICAgICAgIHRoaXMuYXZhaWxfaW4gPSAwOwogICAgICAgIHRoaXMudG90YWxfaW4gPSAwOwogICAgICAgIHRoaXMub3V0cHV0ID0gbnVsbDsKICAgICAgICB0aGlzLm5leHRfb3V0ID0gMDsKICAgICAgICB0aGlzLmF2YWlsX291dCA9IDA7CiAgICAgICAgdGhpcy50b3RhbF9vdXQgPSAwOwogICAgICAgIHRoaXMubXNnID0gIiI7CiAgICAgICAgdGhpcy5zdGF0ZSA9IG51bGw7CiAgICAgICAgdGhpcy5kYXRhX3R5cGUgPSAyOwogICAgICAgIHRoaXMuYWRsZXIgPSAwOwogICAgICB9CiAgICAgIG1vZHVsZS5leHBvcnRzID0gWlN0cmVhbTsKICAgIH0KICB9KTsKCiAgLy8gbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZ3poZWFkZXIuanMKICB2YXIgcmVxdWlyZV9nemhlYWRlciA9IF9fY29tbW9uSlMoewogICAgIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2d6aGVhZGVyLmpzIihleHBvcnRzMiwgbW9kdWxlKSB7CiAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgZnVuY3Rpb24gR1poZWFkZXIoKSB7CiAgICAgICAgdGhpcy50ZXh0ID0gMDsKICAgICAgICB0aGlzLnRpbWUgPSAwOwogICAgICAgIHRoaXMueGZsYWdzID0gMDsKICAgICAgICB0aGlzLm9zID0gMDsKICAgICAgICB0aGlzLmV4dHJhID0gbnVsbDsKICAgICAgICB0aGlzLmV4dHJhX2xlbiA9IDA7CiAgICAgICAgdGhpcy5uYW1lID0gIiI7CiAgICAgICAgdGhpcy5jb21tZW50ID0gIiI7CiAgICAgICAgdGhpcy5oY3JjID0gMDsKICAgICAgICB0aGlzLmRvbmUgPSBmYWxzZTsKICAgICAgfQogICAgICBtb2R1bGUuZXhwb3J0cyA9IEdaaGVhZGVyOwogICAgfQogIH0pOwoKICAvLyBub2RlX21vZHVsZXMvcGFrby9saWIvaW5mbGF0ZS5qcwogIHZhciByZXF1aXJlX2luZmxhdGUyID0gX19jb21tb25KUyh7CiAgICAibm9kZV9tb2R1bGVzL3Bha28vbGliL2luZmxhdGUuanMiKGV4cG9ydHMyLCBtb2R1bGUpIHsKICAgICAgInVzZSBzdHJpY3QiOwogICAgICB2YXIgemxpYl9pbmZsYXRlID0gcmVxdWlyZV9pbmZsYXRlKCk7CiAgICAgIHZhciB1dGlscyA9IHJlcXVpcmVfY29tbW9uKCk7CiAgICAgIHZhciBzdHJpbmdzID0gcmVxdWlyZV9zdHJpbmdzKCk7CiAgICAgIHZhciBtc2cgPSByZXF1aXJlX21lc3NhZ2VzKCk7CiAgICAgIHZhciBaU3RyZWFtID0gcmVxdWlyZV96c3RyZWFtKCk7CiAgICAgIHZhciBHWmhlYWRlciA9IHJlcXVpcmVfZ3poZWFkZXIoKTsKICAgICAgdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKICAgICAgdmFyIHsKICAgICAgICBaX05PX0ZMVVNILAogICAgICAgIFpfRklOSVNILAogICAgICAgIFpfT0ssCiAgICAgICAgWl9TVFJFQU1fRU5ELAogICAgICAgIFpfTkVFRF9ESUNULAogICAgICAgIFpfU1RSRUFNX0VSUk9SLAogICAgICAgIFpfREFUQV9FUlJPUiwKICAgICAgICBaX01FTV9FUlJPUgogICAgICB9ID0gcmVxdWlyZV9jb25zdGFudHMoKTsKICAgICAgZnVuY3Rpb24gSW5mbGF0ZShvcHRpb25zKSB7CiAgICAgICAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHsKICAgICAgICAgIGNodW5rU2l6ZTogMTAyNCAqIDY0LAogICAgICAgICAgd2luZG93Qml0czogMTUsCiAgICAgICAgICB0bzogIiIKICAgICAgICB9LCBvcHRpb25zIHx8IHt9KTsKICAgICAgICBjb25zdCBvcHQgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgaWYgKG9wdC5yYXcgJiYgb3B0LndpbmRvd0JpdHMgPj0gMCAmJiBvcHQud2luZG93Qml0cyA8IDE2KSB7CiAgICAgICAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0czsKICAgICAgICAgIGlmIChvcHQud2luZG93Qml0cyA9PT0gMCkgewogICAgICAgICAgICBvcHQud2luZG93Qml0cyA9IC0xNTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKG9wdC53aW5kb3dCaXRzID49IDAgJiYgb3B0LndpbmRvd0JpdHMgPCAxNiAmJiAhKG9wdGlvbnMgJiYgb3B0aW9ucy53aW5kb3dCaXRzKSkgewogICAgICAgICAgb3B0LndpbmRvd0JpdHMgKz0gMzI7CiAgICAgICAgfQogICAgICAgIGlmIChvcHQud2luZG93Qml0cyA+IDE1ICYmIG9wdC53aW5kb3dCaXRzIDwgNDgpIHsKICAgICAgICAgIGlmICgob3B0LndpbmRvd0JpdHMgJiAxNSkgPT09IDApIHsKICAgICAgICAgICAgb3B0LndpbmRvd0JpdHMgfD0gMTU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuZXJyID0gMDsKICAgICAgICB0aGlzLm1zZyA9ICIiOwogICAgICAgIHRoaXMuZW5kZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLmNodW5rcyA9IFtdOwogICAgICAgIHRoaXMuc3RybSA9IG5ldyBaU3RyZWFtKCk7CiAgICAgICAgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7CiAgICAgICAgbGV0IHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlSW5pdDIoCiAgICAgICAgICB0aGlzLnN0cm0sCiAgICAgICAgICBvcHQud2luZG93Qml0cwogICAgICAgICk7CiAgICAgICAgaWYgKHN0YXR1cyAhPT0gWl9PSykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5oZWFkZXIgPSBuZXcgR1poZWFkZXIoKTsKICAgICAgICB6bGliX2luZmxhdGUuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sIHRoaXMuaGVhZGVyKTsKICAgICAgICBpZiAob3B0LmRpY3Rpb25hcnkpIHsKICAgICAgICAgIGlmICh0eXBlb2Ygb3B0LmRpY3Rpb25hcnkgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIG9wdC5kaWN0aW9uYXJ5ID0gc3RyaW5ncy5zdHJpbmcyYnVmKG9wdC5kaWN0aW9uYXJ5KTsKICAgICAgICAgIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChvcHQuZGljdGlvbmFyeSkgPT09ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIpIHsKICAgICAgICAgICAgb3B0LmRpY3Rpb25hcnkgPSBuZXcgVWludDhBcnJheShvcHQuZGljdGlvbmFyeSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAob3B0LnJhdykgewogICAgICAgICAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBvcHQuZGljdGlvbmFyeSk7CiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IFpfT0spIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIEluZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihkYXRhLCBmbHVzaF9tb2RlKSB7CiAgICAgICAgY29uc3Qgc3RybSA9IHRoaXMuc3RybTsKICAgICAgICBjb25zdCBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplOwogICAgICAgIGNvbnN0IGRpY3Rpb25hcnkgPSB0aGlzLm9wdGlvbnMuZGljdGlvbmFyeTsKICAgICAgICBsZXQgc3RhdHVzLCBfZmx1c2hfbW9kZSwgbGFzdF9hdmFpbF9vdXQ7CiAgICAgICAgaWYgKHRoaXMuZW5kZWQpIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoZmx1c2hfbW9kZSA9PT0gfn5mbHVzaF9tb2RlKSBfZmx1c2hfbW9kZSA9IGZsdXNoX21vZGU7CiAgICAgICAgZWxzZSBfZmx1c2hfbW9kZSA9IGZsdXNoX21vZGUgPT09IHRydWUgPyBaX0ZJTklTSCA6IFpfTk9fRkxVU0g7CiAgICAgICAgaWYgKHRvU3RyaW5nLmNhbGwoZGF0YSkgPT09ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIpIHsKICAgICAgICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RybS5pbnB1dCA9IGRhdGE7CiAgICAgICAgfQogICAgICAgIHN0cm0ubmV4dF9pbiA9IDA7CiAgICAgICAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoOwogICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgICAgIHN0cm0ub3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkoY2h1bmtTaXplKTsKICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IDA7CiAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplOwogICAgICAgICAgfQogICAgICAgICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGUoc3RybSwgX2ZsdXNoX21vZGUpOwogICAgICAgICAgaWYgKHN0YXR1cyA9PT0gWl9ORUVEX0RJQ1QgJiYgZGljdGlvbmFyeSkgewogICAgICAgICAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSk7CiAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IFpfT0spIHsKICAgICAgICAgICAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZShzdHJtLCBfZmx1c2hfbW9kZSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBaX0RBVEFfRVJST1IpIHsKICAgICAgICAgICAgICBzdGF0dXMgPSBaX05FRURfRElDVDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgd2hpbGUgKHN0cm0uYXZhaWxfaW4gPiAwICYmIHN0YXR1cyA9PT0gWl9TVFJFQU1fRU5EICYmIHN0cm0uc3RhdGUud3JhcCA+IDAgJiYgZGF0YVtzdHJtLm5leHRfaW5dICE9PSAwKSB7CiAgICAgICAgICAgIHpsaWJfaW5mbGF0ZS5pbmZsYXRlUmVzZXQoc3RybSk7CiAgICAgICAgICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlKHN0cm0sIF9mbHVzaF9tb2RlKTsKICAgICAgICAgIH0KICAgICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7CiAgICAgICAgICAgIGNhc2UgWl9TVFJFQU1fRVJST1I6CiAgICAgICAgICAgIGNhc2UgWl9EQVRBX0VSUk9SOgogICAgICAgICAgICBjYXNlIFpfTkVFRF9ESUNUOgogICAgICAgICAgICBjYXNlIFpfTUVNX0VSUk9SOgogICAgICAgICAgICAgIHRoaXMub25FbmQoc3RhdHVzKTsKICAgICAgICAgICAgICB0aGlzLmVuZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBsYXN0X2F2YWlsX291dCA9IHN0cm0uYXZhaWxfb3V0OwogICAgICAgICAgaWYgKHN0cm0ubmV4dF9vdXQpIHsKICAgICAgICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IHN0YXR1cyA9PT0gWl9TVFJFQU1fRU5EKSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIGxldCBuZXh0X291dF91dGY4ID0gc3RyaW5ncy51dGY4Ym9yZGVyKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KTsKICAgICAgICAgICAgICAgIGxldCB0YWlsID0gc3RybS5uZXh0X291dCAtIG5leHRfb3V0X3V0Zjg7CiAgICAgICAgICAgICAgICBsZXQgdXRmOHN0ciA9IHN0cmluZ3MuYnVmMnN0cmluZyhzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCk7CiAgICAgICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gdGFpbDsKICAgICAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplIC0gdGFpbDsKICAgICAgICAgICAgICAgIGlmICh0YWlsKSBzdHJtLm91dHB1dC5zZXQoc3RybS5vdXRwdXQuc3ViYXJyYXkobmV4dF9vdXRfdXRmOCwgbmV4dF9vdXRfdXRmOCArIHRhaWwpLCAwKTsKICAgICAgICAgICAgICAgIHRoaXMub25EYXRhKHV0ZjhzdHIpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uRGF0YShzdHJtLm91dHB1dC5sZW5ndGggPT09IHN0cm0ubmV4dF9vdXQgPyBzdHJtLm91dHB1dCA6IHN0cm0ub3V0cHV0LnN1YmFycmF5KDAsIHN0cm0ubmV4dF9vdXQpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdGF0dXMgPT09IFpfT0sgJiYgbGFzdF9hdmFpbF9vdXQgPT09IDApIGNvbnRpbnVlOwogICAgICAgICAgaWYgKHN0YXR1cyA9PT0gWl9TVFJFQU1fRU5EKSB7CiAgICAgICAgICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlRW5kKHRoaXMuc3RybSk7CiAgICAgICAgICAgIHRoaXMub25FbmQoc3RhdHVzKTsKICAgICAgICAgICAgdGhpcy5lbmRlZCA9IHRydWU7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDApIGJyZWFrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfTsKICAgICAgSW5mbGF0ZS5wcm90b3R5cGUub25EYXRhID0gZnVuY3Rpb24oY2h1bmspIHsKICAgICAgICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTsKICAgICAgfTsKICAgICAgSW5mbGF0ZS5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbihzdGF0dXMpIHsKICAgICAgICBpZiAoc3RhdHVzID09PSBaX09LKSB7CiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAic3RyaW5nIikgewogICAgICAgICAgICB0aGlzLnJlc3VsdCA9IHRoaXMuY2h1bmtzLmpvaW4oIiIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5yZXN1bHQgPSB1dGlscy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5jaHVua3MgPSBbXTsKICAgICAgICB0aGlzLmVyciA9IHN0YXR1czsKICAgICAgICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpIHsKICAgICAgICBjb25zdCBpbmZsYXRvciA9IG5ldyBJbmZsYXRlKG9wdGlvbnMpOwogICAgICAgIGluZmxhdG9yLnB1c2goaW5wdXQpOwogICAgICAgIGlmIChpbmZsYXRvci5lcnIpIHRocm93IGluZmxhdG9yLm1zZyB8fCBtc2dbaW5mbGF0b3IuZXJyXTsKICAgICAgICByZXR1cm4gaW5mbGF0b3IucmVzdWx0OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGluZmxhdGVSYXcoaW5wdXQsIG9wdGlvbnMpIHsKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICBvcHRpb25zLnJhdyA9IHRydWU7CiAgICAgICAgcmV0dXJuIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpOwogICAgICB9CiAgICAgIG1vZHVsZS5leHBvcnRzLkluZmxhdGUgPSBJbmZsYXRlOwogICAgICBtb2R1bGUuZXhwb3J0cy5pbmZsYXRlID0gaW5mbGF0ZTsKICAgICAgbW9kdWxlLmV4cG9ydHMuaW5mbGF0ZVJhdyA9IGluZmxhdGVSYXc7CiAgICAgIG1vZHVsZS5leHBvcnRzLnVuZ3ppcCA9IGluZmxhdGU7CiAgICAgIG1vZHVsZS5leHBvcnRzLmNvbnN0YW50cyA9IHJlcXVpcmVfY29uc3RhbnRzKCk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9kZWNvZGVHb29nbGVFYXJ0aEVudGVycHJpc2VQYWNrZXQuanMKICB2YXIgZGVjb2RlR29vZ2xlRWFydGhFbnRlcnByaXNlUGFja2V0X2V4cG9ydHMgPSB7fTsKICBfX2V4cG9ydChkZWNvZGVHb29nbGVFYXJ0aEVudGVycHJpc2VQYWNrZXRfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gZGVjb2RlR29vZ2xlRWFydGhFbnRlcnByaXNlUGFja2V0X2RlZmF1bHQKICB9KTsKICBmdW5jdGlvbiBkZWNvZGVHb29nbGVFYXJ0aEVudGVycHJpc2VQYWNrZXQocGFyYW1ldGVycywgdHJhbnNmZXJhYmxlT2JqZWN0cykgewogICAgY29uc3QgdHlwZSA9IFR5cGVzLmZyb21TdHJpbmcocGFyYW1ldGVycy50eXBlKTsKICAgIGxldCBidWZmZXIgPSBwYXJhbWV0ZXJzLmJ1ZmZlcjsKICAgIGRlY29kZUdvb2dsZUVhcnRoRW50ZXJwcmlzZURhdGFfZGVmYXVsdChwYXJhbWV0ZXJzLmtleSwgYnVmZmVyKTsKICAgIGNvbnN0IHVuY29tcHJlc3NlZFRlcnJhaW4gPSB1bmNvbXByZXNzUGFja2V0KGJ1ZmZlcik7CiAgICBidWZmZXIgPSB1bmNvbXByZXNzZWRUZXJyYWluLmJ1ZmZlcjsKICAgIGNvbnN0IGxlbmd0aCA9IHVuY29tcHJlc3NlZFRlcnJhaW4ubGVuZ3RoOwogICAgc3dpdGNoICh0eXBlKSB7CiAgICAgIGNhc2UgVHlwZXMuTUVUQURBVEE6CiAgICAgICAgcmV0dXJuIHByb2Nlc3NNZXRhZGF0YShidWZmZXIsIGxlbmd0aCwgcGFyYW1ldGVycy5xdWFkS2V5KTsKICAgICAgY2FzZSBUeXBlcy5URVJSQUlOOgogICAgICAgIHJldHVybiBwcm9jZXNzVGVycmFpbihidWZmZXIsIGxlbmd0aCwgdHJhbnNmZXJhYmxlT2JqZWN0cyk7CiAgICAgIGNhc2UgVHlwZXMuREJST09UOgogICAgICAgIHRyYW5zZmVyYWJsZU9iamVjdHMucHVzaChidWZmZXIpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBidWZmZXIKICAgICAgICB9OwogICAgfQogIH0KICBmdW5jdGlvbiBwcm9jZXNzTWV0YWRhdGEoYnVmZmVyLCB0b3RhbFNpemUsIHF1YWRLZXkpIHsKICAgIGNvbnN0IGR2ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGNvbnN0IG1hZ2ljID0gZHYuZ2V0VWludDMyKG9mZnNldCwgdHJ1ZSk7CiAgICBvZmZzZXQgKz0gc2l6ZU9mVWludDMyMjsKICAgIGlmIChtYWdpYyAhPT0gcXRNYWdpYykgewogICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yX2RlZmF1bHQoIkludmFsaWQgbWFnaWMiKTsKICAgIH0KICAgIGNvbnN0IGRhdGFUeXBlSWQgPSBkdi5nZXRVaW50MzIob2Zmc2V0LCB0cnVlKTsKICAgIG9mZnNldCArPSBzaXplT2ZVaW50MzIyOwogICAgaWYgKGRhdGFUeXBlSWQgIT09IDEpIHsKICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcl9kZWZhdWx0KCJJbnZhbGlkIGRhdGEgdHlwZS4gTXVzdCBiZSAxIGZvciBRdWFkVHJlZVBhY2tldCIpOwogICAgfQogICAgY29uc3QgcXVhZFZlcnNpb24gPSBkdi5nZXRVaW50MzIob2Zmc2V0LCB0cnVlKTsKICAgIG9mZnNldCArPSBzaXplT2ZVaW50MzIyOwogICAgaWYgKHF1YWRWZXJzaW9uICE9PSAyKSB7CiAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3JfZGVmYXVsdCgKICAgICAgICAiSW52YWxpZCBRdWFkVHJlZVBhY2tldCB2ZXJzaW9uLiBPbmx5IHZlcnNpb24gMiBpcyBzdXBwb3J0ZWQuIgogICAgICApOwogICAgfQogICAgY29uc3QgbnVtSW5zdGFuY2VzID0gZHYuZ2V0SW50MzIob2Zmc2V0LCB0cnVlKTsKICAgIG9mZnNldCArPSBzaXplT2ZJbnQzMjI7CiAgICBjb25zdCBkYXRhSW5zdGFuY2VTaXplID0gZHYuZ2V0SW50MzIob2Zmc2V0LCB0cnVlKTsKICAgIG9mZnNldCArPSBzaXplT2ZJbnQzMjI7CiAgICBpZiAoZGF0YUluc3RhbmNlU2l6ZSAhPT0gMzIpIHsKICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcl9kZWZhdWx0KCJJbnZhbGlkIGluc3RhbmNlIHNpemUuIik7CiAgICB9CiAgICBjb25zdCBkYXRhQnVmZmVyT2Zmc2V0ID0gZHYuZ2V0SW50MzIob2Zmc2V0LCB0cnVlKTsKICAgIG9mZnNldCArPSBzaXplT2ZJbnQzMjI7CiAgICBjb25zdCBkYXRhQnVmZmVyU2l6ZSA9IGR2LmdldEludDMyKG9mZnNldCwgdHJ1ZSk7CiAgICBvZmZzZXQgKz0gc2l6ZU9mSW50MzIyOwogICAgY29uc3QgbWV0YUJ1ZmZlclNpemUgPSBkdi5nZXRJbnQzMihvZmZzZXQsIHRydWUpOwogICAgb2Zmc2V0ICs9IHNpemVPZkludDMyMjsKICAgIGlmIChkYXRhQnVmZmVyT2Zmc2V0ICE9PSBudW1JbnN0YW5jZXMgKiBkYXRhSW5zdGFuY2VTaXplICsgb2Zmc2V0KSB7CiAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3JfZGVmYXVsdCgiSW52YWxpZCBkYXRhQnVmZmVyT2Zmc2V0Iik7CiAgICB9CiAgICBpZiAoZGF0YUJ1ZmZlck9mZnNldCArIGRhdGFCdWZmZXJTaXplICsgbWV0YUJ1ZmZlclNpemUgIT09IHRvdGFsU2l6ZSkgewogICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yX2RlZmF1bHQoIkludmFsaWQgcGFja2V0IG9mZnNldHMiKTsKICAgIH0KICAgIGNvbnN0IGluc3RhbmNlcyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1JbnN0YW5jZXM7ICsraSkgewogICAgICBjb25zdCBiaXRmaWVsZCA9IGR2LmdldFVpbnQ4KG9mZnNldCk7CiAgICAgICsrb2Zmc2V0OwogICAgICArK29mZnNldDsKICAgICAgY29uc3QgY25vZGVWZXJzaW9uID0gZHYuZ2V0VWludDE2KG9mZnNldCwgdHJ1ZSk7CiAgICAgIG9mZnNldCArPSBzaXplT2ZVaW50MTYyOwogICAgICBjb25zdCBpbWFnZVZlcnNpb24gPSBkdi5nZXRVaW50MTYob2Zmc2V0LCB0cnVlKTsKICAgICAgb2Zmc2V0ICs9IHNpemVPZlVpbnQxNjI7CiAgICAgIGNvbnN0IHRlcnJhaW5WZXJzaW9uID0gZHYuZ2V0VWludDE2KG9mZnNldCwgdHJ1ZSk7CiAgICAgIG9mZnNldCArPSBzaXplT2ZVaW50MTYyOwogICAgICBvZmZzZXQgKz0gc2l6ZU9mVWludDE2MjsKICAgICAgb2Zmc2V0ICs9IHNpemVPZlVpbnQxNjI7CiAgICAgIG9mZnNldCArPSBzaXplT2ZJbnQzMjI7CiAgICAgIG9mZnNldCArPSBzaXplT2ZJbnQzMjI7CiAgICAgIG9mZnNldCArPSA4OwogICAgICBjb25zdCBpbWFnZVByb3ZpZGVyID0gZHYuZ2V0VWludDgob2Zmc2V0KyspOwogICAgICBjb25zdCB0ZXJyYWluUHJvdmlkZXIgPSBkdi5nZXRVaW50OChvZmZzZXQrKyk7CiAgICAgIG9mZnNldCArPSBzaXplT2ZVaW50MTYyOwogICAgICBpbnN0YW5jZXMucHVzaCgKICAgICAgICBuZXcgR29vZ2xlRWFydGhFbnRlcnByaXNlVGlsZUluZm9ybWF0aW9uX2RlZmF1bHQoCiAgICAgICAgICBiaXRmaWVsZCwKICAgICAgICAgIGNub2RlVmVyc2lvbiwKICAgICAgICAgIGltYWdlVmVyc2lvbiwKICAgICAgICAgIHRlcnJhaW5WZXJzaW9uLAogICAgICAgICAgaW1hZ2VQcm92aWRlciwKICAgICAgICAgIHRlcnJhaW5Qcm92aWRlcgogICAgICAgICkKICAgICAgKTsKICAgIH0KICAgIGNvbnN0IHRpbGVJbmZvID0gW107CiAgICBsZXQgaW5kZXggPSAwOwogICAgZnVuY3Rpb24gcG9wdWxhdGVUaWxlcyhwYXJlbnRLZXksIHBhcmVudCwgbGV2ZWwyKSB7CiAgICAgIGxldCBpc0xlYWYgPSBmYWxzZTsKICAgICAgaWYgKGxldmVsMiA9PT0gNCkgewogICAgICAgIGlmIChwYXJlbnQuaGFzU3VidHJlZSgpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlzTGVhZiA9IHRydWU7CiAgICAgIH0KICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICBjb25zdCBjaGlsZEtleSA9IHBhcmVudEtleSArIGkudG9TdHJpbmcoKTsKICAgICAgICBpZiAoaXNMZWFmKSB7CiAgICAgICAgICB0aWxlSW5mb1tjaGlsZEtleV0gPSBudWxsOwogICAgICAgIH0gZWxzZSBpZiAobGV2ZWwyIDwgNCkgewogICAgICAgICAgaWYgKCFwYXJlbnQuaGFzQ2hpbGQoaSkpIHsKICAgICAgICAgICAgdGlsZUluZm9bY2hpbGRLZXldID0gbnVsbDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gbnVtSW5zdGFuY2VzKSB7CiAgICAgICAgICAgICAgY29uc29sZS5sb2coIkluY29ycmVjdCBudW1iZXIgb2YgaW5zdGFuY2VzIik7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VzW2luZGV4KytdOwogICAgICAgICAgICB0aWxlSW5mb1tjaGlsZEtleV0gPSBpbnN0YW5jZTsKICAgICAgICAgICAgcG9wdWxhdGVUaWxlcyhjaGlsZEtleSwgaW5zdGFuY2UsIGxldmVsMiArIDEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgbGV0IGxldmVsID0gMDsKICAgIGNvbnN0IHJvb3QgPSBpbnN0YW5jZXNbaW5kZXgrK107CiAgICBpZiAocXVhZEtleSA9PT0gIiIpIHsKICAgICAgKytsZXZlbDsKICAgIH0gZWxzZSB7CiAgICAgIHRpbGVJbmZvW3F1YWRLZXldID0gcm9vdDsKICAgIH0KICAgIHBvcHVsYXRlVGlsZXMocXVhZEtleSwgcm9vdCwgbGV2ZWwpOwogICAgcmV0dXJuIHRpbGVJbmZvOwogIH0KICBmdW5jdGlvbiBwcm9jZXNzVGVycmFpbihidWZmZXIsIHRvdGFsU2l6ZSwgdHJhbnNmZXJhYmxlT2JqZWN0cykgewogICAgY29uc3QgZHYgPSBuZXcgRGF0YVZpZXcoYnVmZmVyKTsKICAgIGNvbnN0IGFkdmFuY2VNZXNoID0gZnVuY3Rpb24ocG9zKSB7CiAgICAgIGZvciAobGV0IHN1YiA9IDA7IHN1YiA8IG51bVN1Yk1lc2hlc1Blck1lc2g7ICsrc3ViKSB7CiAgICAgICAgY29uc3Qgc2l6ZSA9IGR2LmdldFVpbnQzMihwb3MsIHRydWUpOwogICAgICAgIHBvcyArPSBzaXplT2ZVaW50MzIyOwogICAgICAgIHBvcyArPSBzaXplOwogICAgICAgIGlmIChwb3MgPiB0b3RhbFNpemUpIHsKICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3JfZGVmYXVsdCgiTWFsZm9ybWVkIHRlcnJhaW4gcGFja2V0IGZvdW5kLiIpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcG9zOwogICAgfTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgY29uc3QgdGVycmFpbk1lc2hlcyA9IFtdOwogICAgd2hpbGUgKHRlcnJhaW5NZXNoZXMubGVuZ3RoIDwgbnVtTWVzaGVzUGVyUGFja2V0KSB7CiAgICAgIGNvbnN0IHN0YXJ0ID0gb2Zmc2V0OwogICAgICBvZmZzZXQgPSBhZHZhbmNlTWVzaChvZmZzZXQpOwogICAgICBjb25zdCBtZXNoID0gYnVmZmVyLnNsaWNlKHN0YXJ0LCBvZmZzZXQpOwogICAgICB0cmFuc2ZlcmFibGVPYmplY3RzLnB1c2gobWVzaCk7CiAgICAgIHRlcnJhaW5NZXNoZXMucHVzaChtZXNoKTsKICAgIH0KICAgIHJldHVybiB0ZXJyYWluTWVzaGVzOwogIH0KICBmdW5jdGlvbiB1bmNvbXByZXNzUGFja2V0KGRhdGEpIHsKICAgIGNvbnN0IGR2ID0gbmV3IERhdGFWaWV3KGRhdGEpOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBjb25zdCBtYWdpYyA9IGR2LmdldFVpbnQzMihvZmZzZXQsIHRydWUpOwogICAgb2Zmc2V0ICs9IHNpemVPZlVpbnQzMjI7CiAgICBpZiAobWFnaWMgIT09IGNvbXByZXNzZWRNYWdpYzIgJiYgbWFnaWMgIT09IGNvbXByZXNzZWRNYWdpY1N3YXAyKSB7CiAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3JfZGVmYXVsdCgiSW52YWxpZCBtYWdpYyIpOwogICAgfQogICAgY29uc3Qgc2l6ZSA9IGR2LmdldFVpbnQzMihvZmZzZXQsIG1hZ2ljID09PSBjb21wcmVzc2VkTWFnaWMyKTsKICAgIG9mZnNldCArPSBzaXplT2ZVaW50MzIyOwogICAgY29uc3QgY29tcHJlc3NlZFBhY2tldCA9IG5ldyBVaW50OEFycmF5KGRhdGEsIG9mZnNldCk7CiAgICBjb25zdCB1bmNvbXByZXNzZWRQYWNrZXQgPSBpbXBvcnRfaW5mbGF0ZS5kZWZhdWx0LmluZmxhdGUoY29tcHJlc3NlZFBhY2tldCk7CiAgICBpZiAodW5jb21wcmVzc2VkUGFja2V0Lmxlbmd0aCAhPT0gc2l6ZSkgewogICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yX2RlZmF1bHQoIlNpemUgb2YgcGFja2V0IGRvZXNuJ3QgbWF0Y2ggaGVhZGVyIik7CiAgICB9CiAgICByZXR1cm4gdW5jb21wcmVzc2VkUGFja2V0OwogIH0KICB2YXIgaW1wb3J0X2luZmxhdGUsIHNpemVPZlVpbnQxNjIsIHNpemVPZkludDMyMiwgc2l6ZU9mVWludDMyMiwgVHlwZXMsIHF0TWFnaWMsIG51bU1lc2hlc1BlclBhY2tldCwgbnVtU3ViTWVzaGVzUGVyTWVzaCwgY29tcHJlc3NlZE1hZ2ljMiwgY29tcHJlc3NlZE1hZ2ljU3dhcDIsIGRlY29kZUdvb2dsZUVhcnRoRW50ZXJwcmlzZVBhY2tldF9kZWZhdWx0OwogIHZhciBpbml0X2RlY29kZUdvb2dsZUVhcnRoRW50ZXJwcmlzZVBhY2tldCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvZGVjb2RlR29vZ2xlRWFydGhFbnRlcnByaXNlUGFja2V0LmpzIigpIHsKICAgICAgaW5pdF9kZWNvZGVHb29nbGVFYXJ0aEVudGVycHJpc2VEYXRhKCk7CiAgICAgIGluaXRfR29vZ2xlRWFydGhFbnRlcnByaXNlVGlsZUluZm9ybWF0aW9uKCk7CiAgICAgIGluaXRfUnVudGltZUVycm9yKCk7CiAgICAgIGltcG9ydF9pbmZsYXRlID0gX190b0VTTShyZXF1aXJlX2luZmxhdGUyKCksIDEpOwogICAgICBpbml0X2NyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXIoKTsKICAgICAgc2l6ZU9mVWludDE2MiA9IFVpbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOwogICAgICBzaXplT2ZJbnQzMjIgPSBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOwogICAgICBzaXplT2ZVaW50MzIyID0gVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7CiAgICAgIFR5cGVzID0gewogICAgICAgIE1FVEFEQVRBOiAwLAogICAgICAgIFRFUlJBSU46IDEsCiAgICAgICAgREJST09UOiAyCiAgICAgIH07CiAgICAgIFR5cGVzLmZyb21TdHJpbmcgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgaWYgKHMgPT09ICJNZXRhZGF0YSIpIHsKICAgICAgICAgIHJldHVybiBUeXBlcy5NRVRBREFUQTsKICAgICAgICB9IGVsc2UgaWYgKHMgPT09ICJUZXJyYWluIikgewogICAgICAgICAgcmV0dXJuIFR5cGVzLlRFUlJBSU47CiAgICAgICAgfSBlbHNlIGlmIChzID09PSAiRGJSb290IikgewogICAgICAgICAgcmV0dXJuIFR5cGVzLkRCUk9PVDsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHF0TWFnaWMgPSAzMjMwMTsKICAgICAgbnVtTWVzaGVzUGVyUGFja2V0ID0gNTsKICAgICAgbnVtU3ViTWVzaGVzUGVyTWVzaCA9IDQ7CiAgICAgIGNvbXByZXNzZWRNYWdpYzIgPSAxOTUzMDI5ODA1OwogICAgICBjb21wcmVzc2VkTWFnaWNTd2FwMiA9IDI5MTcwMzQxMDA7CiAgICAgIGRlY29kZUdvb2dsZUVhcnRoRW50ZXJwcmlzZVBhY2tldF9kZWZhdWx0ID0gY3JlYXRlVGFza1Byb2Nlc3Nvcldvcmtlcl9kZWZhdWx0KGRlY29kZUdvb2dsZUVhcnRoRW50ZXJwcmlzZVBhY2tldCk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9zcmdiVG9MaW5lYXIuanMKICBmdW5jdGlvbiBzcmdiVG9MaW5lYXIodmFsdWUpIHsKICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgidmFsdWUiLCB2YWx1ZSk7CiAgICBpZiAodmFsdWUgPD0gMC4wNDA0NSkgewogICAgICByZXR1cm4gdmFsdWUgKiAwLjA3NzM5OTM4MDgwNDk1MzU3OwogICAgfQogICAgcmV0dXJuIE1hdGgucG93KAogICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9zcy1vZi1wcmVjaXNpb24KICAgICAgKHZhbHVlICsgMC4wNTUpICogMC45NDc4NjcyOTg1NzgxOTkxLAogICAgICAyLjQKICAgICk7CiAgfQogIHZhciBzcmdiVG9MaW5lYXJfZGVmYXVsdDsKICB2YXIgaW5pdF9zcmdiVG9MaW5lYXIgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL3NyZ2JUb0xpbmVhci5qcyIoKSB7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgc3JnYlRvTGluZWFyX2RlZmF1bHQgPSBzcmdiVG9MaW5lYXI7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9kZWNvZGVJM1MuanMKICB2YXIgZGVjb2RlSTNTX2V4cG9ydHMgPSB7fTsKICBfX2V4cG9ydChkZWNvZGVJM1NfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gZGVjb2RlSTNTX2RlZmF1bHQKICB9KTsKICBmdW5jdGlvbiBiaWxpbmVhckludGVycG9sYXRlKHR4LCB0eSwgaDAwLCBoMTAsIGgwMSwgaDExKSB7CiAgICBjb25zdCBhMyA9IGgwMCAqICgxIC0gdHgpICsgaDEwICogdHg7CiAgICBjb25zdCBiID0gaDAxICogKDEgLSB0eCkgKyBoMTEgKiB0eDsKICAgIHJldHVybiBhMyAqICgxIC0gdHkpICsgYiAqIHR5OwogIH0KICBmdW5jdGlvbiBzYW1wbGVNYXAodTMsIHYzLCB3aWR0aCwgZGF0YSkgewogICAgY29uc3QgYWRkcmVzcyA9IHUzICsgdjMgKiB3aWR0aDsKICAgIHJldHVybiBkYXRhW2FkZHJlc3NdOwogIH0KICBmdW5jdGlvbiBzYW1wbGVHZW9pZChzYW1wbGVYLCBzYW1wbGVZLCBnZW9pZERhdGEpIHsKICAgIGNvbnN0IGV4dGVudCA9IGdlb2lkRGF0YS5uYXRpdmVFeHRlbnQ7CiAgICBsZXQgeCA9IChzYW1wbGVYIC0gZXh0ZW50Lndlc3QpIC8gKGV4dGVudC5lYXN0IC0gZXh0ZW50Lndlc3QpICogKGdlb2lkRGF0YS53aWR0aCAtIDEpOwogICAgbGV0IHkgPSAoc2FtcGxlWSAtIGV4dGVudC5zb3V0aCkgLyAoZXh0ZW50Lm5vcnRoIC0gZXh0ZW50LnNvdXRoKSAqIChnZW9pZERhdGEuaGVpZ2h0IC0gMSk7CiAgICBjb25zdCB4aSA9IE1hdGguZmxvb3IoeCk7CiAgICBsZXQgeWkgPSBNYXRoLmZsb29yKHkpOwogICAgeCAtPSB4aTsKICAgIHkgLT0geWk7CiAgICBjb25zdCB4TmV4dCA9IHhpIDwgZ2VvaWREYXRhLndpZHRoID8geGkgKyAxIDogeGk7CiAgICBsZXQgeU5leHQgPSB5aSA8IGdlb2lkRGF0YS5oZWlnaHQgPyB5aSArIDEgOiB5aTsKICAgIHlpID0gZ2VvaWREYXRhLmhlaWdodCAtIDEgLSB5aTsKICAgIHlOZXh0ID0gZ2VvaWREYXRhLmhlaWdodCAtIDEgLSB5TmV4dDsKICAgIGNvbnN0IGgwMCA9IHNhbXBsZU1hcCh4aSwgeWksIGdlb2lkRGF0YS53aWR0aCwgZ2VvaWREYXRhLmJ1ZmZlcik7CiAgICBjb25zdCBoMTAgPSBzYW1wbGVNYXAoeE5leHQsIHlpLCBnZW9pZERhdGEud2lkdGgsIGdlb2lkRGF0YS5idWZmZXIpOwogICAgY29uc3QgaDAxID0gc2FtcGxlTWFwKHhpLCB5TmV4dCwgZ2VvaWREYXRhLndpZHRoLCBnZW9pZERhdGEuYnVmZmVyKTsKICAgIGNvbnN0IGgxMSA9IHNhbXBsZU1hcCh4TmV4dCwgeU5leHQsIGdlb2lkRGF0YS53aWR0aCwgZ2VvaWREYXRhLmJ1ZmZlcik7CiAgICBsZXQgZmluYWxIZWlnaHQgPSBiaWxpbmVhckludGVycG9sYXRlKHgsIHksIGgwMCwgaDEwLCBoMDEsIGgxMSk7CiAgICBmaW5hbEhlaWdodCA9IGZpbmFsSGVpZ2h0ICogZ2VvaWREYXRhLnNjYWxlICsgZ2VvaWREYXRhLm9mZnNldDsKICAgIHJldHVybiBmaW5hbEhlaWdodDsKICB9CiAgZnVuY3Rpb24gc2FtcGxlR2VvaWRGcm9tTGlzdChsb24sIGxhdCwgZ2VvaWREYXRhTGlzdCkgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnZW9pZERhdGFMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IGxvY2FsRXh0ZW50ID0gZ2VvaWREYXRhTGlzdFtpXS5uYXRpdmVFeHRlbnQ7CiAgICAgIGxldCBsb2NhbFB0ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBpZiAoZ2VvaWREYXRhTGlzdFtpXS5wcm9qZWN0aW9uVHlwZSA9PT0gIldlYk1lcmNhdG9yIikgewogICAgICAgIGNvbnN0IHJhZGlpID0gZ2VvaWREYXRhTGlzdFtpXS5wcm9qZWN0aW9uLl9lbGxpcHNvaWQuX3JhZGlpOwogICAgICAgIGNvbnN0IHdlYk1lcmNhdG9yUHJvaiA9IG5ldyBXZWJNZXJjYXRvclByb2plY3Rpb25fZGVmYXVsdCgKICAgICAgICAgIG5ldyBFbGxpcHNvaWRfZGVmYXVsdChyYWRpaS54LCByYWRpaS55LCByYWRpaS56KQogICAgICAgICk7CiAgICAgICAgbG9jYWxQdCA9IHdlYk1lcmNhdG9yUHJvai5wcm9qZWN0KG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdChsb24sIGxhdCwgMCkpOwogICAgICB9IGVsc2UgewogICAgICAgIGxvY2FsUHQueCA9IGxvbjsKICAgICAgICBsb2NhbFB0LnkgPSBsYXQ7CiAgICAgIH0KICAgICAgaWYgKGxvY2FsUHQueCA+IGxvY2FsRXh0ZW50Lndlc3QgJiYgbG9jYWxQdC54IDwgbG9jYWxFeHRlbnQuZWFzdCAmJiBsb2NhbFB0LnkgPiBsb2NhbEV4dGVudC5zb3V0aCAmJiBsb2NhbFB0LnkgPCBsb2NhbEV4dGVudC5ub3J0aCkgewogICAgICAgIHJldHVybiBzYW1wbGVHZW9pZChsb2NhbFB0LngsIGxvY2FsUHQueSwgZ2VvaWREYXRhTGlzdFtpXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwogIH0KICBmdW5jdGlvbiBvcnRob21ldHJpY1RvRWxsaXBzb2lkYWwodmVydGV4Q291bnQsIHBvc2l0aW9uLCBzY2FsZV94LCBzY2FsZV95LCBjZW50ZXIsIGdlb2lkRGF0YUxpc3QsIGZhc3QpIHsKICAgIGlmIChmYXN0KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGNlbnRlckhlaWdodCA9IHNhbXBsZUdlb2lkRnJvbUxpc3QoCiAgICAgIGNlbnRlci5sb25naXR1ZGUsCiAgICAgIGNlbnRlci5sYXRpdHVkZSwKICAgICAgZ2VvaWREYXRhTGlzdAogICAgKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7ICsraSkgewogICAgICBjb25zdCBoZWlnaHQgPSBzYW1wbGVHZW9pZEZyb21MaXN0KAogICAgICAgIGNlbnRlci5sb25naXR1ZGUgKyBNYXRoX2RlZmF1bHQudG9SYWRpYW5zKHNjYWxlX3ggKiBwb3NpdGlvbltpICogM10pLAogICAgICAgIGNlbnRlci5sYXRpdHVkZSArIE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoc2NhbGVfeSAqIHBvc2l0aW9uW2kgKiAzICsgMV0pLAogICAgICAgIGdlb2lkRGF0YUxpc3QKICAgICAgKTsKICAgICAgcG9zaXRpb25baSAqIDMgKyAyXSArPSBoZWlnaHQgLSBjZW50ZXJIZWlnaHQ7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHRyYW5zZm9ybVRvTG9jYWwodmVydGV4Q291bnQsIHBvc2l0aW9ucywgbm9ybWFscywgY2FydG9ncmFwaGljQ2VudGVyLCBjYXJ0ZXNpYW5DZW50ZXIsIHBhcmVudFJvdGF0aW9uLCBlbGxpcHNvaWRSYWRpaVNxdWFyZSwgc2NhbGVfeCwgc2NhbGVfeSkgewogICAgaWYgKHZlcnRleENvdW50ID09PSAwIHx8ICFkZWZpbmVkX2RlZmF1bHQocG9zaXRpb25zKSB8fCBwb3NpdGlvbnMubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGVsbGlwc29pZCA9IG5ldyBFbGxpcHNvaWRfZGVmYXVsdCgKICAgICAgTWF0aC5zcXJ0KGVsbGlwc29pZFJhZGlpU3F1YXJlLngpLAogICAgICBNYXRoLnNxcnQoZWxsaXBzb2lkUmFkaWlTcXVhcmUueSksCiAgICAgIE1hdGguc3FydChlbGxpcHNvaWRSYWRpaVNxdWFyZS56KQogICAgKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7ICsraSkgewogICAgICBjb25zdCBpbmRleE9mZnNldCA9IGkgKiAzOwogICAgICBjb25zdCBpbmRleE9mZnNldDEgPSBpbmRleE9mZnNldCArIDE7CiAgICAgIGNvbnN0IGluZGV4T2Zmc2V0MiA9IGluZGV4T2Zmc2V0ICsgMjsKICAgICAgY29uc3QgY2FydG9ncmFwaGljMiA9IG5ldyBDYXJ0b2dyYXBoaWNfZGVmYXVsdCgpOwogICAgICBjYXJ0b2dyYXBoaWMyLmxvbmdpdHVkZSA9IGNhcnRvZ3JhcGhpY0NlbnRlci5sb25naXR1ZGUgKyBNYXRoX2RlZmF1bHQudG9SYWRpYW5zKHNjYWxlX3ggKiBwb3NpdGlvbnNbaW5kZXhPZmZzZXRdKTsKICAgICAgY2FydG9ncmFwaGljMi5sYXRpdHVkZSA9IGNhcnRvZ3JhcGhpY0NlbnRlci5sYXRpdHVkZSArIE1hdGhfZGVmYXVsdC50b1JhZGlhbnMoc2NhbGVfeSAqIHBvc2l0aW9uc1tpbmRleE9mZnNldDFdKTsKICAgICAgY2FydG9ncmFwaGljMi5oZWlnaHQgPSBjYXJ0b2dyYXBoaWNDZW50ZXIuaGVpZ2h0ICsgcG9zaXRpb25zW2luZGV4T2Zmc2V0Ml07CiAgICAgIGNvbnN0IHBvc2l0aW9uID0ge307CiAgICAgIGVsbGlwc29pZC5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihjYXJ0b2dyYXBoaWMyLCBwb3NpdGlvbik7CiAgICAgIHBvc2l0aW9uLnggLT0gY2FydGVzaWFuQ2VudGVyLng7CiAgICAgIHBvc2l0aW9uLnkgLT0gY2FydGVzaWFuQ2VudGVyLnk7CiAgICAgIHBvc2l0aW9uLnogLT0gY2FydGVzaWFuQ2VudGVyLno7CiAgICAgIGNvbnN0IHJvdGF0ZWRQb3NpdGlvbiA9IHt9OwogICAgICBNYXRyaXgzX2RlZmF1bHQubXVsdGlwbHlCeVZlY3RvcihwYXJlbnRSb3RhdGlvbiwgcG9zaXRpb24sIHJvdGF0ZWRQb3NpdGlvbik7CiAgICAgIHBvc2l0aW9uc1tpbmRleE9mZnNldF0gPSByb3RhdGVkUG9zaXRpb24ueDsKICAgICAgcG9zaXRpb25zW2luZGV4T2Zmc2V0MV0gPSByb3RhdGVkUG9zaXRpb24ueTsKICAgICAgcG9zaXRpb25zW2luZGV4T2Zmc2V0Ml0gPSByb3RhdGVkUG9zaXRpb24uejsKICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChub3JtYWxzKSkgewogICAgICAgIGNvbnN0IG5vcm1hbDIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KAogICAgICAgICAgbm9ybWFsc1tpbmRleE9mZnNldF0sCiAgICAgICAgICBub3JtYWxzW2luZGV4T2Zmc2V0MV0sCiAgICAgICAgICBub3JtYWxzW2luZGV4T2Zmc2V0Ml0KICAgICAgICApOwogICAgICAgIGNvbnN0IHJvdGF0ZWROb3JtYWwgPSB7fTsKICAgICAgICBNYXRyaXgzX2RlZmF1bHQubXVsdGlwbHlCeVZlY3RvcihwYXJlbnRSb3RhdGlvbiwgbm9ybWFsMiwgcm90YXRlZE5vcm1hbCk7CiAgICAgICAgbm9ybWFsc1tpbmRleE9mZnNldF0gPSByb3RhdGVkTm9ybWFsLng7CiAgICAgICAgbm9ybWFsc1tpbmRleE9mZnNldDFdID0gcm90YXRlZE5vcm1hbC55OwogICAgICAgIG5vcm1hbHNbaW5kZXhPZmZzZXQyXSA9IHJvdGF0ZWROb3JtYWwuejsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBjcm9wVVZzKHZlcnRleENvdW50LCB1djBzLCB1dlJlZ2lvbnMpIHsKICAgIGZvciAobGV0IHZlcnRleEluZGV4ID0gMDsgdmVydGV4SW5kZXggPCB2ZXJ0ZXhDb3VudDsgKyt2ZXJ0ZXhJbmRleCkgewogICAgICBjb25zdCBtaW5VID0gdXZSZWdpb25zW3ZlcnRleEluZGV4ICogNF0gLyA2NTUzNTsKICAgICAgY29uc3QgbWluViA9IHV2UmVnaW9uc1t2ZXJ0ZXhJbmRleCAqIDQgKyAxXSAvIDY1NTM1OwogICAgICBjb25zdCBzY2FsZVUgPSAodXZSZWdpb25zW3ZlcnRleEluZGV4ICogNCArIDJdIC0gdXZSZWdpb25zW3ZlcnRleEluZGV4ICogNF0pIC8gNjU1MzU7CiAgICAgIGNvbnN0IHNjYWxlViA9ICh1dlJlZ2lvbnNbdmVydGV4SW5kZXggKiA0ICsgM10gLSB1dlJlZ2lvbnNbdmVydGV4SW5kZXggKiA0ICsgMV0pIC8gNjU1MzU7CiAgICAgIHV2MHNbdmVydGV4SW5kZXggKiAyXSAqPSBzY2FsZVU7CiAgICAgIHV2MHNbdmVydGV4SW5kZXggKiAyXSArPSBtaW5VOwogICAgICB1djBzW3ZlcnRleEluZGV4ICogMiArIDFdICo9IHNjYWxlVjsKICAgICAgdXYwc1t2ZXJ0ZXhJbmRleCAqIDIgKyAxXSArPSBtaW5WOwogICAgfQogIH0KICBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4QXJyYXkodmVydGV4Q291bnQsIGluZGljZXMsIGNvbG9ycywgc3BsaXRHZW9tZXRyeUJ5Q29sb3JUcmFuc3BhcmVuY3kpIHsKICAgIGNvbnN0IGluZGV4QXJyYXkgPSBuZXcgVWludDMyQXJyYXkodmVydGV4Q291bnQpOwogICAgY29uc3QgdmVydGV4SW5kZXhGbiA9IGRlZmluZWRfZGVmYXVsdChpbmRpY2VzKSA/ICh2ZXJ0ZXhJbmRleCkgPT4gaW5kaWNlc1t2ZXJ0ZXhJbmRleF0gOiAodmVydGV4SW5kZXgpID0+IHZlcnRleEluZGV4OwogICAgbGV0IHRyYW5zcGFyZW50VmVydGV4T2Zmc2V0ID0gMDsKICAgIGlmIChzcGxpdEdlb21ldHJ5QnlDb2xvclRyYW5zcGFyZW5jeSAmJiBkZWZpbmVkX2RlZmF1bHQoY29sb3JzKSkgewogICAgICBjb25zdCBpc1ZlcnRleFRyYW5zcGFyZW50Rm4gPSAodmVydGV4SW5kZXgpID0+IGNvbG9yc1t2ZXJ0ZXhJbmRleEZuKHZlcnRleEluZGV4KSAqIDQgKyAzXSA8IDI1NTsKICAgICAgZm9yIChsZXQgdmVydGV4SW5kZXggPSAwOyB2ZXJ0ZXhJbmRleCA8IHZlcnRleENvdW50OyB2ZXJ0ZXhJbmRleCArPSAzKSB7CiAgICAgICAgaWYgKCFpc1ZlcnRleFRyYW5zcGFyZW50Rm4odmVydGV4SW5kZXgpICYmICFpc1ZlcnRleFRyYW5zcGFyZW50Rm4odmVydGV4SW5kZXggKyAxKSAmJiAhaXNWZXJ0ZXhUcmFuc3BhcmVudEZuKHZlcnRleEluZGV4ICsgMikpIHsKICAgICAgICAgIGluZGV4QXJyYXlbdHJhbnNwYXJlbnRWZXJ0ZXhPZmZzZXQrK10gPSB2ZXJ0ZXhJbmRleEZuKHZlcnRleEluZGV4KTsKICAgICAgICAgIGluZGV4QXJyYXlbdHJhbnNwYXJlbnRWZXJ0ZXhPZmZzZXQrK10gPSB2ZXJ0ZXhJbmRleEZuKHZlcnRleEluZGV4ICsgMSk7CiAgICAgICAgICBpbmRleEFycmF5W3RyYW5zcGFyZW50VmVydGV4T2Zmc2V0KytdID0gdmVydGV4SW5kZXhGbih2ZXJ0ZXhJbmRleCArIDIpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodHJhbnNwYXJlbnRWZXJ0ZXhPZmZzZXQgPiAwKSB7CiAgICAgICAgbGV0IG9mZnNldCA9IHRyYW5zcGFyZW50VmVydGV4T2Zmc2V0OwogICAgICAgIGZvciAobGV0IHZlcnRleEluZGV4ID0gMDsgdmVydGV4SW5kZXggPCB2ZXJ0ZXhDb3VudDsgdmVydGV4SW5kZXggKz0gMykgewogICAgICAgICAgaWYgKGlzVmVydGV4VHJhbnNwYXJlbnRGbih2ZXJ0ZXhJbmRleCkgfHwgaXNWZXJ0ZXhUcmFuc3BhcmVudEZuKHZlcnRleEluZGV4ICsgMSkgfHwgaXNWZXJ0ZXhUcmFuc3BhcmVudEZuKHZlcnRleEluZGV4ICsgMikpIHsKICAgICAgICAgICAgaW5kZXhBcnJheVtvZmZzZXQrK10gPSB2ZXJ0ZXhJbmRleEZuKHZlcnRleEluZGV4KTsKICAgICAgICAgICAgaW5kZXhBcnJheVtvZmZzZXQrK10gPSB2ZXJ0ZXhJbmRleEZuKHZlcnRleEluZGV4ICsgMSk7CiAgICAgICAgICAgIGluZGV4QXJyYXlbb2Zmc2V0KytdID0gdmVydGV4SW5kZXhGbih2ZXJ0ZXhJbmRleCArIDIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKGxldCB2ZXJ0ZXhJbmRleCA9IDA7IHZlcnRleEluZGV4IDwgdmVydGV4Q291bnQ7ICsrdmVydGV4SW5kZXgpIHsKICAgICAgICAgIGluZGV4QXJyYXlbdmVydGV4SW5kZXhdID0gdmVydGV4SW5kZXhGbih2ZXJ0ZXhJbmRleCk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0cmFuc3BhcmVudFZlcnRleE9mZnNldCA9IHZlcnRleENvdW50OwogICAgICBmb3IgKGxldCB2ZXJ0ZXhJbmRleCA9IDA7IHZlcnRleEluZGV4IDwgdmVydGV4Q291bnQ7ICsrdmVydGV4SW5kZXgpIHsKICAgICAgICBpbmRleEFycmF5W3ZlcnRleEluZGV4XSA9IHZlcnRleEluZGV4Rm4odmVydGV4SW5kZXgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gewogICAgICBpbmRleEFycmF5LAogICAgICB0cmFuc3BhcmVudFZlcnRleE9mZnNldAogICAgfTsKICB9CiAgZnVuY3Rpb24gZ2V0RmVhdHVyZUhhc2goc3ltYm9sb2d5RGF0YSwgb3V0bGluZXNIYXNoLCBmZWF0dXJlSW5kZXgpIHsKICAgIGNvbnN0IGZlYXR1cmVIYXNoID0gb3V0bGluZXNIYXNoW2ZlYXR1cmVJbmRleF07CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGZlYXR1cmVIYXNoKSkgewogICAgICByZXR1cm4gZmVhdHVyZUhhc2g7CiAgICB9CiAgICBjb25zdCBuZXdGZWF0dXJlSGFzaCA9IG91dGxpbmVzSGFzaFtmZWF0dXJlSW5kZXhdID0gewogICAgICBwb3NpdGlvbnM6IHt9LAogICAgICBpbmRpY2VzOiB7fSwKICAgICAgZWRnZXM6IHt9CiAgICB9OwogICAgY29uc3QgZmVhdHVyZVN5bWJvbG9neSA9IHN5bWJvbG9neURhdGFbZmVhdHVyZUluZGV4XSA/PyBzeW1ib2xvZ3lEYXRhLmRlZmF1bHQ7CiAgICBuZXdGZWF0dXJlSGFzaC5oYXNPdXRsaW5lID0gZGVmaW5lZF9kZWZhdWx0KGZlYXR1cmVTeW1ib2xvZ3k/LmVkZ2VzKTsKICAgIHJldHVybiBuZXdGZWF0dXJlSGFzaDsKICB9CiAgZnVuY3Rpb24gYWRkVmVydGV4VG9IYXNoKGluZGV4SGFzaCwgcG9zaXRpb25IYXNoLCB2ZXJ0ZXhJbmRleCwgcG9zaXRpb25zKSB7CiAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChpbmRleEhhc2hbdmVydGV4SW5kZXhdKSkgewogICAgICBjb25zdCBzdGFydFBvc2l0aW9uSW5kZXggPSB2ZXJ0ZXhJbmRleCAqIDM7CiAgICAgIGxldCBjb29yZGluYXRlSGFzaCA9IHBvc2l0aW9uSGFzaDsKICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDM7IGluZGV4KyspIHsKICAgICAgICBjb25zdCBjb29yZGluYXRlID0gcG9zaXRpb25zW3N0YXJ0UG9zaXRpb25JbmRleCArIGluZGV4XTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChjb29yZGluYXRlSGFzaFtjb29yZGluYXRlXSkpIHsKICAgICAgICAgIGNvb3JkaW5hdGVIYXNoW2Nvb3JkaW5hdGVdID0ge307CiAgICAgICAgfQogICAgICAgIGNvb3JkaW5hdGVIYXNoID0gY29vcmRpbmF0ZUhhc2hbY29vcmRpbmF0ZV07CiAgICAgIH0KICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoY29vcmRpbmF0ZUhhc2guaW5kZXgpKSB7CiAgICAgICAgY29vcmRpbmF0ZUhhc2guaW5kZXggPSB2ZXJ0ZXhJbmRleDsKICAgICAgfQogICAgICBpbmRleEhhc2hbdmVydGV4SW5kZXhdID0gY29vcmRpbmF0ZUhhc2guaW5kZXg7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGFkZEVkZ2VUb0hhc2goZWRnZUhhc2gsIHZlcnRleEFJbmRleCwgdmVydGV4QkluZGV4LCB2ZXJ0ZXhBSW5kZXhVbmlxdWUsIHZlcnRleEJJbmRleFVuaXF1ZSwgbm9ybWFsSW5kZXgpIHsKICAgIGxldCBzdGFydFZlcnRleEluZGV4OwogICAgbGV0IGVuZFZlcnRleEluZGV4OwogICAgaWYgKHZlcnRleEFJbmRleFVuaXF1ZSA8IHZlcnRleEJJbmRleFVuaXF1ZSkgewogICAgICBzdGFydFZlcnRleEluZGV4ID0gdmVydGV4QUluZGV4VW5pcXVlOwogICAgICBlbmRWZXJ0ZXhJbmRleCA9IHZlcnRleEJJbmRleFVuaXF1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHN0YXJ0VmVydGV4SW5kZXggPSB2ZXJ0ZXhCSW5kZXhVbmlxdWU7CiAgICAgIGVuZFZlcnRleEluZGV4ID0gdmVydGV4QUluZGV4VW5pcXVlOwogICAgfQogICAgbGV0IGVkZ2VTdGFydCA9IGVkZ2VIYXNoW3N0YXJ0VmVydGV4SW5kZXhdOwogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZWRnZVN0YXJ0KSkgewogICAgICBlZGdlU3RhcnQgPSBlZGdlSGFzaFtzdGFydFZlcnRleEluZGV4XSA9IHt9OwogICAgfQogICAgbGV0IGVkZ2VFbmQgPSBlZGdlU3RhcnRbZW5kVmVydGV4SW5kZXhdOwogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZWRnZUVuZCkpIHsKICAgICAgZWRnZUVuZCA9IGVkZ2VTdGFydFtlbmRWZXJ0ZXhJbmRleF0gPSB7CiAgICAgICAgbm9ybWFsc0luZGV4OiBbXSwKICAgICAgICBvdXRsaW5lczogW10KICAgICAgfTsKICAgIH0KICAgIGVkZ2VFbmQubm9ybWFsc0luZGV4LnB1c2gobm9ybWFsSW5kZXgpOwogICAgaWYgKGVkZ2VFbmQub3V0bGluZXMubGVuZ3RoID09PSAwIHx8IHZlcnRleEFJbmRleCAhPT0gdmVydGV4QUluZGV4VW5pcXVlIHx8IHZlcnRleEJJbmRleCAhPT0gdmVydGV4QkluZGV4VW5pcXVlKSB7CiAgICAgIGVkZ2VFbmQub3V0bGluZXMucHVzaCh2ZXJ0ZXhBSW5kZXgsIHZlcnRleEJJbmRleCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGdlbmVyYXRlT3V0bGluZXNIYXNoKHN5bWJvbG9neURhdGEsIGZlYXR1cmVJbmRleEFycmF5LCBpbmRleEFycmF5LCBwb3NpdGlvbnMpIHsKICAgIGNvbnN0IG91dGxpbmVzSGFzaCA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRleEFycmF5Lmxlbmd0aDsgaSArPSAzKSB7CiAgICAgIGNvbnN0IGZlYXR1cmVJbmRleCA9IGRlZmluZWRfZGVmYXVsdChmZWF0dXJlSW5kZXhBcnJheSkgPyBmZWF0dXJlSW5kZXhBcnJheVtpbmRleEFycmF5W2ldXSA6ICJkZWZhdWx0IjsKICAgICAgY29uc3QgZmVhdHVyZUhhc2ggPSBnZXRGZWF0dXJlSGFzaCgKICAgICAgICBzeW1ib2xvZ3lEYXRhLAogICAgICAgIG91dGxpbmVzSGFzaCwKICAgICAgICBmZWF0dXJlSW5kZXgKICAgICAgKTsKICAgICAgaWYgKCFmZWF0dXJlSGFzaC5oYXNPdXRsaW5lKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgaW5kZXhIYXNoID0gZmVhdHVyZUhhc2guaW5kaWNlczsKICAgICAgY29uc3QgcG9zaXRpb25IYXNoID0gZmVhdHVyZUhhc2gucG9zaXRpb25zOwogICAgICBmb3IgKGxldCB2ZXJ0ZXggPSAwOyB2ZXJ0ZXggPCAzOyB2ZXJ0ZXgrKykgewogICAgICAgIGNvbnN0IHZlcnRleEluZGV4ID0gaW5kZXhBcnJheVtpICsgdmVydGV4XTsKICAgICAgICBhZGRWZXJ0ZXhUb0hhc2goaW5kZXhIYXNoLCBwb3NpdGlvbkhhc2gsIHZlcnRleEluZGV4LCBwb3NpdGlvbnMpOwogICAgICB9CiAgICAgIGNvbnN0IGVkZ2VIYXNoID0gZmVhdHVyZUhhc2guZWRnZXM7CiAgICAgIGZvciAobGV0IHZlcnRleCA9IDA7IHZlcnRleCA8IDM7IHZlcnRleCsrKSB7CiAgICAgICAgY29uc3QgdmVydGV4SW5kZXggPSBpbmRleEFycmF5W2kgKyB2ZXJ0ZXhdOwogICAgICAgIGNvbnN0IG5leHRWZXJ0ZXhJbmRleCA9IGluZGV4QXJyYXlbaSArICh2ZXJ0ZXggKyAxKSAlIDNdOwogICAgICAgIGNvbnN0IHVuaXF1ZVZlcnRleEluZGV4ID0gaW5kZXhIYXNoW3ZlcnRleEluZGV4XTsKICAgICAgICBjb25zdCB1bmlxdWVOZXh0VmVydGV4SW5kZXggPSBpbmRleEhhc2hbbmV4dFZlcnRleEluZGV4XTsKICAgICAgICBhZGRFZGdlVG9IYXNoKAogICAgICAgICAgZWRnZUhhc2gsCiAgICAgICAgICB2ZXJ0ZXhJbmRleCwKICAgICAgICAgIG5leHRWZXJ0ZXhJbmRleCwKICAgICAgICAgIHVuaXF1ZVZlcnRleEluZGV4LAogICAgICAgICAgdW5pcXVlTmV4dFZlcnRleEluZGV4LAogICAgICAgICAgaQogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBvdXRsaW5lc0hhc2g7CiAgfQogIGZ1bmN0aW9uIGNhbGN1bGF0ZUZhY2VOb3JtYWwobm9ybWFscywgdmVydGV4QUluZGV4LCBpbmRleEFycmF5LCBwb3NpdGlvbnMpIHsKICAgIGNvbnN0IHBvc2l0aW9uQUluZGV4ID0gaW5kZXhBcnJheVt2ZXJ0ZXhBSW5kZXhdICogMzsKICAgIGNvbnN0IHBvc2l0aW9uQkluZGV4ID0gaW5kZXhBcnJheVt2ZXJ0ZXhBSW5kZXggKyAxXSAqIDM7CiAgICBjb25zdCBwb3NpdGlvbkNJbmRleCA9IGluZGV4QXJyYXlbdmVydGV4QUluZGV4ICsgMl0gKiAzOwogICAgQ2FydGVzaWFuM19kZWZhdWx0LmZyb21BcnJheShwb3NpdGlvbnMsIHBvc2l0aW9uQUluZGV4LCBjYWxjdWxhdGVGYWNlTm9ybWFsQSk7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KHBvc2l0aW9ucywgcG9zaXRpb25CSW5kZXgsIGNhbGN1bGF0ZUZhY2VOb3JtYWxCKTsKICAgIENhcnRlc2lhbjNfZGVmYXVsdC5mcm9tQXJyYXkocG9zaXRpb25zLCBwb3NpdGlvbkNJbmRleCwgY2FsY3VsYXRlRmFjZU5vcm1hbEMpOwogICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KAogICAgICBjYWxjdWxhdGVGYWNlTm9ybWFsQiwKICAgICAgY2FsY3VsYXRlRmFjZU5vcm1hbEEsCiAgICAgIGNhbGN1bGF0ZUZhY2VOb3JtYWxCCiAgICApOwogICAgQ2FydGVzaWFuM19kZWZhdWx0LnN1YnRyYWN0KAogICAgICBjYWxjdWxhdGVGYWNlTm9ybWFsQywKICAgICAgY2FsY3VsYXRlRmFjZU5vcm1hbEEsCiAgICAgIGNhbGN1bGF0ZUZhY2VOb3JtYWxDCiAgICApOwogICAgQ2FydGVzaWFuM19kZWZhdWx0LmNyb3NzKAogICAgICBjYWxjdWxhdGVGYWNlTm9ybWFsQiwKICAgICAgY2FsY3VsYXRlRmFjZU5vcm1hbEMsCiAgICAgIGNhbGN1bGF0ZUZhY2VOb3JtYWxBCiAgICApOwogICAgY29uc3QgbWFnbml0dWRlID0gQ2FydGVzaWFuM19kZWZhdWx0Lm1hZ25pdHVkZShjYWxjdWxhdGVGYWNlTm9ybWFsQSk7CiAgICBpZiAobWFnbml0dWRlICE9PSAwKSB7CiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5kaXZpZGVCeVNjYWxhcigKICAgICAgICBjYWxjdWxhdGVGYWNlTm9ybWFsQSwKICAgICAgICBtYWduaXR1ZGUsCiAgICAgICAgY2FsY3VsYXRlRmFjZU5vcm1hbEEKICAgICAgKTsKICAgIH0KICAgIGNvbnN0IG5vcm1hbEFJbmRleCA9IHZlcnRleEFJbmRleCAqIDM7CiAgICBjb25zdCBub3JtYWxCSW5kZXggPSAodmVydGV4QUluZGV4ICsgMSkgKiAzOwogICAgY29uc3Qgbm9ybWFsQ0luZGV4ID0gKHZlcnRleEFJbmRleCArIDIpICogMzsKICAgIENhcnRlc2lhbjNfZGVmYXVsdC5wYWNrKGNhbGN1bGF0ZUZhY2VOb3JtYWxBLCBub3JtYWxzLCBub3JtYWxBSW5kZXgpOwogICAgQ2FydGVzaWFuM19kZWZhdWx0LnBhY2soY2FsY3VsYXRlRmFjZU5vcm1hbEEsIG5vcm1hbHMsIG5vcm1hbEJJbmRleCk7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQucGFjayhjYWxjdWxhdGVGYWNlTm9ybWFsQSwgbm9ybWFscywgbm9ybWFsQ0luZGV4KTsKICB9CiAgZnVuY3Rpb24gaXNFZGdlU21vb3RoKG5vcm1hbHMsIG5vcm1hbEFJbmRleCwgbm9ybWFsQkluZGV4KSB7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KG5vcm1hbHMsIG5vcm1hbEFJbmRleCwgaXNFZGdlU21vb3RoQSk7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQuZnJvbUFycmF5KG5vcm1hbHMsIG5vcm1hbEJJbmRleCwgaXNFZGdlU21vb3RoQik7CiAgICBjb25zdCBjb3NpbmUgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQuZG90KGlzRWRnZVNtb290aEEsIGlzRWRnZVNtb290aEIpOwogICAgY29uc3Qgc2luZSA9IENhcnRlc2lhbjNfZGVmYXVsdC5tYWduaXR1ZGUoCiAgICAgIENhcnRlc2lhbjNfZGVmYXVsdC5jcm9zcyhpc0VkZ2VTbW9vdGhBLCBpc0VkZ2VTbW9vdGhCLCBpc0VkZ2VTbW9vdGhBKQogICAgKTsKICAgIHJldHVybiBNYXRoLmF0YW4yKHNpbmUsIGNvc2luZSkgPCAwLjI1OwogIH0KICBmdW5jdGlvbiBhZGRPdXRsaW5lc0ZvckVkZ2Uob3V0bGluZXMsIGVkZ2VEYXRhLCBpbmRleEFycmF5LCBwb3NpdGlvbnMsIG5vcm1hbHMpIHsKICAgIGlmIChlZGdlRGF0YS5ub3JtYWxzSW5kZXgubGVuZ3RoID4gMSkgewogICAgICBjb25zdCBub3JtYWxzQnlJbmRleCA9IHBvc2l0aW9ucy5sZW5ndGggPT09IG5vcm1hbHMubGVuZ3RoOwogICAgICBmb3IgKGxldCBpbmRleEEgPSAwOyBpbmRleEEgPCBlZGdlRGF0YS5ub3JtYWxzSW5kZXgubGVuZ3RoOyBpbmRleEErKykgewogICAgICAgIGNvbnN0IHZlcnRleEFJbmRleCA9IGVkZ2VEYXRhLm5vcm1hbHNJbmRleFtpbmRleEFdOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KG5vcm1hbHNbdmVydGV4QUluZGV4ICogM10pKSB7CiAgICAgICAgICBjYWxjdWxhdGVGYWNlTm9ybWFsKG5vcm1hbHMsIHZlcnRleEFJbmRleCwgaW5kZXhBcnJheSwgcG9zaXRpb25zKTsKICAgICAgICB9CiAgICAgICAgaWYgKGluZGV4QSA9PT0gMCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGluZGV4QiA9IDA7IGluZGV4QiA8IGluZGV4QTsgaW5kZXhCKyspIHsKICAgICAgICAgIGNvbnN0IHZlcnRleEJJbmRleCA9IGVkZ2VEYXRhLm5vcm1hbHNJbmRleFtpbmRleEJdOwogICAgICAgICAgY29uc3Qgbm9ybWFsQUluZGV4ID0gbm9ybWFsc0J5SW5kZXggPyBpbmRleEFycmF5W3ZlcnRleEFJbmRleF0gKiAzIDogdmVydGV4QUluZGV4ICogMzsKICAgICAgICAgIGNvbnN0IG5vcm1hbEJJbmRleCA9IG5vcm1hbHNCeUluZGV4ID8gaW5kZXhBcnJheVt2ZXJ0ZXhCSW5kZXhdICogMyA6IHZlcnRleEJJbmRleCAqIDM7CiAgICAgICAgICBpZiAoaXNFZGdlU21vb3RoKG5vcm1hbHMsIG5vcm1hbEFJbmRleCwgbm9ybWFsQkluZGV4KSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBvdXRsaW5lcy5wdXNoKC4uLmVkZ2VEYXRhLm91dGxpbmVzKTsKICB9CiAgZnVuY3Rpb24gYWRkT3V0bGluZXNGb3JGZWF0dXJlKG91dGxpbmVzLCBlZGdlSGFzaCwgaW5kZXhBcnJheSwgcG9zaXRpb25zLCBub3JtYWxzKSB7CiAgICBjb25zdCBlZGdlU3RhcnRLZXlzID0gT2JqZWN0LmtleXMoZWRnZUhhc2gpOwogICAgZm9yIChsZXQgc3RhcnRJbmRleCA9IDA7IHN0YXJ0SW5kZXggPCBlZGdlU3RhcnRLZXlzLmxlbmd0aDsgc3RhcnRJbmRleCsrKSB7CiAgICAgIGNvbnN0IGVkZ2VFbmRzID0gZWRnZUhhc2hbZWRnZVN0YXJ0S2V5c1tzdGFydEluZGV4XV07CiAgICAgIGNvbnN0IGVkZ2VFbmRLZXlzID0gT2JqZWN0LmtleXMoZWRnZUVuZHMpOwogICAgICBmb3IgKGxldCBlbmRJbmRleCA9IDA7IGVuZEluZGV4IDwgZWRnZUVuZEtleXMubGVuZ3RoOyBlbmRJbmRleCsrKSB7CiAgICAgICAgY29uc3QgZWRnZURhdGEgPSBlZGdlRW5kc1tlZGdlRW5kS2V5c1tlbmRJbmRleF1dOwogICAgICAgIGFkZE91dGxpbmVzRm9yRWRnZShvdXRsaW5lcywgZWRnZURhdGEsIGluZGV4QXJyYXksIHBvc2l0aW9ucywgbm9ybWFscyk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gZ2VuZXJhdGVPdXRsaW5lc0Zyb21IYXNoKG91dGxpbmVzSGFzaCwgaW5kZXhBcnJheSwgcG9zaXRpb25zLCBub3JtYWxzKSB7CiAgICBjb25zdCBvdXRsaW5lcyA9IFtdOwogICAgY29uc3QgZmVhdHVyZXMgPSBPYmplY3Qua2V5cyhvdXRsaW5lc0hhc2gpOwogICAgZm9yIChsZXQgZmVhdHVyZUluZGV4ID0gMDsgZmVhdHVyZUluZGV4IDwgZmVhdHVyZXMubGVuZ3RoOyBmZWF0dXJlSW5kZXgrKykgewogICAgICBjb25zdCBlZGdlSGFzaCA9IG91dGxpbmVzSGFzaFtmZWF0dXJlc1tmZWF0dXJlSW5kZXhdXS5lZGdlczsKICAgICAgYWRkT3V0bGluZXNGb3JGZWF0dXJlKG91dGxpbmVzLCBlZGdlSGFzaCwgaW5kZXhBcnJheSwgcG9zaXRpb25zLCBub3JtYWxzKTsKICAgIH0KICAgIHJldHVybiBvdXRsaW5lczsKICB9CiAgZnVuY3Rpb24gZ2VuZXJhdGVPdXRsaW5lc0luZGV4QXJyYXkoc3ltYm9sb2d5RGF0YSwgZmVhdHVyZUluZGV4QXJyYXksIGluZGV4QXJyYXksIHBvc2l0aW9ucywgbm9ybWFscykgewogICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoc3ltYm9sb2d5RGF0YSkgfHwgT2JqZWN0LmtleXMoc3ltYm9sb2d5RGF0YSkubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiB2b2lkIDA7CiAgICB9CiAgICBjb25zdCBvdXRsaW5lc0hhc2ggPSBnZW5lcmF0ZU91dGxpbmVzSGFzaCgKICAgICAgc3ltYm9sb2d5RGF0YSwKICAgICAgZmVhdHVyZUluZGV4QXJyYXksCiAgICAgIGluZGV4QXJyYXksCiAgICAgIHBvc2l0aW9ucwogICAgKTsKICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KG5vcm1hbHMpIHx8IGluZGV4QXJyYXkubGVuZ3RoICogMyAhPT0gbm9ybWFscy5sZW5ndGgpIHsKICAgICAgbm9ybWFscyA9IFtdOwogICAgfQogICAgY29uc3Qgb3V0bGluZXMgPSBnZW5lcmF0ZU91dGxpbmVzRnJvbUhhc2goCiAgICAgIG91dGxpbmVzSGFzaCwKICAgICAgaW5kZXhBcnJheSwKICAgICAgcG9zaXRpb25zLAogICAgICBub3JtYWxzCiAgICApOwogICAgY29uc3Qgb3V0bGluZXNJbmRleEFycmF5ID0gb3V0bGluZXMubGVuZ3RoID4gMCA/IG5ldyBVaW50MzJBcnJheShvdXRsaW5lcykgOiB2b2lkIDA7CiAgICByZXR1cm4gb3V0bGluZXNJbmRleEFycmF5OwogIH0KICBmdW5jdGlvbiBjb252ZXJ0Q29sb3JzQXJyYXkoY29sb3JzKSB7CiAgICBjb25zdCBjb2xvcnNBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoY29sb3JzLmxlbmd0aCk7CiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29sb3JzLmxlbmd0aDsgaW5kZXggKz0gNCkgewogICAgICBjb2xvcnNBcnJheVtpbmRleF0gPSBzcmdiVG9MaW5lYXJfZGVmYXVsdChDb2xvcl9kZWZhdWx0LmJ5dGVUb0Zsb2F0KGNvbG9yc1tpbmRleF0pKTsKICAgICAgY29sb3JzQXJyYXlbaW5kZXggKyAxXSA9IHNyZ2JUb0xpbmVhcl9kZWZhdWx0KENvbG9yX2RlZmF1bHQuYnl0ZVRvRmxvYXQoY29sb3JzW2luZGV4ICsgMV0pKTsKICAgICAgY29sb3JzQXJyYXlbaW5kZXggKyAyXSA9IHNyZ2JUb0xpbmVhcl9kZWZhdWx0KENvbG9yX2RlZmF1bHQuYnl0ZVRvRmxvYXQoY29sb3JzW2luZGV4ICsgMl0pKTsKICAgICAgY29sb3JzQXJyYXlbaW5kZXggKyAzXSA9IENvbG9yX2RlZmF1bHQuYnl0ZVRvRmxvYXQoY29sb3JzW2luZGV4ICsgM10pOwogICAgfQogICAgcmV0dXJuIGNvbG9yc0FycmF5OwogIH0KICBmdW5jdGlvbiBnZW5lcmF0ZU5vcm1hbHModmVydGV4Q291bnQsIGluZGljZXMsIHBvc2l0aW9ucywgbm9ybWFscywgdXYwcywgY29sb3JzLCBmZWF0dXJlSW5kZXgpIHsKICAgIGNvbnN0IHJlc3VsdCA9IHsKICAgICAgbm9ybWFsczogdm9pZCAwLAogICAgICBwb3NpdGlvbnM6IHZvaWQgMCwKICAgICAgdXYwczogdm9pZCAwLAogICAgICBjb2xvcnM6IHZvaWQgMCwKICAgICAgZmVhdHVyZUluZGV4OiB2b2lkIDAsCiAgICAgIHZlcnRleENvdW50OiB2b2lkIDAKICAgIH07CiAgICBpZiAodmVydGV4Q291bnQgPT09IDAgfHwgIWRlZmluZWRfZGVmYXVsdChwb3NpdGlvbnMpIHx8IHBvc2l0aW9ucy5sZW5ndGggPT09IDAgfHwgZGVmaW5lZF9kZWZhdWx0KG5vcm1hbHMpKSB7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGluZGljZXMpKSB7CiAgICAgIHJlc3VsdC52ZXJ0ZXhDb3VudCA9IGluZGljZXMubGVuZ3RoOwogICAgICByZXN1bHQucG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShpbmRpY2VzLmxlbmd0aCAqIDMpOwogICAgICByZXN1bHQudXYwcyA9IGRlZmluZWRfZGVmYXVsdCh1djBzKSA/IG5ldyBGbG9hdDMyQXJyYXkoaW5kaWNlcy5sZW5ndGggKiAyKSA6IHZvaWQgMDsKICAgICAgcmVzdWx0LmNvbG9ycyA9IGRlZmluZWRfZGVmYXVsdChjb2xvcnMpID8gbmV3IFVpbnQ4QXJyYXkoaW5kaWNlcy5sZW5ndGggKiA0KSA6IHZvaWQgMDsKICAgICAgcmVzdWx0LmZlYXR1cmVJbmRleCA9IGRlZmluZWRfZGVmYXVsdChmZWF0dXJlSW5kZXgpID8gbmV3IEFycmF5KGluZGljZXMubGVuZ3RoKSA6IHZvaWQgMDsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgaW5kZXggPSBpbmRpY2VzW2ldOwogICAgICAgIHJlc3VsdC5wb3NpdGlvbnNbaSAqIDNdID0gcG9zaXRpb25zW2luZGV4ICogM107CiAgICAgICAgcmVzdWx0LnBvc2l0aW9uc1tpICogMyArIDFdID0gcG9zaXRpb25zW2luZGV4ICogMyArIDFdOwogICAgICAgIHJlc3VsdC5wb3NpdGlvbnNbaSAqIDMgKyAyXSA9IHBvc2l0aW9uc1tpbmRleCAqIDMgKyAyXTsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHJlc3VsdC51djBzKSkgewogICAgICAgICAgcmVzdWx0LnV2MHNbaSAqIDJdID0gdXYwc1tpbmRleCAqIDJdOwogICAgICAgICAgcmVzdWx0LnV2MHNbaSAqIDIgKyAxXSA9IHV2MHNbaW5kZXggKiAyICsgMV07CiAgICAgICAgfQogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQocmVzdWx0LmNvbG9ycykpIHsKICAgICAgICAgIHJlc3VsdC5jb2xvcnNbaSAqIDRdID0gY29sb3JzW2luZGV4ICogNF07CiAgICAgICAgICByZXN1bHQuY29sb3JzW2kgKiA0ICsgMV0gPSBjb2xvcnNbaW5kZXggKiA0ICsgMV07CiAgICAgICAgICByZXN1bHQuY29sb3JzW2kgKiA0ICsgMl0gPSBjb2xvcnNbaW5kZXggKiA0ICsgMl07CiAgICAgICAgICByZXN1bHQuY29sb3JzW2kgKiA0ICsgM10gPSBjb2xvcnNbaW5kZXggKiA0ICsgM107CiAgICAgICAgfQogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQocmVzdWx0LmZlYXR1cmVJbmRleCkpIHsKICAgICAgICAgIHJlc3VsdC5mZWF0dXJlSW5kZXhbaV0gPSBmZWF0dXJlSW5kZXhbaW5kZXhdOwogICAgICAgIH0KICAgICAgfQogICAgICB2ZXJ0ZXhDb3VudCA9IGluZGljZXMubGVuZ3RoOwogICAgICBwb3NpdGlvbnMgPSByZXN1bHQucG9zaXRpb25zOwogICAgfQogICAgaW5kaWNlcyA9IG5ldyBBcnJheSh2ZXJ0ZXhDb3VudCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspIHsKICAgICAgaW5kaWNlc1tpXSA9IGk7CiAgICB9CiAgICByZXN1bHQubm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoaW5kaWNlcy5sZW5ndGggKiAzKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMykgewogICAgICBjYWxjdWxhdGVGYWNlTm9ybWFsKHJlc3VsdC5ub3JtYWxzLCBpLCBpbmRpY2VzLCBwb3NpdGlvbnMpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgZnVuY3Rpb24gZ2VuZXJhdGVHbHRmQnVmZmVyKHZlcnRleENvdW50LCBpbmRpY2VzLCBwb3NpdGlvbnMsIG5vcm1hbHMsIHV2MHMsIGNvbG9ycywgZmVhdHVyZUluZGV4LCBwYXJhbWV0ZXJzKSB7CiAgICBpZiAodmVydGV4Q291bnQgPT09IDAgfHwgIWRlZmluZWRfZGVmYXVsdChwb3NpdGlvbnMpIHx8IHBvc2l0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBidWZmZXJzOiBbXSwKICAgICAgICBidWZmZXJWaWV3czogW10sCiAgICAgICAgYWNjZXNzb3JzOiBbXSwKICAgICAgICBtZXNoZXM6IFtdLAogICAgICAgIG5vZGVzOiBbXSwKICAgICAgICBub2Rlc0luU2NlbmU6IFtdCiAgICAgIH07CiAgICB9CiAgICBjb25zdCBidWZmZXJzID0gW107CiAgICBjb25zdCBidWZmZXJWaWV3cyA9IFtdOwogICAgY29uc3QgYWNjZXNzb3JzID0gW107CiAgICBjb25zdCBtZXNoZXMgPSBbXTsKICAgIGNvbnN0IG5vZGVzID0gW107CiAgICBjb25zdCBub2Rlc0luU2NlbmUgPSBbXTsKICAgIGNvbnN0IHJvb3RFeHRlbnNpb25zID0ge307CiAgICBjb25zdCBleHRlbnNpb25zVXNlZCA9IFtdOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdChpbmRpY2VzKSkgewogICAgICB2ZXJ0ZXhDb3VudCA9IGluZGljZXMubGVuZ3RoOwogICAgfQogICAgY29uc3QgeyBpbmRleEFycmF5LCB0cmFuc3BhcmVudFZlcnRleE9mZnNldCB9ID0gZ2VuZXJhdGVJbmRleEFycmF5KAogICAgICB2ZXJ0ZXhDb3VudCwKICAgICAgaW5kaWNlcywKICAgICAgY29sb3JzLAogICAgICBwYXJhbWV0ZXJzLnNwbGl0R2VvbWV0cnlCeUNvbG9yVHJhbnNwYXJlbmN5CiAgICApOwogICAgY29uc3QgaW5kaWNlc0Jsb2IgPSBuZXcgQmxvYihbaW5kZXhBcnJheV0sIHsgdHlwZTogImFwcGxpY2F0aW9uL2JpbmFyeSIgfSk7CiAgICBjb25zdCBpbmRpY2VzVVJMID0gVVJMLmNyZWF0ZU9iamVjdFVSTChpbmRpY2VzQmxvYik7CiAgICBjb25zdCBlbmRJbmRleCA9IHZlcnRleENvdW50OwogICAgY29uc3QgZmVhdHVyZUluZGV4QXJyYXkgPSBwYXJhbWV0ZXJzLmVuYWJsZUZlYXR1cmVzICYmIGRlZmluZWRfZGVmYXVsdChmZWF0dXJlSW5kZXgpID8gbmV3IEZsb2F0MzJBcnJheShmZWF0dXJlSW5kZXgubGVuZ3RoKSA6IHZvaWQgMDsKICAgIGxldCBmZWF0dXJlQ291bnQgPSAwOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdChmZWF0dXJlSW5kZXhBcnJheSkpIHsKICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGZlYXR1cmVJbmRleC5sZW5ndGg7ICsraW5kZXgpIHsKICAgICAgICBmZWF0dXJlSW5kZXhBcnJheVtpbmRleF0gPSBmZWF0dXJlSW5kZXhbaW5kZXhdOwogICAgICAgIGNvbnN0IGNvdW50QnlJbmRleCA9IGZlYXR1cmVJbmRleFtpbmRleF0gKyAxOwogICAgICAgIGlmIChmZWF0dXJlQ291bnQgPCBjb3VudEJ5SW5kZXgpIHsKICAgICAgICAgIGZlYXR1cmVDb3VudCA9IGNvdW50QnlJbmRleDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGxldCBvdXRsaW5lc0luZGljZXNVUkw7CiAgICBjb25zdCBvdXRsaW5lc0luZGV4QXJyYXkgPSBnZW5lcmF0ZU91dGxpbmVzSW5kZXhBcnJheSgKICAgICAgcGFyYW1ldGVycy5zeW1ib2xvZ3lEYXRhLAogICAgICBmZWF0dXJlSW5kZXgsCiAgICAgIGluZGV4QXJyYXksCiAgICAgIHBvc2l0aW9ucywKICAgICAgbm9ybWFscwogICAgKTsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQob3V0bGluZXNJbmRleEFycmF5KSkgewogICAgICBjb25zdCBvdXRsaW5lc0luZGljZXNCbG9iID0gbmV3IEJsb2IoW291dGxpbmVzSW5kZXhBcnJheV0sIHsKICAgICAgICB0eXBlOiAiYXBwbGljYXRpb24vYmluYXJ5IgogICAgICB9KTsKICAgICAgb3V0bGluZXNJbmRpY2VzVVJMID0gVVJMLmNyZWF0ZU9iamVjdFVSTChvdXRsaW5lc0luZGljZXNCbG9iKTsKICAgIH0KICAgIGNvbnN0IG1lc2hQb3NpdGlvbnMgPSBwb3NpdGlvbnMuc3ViYXJyYXkoMCwgZW5kSW5kZXggKiAzKTsKICAgIGNvbnN0IHBvc2l0aW9uc0Jsb2IgPSBuZXcgQmxvYihbbWVzaFBvc2l0aW9uc10sIHsKICAgICAgdHlwZTogImFwcGxpY2F0aW9uL2JpbmFyeSIKICAgIH0pOwogICAgY29uc3QgcG9zaXRpb25zVVJMID0gVVJMLmNyZWF0ZU9iamVjdFVSTChwb3NpdGlvbnNCbG9iKTsKICAgIGxldCBtaW5YID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgbGV0IG1heFggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7CiAgICBsZXQgbWluWSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgIGxldCBtYXhZID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOwogICAgbGV0IG1pblogPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICBsZXQgbWF4WiA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVzaFBvc2l0aW9ucy5sZW5ndGggLyAzOyBpKyspIHsKICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIG1lc2hQb3NpdGlvbnNbaSAqIDMgKyAwXSk7CiAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBtZXNoUG9zaXRpb25zW2kgKiAzICsgMF0pOwogICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgbWVzaFBvc2l0aW9uc1tpICogMyArIDFdKTsKICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIG1lc2hQb3NpdGlvbnNbaSAqIDMgKyAxXSk7CiAgICAgIG1pblogPSBNYXRoLm1pbihtaW5aLCBtZXNoUG9zaXRpb25zW2kgKiAzICsgMl0pOwogICAgICBtYXhaID0gTWF0aC5tYXgobWF4WiwgbWVzaFBvc2l0aW9uc1tpICogMyArIDJdKTsKICAgIH0KICAgIGNvbnN0IG1lc2hOb3JtYWxzID0gbm9ybWFscyA/IG5vcm1hbHMuc3ViYXJyYXkoMCwgZW5kSW5kZXggKiAzKSA6IHZvaWQgMDsKICAgIGxldCBub3JtYWxzVVJMOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdChtZXNoTm9ybWFscykpIHsKICAgICAgY29uc3Qgbm9ybWFsc0Jsb2IgPSBuZXcgQmxvYihbbWVzaE5vcm1hbHNdLCB7CiAgICAgICAgdHlwZTogImFwcGxpY2F0aW9uL2JpbmFyeSIKICAgICAgfSk7CiAgICAgIG5vcm1hbHNVUkwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5vcm1hbHNCbG9iKTsKICAgIH0KICAgIGNvbnN0IG1lc2hVdjBzID0gdXYwcyA/IHV2MHMuc3ViYXJyYXkoMCwgZW5kSW5kZXggKiAyKSA6IHZvaWQgMDsKICAgIGxldCB1djBVUkw7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG1lc2hVdjBzKSkgewogICAgICBjb25zdCB1djBCbG9iID0gbmV3IEJsb2IoW21lc2hVdjBzXSwgeyB0eXBlOiAiYXBwbGljYXRpb24vYmluYXJ5IiB9KTsKICAgICAgdXYwVVJMID0gVVJMLmNyZWF0ZU9iamVjdFVSTCh1djBCbG9iKTsKICAgIH0KICAgIGNvbnN0IG1lc2hDb2xvcnNJbkJ5dGVzID0gZGVmaW5lZF9kZWZhdWx0KGNvbG9ycykgPyBjb252ZXJ0Q29sb3JzQXJyYXkoY29sb3JzLnN1YmFycmF5KDAsIGVuZEluZGV4ICogNCkpIDogdm9pZCAwOwogICAgbGV0IGNvbG9yc1VSTDsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQobWVzaENvbG9yc0luQnl0ZXMpKSB7CiAgICAgIGNvbnN0IGNvbG9yc0Jsb2IgPSBuZXcgQmxvYihbbWVzaENvbG9yc0luQnl0ZXNdLCB7CiAgICAgICAgdHlwZTogImFwcGxpY2F0aW9uL2JpbmFyeSIKICAgICAgfSk7CiAgICAgIGNvbG9yc1VSTCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoY29sb3JzQmxvYik7CiAgICB9CiAgICBjb25zdCBtZXNoRmVhdHVyZUlkMCA9IGRlZmluZWRfZGVmYXVsdChmZWF0dXJlSW5kZXhBcnJheSkgPyBmZWF0dXJlSW5kZXhBcnJheS5zdWJhcnJheSgwLCBlbmRJbmRleCkgOiB2b2lkIDA7CiAgICBsZXQgZmVhdHVyZUlkMFVSTDsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQobWVzaEZlYXR1cmVJZDApKSB7CiAgICAgIGNvbnN0IGZlYXR1cmVJZDBCbG9iID0gbmV3IEJsb2IoW21lc2hGZWF0dXJlSWQwXSwgewogICAgICAgIHR5cGU6ICJhcHBsaWNhdGlvbi9iaW5hcnkiCiAgICAgIH0pOwogICAgICBmZWF0dXJlSWQwVVJMID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmZWF0dXJlSWQwQmxvYik7CiAgICB9CiAgICBjb25zdCBtZXNoUHJvcGVydHlUYWJsZTAgPSBkZWZpbmVkX2RlZmF1bHQoZmVhdHVyZUluZGV4QXJyYXkpID8gbmV3IEZsb2F0MzJBcnJheShmZWF0dXJlQ291bnQpIDogdm9pZCAwOwogICAgbGV0IHByb3BlcnR5VGFibGUwVVJMOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdChtZXNoUHJvcGVydHlUYWJsZTApKSB7CiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBtZXNoUHJvcGVydHlUYWJsZTAubGVuZ3RoOyArK2luZGV4KSB7CiAgICAgICAgbWVzaFByb3BlcnR5VGFibGUwW2luZGV4XSA9IGluZGV4OwogICAgICB9CiAgICAgIGNvbnN0IHByb3BlcnR5VGFibGUwQmxvYiA9IG5ldyBCbG9iKFttZXNoUHJvcGVydHlUYWJsZTBdLCB7CiAgICAgICAgdHlwZTogImFwcGxpY2F0aW9uL2JpbmFyeSIKICAgICAgfSk7CiAgICAgIHByb3BlcnR5VGFibGUwVVJMID0gVVJMLmNyZWF0ZU9iamVjdFVSTChwcm9wZXJ0eVRhYmxlMEJsb2IpOwogICAgfQogICAgY29uc3QgYXR0cmlidXRlcyA9IHt9OwogICAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9OwogICAgYXR0cmlidXRlcy5QT1NJVElPTiA9IGFjY2Vzc29ycy5sZW5ndGg7CiAgICBidWZmZXJzLnB1c2goewogICAgICB1cmk6IHBvc2l0aW9uc1VSTCwKICAgICAgYnl0ZUxlbmd0aDogbWVzaFBvc2l0aW9ucy5ieXRlTGVuZ3RoCiAgICB9KTsKICAgIGJ1ZmZlclZpZXdzLnB1c2goewogICAgICBidWZmZXI6IGJ1ZmZlcnMubGVuZ3RoIC0gMSwKICAgICAgYnl0ZU9mZnNldDogMCwKICAgICAgYnl0ZUxlbmd0aDogbWVzaFBvc2l0aW9ucy5ieXRlTGVuZ3RoLAogICAgICB0YXJnZXQ6IDM0OTYyCiAgICB9KTsKICAgIGFjY2Vzc29ycy5wdXNoKHsKICAgICAgYnVmZmVyVmlldzogYnVmZmVyVmlld3MubGVuZ3RoIC0gMSwKICAgICAgYnl0ZU9mZnNldDogMCwKICAgICAgY29tcG9uZW50VHlwZTogNTEyNiwKICAgICAgY291bnQ6IG1lc2hQb3NpdGlvbnMubGVuZ3RoIC8gMywKICAgICAgdHlwZTogIlZFQzMiLAogICAgICBtYXg6IFttaW5YLCBtaW5ZLCBtaW5aXSwKICAgICAgbWluOiBbbWF4WCwgbWF4WSwgbWF4Wl0KICAgIH0pOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdChub3JtYWxzVVJMKSkgewogICAgICBhdHRyaWJ1dGVzLk5PUk1BTCA9IGFjY2Vzc29ycy5sZW5ndGg7CiAgICAgIGJ1ZmZlcnMucHVzaCh7CiAgICAgICAgdXJpOiBub3JtYWxzVVJMLAogICAgICAgIGJ5dGVMZW5ndGg6IG1lc2hOb3JtYWxzLmJ5dGVMZW5ndGgKICAgICAgfSk7CiAgICAgIGJ1ZmZlclZpZXdzLnB1c2goewogICAgICAgIGJ1ZmZlcjogYnVmZmVycy5sZW5ndGggLSAxLAogICAgICAgIGJ5dGVPZmZzZXQ6IDAsCiAgICAgICAgYnl0ZUxlbmd0aDogbWVzaE5vcm1hbHMuYnl0ZUxlbmd0aCwKICAgICAgICB0YXJnZXQ6IDM0OTYyCiAgICAgIH0pOwogICAgICBhY2Nlc3NvcnMucHVzaCh7CiAgICAgICAgYnVmZmVyVmlldzogYnVmZmVyVmlld3MubGVuZ3RoIC0gMSwKICAgICAgICBieXRlT2Zmc2V0OiAwLAogICAgICAgIGNvbXBvbmVudFR5cGU6IDUxMjYsCiAgICAgICAgY291bnQ6IG1lc2hOb3JtYWxzLmxlbmd0aCAvIDMsCiAgICAgICAgdHlwZTogIlZFQzMiCiAgICAgIH0pOwogICAgfQogICAgaWYgKGRlZmluZWRfZGVmYXVsdCh1djBVUkwpKSB7CiAgICAgIGF0dHJpYnV0ZXMuVEVYQ09PUkRfMCA9IGFjY2Vzc29ycy5sZW5ndGg7CiAgICAgIGJ1ZmZlcnMucHVzaCh7CiAgICAgICAgdXJpOiB1djBVUkwsCiAgICAgICAgYnl0ZUxlbmd0aDogbWVzaFV2MHMuYnl0ZUxlbmd0aAogICAgICB9KTsKICAgICAgYnVmZmVyVmlld3MucHVzaCh7CiAgICAgICAgYnVmZmVyOiBidWZmZXJzLmxlbmd0aCAtIDEsCiAgICAgICAgYnl0ZU9mZnNldDogMCwKICAgICAgICBieXRlTGVuZ3RoOiBtZXNoVXYwcy5ieXRlTGVuZ3RoLAogICAgICAgIHRhcmdldDogMzQ5NjIKICAgICAgfSk7CiAgICAgIGFjY2Vzc29ycy5wdXNoKHsKICAgICAgICBidWZmZXJWaWV3OiBidWZmZXJWaWV3cy5sZW5ndGggLSAxLAogICAgICAgIGJ5dGVPZmZzZXQ6IDAsCiAgICAgICAgY29tcG9uZW50VHlwZTogNTEyNiwKICAgICAgICBjb3VudDogbWVzaFV2MHMubGVuZ3RoIC8gMiwKICAgICAgICB0eXBlOiAiVkVDMiIKICAgICAgfSk7CiAgICB9CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGNvbG9yc1VSTCkpIHsKICAgICAgYXR0cmlidXRlcy5DT0xPUl8wID0gYWNjZXNzb3JzLmxlbmd0aDsKICAgICAgYnVmZmVycy5wdXNoKHsKICAgICAgICB1cmk6IGNvbG9yc1VSTCwKICAgICAgICBieXRlTGVuZ3RoOiBtZXNoQ29sb3JzSW5CeXRlcy5ieXRlTGVuZ3RoCiAgICAgIH0pOwogICAgICBidWZmZXJWaWV3cy5wdXNoKHsKICAgICAgICBidWZmZXI6IGJ1ZmZlcnMubGVuZ3RoIC0gMSwKICAgICAgICBieXRlT2Zmc2V0OiAwLAogICAgICAgIGJ5dGVMZW5ndGg6IG1lc2hDb2xvcnNJbkJ5dGVzLmJ5dGVMZW5ndGgsCiAgICAgICAgdGFyZ2V0OiAzNDk2MgogICAgICB9KTsKICAgICAgYWNjZXNzb3JzLnB1c2goewogICAgICAgIGJ1ZmZlclZpZXc6IGJ1ZmZlclZpZXdzLmxlbmd0aCAtIDEsCiAgICAgICAgYnl0ZU9mZnNldDogMCwKICAgICAgICBjb21wb25lbnRUeXBlOiA1MTI2LAogICAgICAgIGNvdW50OiBtZXNoQ29sb3JzSW5CeXRlcy5sZW5ndGggLyA0LAogICAgICAgIHR5cGU6ICJWRUM0IgogICAgICB9KTsKICAgIH0KICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoZmVhdHVyZUlkMFVSTCkpIHsKICAgICAgYXR0cmlidXRlcy5fRkVBVFVSRV9JRF8wID0gYWNjZXNzb3JzLmxlbmd0aDsKICAgICAgYnVmZmVycy5wdXNoKHsKICAgICAgICB1cmk6IGZlYXR1cmVJZDBVUkwsCiAgICAgICAgYnl0ZUxlbmd0aDogbWVzaEZlYXR1cmVJZDAuYnl0ZUxlbmd0aAogICAgICB9KTsKICAgICAgYnVmZmVyVmlld3MucHVzaCh7CiAgICAgICAgYnVmZmVyOiBidWZmZXJzLmxlbmd0aCAtIDEsCiAgICAgICAgYnl0ZU9mZnNldDogMCwKICAgICAgICBieXRlTGVuZ3RoOiBtZXNoRmVhdHVyZUlkMC5ieXRlTGVuZ3RoLAogICAgICAgIHRhcmdldDogMzQ5NjMKICAgICAgfSk7CiAgICAgIGFjY2Vzc29ycy5wdXNoKHsKICAgICAgICBidWZmZXJWaWV3OiBidWZmZXJWaWV3cy5sZW5ndGggLSAxLAogICAgICAgIGJ5dGVPZmZzZXQ6IDAsCiAgICAgICAgY29tcG9uZW50VHlwZTogNTEyNiwKICAgICAgICBjb3VudDogbWVzaEZlYXR1cmVJZDAubGVuZ3RoLAogICAgICAgIHR5cGU6ICJTQ0FMQVIiCiAgICAgIH0pOwogICAgICBleHRlbnNpb25zLkVYVF9tZXNoX2ZlYXR1cmVzID0gewogICAgICAgIGZlYXR1cmVJZHM6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgYXR0cmlidXRlOiAwLAogICAgICAgICAgICBwcm9wZXJ0eVRhYmxlOiAwLAogICAgICAgICAgICBmZWF0dXJlQ291bnQKICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH07CiAgICAgIGV4dGVuc2lvbnNVc2VkLnB1c2goIkVYVF9tZXNoX2ZlYXR1cmVzIik7CiAgICB9CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHByb3BlcnR5VGFibGUwVVJMKSkgewogICAgICBidWZmZXJzLnB1c2goewogICAgICAgIHVyaTogcHJvcGVydHlUYWJsZTBVUkwsCiAgICAgICAgYnl0ZUxlbmd0aDogbWVzaFByb3BlcnR5VGFibGUwLmJ5dGVMZW5ndGgKICAgICAgfSk7CiAgICAgIGJ1ZmZlclZpZXdzLnB1c2goewogICAgICAgIGJ1ZmZlcjogYnVmZmVycy5sZW5ndGggLSAxLAogICAgICAgIGJ5dGVPZmZzZXQ6IDAsCiAgICAgICAgYnl0ZUxlbmd0aDogbWVzaFByb3BlcnR5VGFibGUwLmJ5dGVMZW5ndGgsCiAgICAgICAgdGFyZ2V0OiAzNDk2MwogICAgICB9KTsKICAgICAgcm9vdEV4dGVuc2lvbnMuRVhUX3N0cnVjdHVyYWxfbWV0YWRhdGEgPSB7CiAgICAgICAgc2NoZW1hOiB7CiAgICAgICAgICBpZDogImkzcy1tZXRhZGF0YS1zY2hlbWEtMDAxIiwKICAgICAgICAgIG5hbWU6ICJJM1MgbWV0YWRhdGEgc2NoZW1hIDAwMSIsCiAgICAgICAgICBkZXNjcmlwdGlvbjogIlRoZSBzY2hlbWEgZm9yIEkzUyBtZXRhZGF0YSIsCiAgICAgICAgICB2ZXJzaW9uOiAiMS4wIiwKICAgICAgICAgIGNsYXNzZXM6IHsKICAgICAgICAgICAgZmVhdHVyZTogewogICAgICAgICAgICAgIG5hbWU6ICJmZWF0dXJlIiwKICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogIkZlYXR1cmUgbWV0YWRhdGEiLAogICAgICAgICAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgIGluZGV4OiB7CiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAiVGhlIGZlYXR1cmUgaW5kZXgiLAogICAgICAgICAgICAgICAgICB0eXBlOiAiU0NBTEFSIiwKICAgICAgICAgICAgICAgICAgY29tcG9uZW50VHlwZTogIkZMT0FUMzIiLAogICAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgcHJvcGVydHlUYWJsZXM6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgbmFtZTogImZlYXR1cmUtaW5kaWNlcy1tYXBwaW5nIiwKICAgICAgICAgICAgY2xhc3M6ICJmZWF0dXJlIiwKICAgICAgICAgICAgY291bnQ6IGZlYXR1cmVDb3VudCwKICAgICAgICAgICAgcHJvcGVydGllczogewogICAgICAgICAgICAgIGluZGV4OiB7CiAgICAgICAgICAgICAgICB2YWx1ZXM6IGJ1ZmZlclZpZXdzLmxlbmd0aCAtIDEKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH07CiAgICAgIGV4dGVuc2lvbnNVc2VkLnB1c2goIkVYVF9zdHJ1Y3R1cmFsX21ldGFkYXRhIik7CiAgICB9CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG91dGxpbmVzSW5kaWNlc1VSTCkpIHsKICAgICAgYnVmZmVycy5wdXNoKHsKICAgICAgICB1cmk6IG91dGxpbmVzSW5kaWNlc1VSTCwKICAgICAgICBieXRlTGVuZ3RoOiBvdXRsaW5lc0luZGV4QXJyYXkuYnl0ZUxlbmd0aAogICAgICB9KTsKICAgICAgYnVmZmVyVmlld3MucHVzaCh7CiAgICAgICAgYnVmZmVyOiBidWZmZXJzLmxlbmd0aCAtIDEsCiAgICAgICAgYnl0ZU9mZnNldDogMCwKICAgICAgICBieXRlTGVuZ3RoOiBvdXRsaW5lc0luZGV4QXJyYXkuYnl0ZUxlbmd0aCwKICAgICAgICB0YXJnZXQ6IDM0OTYzCiAgICAgIH0pOwogICAgICBhY2Nlc3NvcnMucHVzaCh7CiAgICAgICAgYnVmZmVyVmlldzogYnVmZmVyVmlld3MubGVuZ3RoIC0gMSwKICAgICAgICBieXRlT2Zmc2V0OiAwLAogICAgICAgIGNvbXBvbmVudFR5cGU6IDUxMjUsCiAgICAgICAgY291bnQ6IG91dGxpbmVzSW5kZXhBcnJheS5sZW5ndGgsCiAgICAgICAgdHlwZTogIlNDQUxBUiIKICAgICAgfSk7CiAgICAgIGV4dGVuc2lvbnMuQ0VTSVVNX3ByaW1pdGl2ZV9vdXRsaW5lID0gewogICAgICAgIGluZGljZXM6IGFjY2Vzc29ycy5sZW5ndGggLSAxCiAgICAgIH07CiAgICAgIGV4dGVuc2lvbnNVc2VkLnB1c2goIkNFU0lVTV9wcmltaXRpdmVfb3V0bGluZSIpOwogICAgfQogICAgYnVmZmVycy5wdXNoKHsKICAgICAgdXJpOiBpbmRpY2VzVVJMLAogICAgICBieXRlTGVuZ3RoOiBpbmRleEFycmF5LmJ5dGVMZW5ndGgKICAgIH0pOwogICAgYnVmZmVyVmlld3MucHVzaCh7CiAgICAgIGJ1ZmZlcjogYnVmZmVycy5sZW5ndGggLSAxLAogICAgICBieXRlT2Zmc2V0OiAwLAogICAgICBieXRlTGVuZ3RoOiBpbmRleEFycmF5LmJ5dGVMZW5ndGgsCiAgICAgIHRhcmdldDogMzQ5NjMKICAgIH0pOwogICAgY29uc3QgbWVzaFByaW1pdGl2ZXMgPSBbXTsKICAgIGlmICh0cmFuc3BhcmVudFZlcnRleE9mZnNldCA+IDApIHsKICAgICAgYWNjZXNzb3JzLnB1c2goewogICAgICAgIGJ1ZmZlclZpZXc6IGJ1ZmZlclZpZXdzLmxlbmd0aCAtIDEsCiAgICAgICAgYnl0ZU9mZnNldDogMCwKICAgICAgICBjb21wb25lbnRUeXBlOiA1MTI1LAogICAgICAgIGNvdW50OiB0cmFuc3BhcmVudFZlcnRleE9mZnNldCwKICAgICAgICB0eXBlOiAiU0NBTEFSIgogICAgICB9KTsKICAgICAgbWVzaFByaW1pdGl2ZXMucHVzaCh7CiAgICAgICAgYXR0cmlidXRlcywKICAgICAgICBpbmRpY2VzOiBhY2Nlc3NvcnMubGVuZ3RoIC0gMSwKICAgICAgICBtYXRlcmlhbDogbWVzaFByaW1pdGl2ZXMubGVuZ3RoLAogICAgICAgIGV4dGVuc2lvbnMKICAgICAgfSk7CiAgICB9CiAgICBpZiAodHJhbnNwYXJlbnRWZXJ0ZXhPZmZzZXQgPCB2ZXJ0ZXhDb3VudCkgewogICAgICBhY2Nlc3NvcnMucHVzaCh7CiAgICAgICAgYnVmZmVyVmlldzogYnVmZmVyVmlld3MubGVuZ3RoIC0gMSwKICAgICAgICBieXRlT2Zmc2V0OiA0ICogdHJhbnNwYXJlbnRWZXJ0ZXhPZmZzZXQsCiAgICAgICAgLy8gc2tpcCA0IGJ5dGVzIGZvciBlYWNoIG9wYXF1ZSB2ZXJ0ZXgKICAgICAgICBjb21wb25lbnRUeXBlOiA1MTI1LAogICAgICAgIGNvdW50OiB2ZXJ0ZXhDb3VudCAtIHRyYW5zcGFyZW50VmVydGV4T2Zmc2V0LAogICAgICAgIHR5cGU6ICJTQ0FMQVIiCiAgICAgIH0pOwogICAgICBtZXNoUHJpbWl0aXZlcy5wdXNoKHsKICAgICAgICBhdHRyaWJ1dGVzLAogICAgICAgIGluZGljZXM6IGFjY2Vzc29ycy5sZW5ndGggLSAxLAogICAgICAgIG1hdGVyaWFsOiBtZXNoUHJpbWl0aXZlcy5sZW5ndGgsCiAgICAgICAgZXh0ZW5zaW9ucywKICAgICAgICBleHRyYTogewogICAgICAgICAgaXNUcmFuc3BhcmVudDogdHJ1ZQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBtZXNoZXMucHVzaCh7CiAgICAgIHByaW1pdGl2ZXM6IG1lc2hQcmltaXRpdmVzCiAgICB9KTsKICAgIG5vZGVzSW5TY2VuZS5wdXNoKDApOwogICAgbm9kZXMucHVzaCh7IG1lc2g6IDAgfSk7CiAgICByZXR1cm4gewogICAgICBidWZmZXJzLAogICAgICBidWZmZXJWaWV3cywKICAgICAgYWNjZXNzb3JzLAogICAgICBtZXNoZXMsCiAgICAgIG5vZGVzLAogICAgICBub2Rlc0luU2NlbmUsCiAgICAgIHJvb3RFeHRlbnNpb25zLAogICAgICBleHRlbnNpb25zVXNlZAogICAgfTsKICB9CiAgZnVuY3Rpb24gZGVjb2RlMihkYXRhLCBzY2hlbWEsIGJ1ZmZlckluZm8sIGZlYXR1cmVEYXRhKSB7CiAgICBjb25zdCBtYWdpY051bWJlciA9IG5ldyBVaW50OEFycmF5KGRhdGEsIDAsIDUpOwogICAgaWYgKG1hZ2ljTnVtYmVyWzBdID09PSAiRCIuY2hhckNvZGVBdCgpICYmIG1hZ2ljTnVtYmVyWzFdID09PSAiUiIuY2hhckNvZGVBdCgpICYmIG1hZ2ljTnVtYmVyWzJdID09PSAiQSIuY2hhckNvZGVBdCgpICYmIG1hZ2ljTnVtYmVyWzNdID09PSAiQyIuY2hhckNvZGVBdCgpICYmIG1hZ2ljTnVtYmVyWzRdID09PSAiTyIuY2hhckNvZGVBdCgpKSB7CiAgICAgIHJldHVybiBkZWNvZGVEcmFjb0VuY29kZWRHZW9tZXRyeShkYXRhLCBidWZmZXJJbmZvKTsKICAgIH0KICAgIHJldHVybiBkZWNvZGVCaW5hcnlHZW9tZXRyeShkYXRhLCBzY2hlbWEsIGJ1ZmZlckluZm8sIGZlYXR1cmVEYXRhKTsKICB9CiAgZnVuY3Rpb24gZGVjb2RlRHJhY29FbmNvZGVkR2VvbWV0cnkoZGF0YSkgewogICAgY29uc3QgZHJhY29EZWNvZGVyTW9kdWxlID0gZHJhY28yOwogICAgY29uc3QgYnVmZmVyID0gbmV3IGRyYWNvRGVjb2Rlck1vZHVsZS5EZWNvZGVyQnVmZmVyKCk7CiAgICBjb25zdCBieXRlQXJyYXkgPSBuZXcgVWludDhBcnJheShkYXRhKTsKICAgIGJ1ZmZlci5Jbml0KGJ5dGVBcnJheSwgYnl0ZUFycmF5Lmxlbmd0aCk7CiAgICBjb25zdCBkcmFjb0RlY29kZXIgPSBuZXcgZHJhY29EZWNvZGVyTW9kdWxlLkRlY29kZXIoKTsKICAgIGNvbnN0IGdlb21ldHJ5VHlwZSA9IGRyYWNvRGVjb2Rlci5HZXRFbmNvZGVkR2VvbWV0cnlUeXBlKGJ1ZmZlcik7CiAgICBjb25zdCBtZXRhZGF0YVF1ZXJpZXIgPSBuZXcgZHJhY29EZWNvZGVyTW9kdWxlLk1ldGFkYXRhUXVlcmllcigpOwogICAgbGV0IGRyYWNvR2VvbWV0cnk7CiAgICBsZXQgc3RhdHVzOwogICAgaWYgKGdlb21ldHJ5VHlwZSA9PT0gZHJhY29EZWNvZGVyTW9kdWxlLlRSSUFOR1VMQVJfTUVTSCkgewogICAgICBkcmFjb0dlb21ldHJ5ID0gbmV3IGRyYWNvRGVjb2Rlck1vZHVsZS5NZXNoKCk7CiAgICAgIHN0YXR1cyA9IGRyYWNvRGVjb2Rlci5EZWNvZGVCdWZmZXJUb01lc2goYnVmZmVyLCBkcmFjb0dlb21ldHJ5KTsKICAgIH0KICAgIGNvbnN0IGRlY29kZWRHZW9tZXRyeSA9IHsKICAgICAgdmVydGV4Q291bnQ6IFswXSwKICAgICAgZmVhdHVyZUNvdW50OiAwCiAgICB9OwogICAgaWYgKGRlZmluZWRfZGVmYXVsdChzdGF0dXMpICYmIHN0YXR1cy5vaygpICYmIGRyYWNvR2VvbWV0cnkucHRyICE9PSAwKSB7CiAgICAgIGNvbnN0IGZhY2VDb3VudCA9IGRyYWNvR2VvbWV0cnkubnVtX2ZhY2VzKCk7CiAgICAgIGNvbnN0IGF0dHJpYnV0ZXNDb3VudCA9IGRyYWNvR2VvbWV0cnkubnVtX2F0dHJpYnV0ZXMoKTsKICAgICAgY29uc3QgdmVydGV4Q291bnQgPSBkcmFjb0dlb21ldHJ5Lm51bV9wb2ludHMoKTsKICAgICAgZGVjb2RlZEdlb21ldHJ5LmluZGljZXMgPSBuZXcgVWludDMyQXJyYXkoZmFjZUNvdW50ICogMyk7CiAgICAgIGNvbnN0IGZhY2VzMiA9IGRlY29kZWRHZW9tZXRyeS5pbmRpY2VzOwogICAgICBkZWNvZGVkR2VvbWV0cnkudmVydGV4Q291bnRbMF0gPSB2ZXJ0ZXhDb3VudDsKICAgICAgZGVjb2RlZEdlb21ldHJ5LnNjYWxlX3ggPSAxOwogICAgICBkZWNvZGVkR2VvbWV0cnkuc2NhbGVfeSA9IDE7CiAgICAgIGNvbnN0IGZhY2UgPSBuZXcgZHJhY29EZWNvZGVyTW9kdWxlLkRyYWNvSW50MzJBcnJheSgzKTsKICAgICAgZm9yIChsZXQgZmFjZUluZGV4ID0gMDsgZmFjZUluZGV4IDwgZmFjZUNvdW50OyArK2ZhY2VJbmRleCkgewogICAgICAgIGRyYWNvRGVjb2Rlci5HZXRGYWNlRnJvbU1lc2goZHJhY29HZW9tZXRyeSwgZmFjZUluZGV4LCBmYWNlKTsKICAgICAgICBmYWNlczJbZmFjZUluZGV4ICogM10gPSBmYWNlLkdldFZhbHVlKDApOwogICAgICAgIGZhY2VzMltmYWNlSW5kZXggKiAzICsgMV0gPSBmYWNlLkdldFZhbHVlKDEpOwogICAgICAgIGZhY2VzMltmYWNlSW5kZXggKiAzICsgMl0gPSBmYWNlLkdldFZhbHVlKDIpOwogICAgICB9CiAgICAgIGRyYWNvRGVjb2Rlck1vZHVsZS5kZXN0cm95KGZhY2UpOwogICAgICBmb3IgKGxldCBhdHRySW5kZXggPSAwOyBhdHRySW5kZXggPCBhdHRyaWJ1dGVzQ291bnQ7ICsrYXR0ckluZGV4KSB7CiAgICAgICAgY29uc3QgZHJhY29BdHRyaWJ1dGUgPSBkcmFjb0RlY29kZXIuR2V0QXR0cmlidXRlKAogICAgICAgICAgZHJhY29HZW9tZXRyeSwKICAgICAgICAgIGF0dHJJbmRleAogICAgICAgICk7CiAgICAgICAgY29uc3QgYXR0cmlidXRlRGF0YSA9IGRlY29kZURyYWNvQXR0cmlidXRlKAogICAgICAgICAgZHJhY29EZWNvZGVyTW9kdWxlLAogICAgICAgICAgZHJhY29EZWNvZGVyLAogICAgICAgICAgZHJhY29HZW9tZXRyeSwKICAgICAgICAgIGRyYWNvQXR0cmlidXRlLAogICAgICAgICAgdmVydGV4Q291bnQKICAgICAgICApOwogICAgICAgIGNvbnN0IGRyYWNvQXR0cmlidXRlVHlwZSA9IGRyYWNvQXR0cmlidXRlLmF0dHJpYnV0ZV90eXBlKCk7CiAgICAgICAgbGV0IGF0dHJpYnV0ZWkzc05hbWUgPSAidW5rbm93biI7CiAgICAgICAgaWYgKGRyYWNvQXR0cmlidXRlVHlwZSA9PT0gZHJhY29EZWNvZGVyTW9kdWxlLlBPU0lUSU9OKSB7CiAgICAgICAgICBhdHRyaWJ1dGVpM3NOYW1lID0gInBvc2l0aW9ucyI7CiAgICAgICAgfSBlbHNlIGlmIChkcmFjb0F0dHJpYnV0ZVR5cGUgPT09IGRyYWNvRGVjb2Rlck1vZHVsZS5OT1JNQUwpIHsKICAgICAgICAgIGF0dHJpYnV0ZWkzc05hbWUgPSAibm9ybWFscyI7CiAgICAgICAgfSBlbHNlIGlmIChkcmFjb0F0dHJpYnV0ZVR5cGUgPT09IGRyYWNvRGVjb2Rlck1vZHVsZS5DT0xPUikgewogICAgICAgICAgYXR0cmlidXRlaTNzTmFtZSA9ICJjb2xvcnMiOwogICAgICAgIH0gZWxzZSBpZiAoZHJhY29BdHRyaWJ1dGVUeXBlID09PSBkcmFjb0RlY29kZXJNb2R1bGUuVEVYX0NPT1JEKSB7CiAgICAgICAgICBhdHRyaWJ1dGVpM3NOYW1lID0gInV2MHMiOwogICAgICAgIH0KICAgICAgICBjb25zdCBtZXRhZGF0YSA9IGRyYWNvRGVjb2Rlci5HZXRBdHRyaWJ1dGVNZXRhZGF0YSgKICAgICAgICAgIGRyYWNvR2VvbWV0cnksCiAgICAgICAgICBhdHRySW5kZXgKICAgICAgICApOwogICAgICAgIGlmIChtZXRhZGF0YS5wdHIgIT09IDApIHsKICAgICAgICAgIGNvbnN0IG51bUVudHJpZXMgPSBtZXRhZGF0YVF1ZXJpZXIuTnVtRW50cmllcyhtZXRhZGF0YSk7CiAgICAgICAgICBmb3IgKGxldCBlbnRyeSA9IDA7IGVudHJ5IDwgbnVtRW50cmllczsgKytlbnRyeSkgewogICAgICAgICAgICBjb25zdCBlbnRyeU5hbWUgPSBtZXRhZGF0YVF1ZXJpZXIuR2V0RW50cnlOYW1lKG1ldGFkYXRhLCBlbnRyeSk7CiAgICAgICAgICAgIGlmIChlbnRyeU5hbWUgPT09ICJpM3Mtc2NhbGVfeCIpIHsKICAgICAgICAgICAgICBkZWNvZGVkR2VvbWV0cnkuc2NhbGVfeCA9IG1ldGFkYXRhUXVlcmllci5HZXREb3VibGVFbnRyeSgKICAgICAgICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgICAgICAgImkzcy1zY2FsZV94IgogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnlOYW1lID09PSAiaTNzLXNjYWxlX3kiKSB7CiAgICAgICAgICAgICAgZGVjb2RlZEdlb21ldHJ5LnNjYWxlX3kgPSBtZXRhZGF0YVF1ZXJpZXIuR2V0RG91YmxlRW50cnkoCiAgICAgICAgICAgICAgICBtZXRhZGF0YSwKICAgICAgICAgICAgICAgICJpM3Mtc2NhbGVfeSIKICAgICAgICAgICAgICApOwogICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5TmFtZSA9PT0gImkzcy1hdHRyaWJ1dGUtdHlwZSIpIHsKICAgICAgICAgICAgICBhdHRyaWJ1dGVpM3NOYW1lID0gbWV0YWRhdGFRdWVyaWVyLkdldFN0cmluZ0VudHJ5KAogICAgICAgICAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAiaTNzLWF0dHJpYnV0ZS10eXBlIgogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChkZWNvZGVkR2VvbWV0cnlbYXR0cmlidXRlaTNzTmFtZV0pKSB7CiAgICAgICAgICBjb25zb2xlLmxvZygiQXR0cmlidXRlIGFscmVhZHkgZXhpc3RzIiwgYXR0cmlidXRlaTNzTmFtZSk7CiAgICAgICAgfQogICAgICAgIGRlY29kZWRHZW9tZXRyeVthdHRyaWJ1dGVpM3NOYW1lXSA9IGF0dHJpYnV0ZURhdGE7CiAgICAgICAgaWYgKGF0dHJpYnV0ZWkzc05hbWUgPT09ICJmZWF0dXJlLWluZGV4IikgewogICAgICAgICAgZGVjb2RlZEdlb21ldHJ5LmZlYXR1cmVDb3VudCsrOwogICAgICAgIH0KICAgICAgfQogICAgICBkcmFjb0RlY29kZXJNb2R1bGUuZGVzdHJveShkcmFjb0dlb21ldHJ5KTsKICAgIH0KICAgIGRyYWNvRGVjb2Rlck1vZHVsZS5kZXN0cm95KG1ldGFkYXRhUXVlcmllcik7CiAgICBkcmFjb0RlY29kZXJNb2R1bGUuZGVzdHJveShkcmFjb0RlY29kZXIpOwogICAgcmV0dXJuIGRlY29kZWRHZW9tZXRyeTsKICB9CiAgZnVuY3Rpb24gZGVjb2RlRHJhY29BdHRyaWJ1dGUoZHJhY29EZWNvZGVyTW9kdWxlLCBkcmFjb0RlY29kZXIsIGRyYWNvR2VvbWV0cnksIGRyYWNvQXR0cmlidXRlLCB2ZXJ0ZXhDb3VudCkgewogICAgY29uc3QgYnVmZmVyU2l6ZSA9IGRyYWNvQXR0cmlidXRlLm51bV9jb21wb25lbnRzKCkgKiB2ZXJ0ZXhDb3VudDsKICAgIGxldCBkcmFjb0F0dHJpYnV0ZURhdGE7CiAgICBjb25zdCBoYW5kbGVycyA9IFsKICAgICAgZnVuY3Rpb24oKSB7CiAgICAgIH0sCiAgICAgIC8vIERUX0lOVkFMSUQgLSAwCiAgICAgIGZ1bmN0aW9uKCkgewogICAgICAgIGRyYWNvQXR0cmlidXRlRGF0YSA9IG5ldyBkcmFjb0RlY29kZXJNb2R1bGUuRHJhY29JbnQ4QXJyYXkoYnVmZmVyU2l6ZSk7CiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGRyYWNvRGVjb2Rlci5HZXRBdHRyaWJ1dGVJbnQ4Rm9yQWxsUG9pbnRzKAogICAgICAgICAgZHJhY29HZW9tZXRyeSwKICAgICAgICAgIGRyYWNvQXR0cmlidXRlLAogICAgICAgICAgZHJhY29BdHRyaWJ1dGVEYXRhCiAgICAgICAgKTsKICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIkJhZCBzdHJlYW0iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYXR0cmlidXRlRGF0YTIgPSBuZXcgSW50OEFycmF5KGJ1ZmZlclNpemUpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyU2l6ZTsgKytpKSB7CiAgICAgICAgICBhdHRyaWJ1dGVEYXRhMltpXSA9IGRyYWNvQXR0cmlidXRlRGF0YS5HZXRWYWx1ZShpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZURhdGEyOwogICAgICB9LAogICAgICBmdW5jdGlvbigpIHsKICAgICAgICBkcmFjb0F0dHJpYnV0ZURhdGEgPSBuZXcgZHJhY29EZWNvZGVyTW9kdWxlLkRyYWNvSW50OEFycmF5KGJ1ZmZlclNpemUpOwogICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBkcmFjb0RlY29kZXIuR2V0QXR0cmlidXRlVUludDhGb3JBbGxQb2ludHMoCiAgICAgICAgICBkcmFjb0dlb21ldHJ5LAogICAgICAgICAgZHJhY29BdHRyaWJ1dGUsCiAgICAgICAgICBkcmFjb0F0dHJpYnV0ZURhdGEKICAgICAgICApOwogICAgICAgIGlmICghc3VjY2VzcykgewogICAgICAgICAgY29uc29sZS5lcnJvcigiQmFkIHN0cmVhbSIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBhdHRyaWJ1dGVEYXRhMiA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlclNpemUpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyU2l6ZTsgKytpKSB7CiAgICAgICAgICBhdHRyaWJ1dGVEYXRhMltpXSA9IGRyYWNvQXR0cmlidXRlRGF0YS5HZXRWYWx1ZShpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZURhdGEyOwogICAgICB9LAogICAgICBmdW5jdGlvbigpIHsKICAgICAgICBkcmFjb0F0dHJpYnV0ZURhdGEgPSBuZXcgZHJhY29EZWNvZGVyTW9kdWxlLkRyYWNvSW50MTZBcnJheShidWZmZXJTaXplKTsKICAgICAgICBjb25zdCBzdWNjZXNzID0gZHJhY29EZWNvZGVyLkdldEF0dHJpYnV0ZUludDE2Rm9yQWxsUG9pbnRzKAogICAgICAgICAgZHJhY29HZW9tZXRyeSwKICAgICAgICAgIGRyYWNvQXR0cmlidXRlLAogICAgICAgICAgZHJhY29BdHRyaWJ1dGVEYXRhCiAgICAgICAgKTsKICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIkJhZCBzdHJlYW0iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYXR0cmlidXRlRGF0YTIgPSBuZXcgSW50MTZBcnJheShidWZmZXJTaXplKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlclNpemU7ICsraSkgewogICAgICAgICAgYXR0cmlidXRlRGF0YTJbaV0gPSBkcmFjb0F0dHJpYnV0ZURhdGEuR2V0VmFsdWUoaSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhdHRyaWJ1dGVEYXRhMjsKICAgICAgfSwKICAgICAgZnVuY3Rpb24oKSB7CiAgICAgICAgZHJhY29BdHRyaWJ1dGVEYXRhID0gbmV3IGRyYWNvRGVjb2Rlck1vZHVsZS5EcmFjb0ludDE2QXJyYXkoYnVmZmVyU2l6ZSk7CiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGRyYWNvRGVjb2Rlci5HZXRBdHRyaWJ1dGVVSW50MTZGb3JBbGxQb2ludHMoCiAgICAgICAgICBkcmFjb0dlb21ldHJ5LAogICAgICAgICAgZHJhY29BdHRyaWJ1dGUsCiAgICAgICAgICBkcmFjb0F0dHJpYnV0ZURhdGEKICAgICAgICApOwogICAgICAgIGlmICghc3VjY2VzcykgewogICAgICAgICAgY29uc29sZS5lcnJvcigiQmFkIHN0cmVhbSIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBhdHRyaWJ1dGVEYXRhMiA9IG5ldyBVaW50MTZBcnJheShidWZmZXJTaXplKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlclNpemU7ICsraSkgewogICAgICAgICAgYXR0cmlidXRlRGF0YTJbaV0gPSBkcmFjb0F0dHJpYnV0ZURhdGEuR2V0VmFsdWUoaSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhdHRyaWJ1dGVEYXRhMjsKICAgICAgfSwKICAgICAgZnVuY3Rpb24oKSB7CiAgICAgICAgZHJhY29BdHRyaWJ1dGVEYXRhID0gbmV3IGRyYWNvRGVjb2Rlck1vZHVsZS5EcmFjb0ludDMyQXJyYXkoYnVmZmVyU2l6ZSk7CiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGRyYWNvRGVjb2Rlci5HZXRBdHRyaWJ1dGVJbnQzMkZvckFsbFBvaW50cygKICAgICAgICAgIGRyYWNvR2VvbWV0cnksCiAgICAgICAgICBkcmFjb0F0dHJpYnV0ZSwKICAgICAgICAgIGRyYWNvQXR0cmlidXRlRGF0YQogICAgICAgICk7CiAgICAgICAgaWYgKCFzdWNjZXNzKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCJCYWQgc3RyZWFtIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGF0dHJpYnV0ZURhdGEyID0gbmV3IEludDMyQXJyYXkoYnVmZmVyU2l6ZSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXJTaXplOyArK2kpIHsKICAgICAgICAgIGF0dHJpYnV0ZURhdGEyW2ldID0gZHJhY29BdHRyaWJ1dGVEYXRhLkdldFZhbHVlKGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXR0cmlidXRlRGF0YTI7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uKCkgewogICAgICAgIGRyYWNvQXR0cmlidXRlRGF0YSA9IG5ldyBkcmFjb0RlY29kZXJNb2R1bGUuRHJhY29JbnQzMkFycmF5KGJ1ZmZlclNpemUpOwogICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBkcmFjb0RlY29kZXIuR2V0QXR0cmlidXRlVUludDMyRm9yQWxsUG9pbnRzKAogICAgICAgICAgZHJhY29HZW9tZXRyeSwKICAgICAgICAgIGRyYWNvQXR0cmlidXRlLAogICAgICAgICAgZHJhY29BdHRyaWJ1dGVEYXRhCiAgICAgICAgKTsKICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIkJhZCBzdHJlYW0iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYXR0cmlidXRlRGF0YTIgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyU2l6ZSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXJTaXplOyArK2kpIHsKICAgICAgICAgIGF0dHJpYnV0ZURhdGEyW2ldID0gZHJhY29BdHRyaWJ1dGVEYXRhLkdldFZhbHVlKGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXR0cmlidXRlRGF0YTI7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uKCkgewogICAgICB9LAogICAgICBmdW5jdGlvbigpIHsKICAgICAgfSwKICAgICAgZnVuY3Rpb24oKSB7CiAgICAgICAgZHJhY29BdHRyaWJ1dGVEYXRhID0gbmV3IGRyYWNvRGVjb2Rlck1vZHVsZS5EcmFjb0Zsb2F0MzJBcnJheShidWZmZXJTaXplKTsKICAgICAgICBjb25zdCBzdWNjZXNzID0gZHJhY29EZWNvZGVyLkdldEF0dHJpYnV0ZUZsb2F0Rm9yQWxsUG9pbnRzKAogICAgICAgICAgZHJhY29HZW9tZXRyeSwKICAgICAgICAgIGRyYWNvQXR0cmlidXRlLAogICAgICAgICAgZHJhY29BdHRyaWJ1dGVEYXRhCiAgICAgICAgKTsKICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIkJhZCBzdHJlYW0iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYXR0cmlidXRlRGF0YTIgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlclNpemUpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyU2l6ZTsgKytpKSB7CiAgICAgICAgICBhdHRyaWJ1dGVEYXRhMltpXSA9IGRyYWNvQXR0cmlidXRlRGF0YS5HZXRWYWx1ZShpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZURhdGEyOwogICAgICB9LAogICAgICBmdW5jdGlvbigpIHsKICAgICAgfSwKICAgICAgZnVuY3Rpb24oKSB7CiAgICAgICAgZHJhY29BdHRyaWJ1dGVEYXRhID0gbmV3IGRyYWNvRGVjb2Rlck1vZHVsZS5EcmFjb1VJbnQ4QXJyYXkoYnVmZmVyU2l6ZSk7CiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGRyYWNvRGVjb2Rlci5HZXRBdHRyaWJ1dGVVSW50OEZvckFsbFBvaW50cygKICAgICAgICAgIGRyYWNvR2VvbWV0cnksCiAgICAgICAgICBkcmFjb0F0dHJpYnV0ZSwKICAgICAgICAgIGRyYWNvQXR0cmlidXRlRGF0YQogICAgICAgICk7CiAgICAgICAgaWYgKCFzdWNjZXNzKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCJCYWQgc3RyZWFtIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGF0dHJpYnV0ZURhdGEyID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyU2l6ZSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXJTaXplOyArK2kpIHsKICAgICAgICAgIGF0dHJpYnV0ZURhdGEyW2ldID0gZHJhY29BdHRyaWJ1dGVEYXRhLkdldFZhbHVlKGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXR0cmlidXRlRGF0YTI7CiAgICAgIH0KICAgIF07CiAgICBjb25zdCBhdHRyaWJ1dGVEYXRhID0gaGFuZGxlcnNbZHJhY29BdHRyaWJ1dGUuZGF0YV90eXBlKCldKCk7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGRyYWNvQXR0cmlidXRlRGF0YSkpIHsKICAgICAgZHJhY29EZWNvZGVyTW9kdWxlLmRlc3Ryb3koZHJhY29BdHRyaWJ1dGVEYXRhKTsKICAgIH0KICAgIHJldHVybiBhdHRyaWJ1dGVEYXRhOwogIH0KICBmdW5jdGlvbiBkZWNvZGVCaW5hcnlHZW9tZXRyeShkYXRhLCBzY2hlbWEsIGJ1ZmZlckluZm8sIGZlYXR1cmVEYXRhKSB7CiAgICBjb25zdCBkZWNvZGVkR2VvbWV0cnkgPSB7CiAgICAgIHZlcnRleENvdW50OiAwCiAgICB9OwogICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoZGF0YSk7CiAgICB0cnkgewogICAgICBsZXQgb2Zmc2V0ID0gMDsKICAgICAgZGVjb2RlZEdlb21ldHJ5LnZlcnRleENvdW50ID0gZGF0YVZpZXcuZ2V0VWludDMyKG9mZnNldCwgMSk7CiAgICAgIG9mZnNldCArPSA0OwogICAgICBkZWNvZGVkR2VvbWV0cnkuZmVhdHVyZUNvdW50ID0gZGF0YVZpZXcuZ2V0VWludDMyKG9mZnNldCwgMSk7CiAgICAgIG9mZnNldCArPSA0OwogICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGJ1ZmZlckluZm8pKSB7CiAgICAgICAgZm9yIChsZXQgYXR0ckluZGV4ID0gMDsgYXR0ckluZGV4IDwgYnVmZmVySW5mby5hdHRyaWJ1dGVzLmxlbmd0aDsgYXR0ckluZGV4KyspIHsKICAgICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoYmluYXJ5QXR0cmlidXRlRGVjb2RlcnNbYnVmZmVySW5mby5hdHRyaWJ1dGVzW2F0dHJJbmRleF1dKSkgewogICAgICAgICAgICBvZmZzZXQgPSBiaW5hcnlBdHRyaWJ1dGVEZWNvZGVyc1tidWZmZXJJbmZvLmF0dHJpYnV0ZXNbYXR0ckluZGV4XV0oCiAgICAgICAgICAgICAgZGVjb2RlZEdlb21ldHJ5LAogICAgICAgICAgICAgIGRhdGEsCiAgICAgICAgICAgICAgb2Zmc2V0CiAgICAgICAgICAgICk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKAogICAgICAgICAgICAgICJVbmtub3duIGRlY29kZXIgZm9yIiwKICAgICAgICAgICAgICBidWZmZXJJbmZvLmF0dHJpYnV0ZXNbYXR0ckluZGV4XQogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBsZXQgb3JkZXJpbmcgPSBzY2hlbWEub3JkZXJpbmc7CiAgICAgICAgbGV0IGZlYXR1cmVBdHRyaWJ1dGVPcmRlciA9IHNjaGVtYS5mZWF0dXJlQXR0cmlidXRlT3JkZXI7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdChmZWF0dXJlRGF0YSkgJiYgZGVmaW5lZF9kZWZhdWx0KGZlYXR1cmVEYXRhLmdlb21ldHJ5RGF0YSkgJiYgZGVmaW5lZF9kZWZhdWx0KGZlYXR1cmVEYXRhLmdlb21ldHJ5RGF0YVswXSkgJiYgZGVmaW5lZF9kZWZhdWx0KGZlYXR1cmVEYXRhLmdlb21ldHJ5RGF0YVswXS5wYXJhbXMpKSB7CiAgICAgICAgICBvcmRlcmluZyA9IE9iamVjdC5rZXlzKAogICAgICAgICAgICBmZWF0dXJlRGF0YS5nZW9tZXRyeURhdGFbMF0ucGFyYW1zLnZlcnRleEF0dHJpYnV0ZXMKICAgICAgICAgICk7CiAgICAgICAgICBmZWF0dXJlQXR0cmlidXRlT3JkZXIgPSBPYmplY3Qua2V5cygKICAgICAgICAgICAgZmVhdHVyZURhdGEuZ2VvbWV0cnlEYXRhWzBdLnBhcmFtcy5mZWF0dXJlQXR0cmlidXRlcwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlcmluZy5sZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgZGVjb2RlciA9IGJpbmFyeUF0dHJpYnV0ZURlY29kZXJzW29yZGVyaW5nW2ldXTsKICAgICAgICAgIG9mZnNldCA9IGRlY29kZXIoZGVjb2RlZEdlb21ldHJ5LCBkYXRhLCBvZmZzZXQpOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGZlYXR1cmVBdHRyaWJ1dGVPcmRlci5sZW5ndGg7IGorKykgewogICAgICAgICAgY29uc3QgY3VyRGVjb2RlciA9IGJpbmFyeUF0dHJpYnV0ZURlY29kZXJzW2ZlYXR1cmVBdHRyaWJ1dGVPcmRlcltqXV07CiAgICAgICAgICBvZmZzZXQgPSBjdXJEZWNvZGVyKGRlY29kZWRHZW9tZXRyeSwgZGF0YSwgb2Zmc2V0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgIH0KICAgIGRlY29kZWRHZW9tZXRyeS5zY2FsZV94ID0gMTsKICAgIGRlY29kZWRHZW9tZXRyeS5zY2FsZV95ID0gMTsKICAgIHJldHVybiBkZWNvZGVkR2VvbWV0cnk7CiAgfQogIGZ1bmN0aW9uIGRlY29kZUFuZENyZWF0ZUdsdGYocGFyYW1ldGVycykgewogICAgY29uc3QgZ2VvbWV0cnlEYXRhID0gZGVjb2RlMigKICAgICAgcGFyYW1ldGVycy5iaW5hcnlEYXRhLAogICAgICBwYXJhbWV0ZXJzLnNjaGVtYSwKICAgICAgcGFyYW1ldGVycy5idWZmZXJJbmZvLAogICAgICBwYXJhbWV0ZXJzLmZlYXR1cmVEYXRhCiAgICApOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdChwYXJhbWV0ZXJzLmdlb2lkRGF0YUxpc3QpICYmIHBhcmFtZXRlcnMuZ2VvaWREYXRhTGlzdC5sZW5ndGggPiAwKSB7CiAgICAgIG9ydGhvbWV0cmljVG9FbGxpcHNvaWRhbCgKICAgICAgICBnZW9tZXRyeURhdGEudmVydGV4Q291bnQsCiAgICAgICAgZ2VvbWV0cnlEYXRhLnBvc2l0aW9ucywKICAgICAgICBnZW9tZXRyeURhdGEuc2NhbGVfeCwKICAgICAgICBnZW9tZXRyeURhdGEuc2NhbGVfeSwKICAgICAgICBwYXJhbWV0ZXJzLmNhcnRvZ3JhcGhpY0NlbnRlciwKICAgICAgICBwYXJhbWV0ZXJzLmdlb2lkRGF0YUxpc3QsCiAgICAgICAgZmFsc2UKICAgICAgKTsKICAgIH0KICAgIHRyYW5zZm9ybVRvTG9jYWwoCiAgICAgIGdlb21ldHJ5RGF0YS52ZXJ0ZXhDb3VudCwKICAgICAgZ2VvbWV0cnlEYXRhLnBvc2l0aW9ucywKICAgICAgZ2VvbWV0cnlEYXRhLm5vcm1hbHMsCiAgICAgIHBhcmFtZXRlcnMuY2FydG9ncmFwaGljQ2VudGVyLAogICAgICBwYXJhbWV0ZXJzLmNhcnRlc2lhbkNlbnRlciwKICAgICAgcGFyYW1ldGVycy5wYXJlbnRSb3RhdGlvbiwKICAgICAgcGFyYW1ldGVycy5lbGxpcHNvaWRSYWRpaVNxdWFyZSwKICAgICAgZ2VvbWV0cnlEYXRhLnNjYWxlX3gsCiAgICAgIGdlb21ldHJ5RGF0YS5zY2FsZV95CiAgICApOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdChnZW9tZXRyeURhdGEudXYwcykgJiYgZGVmaW5lZF9kZWZhdWx0KGdlb21ldHJ5RGF0YVsidXYtcmVnaW9uIl0pKSB7CiAgICAgIGNyb3BVVnMoCiAgICAgICAgZ2VvbWV0cnlEYXRhLnZlcnRleENvdW50LAogICAgICAgIGdlb21ldHJ5RGF0YS51djBzLAogICAgICAgIGdlb21ldHJ5RGF0YVsidXYtcmVnaW9uIl0KICAgICAgKTsKICAgIH0KICAgIGxldCBmZWF0dXJlSW5kZXg7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KGdlb21ldHJ5RGF0YVsiZmVhdHVyZS1pbmRleCJdKSkgewogICAgICBmZWF0dXJlSW5kZXggPSBnZW9tZXRyeURhdGFbImZlYXR1cmUtaW5kZXgiXTsKICAgIH0gZWxzZSBpZiAoZGVmaW5lZF9kZWZhdWx0KGdlb21ldHJ5RGF0YVsiZmFjZVJhbmdlIl0pKSB7CiAgICAgIGZlYXR1cmVJbmRleCA9IG5ldyBBcnJheShnZW9tZXRyeURhdGEudmVydGV4Q291bnQpOwogICAgICBmb3IgKGxldCByYW5nZSA9IDA7IHJhbmdlIDwgZ2VvbWV0cnlEYXRhWyJmYWNlUmFuZ2UiXS5sZW5ndGggLSAxOyByYW5nZSArPSAyKSB7CiAgICAgICAgY29uc3QgY3VySW5kZXggPSByYW5nZSAvIDI7CiAgICAgICAgY29uc3QgcmFuZ2VTdGFydCA9IGdlb21ldHJ5RGF0YVsiZmFjZVJhbmdlIl1bcmFuZ2VdOwogICAgICAgIGNvbnN0IHJhbmdlRW5kID0gZ2VvbWV0cnlEYXRhWyJmYWNlUmFuZ2UiXVtyYW5nZSArIDFdOwogICAgICAgIGZvciAobGV0IGkgPSByYW5nZVN0YXJ0OyBpIDw9IHJhbmdlRW5kOyBpKyspIHsKICAgICAgICAgIGZlYXR1cmVJbmRleFtpICogM10gPSBjdXJJbmRleDsKICAgICAgICAgIGZlYXR1cmVJbmRleFtpICogMyArIDFdID0gY3VySW5kZXg7CiAgICAgICAgICBmZWF0dXJlSW5kZXhbaSAqIDMgKyAyXSA9IGN1ckluZGV4OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKHBhcmFtZXRlcnMuY2FsY3VsYXRlTm9ybWFscykgewogICAgICBjb25zdCBkYXRhID0gZ2VuZXJhdGVOb3JtYWxzKAogICAgICAgIGdlb21ldHJ5RGF0YS52ZXJ0ZXhDb3VudCwKICAgICAgICBnZW9tZXRyeURhdGEuaW5kaWNlcywKICAgICAgICBnZW9tZXRyeURhdGEucG9zaXRpb25zLAogICAgICAgIGdlb21ldHJ5RGF0YS5ub3JtYWxzLAogICAgICAgIGdlb21ldHJ5RGF0YS51djBzLAogICAgICAgIGdlb21ldHJ5RGF0YS5jb2xvcnMsCiAgICAgICAgZmVhdHVyZUluZGV4CiAgICAgICk7CiAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoZGF0YS5ub3JtYWxzKSkgewogICAgICAgIGdlb21ldHJ5RGF0YS5ub3JtYWxzID0gZGF0YS5ub3JtYWxzOwogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoZGF0YS52ZXJ0ZXhDb3VudCkpIHsKICAgICAgICAgIGdlb21ldHJ5RGF0YS52ZXJ0ZXhDb3VudCA9IGRhdGEudmVydGV4Q291bnQ7CiAgICAgICAgICBnZW9tZXRyeURhdGEuaW5kaWNlcyA9IGRhdGEuaW5kaWNlczsKICAgICAgICAgIGdlb21ldHJ5RGF0YS5wb3NpdGlvbnMgPSBkYXRhLnBvc2l0aW9uczsKICAgICAgICAgIGdlb21ldHJ5RGF0YS51djBzID0gZGF0YS51djBzOwogICAgICAgICAgZ2VvbWV0cnlEYXRhLmNvbG9ycyA9IGRhdGEuY29sb3JzOwogICAgICAgICAgZmVhdHVyZUluZGV4ID0gZGF0YS5mZWF0dXJlSW5kZXg7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCBtZXNoRGF0YSA9IGdlbmVyYXRlR2x0ZkJ1ZmZlcigKICAgICAgZ2VvbWV0cnlEYXRhLnZlcnRleENvdW50LAogICAgICBnZW9tZXRyeURhdGEuaW5kaWNlcywKICAgICAgZ2VvbWV0cnlEYXRhLnBvc2l0aW9ucywKICAgICAgZ2VvbWV0cnlEYXRhLm5vcm1hbHMsCiAgICAgIGdlb21ldHJ5RGF0YS51djBzLAogICAgICBnZW9tZXRyeURhdGEuY29sb3JzLAogICAgICBmZWF0dXJlSW5kZXgsCiAgICAgIHBhcmFtZXRlcnMKICAgICk7CiAgICBjb25zdCBjdXN0b21BdHRyaWJ1dGVzID0gewogICAgICBwb3NpdGlvbnM6IGdlb21ldHJ5RGF0YS5wb3NpdGlvbnMsCiAgICAgIGluZGljZXM6IGdlb21ldHJ5RGF0YS5pbmRpY2VzLAogICAgICBmZWF0dXJlSW5kZXgsCiAgICAgIHNvdXJjZVVSTDogcGFyYW1ldGVycy51cmwsCiAgICAgIGNhcnRlc2lhbkNlbnRlcjogcGFyYW1ldGVycy5jYXJ0ZXNpYW5DZW50ZXIsCiAgICAgIHBhcmVudFJvdGF0aW9uOiBwYXJhbWV0ZXJzLnBhcmVudFJvdGF0aW9uCiAgICB9OwogICAgbWVzaERhdGEuX2N1c3RvbUF0dHJpYnV0ZXMgPSBjdXN0b21BdHRyaWJ1dGVzOwogICAgY29uc3QgcmVzdWx0cyA9IHsKICAgICAgbWVzaERhdGEKICAgIH07CiAgICByZXR1cm4gcmVzdWx0czsKICB9CiAgYXN5bmMgZnVuY3Rpb24gaW5pdFdvcmtlcjIocGFyYW1ldGVycywgdHJhbnNmZXJhYmxlT2JqZWN0cykgewogICAgY29uc3Qgd2FzbUNvbmZpZyA9IHBhcmFtZXRlcnMud2ViQXNzZW1ibHlDb25maWc7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHdhc21Db25maWcpICYmIGRlZmluZWRfZGVmYXVsdCh3YXNtQ29uZmlnLndhc21CaW5hcnlGaWxlKSkgewogICAgICBkcmFjbzIgPSBhd2FpdCAoMCwgaW1wb3J0X2RyYWNvX2RlY29kZXJfbm9kZWpzMi5kZWZhdWx0KSh3YXNtQ29uZmlnKTsKICAgIH0gZWxzZSB7CiAgICAgIGRyYWNvMiA9IGF3YWl0ICgwLCBpbXBvcnRfZHJhY29fZGVjb2Rlcl9ub2RlanMyLmRlZmF1bHQpKCk7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gZGVjb2RlSTNTKHBhcmFtZXRlcnMsIHRyYW5zZmVyYWJsZU9iamVjdHMpIHsKICAgIGNvbnN0IHdhc21Db25maWcgPSBwYXJhbWV0ZXJzLndlYkFzc2VtYmx5Q29uZmlnOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdCh3YXNtQ29uZmlnKSkgewogICAgICByZXR1cm4gaW5pdFdvcmtlcjIocGFyYW1ldGVycywgdHJhbnNmZXJhYmxlT2JqZWN0cyk7CiAgICB9CiAgICByZXR1cm4gZGVjb2RlQW5kQ3JlYXRlR2x0ZihwYXJhbWV0ZXJzLCB0cmFuc2ZlcmFibGVPYmplY3RzKTsKICB9CiAgdmFyIGltcG9ydF9kcmFjb19kZWNvZGVyX25vZGVqczIsIGRyYWNvMiwgY2FsY3VsYXRlRmFjZU5vcm1hbEEsIGNhbGN1bGF0ZUZhY2VOb3JtYWxCLCBjYWxjdWxhdGVGYWNlTm9ybWFsQywgaXNFZGdlU21vb3RoQSwgaXNFZGdlU21vb3RoQiwgYmluYXJ5QXR0cmlidXRlRGVjb2RlcnMsIGRlY29kZUkzU19kZWZhdWx0OwogIHZhciBpbml0X2RlY29kZUkzUyA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvZGVjb2RlSTNTLmpzIigpIHsKICAgICAgaW5pdF9jcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X1dlYk1lcmNhdG9yUHJvamVjdGlvbigpOwogICAgICBpbml0X0VsbGlwc29pZCgpOwogICAgICBpbml0X0NhcnRvZ3JhcGhpYygpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9Db2xvcigpOwogICAgICBpbml0X01hdHJpeDMoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIGltcG9ydF9kcmFjb19kZWNvZGVyX25vZGVqczIgPSBfX3RvRVNNKHJlcXVpcmVfZHJhY29fZGVjb2Rlcl9ub2RlanMoKSwgMSk7CiAgICAgIGluaXRfc3JnYlRvTGluZWFyKCk7CiAgICAgIGNhbGN1bGF0ZUZhY2VOb3JtYWxBID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICBjYWxjdWxhdGVGYWNlTm9ybWFsQiA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgY2FsY3VsYXRlRmFjZU5vcm1hbEMgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGlzRWRnZVNtb290aEEgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGlzRWRnZVNtb290aEIgPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGJpbmFyeUF0dHJpYnV0ZURlY29kZXJzID0gewogICAgICAgIHBvc2l0aW9uOiBmdW5jdGlvbihkZWNvZGVkR2VvbWV0cnksIGRhdGEsIG9mZnNldCkgewogICAgICAgICAgY29uc3QgY291bnQgPSBkZWNvZGVkR2VvbWV0cnkudmVydGV4Q291bnQgKiAzOwogICAgICAgICAgZGVjb2RlZEdlb21ldHJ5LnBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoZGF0YSwgb2Zmc2V0LCBjb3VudCk7CiAgICAgICAgICBvZmZzZXQgKz0gY291bnQgKiA0OwogICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICAgICB9LAogICAgICAgIG5vcm1hbDogZnVuY3Rpb24oZGVjb2RlZEdlb21ldHJ5LCBkYXRhLCBvZmZzZXQpIHsKICAgICAgICAgIGNvbnN0IGNvdW50ID0gZGVjb2RlZEdlb21ldHJ5LnZlcnRleENvdW50ICogMzsKICAgICAgICAgIGRlY29kZWRHZW9tZXRyeS5ub3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheShkYXRhLCBvZmZzZXQsIGNvdW50KTsKICAgICAgICAgIG9mZnNldCArPSBjb3VudCAqIDQ7CiAgICAgICAgICByZXR1cm4gb2Zmc2V0OwogICAgICAgIH0sCiAgICAgICAgdXYwOiBmdW5jdGlvbihkZWNvZGVkR2VvbWV0cnksIGRhdGEsIG9mZnNldCkgewogICAgICAgICAgY29uc3QgY291bnQgPSBkZWNvZGVkR2VvbWV0cnkudmVydGV4Q291bnQgKiAyOwogICAgICAgICAgZGVjb2RlZEdlb21ldHJ5LnV2MHMgPSBuZXcgRmxvYXQzMkFycmF5KGRhdGEsIG9mZnNldCwgY291bnQpOwogICAgICAgICAgb2Zmc2V0ICs9IGNvdW50ICogNDsKICAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgICAgfSwKICAgICAgICBjb2xvcjogZnVuY3Rpb24oZGVjb2RlZEdlb21ldHJ5LCBkYXRhLCBvZmZzZXQpIHsKICAgICAgICAgIGNvbnN0IGNvdW50ID0gZGVjb2RlZEdlb21ldHJ5LnZlcnRleENvdW50ICogNDsKICAgICAgICAgIGRlY29kZWRHZW9tZXRyeS5jb2xvcnMgPSBuZXcgVWludDhBcnJheShkYXRhLCBvZmZzZXQsIGNvdW50KTsKICAgICAgICAgIG9mZnNldCArPSBjb3VudDsKICAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgICAgfSwKICAgICAgICBmZWF0dXJlSWQ6IGZ1bmN0aW9uKGRlY29kZWRHZW9tZXRyeSwgZGF0YSwgb2Zmc2V0KSB7CiAgICAgICAgICBjb25zdCBjb3VudCA9IGRlY29kZWRHZW9tZXRyeS5mZWF0dXJlQ291bnQ7CiAgICAgICAgICBvZmZzZXQgKz0gY291bnQgKiA4OwogICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICAgICB9LAogICAgICAgIGlkOiBmdW5jdGlvbihkZWNvZGVkR2VvbWV0cnksIGRhdGEsIG9mZnNldCkgewogICAgICAgICAgY29uc3QgY291bnQgPSBkZWNvZGVkR2VvbWV0cnkuZmVhdHVyZUNvdW50OwogICAgICAgICAgb2Zmc2V0ICs9IGNvdW50ICogODsKICAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgICAgfSwKICAgICAgICBmYWNlUmFuZ2U6IGZ1bmN0aW9uKGRlY29kZWRHZW9tZXRyeSwgZGF0YSwgb2Zmc2V0KSB7CiAgICAgICAgICBjb25zdCBjb3VudCA9IGRlY29kZWRHZW9tZXRyeS5mZWF0dXJlQ291bnQgKiAyOwogICAgICAgICAgZGVjb2RlZEdlb21ldHJ5LmZhY2VSYW5nZSA9IG5ldyBVaW50MzJBcnJheShkYXRhLCBvZmZzZXQsIGNvdW50KTsKICAgICAgICAgIG9mZnNldCArPSBjb3VudCAqIDQ7CiAgICAgICAgICByZXR1cm4gb2Zmc2V0OwogICAgICAgIH0sCiAgICAgICAgdXZSZWdpb246IGZ1bmN0aW9uKGRlY29kZWRHZW9tZXRyeSwgZGF0YSwgb2Zmc2V0KSB7CiAgICAgICAgICBjb25zdCBjb3VudCA9IGRlY29kZWRHZW9tZXRyeS52ZXJ0ZXhDb3VudCAqIDQ7CiAgICAgICAgICBkZWNvZGVkR2VvbWV0cnlbInV2LXJlZ2lvbiJdID0gbmV3IFVpbnQxNkFycmF5KGRhdGEsIG9mZnNldCwgY291bnQpOwogICAgICAgICAgb2Zmc2V0ICs9IGNvdW50ICogMjsKICAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgICAgfSwKICAgICAgICByZWdpb246IGZ1bmN0aW9uKGRlY29kZWRHZW9tZXRyeSwgZGF0YSwgb2Zmc2V0KSB7CiAgICAgICAgICBjb25zdCBjb3VudCA9IGRlY29kZWRHZW9tZXRyeS52ZXJ0ZXhDb3VudCAqIDQ7CiAgICAgICAgICBkZWNvZGVkR2VvbWV0cnlbInV2LXJlZ2lvbiJdID0gbmV3IFVpbnQxNkFycmF5KGRhdGEsIG9mZnNldCwgY291bnQpOwogICAgICAgICAgb2Zmc2V0ICs9IGNvdW50ICogMjsKICAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgICAgfQogICAgICB9OwogICAgICBkZWNvZGVJM1NfZGVmYXVsdCA9IGNyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXJfZGVmYXVsdChkZWNvZGVJM1MpOwogICAgfQogIH0pOwoKICAvLyBub2RlX21vZHVsZXMvQGNlc2l1bS93YXNtLXNwbGF0cy93YXNtX3NwbGF0cy5qcwogIGZ1bmN0aW9uIGdldFVpbnQ4QXJyYXlNZW1vcnkwKCkgewogICAgaWYgKGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwID09PSBudWxsIHx8IGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwLmJ5dGVMZW5ndGggPT09IDApIHsKICAgICAgY2FjaGVkVWludDhBcnJheU1lbW9yeTAgPSBuZXcgVWludDhBcnJheSh3YXNtLm1lbW9yeS5idWZmZXIpOwogICAgfQogICAgcmV0dXJuIGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwOwogIH0KICBmdW5jdGlvbiBnZXRTdHJpbmdGcm9tV2FzbTAocHRyLCBsZW4pIHsKICAgIHB0ciA9IHB0ciA+Pj4gMDsKICAgIHJldHVybiBjYWNoZWRUZXh0RGVjb2Rlci5kZWNvZGUoZ2V0VWludDhBcnJheU1lbW9yeTAoKS5zdWJhcnJheShwdHIsIHB0ciArIGxlbikpOwogIH0KICBmdW5jdGlvbiBnZXRVaW50MzJBcnJheU1lbW9yeTAoKSB7CiAgICBpZiAoY2FjaGVkVWludDMyQXJyYXlNZW1vcnkwID09PSBudWxsIHx8IGNhY2hlZFVpbnQzMkFycmF5TWVtb3J5MC5ieXRlTGVuZ3RoID09PSAwKSB7CiAgICAgIGNhY2hlZFVpbnQzMkFycmF5TWVtb3J5MCA9IG5ldyBVaW50MzJBcnJheSh3YXNtLm1lbW9yeS5idWZmZXIpOwogICAgfQogICAgcmV0dXJuIGNhY2hlZFVpbnQzMkFycmF5TWVtb3J5MDsKICB9CiAgZnVuY3Rpb24gZ2V0QXJyYXlVMzJGcm9tV2FzbTAocHRyLCBsZW4pIHsKICAgIHB0ciA9IHB0ciA+Pj4gMDsKICAgIHJldHVybiBnZXRVaW50MzJBcnJheU1lbW9yeTAoKS5zdWJhcnJheShwdHIgLyA0LCBwdHIgLyA0ICsgbGVuKTsKICB9CiAgZnVuY3Rpb24gcGFzc0FycmF5MzJUb1dhc20wKGFyZywgbWFsbG9jKSB7CiAgICBjb25zdCBwdHIgPSBtYWxsb2MoYXJnLmxlbmd0aCAqIDQsIDQpID4+PiAwOwogICAgZ2V0VWludDMyQXJyYXlNZW1vcnkwKCkuc2V0KGFyZywgcHRyIC8gNCk7CiAgICBXQVNNX1ZFQ1RPUl9MRU4gPSBhcmcubGVuZ3RoOwogICAgcmV0dXJuIHB0cjsKICB9CiAgZnVuY3Rpb24gdGFrZUZyb21FeHRlcm5yZWZUYWJsZTAoaWR4KSB7CiAgICBjb25zdCB2YWx1ZSA9IHdhc20uX193YmluZGdlbl9leHBvcnRfMC5nZXQoaWR4KTsKICAgIHdhc20uX19leHRlcm5yZWZfdGFibGVfZGVhbGxvYyhpZHgpOwogICAgcmV0dXJuIHZhbHVlOwogIH0KICBmdW5jdGlvbiBnZW5lcmF0ZV9zcGxhdF90ZXh0dXJlKHBvc2l0aW9ucywgc2NhbGVzLCByb3RhdGlvbnMsIGNvbG9ycywgY291bnQpIHsKICAgIGNvbnN0IHJldCA9IHdhc20uZ2VuZXJhdGVfc3BsYXRfdGV4dHVyZShwb3NpdGlvbnMsIHNjYWxlcywgcm90YXRpb25zLCBjb2xvcnMsIGNvdW50KTsKICAgIGlmIChyZXRbMl0pIHsKICAgICAgdGhyb3cgdGFrZUZyb21FeHRlcm5yZWZUYWJsZTAocmV0WzFdKTsKICAgIH0KICAgIHJldHVybiBUZXh0dXJlRGF0YS5fX3dyYXAocmV0WzBdKTsKICB9CiAgZnVuY3Rpb24gcmFkaXhfc29ydF9nYXVzc2lhbnNfaW5kZXhlcyhwb3NpdGlvbnNfYXJyLCBtb2RlbF92aWV3X2FyciwgY291bnQpIHsKICAgIGNvbnN0IHJldCA9IHdhc20ucmFkaXhfc29ydF9nYXVzc2lhbnNfaW5kZXhlcyhwb3NpdGlvbnNfYXJyLCBtb2RlbF92aWV3X2FyciwgY291bnQpOwogICAgaWYgKHJldFsyXSkgewogICAgICB0aHJvdyB0YWtlRnJvbUV4dGVybnJlZlRhYmxlMChyZXRbMV0pOwogICAgfQogICAgcmV0dXJuIHRha2VGcm9tRXh0ZXJucmVmVGFibGUwKHJldFswXSk7CiAgfQogIGFzeW5jIGZ1bmN0aW9uIF9fd2JnX2xvYWQobW9kdWxlLCBpbXBvcnRzKSB7CiAgICBpZiAodHlwZW9mIFJlc3BvbnNlID09PSAiZnVuY3Rpb24iICYmIG1vZHVsZSBpbnN0YW5jZW9mIFJlc3BvbnNlKSB7CiAgICAgIGlmICh0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKG1vZHVsZSwgaW1wb3J0cyk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgaWYgKG1vZHVsZS5oZWFkZXJzLmdldCgiQ29udGVudC1UeXBlIikgIT0gImFwcGxpY2F0aW9uL3dhc20iKSB7CiAgICAgICAgICAgIGNvbnNvbGUud2FybigiYFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nYCBmYWlsZWQgYmVjYXVzZSB5b3VyIHNlcnZlciBkb2VzIG5vdCBzZXJ2ZSBXYXNtIHdpdGggYGFwcGxpY2F0aW9uL3dhc21gIE1JTUUgdHlwZS4gRmFsbGluZyBiYWNrIHRvIGBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZWAgd2hpY2ggaXMgc2xvd2VyLiBPcmlnaW5hbCBlcnJvcjpcbiIsIGUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgYnl0ZXMgPSBhd2FpdCBtb2R1bGUuYXJyYXlCdWZmZXIoKTsKICAgICAgcmV0dXJuIGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJ5dGVzLCBpbXBvcnRzKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUobW9kdWxlLCBpbXBvcnRzKTsKICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuSW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4geyBpbnN0YW5jZSwgbW9kdWxlIH07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9fd2JnX2dldF9pbXBvcnRzKCkgewogICAgY29uc3QgaW1wb3J0cyA9IHt9OwogICAgaW1wb3J0cy53YmcgPSB7fTsKICAgIGltcG9ydHMud2JnLl9fd2JnX2J1ZmZlcl82MDljYzNlZWU1MWVkMTU4ID0gZnVuY3Rpb24oYXJnMCkgewogICAgICBjb25zdCByZXQgPSBhcmcwLmJ1ZmZlcjsKICAgICAgcmV0dXJuIHJldDsKICAgIH07CiAgICBpbXBvcnRzLndiZy5fX3diZ19sZW5ndGhfM2I0ZjAyMjE4OGFlOGRiNiA9IGZ1bmN0aW9uKGFyZzApIHsKICAgICAgY29uc3QgcmV0ID0gYXJnMC5sZW5ndGg7CiAgICAgIHJldHVybiByZXQ7CiAgICB9OwogICAgaW1wb3J0cy53YmcuX193YmdfbGVuZ3RoX2E0NDYxOTNkYzIyYzEyZjggPSBmdW5jdGlvbihhcmcwKSB7CiAgICAgIGNvbnN0IHJldCA9IGFyZzAubGVuZ3RoOwogICAgICByZXR1cm4gcmV0OwogICAgfTsKICAgIGltcG9ydHMud2JnLl9fd2JnX25ld183ODBhYmVlNWMxNzM5ZmQ3ID0gZnVuY3Rpb24oYXJnMCkgewogICAgICBjb25zdCByZXQgPSBuZXcgRmxvYXQzMkFycmF5KGFyZzApOwogICAgICByZXR1cm4gcmV0OwogICAgfTsKICAgIGltcG9ydHMud2JnLl9fd2JnX25ld19hMTIwMDJhN2Y5MWM3NWJlID0gZnVuY3Rpb24oYXJnMCkgewogICAgICBjb25zdCByZXQgPSBuZXcgVWludDhBcnJheShhcmcwKTsKICAgICAgcmV0dXJuIHJldDsKICAgIH07CiAgICBpbXBvcnRzLndiZy5fX3diZ19uZXdfZTNiMzIxZGNmZWY4OWZjNyA9IGZ1bmN0aW9uKGFyZzApIHsKICAgICAgY29uc3QgcmV0ID0gbmV3IFVpbnQzMkFycmF5KGFyZzApOwogICAgICByZXR1cm4gcmV0OwogICAgfTsKICAgIGltcG9ydHMud2JnLl9fd2JnX25ld3dpdGhieXRlb2Zmc2V0YW5kbGVuZ3RoX2YxZGVhZDQ0ZDFmYzcyMTIgPSBmdW5jdGlvbihhcmcwLCBhcmcxLCBhcmcyKSB7CiAgICAgIGNvbnN0IHJldCA9IG5ldyBVaW50MzJBcnJheShhcmcwLCBhcmcxID4+PiAwLCBhcmcyID4+PiAwKTsKICAgICAgcmV0dXJuIHJldDsKICAgIH07CiAgICBpbXBvcnRzLndiZy5fX3diZ19zZXRfMTBiYWQ5YmVlMGU5YzU4YiA9IGZ1bmN0aW9uKGFyZzAsIGFyZzEsIGFyZzIpIHsKICAgICAgYXJnMC5zZXQoYXJnMSwgYXJnMiA+Pj4gMCk7CiAgICB9OwogICAgaW1wb3J0cy53YmcuX193Ymdfc2V0XzY1NTk1YmRkODY4YjMwMDkgPSBmdW5jdGlvbihhcmcwLCBhcmcxLCBhcmcyKSB7CiAgICAgIGFyZzAuc2V0KGFyZzEsIGFyZzIgPj4+IDApOwogICAgfTsKICAgIGltcG9ydHMud2JnLl9fd2JpbmRnZW5faW5pdF9leHRlcm5yZWZfdGFibGUgPSBmdW5jdGlvbigpIHsKICAgICAgY29uc3QgdGFibGUgPSB3YXNtLl9fd2JpbmRnZW5fZXhwb3J0XzA7CiAgICAgIGNvbnN0IG9mZnNldCA9IHRhYmxlLmdyb3coNCk7CiAgICAgIHRhYmxlLnNldCgwLCB2b2lkIDApOwogICAgICB0YWJsZS5zZXQob2Zmc2V0ICsgMCwgdm9pZCAwKTsKICAgICAgdGFibGUuc2V0KG9mZnNldCArIDEsIG51bGwpOwogICAgICB0YWJsZS5zZXQob2Zmc2V0ICsgMiwgdHJ1ZSk7CiAgICAgIHRhYmxlLnNldChvZmZzZXQgKyAzLCBmYWxzZSk7CiAgICAgIDsKICAgIH07CiAgICBpbXBvcnRzLndiZy5fX3diaW5kZ2VuX21lbW9yeSA9IGZ1bmN0aW9uKCkgewogICAgICBjb25zdCByZXQgPSB3YXNtLm1lbW9yeTsKICAgICAgcmV0dXJuIHJldDsKICAgIH07CiAgICBpbXBvcnRzLndiZy5fX3diaW5kZ2VuX3N0cmluZ19uZXcgPSBmdW5jdGlvbihhcmcwLCBhcmcxKSB7CiAgICAgIGNvbnN0IHJldCA9IGdldFN0cmluZ0Zyb21XYXNtMChhcmcwLCBhcmcxKTsKICAgICAgcmV0dXJuIHJldDsKICAgIH07CiAgICBpbXBvcnRzLndiZy5fX3diaW5kZ2VuX3Rocm93ID0gZnVuY3Rpb24oYXJnMCwgYXJnMSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsIGFyZzEpKTsKICAgIH07CiAgICByZXR1cm4gaW1wb3J0czsKICB9CiAgZnVuY3Rpb24gX193YmdfaW5pdF9tZW1vcnkoaW1wb3J0cywgbWVtb3J5KSB7CiAgfQogIGZ1bmN0aW9uIF9fd2JnX2ZpbmFsaXplX2luaXQoaW5zdGFuY2UsIG1vZHVsZSkgewogICAgd2FzbSA9IGluc3RhbmNlLmV4cG9ydHM7CiAgICBfX3diZ19pbml0Ll9fd2JpbmRnZW5fd2FzbV9tb2R1bGUgPSBtb2R1bGU7CiAgICBjYWNoZWRVaW50MzJBcnJheU1lbW9yeTAgPSBudWxsOwogICAgY2FjaGVkVWludDhBcnJheU1lbW9yeTAgPSBudWxsOwogICAgd2FzbS5fX3diaW5kZ2VuX3N0YXJ0KCk7CiAgICByZXR1cm4gd2FzbTsKICB9CiAgZnVuY3Rpb24gaW5pdFN5bmMobW9kdWxlKSB7CiAgICBpZiAod2FzbSAhPT0gdm9pZCAwKSByZXR1cm4gd2FzbTsKICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAidW5kZWZpbmVkIikgewogICAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZHVsZSkgPT09IE9iamVjdC5wcm90b3R5cGUpIHsKICAgICAgICAoeyBtb2R1bGUgfSA9IG1vZHVsZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc29sZS53YXJuKCJ1c2luZyBkZXByZWNhdGVkIHBhcmFtZXRlcnMgZm9yIGBpbml0U3luYygpYDsgcGFzcyBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCIpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBpbXBvcnRzID0gX193YmdfZ2V0X2ltcG9ydHMoKTsKICAgIF9fd2JnX2luaXRfbWVtb3J5KGltcG9ydHMpOwogICAgaWYgKCEobW9kdWxlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlKSkgewogICAgICBtb2R1bGUgPSBuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKG1vZHVsZSk7CiAgICB9CiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShtb2R1bGUsIGltcG9ydHMpOwogICAgcmV0dXJuIF9fd2JnX2ZpbmFsaXplX2luaXQoaW5zdGFuY2UsIG1vZHVsZSk7CiAgfQogIGFzeW5jIGZ1bmN0aW9uIF9fd2JnX2luaXQobW9kdWxlX29yX3BhdGgpIHsKICAgIGlmICh3YXNtICE9PSB2b2lkIDApIHJldHVybiB3YXNtOwogICAgaWYgKHR5cGVvZiBtb2R1bGVfb3JfcGF0aCAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2R1bGVfb3JfcGF0aCkgPT09IE9iamVjdC5wcm90b3R5cGUpIHsKICAgICAgICAoeyBtb2R1bGVfb3JfcGF0aCB9ID0gbW9kdWxlX29yX3BhdGgpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnNvbGUud2FybigidXNpbmcgZGVwcmVjYXRlZCBwYXJhbWV0ZXJzIGZvciB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb247IHBhc3MgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQiKTsKICAgICAgfQogICAgfQogICAgaWYgKHR5cGVvZiBtb2R1bGVfb3JfcGF0aCA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgbW9kdWxlX29yX3BhdGggPSBuZXcgVVJMKCJ3YXNtX3NwbGF0c19iZy53YXNtIiwgaW1wb3J0X21ldGEyLnVybCk7CiAgICB9CiAgICBjb25zdCBpbXBvcnRzID0gX193YmdfZ2V0X2ltcG9ydHMoKTsKICAgIGlmICh0eXBlb2YgbW9kdWxlX29yX3BhdGggPT09ICJzdHJpbmciIHx8IHR5cGVvZiBSZXF1ZXN0ID09PSAiZnVuY3Rpb24iICYmIG1vZHVsZV9vcl9wYXRoIGluc3RhbmNlb2YgUmVxdWVzdCB8fCB0eXBlb2YgVVJMID09PSAiZnVuY3Rpb24iICYmIG1vZHVsZV9vcl9wYXRoIGluc3RhbmNlb2YgVVJMKSB7CiAgICAgIG1vZHVsZV9vcl9wYXRoID0gZmV0Y2gobW9kdWxlX29yX3BhdGgpOwogICAgfQogICAgX193YmdfaW5pdF9tZW1vcnkoaW1wb3J0cyk7CiAgICBjb25zdCB7IGluc3RhbmNlLCBtb2R1bGUgfSA9IGF3YWl0IF9fd2JnX2xvYWQoYXdhaXQgbW9kdWxlX29yX3BhdGgsIGltcG9ydHMpOwogICAgcmV0dXJuIF9fd2JnX2ZpbmFsaXplX2luaXQoaW5zdGFuY2UsIG1vZHVsZSk7CiAgfQogIHZhciBpbXBvcnRfbWV0YTIsIHdhc20sIGNhY2hlZFRleHREZWNvZGVyLCBjYWNoZWRVaW50OEFycmF5TWVtb3J5MCwgY2FjaGVkVWludDMyQXJyYXlNZW1vcnkwLCBXQVNNX1ZFQ1RPUl9MRU4sIFRleHR1cmVEYXRhRmluYWxpemF0aW9uLCBUZXh0dXJlRGF0YTsKICB2YXIgaW5pdF93YXNtX3NwbGF0cyA9IF9fZXNtKHsKICAgICJub2RlX21vZHVsZXMvQGNlc2l1bS93YXNtLXNwbGF0cy93YXNtX3NwbGF0cy5qcyIoKSB7CiAgICAgIGltcG9ydF9tZXRhMiA9IHt9OwogICAgICBjYWNoZWRUZXh0RGVjb2RlciA9IHR5cGVvZiBUZXh0RGVjb2RlciAhPT0gInVuZGVmaW5lZCIgPyBuZXcgVGV4dERlY29kZXIoInV0Zi04IiwgeyBpZ25vcmVCT006IHRydWUsIGZhdGFsOiB0cnVlIH0pIDogeyBkZWNvZGU6ICgpID0+IHsKICAgICAgICB0aHJvdyBFcnJvcigiVGV4dERlY29kZXIgbm90IGF2YWlsYWJsZSIpOwogICAgICB9IH07CiAgICAgIGlmICh0eXBlb2YgVGV4dERlY29kZXIgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgY2FjaGVkVGV4dERlY29kZXIuZGVjb2RlKCk7CiAgICAgIH0KICAgICAgY2FjaGVkVWludDhBcnJheU1lbW9yeTAgPSBudWxsOwogICAgICBjYWNoZWRVaW50MzJBcnJheU1lbW9yeTAgPSBudWxsOwogICAgICBXQVNNX1ZFQ1RPUl9MRU4gPSAwOwogICAgICBUZXh0dXJlRGF0YUZpbmFsaXphdGlvbiA9IHR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeSA9PT0gInVuZGVmaW5lZCIgPyB7IHJlZ2lzdGVyOiAoKSA9PiB7CiAgICAgIH0sIHVucmVnaXN0ZXI6ICgpID0+IHsKICAgICAgfSB9IDogbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChwdHIpID0+IHdhc20uX193YmdfdGV4dHVyZWRhdGFfZnJlZShwdHIgPj4+IDAsIDEpKTsKICAgICAgVGV4dHVyZURhdGEgPSBjbGFzcyBfVGV4dHVyZURhdGEgewogICAgICAgIHN0YXRpYyBfX3dyYXAocHRyKSB7CiAgICAgICAgICBwdHIgPSBwdHIgPj4+IDA7CiAgICAgICAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKF9UZXh0dXJlRGF0YS5wcm90b3R5cGUpOwogICAgICAgICAgb2JqLl9fd2JnX3B0ciA9IHB0cjsKICAgICAgICAgIFRleHR1cmVEYXRhRmluYWxpemF0aW9uLnJlZ2lzdGVyKG9iaiwgb2JqLl9fd2JnX3B0ciwgb2JqKTsKICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgfQogICAgICAgIF9fZGVzdHJveV9pbnRvX3JhdygpIHsKICAgICAgICAgIGNvbnN0IHB0ciA9IHRoaXMuX193YmdfcHRyOwogICAgICAgICAgdGhpcy5fX3diZ19wdHIgPSAwOwogICAgICAgICAgVGV4dHVyZURhdGFGaW5hbGl6YXRpb24udW5yZWdpc3Rlcih0aGlzKTsKICAgICAgICAgIHJldHVybiBwdHI7CiAgICAgICAgfQogICAgICAgIGZyZWUoKSB7CiAgICAgICAgICBjb25zdCBwdHIgPSB0aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpOwogICAgICAgICAgd2FzbS5fX3diZ190ZXh0dXJlZGF0YV9mcmVlKHB0ciwgMCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHRlciBmb3IgdGhlIHVuZGVybHlpbmcgdGV4dHVyZSBkYXRhLiBBbHdheXMgcmV0dXJucyBhIGNvcHkuCiAgICAgICAgICogQHJldHVybnMge1VpbnQzMkFycmF5fQogICAgICAgICAqLwogICAgICAgIGdldCBkYXRhKCkgewogICAgICAgICAgY29uc3QgcmV0ID0gd2FzbS50ZXh0dXJlZGF0YV9kYXRhKHRoaXMuX193YmdfcHRyKTsKICAgICAgICAgIHZhciB2MTIgPSBnZXRBcnJheVUzMkZyb21XYXNtMChyZXRbMF0sIHJldFsxXSkuc2xpY2UoKTsKICAgICAgICAgIHdhc20uX193YmluZGdlbl9mcmVlKHJldFswXSwgcmV0WzFdICogNCwgNCk7CiAgICAgICAgICByZXR1cm4gdjEyOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXR0ZXIgZm9yIHRoZSB3aWR0aCBvZiB0aGUgdGV4dHVyZSBpbiBwaXhlbHMuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0KICAgICAgICAgKi8KICAgICAgICBnZXQgd2lkdGgoKSB7CiAgICAgICAgICBjb25zdCByZXQgPSB3YXNtLnRleHR1cmVkYXRhX3dpZHRoKHRoaXMuX193YmdfcHRyKTsKICAgICAgICAgIHJldHVybiByZXQgPj4+IDA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHRlciBmb3IgdGhlIGhlaWdodCBvZiB0aGUgdGV4dHVyZSBpbiBwaXhlbHMuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0KICAgICAgICAgKi8KICAgICAgICBnZXQgaGVpZ2h0KCkgewogICAgICAgICAgY29uc3QgcmV0ID0gd2FzbS50ZXh0dXJlZGF0YV9oZWlnaHQodGhpcy5fX3diZ19wdHIpOwogICAgICAgICAgcmV0dXJuIHJldCA+Pj4gMDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIG5ldyB0ZXh0dXJlIGRhdGEgb2JqZWN0IHdpdGggdGhlIHVuZGVybHlpbmcgZGF0YSwgd2lkdGgsIGFuZCBoZWlnaHQuCiAgICAgICAgICogQHBhcmFtIHtVaW50MzJBcnJheX0gZGF0YQogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aAogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQKICAgICAgICAgKiBAcmV0dXJucyB7VGV4dHVyZURhdGF9CiAgICAgICAgICovCiAgICAgICAgc3RhdGljIG5ldyhkYXRhLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICBjb25zdCBwdHIwID0gcGFzc0FycmF5MzJUb1dhc20wKGRhdGEsIHdhc20uX193YmluZGdlbl9tYWxsb2MpOwogICAgICAgICAgY29uc3QgbGVuMCA9IFdBU01fVkVDVE9SX0xFTjsKICAgICAgICAgIGNvbnN0IHJldCA9IHdhc20udGV4dHVyZWRhdGFfbmV3KHB0cjAsIGxlbjAsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgcmV0dXJuIF9UZXh0dXJlRGF0YS5fX3dyYXAocmV0KTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9nYXVzc2lhblNwbGF0U29ydGVyLmpzCiAgdmFyIGdhdXNzaWFuU3BsYXRTb3J0ZXJfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KGdhdXNzaWFuU3BsYXRTb3J0ZXJfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gZ2F1c3NpYW5TcGxhdFNvcnRlcl9kZWZhdWx0CiAgfSk7CiAgYXN5bmMgZnVuY3Rpb24gaW5pdFdvcmtlcjMocGFyYW1ldGVycywgdHJhbnNmZXJhYmxlT2JqZWN0cykgewogICAgY29uc3Qgd2FzbUNvbmZpZyA9IHBhcmFtZXRlcnMud2ViQXNzZW1ibHlDb25maWc7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHdhc21Db25maWcpICYmIGRlZmluZWRfZGVmYXVsdCh3YXNtQ29uZmlnLndhc21CaW5hcnkpKSB7CiAgICAgIGluaXRTeW5jKHsgbW9kdWxlOiB3YXNtQ29uZmlnLndhc21CaW5hcnkgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KICBmdW5jdGlvbiBnZW5lcmF0ZUdhdXNzaWFuU29ydFdvcmtlcihwYXJhbWV0ZXJzLCB0cmFuc2ZlcmFibGVPYmplY3RzKSB7CiAgICBjb25zdCB3YXNtQ29uZmlnID0gcGFyYW1ldGVycy53ZWJBc3NlbWJseUNvbmZpZzsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQod2FzbUNvbmZpZykpIHsKICAgICAgcmV0dXJuIGluaXRXb3JrZXIzKHBhcmFtZXRlcnMsIHRyYW5zZmVyYWJsZU9iamVjdHMpOwogICAgfQogICAgY29uc3QgeyBwcmltaXRpdmUsIHNvcnRUeXBlIH0gPSBwYXJhbWV0ZXJzOwogICAgaWYgKHNvcnRUeXBlID09PSAiSW5kZXgiKSB7CiAgICAgIHJldHVybiByYWRpeF9zb3J0X2dhdXNzaWFuc19pbmRleGVzKAogICAgICAgIHByaW1pdGl2ZS5wb3NpdGlvbnMsCiAgICAgICAgcHJpbWl0aXZlLm1vZGVsVmlldywKICAgICAgICBwcmltaXRpdmUuY291bnQKICAgICAgKTsKICAgIH0KICB9CiAgdmFyIGdhdXNzaWFuU3BsYXRTb3J0ZXJfZGVmYXVsdDsKICB2YXIgaW5pdF9nYXVzc2lhblNwbGF0U29ydGVyID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9nYXVzc2lhblNwbGF0U29ydGVyLmpzIigpIHsKICAgICAgaW5pdF9jcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X3dhc21fc3BsYXRzKCk7CiAgICAgIGdhdXNzaWFuU3BsYXRTb3J0ZXJfZGVmYXVsdCA9IGNyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXJfZGVmYXVsdChnZW5lcmF0ZUdhdXNzaWFuU29ydFdvcmtlcik7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9nYXVzc2lhblNwbGF0VGV4dHVyZUdlbmVyYXRvci5qcwogIHZhciBnYXVzc2lhblNwbGF0VGV4dHVyZUdlbmVyYXRvcl9leHBvcnRzID0ge307CiAgX19leHBvcnQoZ2F1c3NpYW5TcGxhdFRleHR1cmVHZW5lcmF0b3JfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gZ2F1c3NpYW5TcGxhdFRleHR1cmVHZW5lcmF0b3JfZGVmYXVsdAogIH0pOwogIGFzeW5jIGZ1bmN0aW9uIGluaXRXb3JrZXI0KHBhcmFtZXRlcnMsIHRyYW5zZmVyYWJsZU9iamVjdHMpIHsKICAgIGNvbnN0IHdhc21Db25maWcgPSBwYXJhbWV0ZXJzLndlYkFzc2VtYmx5Q29uZmlnOwogICAgaWYgKGRlZmluZWRfZGVmYXVsdCh3YXNtQ29uZmlnKSAmJiBkZWZpbmVkX2RlZmF1bHQod2FzbUNvbmZpZy53YXNtQmluYXJ5KSkgewogICAgICBpbml0U3luYyh7IG1vZHVsZTogd2FzbUNvbmZpZy53YXNtQmluYXJ5IH0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTcGxhdFRleHR1cmVXb3JrZXIocGFyYW1ldGVycywgdHJhbnNmZXJhYmxlT2JqZWN0cykgewogICAgY29uc3Qgd2FzbUNvbmZpZyA9IHBhcmFtZXRlcnMud2ViQXNzZW1ibHlDb25maWc7CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHdhc21Db25maWcpKSB7CiAgICAgIHJldHVybiBpbml0V29ya2VyNChwYXJhbWV0ZXJzLCB0cmFuc2ZlcmFibGVPYmplY3RzKTsKICAgIH0KICAgIGNvbnN0IHsgYXR0cmlidXRlcywgY291bnQgfSA9IHBhcmFtZXRlcnM7CiAgICBjb25zdCByZXN1bHQgPSBnZW5lcmF0ZV9zcGxhdF90ZXh0dXJlKAogICAgICBhdHRyaWJ1dGVzLnBvc2l0aW9ucywKICAgICAgYXR0cmlidXRlcy5zY2FsZXMsCiAgICAgIGF0dHJpYnV0ZXMucm90YXRpb25zLAogICAgICBhdHRyaWJ1dGVzLmNvbG9ycywKICAgICAgY291bnQKICAgICk7CiAgICByZXR1cm4gewogICAgICBkYXRhOiByZXN1bHQuZGF0YSwKICAgICAgd2lkdGg6IHJlc3VsdC53aWR0aCwKICAgICAgaGVpZ2h0OiByZXN1bHQuaGVpZ2h0CiAgICB9OwogIH0KICB2YXIgZ2F1c3NpYW5TcGxhdFRleHR1cmVHZW5lcmF0b3JfZGVmYXVsdDsKICB2YXIgaW5pdF9nYXVzc2lhblNwbGF0VGV4dHVyZUdlbmVyYXRvciA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvZ2F1c3NpYW5TcGxhdFRleHR1cmVHZW5lcmF0b3IuanMiKCkgewogICAgICBpbml0X2NyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXIoKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfd2FzbV9zcGxhdHMoKTsKICAgICAgZ2F1c3NpYW5TcGxhdFRleHR1cmVHZW5lcmF0b3JfZGVmYXVsdCA9IGNyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXJfZGVmYXVsdChnZW5lcmF0ZVNwbGF0VGV4dHVyZVdvcmtlcik7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvUmVuZGVyZXIvUGl4ZWxEYXRhdHlwZS5qcwogIHZhciBQaXhlbERhdGF0eXBlLCBQaXhlbERhdGF0eXBlX2RlZmF1bHQ7CiAgdmFyIGluaXRfUGl4ZWxEYXRhdHlwZSA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL1JlbmRlcmVyL1BpeGVsRGF0YXR5cGUuanMiKCkgewogICAgICBpbml0X1dlYkdMQ29uc3RhbnRzKCk7CiAgICAgIFBpeGVsRGF0YXR5cGUgPSB7CiAgICAgICAgVU5TSUdORURfQllURTogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5VTlNJR05FRF9CWVRFLAogICAgICAgIFVOU0lHTkVEX1NIT1JUOiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlVOU0lHTkVEX1NIT1JULAogICAgICAgIFVOU0lHTkVEX0lOVDogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5VTlNJR05FRF9JTlQsCiAgICAgICAgRkxPQVQ6IFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuRkxPQVQsCiAgICAgICAgSEFMRl9GTE9BVDogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5IQUxGX0ZMT0FUX09FUywKICAgICAgICBVTlNJR05FRF9JTlRfMjRfODogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5VTlNJR05FRF9JTlRfMjRfOCwKICAgICAgICBVTlNJR05FRF9TSE9SVF80XzRfNF80OiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlVOU0lHTkVEX1NIT1JUXzRfNF80XzQsCiAgICAgICAgVU5TSUdORURfU0hPUlRfNV81XzVfMTogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5VTlNJR05FRF9TSE9SVF81XzVfNV8xLAogICAgICAgIFVOU0lHTkVEX1NIT1JUXzVfNl81OiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlVOU0lHTkVEX1NIT1JUXzVfNl81CiAgICAgIH07CiAgICAgIFBpeGVsRGF0YXR5cGUudG9XZWJHTENvbnN0YW50ID0gZnVuY3Rpb24ocGl4ZWxEYXRhdHlwZSwgY29udGV4dCkgewogICAgICAgIHN3aXRjaCAocGl4ZWxEYXRhdHlwZSkgewogICAgICAgICAgY2FzZSBQaXhlbERhdGF0eXBlLlVOU0lHTkVEX0JZVEU6CiAgICAgICAgICAgIHJldHVybiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlVOU0lHTkVEX0JZVEU7CiAgICAgICAgICBjYXNlIFBpeGVsRGF0YXR5cGUuVU5TSUdORURfU0hPUlQ6CiAgICAgICAgICAgIHJldHVybiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlVOU0lHTkVEX1NIT1JUOwogICAgICAgICAgY2FzZSBQaXhlbERhdGF0eXBlLlVOU0lHTkVEX0lOVDoKICAgICAgICAgICAgcmV0dXJuIFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuVU5TSUdORURfSU5UOwogICAgICAgICAgY2FzZSBQaXhlbERhdGF0eXBlLkZMT0FUOgogICAgICAgICAgICByZXR1cm4gV2ViR0xDb25zdGFudHNfZGVmYXVsdC5GTE9BVDsKICAgICAgICAgIGNhc2UgUGl4ZWxEYXRhdHlwZS5IQUxGX0ZMT0FUOgogICAgICAgICAgICByZXR1cm4gY29udGV4dC53ZWJnbDIgPyBXZWJHTENvbnN0YW50c19kZWZhdWx0LkhBTEZfRkxPQVQgOiBXZWJHTENvbnN0YW50c19kZWZhdWx0LkhBTEZfRkxPQVRfT0VTOwogICAgICAgICAgY2FzZSBQaXhlbERhdGF0eXBlLlVOU0lHTkVEX0lOVF8yNF84OgogICAgICAgICAgICByZXR1cm4gV2ViR0xDb25zdGFudHNfZGVmYXVsdC5VTlNJR05FRF9JTlRfMjRfODsKICAgICAgICAgIGNhc2UgUGl4ZWxEYXRhdHlwZS5VTlNJR05FRF9TSE9SVF80XzRfNF80OgogICAgICAgICAgICByZXR1cm4gV2ViR0xDb25zdGFudHNfZGVmYXVsdC5VTlNJR05FRF9TSE9SVF80XzRfNF80OwogICAgICAgICAgY2FzZSBQaXhlbERhdGF0eXBlLlVOU0lHTkVEX1NIT1JUXzVfNV81XzE6CiAgICAgICAgICAgIHJldHVybiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlVOU0lHTkVEX1NIT1JUXzVfNV81XzE7CiAgICAgICAgICBjYXNlIFBpeGVsRGF0YXR5cGUuVU5TSUdORURfU0hPUlRfNV82XzU6CiAgICAgICAgICAgIHJldHVybiBQaXhlbERhdGF0eXBlLlVOU0lHTkVEX1NIT1JUXzVfNl81OwogICAgICAgIH0KICAgICAgfTsKICAgICAgUGl4ZWxEYXRhdHlwZS5pc1BhY2tlZCA9IGZ1bmN0aW9uKHBpeGVsRGF0YXR5cGUpIHsKICAgICAgICByZXR1cm4gcGl4ZWxEYXRhdHlwZSA9PT0gUGl4ZWxEYXRhdHlwZS5VTlNJR05FRF9JTlRfMjRfOCB8fCBwaXhlbERhdGF0eXBlID09PSBQaXhlbERhdGF0eXBlLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQgfHwgcGl4ZWxEYXRhdHlwZSA9PT0gUGl4ZWxEYXRhdHlwZS5VTlNJR05FRF9TSE9SVF81XzVfNV8xIHx8IHBpeGVsRGF0YXR5cGUgPT09IFBpeGVsRGF0YXR5cGUuVU5TSUdORURfU0hPUlRfNV82XzU7CiAgICAgIH07CiAgICAgIFBpeGVsRGF0YXR5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbihwaXhlbERhdGF0eXBlKSB7CiAgICAgICAgc3dpdGNoIChwaXhlbERhdGF0eXBlKSB7CiAgICAgICAgICBjYXNlIFBpeGVsRGF0YXR5cGUuVU5TSUdORURfQllURToKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICBjYXNlIFBpeGVsRGF0YXR5cGUuVU5TSUdORURfU0hPUlQ6CiAgICAgICAgICBjYXNlIFBpeGVsRGF0YXR5cGUuVU5TSUdORURfU0hPUlRfNF80XzRfNDoKICAgICAgICAgIGNhc2UgUGl4ZWxEYXRhdHlwZS5VTlNJR05FRF9TSE9SVF81XzVfNV8xOgogICAgICAgICAgY2FzZSBQaXhlbERhdGF0eXBlLlVOU0lHTkVEX1NIT1JUXzVfNl81OgogICAgICAgICAgY2FzZSBQaXhlbERhdGF0eXBlLkhBTEZfRkxPQVQ6CiAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICAgY2FzZSBQaXhlbERhdGF0eXBlLlVOU0lHTkVEX0lOVDoKICAgICAgICAgIGNhc2UgUGl4ZWxEYXRhdHlwZS5GTE9BVDoKICAgICAgICAgIGNhc2UgUGl4ZWxEYXRhdHlwZS5VTlNJR05FRF9JTlRfMjRfODoKICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgfQogICAgICB9OwogICAgICBQaXhlbERhdGF0eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24ocGl4ZWxEYXRhdHlwZSkgewogICAgICAgIHJldHVybiBwaXhlbERhdGF0eXBlID09PSBQaXhlbERhdGF0eXBlLlVOU0lHTkVEX0JZVEUgfHwgcGl4ZWxEYXRhdHlwZSA9PT0gUGl4ZWxEYXRhdHlwZS5VTlNJR05FRF9TSE9SVCB8fCBwaXhlbERhdGF0eXBlID09PSBQaXhlbERhdGF0eXBlLlVOU0lHTkVEX0lOVCB8fCBwaXhlbERhdGF0eXBlID09PSBQaXhlbERhdGF0eXBlLkZMT0FUIHx8IHBpeGVsRGF0YXR5cGUgPT09IFBpeGVsRGF0YXR5cGUuSEFMRl9GTE9BVCB8fCBwaXhlbERhdGF0eXBlID09PSBQaXhlbERhdGF0eXBlLlVOU0lHTkVEX0lOVF8yNF84IHx8IHBpeGVsRGF0YXR5cGUgPT09IFBpeGVsRGF0YXR5cGUuVU5TSUdORURfU0hPUlRfNF80XzRfNCB8fCBwaXhlbERhdGF0eXBlID09PSBQaXhlbERhdGF0eXBlLlVOU0lHTkVEX1NIT1JUXzVfNV81XzEgfHwgcGl4ZWxEYXRhdHlwZSA9PT0gUGl4ZWxEYXRhdHlwZS5VTlNJR05FRF9TSE9SVF81XzZfNTsKICAgICAgfTsKICAgICAgUGl4ZWxEYXRhdHlwZS5nZXRUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBmdW5jdGlvbihwaXhlbERhdGF0eXBlKSB7CiAgICAgICAgY29uc3Qgc2l6ZUluQnl0ZXMgPSBQaXhlbERhdGF0eXBlLnNpemVJbkJ5dGVzKHBpeGVsRGF0YXR5cGUpOwogICAgICAgIGlmIChzaXplSW5CeXRlcyA9PT0gVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCkgewogICAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXk7CiAgICAgICAgfSBlbHNlIGlmIChzaXplSW5CeXRlcyA9PT0gVWludDE2QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpIHsKICAgICAgICAgIHJldHVybiBVaW50MTZBcnJheTsKICAgICAgICB9IGVsc2UgaWYgKHNpemVJbkJ5dGVzID09PSBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgJiYgcGl4ZWxEYXRhdHlwZSA9PT0gUGl4ZWxEYXRhdHlwZS5GTE9BVCkgewogICAgICAgICAgcmV0dXJuIEZsb2F0MzJBcnJheTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFVpbnQzMkFycmF5OwogICAgICB9OwogICAgICBQaXhlbERhdGF0eXBlX2RlZmF1bHQgPSBPYmplY3QuZnJlZXplKFBpeGVsRGF0YXR5cGUpOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvUGl4ZWxGb3JtYXQuanMKICB2YXIgUGl4ZWxGb3JtYXQsIFBpeGVsRm9ybWF0X2RlZmF1bHQ7CiAgdmFyIGluaXRfUGl4ZWxGb3JtYXQgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL1BpeGVsRm9ybWF0LmpzIigpIHsKICAgICAgaW5pdF9QaXhlbERhdGF0eXBlKCk7CiAgICAgIGluaXRfV2ViR0xDb25zdGFudHMoKTsKICAgICAgUGl4ZWxGb3JtYXQgPSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQSBwaXhlbCBmb3JtYXQgY29udGFpbmluZyBhIGRlcHRoIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBERVBUSF9DT01QT05FTlQ6IFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuREVQVEhfQ09NUE9ORU5ULAogICAgICAgIC8qKgogICAgICAgICAqIEEgcGl4ZWwgZm9ybWF0IGNvbnRhaW5pbmcgYSBkZXB0aCBhbmQgc3RlbmNpbCB2YWx1ZSwgbW9zdCBvZnRlbiB1c2VkIHdpdGgge0BsaW5rIFBpeGVsRGF0YXR5cGUuVU5TSUdORURfSU5UXzI0Xzh9LgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBERVBUSF9TVEVOQ0lMOiBXZWJHTENvbnN0YW50c19kZWZhdWx0LkRFUFRIX1NURU5DSUwsCiAgICAgICAgLyoqCiAgICAgICAgICogQSBwaXhlbCBmb3JtYXQgY29udGFpbmluZyBhbiBhbHBoYSBjaGFubmVsLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBBTFBIQTogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5BTFBIQSwKICAgICAgICAvKioKICAgICAgICAgKiBBIHBpeGVsIGZvcm1hdCBjb250YWluaW5nIGEgcmVkIGNoYW5uZWwKICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgUkVEOiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlJFRCwKICAgICAgICAvKioKICAgICAgICAgKiBBIHBpeGVsIGZvcm1hdCBjb250YWluaW5nIHJlZCBhbmQgZ3JlZW4gY2hhbm5lbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFJHOiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlJHLAogICAgICAgIC8qKgogICAgICAgICAqIEEgcGl4ZWwgZm9ybWF0IGNvbnRhaW5pbmcgcmVkLCBncmVlbiwgYW5kIGJsdWUgY2hhbm5lbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFJHQjogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5SR0IsCiAgICAgICAgLyoqCiAgICAgICAgICogQSBwaXhlbCBmb3JtYXQgY29udGFpbmluZyByZWQsIGdyZWVuLCBibHVlLCBhbmQgYWxwaGEgY2hhbm5lbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFJHQkE6IFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuUkdCQSwKICAgICAgICAvKioKICAgICAgICAgKiBBIHBpeGVsIGZvcm1hdCBjb250YWluaW5nIGEgcmVkIGNoYW5uZWwgYXMgYW4gaW50ZWdlci4KICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFJFRF9JTlRFR0VSOiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlJFRF9JTlRFR0VSLAogICAgICAgIC8qKgogICAgICAgICAqIEEgcGl4ZWwgZm9ybWF0IGNvbnRhaW5pbmcgcmVkIGFuZCBncmVlbiBjaGFubmVscyBhcyBpbnRlZ2Vycy4KICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFJHX0lOVEVHRVI6IFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuUkdfSU5URUdFUiwKICAgICAgICAvKioKICAgICAgICAgKiBBIHBpeGVsIGZvcm1hdCBjb250YWluaW5nIHJlZCwgZ3JlZW4sIGFuZCBibHVlIGNoYW5uZWxzIGFzIGludGVnZXJzLgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgUkdCX0lOVEVHRVI6IFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuUkdCX0lOVEVHRVIsCiAgICAgICAgLyoqCiAgICAgICAgICogQSBwaXhlbCBmb3JtYXQgY29udGFpbmluZyByZWQsIGdyZWVuLCBibHVlLCBhbmQgYWxwaGEgY2hhbm5lbHMgYXMgaW50ZWdlcnMuCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBSR0JBX0lOVEVHRVI6IFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuUkdCQV9JTlRFR0VSLAogICAgICAgIC8qKgogICAgICAgICAqIEEgcGl4ZWwgZm9ybWF0IGNvbnRhaW5pbmcgYSBsdW1pbmFuY2UgKGludGVuc2l0eSkgY2hhbm5lbC4KICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgTFVNSU5BTkNFOiBXZWJHTENvbnN0YW50c19kZWZhdWx0LkxVTUlOQU5DRSwKICAgICAgICAvKioKICAgICAgICAgKiBBIHBpeGVsIGZvcm1hdCBjb250YWluaW5nIGx1bWluYW5jZSAoaW50ZW5zaXR5KSBhbmQgYWxwaGEgY2hhbm5lbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIExVTUlOQU5DRV9BTFBIQTogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5MVU1JTkFOQ0VfQUxQSEEsCiAgICAgICAgLyoqCiAgICAgICAgICogQSBwaXhlbCBmb3JtYXQgY29udGFpbmluZyByZWQsIGdyZWVuLCBhbmQgYmx1ZSBjaGFubmVscyB0aGF0IGlzIERYVDEgY29tcHJlc3NlZC4KICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgUkdCX0RYVDE6IFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCwKICAgICAgICAvKioKICAgICAgICAgKiBBIHBpeGVsIGZvcm1hdCBjb250YWluaW5nIHJlZCwgZ3JlZW4sIGJsdWUsIGFuZCBhbHBoYSBjaGFubmVscyB0aGF0IGlzIERYVDEgY29tcHJlc3NlZC4KICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgUkdCQV9EWFQxOiBXZWJHTENvbnN0YW50c19kZWZhdWx0LkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhULAogICAgICAgIC8qKgogICAgICAgICAqIEEgcGl4ZWwgZm9ybWF0IGNvbnRhaW5pbmcgcmVkLCBncmVlbiwgYmx1ZSwgYW5kIGFscGhhIGNoYW5uZWxzIHRoYXQgaXMgRFhUMyBjb21wcmVzc2VkLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBSR0JBX0RYVDM6IFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQsCiAgICAgICAgLyoqCiAgICAgICAgICogQSBwaXhlbCBmb3JtYXQgY29udGFpbmluZyByZWQsIGdyZWVuLCBibHVlLCBhbmQgYWxwaGEgY2hhbm5lbHMgdGhhdCBpcyBEWFQ1IGNvbXByZXNzZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFJHQkFfRFhUNTogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVCwKICAgICAgICAvKioKICAgICAgICAgKiBBIHBpeGVsIGZvcm1hdCBjb250YWluaW5nIHJlZCwgZ3JlZW4sIGFuZCBibHVlIGNoYW5uZWxzIHRoYXQgaXMgUFZSIDRicHAgY29tcHJlc3NlZC4KICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgUkdCX1BWUlRDXzRCUFBWMTogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HLAogICAgICAgIC8qKgogICAgICAgICAqIEEgcGl4ZWwgZm9ybWF0IGNvbnRhaW5pbmcgcmVkLCBncmVlbiwgYW5kIGJsdWUgY2hhbm5lbHMgdGhhdCBpcyBQVlIgMmJwcCBjb21wcmVzc2VkLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBSR0JfUFZSVENfMkJQUFYxOiBXZWJHTENvbnN0YW50c19kZWZhdWx0LkNPTVBSRVNTRURfUkdCX1BWUlRDXzJCUFBWMV9JTUcsCiAgICAgICAgLyoqCiAgICAgICAgICogQSBwaXhlbCBmb3JtYXQgY29udGFpbmluZyByZWQsIGdyZWVuLCBibHVlLCBhbmQgYWxwaGEgY2hhbm5lbHMgdGhhdCBpcyBQVlIgNGJwcCBjb21wcmVzc2VkLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBSR0JBX1BWUlRDXzRCUFBWMTogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRywKICAgICAgICAvKioKICAgICAgICAgKiBBIHBpeGVsIGZvcm1hdCBjb250YWluaW5nIHJlZCwgZ3JlZW4sIGJsdWUsIGFuZCBhbHBoYSBjaGFubmVscyB0aGF0IGlzIFBWUiAyYnBwIGNvbXByZXNzZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFJHQkFfUFZSVENfMkJQUFYxOiBXZWJHTENvbnN0YW50c19kZWZhdWx0LkNPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HLAogICAgICAgIC8qKgogICAgICAgICAqIEEgcGl4ZWwgZm9ybWF0IGNvbnRhaW5pbmcgcmVkLCBncmVlbiwgYmx1ZSwgYW5kIGFscGhhIGNoYW5uZWxzIHRoYXQgaXMgQVNUQyBjb21wcmVzc2VkLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBSR0JBX0FTVEM6IFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuQ09NUFJFU1NFRF9SR0JBX0FTVENfNHg0X1dFQkdMLAogICAgICAgIC8qKgogICAgICAgICAqIEEgcGl4ZWwgZm9ybWF0IGNvbnRhaW5pbmcgcmVkLCBncmVlbiwgYW5kIGJsdWUgY2hhbm5lbHMgdGhhdCBpcyBFVEMxIGNvbXByZXNzZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFJHQl9FVEMxOiBXZWJHTENvbnN0YW50c19kZWZhdWx0LkNPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0wsCiAgICAgICAgLyoqCiAgICAgICAgICogQSBwaXhlbCBmb3JtYXQgY29udGFpbmluZyByZWQsIGdyZWVuLCBhbmQgYmx1ZSBjaGFubmVscyB0aGF0IGlzIEVUQzIgY29tcHJlc3NlZC4KICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGNvbnN0YW50CiAgICAgICAgICovCiAgICAgICAgUkdCOF9FVEMyOiBXZWJHTENvbnN0YW50c19kZWZhdWx0LkNPTVBSRVNTRURfUkdCOF9FVEMyLAogICAgICAgIC8qKgogICAgICAgICAqIEEgcGl4ZWwgZm9ybWF0IGNvbnRhaW5pbmcgcmVkLCBncmVlbiwgYmx1ZSwgYW5kIGFscGhhIGNoYW5uZWxzIHRoYXQgaXMgRVRDMiBjb21wcmVzc2VkLgogICAgICAgICAqCiAgICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICAgKiBAY29uc3RhbnQKICAgICAgICAgKi8KICAgICAgICBSR0JBOF9FVEMyX0VBQzogV2ViR0xDb25zdGFudHNfZGVmYXVsdC5DT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDLAogICAgICAgIC8qKgogICAgICAgICAqIEEgcGl4ZWwgZm9ybWF0IGNvbnRhaW5pbmcgcmVkLCBncmVlbiwgYmx1ZSwgYW5kIGFscGhhIGNoYW5uZWxzIHRoYXQgaXMgQkM3IGNvbXByZXNzZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBjb25zdGFudAogICAgICAgICAqLwogICAgICAgIFJHQkFfQkM3OiBXZWJHTENvbnN0YW50c19kZWZhdWx0LkNPTVBSRVNTRURfUkdCQV9CUFRDX1VOT1JNCiAgICAgIH07CiAgICAgIFBpeGVsRm9ybWF0LmNvbXBvbmVudHNMZW5ndGggPSBmdW5jdGlvbihwaXhlbEZvcm1hdCkgewogICAgICAgIHN3aXRjaCAocGl4ZWxGb3JtYXQpIHsKICAgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQuUkdCOgogICAgICAgICAgY2FzZSBQaXhlbEZvcm1hdC5SR0JfSU5URUdFUjoKICAgICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgICBjYXNlIFBpeGVsRm9ybWF0LlJHQkE6CiAgICAgICAgICBjYXNlIFBpeGVsRm9ybWF0LlJHQkFfSU5URUdFUjoKICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgICBjYXNlIFBpeGVsRm9ybWF0LkxVTUlOQU5DRV9BTFBIQToKICAgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQuUkc6CiAgICAgICAgICBjYXNlIFBpeGVsRm9ybWF0LlJHX0lOVEVHRVI6CiAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICAgY2FzZSBQaXhlbEZvcm1hdC5BTFBIQToKICAgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQuUkVEOgogICAgICAgICAgY2FzZSBQaXhlbEZvcm1hdC5SRURfSU5URUdFUjoKICAgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQuTFVNSU5BTkNFOgogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgfTsKICAgICAgUGl4ZWxGb3JtYXQudmFsaWRhdGUgPSBmdW5jdGlvbihwaXhlbEZvcm1hdCkgewogICAgICAgIHJldHVybiBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuREVQVEhfQ09NUE9ORU5UIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5ERVBUSF9TVEVOQ0lMIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5BTFBIQSB8fCBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuUkVEIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5SRyB8fCBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuUkdCIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5SR0JBIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5SRURfSU5URUdFUiB8fCBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuUkdfSU5URUdFUiB8fCBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuUkdCX0lOVEVHRVIgfHwgcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQkFfSU5URUdFUiB8fCBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuTFVNSU5BTkNFIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5MVU1JTkFOQ0VfQUxQSEEgfHwgcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQl9EWFQxIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5SR0JBX0RYVDEgfHwgcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQkFfRFhUMyB8fCBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuUkdCQV9EWFQ1IHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5SR0JfUFZSVENfNEJQUFYxIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5SR0JfUFZSVENfMkJQUFYxIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5SR0JBX1BWUlRDXzRCUFBWMSB8fCBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuUkdCQV9QVlJUQ18yQlBQVjEgfHwgcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQkFfQVNUQyB8fCBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuUkdCX0VUQzEgfHwgcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQjhfRVRDMiB8fCBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuUkdCQThfRVRDMl9FQUMgfHwgcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQkFfQkM3OwogICAgICB9OwogICAgICBQaXhlbEZvcm1hdC5pc0NvbG9yRm9ybWF0ID0gZnVuY3Rpb24ocGl4ZWxGb3JtYXQpIHsKICAgICAgICByZXR1cm4gcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJFRCB8fCBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuQUxQSEEgfHwgcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQiB8fCBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuUkdCQSB8fCBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuTFVNSU5BTkNFIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5MVU1JTkFOQ0VfQUxQSEE7CiAgICAgIH07CiAgICAgIFBpeGVsRm9ybWF0LmlzRGVwdGhGb3JtYXQgPSBmdW5jdGlvbihwaXhlbEZvcm1hdCkgewogICAgICAgIHJldHVybiBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuREVQVEhfQ09NUE9ORU5UIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5ERVBUSF9TVEVOQ0lMOwogICAgICB9OwogICAgICBQaXhlbEZvcm1hdC5pc0NvbXByZXNzZWRGb3JtYXQgPSBmdW5jdGlvbihwaXhlbEZvcm1hdCkgewogICAgICAgIHJldHVybiBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuUkdCX0RYVDEgfHwgcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQkFfRFhUMSB8fCBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuUkdCQV9EWFQzIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5SR0JBX0RYVDUgfHwgcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQl9QVlJUQ180QlBQVjEgfHwgcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQl9QVlJUQ18yQlBQVjEgfHwgcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQkFfUFZSVENfNEJQUFYxIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5SR0JBX1BWUlRDXzJCUFBWMSB8fCBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuUkdCQV9BU1RDIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5SR0JfRVRDMSB8fCBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuUkdCOF9FVEMyIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5SR0JBOF9FVEMyX0VBQyB8fCBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuUkdCQV9CQzc7CiAgICAgIH07CiAgICAgIFBpeGVsRm9ybWF0LmlzRFhURm9ybWF0ID0gZnVuY3Rpb24ocGl4ZWxGb3JtYXQpIHsKICAgICAgICByZXR1cm4gcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQl9EWFQxIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5SR0JBX0RYVDEgfHwgcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQkFfRFhUMyB8fCBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuUkdCQV9EWFQ1OwogICAgICB9OwogICAgICBQaXhlbEZvcm1hdC5pc1BWUlRDRm9ybWF0ID0gZnVuY3Rpb24ocGl4ZWxGb3JtYXQpIHsKICAgICAgICByZXR1cm4gcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQl9QVlJUQ180QlBQVjEgfHwgcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQl9QVlJUQ18yQlBQVjEgfHwgcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQkFfUFZSVENfNEJQUFYxIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5SR0JBX1BWUlRDXzJCUFBWMTsKICAgICAgfTsKICAgICAgUGl4ZWxGb3JtYXQuaXNBU1RDRm9ybWF0ID0gZnVuY3Rpb24ocGl4ZWxGb3JtYXQpIHsKICAgICAgICByZXR1cm4gcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQkFfQVNUQzsKICAgICAgfTsKICAgICAgUGl4ZWxGb3JtYXQuaXNFVEMxRm9ybWF0ID0gZnVuY3Rpb24ocGl4ZWxGb3JtYXQpIHsKICAgICAgICByZXR1cm4gcGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LlJHQl9FVEMxOwogICAgICB9OwogICAgICBQaXhlbEZvcm1hdC5pc0VUQzJGb3JtYXQgPSBmdW5jdGlvbihwaXhlbEZvcm1hdCkgewogICAgICAgIHJldHVybiBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuUkdCOF9FVEMyIHx8IHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5SR0JBOF9FVEMyX0VBQzsKICAgICAgfTsKICAgICAgUGl4ZWxGb3JtYXQuaXNCQzdGb3JtYXQgPSBmdW5jdGlvbihwaXhlbEZvcm1hdCkgewogICAgICAgIHJldHVybiBwaXhlbEZvcm1hdCA9PT0gUGl4ZWxGb3JtYXQuUkdCQV9CQzc7CiAgICAgIH07CiAgICAgIFBpeGVsRm9ybWF0LmNvbXByZXNzZWRUZXh0dXJlU2l6ZUluQnl0ZXMgPSBmdW5jdGlvbihwaXhlbEZvcm1hdCwgd2lkdGgsIGhlaWdodCkgewogICAgICAgIHN3aXRjaCAocGl4ZWxGb3JtYXQpIHsKICAgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQuUkdCX0RYVDE6CiAgICAgICAgICBjYXNlIFBpeGVsRm9ybWF0LlJHQkFfRFhUMToKICAgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQuUkdCX0VUQzE6CiAgICAgICAgICBjYXNlIFBpeGVsRm9ybWF0LlJHQjhfRVRDMjoKICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKHdpZHRoICsgMykgLyA0KSAqIE1hdGguZmxvb3IoKGhlaWdodCArIDMpIC8gNCkgKiA4OwogICAgICAgICAgY2FzZSBQaXhlbEZvcm1hdC5SR0JBX0RYVDM6CiAgICAgICAgICBjYXNlIFBpeGVsRm9ybWF0LlJHQkFfRFhUNToKICAgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQuUkdCQV9BU1RDOgogICAgICAgICAgY2FzZSBQaXhlbEZvcm1hdC5SR0JBOF9FVEMyX0VBQzoKICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKHdpZHRoICsgMykgLyA0KSAqIE1hdGguZmxvb3IoKGhlaWdodCArIDMpIC8gNCkgKiAxNjsKICAgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQuUkdCX1BWUlRDXzRCUFBWMToKICAgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQuUkdCQV9QVlJUQ180QlBQVjE6CiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKChNYXRoLm1heCh3aWR0aCwgOCkgKiBNYXRoLm1heChoZWlnaHQsIDgpICogNCArIDcpIC8gOCk7CiAgICAgICAgICBjYXNlIFBpeGVsRm9ybWF0LlJHQl9QVlJUQ18yQlBQVjE6CiAgICAgICAgICBjYXNlIFBpeGVsRm9ybWF0LlJHQkFfUFZSVENfMkJQUFYxOgogICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigKICAgICAgICAgICAgICAoTWF0aC5tYXgod2lkdGgsIDE2KSAqIE1hdGgubWF4KGhlaWdodCwgOCkgKiAyICsgNykgLyA4CiAgICAgICAgICAgICk7CiAgICAgICAgICBjYXNlIFBpeGVsRm9ybWF0LlJHQkFfQkM3OgogICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHdpZHRoIC8gNCkgKiBNYXRoLmNlaWwoaGVpZ2h0IC8gNCkgKiAxNjsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgfTsKICAgICAgUGl4ZWxGb3JtYXQudGV4dHVyZVNpemVJbkJ5dGVzID0gZnVuY3Rpb24ocGl4ZWxGb3JtYXQsIHBpeGVsRGF0YXR5cGUsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICBsZXQgY29tcG9uZW50c0xlbmd0aCA9IFBpeGVsRm9ybWF0LmNvbXBvbmVudHNMZW5ndGgocGl4ZWxGb3JtYXQpOwogICAgICAgIGlmIChQaXhlbERhdGF0eXBlX2RlZmF1bHQuaXNQYWNrZWQocGl4ZWxEYXRhdHlwZSkpIHsKICAgICAgICAgIGNvbXBvbmVudHNMZW5ndGggPSAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29tcG9uZW50c0xlbmd0aCAqIFBpeGVsRGF0YXR5cGVfZGVmYXVsdC5zaXplSW5CeXRlcyhwaXhlbERhdGF0eXBlKSAqIHdpZHRoICogaGVpZ2h0OwogICAgICB9OwogICAgICBQaXhlbEZvcm1hdC50ZXh0dXJlM0RTaXplSW5CeXRlcyA9IGZ1bmN0aW9uKHBpeGVsRm9ybWF0LCBwaXhlbERhdGF0eXBlLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aDIpIHsKICAgICAgICBsZXQgY29tcG9uZW50c0xlbmd0aCA9IFBpeGVsRm9ybWF0LmNvbXBvbmVudHNMZW5ndGgocGl4ZWxGb3JtYXQpOwogICAgICAgIGlmIChQaXhlbERhdGF0eXBlX2RlZmF1bHQuaXNQYWNrZWQocGl4ZWxEYXRhdHlwZSkpIHsKICAgICAgICAgIGNvbXBvbmVudHNMZW5ndGggPSAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29tcG9uZW50c0xlbmd0aCAqIFBpeGVsRGF0YXR5cGVfZGVmYXVsdC5zaXplSW5CeXRlcyhwaXhlbERhdGF0eXBlKSAqIHdpZHRoICogaGVpZ2h0ICogZGVwdGgyOwogICAgICB9OwogICAgICBQaXhlbEZvcm1hdC5hbGlnbm1lbnRJbkJ5dGVzID0gZnVuY3Rpb24ocGl4ZWxGb3JtYXQsIHBpeGVsRGF0YXR5cGUsIHdpZHRoKSB7CiAgICAgICAgY29uc3QgbW9kID0gUGl4ZWxGb3JtYXQudGV4dHVyZVNpemVJbkJ5dGVzKHBpeGVsRm9ybWF0LCBwaXhlbERhdGF0eXBlLCB3aWR0aCwgMSkgJSA0OwogICAgICAgIHJldHVybiBtb2QgPT09IDAgPyA0IDogbW9kID09PSAyID8gMiA6IDE7CiAgICAgIH07CiAgICAgIFBpeGVsRm9ybWF0LmNyZWF0ZVR5cGVkQXJyYXkgPSBmdW5jdGlvbihwaXhlbEZvcm1hdCwgcGl4ZWxEYXRhdHlwZSwgd2lkdGgsIGhlaWdodCkgewogICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gUGl4ZWxEYXRhdHlwZV9kZWZhdWx0LmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcihwaXhlbERhdGF0eXBlKTsKICAgICAgICBjb25zdCBzaXplID0gUGl4ZWxGb3JtYXQuY29tcG9uZW50c0xlbmd0aChwaXhlbEZvcm1hdCkgKiB3aWR0aCAqIGhlaWdodDsKICAgICAgICByZXR1cm4gbmV3IGNvbnN0cnVjdG9yKHNpemUpOwogICAgICB9OwogICAgICBQaXhlbEZvcm1hdC5mbGlwWSA9IGZ1bmN0aW9uKGJ1ZmZlclZpZXcsIHBpeGVsRm9ybWF0LCBwaXhlbERhdGF0eXBlLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgaWYgKGhlaWdodCA9PT0gMSkgewogICAgICAgICAgcmV0dXJuIGJ1ZmZlclZpZXc7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGZsaXBwZWQgPSBQaXhlbEZvcm1hdC5jcmVhdGVUeXBlZEFycmF5KAogICAgICAgICAgcGl4ZWxGb3JtYXQsCiAgICAgICAgICBwaXhlbERhdGF0eXBlLAogICAgICAgICAgd2lkdGgsCiAgICAgICAgICBoZWlnaHQKICAgICAgICApOwogICAgICAgIGNvbnN0IG51bWJlck9mQ29tcG9uZW50cyA9IFBpeGVsRm9ybWF0LmNvbXBvbmVudHNMZW5ndGgocGl4ZWxGb3JtYXQpOwogICAgICAgIGNvbnN0IHRleHR1cmVXaWR0aCA9IHdpZHRoICogbnVtYmVyT2ZDb21wb25lbnRzOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKICAgICAgICAgIGNvbnN0IHJvdyA9IGkgKiB3aWR0aCAqIG51bWJlck9mQ29tcG9uZW50czsKICAgICAgICAgIGNvbnN0IGZsaXBwZWRSb3cgPSAoaGVpZ2h0IC0gaSAtIDEpICogd2lkdGggKiBudW1iZXJPZkNvbXBvbmVudHM7CiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRleHR1cmVXaWR0aDsgKytqKSB7CiAgICAgICAgICAgIGZsaXBwZWRbZmxpcHBlZFJvdyArIGpdID0gYnVmZmVyVmlld1tyb3cgKyBqXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZsaXBwZWQ7CiAgICAgIH07CiAgICAgIFBpeGVsRm9ybWF0LnRvSW50ZXJuYWxGb3JtYXQgPSBmdW5jdGlvbihwaXhlbEZvcm1hdCwgcGl4ZWxEYXRhdHlwZSwgY29udGV4dCkgewogICAgICAgIGlmICghY29udGV4dC53ZWJnbDIpIHsKICAgICAgICAgIHJldHVybiBwaXhlbEZvcm1hdDsKICAgICAgICB9CiAgICAgICAgaWYgKHBpeGVsRm9ybWF0ID09PSBQaXhlbEZvcm1hdC5ERVBUSF9TVEVOQ0lMKSB7CiAgICAgICAgICByZXR1cm4gV2ViR0xDb25zdGFudHNfZGVmYXVsdC5ERVBUSDI0X1NURU5DSUw4OwogICAgICAgIH0KICAgICAgICBpZiAocGl4ZWxGb3JtYXQgPT09IFBpeGVsRm9ybWF0LkRFUFRIX0NPTVBPTkVOVCkgewogICAgICAgICAgaWYgKHBpeGVsRGF0YXR5cGUgPT09IFBpeGVsRGF0YXR5cGVfZGVmYXVsdC5VTlNJR05FRF9TSE9SVCkgewogICAgICAgICAgICByZXR1cm4gV2ViR0xDb25zdGFudHNfZGVmYXVsdC5ERVBUSF9DT01QT05FTlQxNjsKICAgICAgICAgIH0gZWxzZSBpZiAocGl4ZWxEYXRhdHlwZSA9PT0gUGl4ZWxEYXRhdHlwZV9kZWZhdWx0LlVOU0lHTkVEX0lOVCkgewogICAgICAgICAgICByZXR1cm4gV2ViR0xDb25zdGFudHNfZGVmYXVsdC5ERVBUSF9DT01QT05FTlQyNDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBpeGVsRGF0YXR5cGUgPT09IFBpeGVsRGF0YXR5cGVfZGVmYXVsdC5GTE9BVCkgewogICAgICAgICAgc3dpdGNoIChwaXhlbEZvcm1hdCkgewogICAgICAgICAgICBjYXNlIFBpeGVsRm9ybWF0LlJHQkE6CiAgICAgICAgICAgICAgcmV0dXJuIFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuUkdCQTMyRjsKICAgICAgICAgICAgY2FzZSBQaXhlbEZvcm1hdC5SR0I6CiAgICAgICAgICAgICAgcmV0dXJuIFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuUkdCMzJGOwogICAgICAgICAgICBjYXNlIFBpeGVsRm9ybWF0LlJHOgogICAgICAgICAgICAgIHJldHVybiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlJHMzJGOwogICAgICAgICAgICBjYXNlIFBpeGVsRm9ybWF0LlJFRDoKICAgICAgICAgICAgICByZXR1cm4gV2ViR0xDb25zdGFudHNfZGVmYXVsdC5SMzJGOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGl4ZWxEYXRhdHlwZSA9PT0gUGl4ZWxEYXRhdHlwZV9kZWZhdWx0LkhBTEZfRkxPQVQpIHsKICAgICAgICAgIHN3aXRjaCAocGl4ZWxGb3JtYXQpIHsKICAgICAgICAgICAgY2FzZSBQaXhlbEZvcm1hdC5SR0JBOgogICAgICAgICAgICAgIHJldHVybiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlJHQkExNkY7CiAgICAgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQuUkdCOgogICAgICAgICAgICAgIHJldHVybiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlJHQjE2RjsKICAgICAgICAgICAgY2FzZSBQaXhlbEZvcm1hdC5SRzoKICAgICAgICAgICAgICByZXR1cm4gV2ViR0xDb25zdGFudHNfZGVmYXVsdC5SRzE2RjsKICAgICAgICAgICAgY2FzZSBQaXhlbEZvcm1hdC5SRUQ6CiAgICAgICAgICAgICAgcmV0dXJuIFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuUjE2RjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBpeGVsRGF0YXR5cGUgPT09IFBpeGVsRGF0YXR5cGVfZGVmYXVsdC5VTlNJR05FRF9CWVRFKSB7CiAgICAgICAgICBzd2l0Y2ggKHBpeGVsRm9ybWF0KSB7CiAgICAgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQuUkdCQToKICAgICAgICAgICAgICByZXR1cm4gV2ViR0xDb25zdGFudHNfZGVmYXVsdC5SR0JBODsKICAgICAgICAgICAgY2FzZSBQaXhlbEZvcm1hdC5SR0I6CiAgICAgICAgICAgICAgcmV0dXJuIFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuUkdCODsKICAgICAgICAgICAgY2FzZSBQaXhlbEZvcm1hdC5SRzoKICAgICAgICAgICAgICByZXR1cm4gV2ViR0xDb25zdGFudHNfZGVmYXVsdC5SRzg7CiAgICAgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQuUkVEOgogICAgICAgICAgICAgIHJldHVybiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlI4OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGl4ZWxEYXRhdHlwZSA9PT0gUGl4ZWxEYXRhdHlwZV9kZWZhdWx0LklOVCkgewogICAgICAgICAgc3dpdGNoIChwaXhlbEZvcm1hdCkgewogICAgICAgICAgICBjYXNlIFBpeGVsRm9ybWF0LlJHQkFfSU5URUdFUjoKICAgICAgICAgICAgICByZXR1cm4gV2ViR0xDb25zdGFudHNfZGVmYXVsdC5SR0JBMzJJOwogICAgICAgICAgICBjYXNlIFBpeGVsRm9ybWF0LlJHQl9JTlRFR0VSOgogICAgICAgICAgICAgIHJldHVybiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlJHQjMySTsKICAgICAgICAgICAgY2FzZSBQaXhlbEZvcm1hdC5SR19JTlRFR0VSOgogICAgICAgICAgICAgIHJldHVybiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlJHMzJJOwogICAgICAgICAgICBjYXNlIFBpeGVsRm9ybWF0LlJFRF9JTlRFR0VSOgogICAgICAgICAgICAgIHJldHVybiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlIzMkk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChwaXhlbERhdGF0eXBlID09PSBQaXhlbERhdGF0eXBlX2RlZmF1bHQuVU5TSUdORURfSU5UKSB7CiAgICAgICAgICBzd2l0Y2ggKHBpeGVsRm9ybWF0KSB7CiAgICAgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQuUkdCQV9JTlRFR0VSOgogICAgICAgICAgICAgIHJldHVybiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlJHQkEzMlVJOwogICAgICAgICAgICBjYXNlIFBpeGVsRm9ybWF0LlJHQl9JTlRFR0VSOgogICAgICAgICAgICAgIHJldHVybiBXZWJHTENvbnN0YW50c19kZWZhdWx0LlJHQjMyVUk7CiAgICAgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQuUkdfSU5URUdFUjoKICAgICAgICAgICAgICByZXR1cm4gV2ViR0xDb25zdGFudHNfZGVmYXVsdC5SRzMyVUk7CiAgICAgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQuUkVEX0lOVEVHRVI6CiAgICAgICAgICAgICAgcmV0dXJuIFdlYkdMQ29uc3RhbnRzX2RlZmF1bHQuUjMyVUk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwaXhlbEZvcm1hdDsKICAgICAgfTsKICAgICAgUGl4ZWxGb3JtYXRfZGVmYXVsdCA9IE9iamVjdC5mcmVlemUoUGl4ZWxGb3JtYXQpOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvVnVsa2FuQ29uc3RhbnRzLmpzCiAgdmFyIFZ1bGthbkNvbnN0YW50cywgVnVsa2FuQ29uc3RhbnRzX2RlZmF1bHQ7CiAgdmFyIGluaXRfVnVsa2FuQ29uc3RhbnRzID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9WdWxrYW5Db25zdGFudHMuanMiKCkgewogICAgICBWdWxrYW5Db25zdGFudHMgPSB7CiAgICAgICAgVktfRk9STUFUX1VOREVGSU5FRDogMCwKICAgICAgICBWS19GT1JNQVRfUjRHNF9VTk9STV9QQUNLODogMSwKICAgICAgICBWS19GT1JNQVRfUjRHNEI0QTRfVU5PUk1fUEFDSzE2OiAyLAogICAgICAgIFZLX0ZPUk1BVF9CNEc0UjRBNF9VTk9STV9QQUNLMTY6IDMsCiAgICAgICAgVktfRk9STUFUX1I1RzZCNV9VTk9STV9QQUNLMTY6IDQsCiAgICAgICAgVktfRk9STUFUX0I1RzZSNV9VTk9STV9QQUNLMTY6IDUsCiAgICAgICAgVktfRk9STUFUX1I1RzVCNUExX1VOT1JNX1BBQ0sxNjogNiwKICAgICAgICBWS19GT1JNQVRfQjVHNVI1QTFfVU5PUk1fUEFDSzE2OiA3LAogICAgICAgIFZLX0ZPUk1BVF9BMVI1RzVCNV9VTk9STV9QQUNLMTY6IDgsCiAgICAgICAgVktfRk9STUFUX1I4X1VOT1JNOiA5LAogICAgICAgIFZLX0ZPUk1BVF9SOF9TTk9STTogMTAsCiAgICAgICAgVktfRk9STUFUX1I4X1VTQ0FMRUQ6IDExLAogICAgICAgIFZLX0ZPUk1BVF9SOF9TU0NBTEVEOiAxMiwKICAgICAgICBWS19GT1JNQVRfUjhfVUlOVDogMTMsCiAgICAgICAgVktfRk9STUFUX1I4X1NJTlQ6IDE0LAogICAgICAgIFZLX0ZPUk1BVF9SOF9TUkdCOiAxNSwKICAgICAgICBWS19GT1JNQVRfUjhHOF9VTk9STTogMTYsCiAgICAgICAgVktfRk9STUFUX1I4RzhfU05PUk06IDE3LAogICAgICAgIFZLX0ZPUk1BVF9SOEc4X1VTQ0FMRUQ6IDE4LAogICAgICAgIFZLX0ZPUk1BVF9SOEc4X1NTQ0FMRUQ6IDE5LAogICAgICAgIFZLX0ZPUk1BVF9SOEc4X1VJTlQ6IDIwLAogICAgICAgIFZLX0ZPUk1BVF9SOEc4X1NJTlQ6IDIxLAogICAgICAgIFZLX0ZPUk1BVF9SOEc4X1NSR0I6IDIyLAogICAgICAgIFZLX0ZPUk1BVF9SOEc4QjhfVU5PUk06IDIzLAogICAgICAgIFZLX0ZPUk1BVF9SOEc4QjhfU05PUk06IDI0LAogICAgICAgIFZLX0ZPUk1BVF9SOEc4QjhfVVNDQUxFRDogMjUsCiAgICAgICAgVktfRk9STUFUX1I4RzhCOF9TU0NBTEVEOiAyNiwKICAgICAgICBWS19GT1JNQVRfUjhHOEI4X1VJTlQ6IDI3LAogICAgICAgIFZLX0ZPUk1BVF9SOEc4QjhfU0lOVDogMjgsCiAgICAgICAgVktfRk9STUFUX1I4RzhCOF9TUkdCOiAyOSwKICAgICAgICBWS19GT1JNQVRfQjhHOFI4X1VOT1JNOiAzMCwKICAgICAgICBWS19GT1JNQVRfQjhHOFI4X1NOT1JNOiAzMSwKICAgICAgICBWS19GT1JNQVRfQjhHOFI4X1VTQ0FMRUQ6IDMyLAogICAgICAgIFZLX0ZPUk1BVF9COEc4UjhfU1NDQUxFRDogMzMsCiAgICAgICAgVktfRk9STUFUX0I4RzhSOF9VSU5UOiAzNCwKICAgICAgICBWS19GT1JNQVRfQjhHOFI4X1NJTlQ6IDM1LAogICAgICAgIFZLX0ZPUk1BVF9COEc4UjhfU1JHQjogMzYsCiAgICAgICAgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOiAzNywKICAgICAgICBWS19GT1JNQVRfUjhHOEI4QThfU05PUk06IDM4LAogICAgICAgIFZLX0ZPUk1BVF9SOEc4QjhBOF9VU0NBTEVEOiAzOSwKICAgICAgICBWS19GT1JNQVRfUjhHOEI4QThfU1NDQUxFRDogNDAsCiAgICAgICAgVktfRk9STUFUX1I4RzhCOEE4X1VJTlQ6IDQxLAogICAgICAgIFZLX0ZPUk1BVF9SOEc4QjhBOF9TSU5UOiA0MiwKICAgICAgICBWS19GT1JNQVRfUjhHOEI4QThfU1JHQjogNDMsCiAgICAgICAgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNOiA0NCwKICAgICAgICBWS19GT1JNQVRfQjhHOFI4QThfU05PUk06IDQ1LAogICAgICAgIFZLX0ZPUk1BVF9COEc4UjhBOF9VU0NBTEVEOiA0NiwKICAgICAgICBWS19GT1JNQVRfQjhHOFI4QThfU1NDQUxFRDogNDcsCiAgICAgICAgVktfRk9STUFUX0I4RzhSOEE4X1VJTlQ6IDQ4LAogICAgICAgIFZLX0ZPUk1BVF9COEc4UjhBOF9TSU5UOiA0OSwKICAgICAgICBWS19GT1JNQVRfQjhHOFI4QThfU1JHQjogNTAsCiAgICAgICAgVktfRk9STUFUX0E4QjhHOFI4X1VOT1JNX1BBQ0szMjogNTEsCiAgICAgICAgVktfRk9STUFUX0E4QjhHOFI4X1NOT1JNX1BBQ0szMjogNTIsCiAgICAgICAgVktfRk9STUFUX0E4QjhHOFI4X1VTQ0FMRURfUEFDSzMyOiA1MywKICAgICAgICBWS19GT1JNQVRfQThCOEc4UjhfU1NDQUxFRF9QQUNLMzI6IDU0LAogICAgICAgIFZLX0ZPUk1BVF9BOEI4RzhSOF9VSU5UX1BBQ0szMjogNTUsCiAgICAgICAgVktfRk9STUFUX0E4QjhHOFI4X1NJTlRfUEFDSzMyOiA1NiwKICAgICAgICBWS19GT1JNQVRfQThCOEc4UjhfU1JHQl9QQUNLMzI6IDU3LAogICAgICAgIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9VTk9STV9QQUNLMzI6IDU4LAogICAgICAgIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9TTk9STV9QQUNLMzI6IDU5LAogICAgICAgIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9VU0NBTEVEX1BBQ0szMjogNjAsCiAgICAgICAgVktfRk9STUFUX0EyUjEwRzEwQjEwX1NTQ0FMRURfUEFDSzMyOiA2MSwKICAgICAgICBWS19GT1JNQVRfQTJSMTBHMTBCMTBfVUlOVF9QQUNLMzI6IDYyLAogICAgICAgIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9TSU5UX1BBQ0szMjogNjMsCiAgICAgICAgVktfRk9STUFUX0EyQjEwRzEwUjEwX1VOT1JNX1BBQ0szMjogNjQsCiAgICAgICAgVktfRk9STUFUX0EyQjEwRzEwUjEwX1NOT1JNX1BBQ0szMjogNjUsCiAgICAgICAgVktfRk9STUFUX0EyQjEwRzEwUjEwX1VTQ0FMRURfUEFDSzMyOiA2NiwKICAgICAgICBWS19GT1JNQVRfQTJCMTBHMTBSMTBfU1NDQUxFRF9QQUNLMzI6IDY3LAogICAgICAgIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VSU5UX1BBQ0szMjogNjgsCiAgICAgICAgVktfRk9STUFUX0EyQjEwRzEwUjEwX1NJTlRfUEFDSzMyOiA2OSwKICAgICAgICBWS19GT1JNQVRfUjE2X1VOT1JNOiA3MCwKICAgICAgICBWS19GT1JNQVRfUjE2X1NOT1JNOiA3MSwKICAgICAgICBWS19GT1JNQVRfUjE2X1VTQ0FMRUQ6IDcyLAogICAgICAgIFZLX0ZPUk1BVF9SMTZfU1NDQUxFRDogNzMsCiAgICAgICAgVktfRk9STUFUX1IxNl9VSU5UOiA3NCwKICAgICAgICBWS19GT1JNQVRfUjE2X1NJTlQ6IDc1LAogICAgICAgIFZLX0ZPUk1BVF9SMTZfU0ZMT0FUOiA3NiwKICAgICAgICBWS19GT1JNQVRfUjE2RzE2X1VOT1JNOiA3NywKICAgICAgICBWS19GT1JNQVRfUjE2RzE2X1NOT1JNOiA3OCwKICAgICAgICBWS19GT1JNQVRfUjE2RzE2X1VTQ0FMRUQ6IDc5LAogICAgICAgIFZLX0ZPUk1BVF9SMTZHMTZfU1NDQUxFRDogODAsCiAgICAgICAgVktfRk9STUFUX1IxNkcxNl9VSU5UOiA4MSwKICAgICAgICBWS19GT1JNQVRfUjE2RzE2X1NJTlQ6IDgyLAogICAgICAgIFZLX0ZPUk1BVF9SMTZHMTZfU0ZMT0FUOiA4MywKICAgICAgICBWS19GT1JNQVRfUjE2RzE2QjE2X1VOT1JNOiA4NCwKICAgICAgICBWS19GT1JNQVRfUjE2RzE2QjE2X1NOT1JNOiA4NSwKICAgICAgICBWS19GT1JNQVRfUjE2RzE2QjE2X1VTQ0FMRUQ6IDg2LAogICAgICAgIFZLX0ZPUk1BVF9SMTZHMTZCMTZfU1NDQUxFRDogODcsCiAgICAgICAgVktfRk9STUFUX1IxNkcxNkIxNl9VSU5UOiA4OCwKICAgICAgICBWS19GT1JNQVRfUjE2RzE2QjE2X1NJTlQ6IDg5LAogICAgICAgIFZLX0ZPUk1BVF9SMTZHMTZCMTZfU0ZMT0FUOiA5MCwKICAgICAgICBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VOT1JNOiA5MSwKICAgICAgICBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNOiA5MiwKICAgICAgICBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VTQ0FMRUQ6IDkzLAogICAgICAgIFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU1NDQUxFRDogOTQsCiAgICAgICAgVktfRk9STUFUX1IxNkcxNkIxNkExNl9VSU5UOiA5NSwKICAgICAgICBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NJTlQ6IDk2LAogICAgICAgIFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU0ZMT0FUOiA5NywKICAgICAgICBWS19GT1JNQVRfUjMyX1VJTlQ6IDk4LAogICAgICAgIFZLX0ZPUk1BVF9SMzJfU0lOVDogOTksCiAgICAgICAgVktfRk9STUFUX1IzMl9TRkxPQVQ6IDEwMCwKICAgICAgICBWS19GT1JNQVRfUjMyRzMyX1VJTlQ6IDEwMSwKICAgICAgICBWS19GT1JNQVRfUjMyRzMyX1NJTlQ6IDEwMiwKICAgICAgICBWS19GT1JNQVRfUjMyRzMyX1NGTE9BVDogMTAzLAogICAgICAgIFZLX0ZPUk1BVF9SMzJHMzJCMzJfVUlOVDogMTA0LAogICAgICAgIFZLX0ZPUk1BVF9SMzJHMzJCMzJfU0lOVDogMTA1LAogICAgICAgIFZLX0ZPUk1BVF9SMzJHMzJCMzJfU0ZMT0FUOiAxMDYsCiAgICAgICAgVktfRk9STUFUX1IzMkczMkIzMkEzMl9VSU5UOiAxMDcsCiAgICAgICAgVktfRk9STUFUX1IzMkczMkIzMkEzMl9TSU5UOiAxMDgsCiAgICAgICAgVktfRk9STUFUX1IzMkczMkIzMkEzMl9TRkxPQVQ6IDEwOSwKICAgICAgICBWS19GT1JNQVRfUjY0X1VJTlQ6IDExMCwKICAgICAgICBWS19GT1JNQVRfUjY0X1NJTlQ6IDExMSwKICAgICAgICBWS19GT1JNQVRfUjY0X1NGTE9BVDogMTEyLAogICAgICAgIFZLX0ZPUk1BVF9SNjRHNjRfVUlOVDogMTEzLAogICAgICAgIFZLX0ZPUk1BVF9SNjRHNjRfU0lOVDogMTE0LAogICAgICAgIFZLX0ZPUk1BVF9SNjRHNjRfU0ZMT0FUOiAxMTUsCiAgICAgICAgVktfRk9STUFUX1I2NEc2NEI2NF9VSU5UOiAxMTYsCiAgICAgICAgVktfRk9STUFUX1I2NEc2NEI2NF9TSU5UOiAxMTcsCiAgICAgICAgVktfRk9STUFUX1I2NEc2NEI2NF9TRkxPQVQ6IDExOCwKICAgICAgICBWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1VJTlQ6IDExOSwKICAgICAgICBWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1NJTlQ6IDEyMCwKICAgICAgICBWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1NGTE9BVDogMTIxLAogICAgICAgIFZLX0ZPUk1BVF9CMTBHMTFSMTFfVUZMT0FUX1BBQ0szMjogMTIyLAogICAgICAgIFZLX0ZPUk1BVF9FNUI5RzlSOV9VRkxPQVRfUEFDSzMyOiAxMjMsCiAgICAgICAgVktfRk9STUFUX0QxNl9VTk9STTogMTI0LAogICAgICAgIFZLX0ZPUk1BVF9YOF9EMjRfVU5PUk1fUEFDSzMyOiAxMjUsCiAgICAgICAgVktfRk9STUFUX0QzMl9TRkxPQVQ6IDEyNiwKICAgICAgICBWS19GT1JNQVRfUzhfVUlOVDogMTI3LAogICAgICAgIFZLX0ZPUk1BVF9EMTZfVU5PUk1fUzhfVUlOVDogMTI4LAogICAgICAgIFZLX0ZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVDogMTI5LAogICAgICAgIFZLX0ZPUk1BVF9EMzJfU0ZMT0FUX1M4X1VJTlQ6IDEzMCwKICAgICAgICBWS19GT1JNQVRfQkMxX1JHQl9VTk9STV9CTE9DSzogMTMxLAogICAgICAgIFZLX0ZPUk1BVF9CQzFfUkdCX1NSR0JfQkxPQ0s6IDEzMiwKICAgICAgICBWS19GT1JNQVRfQkMxX1JHQkFfVU5PUk1fQkxPQ0s6IDEzMywKICAgICAgICBWS19GT1JNQVRfQkMxX1JHQkFfU1JHQl9CTE9DSzogMTM0LAogICAgICAgIFZLX0ZPUk1BVF9CQzJfVU5PUk1fQkxPQ0s6IDEzNSwKICAgICAgICBWS19GT1JNQVRfQkMyX1NSR0JfQkxPQ0s6IDEzNiwKICAgICAgICBWS19GT1JNQVRfQkMzX1VOT1JNX0JMT0NLOiAxMzcsCiAgICAgICAgVktfRk9STUFUX0JDM19TUkdCX0JMT0NLOiAxMzgsCiAgICAgICAgVktfRk9STUFUX0JDNF9VTk9STV9CTE9DSzogMTM5LAogICAgICAgIFZLX0ZPUk1BVF9CQzRfU05PUk1fQkxPQ0s6IDE0MCwKICAgICAgICBWS19GT1JNQVRfQkM1X1VOT1JNX0JMT0NLOiAxNDEsCiAgICAgICAgVktfRk9STUFUX0JDNV9TTk9STV9CTE9DSzogMTQyLAogICAgICAgIFZLX0ZPUk1BVF9CQzZIX1VGTE9BVF9CTE9DSzogMTQzLAogICAgICAgIFZLX0ZPUk1BVF9CQzZIX1NGTE9BVF9CTE9DSzogMTQ0LAogICAgICAgIFZLX0ZPUk1BVF9CQzdfVU5PUk1fQkxPQ0s6IDE0NSwKICAgICAgICBWS19GT1JNQVRfQkM3X1NSR0JfQkxPQ0s6IDE0NiwKICAgICAgICBWS19GT1JNQVRfRVRDMl9SOEc4QjhfVU5PUk1fQkxPQ0s6IDE0NywKICAgICAgICBWS19GT1JNQVRfRVRDMl9SOEc4QjhfU1JHQl9CTE9DSzogMTQ4LAogICAgICAgIFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEExX1VOT1JNX0JMT0NLOiAxNDksCiAgICAgICAgVktfRk9STUFUX0VUQzJfUjhHOEI4QTFfU1JHQl9CTE9DSzogMTUwLAogICAgICAgIFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEE4X1VOT1JNX0JMT0NLOiAxNTEsCiAgICAgICAgVktfRk9STUFUX0VUQzJfUjhHOEI4QThfU1JHQl9CTE9DSzogMTUyLAogICAgICAgIFZLX0ZPUk1BVF9FQUNfUjExX1VOT1JNX0JMT0NLOiAxNTMsCiAgICAgICAgVktfRk9STUFUX0VBQ19SMTFfU05PUk1fQkxPQ0s6IDE1NCwKICAgICAgICBWS19GT1JNQVRfRUFDX1IxMUcxMV9VTk9STV9CTE9DSzogMTU1LAogICAgICAgIFZLX0ZPUk1BVF9FQUNfUjExRzExX1NOT1JNX0JMT0NLOiAxNTYsCiAgICAgICAgVktfRk9STUFUX0FTVENfNHg0X1VOT1JNX0JMT0NLOiAxNTcsCiAgICAgICAgVktfRk9STUFUX0FTVENfNHg0X1NSR0JfQkxPQ0s6IDE1OCwKICAgICAgICBWS19GT1JNQVRfQVNUQ181eDRfVU5PUk1fQkxPQ0s6IDE1OSwKICAgICAgICBWS19GT1JNQVRfQVNUQ181eDRfU1JHQl9CTE9DSzogMTYwLAogICAgICAgIFZLX0ZPUk1BVF9BU1RDXzV4NV9VTk9STV9CTE9DSzogMTYxLAogICAgICAgIFZLX0ZPUk1BVF9BU1RDXzV4NV9TUkdCX0JMT0NLOiAxNjIsCiAgICAgICAgVktfRk9STUFUX0FTVENfNng1X1VOT1JNX0JMT0NLOiAxNjMsCiAgICAgICAgVktfRk9STUFUX0FTVENfNng1X1NSR0JfQkxPQ0s6IDE2NCwKICAgICAgICBWS19GT1JNQVRfQVNUQ182eDZfVU5PUk1fQkxPQ0s6IDE2NSwKICAgICAgICBWS19GT1JNQVRfQVNUQ182eDZfU1JHQl9CTE9DSzogMTY2LAogICAgICAgIFZLX0ZPUk1BVF9BU1RDXzh4NV9VTk9STV9CTE9DSzogMTY3LAogICAgICAgIFZLX0ZPUk1BVF9BU1RDXzh4NV9TUkdCX0JMT0NLOiAxNjgsCiAgICAgICAgVktfRk9STUFUX0FTVENfOHg2X1VOT1JNX0JMT0NLOiAxNjksCiAgICAgICAgVktfRk9STUFUX0FTVENfOHg2X1NSR0JfQkxPQ0s6IDE3MCwKICAgICAgICBWS19GT1JNQVRfQVNUQ184eDhfVU5PUk1fQkxPQ0s6IDE3MSwKICAgICAgICBWS19GT1JNQVRfQVNUQ184eDhfU1JHQl9CTE9DSzogMTcyLAogICAgICAgIFZLX0ZPUk1BVF9BU1RDXzEweDVfVU5PUk1fQkxPQ0s6IDE3MywKICAgICAgICBWS19GT1JNQVRfQVNUQ18xMHg1X1NSR0JfQkxPQ0s6IDE3NCwKICAgICAgICBWS19GT1JNQVRfQVNUQ18xMHg2X1VOT1JNX0JMT0NLOiAxNzUsCiAgICAgICAgVktfRk9STUFUX0FTVENfMTB4Nl9TUkdCX0JMT0NLOiAxNzYsCiAgICAgICAgVktfRk9STUFUX0FTVENfMTB4OF9VTk9STV9CTE9DSzogMTc3LAogICAgICAgIFZLX0ZPUk1BVF9BU1RDXzEweDhfU1JHQl9CTE9DSzogMTc4LAogICAgICAgIFZLX0ZPUk1BVF9BU1RDXzEweDEwX1VOT1JNX0JMT0NLOiAxNzksCiAgICAgICAgVktfRk9STUFUX0FTVENfMTB4MTBfU1JHQl9CTE9DSzogMTgwLAogICAgICAgIFZLX0ZPUk1BVF9BU1RDXzEyeDEwX1VOT1JNX0JMT0NLOiAxODEsCiAgICAgICAgVktfRk9STUFUX0FTVENfMTJ4MTBfU1JHQl9CTE9DSzogMTgyLAogICAgICAgIFZLX0ZPUk1BVF9BU1RDXzEyeDEyX1VOT1JNX0JMT0NLOiAxODMsCiAgICAgICAgVktfRk9STUFUX0FTVENfMTJ4MTJfU1JHQl9CTE9DSzogMTg0LAogICAgICAgIFZLX0ZPUk1BVF9HOEI4RzhSOF80MjJfVU5PUk06IDEwMDAxNTZlMywKICAgICAgICBWS19GT1JNQVRfQjhHOFI4RzhfNDIyX1VOT1JNOiAxMDAwMTU2MDAxLAogICAgICAgIFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIwX1VOT1JNOiAxMDAwMTU2MDAyLAogICAgICAgIFZLX0ZPUk1BVF9HOF9COFI4XzJQTEFORV80MjBfVU5PUk06IDEwMDAxNTYwMDMsCiAgICAgICAgVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80MjJfVU5PUk06IDEwMDAxNTYwMDQsCiAgICAgICAgVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMl9VTk9STTogMTAwMDE1NjAwNSwKICAgICAgICBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQ0NF9VTk9STTogMTAwMDE1NjAwNiwKICAgICAgICBWS19GT1JNQVRfUjEwWDZfVU5PUk1fUEFDSzE2OiAxMDAwMTU2MDA3LAogICAgICAgIFZLX0ZPUk1BVF9SMTBYNkcxMFg2X1VOT1JNXzJQQUNLMTY6IDEwMDAxNTYwMDgsCiAgICAgICAgVktfRk9STUFUX1IxMFg2RzEwWDZCMTBYNkExMFg2X1VOT1JNXzRQQUNLMTY6IDEwMDAxNTYwMDksCiAgICAgICAgVktfRk9STUFUX0cxMFg2QjEwWDZHMTBYNlIxMFg2XzQyMl9VTk9STV80UEFDSzE2OiAxMDAwMTU2MDEwLAogICAgICAgIFZLX0ZPUk1BVF9CMTBYNkcxMFg2UjEwWDZHMTBYNl80MjJfVU5PUk1fNFBBQ0sxNjogMTAwMDE1NjAxMSwKICAgICAgICBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQyMF9VTk9STV8zUEFDSzE2OiAxMDAwMTU2MDEyLAogICAgICAgIFZLX0ZPUk1BVF9HMTBYNl9CMTBYNlIxMFg2XzJQTEFORV80MjBfVU5PUk1fM1BBQ0sxNjogMTAwMDE1NjAxMywKICAgICAgICBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2OiAxMDAwMTU2MDE0LAogICAgICAgIFZLX0ZPUk1BVF9HMTBYNl9CMTBYNlIxMFg2XzJQTEFORV80MjJfVU5PUk1fM1BBQ0sxNjogMTAwMDE1NjAxNSwKICAgICAgICBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQ0NF9VTk9STV8zUEFDSzE2OiAxMDAwMTU2MDE2LAogICAgICAgIFZLX0ZPUk1BVF9SMTJYNF9VTk9STV9QQUNLMTY6IDEwMDAxNTYwMTcsCiAgICAgICAgVktfRk9STUFUX1IxMlg0RzEyWDRfVU5PUk1fMlBBQ0sxNjogMTAwMDE1NjAxOCwKICAgICAgICBWS19GT1JNQVRfUjEyWDRHMTJYNEIxMlg0QTEyWDRfVU5PUk1fNFBBQ0sxNjogMTAwMDE1NjAxOSwKICAgICAgICBWS19GT1JNQVRfRzEyWDRCMTJYNEcxMlg0UjEyWDRfNDIyX1VOT1JNXzRQQUNLMTY6IDEwMDAxNTYwMjAsCiAgICAgICAgVktfRk9STUFUX0IxMlg0RzEyWDRSMTJYNEcxMlg0XzQyMl9VTk9STV80UEFDSzE2OiAxMDAwMTU2MDIxLAogICAgICAgIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDIwX1VOT1JNXzNQQUNLMTY6IDEwMDAxNTYwMjIsCiAgICAgICAgVktfRk9STUFUX0cxMlg0X0IxMlg0UjEyWDRfMlBMQU5FXzQyMF9VTk9STV8zUEFDSzE2OiAxMDAwMTU2MDIzLAogICAgICAgIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDIyX1VOT1JNXzNQQUNLMTY6IDEwMDAxNTYwMjQsCiAgICAgICAgVktfRk9STUFUX0cxMlg0X0IxMlg0UjEyWDRfMlBMQU5FXzQyMl9VTk9STV8zUEFDSzE2OiAxMDAwMTU2MDI1LAogICAgICAgIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTY6IDEwMDAxNTYwMjYsCiAgICAgICAgVktfRk9STUFUX0cxNkIxNkcxNlIxNl80MjJfVU5PUk06IDEwMDAxNTYwMjcsCiAgICAgICAgVktfRk9STUFUX0IxNkcxNlIxNkcxNl80MjJfVU5PUk06IDEwMDAxNTYwMjgsCiAgICAgICAgVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80MjBfVU5PUk06IDEwMDAxNTYwMjksCiAgICAgICAgVktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMF9VTk9STTogMTAwMDE1NjAzMCwKICAgICAgICBWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQyMl9VTk9STTogMTAwMDE1NjAzMSwKICAgICAgICBWS19GT1JNQVRfRzE2X0IxNlIxNl8yUExBTkVfNDIyX1VOT1JNOiAxMDAwMTU2MDMyLAogICAgICAgIFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDQ0X1VOT1JNOiAxMDAwMTU2MDMzLAogICAgICAgIFZLX0ZPUk1BVF9QVlJUQzFfMkJQUF9VTk9STV9CTE9DS19JTUc6IDEwMDAwNTRlMywKICAgICAgICBWS19GT1JNQVRfUFZSVEMxXzRCUFBfVU5PUk1fQkxPQ0tfSU1HOiAxMDAwMDU0MDAxLAogICAgICAgIFZLX0ZPUk1BVF9QVlJUQzJfMkJQUF9VTk9STV9CTE9DS19JTUc6IDEwMDAwNTQwMDIsCiAgICAgICAgVktfRk9STUFUX1BWUlRDMl80QlBQX1VOT1JNX0JMT0NLX0lNRzogMTAwMDA1NDAwMywKICAgICAgICBWS19GT1JNQVRfUFZSVEMxXzJCUFBfU1JHQl9CTE9DS19JTUc6IDEwMDAwNTQwMDQsCiAgICAgICAgVktfRk9STUFUX1BWUlRDMV80QlBQX1NSR0JfQkxPQ0tfSU1HOiAxMDAwMDU0MDA1LAogICAgICAgIFZLX0ZPUk1BVF9QVlJUQzJfMkJQUF9TUkdCX0JMT0NLX0lNRzogMTAwMDA1NDAwNiwKICAgICAgICBWS19GT1JNQVRfUFZSVEMyXzRCUFBfU1JHQl9CTE9DS19JTUc6IDEwMDAwNTQwMDcsCiAgICAgICAgVktfRk9STUFUX0FTVENfNHg0X1NGTE9BVF9CTE9DS19FWFQ6IDEwMDAwNjZlMywKICAgICAgICBWS19GT1JNQVRfQVNUQ181eDRfU0ZMT0FUX0JMT0NLX0VYVDogMTAwMDA2NjAwMSwKICAgICAgICBWS19GT1JNQVRfQVNUQ181eDVfU0ZMT0FUX0JMT0NLX0VYVDogMTAwMDA2NjAwMiwKICAgICAgICBWS19GT1JNQVRfQVNUQ182eDVfU0ZMT0FUX0JMT0NLX0VYVDogMTAwMDA2NjAwMywKICAgICAgICBWS19GT1JNQVRfQVNUQ182eDZfU0ZMT0FUX0JMT0NLX0VYVDogMTAwMDA2NjAwNCwKICAgICAgICBWS19GT1JNQVRfQVNUQ184eDVfU0ZMT0FUX0JMT0NLX0VYVDogMTAwMDA2NjAwNSwKICAgICAgICBWS19GT1JNQVRfQVNUQ184eDZfU0ZMT0FUX0JMT0NLX0VYVDogMTAwMDA2NjAwNiwKICAgICAgICBWS19GT1JNQVRfQVNUQ184eDhfU0ZMT0FUX0JMT0NLX0VYVDogMTAwMDA2NjAwNywKICAgICAgICBWS19GT1JNQVRfQVNUQ18xMHg1X1NGTE9BVF9CTE9DS19FWFQ6IDEwMDAwNjYwMDgsCiAgICAgICAgVktfRk9STUFUX0FTVENfMTB4Nl9TRkxPQVRfQkxPQ0tfRVhUOiAxMDAwMDY2MDA5LAogICAgICAgIFZLX0ZPUk1BVF9BU1RDXzEweDhfU0ZMT0FUX0JMT0NLX0VYVDogMTAwMDA2NjAxMCwKICAgICAgICBWS19GT1JNQVRfQVNUQ18xMHgxMF9TRkxPQVRfQkxPQ0tfRVhUOiAxMDAwMDY2MDExLAogICAgICAgIFZLX0ZPUk1BVF9BU1RDXzEyeDEwX1NGTE9BVF9CTE9DS19FWFQ6IDEwMDAwNjYwMTIsCiAgICAgICAgVktfRk9STUFUX0FTVENfMTJ4MTJfU0ZMT0FUX0JMT0NLX0VYVDogMTAwMDA2NjAxMywKICAgICAgICBWS19GT1JNQVRfRzhCOEc4UjhfNDIyX1VOT1JNX0tIUjogMTAwMDE1NmUzLAogICAgICAgIFZLX0ZPUk1BVF9COEc4UjhHOF80MjJfVU5PUk1fS0hSOiAxMDAwMTU2MDAxLAogICAgICAgIFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIwX1VOT1JNX0tIUjogMTAwMDE1NjAwMiwKICAgICAgICBWS19GT1JNQVRfRzhfQjhSOF8yUExBTkVfNDIwX1VOT1JNX0tIUjogMTAwMDE1NjAwMywKICAgICAgICBWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMl9VTk9STV9LSFI6IDEwMDAxNTYwMDQsCiAgICAgICAgVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMl9VTk9STV9LSFI6IDEwMDAxNTYwMDUsCiAgICAgICAgVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80NDRfVU5PUk1fS0hSOiAxMDAwMTU2MDA2LAogICAgICAgIFZLX0ZPUk1BVF9SMTBYNl9VTk9STV9QQUNLMTZfS0hSOiAxMDAwMTU2MDA3LAogICAgICAgIFZLX0ZPUk1BVF9SMTBYNkcxMFg2X1VOT1JNXzJQQUNLMTZfS0hSOiAxMDAwMTU2MDA4LAogICAgICAgIFZLX0ZPUk1BVF9SMTBYNkcxMFg2QjEwWDZBMTBYNl9VTk9STV80UEFDSzE2X0tIUjogMTAwMDE1NjAwOSwKICAgICAgICBWS19GT1JNQVRfRzEwWDZCMTBYNkcxMFg2UjEwWDZfNDIyX1VOT1JNXzRQQUNLMTZfS0hSOiAxMDAwMTU2MDEwLAogICAgICAgIFZLX0ZPUk1BVF9CMTBYNkcxMFg2UjEwWDZHMTBYNl80MjJfVU5PUk1fNFBBQ0sxNl9LSFI6IDEwMDAxNTYwMTEsCiAgICAgICAgVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80MjBfVU5PUk1fM1BBQ0sxNl9LSFI6IDEwMDAxNTYwMTIsCiAgICAgICAgVktfRk9STUFUX0cxMFg2X0IxMFg2UjEwWDZfMlBMQU5FXzQyMF9VTk9STV8zUEFDSzE2X0tIUjogMTAwMDE1NjAxMywKICAgICAgICBWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2X0tIUjogMTAwMDE1NjAxNCwKICAgICAgICBWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTZfS0hSOiAxMDAwMTU2MDE1LAogICAgICAgIFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTZfS0hSOiAxMDAwMTU2MDE2LAogICAgICAgIFZLX0ZPUk1BVF9SMTJYNF9VTk9STV9QQUNLMTZfS0hSOiAxMDAwMTU2MDE3LAogICAgICAgIFZLX0ZPUk1BVF9SMTJYNEcxMlg0X1VOT1JNXzJQQUNLMTZfS0hSOiAxMDAwMTU2MDE4LAogICAgICAgIFZLX0ZPUk1BVF9SMTJYNEcxMlg0QjEyWDRBMTJYNF9VTk9STV80UEFDSzE2X0tIUjogMTAwMDE1NjAxOSwKICAgICAgICBWS19GT1JNQVRfRzEyWDRCMTJYNEcxMlg0UjEyWDRfNDIyX1VOT1JNXzRQQUNLMTZfS0hSOiAxMDAwMTU2MDIwLAogICAgICAgIFZLX0ZPUk1BVF9CMTJYNEcxMlg0UjEyWDRHMTJYNF80MjJfVU5PUk1fNFBBQ0sxNl9LSFI6IDEwMDAxNTYwMjEsCiAgICAgICAgVktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80MjBfVU5PUk1fM1BBQ0sxNl9LSFI6IDEwMDAxNTYwMjIsCiAgICAgICAgVktfRk9STUFUX0cxMlg0X0IxMlg0UjEyWDRfMlBMQU5FXzQyMF9VTk9STV8zUEFDSzE2X0tIUjogMTAwMDE1NjAyMywKICAgICAgICBWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2X0tIUjogMTAwMDE1NjAyNCwKICAgICAgICBWS19GT1JNQVRfRzEyWDRfQjEyWDRSMTJYNF8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTZfS0hSOiAxMDAwMTU2MDI1LAogICAgICAgIFZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTZfS0hSOiAxMDAwMTU2MDI2LAogICAgICAgIFZLX0ZPUk1BVF9HMTZCMTZHMTZSMTZfNDIyX1VOT1JNX0tIUjogMTAwMDE1NjAyNywKICAgICAgICBWS19GT1JNQVRfQjE2RzE2UjE2RzE2XzQyMl9VTk9STV9LSFI6IDEwMDAxNTYwMjgsCiAgICAgICAgVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80MjBfVU5PUk1fS0hSOiAxMDAwMTU2MDI5LAogICAgICAgIFZLX0ZPUk1BVF9HMTZfQjE2UjE2XzJQTEFORV80MjBfVU5PUk1fS0hSOiAxMDAwMTU2MDMwLAogICAgICAgIFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDIyX1VOT1JNX0tIUjogMTAwMDE1NjAzMSwKICAgICAgICBWS19GT1JNQVRfRzE2X0IxNlIxNl8yUExBTkVfNDIyX1VOT1JNX0tIUjogMTAwMDE1NjAzMiwKICAgICAgICBWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQ0NF9VTk9STV9LSFI6IDEwMDAxNTYwMzMKICAgICAgfTsKICAgICAgVnVsa2FuQ29uc3RhbnRzX2RlZmF1bHQgPSBPYmplY3QuZnJlZXplKFZ1bGthbkNvbnN0YW50cyk7CiAgICB9CiAgfSk7CgogIC8vIG5vZGVfbW9kdWxlcy9rdHgtcGFyc2UvZGlzdC9rdHgtcGFyc2UubW9kZXJuLmpzCiAgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdENvbnRhaW5lcigpIHsKICAgIHJldHVybiB7CiAgICAgIHZrRm9ybWF0OiBWS19GT1JNQVRfVU5ERUZJTkVELAogICAgICB0eXBlU2l6ZTogMSwKICAgICAgcGl4ZWxXaWR0aDogMCwKICAgICAgcGl4ZWxIZWlnaHQ6IDAsCiAgICAgIHBpeGVsRGVwdGg6IDAsCiAgICAgIGxheWVyQ291bnQ6IDAsCiAgICAgIGZhY2VDb3VudDogMSwKICAgICAgbGV2ZWxDb3VudDogMCwKICAgICAgc3VwZXJjb21wcmVzc2lvblNjaGVtZTogS0hSX1NVUEVSQ09NUFJFU1NJT05fTk9ORSwKICAgICAgbGV2ZWxzOiBbXSwKICAgICAgZGF0YUZvcm1hdERlc2NyaXB0b3I6IFt7CiAgICAgICAgdmVuZG9ySWQ6IEtIUl9ERl9WRU5ET1JJRF9LSFJPTk9TLAogICAgICAgIGRlc2NyaXB0b3JUeXBlOiBLSFJfREZfS0hSX0RFU0NSSVBUT1JUWVBFX0JBU0lDRk9STUFULAogICAgICAgIHZlcnNpb25OdW1iZXI6IEtIUl9ERl9WRVJTSU9OLAogICAgICAgIGNvbG9yTW9kZWw6IEtIUl9ERl9NT0RFTF9VTlNQRUNJRklFRCwKICAgICAgICBjb2xvclByaW1hcmllczogS0hSX0RGX1BSSU1BUklFU19CVDcwOSwKICAgICAgICB0cmFuc2ZlckZ1bmN0aW9uOiBLSFJfREZfVFJBTlNGRVJfU1JHQiwKICAgICAgICBmbGFnczogS0hSX0RGX0ZMQUdfQUxQSEFfU1RSQUlHSFQsCiAgICAgICAgdGV4ZWxCbG9ja0RpbWVuc2lvbjogWzAsIDAsIDAsIDBdLAogICAgICAgIGJ5dGVzUGxhbmU6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSwKICAgICAgICBzYW1wbGVzOiBbXQogICAgICB9XSwKICAgICAga2V5VmFsdWU6IHt9LAogICAgICBnbG9iYWxEYXRhOiBudWxsCiAgICB9OwogIH0KICBmdW5jdGlvbiBkZWNvZGVUZXh0KGJ1ZmZlcikgewogICAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShidWZmZXIpOwogIH0KICBmdW5jdGlvbiByZWFkMihkYXRhKSB7CiAgICBjb25zdCBpZCA9IG5ldyBVaW50OEFycmF5KGRhdGEuYnVmZmVyLCBkYXRhLmJ5dGVPZmZzZXQsIEtUWDJfSUQubGVuZ3RoKTsKICAgIGlmIChpZFswXSAhPT0gS1RYMl9JRFswXSB8fCAvLyAnwrQnCiAgICBpZFsxXSAhPT0gS1RYMl9JRFsxXSB8fCAvLyAnSycKICAgIGlkWzJdICE9PSBLVFgyX0lEWzJdIHx8IC8vICdUJwogICAgaWRbM10gIT09IEtUWDJfSURbM10gfHwgLy8gJ1gnCiAgICBpZFs0XSAhPT0gS1RYMl9JRFs0XSB8fCAvLyAnICcKICAgIGlkWzVdICE9PSBLVFgyX0lEWzVdIHx8IC8vICcyJwogICAgaWRbNl0gIT09IEtUWDJfSURbNl0gfHwgLy8gJzAnCiAgICBpZFs3XSAhPT0gS1RYMl9JRFs3XSB8fCAvLyAnwqonCiAgICBpZFs4XSAhPT0gS1RYMl9JRFs4XSB8fCAvLyAnXHInCiAgICBpZFs5XSAhPT0gS1RYMl9JRFs5XSB8fCAvLyAnXG4nCiAgICBpZFsxMF0gIT09IEtUWDJfSURbMTBdIHx8IC8vICdceDFBJwogICAgaWRbMTFdICE9PSBLVFgyX0lEWzExXSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgS1RYIDIuMCBpZGVudGlmaWVyLiIpOwogICAgfQogICAgY29uc3QgY29udGFpbmVyID0gY3JlYXRlRGVmYXVsdENvbnRhaW5lcigpOwogICAgY29uc3QgaGVhZGVyQnl0ZUxlbmd0aCA9IDE3ICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7CiAgICBjb25zdCBoZWFkZXJSZWFkZXIgPSBuZXcgQnVmZmVyUmVhZGVyKGRhdGEsIEtUWDJfSUQubGVuZ3RoLCBoZWFkZXJCeXRlTGVuZ3RoLCB0cnVlKTsKICAgIGNvbnRhaW5lci52a0Zvcm1hdCA9IGhlYWRlclJlYWRlci5fbmV4dFVpbnQzMigpOwogICAgY29udGFpbmVyLnR5cGVTaXplID0gaGVhZGVyUmVhZGVyLl9uZXh0VWludDMyKCk7CiAgICBjb250YWluZXIucGl4ZWxXaWR0aCA9IGhlYWRlclJlYWRlci5fbmV4dFVpbnQzMigpOwogICAgY29udGFpbmVyLnBpeGVsSGVpZ2h0ID0gaGVhZGVyUmVhZGVyLl9uZXh0VWludDMyKCk7CiAgICBjb250YWluZXIucGl4ZWxEZXB0aCA9IGhlYWRlclJlYWRlci5fbmV4dFVpbnQzMigpOwogICAgY29udGFpbmVyLmxheWVyQ291bnQgPSBoZWFkZXJSZWFkZXIuX25leHRVaW50MzIoKTsKICAgIGNvbnRhaW5lci5mYWNlQ291bnQgPSBoZWFkZXJSZWFkZXIuX25leHRVaW50MzIoKTsKICAgIGNvbnRhaW5lci5sZXZlbENvdW50ID0gaGVhZGVyUmVhZGVyLl9uZXh0VWludDMyKCk7CiAgICBjb250YWluZXIuc3VwZXJjb21wcmVzc2lvblNjaGVtZSA9IGhlYWRlclJlYWRlci5fbmV4dFVpbnQzMigpOwogICAgY29uc3QgZGZkQnl0ZU9mZnNldCA9IGhlYWRlclJlYWRlci5fbmV4dFVpbnQzMigpOwogICAgY29uc3QgZGZkQnl0ZUxlbmd0aCA9IGhlYWRlclJlYWRlci5fbmV4dFVpbnQzMigpOwogICAgY29uc3Qga3ZkQnl0ZU9mZnNldCA9IGhlYWRlclJlYWRlci5fbmV4dFVpbnQzMigpOwogICAgY29uc3Qga3ZkQnl0ZUxlbmd0aCA9IGhlYWRlclJlYWRlci5fbmV4dFVpbnQzMigpOwogICAgY29uc3Qgc2dkQnl0ZU9mZnNldCA9IGhlYWRlclJlYWRlci5fbmV4dFVpbnQ2NCgpOwogICAgY29uc3Qgc2dkQnl0ZUxlbmd0aCA9IGhlYWRlclJlYWRlci5fbmV4dFVpbnQ2NCgpOwogICAgY29uc3QgbGV2ZWxCeXRlTGVuZ3RoID0gTWF0aC5tYXgoY29udGFpbmVyLmxldmVsQ291bnQsIDEpICogMyAqIDg7CiAgICBjb25zdCBsZXZlbFJlYWRlciA9IG5ldyBCdWZmZXJSZWFkZXIoZGF0YSwgS1RYMl9JRC5sZW5ndGggKyBoZWFkZXJCeXRlTGVuZ3RoLCBsZXZlbEJ5dGVMZW5ndGgsIHRydWUpOwogICAgZm9yIChsZXQgaSA9IDAsIGlsID0gTWF0aC5tYXgoY29udGFpbmVyLmxldmVsQ291bnQsIDEpOyBpIDwgaWw7IGkrKykgewogICAgICBjb250YWluZXIubGV2ZWxzLnB1c2goewogICAgICAgIGxldmVsRGF0YTogbmV3IFVpbnQ4QXJyYXkoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCArIGxldmVsUmVhZGVyLl9uZXh0VWludDY0KCksIGxldmVsUmVhZGVyLl9uZXh0VWludDY0KCkpLAogICAgICAgIHVuY29tcHJlc3NlZEJ5dGVMZW5ndGg6IGxldmVsUmVhZGVyLl9uZXh0VWludDY0KCkKICAgICAgfSk7CiAgICB9CiAgICBjb25zdCBkZmRSZWFkZXIgPSBuZXcgQnVmZmVyUmVhZGVyKGRhdGEsIGRmZEJ5dGVPZmZzZXQsIGRmZEJ5dGVMZW5ndGgsIHRydWUpOwogICAgZGZkUmVhZGVyLl9za2lwKDQpOwogICAgY29uc3QgdmVuZG9ySWQgPSBkZmRSZWFkZXIuX25leHRVaW50MTYoKTsKICAgIGNvbnN0IGRlc2NyaXB0b3JUeXBlID0gZGZkUmVhZGVyLl9uZXh0VWludDE2KCk7CiAgICBjb25zdCB2ZXJzaW9uTnVtYmVyID0gZGZkUmVhZGVyLl9uZXh0VWludDE2KCk7CiAgICBjb25zdCBkZXNjcmlwdG9yQmxvY2tTaXplID0gZGZkUmVhZGVyLl9uZXh0VWludDE2KCk7CiAgICBjb25zdCBjb2xvck1vZGVsID0gZGZkUmVhZGVyLl9uZXh0VWludDgoKTsKICAgIGNvbnN0IGNvbG9yUHJpbWFyaWVzID0gZGZkUmVhZGVyLl9uZXh0VWludDgoKTsKICAgIGNvbnN0IHRyYW5zZmVyRnVuY3Rpb24gPSBkZmRSZWFkZXIuX25leHRVaW50OCgpOwogICAgY29uc3QgZmxhZ3MgPSBkZmRSZWFkZXIuX25leHRVaW50OCgpOwogICAgY29uc3QgdGV4ZWxCbG9ja0RpbWVuc2lvbiA9IFtkZmRSZWFkZXIuX25leHRVaW50OCgpLCBkZmRSZWFkZXIuX25leHRVaW50OCgpLCBkZmRSZWFkZXIuX25leHRVaW50OCgpLCBkZmRSZWFkZXIuX25leHRVaW50OCgpXTsKICAgIGNvbnN0IGJ5dGVzUGxhbmUgPSBbZGZkUmVhZGVyLl9uZXh0VWludDgoKSwgZGZkUmVhZGVyLl9uZXh0VWludDgoKSwgZGZkUmVhZGVyLl9uZXh0VWludDgoKSwgZGZkUmVhZGVyLl9uZXh0VWludDgoKSwgZGZkUmVhZGVyLl9uZXh0VWludDgoKSwgZGZkUmVhZGVyLl9uZXh0VWludDgoKSwgZGZkUmVhZGVyLl9uZXh0VWludDgoKSwgZGZkUmVhZGVyLl9uZXh0VWludDgoKV07CiAgICBjb25zdCBzYW1wbGVzID0gW107CiAgICBjb25zdCBkZmQgPSB7CiAgICAgIHZlbmRvcklkLAogICAgICBkZXNjcmlwdG9yVHlwZSwKICAgICAgdmVyc2lvbk51bWJlciwKICAgICAgY29sb3JNb2RlbCwKICAgICAgY29sb3JQcmltYXJpZXMsCiAgICAgIHRyYW5zZmVyRnVuY3Rpb24sCiAgICAgIGZsYWdzLAogICAgICB0ZXhlbEJsb2NrRGltZW5zaW9uLAogICAgICBieXRlc1BsYW5lLAogICAgICBzYW1wbGVzCiAgICB9OwogICAgY29uc3Qgc2FtcGxlU3RhcnQgPSA2OwogICAgY29uc3Qgc2FtcGxlV29yZHMgPSA0OwogICAgY29uc3QgbnVtU2FtcGxlcyA9IChkZXNjcmlwdG9yQmxvY2tTaXplIC8gNCAtIHNhbXBsZVN0YXJ0KSAvIHNhbXBsZVdvcmRzOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKICAgICAgY29uc3Qgc2FtcGxlID0gewogICAgICAgIGJpdE9mZnNldDogZGZkUmVhZGVyLl9uZXh0VWludDE2KCksCiAgICAgICAgYml0TGVuZ3RoOiBkZmRSZWFkZXIuX25leHRVaW50OCgpLAogICAgICAgIGNoYW5uZWxUeXBlOiBkZmRSZWFkZXIuX25leHRVaW50OCgpLAogICAgICAgIHNhbXBsZVBvc2l0aW9uOiBbZGZkUmVhZGVyLl9uZXh0VWludDgoKSwgZGZkUmVhZGVyLl9uZXh0VWludDgoKSwgZGZkUmVhZGVyLl9uZXh0VWludDgoKSwgZGZkUmVhZGVyLl9uZXh0VWludDgoKV0sCiAgICAgICAgc2FtcGxlTG93ZXI6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSwKICAgICAgICBzYW1wbGVVcHBlcjogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZCiAgICAgIH07CiAgICAgIGlmIChzYW1wbGUuY2hhbm5lbFR5cGUgJiBLSFJfREZfU0FNUExFX0RBVEFUWVBFX1NJR05FRCkgewogICAgICAgIHNhbXBsZS5zYW1wbGVMb3dlciA9IGRmZFJlYWRlci5fbmV4dEludDMyKCk7CiAgICAgICAgc2FtcGxlLnNhbXBsZVVwcGVyID0gZGZkUmVhZGVyLl9uZXh0SW50MzIoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzYW1wbGUuc2FtcGxlTG93ZXIgPSBkZmRSZWFkZXIuX25leHRVaW50MzIoKTsKICAgICAgICBzYW1wbGUuc2FtcGxlVXBwZXIgPSBkZmRSZWFkZXIuX25leHRVaW50MzIoKTsKICAgICAgfQogICAgICBkZmQuc2FtcGxlc1tpXSA9IHNhbXBsZTsKICAgIH0KICAgIGNvbnRhaW5lci5kYXRhRm9ybWF0RGVzY3JpcHRvci5sZW5ndGggPSAwOwogICAgY29udGFpbmVyLmRhdGFGb3JtYXREZXNjcmlwdG9yLnB1c2goZGZkKTsKICAgIGNvbnN0IGt2ZFJlYWRlciA9IG5ldyBCdWZmZXJSZWFkZXIoZGF0YSwga3ZkQnl0ZU9mZnNldCwga3ZkQnl0ZUxlbmd0aCwgdHJ1ZSk7CiAgICB3aGlsZSAoa3ZkUmVhZGVyLl9vZmZzZXQgPCBrdmRCeXRlTGVuZ3RoKSB7CiAgICAgIGNvbnN0IGtleVZhbHVlQnl0ZUxlbmd0aCA9IGt2ZFJlYWRlci5fbmV4dFVpbnQzMigpOwogICAgICBjb25zdCBrZXlEYXRhID0ga3ZkUmVhZGVyLl9zY2FuKGtleVZhbHVlQnl0ZUxlbmd0aCk7CiAgICAgIGNvbnN0IGtleSA9IGRlY29kZVRleHQoa2V5RGF0YSk7CiAgICAgIGNvbnRhaW5lci5rZXlWYWx1ZVtrZXldID0ga3ZkUmVhZGVyLl9uZXh0VWludDhBcnJheShrZXlWYWx1ZUJ5dGVMZW5ndGggLSBrZXlEYXRhLmJ5dGVMZW5ndGggLSAxKTsKICAgICAgaWYgKGtleS5tYXRjaCgvXmt0eC9pKSkgewogICAgICAgIGNvbnN0IHRleHQgPSBkZWNvZGVUZXh0KGNvbnRhaW5lci5rZXlWYWx1ZVtrZXldKTsKICAgICAgICBjb250YWluZXIua2V5VmFsdWVba2V5XSA9IHRleHQuc3Vic3RyaW5nKDAsIHRleHQubGFzdEluZGV4T2YoIlwwIikpOwogICAgICB9CiAgICAgIGNvbnN0IGt2UGFkZGluZyA9IGtleVZhbHVlQnl0ZUxlbmd0aCAlIDQgPyA0IC0ga2V5VmFsdWVCeXRlTGVuZ3RoICUgNCA6IDA7CiAgICAgIGt2ZFJlYWRlci5fc2tpcChrdlBhZGRpbmcpOwogICAgfQogICAgaWYgKHNnZEJ5dGVMZW5ndGggPD0gMCkgcmV0dXJuIGNvbnRhaW5lcjsKICAgIGNvbnN0IHNnZFJlYWRlciA9IG5ldyBCdWZmZXJSZWFkZXIoZGF0YSwgc2dkQnl0ZU9mZnNldCwgc2dkQnl0ZUxlbmd0aCwgdHJ1ZSk7CiAgICBjb25zdCBlbmRwb2ludENvdW50ID0gc2dkUmVhZGVyLl9uZXh0VWludDE2KCk7CiAgICBjb25zdCBzZWxlY3RvckNvdW50ID0gc2dkUmVhZGVyLl9uZXh0VWludDE2KCk7CiAgICBjb25zdCBlbmRwb2ludHNCeXRlTGVuZ3RoID0gc2dkUmVhZGVyLl9uZXh0VWludDMyKCk7CiAgICBjb25zdCBzZWxlY3RvcnNCeXRlTGVuZ3RoID0gc2dkUmVhZGVyLl9uZXh0VWludDMyKCk7CiAgICBjb25zdCB0YWJsZXNCeXRlTGVuZ3RoID0gc2dkUmVhZGVyLl9uZXh0VWludDMyKCk7CiAgICBjb25zdCBleHRlbmRlZEJ5dGVMZW5ndGggPSBzZ2RSZWFkZXIuX25leHRVaW50MzIoKTsKICAgIGNvbnN0IGltYWdlRGVzY3MgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IE1hdGgubWF4KGNvbnRhaW5lci5sZXZlbENvdW50LCAxKTsgaSA8IGlsOyBpKyspIHsKICAgICAgaW1hZ2VEZXNjcy5wdXNoKHsKICAgICAgICBpbWFnZUZsYWdzOiBzZ2RSZWFkZXIuX25leHRVaW50MzIoKSwKICAgICAgICByZ2JTbGljZUJ5dGVPZmZzZXQ6IHNnZFJlYWRlci5fbmV4dFVpbnQzMigpLAogICAgICAgIHJnYlNsaWNlQnl0ZUxlbmd0aDogc2dkUmVhZGVyLl9uZXh0VWludDMyKCksCiAgICAgICAgYWxwaGFTbGljZUJ5dGVPZmZzZXQ6IHNnZFJlYWRlci5fbmV4dFVpbnQzMigpLAogICAgICAgIGFscGhhU2xpY2VCeXRlTGVuZ3RoOiBzZ2RSZWFkZXIuX25leHRVaW50MzIoKQogICAgICB9KTsKICAgIH0KICAgIGNvbnN0IGVuZHBvaW50c0J5dGVPZmZzZXQgPSBzZ2RCeXRlT2Zmc2V0ICsgc2dkUmVhZGVyLl9vZmZzZXQ7CiAgICBjb25zdCBzZWxlY3RvcnNCeXRlT2Zmc2V0ID0gZW5kcG9pbnRzQnl0ZU9mZnNldCArIGVuZHBvaW50c0J5dGVMZW5ndGg7CiAgICBjb25zdCB0YWJsZXNCeXRlT2Zmc2V0ID0gc2VsZWN0b3JzQnl0ZU9mZnNldCArIHNlbGVjdG9yc0J5dGVMZW5ndGg7CiAgICBjb25zdCBleHRlbmRlZEJ5dGVPZmZzZXQgPSB0YWJsZXNCeXRlT2Zmc2V0ICsgdGFibGVzQnl0ZUxlbmd0aDsKICAgIGNvbnN0IGVuZHBvaW50c0RhdGEgPSBuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0ICsgZW5kcG9pbnRzQnl0ZU9mZnNldCwgZW5kcG9pbnRzQnl0ZUxlbmd0aCk7CiAgICBjb25zdCBzZWxlY3RvcnNEYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCArIHNlbGVjdG9yc0J5dGVPZmZzZXQsIHNlbGVjdG9yc0J5dGVMZW5ndGgpOwogICAgY29uc3QgdGFibGVzRGF0YSA9IG5ldyBVaW50OEFycmF5KGRhdGEuYnVmZmVyLCBkYXRhLmJ5dGVPZmZzZXQgKyB0YWJsZXNCeXRlT2Zmc2V0LCB0YWJsZXNCeXRlTGVuZ3RoKTsKICAgIGNvbnN0IGV4dGVuZGVkRGF0YSA9IG5ldyBVaW50OEFycmF5KGRhdGEuYnVmZmVyLCBkYXRhLmJ5dGVPZmZzZXQgKyBleHRlbmRlZEJ5dGVPZmZzZXQsIGV4dGVuZGVkQnl0ZUxlbmd0aCk7CiAgICBjb250YWluZXIuZ2xvYmFsRGF0YSA9IHsKICAgICAgZW5kcG9pbnRDb3VudCwKICAgICAgc2VsZWN0b3JDb3VudCwKICAgICAgaW1hZ2VEZXNjcywKICAgICAgZW5kcG9pbnRzRGF0YSwKICAgICAgc2VsZWN0b3JzRGF0YSwKICAgICAgdGFibGVzRGF0YSwKICAgICAgZXh0ZW5kZWREYXRhCiAgICB9OwogICAgcmV0dXJuIGNvbnRhaW5lcjsKICB9CiAgdmFyIEtIUl9TVVBFUkNPTVBSRVNTSU9OX05PTkUsIEtIUl9ERl9LSFJfREVTQ1JJUFRPUlRZUEVfQkFTSUNGT1JNQVQsIEtIUl9ERl9WRU5ET1JJRF9LSFJPTk9TLCBLSFJfREZfVkVSU0lPTiwgS0hSX0RGX01PREVMX1VOU1BFQ0lGSUVELCBLSFJfREZfRkxBR19BTFBIQV9TVFJBSUdIVCwgS0hSX0RGX1RSQU5TRkVSX1NSR0IsIEtIUl9ERl9QUklNQVJJRVNfQlQ3MDksIEtIUl9ERl9TQU1QTEVfREFUQVRZUEVfU0lHTkVELCBWS19GT1JNQVRfVU5ERUZJTkVELCBCdWZmZXJSZWFkZXIsIE5VTCwgS1RYMl9JRDsKICB2YXIgaW5pdF9rdHhfcGFyc2VfbW9kZXJuID0gX19lc20oewogICAgIm5vZGVfbW9kdWxlcy9rdHgtcGFyc2UvZGlzdC9rdHgtcGFyc2UubW9kZXJuLmpzIigpIHsKICAgICAgS0hSX1NVUEVSQ09NUFJFU1NJT05fTk9ORSA9IDA7CiAgICAgIEtIUl9ERl9LSFJfREVTQ1JJUFRPUlRZUEVfQkFTSUNGT1JNQVQgPSAwOwogICAgICBLSFJfREZfVkVORE9SSURfS0hST05PUyA9IDA7CiAgICAgIEtIUl9ERl9WRVJTSU9OID0gMjsKICAgICAgS0hSX0RGX01PREVMX1VOU1BFQ0lGSUVEID0gMDsKICAgICAgS0hSX0RGX0ZMQUdfQUxQSEFfU1RSQUlHSFQgPSAwOwogICAgICBLSFJfREZfVFJBTlNGRVJfU1JHQiA9IDI7CiAgICAgIEtIUl9ERl9QUklNQVJJRVNfQlQ3MDkgPSAxOwogICAgICBLSFJfREZfU0FNUExFX0RBVEFUWVBFX1NJR05FRCA9IDY0OwogICAgICBWS19GT1JNQVRfVU5ERUZJTkVEID0gMDsKICAgICAgQnVmZmVyUmVhZGVyID0gY2xhc3MgewogICAgICAgIGNvbnN0cnVjdG9yKGRhdGEsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgsIGxpdHRsZUVuZGlhbjIpIHsKICAgICAgICAgIHRoaXMuX2RhdGFWaWV3ID0gdm9pZCAwOwogICAgICAgICAgdGhpcy5fbGl0dGxlRW5kaWFuID0gdm9pZCAwOwogICAgICAgICAgdGhpcy5fb2Zmc2V0ID0gdm9pZCAwOwogICAgICAgICAgdGhpcy5fZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCArIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpOwogICAgICAgICAgdGhpcy5fbGl0dGxlRW5kaWFuID0gbGl0dGxlRW5kaWFuMjsKICAgICAgICAgIHRoaXMuX29mZnNldCA9IDA7CiAgICAgICAgfQogICAgICAgIF9uZXh0VWludDgoKSB7CiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RhdGFWaWV3LmdldFVpbnQ4KHRoaXMuX29mZnNldCk7CiAgICAgICAgICB0aGlzLl9vZmZzZXQgKz0gMTsKICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgX25leHRVaW50MTYoKSB7CiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RhdGFWaWV3LmdldFVpbnQxNih0aGlzLl9vZmZzZXQsIHRoaXMuX2xpdHRsZUVuZGlhbik7CiAgICAgICAgICB0aGlzLl9vZmZzZXQgKz0gMjsKICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgX25leHRVaW50MzIoKSB7CiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RhdGFWaWV3LmdldFVpbnQzMih0aGlzLl9vZmZzZXQsIHRoaXMuX2xpdHRsZUVuZGlhbik7CiAgICAgICAgICB0aGlzLl9vZmZzZXQgKz0gNDsKICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgX25leHRVaW50NjQoKSB7CiAgICAgICAgICBjb25zdCBsZWZ0ID0gdGhpcy5fZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMuX29mZnNldCwgdGhpcy5fbGl0dGxlRW5kaWFuKTsKICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdGhpcy5fZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMuX29mZnNldCArIDQsIHRoaXMuX2xpdHRsZUVuZGlhbik7CiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGxlZnQgKyAyICoqIDMyICogcmlnaHQ7CiAgICAgICAgICB0aGlzLl9vZmZzZXQgKz0gODsKICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgX25leHRJbnQzMigpIHsKICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZGF0YVZpZXcuZ2V0SW50MzIodGhpcy5fb2Zmc2V0LCB0aGlzLl9saXR0bGVFbmRpYW4pOwogICAgICAgICAgdGhpcy5fb2Zmc2V0ICs9IDQ7CiAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQogICAgICAgIF9uZXh0VWludDhBcnJheShsZW4pIHsKICAgICAgICAgIGNvbnN0IHZhbHVlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fZGF0YVZpZXcuYnVmZmVyLCB0aGlzLl9kYXRhVmlldy5ieXRlT2Zmc2V0ICsgdGhpcy5fb2Zmc2V0LCBsZW4pOwogICAgICAgICAgdGhpcy5fb2Zmc2V0ICs9IGxlbjsKICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgX3NraXAoYnl0ZXMpIHsKICAgICAgICAgIHRoaXMuX29mZnNldCArPSBieXRlczsKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICBfc2NhbihtYXhCeXRlTGVuZ3RoLCB0ZXJtID0gMCkgewogICAgICAgICAgY29uc3QgYnl0ZU9mZnNldCA9IHRoaXMuX29mZnNldDsKICAgICAgICAgIGxldCBieXRlTGVuZ3RoID0gMDsKICAgICAgICAgIHdoaWxlICh0aGlzLl9kYXRhVmlldy5nZXRVaW50OCh0aGlzLl9vZmZzZXQpICE9PSB0ZXJtICYmIGJ5dGVMZW5ndGggPCBtYXhCeXRlTGVuZ3RoKSB7CiAgICAgICAgICAgIGJ5dGVMZW5ndGgrKzsKICAgICAgICAgICAgdGhpcy5fb2Zmc2V0Kys7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYnl0ZUxlbmd0aCA8IG1heEJ5dGVMZW5ndGgpIHRoaXMuX29mZnNldCsrOwogICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHRoaXMuX2RhdGFWaWV3LmJ1ZmZlciwgdGhpcy5fZGF0YVZpZXcuYnl0ZU9mZnNldCArIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgTlVMID0gbmV3IFVpbnQ4QXJyYXkoWzBdKTsKICAgICAgS1RYMl9JRCA9IFsKICAgICAgICAvLyAnwrQnLCAnSycsICdUJywgJ1gnLCAnMicsICcwJywgJ8KqJywgJ1xyJywgJ1xuJywgJ1x4MUEnLCAnXG4nCiAgICAgICAgMTcxLAogICAgICAgIDc1LAogICAgICAgIDg0LAogICAgICAgIDg4LAogICAgICAgIDMyLAogICAgICAgIDUwLAogICAgICAgIDQ4LAogICAgICAgIDE4NywKICAgICAgICAxMywKICAgICAgICAxMCwKICAgICAgICAyNiwKICAgICAgICAxMAogICAgICBdOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL1RoaXJkUGFydHkvV29ya2Vycy9iYXNpc190cmFuc2NvZGVyLmpzCiAgdmFyIHJlcXVpcmVfYmFzaXNfdHJhbnNjb2RlciA9IF9fY29tbW9uSlMoewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvVGhpcmRQYXJ0eS9Xb3JrZXJzL2Jhc2lzX3RyYW5zY29kZXIuanMiKGV4cG9ydHMyLCBtb2R1bGUpIHsKICAgICAgdmFyIEJBU0lTID0gKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBfc2NyaXB0RGlyID0gdHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMgOiB2b2lkIDA7CiAgICAgICAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lICE9PSAidW5kZWZpbmVkIikgX3NjcmlwdERpciA9IF9zY3JpcHREaXIgfHwgX19maWxlbmFtZTsKICAgICAgICByZXR1cm4gKGZ1bmN0aW9uKEJBU0lTMikgewogICAgICAgICAgQkFTSVMyID0gQkFTSVMyIHx8IHt9OwogICAgICAgICAgdmFyIE1vZHVsZSA9IHR5cGVvZiBCQVNJUzIgIT09ICJ1bmRlZmluZWQiID8gQkFTSVMyIDoge307CiAgICAgICAgICB2YXIgcmVhZHlQcm9taXNlUmVzb2x2ZSwgcmVhZHlQcm9taXNlUmVqZWN0OwogICAgICAgICAgTW9kdWxlWyJyZWFkeSJdID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgIHJlYWR5UHJvbWlzZVJlc29sdmUgPSByZXNvbHZlOwogICAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QgPSByZWplY3Q7CiAgICAgICAgICB9KTsKICAgICAgICAgIHZhciBtb2R1bGVPdmVycmlkZXMgPSB7fTsKICAgICAgICAgIHZhciBrZXk7CiAgICAgICAgICBmb3IgKGtleSBpbiBNb2R1bGUpIHsKICAgICAgICAgICAgaWYgKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgbW9kdWxlT3ZlcnJpZGVzW2tleV0gPSBNb2R1bGVba2V5XTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdmFyIGFyZ3VtZW50c18gPSBbXTsKICAgICAgICAgIHZhciB0aGlzUHJvZ3JhbSA9ICIuL3RoaXMucHJvZ3JhbSI7CiAgICAgICAgICB2YXIgcXVpdF8gPSBmdW5jdGlvbihzdGF0dXMsIHRvVGhyb3cpIHsKICAgICAgICAgICAgdGhyb3cgdG9UaHJvdzsKICAgICAgICAgIH07CiAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV0VCID0gZmFsc2U7CiAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV09SS0VSID0gZmFsc2U7CiAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfTk9ERSA9IGZhbHNlOwogICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX1NIRUxMID0gZmFsc2U7CiAgICAgICAgICBFTlZJUk9OTUVOVF9JU19XRUIgPSB0eXBlb2Ygd2luZG93ID09PSAib2JqZWN0IjsKICAgICAgICAgIEVOVklST05NRU5UX0lTX1dPUktFUiA9IHR5cGVvZiBpbXBvcnRTY3JpcHRzID09PSAiZnVuY3Rpb24iOwogICAgICAgICAgRU5WSVJPTk1FTlRfSVNfTk9ERSA9IHR5cGVvZiBwcm9jZXNzID09PSAib2JqZWN0IiAmJiB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSA9PT0gInN0cmluZyI7CiAgICAgICAgICBFTlZJUk9OTUVOVF9JU19TSEVMTCA9ICFFTlZJUk9OTUVOVF9JU19XRUIgJiYgIUVOVklST05NRU5UX0lTX05PREUgJiYgIUVOVklST05NRU5UX0lTX1dPUktFUjsKICAgICAgICAgIHZhciBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgIGZ1bmN0aW9uIGxvY2F0ZUZpbGUocGF0aCkgewogICAgICAgICAgICBpZiAoTW9kdWxlWyJsb2NhdGVGaWxlIl0pIHsKICAgICAgICAgICAgICByZXR1cm4gTW9kdWxlWyJsb2NhdGVGaWxlIl0ocGF0aCwgc2NyaXB0RGlyZWN0b3J5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2NyaXB0RGlyZWN0b3J5ICsgcGF0aDsKICAgICAgICAgIH0KICAgICAgICAgIHZhciByZWFkXywgcmVhZEFzeW5jLCByZWFkQmluYXJ5LCBzZXRXaW5kb3dUaXRsZTsKICAgICAgICAgIHZhciBub2RlRlM7CiAgICAgICAgICB2YXIgbm9kZVBhdGg7CiAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkgewogICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX19yZXF1aXJlKCJwYXRoIikuZGlybmFtZShzY3JpcHREaXJlY3RvcnkpICsgIi8iOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9fZGlybmFtZSArICIvIjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZWFkXyA9IGZ1bmN0aW9uIHNoZWxsX3JlYWQoZmlsZW5hbWUsIGJpbmFyeSkgewogICAgICAgICAgICAgIGlmICghbm9kZUZTKSBub2RlRlMgPSBfX3JlcXVpcmUoImZzIik7CiAgICAgICAgICAgICAgaWYgKCFub2RlUGF0aCkgbm9kZVBhdGggPSBfX3JlcXVpcmUoInBhdGgiKTsKICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5vZGVQYXRoWyJub3JtYWxpemUiXShmaWxlbmFtZSk7CiAgICAgICAgICAgICAgcmV0dXJuIG5vZGVGU1sicmVhZEZpbGVTeW5jIl0oZmlsZW5hbWUsIGJpbmFyeSA/IG51bGwgOiAidXRmOCIpOwogICAgICAgICAgICB9OwogICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeTIoZmlsZW5hbWUpIHsKICAgICAgICAgICAgICB2YXIgcmV0ID0gcmVhZF8oZmlsZW5hbWUsIHRydWUpOwogICAgICAgICAgICAgIGlmICghcmV0LmJ1ZmZlcikgewogICAgICAgICAgICAgICAgcmV0ID0gbmV3IFVpbnQ4QXJyYXkocmV0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYXNzZXJ0KHJldC5idWZmZXIpOwogICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChwcm9jZXNzWyJhcmd2Il0ubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgIHRoaXNQcm9ncmFtID0gcHJvY2Vzc1siYXJndiJdWzFdLnJlcGxhY2UoL1xcL2csICIvIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXJndW1lbnRzXyA9IHByb2Nlc3NbImFyZ3YiXS5zbGljZSgyKTsKICAgICAgICAgICAgcHJvY2Vzc1sib24iXSgidW5jYXVnaHRFeGNlcHRpb24iLCBmdW5jdGlvbihleCkgewogICAgICAgICAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpIHsKICAgICAgICAgICAgICAgIHRocm93IGV4OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHByb2Nlc3NbIm9uIl0oInVuaGFuZGxlZFJlamVjdGlvbiIsIGFib3J0KTsKICAgICAgICAgICAgcXVpdF8gPSBmdW5jdGlvbihzdGF0dXMpIHsKICAgICAgICAgICAgICBwcm9jZXNzWyJleGl0Il0oc3RhdHVzKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgTW9kdWxlWyJpbnNwZWN0Il0gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICByZXR1cm4gIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIjsKICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSBpZiAoRU5WSVJPTk1FTlRfSVNfU0hFTEwpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFkICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgcmVhZF8gPSBmdW5jdGlvbiBzaGVsbF9yZWFkKGYpIHsKICAgICAgICAgICAgICAgIHJldHVybiByZWFkKGYpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVhZEJpbmFyeSA9IGZ1bmN0aW9uIHJlYWRCaW5hcnkyKGYpIHsKICAgICAgICAgICAgICB2YXIgZGF0YTsKICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlYWRidWZmZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZWFkYnVmZmVyKGYpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZGF0YSA9IHJlYWQoZiwgImJpbmFyeSIpOwogICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgZGF0YSA9PT0gIm9iamVjdCIpOwogICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodHlwZW9mIHNjcmlwdEFyZ3MgIT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICBhcmd1bWVudHNfID0gc2NyaXB0QXJnczsKICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXJndW1lbnRzICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgYXJndW1lbnRzXyA9IGFyZ3VtZW50czsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZW9mIHF1aXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uKHN0YXR1cykgewogICAgICAgICAgICAgICAgcXVpdChzdGF0dXMpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZiBwcmludCAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09ICJ1bmRlZmluZWQiKSBjb25zb2xlID0ge307CiAgICAgICAgICAgICAgY29uc29sZS5sb2cgPSBwcmludDsKICAgICAgICAgICAgICBjb25zb2xlLndhcm4gPSBjb25zb2xlLmVycm9yID0gdHlwZW9mIHByaW50RXJyICE9PSAidW5kZWZpbmVkIiA/IHByaW50RXJyIDogcHJpbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoRU5WSVJPTk1FTlRfSVNfV0VCIHx8IEVOVklST05NRU5UX0lTX1dPUktFUikgewogICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2VsZi5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCkgewogICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChfc2NyaXB0RGlyKSB7CiAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX3NjcmlwdERpcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2NyaXB0RGlyZWN0b3J5LmluZGV4T2YoImJsb2I6IikgIT09IDApIHsKICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsIHNjcmlwdERpcmVjdG9yeS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gIiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgewogICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24odXJsKSB7CiAgICAgICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgICAgIHJldHVybiB4aHIucmVzcG9uc2VUZXh0OwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1dPUktFUikgewogICAgICAgICAgICAgICAgcmVhZEJpbmFyeSA9IGZ1bmN0aW9uKHVybCkgewogICAgICAgICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgICAgICAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJlYWRBc3luYyA9IGZ1bmN0aW9uKHVybCwgb25sb2FkLCBvbmVycm9yKSB7CiAgICAgICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCB0cnVlKTsKICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDAgfHwgeGhyLnN0YXR1cyA9PSAwICYmIHhoci5yZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIG9ubG9hZCh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBvbmVycm9yKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSBvbmVycm9yOwogICAgICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRXaW5kb3dUaXRsZSA9IGZ1bmN0aW9uKHRpdGxlKSB7CiAgICAgICAgICAgICAgZG9jdW1lbnQudGl0bGUgPSB0aXRsZTsKICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgb3V0ID0gTW9kdWxlWyJwcmludCJdIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7CiAgICAgICAgICB2YXIgZXJyID0gTW9kdWxlWyJwcmludEVyciJdIHx8IGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpOwogICAgICAgICAgZm9yIChrZXkgaW4gbW9kdWxlT3ZlcnJpZGVzKSB7CiAgICAgICAgICAgIGlmIChtb2R1bGVPdmVycmlkZXMuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgICAgIE1vZHVsZVtrZXldID0gbW9kdWxlT3ZlcnJpZGVzW2tleV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG1vZHVsZU92ZXJyaWRlcyA9IG51bGw7CiAgICAgICAgICBpZiAoTW9kdWxlWyJhcmd1bWVudHMiXSkgYXJndW1lbnRzXyA9IE1vZHVsZVsiYXJndW1lbnRzIl07CiAgICAgICAgICBpZiAoTW9kdWxlWyJ0aGlzUHJvZ3JhbSJdKSB0aGlzUHJvZ3JhbSA9IE1vZHVsZVsidGhpc1Byb2dyYW0iXTsKICAgICAgICAgIGlmIChNb2R1bGVbInF1aXQiXSkgcXVpdF8gPSBNb2R1bGVbInF1aXQiXTsKICAgICAgICAgIHZhciB0ZW1wUmV0MCA9IDA7CiAgICAgICAgICB2YXIgc2V0VGVtcFJldDAgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICB0ZW1wUmV0MCA9IHZhbHVlOwogICAgICAgICAgfTsKICAgICAgICAgIHZhciB3YXNtQmluYXJ5OwogICAgICAgICAgaWYgKE1vZHVsZVsid2FzbUJpbmFyeSJdKSB3YXNtQmluYXJ5ID0gTW9kdWxlWyJ3YXNtQmluYXJ5Il07CiAgICAgICAgICB2YXIgbm9FeGl0UnVudGltZSA9IE1vZHVsZVsibm9FeGl0UnVudGltZSJdIHx8IHRydWU7CiAgICAgICAgICBpZiAodHlwZW9mIFdlYkFzc2VtYmx5ICE9PSAib2JqZWN0IikgewogICAgICAgICAgICBhYm9ydCgibm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZCIpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHdhc21NZW1vcnk7CiAgICAgICAgICB2YXIgQUJPUlQgPSBmYWxzZTsKICAgICAgICAgIHZhciBFWElUU1RBVFVTOwogICAgICAgICAgZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgdGV4dCkgewogICAgICAgICAgICBpZiAoIWNvbmRpdGlvbikgewogICAgICAgICAgICAgIGFib3J0KCJBc3NlcnRpb24gZmFpbGVkOiAiICsgdGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHZhciBVVEY4RGVjb2RlciA9IHR5cGVvZiBUZXh0RGVjb2RlciAhPT0gInVuZGVmaW5lZCIgPyBuZXcgVGV4dERlY29kZXIoInV0ZjgiKSA6IHZvaWQgMDsKICAgICAgICAgIGZ1bmN0aW9uIFVURjhBcnJheVRvU3RyaW5nKGhlYXAsIGlkeCwgbWF4Qnl0ZXNUb1JlYWQpIHsKICAgICAgICAgICAgdmFyIGVuZElkeCA9IGlkeCArIG1heEJ5dGVzVG9SZWFkOwogICAgICAgICAgICB2YXIgZW5kUHRyID0gaWR4OwogICAgICAgICAgICB3aGlsZSAoaGVhcFtlbmRQdHJdICYmICEoZW5kUHRyID49IGVuZElkeCkpICsrZW5kUHRyOwogICAgICAgICAgICBpZiAoZW5kUHRyIC0gaWR4ID4gMTYgJiYgaGVhcC5zdWJhcnJheSAmJiBVVEY4RGVjb2RlcikgewogICAgICAgICAgICAgIHJldHVybiBVVEY4RGVjb2Rlci5kZWNvZGUoaGVhcC5zdWJhcnJheShpZHgsIGVuZFB0cikpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhciBzdHIgPSAiIjsKICAgICAgICAgICAgICB3aGlsZSAoaWR4IDwgZW5kUHRyKSB7CiAgICAgICAgICAgICAgICB2YXIgdTAgPSBoZWFwW2lkeCsrXTsKICAgICAgICAgICAgICAgIGlmICghKHUwICYgMTI4KSkgewogICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHUxMiA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICBpZiAoKHUwICYgMjI0KSA9PSAxOTIpIHsKICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKHUwICYgMzEpIDw8IDYgfCB1MTIpOwogICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB1MjIgPSBoZWFwW2lkeCsrXSAmIDYzOwogICAgICAgICAgICAgICAgaWYgKCh1MCAmIDI0MCkgPT0gMjI0KSB7CiAgICAgICAgICAgICAgICAgIHUwID0gKHUwICYgMTUpIDw8IDEyIHwgdTEyIDw8IDYgfCB1MjI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICB1MCA9ICh1MCAmIDcpIDw8IDE4IHwgdTEyIDw8IDEyIHwgdTIyIDw8IDYgfCBoZWFwW2lkeCsrXSAmIDYzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHUwIDwgNjU1MzYpIHsKICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgdmFyIGNoID0gdTAgLSA2NTUzNjsKICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTYgfCBjaCA+PiAxMCwgNTYzMjAgfCBjaCAmIDEwMjMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gVVRGOFRvU3RyaW5nKHB0ciwgbWF4Qnl0ZXNUb1JlYWQpIHsKICAgICAgICAgICAgcmV0dXJuIHB0ciA/IFVURjhBcnJheVRvU3RyaW5nKEhFQVBVOCwgcHRyLCBtYXhCeXRlc1RvUmVhZCkgOiAiIjsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIHN0cmluZ1RvVVRGOEFycmF5KHN0ciwgaGVhcCwgb3V0SWR4LCBtYXhCeXRlc1RvV3JpdGUpIHsKICAgICAgICAgICAgaWYgKCEobWF4Qnl0ZXNUb1dyaXRlID4gMCkpIHJldHVybiAwOwogICAgICAgICAgICB2YXIgc3RhcnRJZHggPSBvdXRJZHg7CiAgICAgICAgICAgIHZhciBlbmRJZHggPSBvdXRJZHggKyBtYXhCeXRlc1RvV3JpdGUgLSAxOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgIHZhciB1MyA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICAgIGlmICh1MyA+PSA1NTI5NiAmJiB1MyA8PSA1NzM0MykgewogICAgICAgICAgICAgICAgdmFyIHUxMiA9IHN0ci5jaGFyQ29kZUF0KCsraSk7CiAgICAgICAgICAgICAgICB1MyA9IDY1NTM2ICsgKCh1MyAmIDEwMjMpIDw8IDEwKSB8IHUxMiAmIDEwMjM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICh1MyA8PSAxMjcpIHsKICAgICAgICAgICAgICAgIGlmIChvdXRJZHggPj0gZW5kSWR4KSBicmVhazsKICAgICAgICAgICAgICAgIGhlYXBbb3V0SWR4KytdID0gdTM7CiAgICAgICAgICAgICAgfSBlbHNlIGlmICh1MyA8PSAyMDQ3KSB7CiAgICAgICAgICAgICAgICBpZiAob3V0SWR4ICsgMSA+PSBlbmRJZHgpIGJyZWFrOwogICAgICAgICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAxOTIgfCB1MyA+PiA2OwogICAgICAgICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAxMjggfCB1MyAmIDYzOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodTMgPD0gNjU1MzUpIHsKICAgICAgICAgICAgICAgIGlmIChvdXRJZHggKyAyID49IGVuZElkeCkgYnJlYWs7CiAgICAgICAgICAgICAgICBoZWFwW291dElkeCsrXSA9IDIyNCB8IHUzID4+IDEyOwogICAgICAgICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAxMjggfCB1MyA+PiA2ICYgNjM7CiAgICAgICAgICAgICAgICBoZWFwW291dElkeCsrXSA9IDEyOCB8IHUzICYgNjM7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChvdXRJZHggKyAzID49IGVuZElkeCkgYnJlYWs7CiAgICAgICAgICAgICAgICBoZWFwW291dElkeCsrXSA9IDI0MCB8IHUzID4+IDE4OwogICAgICAgICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAxMjggfCB1MyA+PiAxMiAmIDYzOwogICAgICAgICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAxMjggfCB1MyA+PiA2ICYgNjM7CiAgICAgICAgICAgICAgICBoZWFwW291dElkeCsrXSA9IDEyOCB8IHUzICYgNjM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGhlYXBbb3V0SWR4XSA9IDA7CiAgICAgICAgICAgIHJldHVybiBvdXRJZHggLSBzdGFydElkeDsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIHN0cmluZ1RvVVRGOChzdHIsIG91dFB0ciwgbWF4Qnl0ZXNUb1dyaXRlKSB7CiAgICAgICAgICAgIHJldHVybiBzdHJpbmdUb1VURjhBcnJheShzdHIsIEhFQVBVOCwgb3V0UHRyLCBtYXhCeXRlc1RvV3JpdGUpOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gbGVuZ3RoQnl0ZXNVVEY4KHN0cikgewogICAgICAgICAgICB2YXIgbGVuID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICB2YXIgdTMgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICBpZiAodTMgPj0gNTUyOTYgJiYgdTMgPD0gNTczNDMpIHUzID0gNjU1MzYgKyAoKHUzICYgMTAyMykgPDwgMTApIHwgc3RyLmNoYXJDb2RlQXQoKytpKSAmIDEwMjM7CiAgICAgICAgICAgICAgaWYgKHUzIDw9IDEyNykgKytsZW47CiAgICAgICAgICAgICAgZWxzZSBpZiAodTMgPD0gMjA0NykgbGVuICs9IDI7CiAgICAgICAgICAgICAgZWxzZSBpZiAodTMgPD0gNjU1MzUpIGxlbiArPSAzOwogICAgICAgICAgICAgIGVsc2UgbGVuICs9IDQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGxlbjsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBVVEYxNkRlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgIT09ICJ1bmRlZmluZWQiID8gbmV3IFRleHREZWNvZGVyKCJ1dGYtMTZsZSIpIDogdm9pZCAwOwogICAgICAgICAgZnVuY3Rpb24gVVRGMTZUb1N0cmluZyhwdHIsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgIHZhciBlbmRQdHIgPSBwdHI7CiAgICAgICAgICAgIHZhciBpZHggPSBlbmRQdHIgPj4gMTsKICAgICAgICAgICAgdmFyIG1heElkeCA9IGlkeCArIG1heEJ5dGVzVG9SZWFkIC8gMjsKICAgICAgICAgICAgd2hpbGUgKCEoaWR4ID49IG1heElkeCkgJiYgSEVBUFUxNltpZHhdKSArK2lkeDsKICAgICAgICAgICAgZW5kUHRyID0gaWR4IDw8IDE7CiAgICAgICAgICAgIGlmIChlbmRQdHIgLSBwdHIgPiAzMiAmJiBVVEYxNkRlY29kZXIpIHsKICAgICAgICAgICAgICByZXR1cm4gVVRGMTZEZWNvZGVyLmRlY29kZShIRUFQVTguc3ViYXJyYXkocHRyLCBlbmRQdHIpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YXIgc3RyID0gIiI7CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7ICEoaSA+PSBtYXhCeXRlc1RvUmVhZCAvIDIpOyArK2kpIHsKICAgICAgICAgICAgICAgIHZhciBjb2RlVW5pdCA9IEhFQVAxNltwdHIgKyBpICogMiA+PiAxXTsKICAgICAgICAgICAgICAgIGlmIChjb2RlVW5pdCA9PSAwKSBicmVhazsKICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVVbml0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gc3RyaW5nVG9VVEYxNihzdHIsIG91dFB0ciwgbWF4Qnl0ZXNUb1dyaXRlKSB7CiAgICAgICAgICAgIGlmIChtYXhCeXRlc1RvV3JpdGUgPT09IHZvaWQgMCkgewogICAgICAgICAgICAgIG1heEJ5dGVzVG9Xcml0ZSA9IDIxNDc0ODM2NDc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1heEJ5dGVzVG9Xcml0ZSA8IDIpIHJldHVybiAwOwogICAgICAgICAgICBtYXhCeXRlc1RvV3JpdGUgLT0gMjsKICAgICAgICAgICAgdmFyIHN0YXJ0UHRyID0gb3V0UHRyOwogICAgICAgICAgICB2YXIgbnVtQ2hhcnNUb1dyaXRlID0gbWF4Qnl0ZXNUb1dyaXRlIDwgc3RyLmxlbmd0aCAqIDIgPyBtYXhCeXRlc1RvV3JpdGUgLyAyIDogc3RyLmxlbmd0aDsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1DaGFyc1RvV3JpdGU7ICsraSkgewogICAgICAgICAgICAgIHZhciBjb2RlVW5pdCA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICAgIEhFQVAxNltvdXRQdHIgPj4gMV0gPSBjb2RlVW5pdDsKICAgICAgICAgICAgICBvdXRQdHIgKz0gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBIRUFQMTZbb3V0UHRyID4+IDFdID0gMDsKICAgICAgICAgICAgcmV0dXJuIG91dFB0ciAtIHN0YXJ0UHRyOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gbGVuZ3RoQnl0ZXNVVEYxNihzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ci5sZW5ndGggKiAyOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gVVRGMzJUb1N0cmluZyhwdHIsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgdmFyIHN0ciA9ICIiOwogICAgICAgICAgICB3aGlsZSAoIShpID49IG1heEJ5dGVzVG9SZWFkIC8gNCkpIHsKICAgICAgICAgICAgICB2YXIgdXRmMzIgPSBIRUFQMzJbcHRyICsgaSAqIDQgPj4gMl07CiAgICAgICAgICAgICAgaWYgKHV0ZjMyID09IDApIGJyZWFrOwogICAgICAgICAgICAgICsraTsKICAgICAgICAgICAgICBpZiAodXRmMzIgPj0gNjU1MzYpIHsKICAgICAgICAgICAgICAgIHZhciBjaCA9IHV0ZjMyIC0gNjU1MzY7CiAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NiB8IGNoID4+IDEwLCA1NjMyMCB8IGNoICYgMTAyMyk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHV0ZjMyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIHN0cmluZ1RvVVRGMzIoc3RyLCBvdXRQdHIsIG1heEJ5dGVzVG9Xcml0ZSkgewogICAgICAgICAgICBpZiAobWF4Qnl0ZXNUb1dyaXRlID09PSB2b2lkIDApIHsKICAgICAgICAgICAgICBtYXhCeXRlc1RvV3JpdGUgPSAyMTQ3NDgzNjQ3OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtYXhCeXRlc1RvV3JpdGUgPCA0KSByZXR1cm4gMDsKICAgICAgICAgICAgdmFyIHN0YXJ0UHRyID0gb3V0UHRyOwogICAgICAgICAgICB2YXIgZW5kUHRyID0gc3RhcnRQdHIgKyBtYXhCeXRlc1RvV3JpdGUgLSA0OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgIHZhciBjb2RlVW5pdCA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICAgIGlmIChjb2RlVW5pdCA+PSA1NTI5NiAmJiBjb2RlVW5pdCA8PSA1NzM0MykgewogICAgICAgICAgICAgICAgdmFyIHRyYWlsU3Vycm9nYXRlID0gc3RyLmNoYXJDb2RlQXQoKytpKTsKICAgICAgICAgICAgICAgIGNvZGVVbml0ID0gNjU1MzYgKyAoKGNvZGVVbml0ICYgMTAyMykgPDwgMTApIHwgdHJhaWxTdXJyb2dhdGUgJiAxMDIzOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBIRUFQMzJbb3V0UHRyID4+IDJdID0gY29kZVVuaXQ7CiAgICAgICAgICAgICAgb3V0UHRyICs9IDQ7CiAgICAgICAgICAgICAgaWYgKG91dFB0ciArIDQgPiBlbmRQdHIpIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEhFQVAzMltvdXRQdHIgPj4gMl0gPSAwOwogICAgICAgICAgICByZXR1cm4gb3V0UHRyIC0gc3RhcnRQdHI7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBsZW5ndGhCeXRlc1VURjMyKHN0cikgewogICAgICAgICAgICB2YXIgbGVuID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICB2YXIgY29kZVVuaXQgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICBpZiAoY29kZVVuaXQgPj0gNTUyOTYgJiYgY29kZVVuaXQgPD0gNTczNDMpICsraTsKICAgICAgICAgICAgICBsZW4gKz0gNDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbGVuOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gYWxpZ25VcCh4LCBtdWx0aXBsZSkgewogICAgICAgICAgICBpZiAoeCAlIG11bHRpcGxlID4gMCkgewogICAgICAgICAgICAgIHggKz0gbXVsdGlwbGUgLSB4ICUgbXVsdGlwbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgYnVmZmVyLCBIRUFQOCwgSEVBUFU4LCBIRUFQMTYsIEhFQVBVMTYsIEhFQVAzMiwgSEVBUFUzMiwgSEVBUEYzMiwgSEVBUEY2NDsKICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1ZikgewogICAgICAgICAgICBidWZmZXIgPSBidWY7CiAgICAgICAgICAgIE1vZHVsZVsiSEVBUDgiXSA9IEhFQVA4ID0gbmV3IEludDhBcnJheShidWYpOwogICAgICAgICAgICBNb2R1bGVbIkhFQVAxNiJdID0gSEVBUDE2ID0gbmV3IEludDE2QXJyYXkoYnVmKTsKICAgICAgICAgICAgTW9kdWxlWyJIRUFQMzIiXSA9IEhFQVAzMiA9IG5ldyBJbnQzMkFycmF5KGJ1Zik7CiAgICAgICAgICAgIE1vZHVsZVsiSEVBUFU4Il0gPSBIRUFQVTggPSBuZXcgVWludDhBcnJheShidWYpOwogICAgICAgICAgICBNb2R1bGVbIkhFQVBVMTYiXSA9IEhFQVBVMTYgPSBuZXcgVWludDE2QXJyYXkoYnVmKTsKICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTMyIl0gPSBIRUFQVTMyID0gbmV3IFVpbnQzMkFycmF5KGJ1Zik7CiAgICAgICAgICAgIE1vZHVsZVsiSEVBUEYzMiJdID0gSEVBUEYzMiA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmKTsKICAgICAgICAgICAgTW9kdWxlWyJIRUFQRjY0Il0gPSBIRUFQRjY0ID0gbmV3IEZsb2F0NjRBcnJheShidWYpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIElOSVRJQUxfTUVNT1JZID0gTW9kdWxlWyJJTklUSUFMX01FTU9SWSJdIHx8IDE2Nzc3MjE2OwogICAgICAgICAgdmFyIHdhc21UYWJsZTsKICAgICAgICAgIHZhciBfX0FUUFJFUlVOX18gPSBbXTsKICAgICAgICAgIHZhciBfX0FUSU5JVF9fID0gW107CiAgICAgICAgICB2YXIgX19BVE1BSU5fXyA9IFtdOwogICAgICAgICAgdmFyIF9fQVRQT1NUUlVOX18gPSBbXTsKICAgICAgICAgIHZhciBydW50aW1lSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICAgICAgIGZ1bmN0aW9uIHByZVJ1bigpIHsKICAgICAgICAgICAgaWYgKE1vZHVsZVsicHJlUnVuIl0pIHsKICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlUnVuIl0gPT0gImZ1bmN0aW9uIikgTW9kdWxlWyJwcmVSdW4iXSA9IFtNb2R1bGVbInByZVJ1biJdXTsKICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGFkZE9uUHJlUnVuKE1vZHVsZVsicHJlUnVuIl0uc2hpZnQoKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQUkVSVU5fXyk7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBpbml0UnVudGltZSgpIHsKICAgICAgICAgICAgcnVudGltZUluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyk7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBwcmVNYWluKCkgewogICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUTUFJTl9fKTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIHBvc3RSdW4oKSB7CiAgICAgICAgICAgIGlmIChNb2R1bGVbInBvc3RSdW4iXSkgewogICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwb3N0UnVuIl0gPT0gImZ1bmN0aW9uIikgTW9kdWxlWyJwb3N0UnVuIl0gPSBbTW9kdWxlWyJwb3N0UnVuIl1dOwogICAgICAgICAgICAgIHdoaWxlIChNb2R1bGVbInBvc3RSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGFkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBPU1RSVU5fXyk7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBhZGRPblByZVJ1bihjYikgewogICAgICAgICAgICBfX0FUUFJFUlVOX18udW5zaGlmdChjYik7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBhZGRPbkluaXQoY2IpIHsKICAgICAgICAgICAgX19BVElOSVRfXy51bnNoaWZ0KGNiKTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIGFkZE9uUG9zdFJ1bihjYikgewogICAgICAgICAgICBfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHJ1bkRlcGVuZGVuY2llcyA9IDA7CiAgICAgICAgICB2YXIgcnVuRGVwZW5kZW5jeVdhdGNoZXIgPSBudWxsOwogICAgICAgICAgdmFyIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7CiAgICAgICAgICBmdW5jdGlvbiBhZGRSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcysrOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0pIHsKICAgICAgICAgICAgICBNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXShydW5EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcy0tOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0pIHsKICAgICAgICAgICAgICBNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXShydW5EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPT0gMCkgewogICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmN5V2F0Y2hlciAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChydW5EZXBlbmRlbmN5V2F0Y2hlcik7CiAgICAgICAgICAgICAgICBydW5EZXBlbmRlbmN5V2F0Y2hlciA9IG51bGw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXNGdWxmaWxsZWQpIHsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGRlcGVuZGVuY2llc0Z1bGZpbGxlZDsKICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgTW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXSA9IHt9OwogICAgICAgICAgTW9kdWxlWyJwcmVsb2FkZWRBdWRpb3MiXSA9IHt9OwogICAgICAgICAgZnVuY3Rpb24gYWJvcnQod2hhdCkgewogICAgICAgICAgICBpZiAoTW9kdWxlWyJvbkFib3J0Il0pIHsKICAgICAgICAgICAgICBNb2R1bGVbIm9uQWJvcnQiXSh3aGF0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGF0ICs9ICIiOwogICAgICAgICAgICBlcnIod2hhdCk7CiAgICAgICAgICAgIEFCT1JUID0gdHJ1ZTsKICAgICAgICAgICAgRVhJVFNUQVRVUyA9IDE7CiAgICAgICAgICAgIHdoYXQgPSAiYWJvcnQoIiArIHdoYXQgKyAiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iOwogICAgICAgICAgICB2YXIgZSA9IG5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3Iod2hhdCk7CiAgICAgICAgICAgIHJlYWR5UHJvbWlzZVJlamVjdChlKTsKICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIGhhc1ByZWZpeChzdHIsIHByZWZpeCkgewogICAgICAgICAgICByZXR1cm4gU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoID8gc3RyLnN0YXJ0c1dpdGgocHJlZml4KSA6IHN0ci5pbmRleE9mKHByZWZpeCkgPT09IDA7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgZGF0YVVSSVByZWZpeCA9ICJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjsKICAgICAgICAgIGZ1bmN0aW9uIGlzRGF0YVVSSShmaWxlbmFtZSkgewogICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBkYXRhVVJJUHJlZml4KTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBmaWxlVVJJUHJlZml4ID0gImZpbGU6Ly8iOwogICAgICAgICAgZnVuY3Rpb24gaXNGaWxlVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsIGZpbGVVUklQcmVmaXgpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHdhc21CaW5hcnlGaWxlID0gImJhc2lzX3RyYW5zY29kZXIud2FzbSI7CiAgICAgICAgICBpZiAoIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkpIHsKICAgICAgICAgICAgd2FzbUJpbmFyeUZpbGUgPSBsb2NhdGVGaWxlKHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIGdldEJpbmFyeShmaWxlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgaWYgKGZpbGUgPT0gd2FzbUJpbmFyeUZpbGUgJiYgd2FzbUJpbmFyeSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHdhc21CaW5hcnkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAocmVhZEJpbmFyeSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRCaW5hcnkoZmlsZSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93ICJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlcnIyKSB7CiAgICAgICAgICAgICAgYWJvcnQoZXJyMik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIGdldEJpbmFyeVByb21pc2UoKSB7CiAgICAgICAgICAgIGlmICghd2FzbUJpbmFyeSAmJiAoRU5WSVJPTk1FTlRfSVNfV0VCIHx8IEVOVklST05NRU5UX0lTX1dPUktFUikpIHsKICAgICAgICAgICAgICBpZiAodHlwZW9mIGZldGNoID09PSAiZnVuY3Rpb24iICYmICFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlWyJvayJdKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIgKyB3YXNtQmluYXJ5RmlsZSArICInIjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VbImFycmF5QnVmZmVyIl0oKTsKICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAocmVhZEFzeW5jKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICByZWFkQXN5bmMod2FzbUJpbmFyeUZpbGUsIGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKSk7CiAgICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnkod2FzbUJpbmFyeUZpbGUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZVdhc20oKSB7CiAgICAgICAgICAgIHZhciBpbmZvID0geyAiYSI6IGFzbUxpYnJhcnlBcmcgfTsKICAgICAgICAgICAgZnVuY3Rpb24gcmVjZWl2ZUluc3RhbmNlKGluc3RhbmNlLCBtb2R1bGUyKSB7CiAgICAgICAgICAgICAgdmFyIGV4cG9ydHM0ID0gaW5zdGFuY2UuZXhwb3J0czsKICAgICAgICAgICAgICBNb2R1bGVbImFzbSJdID0gZXhwb3J0czQ7CiAgICAgICAgICAgICAgd2FzbU1lbW9yeSA9IE1vZHVsZVsiYXNtIl1bIksiXTsKICAgICAgICAgICAgICB1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgd2FzbVRhYmxlID0gTW9kdWxlWyJhc20iXVsiTyJdOwogICAgICAgICAgICAgIGFkZE9uSW5pdChNb2R1bGVbImFzbSJdWyJMIl0pOwogICAgICAgICAgICAgIHJlbW92ZVJ1bkRlcGVuZGVuY3koIndhc20taW5zdGFudGlhdGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhZGRSdW5EZXBlbmRlbmN5KCJ3YXNtLWluc3RhbnRpYXRlIik7CiAgICAgICAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2Uob3V0cHV0KSB7CiAgICAgICAgICAgICAgcmVjZWl2ZUluc3RhbmNlKG91dHB1dFsiaW5zdGFuY2UiXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlcikgewogICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnlQcm9taXNlKCkudGhlbihmdW5jdGlvbihiaW5hcnkpIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShiaW5hcnksIGluZm8pOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICB9KS50aGVuKHJlY2VpdmVyLCBmdW5jdGlvbihyZWFzb24pIHsKICAgICAgICAgICAgICAgIGVycigiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIiArIHJlYXNvbik7CiAgICAgICAgICAgICAgICBhYm9ydChyZWFzb24pOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRlQXN5bmMoKSB7CiAgICAgICAgICAgICAgaWYgKCF3YXNtQmluYXJ5ICYmIHR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyA9PT0gImZ1bmN0aW9uIiAmJiAhaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSAmJiAhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSAmJiB0eXBlb2YgZmV0Y2ggPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSwgeyBjcmVkZW50aWFsczogInNhbWUtb3JpZ2luIiB9KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXNwb25zZSwgaW5mbyk7CiAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlLCBmdW5jdGlvbihyZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICBlcnIoIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiICsgcmVhc29uKTsKICAgICAgICAgICAgICAgICAgICBlcnIoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSk7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXSkgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB2YXIgZXhwb3J0czMgPSBNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKGluZm8sIHJlY2VpdmVJbnN0YW5jZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0czM7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgZXJyKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiICsgZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGluc3RhbnRpYXRlQXN5bmMoKS5jYXRjaChyZWFkeVByb21pc2VSZWplY3QpOwogICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBjYWxsUnVudGltZUNhbGxiYWNrcyhjYWxsYmFja3MpIHsKICAgICAgICAgICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhNb2R1bGUpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciBmdW5jID0gY2FsbGJhY2suZnVuYzsKICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1bmMgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2suYXJnID09PSB2b2lkIDApIHsKICAgICAgICAgICAgICAgICAgd2FzbVRhYmxlLmdldChmdW5jKSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgd2FzbVRhYmxlLmdldChmdW5jKShjYWxsYmFjay5hcmcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmdW5jKGNhbGxiYWNrLmFyZyA9PT0gdm9pZCAwID8gbnVsbCA6IGNhbGxiYWNrLmFyZyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgc3RydWN0UmVnaXN0cmF0aW9ucyA9IHt9OwogICAgICAgICAgZnVuY3Rpb24gcnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpIHsKICAgICAgICAgICAgd2hpbGUgKGRlc3RydWN0b3JzLmxlbmd0aCkgewogICAgICAgICAgICAgIHZhciBwdHIgPSBkZXN0cnVjdG9ycy5wb3AoKTsKICAgICAgICAgICAgICB2YXIgZGVsID0gZGVzdHJ1Y3RvcnMucG9wKCk7CiAgICAgICAgICAgICAgZGVsKHB0cik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIHNpbXBsZVJlYWRWYWx1ZUZyb21Qb2ludGVyKHBvaW50ZXIpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKEhFQVBVMzJbcG9pbnRlciA+PiAyXSk7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgYXdhaXRpbmdEZXBlbmRlbmNpZXMgPSB7fTsKICAgICAgICAgIHZhciByZWdpc3RlcmVkVHlwZXMgPSB7fTsKICAgICAgICAgIHZhciB0eXBlRGVwZW5kZW5jaWVzID0ge307CiAgICAgICAgICB2YXIgY2hhcl8wID0gNDg7CiAgICAgICAgICB2YXIgY2hhcl85ID0gNTc7CiAgICAgICAgICBmdW5jdGlvbiBtYWtlTGVnYWxGdW5jdGlvbk5hbWUobmFtZSkgewogICAgICAgICAgICBpZiAodm9pZCAwID09PSBuYW1lKSB7CiAgICAgICAgICAgICAgcmV0dXJuICJfdW5rbm93biI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCAiJCIpOwogICAgICAgICAgICB2YXIgZiA9IG5hbWUuY2hhckNvZGVBdCgwKTsKICAgICAgICAgICAgaWYgKGYgPj0gY2hhcl8wICYmIGYgPD0gY2hhcl85KSB7CiAgICAgICAgICAgICAgcmV0dXJuICJfIiArIG5hbWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZU5hbWVkRnVuY3Rpb24obmFtZSwgYm9keSkgewogICAgICAgICAgICBuYW1lID0gbWFrZUxlZ2FsRnVuY3Rpb25OYW1lKG5hbWUpOwogICAgICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCJib2R5IiwgInJldHVybiBmdW5jdGlvbiAiICsgbmFtZSArICcoKSB7XG4gICAgInVzZSBzdHJpY3QiOyAgICByZXR1cm4gYm9keS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbicpKGJvZHkpOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gZXh0ZW5kRXJyb3IoYmFzZUVycm9yVHlwZSwgZXJyb3JOYW1lKSB7CiAgICAgICAgICAgIHZhciBlcnJvckNsYXNzID0gY3JlYXRlTmFtZWRGdW5jdGlvbihlcnJvck5hbWUsIGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICAgICAgICB0aGlzLm5hbWUgPSBlcnJvck5hbWU7CiAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKICAgICAgICAgICAgICB2YXIgc3RhY2sgPSBuZXcgRXJyb3IobWVzc2FnZSkuc3RhY2s7CiAgICAgICAgICAgICAgaWYgKHN0YWNrICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sgPSB0aGlzLnRvU3RyaW5nKCkgKyAiXG4iICsgc3RhY2sucmVwbGFjZSgvXkVycm9yKDpbXlxuXSopP1xuLywgIiIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGVycm9yQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShiYXNlRXJyb3JUeXBlLnByb3RvdHlwZSk7CiAgICAgICAgICAgIGVycm9yQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gZXJyb3JDbGFzczsKICAgICAgICAgICAgZXJyb3JDbGFzcy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBpZiAodGhpcy5tZXNzYWdlID09PSB2b2lkIDApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyAiOiAiICsgdGhpcy5tZXNzYWdlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIGVycm9yQ2xhc3M7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgSW50ZXJuYWxFcnJvciA9IHZvaWQgMDsKICAgICAgICAgIGZ1bmN0aW9uIHRocm93SW50ZXJuYWxFcnJvcihtZXNzYWdlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKG1lc3NhZ2UpOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gd2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQobXlUeXBlcywgZGVwZW5kZW50VHlwZXMsIGdldFR5cGVDb252ZXJ0ZXJzKSB7CiAgICAgICAgICAgIG15VHlwZXMuZm9yRWFjaChmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgICAgdHlwZURlcGVuZGVuY2llc1t0eXBlXSA9IGRlcGVuZGVudFR5cGVzOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZnVuY3Rpb24gb25Db21wbGV0ZSh0eXBlQ29udmVydGVyczIpIHsKICAgICAgICAgICAgICB2YXIgbXlUeXBlQ29udmVydGVycyA9IGdldFR5cGVDb252ZXJ0ZXJzKHR5cGVDb252ZXJ0ZXJzMik7CiAgICAgICAgICAgICAgaWYgKG15VHlwZUNvbnZlcnRlcnMubGVuZ3RoICE9PSBteVR5cGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdGhyb3dJbnRlcm5hbEVycm9yKCJNaXNtYXRjaGVkIHR5cGUgY29udmVydGVyIGNvdW50Iik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXlUeXBlcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgcmVnaXN0ZXJUeXBlKG15VHlwZXNbaV0sIG15VHlwZUNvbnZlcnRlcnNbaV0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdHlwZUNvbnZlcnRlcnMgPSBuZXcgQXJyYXkoZGVwZW5kZW50VHlwZXMubGVuZ3RoKTsKICAgICAgICAgICAgdmFyIHVucmVnaXN0ZXJlZFR5cGVzID0gW107CiAgICAgICAgICAgIHZhciByZWdpc3RlcmVkID0gMDsKICAgICAgICAgICAgZGVwZW5kZW50VHlwZXMuZm9yRWFjaChmdW5jdGlvbihkdCwgaSkgewogICAgICAgICAgICAgIGlmIChyZWdpc3RlcmVkVHlwZXMuaGFzT3duUHJvcGVydHkoZHQpKSB7CiAgICAgICAgICAgICAgICB0eXBlQ29udmVydGVyc1tpXSA9IHJlZ2lzdGVyZWRUeXBlc1tkdF07CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJlZFR5cGVzLnB1c2goZHQpOwogICAgICAgICAgICAgICAgaWYgKCFhd2FpdGluZ0RlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShkdCkpIHsKICAgICAgICAgICAgICAgICAgYXdhaXRpbmdEZXBlbmRlbmNpZXNbZHRdID0gW107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhd2FpdGluZ0RlcGVuZGVuY2llc1tkdF0ucHVzaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgdHlwZUNvbnZlcnRlcnNbaV0gPSByZWdpc3RlcmVkVHlwZXNbZHRdOwogICAgICAgICAgICAgICAgICArK3JlZ2lzdGVyZWQ7CiAgICAgICAgICAgICAgICAgIGlmIChyZWdpc3RlcmVkID09PSB1bnJlZ2lzdGVyZWRUeXBlcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKHR5cGVDb252ZXJ0ZXJzKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKDAgPT09IHVucmVnaXN0ZXJlZFR5cGVzLmxlbmd0aCkgewogICAgICAgICAgICAgIG9uQ29tcGxldGUodHlwZUNvbnZlcnRlcnMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBfX2VtYmluZF9maW5hbGl6ZV92YWx1ZV9vYmplY3Qoc3RydWN0VHlwZSkgewogICAgICAgICAgICB2YXIgcmVnID0gc3RydWN0UmVnaXN0cmF0aW9uc1tzdHJ1Y3RUeXBlXTsKICAgICAgICAgICAgZGVsZXRlIHN0cnVjdFJlZ2lzdHJhdGlvbnNbc3RydWN0VHlwZV07CiAgICAgICAgICAgIHZhciByYXdDb25zdHJ1Y3RvciA9IHJlZy5yYXdDb25zdHJ1Y3RvcjsKICAgICAgICAgICAgdmFyIHJhd0Rlc3RydWN0b3IgPSByZWcucmF3RGVzdHJ1Y3RvcjsKICAgICAgICAgICAgdmFyIGZpZWxkUmVjb3JkcyA9IHJlZy5maWVsZHM7CiAgICAgICAgICAgIHZhciBmaWVsZFR5cGVzID0gZmllbGRSZWNvcmRzLm1hcChmdW5jdGlvbihmaWVsZCkgewogICAgICAgICAgICAgIHJldHVybiBmaWVsZC5nZXR0ZXJSZXR1cm5UeXBlOwogICAgICAgICAgICB9KS5jb25jYXQoZmllbGRSZWNvcmRzLm1hcChmdW5jdGlvbihmaWVsZCkgewogICAgICAgICAgICAgIHJldHVybiBmaWVsZC5zZXR0ZXJBcmd1bWVudFR5cGU7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgd2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW3N0cnVjdFR5cGVdLCBmaWVsZFR5cGVzLCBmdW5jdGlvbihmaWVsZFR5cGVzMikgewogICAgICAgICAgICAgIHZhciBmaWVsZHMgPSB7fTsKICAgICAgICAgICAgICBmaWVsZFJlY29yZHMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCwgaSkgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkTmFtZSA9IGZpZWxkLmZpZWxkTmFtZTsKICAgICAgICAgICAgICAgIHZhciBnZXR0ZXJSZXR1cm5UeXBlID0gZmllbGRUeXBlczJbaV07CiAgICAgICAgICAgICAgICB2YXIgZ2V0dGVyID0gZmllbGQuZ2V0dGVyOwogICAgICAgICAgICAgICAgdmFyIGdldHRlckNvbnRleHQgPSBmaWVsZC5nZXR0ZXJDb250ZXh0OwogICAgICAgICAgICAgICAgdmFyIHNldHRlckFyZ3VtZW50VHlwZSA9IGZpZWxkVHlwZXMyW2kgKyBmaWVsZFJlY29yZHMubGVuZ3RoXTsKICAgICAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBmaWVsZC5zZXR0ZXI7CiAgICAgICAgICAgICAgICB2YXIgc2V0dGVyQ29udGV4dCA9IGZpZWxkLnNldHRlckNvbnRleHQ7CiAgICAgICAgICAgICAgICBmaWVsZHNbZmllbGROYW1lXSA9IHsgcmVhZDogZnVuY3Rpb24ocHRyKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBnZXR0ZXJSZXR1cm5UeXBlWyJmcm9tV2lyZVR5cGUiXShnZXR0ZXIoZ2V0dGVyQ29udGV4dCwgcHRyKSk7CiAgICAgICAgICAgICAgICB9LCB3cml0ZTogZnVuY3Rpb24ocHRyLCBvKSB7CiAgICAgICAgICAgICAgICAgIHZhciBkZXN0cnVjdG9ycyA9IFtdOwogICAgICAgICAgICAgICAgICBzZXR0ZXIoc2V0dGVyQ29udGV4dCwgcHRyLCBzZXR0ZXJBcmd1bWVudFR5cGVbInRvV2lyZVR5cGUiXShkZXN0cnVjdG9ycywgbykpOwogICAgICAgICAgICAgICAgICBydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyk7CiAgICAgICAgICAgICAgICB9IH07CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgcmV0dXJuIFt7IG5hbWU6IHJlZy5uYW1lLCAiZnJvbVdpcmVUeXBlIjogZnVuY3Rpb24ocHRyKSB7CiAgICAgICAgICAgICAgICB2YXIgcnYgPSB7fTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZmllbGRzKSB7CiAgICAgICAgICAgICAgICAgIHJ2W2ldID0gZmllbGRzW2ldLnJlYWQocHRyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJhd0Rlc3RydWN0b3IocHRyKTsKICAgICAgICAgICAgICAgIHJldHVybiBydjsKICAgICAgICAgICAgICB9LCAidG9XaXJlVHlwZSI6IGZ1bmN0aW9uKGRlc3RydWN0b3JzLCBvKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBmaWVsZE5hbWUgaW4gZmllbGRzKSB7CiAgICAgICAgICAgICAgICAgIGlmICghKGZpZWxkTmFtZSBpbiBvKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgZmllbGQ6ICAiJyArIGZpZWxkTmFtZSArICciJyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwdHIgPSByYXdDb25zdHJ1Y3RvcigpOwogICAgICAgICAgICAgICAgZm9yIChmaWVsZE5hbWUgaW4gZmllbGRzKSB7CiAgICAgICAgICAgICAgICAgIGZpZWxkc1tmaWVsZE5hbWVdLndyaXRlKHB0ciwgb1tmaWVsZE5hbWVdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChkZXN0cnVjdG9ycyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICBkZXN0cnVjdG9ycy5wdXNoKHJhd0Rlc3RydWN0b3IsIHB0cik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcHRyOwogICAgICAgICAgICAgIH0sICJhcmdQYWNrQWR2YW5jZSI6IDgsICJyZWFkVmFsdWVGcm9tUG9pbnRlciI6IHNpbXBsZVJlYWRWYWx1ZUZyb21Qb2ludGVyLCBkZXN0cnVjdG9yRnVuY3Rpb246IHJhd0Rlc3RydWN0b3IgfV07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gZ2V0U2hpZnRGcm9tU2l6ZShzaXplKSB7CiAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgewogICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgIHJldHVybiAzOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIHR5cGUgc2l6ZTogIiArIHNpemUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBlbWJpbmRfaW5pdF9jaGFyQ29kZXMoKSB7CiAgICAgICAgICAgIHZhciBjb2RlcyA9IG5ldyBBcnJheSgyNTYpOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7CiAgICAgICAgICAgICAgY29kZXNbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVtYmluZF9jaGFyQ29kZXMgPSBjb2RlczsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBlbWJpbmRfY2hhckNvZGVzID0gdm9pZCAwOwogICAgICAgICAgZnVuY3Rpb24gcmVhZExhdGluMVN0cmluZyhwdHIpIHsKICAgICAgICAgICAgdmFyIHJldCA9ICIiOwogICAgICAgICAgICB2YXIgYyA9IHB0cjsKICAgICAgICAgICAgd2hpbGUgKEhFQVBVOFtjXSkgewogICAgICAgICAgICAgIHJldCArPSBlbWJpbmRfY2hhckNvZGVzW0hFQVBVOFtjKytdXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgfQogICAgICAgICAgdmFyIEJpbmRpbmdFcnJvciA9IHZvaWQgMDsKICAgICAgICAgIGZ1bmN0aW9uIHRocm93QmluZGluZ0Vycm9yKG1lc3NhZ2UpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRpbmdFcnJvcihtZXNzYWdlKTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIHJlZ2lzdGVyVHlwZShyYXdUeXBlLCByZWdpc3RlcmVkSW5zdGFuY2UsIG9wdGlvbnMpIHsKICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgICAgIGlmICghKCJhcmdQYWNrQWR2YW5jZSIgaW4gcmVnaXN0ZXJlZEluc3RhbmNlKSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoInJlZ2lzdGVyVHlwZSByZWdpc3RlcmVkSW5zdGFuY2UgcmVxdWlyZXMgYXJnUGFja0FkdmFuY2UiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbmFtZSA9IHJlZ2lzdGVyZWRJbnN0YW5jZS5uYW1lOwogICAgICAgICAgICBpZiAoIXJhd1R5cGUpIHsKICAgICAgICAgICAgICB0aHJvd0JpbmRpbmdFcnJvcigndHlwZSAiJyArIG5hbWUgKyAnIiBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHR5cGVpZCBwb2ludGVyJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlZ2lzdGVyZWRUeXBlcy5oYXNPd25Qcm9wZXJ0eShyYXdUeXBlKSkgewogICAgICAgICAgICAgIGlmIChvcHRpb25zLmlnbm9yZUR1cGxpY2F0ZVJlZ2lzdHJhdGlvbnMpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCByZWdpc3RlciB0eXBlICciICsgbmFtZSArICInIHR3aWNlIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZ2lzdGVyZWRUeXBlc1tyYXdUeXBlXSA9IHJlZ2lzdGVyZWRJbnN0YW5jZTsKICAgICAgICAgICAgZGVsZXRlIHR5cGVEZXBlbmRlbmNpZXNbcmF3VHlwZV07CiAgICAgICAgICAgIGlmIChhd2FpdGluZ0RlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShyYXdUeXBlKSkgewogICAgICAgICAgICAgIHZhciBjYWxsYmFja3MgPSBhd2FpdGluZ0RlcGVuZGVuY2llc1tyYXdUeXBlXTsKICAgICAgICAgICAgICBkZWxldGUgYXdhaXRpbmdEZXBlbmRlbmNpZXNbcmF3VHlwZV07CiAgICAgICAgICAgICAgY2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24oY2IpIHsKICAgICAgICAgICAgICAgIGNiKCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2Jvb2wocmF3VHlwZSwgbmFtZSwgc2l6ZSwgdHJ1ZVZhbHVlLCBmYWxzZVZhbHVlKSB7CiAgICAgICAgICAgIHZhciBzaGlmdCA9IGdldFNoaWZ0RnJvbVNpemUoc2l6ZSk7CiAgICAgICAgICAgIG5hbWUgPSByZWFkTGF0aW4xU3RyaW5nKG5hbWUpOwogICAgICAgICAgICByZWdpc3RlclR5cGUocmF3VHlwZSwgeyBuYW1lLCAiZnJvbVdpcmVUeXBlIjogZnVuY3Rpb24od3QpIHsKICAgICAgICAgICAgICByZXR1cm4gISF3dDsKICAgICAgICAgICAgfSwgInRvV2lyZVR5cGUiOiBmdW5jdGlvbihkZXN0cnVjdG9ycywgbykgewogICAgICAgICAgICAgIHJldHVybiBvID8gdHJ1ZVZhbHVlIDogZmFsc2VWYWx1ZTsKICAgICAgICAgICAgfSwgImFyZ1BhY2tBZHZhbmNlIjogOCwgInJlYWRWYWx1ZUZyb21Qb2ludGVyIjogZnVuY3Rpb24ocG9pbnRlcikgewogICAgICAgICAgICAgIHZhciBoZWFwOwogICAgICAgICAgICAgIGlmIChzaXplID09PSAxKSB7CiAgICAgICAgICAgICAgICBoZWFwID0gSEVBUDg7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplID09PSAyKSB7CiAgICAgICAgICAgICAgICBoZWFwID0gSEVBUDE2OwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PT0gNCkgewogICAgICAgICAgICAgICAgaGVhcCA9IEhFQVAzMjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBib29sZWFuIHR5cGUgc2l6ZTogIiArIG5hbWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gdGhpc1siZnJvbVdpcmVUeXBlIl0oaGVhcFtwb2ludGVyID4+IHNoaWZ0XSk7CiAgICAgICAgICAgIH0sIGRlc3RydWN0b3JGdW5jdGlvbjogbnVsbCB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIENsYXNzSGFuZGxlX2lzQWxpYXNPZihvdGhlcikgewogICAgICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ2xhc3NIYW5kbGUpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgQ2xhc3NIYW5kbGUpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBsZWZ0Q2xhc3MgPSB0aGlzLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzOwogICAgICAgICAgICB2YXIgbGVmdCA9IHRoaXMuJCQucHRyOwogICAgICAgICAgICB2YXIgcmlnaHRDbGFzcyA9IG90aGVyLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzOwogICAgICAgICAgICB2YXIgcmlnaHQgPSBvdGhlci4kJC5wdHI7CiAgICAgICAgICAgIHdoaWxlIChsZWZ0Q2xhc3MuYmFzZUNsYXNzKSB7CiAgICAgICAgICAgICAgbGVmdCA9IGxlZnRDbGFzcy51cGNhc3QobGVmdCk7CiAgICAgICAgICAgICAgbGVmdENsYXNzID0gbGVmdENsYXNzLmJhc2VDbGFzczsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAocmlnaHRDbGFzcy5iYXNlQ2xhc3MpIHsKICAgICAgICAgICAgICByaWdodCA9IHJpZ2h0Q2xhc3MudXBjYXN0KHJpZ2h0KTsKICAgICAgICAgICAgICByaWdodENsYXNzID0gcmlnaHRDbGFzcy5iYXNlQ2xhc3M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGxlZnRDbGFzcyA9PT0gcmlnaHRDbGFzcyAmJiBsZWZ0ID09PSByaWdodDsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIHNoYWxsb3dDb3B5SW50ZXJuYWxQb2ludGVyKG8pIHsKICAgICAgICAgICAgcmV0dXJuIHsgY291bnQ6IG8uY291bnQsIGRlbGV0ZVNjaGVkdWxlZDogby5kZWxldGVTY2hlZHVsZWQsIHByZXNlcnZlUG9pbnRlck9uRGVsZXRlOiBvLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlLCBwdHI6IG8ucHRyLCBwdHJUeXBlOiBvLnB0clR5cGUsIHNtYXJ0UHRyOiBvLnNtYXJ0UHRyLCBzbWFydFB0clR5cGU6IG8uc21hcnRQdHJUeXBlIH07CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiB0aHJvd0luc3RhbmNlQWxyZWFkeURlbGV0ZWQob2JqKSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEluc3RhbmNlVHlwZU5hbWUoaGFuZGxlKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcy5uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKGdldEluc3RhbmNlVHlwZU5hbWUob2JqKSArICIgaW5zdGFuY2UgYWxyZWFkeSBkZWxldGVkIik7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgZmluYWxpemF0aW9uR3JvdXAgPSBmYWxzZTsKICAgICAgICAgIGZ1bmN0aW9uIGRldGFjaEZpbmFsaXplcihoYW5kbGUpIHsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIHJ1bkRlc3RydWN0b3IoJCQpIHsKICAgICAgICAgICAgaWYgKCQkLnNtYXJ0UHRyKSB7CiAgICAgICAgICAgICAgJCQuc21hcnRQdHJUeXBlLnJhd0Rlc3RydWN0b3IoJCQuc21hcnRQdHIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLnJhd0Rlc3RydWN0b3IoJCQucHRyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gcmVsZWFzZUNsYXNzSGFuZGxlKCQkKSB7CiAgICAgICAgICAgICQkLmNvdW50LnZhbHVlIC09IDE7CiAgICAgICAgICAgIHZhciB0b0RlbGV0ZSA9IDAgPT09ICQkLmNvdW50LnZhbHVlOwogICAgICAgICAgICBpZiAodG9EZWxldGUpIHsKICAgICAgICAgICAgICBydW5EZXN0cnVjdG9yKCQkKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gYXR0YWNoRmluYWxpemVyKGhhbmRsZSkgewogICAgICAgICAgICBpZiAoInVuZGVmaW5lZCIgPT09IHR5cGVvZiBGaW5hbGl6YXRpb25Hcm91cCkgewogICAgICAgICAgICAgIGF0dGFjaEZpbmFsaXplciA9IGZ1bmN0aW9uKGhhbmRsZTIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGUyOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaW5hbGl6YXRpb25Hcm91cCA9IG5ldyBGaW5hbGl6YXRpb25Hcm91cChmdW5jdGlvbihpdGVyKSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgcmVzdWx0ID0gaXRlci5uZXh0KCk7ICFyZXN1bHQuZG9uZTsgcmVzdWx0ID0gaXRlci5uZXh0KCkpIHsKICAgICAgICAgICAgICAgIHZhciAkJCA9IHJlc3VsdC52YWx1ZTsKICAgICAgICAgICAgICAgIGlmICghJCQucHRyKSB7CiAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybigib2JqZWN0IGFscmVhZHkgZGVsZXRlZDogIiArICQkLnB0cik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICByZWxlYXNlQ2xhc3NIYW5kbGUoJCQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGF0dGFjaEZpbmFsaXplciA9IGZ1bmN0aW9uKGhhbmRsZTIpIHsKICAgICAgICAgICAgICBmaW5hbGl6YXRpb25Hcm91cC5yZWdpc3RlcihoYW5kbGUyLCBoYW5kbGUyLiQkLCBoYW5kbGUyLiQkKTsKICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlMjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGV0YWNoRmluYWxpemVyID0gZnVuY3Rpb24oaGFuZGxlMikgewogICAgICAgICAgICAgIGZpbmFsaXphdGlvbkdyb3VwLnVucmVnaXN0ZXIoaGFuZGxlMi4kJCk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiBhdHRhY2hGaW5hbGl6ZXIoaGFuZGxlKTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIENsYXNzSGFuZGxlX2Nsb25lKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuJCQucHRyKSB7CiAgICAgICAgICAgICAgdGhyb3dJbnN0YW5jZUFscmVhZHlEZWxldGVkKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlKSB7CiAgICAgICAgICAgICAgdGhpcy4kJC5jb3VudC52YWx1ZSArPSAxOwogICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhciBjbG9uZTIgPSBhdHRhY2hGaW5hbGl6ZXIoT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyksIHsgJCQ6IHsgdmFsdWU6IHNoYWxsb3dDb3B5SW50ZXJuYWxQb2ludGVyKHRoaXMuJCQpIH0gfSkpOwogICAgICAgICAgICAgIGNsb25lMi4kJC5jb3VudC52YWx1ZSArPSAxOwogICAgICAgICAgICAgIGNsb25lMi4kJC5kZWxldGVTY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICByZXR1cm4gY2xvbmUyOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBDbGFzc0hhbmRsZV9kZWxldGUoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy4kJC5wdHIpIHsKICAgICAgICAgICAgICB0aHJvd0luc3RhbmNlQWxyZWFkeURlbGV0ZWQodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkICYmICF0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlKSB7CiAgICAgICAgICAgICAgdGhyb3dCaW5kaW5nRXJyb3IoIk9iamVjdCBhbHJlYWR5IHNjaGVkdWxlZCBmb3IgZGVsZXRpb24iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXRhY2hGaW5hbGl6ZXIodGhpcyk7CiAgICAgICAgICAgIHJlbGVhc2VDbGFzc0hhbmRsZSh0aGlzLiQkKTsKICAgICAgICAgICAgaWYgKCF0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlKSB7CiAgICAgICAgICAgICAgdGhpcy4kJC5zbWFydFB0ciA9IHZvaWQgMDsKICAgICAgICAgICAgICB0aGlzLiQkLnB0ciA9IHZvaWQgMDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gQ2xhc3NIYW5kbGVfaXNEZWxldGVkKCkgewogICAgICAgICAgICByZXR1cm4gIXRoaXMuJCQucHRyOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGRlbGF5RnVuY3Rpb24gPSB2b2lkIDA7CiAgICAgICAgICB2YXIgZGVsZXRpb25RdWV1ZSA9IFtdOwogICAgICAgICAgZnVuY3Rpb24gZmx1c2hQZW5kaW5nRGVsZXRlcygpIHsKICAgICAgICAgICAgd2hpbGUgKGRlbGV0aW9uUXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgdmFyIG9iaiA9IGRlbGV0aW9uUXVldWUucG9wKCk7CiAgICAgICAgICAgICAgb2JqLiQkLmRlbGV0ZVNjaGVkdWxlZCA9IGZhbHNlOwogICAgICAgICAgICAgIG9ialsiZGVsZXRlIl0oKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gQ2xhc3NIYW5kbGVfZGVsZXRlTGF0ZXIoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy4kJC5wdHIpIHsKICAgICAgICAgICAgICB0aHJvd0luc3RhbmNlQWxyZWFkeURlbGV0ZWQodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkICYmICF0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlKSB7CiAgICAgICAgICAgICAgdGhyb3dCaW5kaW5nRXJyb3IoIk9iamVjdCBhbHJlYWR5IHNjaGVkdWxlZCBmb3IgZGVsZXRpb24iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWxldGlvblF1ZXVlLnB1c2godGhpcyk7CiAgICAgICAgICAgIGlmIChkZWxldGlvblF1ZXVlLmxlbmd0aCA9PT0gMSAmJiBkZWxheUZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgZGVsYXlGdW5jdGlvbihmbHVzaFBlbmRpbmdEZWxldGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZCA9IHRydWU7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gaW5pdF9DbGFzc0hhbmRsZSgpIHsKICAgICAgICAgICAgQ2xhc3NIYW5kbGUucHJvdG90eXBlWyJpc0FsaWFzT2YiXSA9IENsYXNzSGFuZGxlX2lzQWxpYXNPZjsKICAgICAgICAgICAgQ2xhc3NIYW5kbGUucHJvdG90eXBlWyJjbG9uZSJdID0gQ2xhc3NIYW5kbGVfY2xvbmU7CiAgICAgICAgICAgIENsYXNzSGFuZGxlLnByb3RvdHlwZVsiZGVsZXRlIl0gPSBDbGFzc0hhbmRsZV9kZWxldGU7CiAgICAgICAgICAgIENsYXNzSGFuZGxlLnByb3RvdHlwZVsiaXNEZWxldGVkIl0gPSBDbGFzc0hhbmRsZV9pc0RlbGV0ZWQ7CiAgICAgICAgICAgIENsYXNzSGFuZGxlLnByb3RvdHlwZVsiZGVsZXRlTGF0ZXIiXSA9IENsYXNzSGFuZGxlX2RlbGV0ZUxhdGVyOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gQ2xhc3NIYW5kbGUoKSB7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgcmVnaXN0ZXJlZFBvaW50ZXJzID0ge307CiAgICAgICAgICBmdW5jdGlvbiBlbnN1cmVPdmVybG9hZFRhYmxlKHByb3RvLCBtZXRob2ROYW1lLCBodW1hbk5hbWUpIHsKICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gcHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSkgewogICAgICAgICAgICAgIHZhciBwcmV2RnVuYyA9IHByb3RvW21ldGhvZE5hbWVdOwogICAgICAgICAgICAgIHByb3RvW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoIXByb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGUuaGFzT3duUHJvcGVydHkoYXJndW1lbnRzLmxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgdGhyb3dCaW5kaW5nRXJyb3IoIkZ1bmN0aW9uICciICsgaHVtYW5OYW1lICsgIicgY2FsbGVkIHdpdGggYW4gaW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzICgiICsgYXJndW1lbnRzLmxlbmd0aCArICIpIC0gZXhwZWN0cyBvbmUgb2YgKCIgKyBwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlICsgIikhIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZVthcmd1bWVudHMubGVuZ3RoXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgcHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSA9IFtdOwogICAgICAgICAgICAgIHByb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbcHJldkZ1bmMuYXJnQ291bnRdID0gcHJldkZ1bmM7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIGV4cG9zZVB1YmxpY1N5bWJvbChuYW1lLCB2YWx1ZSwgbnVtQXJndW1lbnRzKSB7CiAgICAgICAgICAgIGlmIChNb2R1bGUuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBudW1Bcmd1bWVudHMgfHwgdm9pZCAwICE9PSBNb2R1bGVbbmFtZV0ub3ZlcmxvYWRUYWJsZSAmJiB2b2lkIDAgIT09IE1vZHVsZVtuYW1lXS5vdmVybG9hZFRhYmxlW251bUFyZ3VtZW50c10pIHsKICAgICAgICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgcmVnaXN0ZXIgcHVibGljIG5hbWUgJyIgKyBuYW1lICsgIicgdHdpY2UiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZW5zdXJlT3ZlcmxvYWRUYWJsZShNb2R1bGUsIG5hbWUsIG5hbWUpOwogICAgICAgICAgICAgIGlmIChNb2R1bGUuaGFzT3duUHJvcGVydHkobnVtQXJndW1lbnRzKSkgewogICAgICAgICAgICAgICAgdGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCByZWdpc3RlciBtdWx0aXBsZSBvdmVybG9hZHMgb2YgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMgKCIgKyBudW1Bcmd1bWVudHMgKyAiKSEiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgTW9kdWxlW25hbWVdLm92ZXJsb2FkVGFibGVbbnVtQXJndW1lbnRzXSA9IHZhbHVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIE1vZHVsZVtuYW1lXSA9IHZhbHVlOwogICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IG51bUFyZ3VtZW50cykgewogICAgICAgICAgICAgICAgTW9kdWxlW25hbWVdLm51bUFyZ3VtZW50cyA9IG51bUFyZ3VtZW50czsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIFJlZ2lzdGVyZWRDbGFzcyhuYW1lLCBjb25zdHJ1Y3RvciwgaW5zdGFuY2VQcm90b3R5cGUsIHJhd0Rlc3RydWN0b3IsIGJhc2VDbGFzcywgZ2V0QWN0dWFsVHlwZSwgdXBjYXN0LCBkb3duY2FzdCkgewogICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7CiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VQcm90b3R5cGUgPSBpbnN0YW5jZVByb3RvdHlwZTsKICAgICAgICAgICAgdGhpcy5yYXdEZXN0cnVjdG9yID0gcmF3RGVzdHJ1Y3RvcjsKICAgICAgICAgICAgdGhpcy5iYXNlQ2xhc3MgPSBiYXNlQ2xhc3M7CiAgICAgICAgICAgIHRoaXMuZ2V0QWN0dWFsVHlwZSA9IGdldEFjdHVhbFR5cGU7CiAgICAgICAgICAgIHRoaXMudXBjYXN0ID0gdXBjYXN0OwogICAgICAgICAgICB0aGlzLmRvd25jYXN0ID0gZG93bmNhc3Q7CiAgICAgICAgICAgIHRoaXMucHVyZVZpcnR1YWxGdW5jdGlvbnMgPSBbXTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIHVwY2FzdFBvaW50ZXIocHRyLCBwdHJDbGFzcywgZGVzaXJlZENsYXNzKSB7CiAgICAgICAgICAgIHdoaWxlIChwdHJDbGFzcyAhPT0gZGVzaXJlZENsYXNzKSB7CiAgICAgICAgICAgICAgaWYgKCFwdHJDbGFzcy51cGNhc3QpIHsKICAgICAgICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKCJFeHBlY3RlZCBudWxsIG9yIGluc3RhbmNlIG9mICIgKyBkZXNpcmVkQ2xhc3MubmFtZSArICIsIGdvdCBhbiBpbnN0YW5jZSBvZiAiICsgcHRyQ2xhc3MubmFtZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHB0ciA9IHB0ckNsYXNzLnVwY2FzdChwdHIpOwogICAgICAgICAgICAgIHB0ckNsYXNzID0gcHRyQ2xhc3MuYmFzZUNsYXNzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwdHI7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBjb25zdE5vU21hcnRQdHJSYXdQb2ludGVyVG9XaXJlVHlwZShkZXN0cnVjdG9ycywgaGFuZGxlKSB7CiAgICAgICAgICAgIGlmIChoYW5kbGUgPT09IG51bGwpIHsKICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlZmVyZW5jZSkgewogICAgICAgICAgICAgICAgdGhyb3dCaW5kaW5nRXJyb3IoIm51bGwgaXMgbm90IGEgdmFsaWQgIiArIHRoaXMubmFtZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaGFuZGxlLiQkKSB7CiAgICAgICAgICAgICAgdGhyb3dCaW5kaW5nRXJyb3IoJ0Nhbm5vdCBwYXNzICInICsgX2VtYmluZF9yZXByKGhhbmRsZSkgKyAnIiBhcyBhICcgKyB0aGlzLm5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaGFuZGxlLiQkLnB0cikgewogICAgICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAiICsgdGhpcy5uYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgaGFuZGxlQ2xhc3MgPSBoYW5kbGUuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7CiAgICAgICAgICAgIHZhciBwdHIgPSB1cGNhc3RQb2ludGVyKGhhbmRsZS4kJC5wdHIsIGhhbmRsZUNsYXNzLCB0aGlzLnJlZ2lzdGVyZWRDbGFzcyk7CiAgICAgICAgICAgIHJldHVybiBwdHI7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBnZW5lcmljUG9pbnRlclRvV2lyZVR5cGUoZGVzdHJ1Y3RvcnMsIGhhbmRsZSkgewogICAgICAgICAgICB2YXIgcHRyOwogICAgICAgICAgICBpZiAoaGFuZGxlID09PSBudWxsKSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZWZlcmVuY2UpIHsKICAgICAgICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKCJudWxsIGlzIG5vdCBhIHZhbGlkICIgKyB0aGlzLm5hbWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodGhpcy5pc1NtYXJ0UG9pbnRlcikgewogICAgICAgICAgICAgICAgcHRyID0gdGhpcy5yYXdDb25zdHJ1Y3RvcigpOwogICAgICAgICAgICAgICAgaWYgKGRlc3RydWN0b3JzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIGRlc3RydWN0b3JzLnB1c2godGhpcy5yYXdEZXN0cnVjdG9yLCBwdHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHB0cjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaGFuZGxlLiQkKSB7CiAgICAgICAgICAgICAgdGhyb3dCaW5kaW5nRXJyb3IoJ0Nhbm5vdCBwYXNzICInICsgX2VtYmluZF9yZXByKGhhbmRsZSkgKyAnIiBhcyBhICcgKyB0aGlzLm5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaGFuZGxlLiQkLnB0cikgewogICAgICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAiICsgdGhpcy5uYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMuaXNDb25zdCAmJiBoYW5kbGUuJCQucHRyVHlwZS5pc0NvbnN0KSB7CiAgICAgICAgICAgICAgdGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgIiArIChoYW5kbGUuJCQuc21hcnRQdHJUeXBlID8gaGFuZGxlLiQkLnNtYXJ0UHRyVHlwZS5uYW1lIDogaGFuZGxlLiQkLnB0clR5cGUubmFtZSkgKyAiIHRvIHBhcmFtZXRlciB0eXBlICIgKyB0aGlzLm5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBoYW5kbGVDbGFzcyA9IGhhbmRsZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzczsKICAgICAgICAgICAgcHRyID0gdXBjYXN0UG9pbnRlcihoYW5kbGUuJCQucHRyLCBoYW5kbGVDbGFzcywgdGhpcy5yZWdpc3RlcmVkQ2xhc3MpOwogICAgICAgICAgICBpZiAodGhpcy5pc1NtYXJ0UG9pbnRlcikgewogICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IGhhbmRsZS4kJC5zbWFydFB0cikgewogICAgICAgICAgICAgICAgdGhyb3dCaW5kaW5nRXJyb3IoIlBhc3NpbmcgcmF3IHBvaW50ZXIgdG8gc21hcnQgcG9pbnRlciBpcyBpbGxlZ2FsIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zaGFyaW5nUG9saWN5KSB7CiAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUuJCQuc21hcnRQdHJUeXBlID09PSB0aGlzKSB7CiAgICAgICAgICAgICAgICAgICAgcHRyID0gaGFuZGxlLiQkLnNtYXJ0UHRyOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgY29udmVydCBhcmd1bWVudCBvZiB0eXBlICIgKyAoaGFuZGxlLiQkLnNtYXJ0UHRyVHlwZSA/IGhhbmRsZS4kJC5zbWFydFB0clR5cGUubmFtZSA6IGhhbmRsZS4kJC5wdHJUeXBlLm5hbWUpICsgIiB0byBwYXJhbWV0ZXIgdHlwZSAiICsgdGhpcy5uYW1lKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgcHRyID0gaGFuZGxlLiQkLnNtYXJ0UHRyOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS4kJC5zbWFydFB0clR5cGUgPT09IHRoaXMpIHsKICAgICAgICAgICAgICAgICAgICBwdHIgPSBoYW5kbGUuJCQuc21hcnRQdHI7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNsb25lZEhhbmRsZSA9IGhhbmRsZVsiY2xvbmUiXSgpOwogICAgICAgICAgICAgICAgICAgIHB0ciA9IHRoaXMucmF3U2hhcmUocHRyLCBfX2VtdmFsX3JlZ2lzdGVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgY2xvbmVkSGFuZGxlWyJkZWxldGUiXSgpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdHJ1Y3RvcnMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgIGRlc3RydWN0b3JzLnB1c2godGhpcy5yYXdEZXN0cnVjdG9yLCBwdHIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKCJVbnN1cHBvcnRpbmcgc2hhcmluZyBwb2xpY3kiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHB0cjsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIG5vbkNvbnN0Tm9TbWFydFB0clJhd1BvaW50ZXJUb1dpcmVUeXBlKGRlc3RydWN0b3JzLCBoYW5kbGUpIHsKICAgICAgICAgICAgaWYgKGhhbmRsZSA9PT0gbnVsbCkgewogICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICB0aHJvd0JpbmRpbmdFcnJvcigibnVsbCBpcyBub3QgYSB2YWxpZCAiICsgdGhpcy5uYW1lKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFoYW5kbGUuJCQpIHsKICAgICAgICAgICAgICB0aHJvd0JpbmRpbmdFcnJvcignQ2Fubm90IHBhc3MgIicgKyBfZW1iaW5kX3JlcHIoaGFuZGxlKSArICciIGFzIGEgJyArIHRoaXMubmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFoYW5kbGUuJCQucHRyKSB7CiAgICAgICAgICAgICAgdGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBwYXNzIGRlbGV0ZWQgb2JqZWN0IGFzIGEgcG9pbnRlciBvZiB0eXBlICIgKyB0aGlzLm5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChoYW5kbGUuJCQucHRyVHlwZS5pc0NvbnN0KSB7CiAgICAgICAgICAgICAgdGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgIiArIGhhbmRsZS4kJC5wdHJUeXBlLm5hbWUgKyAiIHRvIHBhcmFtZXRlciB0eXBlICIgKyB0aGlzLm5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBoYW5kbGVDbGFzcyA9IGhhbmRsZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzczsKICAgICAgICAgICAgdmFyIHB0ciA9IHVwY2FzdFBvaW50ZXIoaGFuZGxlLiQkLnB0ciwgaGFuZGxlQ2xhc3MsIHRoaXMucmVnaXN0ZXJlZENsYXNzKTsKICAgICAgICAgICAgcmV0dXJuIHB0cjsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIFJlZ2lzdGVyZWRQb2ludGVyX2dldFBvaW50ZWUocHRyKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnJhd0dldFBvaW50ZWUpIHsKICAgICAgICAgICAgICBwdHIgPSB0aGlzLnJhd0dldFBvaW50ZWUocHRyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcHRyOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gUmVnaXN0ZXJlZFBvaW50ZXJfZGVzdHJ1Y3RvcihwdHIpIHsKICAgICAgICAgICAgaWYgKHRoaXMucmF3RGVzdHJ1Y3RvcikgewogICAgICAgICAgICAgIHRoaXMucmF3RGVzdHJ1Y3RvcihwdHIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBSZWdpc3RlcmVkUG9pbnRlcl9kZWxldGVPYmplY3QoaGFuZGxlKSB7CiAgICAgICAgICAgIGlmIChoYW5kbGUgIT09IG51bGwpIHsKICAgICAgICAgICAgICBoYW5kbGVbImRlbGV0ZSJdKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIGRvd25jYXN0UG9pbnRlcihwdHIsIHB0ckNsYXNzLCBkZXNpcmVkQ2xhc3MpIHsKICAgICAgICAgICAgaWYgKHB0ckNsYXNzID09PSBkZXNpcmVkQ2xhc3MpIHsKICAgICAgICAgICAgICByZXR1cm4gcHRyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IGRlc2lyZWRDbGFzcy5iYXNlQ2xhc3MpIHsKICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcnYgPSBkb3duY2FzdFBvaW50ZXIocHRyLCBwdHJDbGFzcywgZGVzaXJlZENsYXNzLmJhc2VDbGFzcyk7CiAgICAgICAgICAgIGlmIChydiA9PT0gbnVsbCkgewogICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZXNpcmVkQ2xhc3MuZG93bmNhc3QocnYpOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gZ2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudCgpIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlZ2lzdGVyZWRJbnN0YW5jZXMpLmxlbmd0aDsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIGdldExpdmVJbmhlcml0ZWRJbnN0YW5jZXMoKSB7CiAgICAgICAgICAgIHZhciBydiA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIHJlZ2lzdGVyZWRJbnN0YW5jZXMpIHsKICAgICAgICAgICAgICBpZiAocmVnaXN0ZXJlZEluc3RhbmNlcy5oYXNPd25Qcm9wZXJ0eShrKSkgewogICAgICAgICAgICAgICAgcnYucHVzaChyZWdpc3RlcmVkSW5zdGFuY2VzW2tdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJ2OwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gc2V0RGVsYXlGdW5jdGlvbihmbikgewogICAgICAgICAgICBkZWxheUZ1bmN0aW9uID0gZm47CiAgICAgICAgICAgIGlmIChkZWxldGlvblF1ZXVlLmxlbmd0aCAmJiBkZWxheUZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgZGVsYXlGdW5jdGlvbihmbHVzaFBlbmRpbmdEZWxldGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gaW5pdF9lbWJpbmQoKSB7CiAgICAgICAgICAgIE1vZHVsZVsiZ2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudCJdID0gZ2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudDsKICAgICAgICAgICAgTW9kdWxlWyJnZXRMaXZlSW5oZXJpdGVkSW5zdGFuY2VzIl0gPSBnZXRMaXZlSW5oZXJpdGVkSW5zdGFuY2VzOwogICAgICAgICAgICBNb2R1bGVbImZsdXNoUGVuZGluZ0RlbGV0ZXMiXSA9IGZsdXNoUGVuZGluZ0RlbGV0ZXM7CiAgICAgICAgICAgIE1vZHVsZVsic2V0RGVsYXlGdW5jdGlvbiJdID0gc2V0RGVsYXlGdW5jdGlvbjsKICAgICAgICAgIH0KICAgICAgICAgIHZhciByZWdpc3RlcmVkSW5zdGFuY2VzID0ge307CiAgICAgICAgICBmdW5jdGlvbiBnZXRCYXNlc3RQb2ludGVyKGNsYXNzXywgcHRyKSB7CiAgICAgICAgICAgIGlmIChwdHIgPT09IHZvaWQgMCkgewogICAgICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKCJwdHIgc2hvdWxkIG5vdCBiZSB1bmRlZmluZWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoY2xhc3NfLmJhc2VDbGFzcykgewogICAgICAgICAgICAgIHB0ciA9IGNsYXNzXy51cGNhc3QocHRyKTsKICAgICAgICAgICAgICBjbGFzc18gPSBjbGFzc18uYmFzZUNsYXNzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwdHI7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBnZXRJbmhlcml0ZWRJbnN0YW5jZShjbGFzc18sIHB0cikgewogICAgICAgICAgICBwdHIgPSBnZXRCYXNlc3RQb2ludGVyKGNsYXNzXywgcHRyKTsKICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRJbnN0YW5jZXNbcHRyXTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIG1ha2VDbGFzc0hhbmRsZShwcm90b3R5cGUsIHJlY29yZCkgewogICAgICAgICAgICBpZiAoIXJlY29yZC5wdHJUeXBlIHx8ICFyZWNvcmQucHRyKSB7CiAgICAgICAgICAgICAgdGhyb3dJbnRlcm5hbEVycm9yKCJtYWtlQ2xhc3NIYW5kbGUgcmVxdWlyZXMgcHRyIGFuZCBwdHJUeXBlIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGhhc1NtYXJ0UHRyVHlwZSA9ICEhcmVjb3JkLnNtYXJ0UHRyVHlwZTsKICAgICAgICAgICAgdmFyIGhhc1NtYXJ0UHRyID0gISFyZWNvcmQuc21hcnRQdHI7CiAgICAgICAgICAgIGlmIChoYXNTbWFydFB0clR5cGUgIT09IGhhc1NtYXJ0UHRyKSB7CiAgICAgICAgICAgICAgdGhyb3dJbnRlcm5hbEVycm9yKCJCb3RoIHNtYXJ0UHRyVHlwZSBhbmQgc21hcnRQdHIgbXVzdCBiZSBzcGVjaWZpZWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZWNvcmQuY291bnQgPSB7IHZhbHVlOiAxIH07CiAgICAgICAgICAgIHJldHVybiBhdHRhY2hGaW5hbGl6ZXIoT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUsIHsgJCQ6IHsgdmFsdWU6IHJlY29yZCB9IH0pKTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIFJlZ2lzdGVyZWRQb2ludGVyX2Zyb21XaXJlVHlwZShwdHIpIHsKICAgICAgICAgICAgdmFyIHJhd1BvaW50ZXIgPSB0aGlzLmdldFBvaW50ZWUocHRyKTsKICAgICAgICAgICAgaWYgKCFyYXdQb2ludGVyKSB7CiAgICAgICAgICAgICAgdGhpcy5kZXN0cnVjdG9yKHB0cik7CiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlZ2lzdGVyZWRJbnN0YW5jZSA9IGdldEluaGVyaXRlZEluc3RhbmNlKHRoaXMucmVnaXN0ZXJlZENsYXNzLCByYXdQb2ludGVyKTsKICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gcmVnaXN0ZXJlZEluc3RhbmNlKSB7CiAgICAgICAgICAgICAgaWYgKDAgPT09IHJlZ2lzdGVyZWRJbnN0YW5jZS4kJC5jb3VudC52YWx1ZSkgewogICAgICAgICAgICAgICAgcmVnaXN0ZXJlZEluc3RhbmNlLiQkLnB0ciA9IHJhd1BvaW50ZXI7CiAgICAgICAgICAgICAgICByZWdpc3RlcmVkSW5zdGFuY2UuJCQuc21hcnRQdHIgPSBwdHI7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVnaXN0ZXJlZEluc3RhbmNlWyJjbG9uZSJdKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBydiA9IHJlZ2lzdGVyZWRJbnN0YW5jZVsiY2xvbmUiXSgpOwogICAgICAgICAgICAgICAgdGhpcy5kZXN0cnVjdG9yKHB0cik7CiAgICAgICAgICAgICAgICByZXR1cm4gcnY7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIG1ha2VEZWZhdWx0SGFuZGxlKCkgewogICAgICAgICAgICAgIGlmICh0aGlzLmlzU21hcnRQb2ludGVyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLCB7IHB0clR5cGU6IHRoaXMucG9pbnRlZVR5cGUsIHB0cjogcmF3UG9pbnRlciwgc21hcnRQdHJUeXBlOiB0aGlzLCBzbWFydFB0cjogcHRyIH0pOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLCB7IHB0clR5cGU6IHRoaXMsIHB0ciB9KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGFjdHVhbFR5cGUgPSB0aGlzLnJlZ2lzdGVyZWRDbGFzcy5nZXRBY3R1YWxUeXBlKHJhd1BvaW50ZXIpOwogICAgICAgICAgICB2YXIgcmVnaXN0ZXJlZFBvaW50ZXJSZWNvcmQgPSByZWdpc3RlcmVkUG9pbnRlcnNbYWN0dWFsVHlwZV07CiAgICAgICAgICAgIGlmICghcmVnaXN0ZXJlZFBvaW50ZXJSZWNvcmQpIHsKICAgICAgICAgICAgICByZXR1cm4gbWFrZURlZmF1bHRIYW5kbGUuY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdG9UeXBlOwogICAgICAgICAgICBpZiAodGhpcy5pc0NvbnN0KSB7CiAgICAgICAgICAgICAgdG9UeXBlID0gcmVnaXN0ZXJlZFBvaW50ZXJSZWNvcmQuY29uc3RQb2ludGVyVHlwZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0b1R5cGUgPSByZWdpc3RlcmVkUG9pbnRlclJlY29yZC5wb2ludGVyVHlwZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZHAgPSBkb3duY2FzdFBvaW50ZXIocmF3UG9pbnRlciwgdGhpcy5yZWdpc3RlcmVkQ2xhc3MsIHRvVHlwZS5yZWdpc3RlcmVkQ2xhc3MpOwogICAgICAgICAgICBpZiAoZHAgPT09IG51bGwpIHsKICAgICAgICAgICAgICByZXR1cm4gbWFrZURlZmF1bHRIYW5kbGUuY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5pc1NtYXJ0UG9pbnRlcikgewogICAgICAgICAgICAgIHJldHVybiBtYWtlQ2xhc3NIYW5kbGUodG9UeXBlLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSwgeyBwdHJUeXBlOiB0b1R5cGUsIHB0cjogZHAsIHNtYXJ0UHRyVHlwZTogdGhpcywgc21hcnRQdHI6IHB0ciB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRvVHlwZS5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUsIHsgcHRyVHlwZTogdG9UeXBlLCBwdHI6IGRwIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBpbml0X1JlZ2lzdGVyZWRQb2ludGVyKCkgewogICAgICAgICAgICBSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGUuZ2V0UG9pbnRlZSA9IFJlZ2lzdGVyZWRQb2ludGVyX2dldFBvaW50ZWU7CiAgICAgICAgICAgIFJlZ2lzdGVyZWRQb2ludGVyLnByb3RvdHlwZS5kZXN0cnVjdG9yID0gUmVnaXN0ZXJlZFBvaW50ZXJfZGVzdHJ1Y3RvcjsKICAgICAgICAgICAgUmVnaXN0ZXJlZFBvaW50ZXIucHJvdG90eXBlWyJhcmdQYWNrQWR2YW5jZSJdID0gODsKICAgICAgICAgICAgUmVnaXN0ZXJlZFBvaW50ZXIucHJvdG90eXBlWyJyZWFkVmFsdWVGcm9tUG9pbnRlciJdID0gc2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXI7CiAgICAgICAgICAgIFJlZ2lzdGVyZWRQb2ludGVyLnByb3RvdHlwZVsiZGVsZXRlT2JqZWN0Il0gPSBSZWdpc3RlcmVkUG9pbnRlcl9kZWxldGVPYmplY3Q7CiAgICAgICAgICAgIFJlZ2lzdGVyZWRQb2ludGVyLnByb3RvdHlwZVsiZnJvbVdpcmVUeXBlIl0gPSBSZWdpc3RlcmVkUG9pbnRlcl9mcm9tV2lyZVR5cGU7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBSZWdpc3RlcmVkUG9pbnRlcihuYW1lLCByZWdpc3RlcmVkQ2xhc3MsIGlzUmVmZXJlbmNlLCBpc0NvbnN0LCBpc1NtYXJ0UG9pbnRlciwgcG9pbnRlZVR5cGUsIHNoYXJpbmdQb2xpY3ksIHJhd0dldFBvaW50ZWUsIHJhd0NvbnN0cnVjdG9yLCByYXdTaGFyZSwgcmF3RGVzdHJ1Y3RvcikgewogICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICAgICAgICB0aGlzLnJlZ2lzdGVyZWRDbGFzcyA9IHJlZ2lzdGVyZWRDbGFzczsKICAgICAgICAgICAgdGhpcy5pc1JlZmVyZW5jZSA9IGlzUmVmZXJlbmNlOwogICAgICAgICAgICB0aGlzLmlzQ29uc3QgPSBpc0NvbnN0OwogICAgICAgICAgICB0aGlzLmlzU21hcnRQb2ludGVyID0gaXNTbWFydFBvaW50ZXI7CiAgICAgICAgICAgIHRoaXMucG9pbnRlZVR5cGUgPSBwb2ludGVlVHlwZTsKICAgICAgICAgICAgdGhpcy5zaGFyaW5nUG9saWN5ID0gc2hhcmluZ1BvbGljeTsKICAgICAgICAgICAgdGhpcy5yYXdHZXRQb2ludGVlID0gcmF3R2V0UG9pbnRlZTsKICAgICAgICAgICAgdGhpcy5yYXdDb25zdHJ1Y3RvciA9IHJhd0NvbnN0cnVjdG9yOwogICAgICAgICAgICB0aGlzLnJhd1NoYXJlID0gcmF3U2hhcmU7CiAgICAgICAgICAgIHRoaXMucmF3RGVzdHJ1Y3RvciA9IHJhd0Rlc3RydWN0b3I7CiAgICAgICAgICAgIGlmICghaXNTbWFydFBvaW50ZXIgJiYgcmVnaXN0ZXJlZENsYXNzLmJhc2VDbGFzcyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgaWYgKGlzQ29uc3QpIHsKICAgICAgICAgICAgICAgIHRoaXNbInRvV2lyZVR5cGUiXSA9IGNvbnN0Tm9TbWFydFB0clJhd1BvaW50ZXJUb1dpcmVUeXBlOwogICAgICAgICAgICAgICAgdGhpcy5kZXN0cnVjdG9yRnVuY3Rpb24gPSBudWxsOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzWyJ0b1dpcmVUeXBlIl0gPSBub25Db25zdE5vU21hcnRQdHJSYXdQb2ludGVyVG9XaXJlVHlwZTsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJ1Y3RvckZ1bmN0aW9uID0gbnVsbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpc1sidG9XaXJlVHlwZSJdID0gZ2VuZXJpY1BvaW50ZXJUb1dpcmVUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiByZXBsYWNlUHVibGljU3ltYm9sKG5hbWUsIHZhbHVlLCBudW1Bcmd1bWVudHMpIHsKICAgICAgICAgICAgaWYgKCFNb2R1bGUuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgICAgICAgICB0aHJvd0ludGVybmFsRXJyb3IoIlJlcGxhY2luZyBub25leGlzdGFudCBwdWJsaWMgc3ltYm9sIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gTW9kdWxlW25hbWVdLm92ZXJsb2FkVGFibGUgJiYgdm9pZCAwICE9PSBudW1Bcmd1bWVudHMpIHsKICAgICAgICAgICAgICBNb2R1bGVbbmFtZV0ub3ZlcmxvYWRUYWJsZVtudW1Bcmd1bWVudHNdID0gdmFsdWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgTW9kdWxlW25hbWVdID0gdmFsdWU7CiAgICAgICAgICAgICAgTW9kdWxlW25hbWVdLmFyZ0NvdW50ID0gbnVtQXJndW1lbnRzOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBkeW5DYWxsTGVnYWN5KHNpZywgcHRyLCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBmID0gTW9kdWxlWyJkeW5DYWxsXyIgKyBzaWddOwogICAgICAgICAgICByZXR1cm4gYXJncyAmJiBhcmdzLmxlbmd0aCA/IGYuYXBwbHkobnVsbCwgW3B0cl0uY29uY2F0KGFyZ3MpKSA6IGYuY2FsbChudWxsLCBwdHIpOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gZHluQ2FsbChzaWcsIHB0ciwgYXJncykgewogICAgICAgICAgICBpZiAoc2lnLmluZGV4T2YoImoiKSAhPSAtMSkgewogICAgICAgICAgICAgIHJldHVybiBkeW5DYWxsTGVnYWN5KHNpZywgcHRyLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gd2FzbVRhYmxlLmdldChwdHIpLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gZ2V0RHluQ2FsbGVyKHNpZywgcHRyKSB7CiAgICAgICAgICAgIHZhciBhcmdDYWNoZSA9IFtdOwogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgYXJnQ2FjaGUubGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgYXJnQ2FjaGVbaV0gPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBkeW5DYWxsKHNpZywgcHRyLCBhcmdDYWNoZSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBlbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihzaWduYXR1cmUsIHJhd0Z1bmN0aW9uKSB7CiAgICAgICAgICAgIHNpZ25hdHVyZSA9IHJlYWRMYXRpbjFTdHJpbmcoc2lnbmF0dXJlKTsKICAgICAgICAgICAgZnVuY3Rpb24gbWFrZUR5bkNhbGxlcigpIHsKICAgICAgICAgICAgICBpZiAoc2lnbmF0dXJlLmluZGV4T2YoImoiKSAhPSAtMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGdldER5bkNhbGxlcihzaWduYXR1cmUsIHJhd0Z1bmN0aW9uKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHdhc21UYWJsZS5nZXQocmF3RnVuY3Rpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBmcCA9IG1ha2VEeW5DYWxsZXIoKTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBmcCAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKCJ1bmtub3duIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBzaWduYXR1cmUgIiArIHNpZ25hdHVyZSArICI6ICIgKyByYXdGdW5jdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZwOwogICAgICAgICAgfQogICAgICAgICAgdmFyIFVuYm91bmRUeXBlRXJyb3IgPSB2b2lkIDA7CiAgICAgICAgICBmdW5jdGlvbiBnZXRUeXBlTmFtZSh0eXBlKSB7CiAgICAgICAgICAgIHZhciBwdHIgPSBfX19nZXRUeXBlTmFtZSh0eXBlKTsKICAgICAgICAgICAgdmFyIHJ2ID0gcmVhZExhdGluMVN0cmluZyhwdHIpOwogICAgICAgICAgICBfZnJlZShwdHIpOwogICAgICAgICAgICByZXR1cm4gcnY7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiB0aHJvd1VuYm91bmRUeXBlRXJyb3IobWVzc2FnZSwgdHlwZXMpIHsKICAgICAgICAgICAgdmFyIHVuYm91bmRUeXBlcyA9IFtdOwogICAgICAgICAgICB2YXIgc2VlbiA9IHt9OwogICAgICAgICAgICBmdW5jdGlvbiB2aXNpdCh0eXBlKSB7CiAgICAgICAgICAgICAgaWYgKHNlZW5bdHlwZV0pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHJlZ2lzdGVyZWRUeXBlc1t0eXBlXSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodHlwZURlcGVuZGVuY2llc1t0eXBlXSkgewogICAgICAgICAgICAgICAgdHlwZURlcGVuZGVuY2llc1t0eXBlXS5mb3JFYWNoKHZpc2l0KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdW5ib3VuZFR5cGVzLnB1c2godHlwZSk7CiAgICAgICAgICAgICAgc2Vlblt0eXBlXSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHlwZXMuZm9yRWFjaCh2aXNpdCk7CiAgICAgICAgICAgIHRocm93IG5ldyBVbmJvdW5kVHlwZUVycm9yKG1lc3NhZ2UgKyAiOiAiICsgdW5ib3VuZFR5cGVzLm1hcChnZXRUeXBlTmFtZSkuam9pbihbIiwgIl0pKTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzKHJhd1R5cGUsIHJhd1BvaW50ZXJUeXBlLCByYXdDb25zdFBvaW50ZXJUeXBlLCBiYXNlQ2xhc3NSYXdUeXBlLCBnZXRBY3R1YWxUeXBlU2lnbmF0dXJlLCBnZXRBY3R1YWxUeXBlLCB1cGNhc3RTaWduYXR1cmUsIHVwY2FzdCwgZG93bmNhc3RTaWduYXR1cmUsIGRvd25jYXN0LCBuYW1lLCBkZXN0cnVjdG9yU2lnbmF0dXJlLCByYXdEZXN0cnVjdG9yKSB7CiAgICAgICAgICAgIG5hbWUgPSByZWFkTGF0aW4xU3RyaW5nKG5hbWUpOwogICAgICAgICAgICBnZXRBY3R1YWxUeXBlID0gZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24oZ2V0QWN0dWFsVHlwZVNpZ25hdHVyZSwgZ2V0QWN0dWFsVHlwZSk7CiAgICAgICAgICAgIGlmICh1cGNhc3QpIHsKICAgICAgICAgICAgICB1cGNhc3QgPSBlbWJpbmRfX3JlcXVpcmVGdW5jdGlvbih1cGNhc3RTaWduYXR1cmUsIHVwY2FzdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRvd25jYXN0KSB7CiAgICAgICAgICAgICAgZG93bmNhc3QgPSBlbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihkb3duY2FzdFNpZ25hdHVyZSwgZG93bmNhc3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJhd0Rlc3RydWN0b3IgPSBlbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihkZXN0cnVjdG9yU2lnbmF0dXJlLCByYXdEZXN0cnVjdG9yKTsKICAgICAgICAgICAgdmFyIGxlZ2FsRnVuY3Rpb25OYW1lID0gbWFrZUxlZ2FsRnVuY3Rpb25OYW1lKG5hbWUpOwogICAgICAgICAgICBleHBvc2VQdWJsaWNTeW1ib2wobGVnYWxGdW5jdGlvbk5hbWUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHRocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNvbnN0cnVjdCAiICsgbmFtZSArICIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLCBbYmFzZUNsYXNzUmF3VHlwZV0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgd2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW3Jhd1R5cGUsIHJhd1BvaW50ZXJUeXBlLCByYXdDb25zdFBvaW50ZXJUeXBlXSwgYmFzZUNsYXNzUmF3VHlwZSA/IFtiYXNlQ2xhc3NSYXdUeXBlXSA6IFtdLCBmdW5jdGlvbihiYXNlKSB7CiAgICAgICAgICAgICAgYmFzZSA9IGJhc2VbMF07CiAgICAgICAgICAgICAgdmFyIGJhc2VDbGFzczsKICAgICAgICAgICAgICB2YXIgYmFzZVByb3RvdHlwZTsKICAgICAgICAgICAgICBpZiAoYmFzZUNsYXNzUmF3VHlwZSkgewogICAgICAgICAgICAgICAgYmFzZUNsYXNzID0gYmFzZS5yZWdpc3RlcmVkQ2xhc3M7CiAgICAgICAgICAgICAgICBiYXNlUHJvdG90eXBlID0gYmFzZUNsYXNzLmluc3RhbmNlUHJvdG90eXBlOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBiYXNlUHJvdG90eXBlID0gQ2xhc3NIYW5kbGUucHJvdG90eXBlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBjcmVhdGVOYW1lZEZ1bmN0aW9uKGxlZ2FsRnVuY3Rpb25OYW1lLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykgIT09IGluc3RhbmNlUHJvdG90eXBlKSB7CiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCaW5kaW5nRXJyb3IoIlVzZSAnbmV3JyB0byBjb25zdHJ1Y3QgIiArIG5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gcmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHkpIHsKICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRpbmdFcnJvcihuYW1lICsgIiBoYXMgbm8gYWNjZXNzaWJsZSBjb25zdHJ1Y3RvciIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGJvZHkgPSByZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keVthcmd1bWVudHMubGVuZ3RoXTsKICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IGJvZHkpIHsKICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRpbmdFcnJvcigiVHJpZWQgdG8gaW52b2tlIGN0b3Igb2YgIiArIG5hbWUgKyAiIHdpdGggaW52YWxpZCBudW1iZXIgb2YgcGFyYW1ldGVycyAoIiArIGFyZ3VtZW50cy5sZW5ndGggKyAiKSAtIGV4cGVjdGVkICgiICsgT2JqZWN0LmtleXMocmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHkpLnRvU3RyaW5nKCkgKyAiKSBwYXJhbWV0ZXJzIGluc3RlYWQhIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gYm9keS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHZhciBpbnN0YW5jZVByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoYmFzZVByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogY29uc3RydWN0b3IgfSB9KTsKICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBpbnN0YW5jZVByb3RvdHlwZTsKICAgICAgICAgICAgICB2YXIgcmVnaXN0ZXJlZENsYXNzID0gbmV3IFJlZ2lzdGVyZWRDbGFzcyhuYW1lLCBjb25zdHJ1Y3RvciwgaW5zdGFuY2VQcm90b3R5cGUsIHJhd0Rlc3RydWN0b3IsIGJhc2VDbGFzcywgZ2V0QWN0dWFsVHlwZSwgdXBjYXN0LCBkb3duY2FzdCk7CiAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZUNvbnZlcnRlciA9IG5ldyBSZWdpc3RlcmVkUG9pbnRlcihuYW1lLCByZWdpc3RlcmVkQ2xhc3MsIHRydWUsIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgICAgICAgdmFyIHBvaW50ZXJDb252ZXJ0ZXIgPSBuZXcgUmVnaXN0ZXJlZFBvaW50ZXIobmFtZSArICIqIiwgcmVnaXN0ZXJlZENsYXNzLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgICB2YXIgY29uc3RQb2ludGVyQ29udmVydGVyID0gbmV3IFJlZ2lzdGVyZWRQb2ludGVyKG5hbWUgKyAiIGNvbnN0KiIsIHJlZ2lzdGVyZWRDbGFzcywgZmFsc2UsIHRydWUsIGZhbHNlKTsKICAgICAgICAgICAgICByZWdpc3RlcmVkUG9pbnRlcnNbcmF3VHlwZV0gPSB7IHBvaW50ZXJUeXBlOiBwb2ludGVyQ29udmVydGVyLCBjb25zdFBvaW50ZXJUeXBlOiBjb25zdFBvaW50ZXJDb252ZXJ0ZXIgfTsKICAgICAgICAgICAgICByZXBsYWNlUHVibGljU3ltYm9sKGxlZ2FsRnVuY3Rpb25OYW1lLCBjb25zdHJ1Y3Rvcik7CiAgICAgICAgICAgICAgcmV0dXJuIFtyZWZlcmVuY2VDb252ZXJ0ZXIsIHBvaW50ZXJDb252ZXJ0ZXIsIGNvbnN0UG9pbnRlckNvbnZlcnRlcl07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gaGVhcDMyVmVjdG9yVG9BcnJheShjb3VudCwgZmlyc3RFbGVtZW50KSB7CiAgICAgICAgICAgIHZhciBhcnJheSA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICBhcnJheS5wdXNoKEhFQVAzMlsoZmlyc3RFbGVtZW50ID4+IDIpICsgaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yKHJhd0NsYXNzVHlwZSwgYXJnQ291bnQsIHJhd0FyZ1R5cGVzQWRkciwgaW52b2tlclNpZ25hdHVyZSwgaW52b2tlciwgcmF3Q29uc3RydWN0b3IpIHsKICAgICAgICAgICAgYXNzZXJ0KGFyZ0NvdW50ID4gMCk7CiAgICAgICAgICAgIHZhciByYXdBcmdUeXBlcyA9IGhlYXAzMlZlY3RvclRvQXJyYXkoYXJnQ291bnQsIHJhd0FyZ1R5cGVzQWRkcik7CiAgICAgICAgICAgIGludm9rZXIgPSBlbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihpbnZva2VyU2lnbmF0dXJlLCBpbnZva2VyKTsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBbcmF3Q29uc3RydWN0b3JdOwogICAgICAgICAgICB2YXIgZGVzdHJ1Y3RvcnMgPSBbXTsKICAgICAgICAgICAgd2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW10sIFtyYXdDbGFzc1R5cGVdLCBmdW5jdGlvbihjbGFzc1R5cGUpIHsKICAgICAgICAgICAgICBjbGFzc1R5cGUgPSBjbGFzc1R5cGVbMF07CiAgICAgICAgICAgICAgdmFyIGh1bWFuTmFtZSA9ICJjb25zdHJ1Y3RvciAiICsgY2xhc3NUeXBlLm5hbWU7CiAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gY2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5KSB7CiAgICAgICAgICAgICAgICBjbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHkgPSBbXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gY2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W2FyZ0NvdW50IC0gMV0pIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBCaW5kaW5nRXJyb3IoIkNhbm5vdCByZWdpc3RlciBtdWx0aXBsZSBjb25zdHJ1Y3RvcnMgd2l0aCBpZGVudGljYWwgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCIgKyAoYXJnQ291bnQgLSAxKSArICIpIGZvciBjbGFzcyAnIiArIGNsYXNzVHlwZS5uYW1lICsgIichIE92ZXJsb2FkIHJlc29sdXRpb24gaXMgY3VycmVudGx5IG9ubHkgcGVyZm9ybWVkIHVzaW5nIHRoZSBwYXJhbWV0ZXIgY291bnQsIG5vdCBhY3R1YWwgdHlwZSBpbmZvISIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbYXJnQ291bnQgLSAxXSA9IGZ1bmN0aW9uIHVuYm91bmRUeXBlSGFuZGxlcigpIHsKICAgICAgICAgICAgICAgIHRocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNvbnN0cnVjdCAiICsgY2xhc3NUeXBlLm5hbWUgKyAiIGR1ZSB0byB1bmJvdW5kIHR5cGVzIiwgcmF3QXJnVHlwZXMpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgd2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW10sIHJhd0FyZ1R5cGVzLCBmdW5jdGlvbihhcmdUeXBlcykgewogICAgICAgICAgICAgICAgY2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W2FyZ0NvdW50IC0gMV0gPSBmdW5jdGlvbiBjb25zdHJ1Y3Rvcl9ib2R5KCkgewogICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gYXJnQ291bnQgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3dCaW5kaW5nRXJyb3IoaHVtYW5OYW1lICsgIiBjYWxsZWQgd2l0aCAiICsgYXJndW1lbnRzLmxlbmd0aCArICIgYXJndW1lbnRzLCBleHBlY3RlZCAiICsgKGFyZ0NvdW50IC0gMSkpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGRlc3RydWN0b3JzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICAgIGFyZ3MubGVuZ3RoID0gYXJnQ291bnQ7CiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJnQ291bnQ7ICsraSkgewogICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBhcmdUeXBlc1tpXVsidG9XaXJlVHlwZSJdKGRlc3RydWN0b3JzLCBhcmd1bWVudHNbaSAtIDFdKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB2YXIgcHRyID0gaW52b2tlci5hcHBseShudWxsLCBhcmdzKTsKICAgICAgICAgICAgICAgICAgcnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpOwogICAgICAgICAgICAgICAgICByZXR1cm4gYXJnVHlwZXNbMF1bImZyb21XaXJlVHlwZSJdKHB0cik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBuZXdfKGNvbnN0cnVjdG9yLCBhcmd1bWVudExpc3QpIHsKICAgICAgICAgICAgaWYgKCEoY29uc3RydWN0b3IgaW5zdGFuY2VvZiBGdW5jdGlvbikpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJuZXdfIGNhbGxlZCB3aXRoIGNvbnN0cnVjdG9yIHR5cGUgIiArIHR5cGVvZiBjb25zdHJ1Y3RvciArICIgd2hpY2ggaXMgbm90IGEgZnVuY3Rpb24iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZHVtbXkgPSBjcmVhdGVOYW1lZEZ1bmN0aW9uKGNvbnN0cnVjdG9yLm5hbWUgfHwgInVua25vd25GdW5jdGlvbk5hbWUiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGR1bW15LnByb3RvdHlwZSA9IGNvbnN0cnVjdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgdmFyIG9iaiA9IG5ldyBkdW1teSgpOwogICAgICAgICAgICB2YXIgciA9IGNvbnN0cnVjdG9yLmFwcGx5KG9iaiwgYXJndW1lbnRMaXN0KTsKICAgICAgICAgICAgcmV0dXJuIHIgaW5zdGFuY2VvZiBPYmplY3QgPyByIDogb2JqOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gY3JhZnRJbnZva2VyRnVuY3Rpb24oaHVtYW5OYW1lLCBhcmdUeXBlcywgY2xhc3NUeXBlLCBjcHBJbnZva2VyRnVuYywgY3BwVGFyZ2V0RnVuYykgewogICAgICAgICAgICB2YXIgYXJnQ291bnQgPSBhcmdUeXBlcy5sZW5ndGg7CiAgICAgICAgICAgIGlmIChhcmdDb3VudCA8IDIpIHsKICAgICAgICAgICAgICB0aHJvd0JpbmRpbmdFcnJvcigiYXJnVHlwZXMgYXJyYXkgc2l6ZSBtaXNtYXRjaCEgTXVzdCBhdCBsZWFzdCBnZXQgcmV0dXJuIHZhbHVlIGFuZCAndGhpcycgdHlwZXMhIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGlzQ2xhc3NNZXRob2RGdW5jID0gYXJnVHlwZXNbMV0gIT09IG51bGwgJiYgY2xhc3NUeXBlICE9PSBudWxsOwogICAgICAgICAgICB2YXIgbmVlZHNEZXN0cnVjdG9yU3RhY2sgPSBmYWxzZTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmdUeXBlcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgIGlmIChhcmdUeXBlc1tpXSAhPT0gbnVsbCAmJiBhcmdUeXBlc1tpXS5kZXN0cnVjdG9yRnVuY3Rpb24gPT09IHZvaWQgMCkgewogICAgICAgICAgICAgICAgbmVlZHNEZXN0cnVjdG9yU3RhY2sgPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZXR1cm5zID0gYXJnVHlwZXNbMF0ubmFtZSAhPT0gInZvaWQiOwogICAgICAgICAgICB2YXIgYXJnc0xpc3QgPSAiIjsKICAgICAgICAgICAgdmFyIGFyZ3NMaXN0V2lyZWQgPSAiIjsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdDb3VudCAtIDI7ICsraSkgewogICAgICAgICAgICAgIGFyZ3NMaXN0ICs9IChpICE9PSAwID8gIiwgIiA6ICIiKSArICJhcmciICsgaTsKICAgICAgICAgICAgICBhcmdzTGlzdFdpcmVkICs9IChpICE9PSAwID8gIiwgIiA6ICIiKSArICJhcmciICsgaSArICJXaXJlZCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGludm9rZXJGbkJvZHkgPSAicmV0dXJuIGZ1bmN0aW9uICIgKyBtYWtlTGVnYWxGdW5jdGlvbk5hbWUoaHVtYW5OYW1lKSArICIoIiArIGFyZ3NMaXN0ICsgIikge1xuaWYgKGFyZ3VtZW50cy5sZW5ndGggIT09ICIgKyAoYXJnQ291bnQgLSAyKSArICIpIHtcbnRocm93QmluZGluZ0Vycm9yKCdmdW5jdGlvbiAiICsgaHVtYW5OYW1lICsgIiBjYWxsZWQgd2l0aCAnICsgYXJndW1lbnRzLmxlbmd0aCArICcgYXJndW1lbnRzLCBleHBlY3RlZCAiICsgKGFyZ0NvdW50IC0gMikgKyAiIGFyZ3MhJyk7XG59XG4iOwogICAgICAgICAgICBpZiAobmVlZHNEZXN0cnVjdG9yU3RhY2spIHsKICAgICAgICAgICAgICBpbnZva2VyRm5Cb2R5ICs9ICJ2YXIgZGVzdHJ1Y3RvcnMgPSBbXTtcbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGR0b3JTdGFjayA9IG5lZWRzRGVzdHJ1Y3RvclN0YWNrID8gImRlc3RydWN0b3JzIiA6ICJudWxsIjsKICAgICAgICAgICAgdmFyIGFyZ3MxID0gWyJ0aHJvd0JpbmRpbmdFcnJvciIsICJpbnZva2VyIiwgImZuIiwgInJ1bkRlc3RydWN0b3JzIiwgInJldFR5cGUiLCAiY2xhc3NQYXJhbSJdOwogICAgICAgICAgICB2YXIgYXJnczIgPSBbdGhyb3dCaW5kaW5nRXJyb3IsIGNwcEludm9rZXJGdW5jLCBjcHBUYXJnZXRGdW5jLCBydW5EZXN0cnVjdG9ycywgYXJnVHlwZXNbMF0sIGFyZ1R5cGVzWzFdXTsKICAgICAgICAgICAgaWYgKGlzQ2xhc3NNZXRob2RGdW5jKSB7CiAgICAgICAgICAgICAgaW52b2tlckZuQm9keSArPSAidmFyIHRoaXNXaXJlZCA9IGNsYXNzUGFyYW0udG9XaXJlVHlwZSgiICsgZHRvclN0YWNrICsgIiwgdGhpcyk7XG4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnQ291bnQgLSAyOyArK2kpIHsKICAgICAgICAgICAgICBpbnZva2VyRm5Cb2R5ICs9ICJ2YXIgYXJnIiArIGkgKyAiV2lyZWQgPSBhcmdUeXBlIiArIGkgKyAiLnRvV2lyZVR5cGUoIiArIGR0b3JTdGFjayArICIsIGFyZyIgKyBpICsgIik7IC8vICIgKyBhcmdUeXBlc1tpICsgMl0ubmFtZSArICJcbiI7CiAgICAgICAgICAgICAgYXJnczEucHVzaCgiYXJnVHlwZSIgKyBpKTsKICAgICAgICAgICAgICBhcmdzMi5wdXNoKGFyZ1R5cGVzW2kgKyAyXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzQ2xhc3NNZXRob2RGdW5jKSB7CiAgICAgICAgICAgICAgYXJnc0xpc3RXaXJlZCA9ICJ0aGlzV2lyZWQiICsgKGFyZ3NMaXN0V2lyZWQubGVuZ3RoID4gMCA/ICIsICIgOiAiIikgKyBhcmdzTGlzdFdpcmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGludm9rZXJGbkJvZHkgKz0gKHJldHVybnMgPyAidmFyIHJ2ID0gIiA6ICIiKSArICJpbnZva2VyKGZuIiArIChhcmdzTGlzdFdpcmVkLmxlbmd0aCA+IDAgPyAiLCAiIDogIiIpICsgYXJnc0xpc3RXaXJlZCArICIpO1xuIjsKICAgICAgICAgICAgaWYgKG5lZWRzRGVzdHJ1Y3RvclN0YWNrKSB7CiAgICAgICAgICAgICAgaW52b2tlckZuQm9keSArPSAicnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpO1xuIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gaXNDbGFzc01ldGhvZEZ1bmMgPyAxIDogMjsgaSA8IGFyZ1R5cGVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gaSA9PT0gMSA/ICJ0aGlzV2lyZWQiIDogImFyZyIgKyAoaSAtIDIpICsgIldpcmVkIjsKICAgICAgICAgICAgICAgIGlmIChhcmdUeXBlc1tpXS5kZXN0cnVjdG9yRnVuY3Rpb24gIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgaW52b2tlckZuQm9keSArPSBwYXJhbU5hbWUgKyAiX2R0b3IoIiArIHBhcmFtTmFtZSArICIpOyAvLyAiICsgYXJnVHlwZXNbaV0ubmFtZSArICJcbiI7CiAgICAgICAgICAgICAgICAgIGFyZ3MxLnB1c2gocGFyYW1OYW1lICsgIl9kdG9yIik7CiAgICAgICAgICAgICAgICAgIGFyZ3MyLnB1c2goYXJnVHlwZXNbaV0uZGVzdHJ1Y3RvckZ1bmN0aW9uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJldHVybnMpIHsKICAgICAgICAgICAgICBpbnZva2VyRm5Cb2R5ICs9ICJ2YXIgcmV0ID0gcmV0VHlwZS5mcm9tV2lyZVR5cGUocnYpO1xucmV0dXJuIHJldDtcbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW52b2tlckZuQm9keSArPSAifVxuIjsKICAgICAgICAgICAgYXJnczEucHVzaChpbnZva2VyRm5Cb2R5KTsKICAgICAgICAgICAgdmFyIGludm9rZXJGdW5jdGlvbiA9IG5ld18oRnVuY3Rpb24sIGFyZ3MxKS5hcHBseShudWxsLCBhcmdzMik7CiAgICAgICAgICAgIHJldHVybiBpbnZva2VyRnVuY3Rpb247CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19mdW5jdGlvbihyYXdDbGFzc1R5cGUsIG1ldGhvZE5hbWUsIGFyZ0NvdW50LCByYXdBcmdUeXBlc0FkZHIsIGludm9rZXJTaWduYXR1cmUsIHJhd0ludm9rZXIsIGNvbnRleHQsIGlzUHVyZVZpcnR1YWwpIHsKICAgICAgICAgICAgdmFyIHJhd0FyZ1R5cGVzID0gaGVhcDMyVmVjdG9yVG9BcnJheShhcmdDb3VudCwgcmF3QXJnVHlwZXNBZGRyKTsKICAgICAgICAgICAgbWV0aG9kTmFtZSA9IHJlYWRMYXRpbjFTdHJpbmcobWV0aG9kTmFtZSk7CiAgICAgICAgICAgIHJhd0ludm9rZXIgPSBlbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihpbnZva2VyU2lnbmF0dXJlLCByYXdJbnZva2VyKTsKICAgICAgICAgICAgd2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW10sIFtyYXdDbGFzc1R5cGVdLCBmdW5jdGlvbihjbGFzc1R5cGUpIHsKICAgICAgICAgICAgICBjbGFzc1R5cGUgPSBjbGFzc1R5cGVbMF07CiAgICAgICAgICAgICAgdmFyIGh1bWFuTmFtZSA9IGNsYXNzVHlwZS5uYW1lICsgIi4iICsgbWV0aG9kTmFtZTsKICAgICAgICAgICAgICBpZiAoaXNQdXJlVmlydHVhbCkgewogICAgICAgICAgICAgICAgY2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5wdXJlVmlydHVhbEZ1bmN0aW9ucy5wdXNoKG1ldGhvZE5hbWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmdW5jdGlvbiB1bmJvdW5kVHlwZXNIYW5kbGVyKCkgewogICAgICAgICAgICAgICAgdGhyb3dVbmJvdW5kVHlwZUVycm9yKCJDYW5ub3QgY2FsbCAiICsgaHVtYW5OYW1lICsgIiBkdWUgdG8gdW5ib3VuZCB0eXBlcyIsIHJhd0FyZ1R5cGVzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIHByb3RvID0gY2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZTsKICAgICAgICAgICAgICB2YXIgbWV0aG9kID0gcHJvdG9bbWV0aG9kTmFtZV07CiAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gbWV0aG9kIHx8IHZvaWQgMCA9PT0gbWV0aG9kLm92ZXJsb2FkVGFibGUgJiYgbWV0aG9kLmNsYXNzTmFtZSAhPT0gY2xhc3NUeXBlLm5hbWUgJiYgbWV0aG9kLmFyZ0NvdW50ID09PSBhcmdDb3VudCAtIDIpIHsKICAgICAgICAgICAgICAgIHVuYm91bmRUeXBlc0hhbmRsZXIuYXJnQ291bnQgPSBhcmdDb3VudCAtIDI7CiAgICAgICAgICAgICAgICB1bmJvdW5kVHlwZXNIYW5kbGVyLmNsYXNzTmFtZSA9IGNsYXNzVHlwZS5uYW1lOwogICAgICAgICAgICAgICAgcHJvdG9bbWV0aG9kTmFtZV0gPSB1bmJvdW5kVHlwZXNIYW5kbGVyOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlbnN1cmVPdmVybG9hZFRhYmxlKHByb3RvLCBtZXRob2ROYW1lLCBodW1hbk5hbWUpOwogICAgICAgICAgICAgICAgcHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZVthcmdDb3VudCAtIDJdID0gdW5ib3VuZFR5cGVzSGFuZGxlcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgd2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW10sIHJhd0FyZ1R5cGVzLCBmdW5jdGlvbihhcmdUeXBlcykgewogICAgICAgICAgICAgICAgdmFyIG1lbWJlckZ1bmN0aW9uID0gY3JhZnRJbnZva2VyRnVuY3Rpb24oaHVtYW5OYW1lLCBhcmdUeXBlcywgY2xhc3NUeXBlLCByYXdJbnZva2VyLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IHByb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGUpIHsKICAgICAgICAgICAgICAgICAgbWVtYmVyRnVuY3Rpb24uYXJnQ291bnQgPSBhcmdDb3VudCAtIDI7CiAgICAgICAgICAgICAgICAgIHByb3RvW21ldGhvZE5hbWVdID0gbWVtYmVyRnVuY3Rpb247CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlW2FyZ0NvdW50IC0gMl0gPSBtZW1iZXJGdW5jdGlvbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfY29uc3RhbnQobmFtZSwgdHlwZSwgdmFsdWUpIHsKICAgICAgICAgICAgbmFtZSA9IHJlYWRMYXRpbjFTdHJpbmcobmFtZSk7CiAgICAgICAgICAgIHdoZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLCBbdHlwZV0sIGZ1bmN0aW9uKHR5cGUyKSB7CiAgICAgICAgICAgICAgdHlwZTIgPSB0eXBlMlswXTsKICAgICAgICAgICAgICBNb2R1bGVbbmFtZV0gPSB0eXBlMlsiZnJvbVdpcmVUeXBlIl0odmFsdWUpOwogICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgZW12YWxfZnJlZV9saXN0ID0gW107CiAgICAgICAgICB2YXIgZW12YWxfaGFuZGxlX2FycmF5ID0gW3t9LCB7IHZhbHVlOiB2b2lkIDAgfSwgeyB2YWx1ZTogbnVsbCB9LCB7IHZhbHVlOiB0cnVlIH0sIHsgdmFsdWU6IGZhbHNlIH1dOwogICAgICAgICAgZnVuY3Rpb24gX19lbXZhbF9kZWNyZWYoaGFuZGxlKSB7CiAgICAgICAgICAgIGlmIChoYW5kbGUgPiA0ICYmIDAgPT09IC0tZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV0ucmVmY291bnQpIHsKICAgICAgICAgICAgICBlbXZhbF9oYW5kbGVfYXJyYXlbaGFuZGxlXSA9IHZvaWQgMDsKICAgICAgICAgICAgICBlbXZhbF9mcmVlX2xpc3QucHVzaChoYW5kbGUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBjb3VudF9lbXZhbF9oYW5kbGVzKCkgewogICAgICAgICAgICB2YXIgY291bnQgPSAwOwogICAgICAgICAgICBmb3IgKHZhciBpID0gNTsgaSA8IGVtdmFsX2hhbmRsZV9hcnJheS5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgIGlmIChlbXZhbF9oYW5kbGVfYXJyYXlbaV0gIT09IHZvaWQgMCkgewogICAgICAgICAgICAgICAgKytjb3VudDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gZ2V0X2ZpcnN0X2VtdmFsKCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gNTsgaSA8IGVtdmFsX2hhbmRsZV9hcnJheS5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgIGlmIChlbXZhbF9oYW5kbGVfYXJyYXlbaV0gIT09IHZvaWQgMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGVtdmFsX2hhbmRsZV9hcnJheVtpXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBpbml0X2VtdmFsKCkgewogICAgICAgICAgICBNb2R1bGVbImNvdW50X2VtdmFsX2hhbmRsZXMiXSA9IGNvdW50X2VtdmFsX2hhbmRsZXM7CiAgICAgICAgICAgIE1vZHVsZVsiZ2V0X2ZpcnN0X2VtdmFsIl0gPSBnZXRfZmlyc3RfZW12YWw7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBfX2VtdmFsX3JlZ2lzdGVyKHZhbHVlKSB7CiAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgICAgICAgICBjYXNlIHZvaWQgMDogewogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNhc2UgbnVsbDogewogICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNhc2UgdHJ1ZTogewogICAgICAgICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNhc2UgZmFsc2U6IHsKICAgICAgICAgICAgICAgIHJldHVybiA0OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gZW12YWxfZnJlZV9saXN0Lmxlbmd0aCA/IGVtdmFsX2ZyZWVfbGlzdC5wb3AoKSA6IGVtdmFsX2hhbmRsZV9hcnJheS5sZW5ndGg7CiAgICAgICAgICAgICAgICBlbXZhbF9oYW5kbGVfYXJyYXlbaGFuZGxlXSA9IHsgcmVmY291bnQ6IDEsIHZhbHVlIH07CiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfZW12YWwocmF3VHlwZSwgbmFtZSkgewogICAgICAgICAgICBuYW1lID0gcmVhZExhdGluMVN0cmluZyhuYW1lKTsKICAgICAgICAgICAgcmVnaXN0ZXJUeXBlKHJhd1R5cGUsIHsgbmFtZSwgImZyb21XaXJlVHlwZSI6IGZ1bmN0aW9uKGhhbmRsZSkgewogICAgICAgICAgICAgIHZhciBydiA9IGVtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnZhbHVlOwogICAgICAgICAgICAgIF9fZW12YWxfZGVjcmVmKGhhbmRsZSk7CiAgICAgICAgICAgICAgcmV0dXJuIHJ2OwogICAgICAgICAgICB9LCAidG9XaXJlVHlwZSI6IGZ1bmN0aW9uKGRlc3RydWN0b3JzLCB2YWx1ZSkgewogICAgICAgICAgICAgIHJldHVybiBfX2VtdmFsX3JlZ2lzdGVyKHZhbHVlKTsKICAgICAgICAgICAgfSwgImFyZ1BhY2tBZHZhbmNlIjogOCwgInJlYWRWYWx1ZUZyb21Qb2ludGVyIjogc2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIsIGRlc3RydWN0b3JGdW5jdGlvbjogbnVsbCB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIGVudW1SZWFkVmFsdWVGcm9tUG9pbnRlcihuYW1lLCBzaGlmdCwgc2lnbmVkKSB7CiAgICAgICAgICAgIHN3aXRjaCAoc2hpZnQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24ocG9pbnRlcikgewogICAgICAgICAgICAgICAgICB2YXIgaGVhcCA9IHNpZ25lZCA/IEhFQVA4IDogSEVBUFU4OwogICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1siZnJvbVdpcmVUeXBlIl0oaGVhcFtwb2ludGVyXSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihwb2ludGVyKSB7CiAgICAgICAgICAgICAgICAgIHZhciBoZWFwID0gc2lnbmVkID8gSEVBUDE2IDogSEVBUFUxNjsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlciA+PiAxXSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihwb2ludGVyKSB7CiAgICAgICAgICAgICAgICAgIHZhciBoZWFwID0gc2lnbmVkID8gSEVBUDMyIDogSEVBUFUzMjsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlciA+PiAyXSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGludGVnZXIgdHlwZTogIiArIG5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9lbnVtKHJhd1R5cGUsIG5hbWUsIHNpemUsIGlzU2lnbmVkKSB7CiAgICAgICAgICAgIHZhciBzaGlmdCA9IGdldFNoaWZ0RnJvbVNpemUoc2l6ZSk7CiAgICAgICAgICAgIG5hbWUgPSByZWFkTGF0aW4xU3RyaW5nKG5hbWUpOwogICAgICAgICAgICBmdW5jdGlvbiBjdG9yKCkgewogICAgICAgICAgICB9CiAgICAgICAgICAgIGN0b3IudmFsdWVzID0ge307CiAgICAgICAgICAgIHJlZ2lzdGVyVHlwZShyYXdUeXBlLCB7IG5hbWUsIGNvbnN0cnVjdG9yOiBjdG9yLCAiZnJvbVdpcmVUeXBlIjogZnVuY3Rpb24oYykgewogICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnZhbHVlc1tjXTsKICAgICAgICAgICAgfSwgInRvV2lyZVR5cGUiOiBmdW5jdGlvbihkZXN0cnVjdG9ycywgYykgewogICAgICAgICAgICAgIHJldHVybiBjLnZhbHVlOwogICAgICAgICAgICB9LCAiYXJnUGFja0FkdmFuY2UiOiA4LCAicmVhZFZhbHVlRnJvbVBvaW50ZXIiOiBlbnVtUmVhZFZhbHVlRnJvbVBvaW50ZXIobmFtZSwgc2hpZnQsIGlzU2lnbmVkKSwgZGVzdHJ1Y3RvckZ1bmN0aW9uOiBudWxsIH0pOwogICAgICAgICAgICBleHBvc2VQdWJsaWNTeW1ib2wobmFtZSwgY3Rvcik7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiByZXF1aXJlUmVnaXN0ZXJlZFR5cGUocmF3VHlwZSwgaHVtYW5OYW1lKSB7CiAgICAgICAgICAgIHZhciBpbXBsID0gcmVnaXN0ZXJlZFR5cGVzW3Jhd1R5cGVdOwogICAgICAgICAgICBpZiAodm9pZCAwID09PSBpbXBsKSB7CiAgICAgICAgICAgICAgdGhyb3dCaW5kaW5nRXJyb3IoaHVtYW5OYW1lICsgIiBoYXMgdW5rbm93biB0eXBlICIgKyBnZXRUeXBlTmFtZShyYXdUeXBlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGltcGw7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9lbnVtX3ZhbHVlKHJhd0VudW1UeXBlLCBuYW1lLCBlbnVtVmFsdWUpIHsKICAgICAgICAgICAgdmFyIGVudW1UeXBlID0gcmVxdWlyZVJlZ2lzdGVyZWRUeXBlKHJhd0VudW1UeXBlLCAiZW51bSIpOwogICAgICAgICAgICBuYW1lID0gcmVhZExhdGluMVN0cmluZyhuYW1lKTsKICAgICAgICAgICAgdmFyIEVudW0gPSBlbnVtVHlwZS5jb25zdHJ1Y3RvcjsKICAgICAgICAgICAgdmFyIFZhbHVlID0gT2JqZWN0LmNyZWF0ZShlbnVtVHlwZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHsgdmFsdWU6IHsgdmFsdWU6IGVudW1WYWx1ZSB9LCBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogY3JlYXRlTmFtZWRGdW5jdGlvbihlbnVtVHlwZS5uYW1lICsgIl8iICsgbmFtZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIH0pIH0gfSk7CiAgICAgICAgICAgIEVudW0udmFsdWVzW2VudW1WYWx1ZV0gPSBWYWx1ZTsKICAgICAgICAgICAgRW51bVtuYW1lXSA9IFZhbHVlOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gX2VtYmluZF9yZXByKHYzKSB7CiAgICAgICAgICAgIGlmICh2MyA9PT0gbnVsbCkgewogICAgICAgICAgICAgIHJldHVybiAibnVsbCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHQgPSB0eXBlb2YgdjM7CiAgICAgICAgICAgIGlmICh0ID09PSAib2JqZWN0IiB8fCB0ID09PSAiYXJyYXkiIHx8IHQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICByZXR1cm4gdjMudG9TdHJpbmcoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gIiIgKyB2MzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gZmxvYXRSZWFkVmFsdWVGcm9tUG9pbnRlcihuYW1lLCBzaGlmdCkgewogICAgICAgICAgICBzd2l0Y2ggKHNoaWZ0KSB7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHBvaW50ZXIpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKEhFQVBGMzJbcG9pbnRlciA+PiAyXSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihwb2ludGVyKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzWyJmcm9tV2lyZVR5cGUiXShIRUFQRjY0W3BvaW50ZXIgPj4gM10pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBmbG9hdCB0eXBlOiAiICsgbmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2Zsb2F0KHJhd1R5cGUsIG5hbWUsIHNpemUpIHsKICAgICAgICAgICAgdmFyIHNoaWZ0ID0gZ2V0U2hpZnRGcm9tU2l6ZShzaXplKTsKICAgICAgICAgICAgbmFtZSA9IHJlYWRMYXRpbjFTdHJpbmcobmFtZSk7CiAgICAgICAgICAgIHJlZ2lzdGVyVHlwZShyYXdUeXBlLCB7IG5hbWUsICJmcm9tV2lyZVR5cGUiOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfSwgInRvV2lyZVR5cGUiOiBmdW5jdGlvbihkZXN0cnVjdG9ycywgdmFsdWUpIHsKICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAibnVtYmVyIiAmJiB0eXBlb2YgdmFsdWUgIT09ICJib29sZWFuIikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgIicgKyBfZW1iaW5kX3JlcHIodmFsdWUpICsgJyIgdG8gJyArIHRoaXMubmFtZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfSwgImFyZ1BhY2tBZHZhbmNlIjogOCwgInJlYWRWYWx1ZUZyb21Qb2ludGVyIjogZmxvYXRSZWFkVmFsdWVGcm9tUG9pbnRlcihuYW1lLCBzaGlmdCksIGRlc3RydWN0b3JGdW5jdGlvbjogbnVsbCB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2Z1bmN0aW9uKG5hbWUsIGFyZ0NvdW50LCByYXdBcmdUeXBlc0FkZHIsIHNpZ25hdHVyZSwgcmF3SW52b2tlciwgZm4pIHsKICAgICAgICAgICAgdmFyIGFyZ1R5cGVzID0gaGVhcDMyVmVjdG9yVG9BcnJheShhcmdDb3VudCwgcmF3QXJnVHlwZXNBZGRyKTsKICAgICAgICAgICAgbmFtZSA9IHJlYWRMYXRpbjFTdHJpbmcobmFtZSk7CiAgICAgICAgICAgIHJhd0ludm9rZXIgPSBlbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihzaWduYXR1cmUsIHJhd0ludm9rZXIpOwogICAgICAgICAgICBleHBvc2VQdWJsaWNTeW1ib2wobmFtZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgdGhyb3dVbmJvdW5kVHlwZUVycm9yKCJDYW5ub3QgY2FsbCAiICsgbmFtZSArICIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLCBhcmdUeXBlcyk7CiAgICAgICAgICAgIH0sIGFyZ0NvdW50IC0gMSk7CiAgICAgICAgICAgIHdoZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLCBhcmdUeXBlcywgZnVuY3Rpb24oYXJnVHlwZXMyKSB7CiAgICAgICAgICAgICAgdmFyIGludm9rZXJBcmdzQXJyYXkgPSBbYXJnVHlwZXMyWzBdLCBudWxsXS5jb25jYXQoYXJnVHlwZXMyLnNsaWNlKDEpKTsKICAgICAgICAgICAgICByZXBsYWNlUHVibGljU3ltYm9sKG5hbWUsIGNyYWZ0SW52b2tlckZ1bmN0aW9uKG5hbWUsIGludm9rZXJBcmdzQXJyYXksIG51bGwsIHJhd0ludm9rZXIsIGZuKSwgYXJnQ291bnQgLSAxKTsKICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gaW50ZWdlclJlYWRWYWx1ZUZyb21Qb2ludGVyKG5hbWUsIHNoaWZ0LCBzaWduZWQpIHsKICAgICAgICAgICAgc3dpdGNoIChzaGlmdCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHJldHVybiBzaWduZWQgPyBmdW5jdGlvbiByZWFkUzhGcm9tUG9pbnRlcihwb2ludGVyKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBIRUFQOFtwb2ludGVyXTsKICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiByZWFkVThGcm9tUG9pbnRlcihwb2ludGVyKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBIRUFQVThbcG9pbnRlcl07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgIHJldHVybiBzaWduZWQgPyBmdW5jdGlvbiByZWFkUzE2RnJvbVBvaW50ZXIocG9pbnRlcikgewogICAgICAgICAgICAgICAgICByZXR1cm4gSEVBUDE2W3BvaW50ZXIgPj4gMV07CiAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gcmVhZFUxNkZyb21Qb2ludGVyKHBvaW50ZXIpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVMTZbcG9pbnRlciA+PiAxXTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgcmV0dXJuIHNpZ25lZCA/IGZ1bmN0aW9uIHJlYWRTMzJGcm9tUG9pbnRlcihwb2ludGVyKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBIRUFQMzJbcG9pbnRlciA+PiAyXTsKICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiByZWFkVTMyRnJvbVBvaW50ZXIocG9pbnRlcikgewogICAgICAgICAgICAgICAgICByZXR1cm4gSEVBUFUzMltwb2ludGVyID4+IDJdOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBpbnRlZ2VyIHR5cGU6ICIgKyBuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlcihwcmltaXRpdmVUeXBlLCBuYW1lLCBzaXplLCBtaW5SYW5nZSwgbWF4UmFuZ2UpIHsKICAgICAgICAgICAgbmFtZSA9IHJlYWRMYXRpbjFTdHJpbmcobmFtZSk7CiAgICAgICAgICAgIGlmIChtYXhSYW5nZSA9PT0gLTEpIHsKICAgICAgICAgICAgICBtYXhSYW5nZSA9IDQyOTQ5NjcyOTU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHNoaWZ0ID0gZ2V0U2hpZnRGcm9tU2l6ZShzaXplKTsKICAgICAgICAgICAgdmFyIGZyb21XaXJlVHlwZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAobWluUmFuZ2UgPT09IDApIHsKICAgICAgICAgICAgICB2YXIgYml0c2hpZnQgPSAzMiAtIDggKiBzaXplOwogICAgICAgICAgICAgIGZyb21XaXJlVHlwZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPDwgYml0c2hpZnQgPj4+IGJpdHNoaWZ0OwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGlzVW5zaWduZWRUeXBlID0gbmFtZS5pbmRleE9mKCJ1bnNpZ25lZCIpICE9IC0xOwogICAgICAgICAgICByZWdpc3RlclR5cGUocHJpbWl0aXZlVHlwZSwgeyBuYW1lLCAiZnJvbVdpcmVUeXBlIjogZnJvbVdpcmVUeXBlLCAidG9XaXJlVHlwZSI6IGZ1bmN0aW9uKGRlc3RydWN0b3JzLCB2YWx1ZSkgewogICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJudW1iZXIiICYmIHR5cGVvZiB2YWx1ZSAhPT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCAiJyArIF9lbWJpbmRfcmVwcih2YWx1ZSkgKyAnIiB0byAnICsgdGhpcy5uYW1lKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgbWluUmFuZ2UgfHwgdmFsdWUgPiBtYXhSYW5nZSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGFzc2luZyBhIG51bWJlciAiJyArIF9lbWJpbmRfcmVwcih2YWx1ZSkgKyAnIiBmcm9tIEpTIHNpZGUgdG8gQy9DKysgc2lkZSB0byBhbiBhcmd1bWVudCBvZiB0eXBlICInICsgbmFtZSArICciLCB3aGljaCBpcyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSBbJyArIG1pblJhbmdlICsgIiwgIiArIG1heFJhbmdlICsgIl0hIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBpc1Vuc2lnbmVkVHlwZSA/IHZhbHVlID4+PiAwIDogdmFsdWUgfCAwOwogICAgICAgICAgICB9LCAiYXJnUGFja0FkdmFuY2UiOiA4LCAicmVhZFZhbHVlRnJvbVBvaW50ZXIiOiBpbnRlZ2VyUmVhZFZhbHVlRnJvbVBvaW50ZXIobmFtZSwgc2hpZnQsIG1pblJhbmdlICE9PSAwKSwgZGVzdHJ1Y3RvckZ1bmN0aW9uOiBudWxsIH0pOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfbWVtb3J5X3ZpZXcocmF3VHlwZSwgZGF0YVR5cGVJbmRleCwgbmFtZSkgewogICAgICAgICAgICB2YXIgdHlwZU1hcHBpbmcgPSBbSW50OEFycmF5LCBVaW50OEFycmF5LCBJbnQxNkFycmF5LCBVaW50MTZBcnJheSwgSW50MzJBcnJheSwgVWludDMyQXJyYXksIEZsb2F0MzJBcnJheSwgRmxvYXQ2NEFycmF5XTsKICAgICAgICAgICAgdmFyIFRBID0gdHlwZU1hcHBpbmdbZGF0YVR5cGVJbmRleF07CiAgICAgICAgICAgIGZ1bmN0aW9uIGRlY29kZU1lbW9yeVZpZXcoaGFuZGxlKSB7CiAgICAgICAgICAgICAgaGFuZGxlID0gaGFuZGxlID4+IDI7CiAgICAgICAgICAgICAgdmFyIGhlYXAgPSBIRUFQVTMyOwogICAgICAgICAgICAgIHZhciBzaXplID0gaGVhcFtoYW5kbGVdOwogICAgICAgICAgICAgIHZhciBkYXRhID0gaGVhcFtoYW5kbGUgKyAxXTsKICAgICAgICAgICAgICByZXR1cm4gbmV3IFRBKGJ1ZmZlciwgZGF0YSwgc2l6ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmFtZSA9IHJlYWRMYXRpbjFTdHJpbmcobmFtZSk7CiAgICAgICAgICAgIHJlZ2lzdGVyVHlwZShyYXdUeXBlLCB7IG5hbWUsICJmcm9tV2lyZVR5cGUiOiBkZWNvZGVNZW1vcnlWaWV3LCAiYXJnUGFja0FkdmFuY2UiOiA4LCAicmVhZFZhbHVlRnJvbVBvaW50ZXIiOiBkZWNvZGVNZW1vcnlWaWV3IH0sIHsgaWdub3JlRHVwbGljYXRlUmVnaXN0cmF0aW9uczogdHJ1ZSB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF9zdHJpbmcocmF3VHlwZSwgbmFtZSkgewogICAgICAgICAgICBuYW1lID0gcmVhZExhdGluMVN0cmluZyhuYW1lKTsKICAgICAgICAgICAgdmFyIHN0ZFN0cmluZ0lzVVRGOCA9IG5hbWUgPT09ICJzdGQ6OnN0cmluZyI7CiAgICAgICAgICAgIHJlZ2lzdGVyVHlwZShyYXdUeXBlLCB7IG5hbWUsICJmcm9tV2lyZVR5cGUiOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgIHZhciBsZW5ndGggPSBIRUFQVTMyW3ZhbHVlID4+IDJdOwogICAgICAgICAgICAgIHZhciBzdHI7CiAgICAgICAgICAgICAgaWYgKHN0ZFN0cmluZ0lzVVRGOCkgewogICAgICAgICAgICAgICAgdmFyIGRlY29kZVN0YXJ0UHRyID0gdmFsdWUgKyA0OwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gbGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRCeXRlUHRyID0gdmFsdWUgKyA0ICsgaTsKICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gbGVuZ3RoIHx8IEhFQVBVOFtjdXJyZW50Qnl0ZVB0cl0gPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHZhciBtYXhSZWFkID0gY3VycmVudEJ5dGVQdHIgLSBkZWNvZGVTdGFydFB0cjsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RyaW5nU2VnbWVudCA9IFVURjhUb1N0cmluZyhkZWNvZGVTdGFydFB0ciwgbWF4UmVhZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ciA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBzdHJpbmdTZWdtZW50OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKTsKICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBzdHJpbmdTZWdtZW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZWNvZGVTdGFydFB0ciA9IGN1cnJlbnRCeXRlUHRyICsgMTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgYTMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgICAgYTNbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKEhFQVBVOFt2YWx1ZSArIDQgKyBpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdHIgPSBhMy5qb2luKCIiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgX2ZyZWUodmFsdWUpOwogICAgICAgICAgICAgIHJldHVybiBzdHI7CiAgICAgICAgICAgIH0sICJ0b1dpcmVUeXBlIjogZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsIHZhbHVlKSB7CiAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB2YXIgZ2V0TGVuZ3RoOwogICAgICAgICAgICAgIHZhciB2YWx1ZUlzT2ZUeXBlU3RyaW5nID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIjsKICAgICAgICAgICAgICBpZiAoISh2YWx1ZUlzT2ZUeXBlU3RyaW5nIHx8IHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5IHx8IHZhbHVlIGluc3RhbmNlb2YgSW50OEFycmF5KSkgewogICAgICAgICAgICAgICAgdGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBwYXNzIG5vbi1zdHJpbmcgdG8gc3RkOjpzdHJpbmciKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHN0ZFN0cmluZ0lzVVRGOCAmJiB2YWx1ZUlzT2ZUeXBlU3RyaW5nKSB7CiAgICAgICAgICAgICAgICBnZXRMZW5ndGggPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlbmd0aEJ5dGVzVVRGOCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBnZXRMZW5ndGggPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciBsZW5ndGggPSBnZXRMZW5ndGgoKTsKICAgICAgICAgICAgICB2YXIgcHRyID0gX21hbGxvYyg0ICsgbGVuZ3RoICsgMSk7CiAgICAgICAgICAgICAgSEVBUFUzMltwdHIgPj4gMl0gPSBsZW5ndGg7CiAgICAgICAgICAgICAgaWYgKHN0ZFN0cmluZ0lzVVRGOCAmJiB2YWx1ZUlzT2ZUeXBlU3RyaW5nKSB7CiAgICAgICAgICAgICAgICBzdHJpbmdUb1VURjgodmFsdWUsIHB0ciArIDQsIGxlbmd0aCArIDEpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWVJc09mVHlwZVN0cmluZykgewogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXJDb2RlID0gdmFsdWUuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hhckNvZGUgPiAyNTUpIHsKICAgICAgICAgICAgICAgICAgICAgIF9mcmVlKHB0cik7CiAgICAgICAgICAgICAgICAgICAgICB0aHJvd0JpbmRpbmdFcnJvcigiU3RyaW5nIGhhcyBVVEYtMTYgY29kZSB1bml0cyB0aGF0IGRvIG5vdCBmaXQgaW4gOCBiaXRzIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEhFQVBVOFtwdHIgKyA0ICsgaV0gPSBjaGFyQ29kZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgICAgIEhFQVBVOFtwdHIgKyA0ICsgaV0gPSB2YWx1ZVtpXTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoZGVzdHJ1Y3RvcnMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGRlc3RydWN0b3JzLnB1c2goX2ZyZWUsIHB0cik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBwdHI7CiAgICAgICAgICAgIH0sICJhcmdQYWNrQWR2YW5jZSI6IDgsICJyZWFkVmFsdWVGcm9tUG9pbnRlciI6IHNpbXBsZVJlYWRWYWx1ZUZyb21Qb2ludGVyLCBkZXN0cnVjdG9yRnVuY3Rpb246IGZ1bmN0aW9uKHB0cikgewogICAgICAgICAgICAgIF9mcmVlKHB0cik7CiAgICAgICAgICAgIH0gfSk7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9zdGRfd3N0cmluZyhyYXdUeXBlLCBjaGFyU2l6ZSwgbmFtZSkgewogICAgICAgICAgICBuYW1lID0gcmVhZExhdGluMVN0cmluZyhuYW1lKTsKICAgICAgICAgICAgdmFyIGRlY29kZVN0cmluZywgZW5jb2RlU3RyaW5nLCBnZXRIZWFwLCBsZW5ndGhCeXRlc1VURiwgc2hpZnQ7CiAgICAgICAgICAgIGlmIChjaGFyU2l6ZSA9PT0gMikgewogICAgICAgICAgICAgIGRlY29kZVN0cmluZyA9IFVURjE2VG9TdHJpbmc7CiAgICAgICAgICAgICAgZW5jb2RlU3RyaW5nID0gc3RyaW5nVG9VVEYxNjsKICAgICAgICAgICAgICBsZW5ndGhCeXRlc1VURiA9IGxlbmd0aEJ5dGVzVVRGMTY7CiAgICAgICAgICAgICAgZ2V0SGVhcCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVMTY7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBzaGlmdCA9IDE7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhclNpemUgPT09IDQpIHsKICAgICAgICAgICAgICBkZWNvZGVTdHJpbmcgPSBVVEYzMlRvU3RyaW5nOwogICAgICAgICAgICAgIGVuY29kZVN0cmluZyA9IHN0cmluZ1RvVVRGMzI7CiAgICAgICAgICAgICAgbGVuZ3RoQnl0ZXNVVEYgPSBsZW5ndGhCeXRlc1VURjMyOwogICAgICAgICAgICAgIGdldEhlYXAgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBIRUFQVTMyOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgc2hpZnQgPSAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZ2lzdGVyVHlwZShyYXdUeXBlLCB7IG5hbWUsICJmcm9tV2lyZVR5cGUiOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgIHZhciBsZW5ndGggPSBIRUFQVTMyW3ZhbHVlID4+IDJdOwogICAgICAgICAgICAgIHZhciBIRUFQID0gZ2V0SGVhcCgpOwogICAgICAgICAgICAgIHZhciBzdHI7CiAgICAgICAgICAgICAgdmFyIGRlY29kZVN0YXJ0UHRyID0gdmFsdWUgKyA0OwogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICB2YXIgY3VycmVudEJ5dGVQdHIgPSB2YWx1ZSArIDQgKyBpICogY2hhclNpemU7CiAgICAgICAgICAgICAgICBpZiAoaSA9PSBsZW5ndGggfHwgSEVBUFtjdXJyZW50Qnl0ZVB0ciA+PiBzaGlmdF0gPT0gMCkgewogICAgICAgICAgICAgICAgICB2YXIgbWF4UmVhZEJ5dGVzID0gY3VycmVudEJ5dGVQdHIgLSBkZWNvZGVTdGFydFB0cjsKICAgICAgICAgICAgICAgICAgdmFyIHN0cmluZ1NlZ21lbnQgPSBkZWNvZGVTdHJpbmcoZGVjb2RlU3RhcnRQdHIsIG1heFJlYWRCeXRlcyk7CiAgICAgICAgICAgICAgICAgIGlmIChzdHIgPT09IHZvaWQgMCkgewogICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0cmluZ1NlZ21lbnQ7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7CiAgICAgICAgICAgICAgICAgICAgc3RyICs9IHN0cmluZ1NlZ21lbnQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZGVjb2RlU3RhcnRQdHIgPSBjdXJyZW50Qnl0ZVB0ciArIGNoYXJTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBfZnJlZSh2YWx1ZSk7CiAgICAgICAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgICAgICAgfSwgInRvV2lyZVR5cGUiOiBmdW5jdGlvbihkZXN0cnVjdG9ycywgdmFsdWUpIHsKICAgICAgICAgICAgICBpZiAoISh0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSkgewogICAgICAgICAgICAgICAgdGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBwYXNzIG5vbi1zdHJpbmcgdG8gQysrIHN0cmluZyB0eXBlICIgKyBuYW1lKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGxlbmd0aEJ5dGVzVVRGKHZhbHVlKTsKICAgICAgICAgICAgICB2YXIgcHRyID0gX21hbGxvYyg0ICsgbGVuZ3RoICsgY2hhclNpemUpOwogICAgICAgICAgICAgIEhFQVBVMzJbcHRyID4+IDJdID0gbGVuZ3RoID4+IHNoaWZ0OwogICAgICAgICAgICAgIGVuY29kZVN0cmluZyh2YWx1ZSwgcHRyICsgNCwgbGVuZ3RoICsgY2hhclNpemUpOwogICAgICAgICAgICAgIGlmIChkZXN0cnVjdG9ycyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgZGVzdHJ1Y3RvcnMucHVzaChfZnJlZSwgcHRyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHB0cjsKICAgICAgICAgICAgfSwgImFyZ1BhY2tBZHZhbmNlIjogOCwgInJlYWRWYWx1ZUZyb21Qb2ludGVyIjogc2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIsIGRlc3RydWN0b3JGdW5jdGlvbjogZnVuY3Rpb24ocHRyKSB7CiAgICAgICAgICAgICAgX2ZyZWUocHRyKTsKICAgICAgICAgICAgfSB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX3ZhbHVlX29iamVjdChyYXdUeXBlLCBuYW1lLCBjb25zdHJ1Y3RvclNpZ25hdHVyZSwgcmF3Q29uc3RydWN0b3IsIGRlc3RydWN0b3JTaWduYXR1cmUsIHJhd0Rlc3RydWN0b3IpIHsKICAgICAgICAgICAgc3RydWN0UmVnaXN0cmF0aW9uc1tyYXdUeXBlXSA9IHsgbmFtZTogcmVhZExhdGluMVN0cmluZyhuYW1lKSwgcmF3Q29uc3RydWN0b3I6IGVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGNvbnN0cnVjdG9yU2lnbmF0dXJlLCByYXdDb25zdHJ1Y3RvciksIHJhd0Rlc3RydWN0b3I6IGVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGRlc3RydWN0b3JTaWduYXR1cmUsIHJhd0Rlc3RydWN0b3IpLCBmaWVsZHM6IFtdIH07CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl92YWx1ZV9vYmplY3RfZmllbGQoc3RydWN0VHlwZSwgZmllbGROYW1lLCBnZXR0ZXJSZXR1cm5UeXBlLCBnZXR0ZXJTaWduYXR1cmUsIGdldHRlciwgZ2V0dGVyQ29udGV4dCwgc2V0dGVyQXJndW1lbnRUeXBlLCBzZXR0ZXJTaWduYXR1cmUsIHNldHRlciwgc2V0dGVyQ29udGV4dCkgewogICAgICAgICAgICBzdHJ1Y3RSZWdpc3RyYXRpb25zW3N0cnVjdFR5cGVdLmZpZWxkcy5wdXNoKHsgZmllbGROYW1lOiByZWFkTGF0aW4xU3RyaW5nKGZpZWxkTmFtZSksIGdldHRlclJldHVyblR5cGUsIGdldHRlcjogZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24oZ2V0dGVyU2lnbmF0dXJlLCBnZXR0ZXIpLCBnZXR0ZXJDb250ZXh0LCBzZXR0ZXJBcmd1bWVudFR5cGUsIHNldHRlcjogZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24oc2V0dGVyU2lnbmF0dXJlLCBzZXR0ZXIpLCBzZXR0ZXJDb250ZXh0IH0pOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfdm9pZChyYXdUeXBlLCBuYW1lKSB7CiAgICAgICAgICAgIG5hbWUgPSByZWFkTGF0aW4xU3RyaW5nKG5hbWUpOwogICAgICAgICAgICByZWdpc3RlclR5cGUocmF3VHlwZSwgeyBpc1ZvaWQ6IHRydWUsIG5hbWUsICJhcmdQYWNrQWR2YW5jZSI6IDAsICJmcm9tV2lyZVR5cGUiOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgICAgICB9LCAidG9XaXJlVHlwZSI6IGZ1bmN0aW9uKGRlc3RydWN0b3JzLCBvKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICAgICAgfSB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIHJlcXVpcmVIYW5kbGUoaGFuZGxlKSB7CiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7CiAgICAgICAgICAgICAgdGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCB1c2UgZGVsZXRlZCB2YWwuIGhhbmRsZSA9ICIgKyBoYW5kbGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBlbXZhbF9oYW5kbGVfYXJyYXlbaGFuZGxlXS52YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIF9fZW12YWxfYXMoaGFuZGxlLCByZXR1cm5UeXBlLCBkZXN0cnVjdG9yc1JlZikgewogICAgICAgICAgICBoYW5kbGUgPSByZXF1aXJlSGFuZGxlKGhhbmRsZSk7CiAgICAgICAgICAgIHJldHVyblR5cGUgPSByZXF1aXJlUmVnaXN0ZXJlZFR5cGUocmV0dXJuVHlwZSwgImVtdmFsOjphcyIpOwogICAgICAgICAgICB2YXIgZGVzdHJ1Y3RvcnMgPSBbXTsKICAgICAgICAgICAgdmFyIHJkID0gX19lbXZhbF9yZWdpc3RlcihkZXN0cnVjdG9ycyk7CiAgICAgICAgICAgIEhFQVAzMltkZXN0cnVjdG9yc1JlZiA+PiAyXSA9IHJkOwogICAgICAgICAgICByZXR1cm4gcmV0dXJuVHlwZVsidG9XaXJlVHlwZSJdKGRlc3RydWN0b3JzLCBoYW5kbGUpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGVtdmFsX3N5bWJvbHMgPSB7fTsKICAgICAgICAgIGZ1bmN0aW9uIGdldFN0cmluZ09yU3ltYm9sKGFkZHJlc3MpIHsKICAgICAgICAgICAgdmFyIHN5bWJvbCA9IGVtdmFsX3N5bWJvbHNbYWRkcmVzc107CiAgICAgICAgICAgIGlmIChzeW1ib2wgPT09IHZvaWQgMCkgewogICAgICAgICAgICAgIHJldHVybiByZWFkTGF0aW4xU3RyaW5nKGFkZHJlc3MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybiBzeW1ib2w7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHZhciBlbXZhbF9tZXRob2RDYWxsZXJzID0gW107CiAgICAgICAgICBmdW5jdGlvbiBfX2VtdmFsX2NhbGxfdm9pZF9tZXRob2QoY2FsbGVyLCBoYW5kbGUsIG1ldGhvZE5hbWUsIGFyZ3MpIHsKICAgICAgICAgICAgY2FsbGVyID0gZW12YWxfbWV0aG9kQ2FsbGVyc1tjYWxsZXJdOwogICAgICAgICAgICBoYW5kbGUgPSByZXF1aXJlSGFuZGxlKGhhbmRsZSk7CiAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBnZXRTdHJpbmdPclN5bWJvbChtZXRob2ROYW1lKTsKICAgICAgICAgICAgY2FsbGVyKGhhbmRsZSwgbWV0aG9kTmFtZSwgbnVsbCwgYXJncyk7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBlbXZhbF9nZXRfZ2xvYmFsKCkgewogICAgICAgICAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGdsb2JhbFRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICgvKiBAX19QVVJFX18gKi8gKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbjsKICAgICAgICAgICAgfSkoKSkoInJldHVybiB0aGlzIikoKTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIF9fZW12YWxfZ2V0X2dsb2JhbChuYW1lKSB7CiAgICAgICAgICAgIGlmIChuYW1lID09PSAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoZW12YWxfZ2V0X2dsb2JhbCgpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBuYW1lID0gZ2V0U3RyaW5nT3JTeW1ib2wobmFtZSk7CiAgICAgICAgICAgICAgcmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoZW12YWxfZ2V0X2dsb2JhbCgpW25hbWVdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gX19lbXZhbF9hZGRNZXRob2RDYWxsZXIoY2FsbGVyKSB7CiAgICAgICAgICAgIHZhciBpZCA9IGVtdmFsX21ldGhvZENhbGxlcnMubGVuZ3RoOwogICAgICAgICAgICBlbXZhbF9tZXRob2RDYWxsZXJzLnB1c2goY2FsbGVyKTsKICAgICAgICAgICAgcmV0dXJuIGlkOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gX19lbXZhbF9sb29rdXBUeXBlcyhhcmdDb3VudCwgYXJnVHlwZXMpIHsKICAgICAgICAgICAgdmFyIGEzID0gbmV3IEFycmF5KGFyZ0NvdW50KTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdDb3VudDsgKytpKSB7CiAgICAgICAgICAgICAgYTNbaV0gPSByZXF1aXJlUmVnaXN0ZXJlZFR5cGUoSEVBUDMyWyhhcmdUeXBlcyA+PiAyKSArIGldLCAicGFyYW1ldGVyICIgKyBpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYTM7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBfX2VtdmFsX2dldF9tZXRob2RfY2FsbGVyKGFyZ0NvdW50LCBhcmdUeXBlcykgewogICAgICAgICAgICB2YXIgdHlwZXMgPSBfX2VtdmFsX2xvb2t1cFR5cGVzKGFyZ0NvdW50LCBhcmdUeXBlcyk7CiAgICAgICAgICAgIHZhciByZXRUeXBlID0gdHlwZXNbMF07CiAgICAgICAgICAgIHZhciBzaWduYXR1cmVOYW1lID0gcmV0VHlwZS5uYW1lICsgIl8kIiArIHR5cGVzLnNsaWNlKDEpLm1hcChmdW5jdGlvbih0KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHQubmFtZTsKICAgICAgICAgICAgfSkuam9pbigiXyIpICsgIiQiOwogICAgICAgICAgICB2YXIgcGFyYW1zID0gWyJyZXRUeXBlIl07CiAgICAgICAgICAgIHZhciBhcmdzID0gW3JldFR5cGVdOwogICAgICAgICAgICB2YXIgYXJnc0xpc3QgPSAiIjsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdDb3VudCAtIDE7ICsraSkgewogICAgICAgICAgICAgIGFyZ3NMaXN0ICs9IChpICE9PSAwID8gIiwgIiA6ICIiKSArICJhcmciICsgaTsKICAgICAgICAgICAgICBwYXJhbXMucHVzaCgiYXJnVHlwZSIgKyBpKTsKICAgICAgICAgICAgICBhcmdzLnB1c2godHlwZXNbMSArIGldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZnVuY3Rpb25OYW1lID0gbWFrZUxlZ2FsRnVuY3Rpb25OYW1lKCJtZXRob2RDYWxsZXJfIiArIHNpZ25hdHVyZU5hbWUpOwogICAgICAgICAgICB2YXIgZnVuY3Rpb25Cb2R5ID0gInJldHVybiBmdW5jdGlvbiAiICsgZnVuY3Rpb25OYW1lICsgIihoYW5kbGUsIG5hbWUsIGRlc3RydWN0b3JzLCBhcmdzKSB7XG4iOwogICAgICAgICAgICB2YXIgb2Zmc2V0ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdDb3VudCAtIDE7ICsraSkgewogICAgICAgICAgICAgIGZ1bmN0aW9uQm9keSArPSAiICAgIHZhciBhcmciICsgaSArICIgPSBhcmdUeXBlIiArIGkgKyAiLnJlYWRWYWx1ZUZyb21Qb2ludGVyKGFyZ3MiICsgKG9mZnNldCA/ICIrIiArIG9mZnNldCA6ICIiKSArICIpO1xuIjsKICAgICAgICAgICAgICBvZmZzZXQgKz0gdHlwZXNbaSArIDFdWyJhcmdQYWNrQWR2YW5jZSJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uQm9keSArPSAiICAgIHZhciBydiA9IGhhbmRsZVtuYW1lXSgiICsgYXJnc0xpc3QgKyAiKTtcbiI7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnQ291bnQgLSAxOyArK2kpIHsKICAgICAgICAgICAgICBpZiAodHlwZXNbaSArIDFdWyJkZWxldGVPYmplY3QiXSkgewogICAgICAgICAgICAgICAgZnVuY3Rpb25Cb2R5ICs9ICIgICAgYXJnVHlwZSIgKyBpICsgIi5kZWxldGVPYmplY3QoYXJnIiArIGkgKyAiKTtcbiI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghcmV0VHlwZS5pc1ZvaWQpIHsKICAgICAgICAgICAgICBmdW5jdGlvbkJvZHkgKz0gIiAgICByZXR1cm4gcmV0VHlwZS50b1dpcmVUeXBlKGRlc3RydWN0b3JzLCBydik7XG4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uQm9keSArPSAifTtcbiI7CiAgICAgICAgICAgIHBhcmFtcy5wdXNoKGZ1bmN0aW9uQm9keSk7CiAgICAgICAgICAgIHZhciBpbnZva2VyRnVuY3Rpb24gPSBuZXdfKEZ1bmN0aW9uLCBwYXJhbXMpLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICByZXR1cm4gX19lbXZhbF9hZGRNZXRob2RDYWxsZXIoaW52b2tlckZ1bmN0aW9uKTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIF9fZW12YWxfZ2V0X21vZHVsZV9wcm9wZXJ0eShuYW1lKSB7CiAgICAgICAgICAgIG5hbWUgPSBnZXRTdHJpbmdPclN5bWJvbChuYW1lKTsKICAgICAgICAgICAgcmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoTW9kdWxlW25hbWVdKTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIF9fZW12YWxfZ2V0X3Byb3BlcnR5KGhhbmRsZSwga2V5MikgewogICAgICAgICAgICBoYW5kbGUgPSByZXF1aXJlSGFuZGxlKGhhbmRsZSk7CiAgICAgICAgICAgIGtleTIgPSByZXF1aXJlSGFuZGxlKGtleTIpOwogICAgICAgICAgICByZXR1cm4gX19lbXZhbF9yZWdpc3RlcihoYW5kbGVba2V5Ml0pOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gX19lbXZhbF9pbmNyZWYoaGFuZGxlKSB7CiAgICAgICAgICAgIGlmIChoYW5kbGUgPiA0KSB7CiAgICAgICAgICAgICAgZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV0ucmVmY291bnQgKz0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gY3JhZnRFbXZhbEFsbG9jYXRvcihhcmdDb3VudCkgewogICAgICAgICAgICB2YXIgYXJnc0xpc3QgPSAiIjsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdDb3VudDsgKytpKSB7CiAgICAgICAgICAgICAgYXJnc0xpc3QgKz0gKGkgIT09IDAgPyAiLCAiIDogIiIpICsgImFyZyIgKyBpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBmdW5jdGlvbkJvZHkgPSAicmV0dXJuIGZ1bmN0aW9uIGVtdmFsX2FsbG9jYXRvcl8iICsgYXJnQ291bnQgKyAiKGNvbnN0cnVjdG9yLCBhcmdUeXBlcywgYXJncykge1xuIjsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdDb3VudDsgKytpKSB7CiAgICAgICAgICAgICAgZnVuY3Rpb25Cb2R5ICs9ICJ2YXIgYXJnVHlwZSIgKyBpICsgIiA9IHJlcXVpcmVSZWdpc3RlcmVkVHlwZShNb2R1bGVbJ0hFQVAzMiddWyhhcmdUeXBlcyA+Pj4gMikgKyAiICsgaSArICddLCAicGFyYW1ldGVyICcgKyBpICsgJyIpO1xudmFyIGFyZycgKyBpICsgIiA9IGFyZ1R5cGUiICsgaSArICIucmVhZFZhbHVlRnJvbVBvaW50ZXIoYXJncyk7XG5hcmdzICs9IGFyZ1R5cGUiICsgaSArICJbJ2FyZ1BhY2tBZHZhbmNlJ107XG4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uQm9keSArPSAidmFyIG9iaiA9IG5ldyBjb25zdHJ1Y3RvcigiICsgYXJnc0xpc3QgKyAiKTtcbnJldHVybiBfX2VtdmFsX3JlZ2lzdGVyKG9iaik7XG59XG4iOwogICAgICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCJyZXF1aXJlUmVnaXN0ZXJlZFR5cGUiLCAiTW9kdWxlIiwgIl9fZW12YWxfcmVnaXN0ZXIiLCBmdW5jdGlvbkJvZHkpKHJlcXVpcmVSZWdpc3RlcmVkVHlwZSwgTW9kdWxlLCBfX2VtdmFsX3JlZ2lzdGVyKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBlbXZhbF9uZXdlcnMgPSB7fTsKICAgICAgICAgIGZ1bmN0aW9uIF9fZW12YWxfbmV3KGhhbmRsZSwgYXJnQ291bnQsIGFyZ1R5cGVzLCBhcmdzKSB7CiAgICAgICAgICAgIGhhbmRsZSA9IHJlcXVpcmVIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgICAgdmFyIG5ld2VyID0gZW12YWxfbmV3ZXJzW2FyZ0NvdW50XTsKICAgICAgICAgICAgaWYgKCFuZXdlcikgewogICAgICAgICAgICAgIG5ld2VyID0gY3JhZnRFbXZhbEFsbG9jYXRvcihhcmdDb3VudCk7CiAgICAgICAgICAgICAgZW12YWxfbmV3ZXJzW2FyZ0NvdW50XSA9IG5ld2VyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXdlcihoYW5kbGUsIGFyZ1R5cGVzLCBhcmdzKTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIF9fZW12YWxfbmV3X2NzdHJpbmcodjMpIHsKICAgICAgICAgICAgcmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoZ2V0U3RyaW5nT3JTeW1ib2wodjMpKTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIF9fZW12YWxfcnVuX2Rlc3RydWN0b3JzKGhhbmRsZSkgewogICAgICAgICAgICB2YXIgZGVzdHJ1Y3RvcnMgPSBlbXZhbF9oYW5kbGVfYXJyYXlbaGFuZGxlXS52YWx1ZTsKICAgICAgICAgICAgcnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpOwogICAgICAgICAgICBfX2VtdmFsX2RlY3JlZihoYW5kbGUpOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gX2Fib3J0KCkgewogICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyhkZXN0LCBzcmMsIG51bSkgewogICAgICAgICAgICBIRUFQVTguY29weVdpdGhpbihkZXN0LCBzcmMsIHNyYyArIG51bSk7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKHNpemUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICB3YXNtTWVtb3J5Lmdyb3coc2l6ZSAtIGJ1ZmZlci5ieXRlTGVuZ3RoICsgNjU1MzUgPj4+IDE2KTsKICAgICAgICAgICAgICB1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAocmVxdWVzdGVkU2l6ZSkgewogICAgICAgICAgICB2YXIgb2xkU2l6ZSA9IEhFQVBVOC5sZW5ndGg7CiAgICAgICAgICAgIHJlcXVlc3RlZFNpemUgPSByZXF1ZXN0ZWRTaXplID4+PiAwOwogICAgICAgICAgICB2YXIgbWF4SGVhcFNpemUgPSAyMTQ3NDgzNjQ4OwogICAgICAgICAgICBpZiAocmVxdWVzdGVkU2l6ZSA+IG1heEhlYXBTaXplKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGN1dERvd24gPSAxOyBjdXREb3duIDw9IDQ7IGN1dERvd24gKj0gMikgewogICAgICAgICAgICAgIHZhciBvdmVyR3Jvd25IZWFwU2l6ZSA9IG9sZFNpemUgKiAoMSArIDAuMiAvIGN1dERvd24pOwogICAgICAgICAgICAgIG92ZXJHcm93bkhlYXBTaXplID0gTWF0aC5taW4ob3Zlckdyb3duSGVhcFNpemUsIHJlcXVlc3RlZFNpemUgKyAxMDA2NjMyOTYpOwogICAgICAgICAgICAgIHZhciBuZXdTaXplID0gTWF0aC5taW4obWF4SGVhcFNpemUsIGFsaWduVXAoTWF0aC5tYXgocmVxdWVzdGVkU2l6ZSwgb3Zlckdyb3duSGVhcFNpemUpLCA2NTUzNikpOwogICAgICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IGVtc2NyaXB0ZW5fcmVhbGxvY19idWZmZXIobmV3U2l6ZSk7CiAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgdmFyIFNZU0NBTExTID0geyBtYXBwaW5nczoge30sIGJ1ZmZlcnM6IFtudWxsLCBbXSwgW11dLCBwcmludENoYXI6IGZ1bmN0aW9uKHN0cmVhbSwgY3VycikgewogICAgICAgICAgICB2YXIgYnVmZmVyMiA9IFNZU0NBTExTLmJ1ZmZlcnNbc3RyZWFtXTsKICAgICAgICAgICAgaWYgKGN1cnIgPT09IDAgfHwgY3VyciA9PT0gMTApIHsKICAgICAgICAgICAgICAoc3RyZWFtID09PSAxID8gb3V0IDogZXJyKShVVEY4QXJyYXlUb1N0cmluZyhidWZmZXIyLCAwKSk7CiAgICAgICAgICAgICAgYnVmZmVyMi5sZW5ndGggPSAwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGJ1ZmZlcjIucHVzaChjdXJyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgdmFyYXJnczogdm9pZCAwLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBTWVNDQUxMUy52YXJhcmdzICs9IDQ7CiAgICAgICAgICAgIHZhciByZXQgPSBIRUFQMzJbU1lTQ0FMTFMudmFyYXJncyAtIDQgPj4gMl07CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICB9LCBnZXRTdHI6IGZ1bmN0aW9uKHB0cikgewogICAgICAgICAgICB2YXIgcmV0ID0gVVRGOFRvU3RyaW5nKHB0cik7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICB9LCBnZXQ2NDogZnVuY3Rpb24obG93LCBoaWdoKSB7CiAgICAgICAgICAgIHJldHVybiBsb3c7CiAgICAgICAgICB9IH07CiAgICAgICAgICBmdW5jdGlvbiBfZmRfY2xvc2UoZmQpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBfZmRfc2VlayhmZCwgb2Zmc2V0X2xvdywgb2Zmc2V0X2hpZ2gsIHdoZW5jZSwgbmV3T2Zmc2V0KSB7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBfZmRfd3JpdGUoZmQsIGlvdiwgaW92Y250LCBwbnVtKSB7CiAgICAgICAgICAgIHZhciBudW0gPSAwOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlvdmNudDsgaSsrKSB7CiAgICAgICAgICAgICAgdmFyIHB0ciA9IEhFQVAzMltpb3YgKyBpICogOCA+PiAyXTsKICAgICAgICAgICAgICB2YXIgbGVuID0gSEVBUDMyW2lvdiArIChpICogOCArIDQpID4+IDJdOwogICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICAgICAgICAgIFNZU0NBTExTLnByaW50Q2hhcihmZCwgSEVBUFU4W3B0ciArIGpdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbnVtICs9IGxlbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBIRUFQMzJbcG51bSA+PiAyXSA9IG51bTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBfc2V0VGVtcFJldDAoJGkpIHsKICAgICAgICAgICAgc2V0VGVtcFJldDAoJGkgfCAwKTsKICAgICAgICAgIH0KICAgICAgICAgIEludGVybmFsRXJyb3IgPSBNb2R1bGVbIkludGVybmFsRXJyb3IiXSA9IGV4dGVuZEVycm9yKEVycm9yLCAiSW50ZXJuYWxFcnJvciIpOwogICAgICAgICAgZW1iaW5kX2luaXRfY2hhckNvZGVzKCk7CiAgICAgICAgICBCaW5kaW5nRXJyb3IgPSBNb2R1bGVbIkJpbmRpbmdFcnJvciJdID0gZXh0ZW5kRXJyb3IoRXJyb3IsICJCaW5kaW5nRXJyb3IiKTsKICAgICAgICAgIGluaXRfQ2xhc3NIYW5kbGUoKTsKICAgICAgICAgIGluaXRfUmVnaXN0ZXJlZFBvaW50ZXIoKTsKICAgICAgICAgIGluaXRfZW1iaW5kKCk7CiAgICAgICAgICBVbmJvdW5kVHlwZUVycm9yID0gTW9kdWxlWyJVbmJvdW5kVHlwZUVycm9yIl0gPSBleHRlbmRFcnJvcihFcnJvciwgIlVuYm91bmRUeXBlRXJyb3IiKTsKICAgICAgICAgIGluaXRfZW12YWwoKTsKICAgICAgICAgIHZhciBhc21MaWJyYXJ5QXJnID0geyAidCI6IF9fZW1iaW5kX2ZpbmFsaXplX3ZhbHVlX29iamVjdCwgIkkiOiBfX2VtYmluZF9yZWdpc3Rlcl9ib29sLCAieCI6IF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzLCAidyI6IF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yLCAiZCI6IF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2Z1bmN0aW9uLCAiayI6IF9fZW1iaW5kX3JlZ2lzdGVyX2NvbnN0YW50LCAiSCI6IF9fZW1iaW5kX3JlZ2lzdGVyX2VtdmFsLCAibiI6IF9fZW1iaW5kX3JlZ2lzdGVyX2VudW0sICJhIjogX19lbWJpbmRfcmVnaXN0ZXJfZW51bV92YWx1ZSwgIkEiOiBfX2VtYmluZF9yZWdpc3Rlcl9mbG9hdCwgImkiOiBfX2VtYmluZF9yZWdpc3Rlcl9mdW5jdGlvbiwgImoiOiBfX2VtYmluZF9yZWdpc3Rlcl9pbnRlZ2VyLCAiaCI6IF9fZW1iaW5kX3JlZ2lzdGVyX21lbW9yeV92aWV3LCAiQiI6IF9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF9zdHJpbmcsICJ2IjogX19lbWJpbmRfcmVnaXN0ZXJfc3RkX3dzdHJpbmcsICJ1IjogX19lbWJpbmRfcmVnaXN0ZXJfdmFsdWVfb2JqZWN0LCAiYyI6IF9fZW1iaW5kX3JlZ2lzdGVyX3ZhbHVlX29iamVjdF9maWVsZCwgIkoiOiBfX2VtYmluZF9yZWdpc3Rlcl92b2lkLCAibSI6IF9fZW12YWxfYXMsICJzIjogX19lbXZhbF9jYWxsX3ZvaWRfbWV0aG9kLCAiYiI6IF9fZW12YWxfZGVjcmVmLCAieSI6IF9fZW12YWxfZ2V0X2dsb2JhbCwgInAiOiBfX2VtdmFsX2dldF9tZXRob2RfY2FsbGVyLCAiciI6IF9fZW12YWxfZ2V0X21vZHVsZV9wcm9wZXJ0eSwgImUiOiBfX2VtdmFsX2dldF9wcm9wZXJ0eSwgImciOiBfX2VtdmFsX2luY3JlZiwgInEiOiBfX2VtdmFsX25ldywgImYiOiBfX2VtdmFsX25ld19jc3RyaW5nLCAibCI6IF9fZW12YWxfcnVuX2Rlc3RydWN0b3JzLCAibyI6IF9hYm9ydCwgIkUiOiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnLCAiRiI6IF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwLCAiRyI6IF9mZF9jbG9zZSwgIkMiOiBfZmRfc2VlaywgInoiOiBfZmRfd3JpdGUsICJEIjogX3NldFRlbXBSZXQwIH07CiAgICAgICAgICB2YXIgYXNtID0gY3JlYXRlV2FzbSgpOwogICAgICAgICAgdmFyIF9fX3dhc21fY2FsbF9jdG9ycyA9IE1vZHVsZVsiX19fd2FzbV9jYWxsX2N0b3JzIl0gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChfX193YXNtX2NhbGxfY3RvcnMgPSBNb2R1bGVbIl9fX3dhc21fY2FsbF9jdG9ycyJdID0gTW9kdWxlWyJhc20iXVsiTCJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfTsKICAgICAgICAgIHZhciBfbWFsbG9jID0gTW9kdWxlWyJfbWFsbG9jIl0gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChfbWFsbG9jID0gTW9kdWxlWyJfbWFsbG9jIl0gPSBNb2R1bGVbImFzbSJdWyJNIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9OwogICAgICAgICAgdmFyIF9mcmVlID0gTW9kdWxlWyJfZnJlZSJdID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoX2ZyZWUgPSBNb2R1bGVbIl9mcmVlIl0gPSBNb2R1bGVbImFzbSJdWyJOIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9OwogICAgICAgICAgdmFyIF9fX2dldFR5cGVOYW1lID0gTW9kdWxlWyJfX19nZXRUeXBlTmFtZSJdID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoX19fZ2V0VHlwZU5hbWUgPSBNb2R1bGVbIl9fX2dldFR5cGVOYW1lIl0gPSBNb2R1bGVbImFzbSJdWyJQIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9OwogICAgICAgICAgdmFyIF9fX2VtYmluZF9yZWdpc3Rlcl9uYXRpdmVfYW5kX2J1aWx0aW5fdHlwZXMgPSBNb2R1bGVbIl9fX2VtYmluZF9yZWdpc3Rlcl9uYXRpdmVfYW5kX2J1aWx0aW5fdHlwZXMiXSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKF9fX2VtYmluZF9yZWdpc3Rlcl9uYXRpdmVfYW5kX2J1aWx0aW5fdHlwZXMgPSBNb2R1bGVbIl9fX2VtYmluZF9yZWdpc3Rlcl9uYXRpdmVfYW5kX2J1aWx0aW5fdHlwZXMiXSA9IE1vZHVsZVsiYXNtIl1bIlEiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgIH07CiAgICAgICAgICB2YXIgZHluQ2FsbF9qaWppID0gTW9kdWxlWyJkeW5DYWxsX2ppamkiXSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKGR5bkNhbGxfamlqaSA9IE1vZHVsZVsiZHluQ2FsbF9qaWppIl0gPSBNb2R1bGVbImFzbSJdWyJSIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9OwogICAgICAgICAgdmFyIGNhbGxlZFJ1bjsKICAgICAgICAgIGZ1bmN0aW9uIEV4aXRTdGF0dXMoc3RhdHVzKSB7CiAgICAgICAgICAgIHRoaXMubmFtZSA9ICJFeGl0U3RhdHVzIjsKICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gIlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoIiArIHN0YXR1cyArICIpIjsKICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CiAgICAgICAgICB9CiAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBmdW5jdGlvbiBydW5DYWxsZXIoKSB7CiAgICAgICAgICAgIGlmICghY2FsbGVkUnVuKSBydW4oKTsKICAgICAgICAgICAgaWYgKCFjYWxsZWRSdW4pIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IHJ1bkNhbGxlcjsKICAgICAgICAgIH07CiAgICAgICAgICBmdW5jdGlvbiBydW4oYXJncykgewogICAgICAgICAgICBhcmdzID0gYXJncyB8fCBhcmd1bWVudHNfOwogICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmVSdW4oKTsKICAgICAgICAgICAgaWYgKHJ1bkRlcGVuZGVuY2llcyA+IDApIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZG9SdW4oKSB7CiAgICAgICAgICAgICAgaWYgKGNhbGxlZFJ1bikgcmV0dXJuOwogICAgICAgICAgICAgIGNhbGxlZFJ1biA9IHRydWU7CiAgICAgICAgICAgICAgTW9kdWxlWyJjYWxsZWRSdW4iXSA9IHRydWU7CiAgICAgICAgICAgICAgaWYgKEFCT1JUKSByZXR1cm47CiAgICAgICAgICAgICAgaW5pdFJ1bnRpbWUoKTsKICAgICAgICAgICAgICBwcmVNYWluKCk7CiAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZShNb2R1bGUpOwogICAgICAgICAgICAgIGlmIChNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0pIE1vZHVsZVsib25SdW50aW1lSW5pdGlhbGl6ZWQiXSgpOwogICAgICAgICAgICAgIHBvc3RSdW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoTW9kdWxlWyJzZXRTdGF0dXMiXSkgewogICAgICAgICAgICAgIE1vZHVsZVsic2V0U3RhdHVzIl0oIlJ1bm5pbmcuLi4iKTsKICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgTW9kdWxlWyJzZXRTdGF0dXMiXSgiIik7CiAgICAgICAgICAgICAgICB9LCAxKTsKICAgICAgICAgICAgICAgIGRvUnVuKCk7CiAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZG9SdW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgTW9kdWxlWyJydW4iXSA9IHJ1bjsKICAgICAgICAgIGlmIChNb2R1bGVbInByZUluaXQiXSkgewogICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlSW5pdCJdID09ICJmdW5jdGlvbiIpIE1vZHVsZVsicHJlSW5pdCJdID0gW01vZHVsZVsicHJlSW5pdCJdXTsKICAgICAgICAgICAgd2hpbGUgKE1vZHVsZVsicHJlSW5pdCJdLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICBNb2R1bGVbInByZUluaXQiXS5wb3AoKSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBydW4oKTsKICAgICAgICAgIHJldHVybiBCQVNJUzIucmVhZHk7CiAgICAgICAgfSk7CiAgICAgIH0pKCk7CiAgICAgIGlmICh0eXBlb2YgZXhwb3J0czIgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT09ICJvYmplY3QiKQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gQkFTSVM7CiAgICAgIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lWyJhbWQiXSkKICAgICAgICBkZWZpbmUoW10sIGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIEJBU0lTOwogICAgICAgIH0pOwogICAgICBlbHNlIGlmICh0eXBlb2YgZXhwb3J0czIgPT09ICJvYmplY3QiKQogICAgICAgIGV4cG9ydHMyWyJCQVNJUyJdID0gQkFTSVM7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy90cmFuc2NvZGVLVFgyLmpzCiAgdmFyIHRyYW5zY29kZUtUWDJfZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KHRyYW5zY29kZUtUWDJfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gdHJhbnNjb2RlS1RYMl9kZWZhdWx0CiAgfSk7CiAgZnVuY3Rpb24gdHJhbnNjb2RlKHBhcmFtZXRlcnMsIHRyYW5zZmVyYWJsZU9iamVjdHMpIHsKICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgidHJhbnNjb2Rlck1vZHVsZSIsIHRyYW5zY29kZXJNb2R1bGUpOwogICAgY29uc3QgZGF0YSA9IHBhcmFtZXRlcnMua3R4MkJ1ZmZlcjsKICAgIGNvbnN0IHN1cHBvcnRlZFRhcmdldEZvcm1hdHMgPSBwYXJhbWV0ZXJzLnN1cHBvcnRlZFRhcmdldEZvcm1hdHM7CiAgICBsZXQgaGVhZGVyOwogICAgdHJ5IHsKICAgICAgaGVhZGVyID0gcmVhZDIoZGF0YSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3JfZGVmYXVsdCgiSW52YWxpZCBLVFgyIGZpbGUuIik7CiAgICB9CiAgICBpZiAoaGVhZGVyLmxheWVyQ291bnQgIT09IDApIHsKICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcl9kZWZhdWx0KCJLVFgyIHRleHR1cmUgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkLiIpOwogICAgfQogICAgaWYgKGhlYWRlci5waXhlbERlcHRoICE9PSAwKSB7CiAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3JfZGVmYXVsdCgiS1RYMiAzRCB0ZXh0dXJlcyBhcmUgdW5zdXBwb3J0ZWQuIik7CiAgICB9CiAgICBjb25zdCBkZmQgPSBoZWFkZXIuZGF0YUZvcm1hdERlc2NyaXB0b3JbMF07CiAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkoaGVhZGVyLmxldmVsQ291bnQpOwogICAgaWYgKGhlYWRlci52a0Zvcm1hdCA9PT0gMCAmJiAoZGZkLmNvbG9yTW9kZWwgPT09IGNvbG9yTW9kZWxFVEMxUyB8fCBkZmQuY29sb3JNb2RlbCA9PT0gY29sb3JNb2RlbFVBU1RDKSkgewogICAgICB0cmFuc2NvZGVDb21wcmVzc2VkKAogICAgICAgIGRhdGEsCiAgICAgICAgaGVhZGVyLAogICAgICAgIHN1cHBvcnRlZFRhcmdldEZvcm1hdHMsCiAgICAgICAgdHJhbnNjb2Rlck1vZHVsZSwKICAgICAgICB0cmFuc2ZlcmFibGVPYmplY3RzLAogICAgICAgIHJlc3VsdAogICAgICApOwogICAgfSBlbHNlIHsKICAgICAgdHJhbnNmZXJhYmxlT2JqZWN0cy5wdXNoKGRhdGEuYnVmZmVyKTsKICAgICAgcGFyc2VVbmNvbXByZXNzZWQoaGVhZGVyLCByZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgZnVuY3Rpb24gcGFyc2VVbmNvbXByZXNzZWQoaGVhZGVyLCByZXN1bHQpIHsKICAgIGNvbnN0IGludGVybmFsRm9ybWF0ID0gaGVhZGVyLnZrRm9ybWF0ID09PSBWdWxrYW5Db25zdGFudHNfZGVmYXVsdC5WS19GT1JNQVRfUjhHOEI4X1NSR0IgPyBQaXhlbEZvcm1hdF9kZWZhdWx0LlJHQiA6IFBpeGVsRm9ybWF0X2RlZmF1bHQuUkdCQTsKICAgIGxldCBkYXRhdHlwZTsKICAgIGlmIChoZWFkZXIudmtGb3JtYXQgPT09IFZ1bGthbkNvbnN0YW50c19kZWZhdWx0LlZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSkgewogICAgICBkYXRhdHlwZSA9IFBpeGVsRGF0YXR5cGVfZGVmYXVsdC5VTlNJR05FRF9CWVRFOwogICAgfSBlbHNlIGlmIChoZWFkZXIudmtGb3JtYXQgPT09IFZ1bGthbkNvbnN0YW50c19kZWZhdWx0LlZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU0ZMT0FUKSB7CiAgICAgIGRhdGF0eXBlID0gUGl4ZWxEYXRhdHlwZV9kZWZhdWx0LkhBTEZfRkxPQVQ7CiAgICB9IGVsc2UgaWYgKGhlYWRlci52a0Zvcm1hdCA9PT0gVnVsa2FuQ29uc3RhbnRzX2RlZmF1bHQuVktfRk9STUFUX1IzMkczMkIzMkEzMl9TRkxPQVQpIHsKICAgICAgZGF0YXR5cGUgPSBQaXhlbERhdGF0eXBlX2RlZmF1bHQuRkxPQVQ7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlci5sZXZlbHMubGVuZ3RoOyArK2kpIHsKICAgICAgY29uc3QgbGV2ZWwgPSB7fTsKICAgICAgcmVzdWx0W2ldID0gbGV2ZWw7CiAgICAgIGNvbnN0IGxldmVsQnVmZmVyID0gaGVhZGVyLmxldmVsc1tpXS5sZXZlbERhdGE7CiAgICAgIGNvbnN0IHdpZHRoID0gaGVhZGVyLnBpeGVsV2lkdGggPj4gaTsKICAgICAgY29uc3QgaGVpZ2h0ID0gaGVhZGVyLnBpeGVsSGVpZ2h0ID4+IGk7CiAgICAgIGNvbnN0IGZhY2VMZW5ndGggPSB3aWR0aCAqIGhlaWdodCAqIFBpeGVsRm9ybWF0X2RlZmF1bHQuY29tcG9uZW50c0xlbmd0aChpbnRlcm5hbEZvcm1hdCk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaGVhZGVyLmZhY2VDb3VudDsgKytqKSB7CiAgICAgICAgY29uc3QgZmFjZUJ5dGVPZmZzZXQgPSBsZXZlbEJ1ZmZlci5ieXRlT2Zmc2V0ICsgZmFjZUxlbmd0aCAqIGhlYWRlci50eXBlU2l6ZSAqIGo7CiAgICAgICAgbGV0IGZhY2VWaWV3OwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGRhdGF0eXBlKSB8fCBQaXhlbERhdGF0eXBlX2RlZmF1bHQuc2l6ZUluQnl0ZXMoZGF0YXR5cGUpID09PSAxKSB7CiAgICAgICAgICBmYWNlVmlldyA9IG5ldyBVaW50OEFycmF5KAogICAgICAgICAgICBsZXZlbEJ1ZmZlci5idWZmZXIsCiAgICAgICAgICAgIGZhY2VCeXRlT2Zmc2V0LAogICAgICAgICAgICBmYWNlTGVuZ3RoCiAgICAgICAgICApOwogICAgICAgIH0gZWxzZSBpZiAoUGl4ZWxEYXRhdHlwZV9kZWZhdWx0LnNpemVJbkJ5dGVzKGRhdGF0eXBlKSA9PT0gMikgewogICAgICAgICAgZmFjZVZpZXcgPSBuZXcgVWludDE2QXJyYXkoCiAgICAgICAgICAgIGxldmVsQnVmZmVyLmJ1ZmZlciwKICAgICAgICAgICAgZmFjZUJ5dGVPZmZzZXQsCiAgICAgICAgICAgIGZhY2VMZW5ndGgKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZhY2VWaWV3ID0gbmV3IEZsb2F0MzJBcnJheSgKICAgICAgICAgICAgbGV2ZWxCdWZmZXIuYnVmZmVyLAogICAgICAgICAgICBmYWNlQnl0ZU9mZnNldCwKICAgICAgICAgICAgZmFjZUxlbmd0aAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbGV2ZWxbZmFjZU9yZGVyW2pdXSA9IHsKICAgICAgICAgIGludGVybmFsRm9ybWF0LAogICAgICAgICAgZGF0YXR5cGUsCiAgICAgICAgICB3aWR0aCwKICAgICAgICAgIGhlaWdodCwKICAgICAgICAgIGxldmVsQnVmZmVyOiBmYWNlVmlldwogICAgICAgIH07CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gdHJhbnNjb2RlQ29tcHJlc3NlZChkYXRhLCBoZWFkZXIsIHN1cHBvcnRlZFRhcmdldEZvcm1hdHMsIHRyYW5zY29kZXJNb2R1bGUyLCB0cmFuc2ZlcmFibGVPYmplY3RzLCByZXN1bHQpIHsKICAgIGNvbnN0IGt0eDJGaWxlID0gbmV3IHRyYW5zY29kZXJNb2R1bGUyLktUWDJGaWxlKGRhdGEpOwogICAgbGV0IHdpZHRoID0ga3R4MkZpbGUuZ2V0V2lkdGgoKTsKICAgIGxldCBoZWlnaHQgPSBrdHgyRmlsZS5nZXRIZWlnaHQoKTsKICAgIGNvbnN0IGxldmVscyA9IGt0eDJGaWxlLmdldExldmVscygpOwogICAgY29uc3QgaGFzQWxwaGEgPSBrdHgyRmlsZS5nZXRIYXNBbHBoYSgpOwogICAgaWYgKCEod2lkdGggPiAwKSB8fCAhKGhlaWdodCA+IDApIHx8ICEobGV2ZWxzID4gMCkpIHsKICAgICAga3R4MkZpbGUuY2xvc2UoKTsKICAgICAga3R4MkZpbGUuZGVsZXRlKCk7CiAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3JfZGVmYXVsdCgiSW52YWxpZCBLVFgyIGZpbGUiKTsKICAgIH0KICAgIGxldCBpbnRlcm5hbEZvcm1hdCwgdHJhbnNjb2RlckZvcm1hdDsKICAgIGNvbnN0IGRmZCA9IGhlYWRlci5kYXRhRm9ybWF0RGVzY3JpcHRvclswXTsKICAgIGNvbnN0IEJhc2lzRm9ybWF0ID0gdHJhbnNjb2Rlck1vZHVsZTIudHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDsKICAgIGlmIChkZmQuY29sb3JNb2RlbCA9PT0gY29sb3JNb2RlbEVUQzFTKSB7CiAgICAgIGlmIChzdXBwb3J0ZWRUYXJnZXRGb3JtYXRzLmV0YykgewogICAgICAgIGludGVybmFsRm9ybWF0ID0gaGFzQWxwaGEgPyBQaXhlbEZvcm1hdF9kZWZhdWx0LlJHQkE4X0VUQzJfRUFDIDogUGl4ZWxGb3JtYXRfZGVmYXVsdC5SR0I4X0VUQzI7CiAgICAgICAgdHJhbnNjb2RlckZvcm1hdCA9IGhhc0FscGhhID8gQmFzaXNGb3JtYXQuY1RGRVRDMl9SR0JBIDogQmFzaXNGb3JtYXQuY1RGRVRDMV9SR0I7CiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydGVkVGFyZ2V0Rm9ybWF0cy5ldGMxICYmICFoYXNBbHBoYSkgewogICAgICAgIGludGVybmFsRm9ybWF0ID0gUGl4ZWxGb3JtYXRfZGVmYXVsdC5SR0JfRVRDMTsKICAgICAgICB0cmFuc2NvZGVyRm9ybWF0ID0gQmFzaXNGb3JtYXQuY1RGRVRDMV9SR0I7CiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydGVkVGFyZ2V0Rm9ybWF0cy5zM3RjKSB7CiAgICAgICAgaW50ZXJuYWxGb3JtYXQgPSBoYXNBbHBoYSA/IFBpeGVsRm9ybWF0X2RlZmF1bHQuUkdCQV9EWFQ1IDogUGl4ZWxGb3JtYXRfZGVmYXVsdC5SR0JfRFhUMTsKICAgICAgICB0cmFuc2NvZGVyRm9ybWF0ID0gaGFzQWxwaGEgPyBCYXNpc0Zvcm1hdC5jVEZCQzNfUkdCQSA6IEJhc2lzRm9ybWF0LmNURkJDMV9SR0I7CiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydGVkVGFyZ2V0Rm9ybWF0cy5wdnJ0YykgewogICAgICAgIGludGVybmFsRm9ybWF0ID0gaGFzQWxwaGEgPyBQaXhlbEZvcm1hdF9kZWZhdWx0LlJHQkFfUFZSVENfNEJQUFYxIDogUGl4ZWxGb3JtYXRfZGVmYXVsdC5SR0JfUFZSVENfNEJQUFYxOwogICAgICAgIHRyYW5zY29kZXJGb3JtYXQgPSBoYXNBbHBoYSA/IEJhc2lzRm9ybWF0LmNURlBWUlRDMV80X1JHQkEgOiBCYXNpc0Zvcm1hdC5jVEZQVlJUQzFfNF9SR0I7CiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydGVkVGFyZ2V0Rm9ybWF0cy5hc3RjKSB7CiAgICAgICAgaW50ZXJuYWxGb3JtYXQgPSBQaXhlbEZvcm1hdF9kZWZhdWx0LlJHQkFfQVNUQzsKICAgICAgICB0cmFuc2NvZGVyRm9ybWF0ID0gQmFzaXNGb3JtYXQuY1RGQVNUQ180eDRfUkdCQTsKICAgICAgfSBlbHNlIGlmIChzdXBwb3J0ZWRUYXJnZXRGb3JtYXRzLmJjNykgewogICAgICAgIGludGVybmFsRm9ybWF0ID0gUGl4ZWxGb3JtYXRfZGVmYXVsdC5SR0JBX0JDNzsKICAgICAgICB0cmFuc2NvZGVyRm9ybWF0ID0gQmFzaXNGb3JtYXQuY1RGQkM3X1JHQkE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcl9kZWZhdWx0KAogICAgICAgICAgIk5vIHRyYW5zY29kaW5nIGZvcm1hdCB0YXJnZXQgYXZhaWxhYmxlIGZvciBFVEMxUyBjb21wcmVzc2VkIGt0eDIuIgogICAgICAgICk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZGZkLmNvbG9yTW9kZWwgPT09IGNvbG9yTW9kZWxVQVNUQykgewogICAgICBpZiAoc3VwcG9ydGVkVGFyZ2V0Rm9ybWF0cy5hc3RjKSB7CiAgICAgICAgaW50ZXJuYWxGb3JtYXQgPSBQaXhlbEZvcm1hdF9kZWZhdWx0LlJHQkFfQVNUQzsKICAgICAgICB0cmFuc2NvZGVyRm9ybWF0ID0gQmFzaXNGb3JtYXQuY1RGQVNUQ180eDRfUkdCQTsKICAgICAgfSBlbHNlIGlmIChzdXBwb3J0ZWRUYXJnZXRGb3JtYXRzLmJjNykgewogICAgICAgIGludGVybmFsRm9ybWF0ID0gUGl4ZWxGb3JtYXRfZGVmYXVsdC5SR0JBX0JDNzsKICAgICAgICB0cmFuc2NvZGVyRm9ybWF0ID0gQmFzaXNGb3JtYXQuY1RGQkM3X1JHQkE7CiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydGVkVGFyZ2V0Rm9ybWF0cy5zM3RjKSB7CiAgICAgICAgaW50ZXJuYWxGb3JtYXQgPSBoYXNBbHBoYSA/IFBpeGVsRm9ybWF0X2RlZmF1bHQuUkdCQV9EWFQ1IDogUGl4ZWxGb3JtYXRfZGVmYXVsdC5SR0JfRFhUMTsKICAgICAgICB0cmFuc2NvZGVyRm9ybWF0ID0gaGFzQWxwaGEgPyBCYXNpc0Zvcm1hdC5jVEZCQzNfUkdCQSA6IEJhc2lzRm9ybWF0LmNURkJDMV9SR0I7CiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydGVkVGFyZ2V0Rm9ybWF0cy5ldGMpIHsKICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IGhhc0FscGhhID8gUGl4ZWxGb3JtYXRfZGVmYXVsdC5SR0JBOF9FVEMyX0VBQyA6IFBpeGVsRm9ybWF0X2RlZmF1bHQuUkdCOF9FVEMyOwogICAgICAgIHRyYW5zY29kZXJGb3JtYXQgPSBoYXNBbHBoYSA/IEJhc2lzRm9ybWF0LmNURkVUQzJfUkdCQSA6IEJhc2lzRm9ybWF0LmNURkVUQzFfUkdCOwogICAgICB9IGVsc2UgaWYgKHN1cHBvcnRlZFRhcmdldEZvcm1hdHMuZXRjMSAmJiAhaGFzQWxwaGEpIHsKICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IFBpeGVsRm9ybWF0X2RlZmF1bHQuUkdCX0VUQzE7CiAgICAgICAgdHJhbnNjb2RlckZvcm1hdCA9IEJhc2lzRm9ybWF0LmNURkVUQzFfUkdCOwogICAgICB9IGVsc2UgaWYgKHN1cHBvcnRlZFRhcmdldEZvcm1hdHMucHZydGMpIHsKICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IGhhc0FscGhhID8gUGl4ZWxGb3JtYXRfZGVmYXVsdC5SR0JBX1BWUlRDXzRCUFBWMSA6IFBpeGVsRm9ybWF0X2RlZmF1bHQuUkdCX1BWUlRDXzRCUFBWMTsKICAgICAgICB0cmFuc2NvZGVyRm9ybWF0ID0gaGFzQWxwaGEgPyBCYXNpc0Zvcm1hdC5jVEZQVlJUQzFfNF9SR0JBIDogQmFzaXNGb3JtYXQuY1RGUFZSVEMxXzRfUkdCOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICJObyB0cmFuc2NvZGluZyBmb3JtYXQgdGFyZ2V0IGF2YWlsYWJsZSBmb3IgVUFTVEMgY29tcHJlc3NlZCBrdHgyLiIKICAgICAgICApOwogICAgICB9CiAgICB9CiAgICBpZiAoIWt0eDJGaWxlLnN0YXJ0VHJhbnNjb2RpbmcoKSkgewogICAgICBrdHgyRmlsZS5jbG9zZSgpOwogICAgICBrdHgyRmlsZS5kZWxldGUoKTsKICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcl9kZWZhdWx0KCJzdGFydFRyYW5zY29kaW5nKCkgZmFpbGVkIik7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlci5sZXZlbHMubGVuZ3RoOyArK2kpIHsKICAgICAgY29uc3QgbGV2ZWwgPSB7fTsKICAgICAgcmVzdWx0W2ldID0gbGV2ZWw7CiAgICAgIHdpZHRoID0gaGVhZGVyLnBpeGVsV2lkdGggPj4gaTsKICAgICAgaGVpZ2h0ID0gaGVhZGVyLnBpeGVsSGVpZ2h0ID4+IGk7CiAgICAgIGNvbnN0IGRzdFNpemUgPSBrdHgyRmlsZS5nZXRJbWFnZVRyYW5zY29kZWRTaXplSW5CeXRlcygKICAgICAgICBpLAogICAgICAgIC8vIGxldmVsIGluZGV4CiAgICAgICAgMCwKICAgICAgICAvLyBsYXllciBpbmRleAogICAgICAgIDAsCiAgICAgICAgLy8gZmFjZSBpbmRleAogICAgICAgIHRyYW5zY29kZXJGb3JtYXQudmFsdWUKICAgICAgKTsKICAgICAgY29uc3QgZHN0ID0gbmV3IFVpbnQ4QXJyYXkoZHN0U2l6ZSk7CiAgICAgIGNvbnN0IHRyYW5zY29kZWQgPSBrdHgyRmlsZS50cmFuc2NvZGVJbWFnZSgKICAgICAgICBkc3QsCiAgICAgICAgaSwKICAgICAgICAvLyBsZXZlbCBpbmRleAogICAgICAgIDAsCiAgICAgICAgLy8gbGF5ZXIgaW5kZXgKICAgICAgICAwLAogICAgICAgIC8vIGZhY2UgaW5kZXgKICAgICAgICB0cmFuc2NvZGVyRm9ybWF0LnZhbHVlLAogICAgICAgIDAsCiAgICAgICAgLy8gZ2V0X2FscGhhX2Zvcl9vcGFxdWVfZm9ybWF0cwogICAgICAgIC0xLAogICAgICAgIC8vIGNoYW5uZWwwCiAgICAgICAgLTEKICAgICAgICAvLyBjaGFubmVsMQogICAgICApOwogICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh0cmFuc2NvZGVkKSkgewogICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3JfZGVmYXVsdCgidHJhbnNjb2RlSW1hZ2UoKSBmYWlsZWQuIik7CiAgICAgIH0KICAgICAgdHJhbnNmZXJhYmxlT2JqZWN0cy5wdXNoKGRzdC5idWZmZXIpOwogICAgICBsZXZlbFtmYWNlT3JkZXJbMF1dID0gewogICAgICAgIGludGVybmFsRm9ybWF0LAogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodCwKICAgICAgICBsZXZlbEJ1ZmZlcjogZHN0CiAgICAgIH07CiAgICB9CiAgICBrdHgyRmlsZS5jbG9zZSgpOwogICAga3R4MkZpbGUuZGVsZXRlKCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBhc3luYyBmdW5jdGlvbiBpbml0V29ya2VyNShwYXJhbWV0ZXJzLCB0cmFuc2ZlcmFibGVPYmplY3RzKSB7CiAgICBjb25zdCB3YXNtQ29uZmlnID0gcGFyYW1ldGVycy53ZWJBc3NlbWJseUNvbmZpZzsKICAgIGNvbnN0IGJhc2lzVHJhbnNjb2RlciA9IGltcG9ydF9iYXNpc190cmFuc2NvZGVyLmRlZmF1bHQgPz8gc2VsZi5CQVNJUzsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQod2FzbUNvbmZpZy53YXNtQmluYXJ5RmlsZSkpIHsKICAgICAgdHJhbnNjb2Rlck1vZHVsZSA9IGF3YWl0IGJhc2lzVHJhbnNjb2Rlcih3YXNtQ29uZmlnKTsKICAgIH0gZWxzZSB7CiAgICAgIHRyYW5zY29kZXJNb2R1bGUgPSBhd2FpdCBiYXNpc1RyYW5zY29kZXIoKTsKICAgIH0KICAgIHRyYW5zY29kZXJNb2R1bGUuaW5pdGlhbGl6ZUJhc2lzKCk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gdHJhbnNjb2RlS1RYMihwYXJhbWV0ZXJzLCB0cmFuc2ZlcmFibGVPYmplY3RzKSB7CiAgICBjb25zdCB3YXNtQ29uZmlnID0gcGFyYW1ldGVycy53ZWJBc3NlbWJseUNvbmZpZzsKICAgIGlmIChkZWZpbmVkX2RlZmF1bHQod2FzbUNvbmZpZykpIHsKICAgICAgcmV0dXJuIGluaXRXb3JrZXI1KHBhcmFtZXRlcnMsIHRyYW5zZmVyYWJsZU9iamVjdHMpOwogICAgfQogICAgcmV0dXJuIHRyYW5zY29kZShwYXJhbWV0ZXJzLCB0cmFuc2ZlcmFibGVPYmplY3RzKTsKICB9CiAgdmFyIGltcG9ydF9iYXNpc190cmFuc2NvZGVyLCBmYWNlT3JkZXIsIGNvbG9yTW9kZWxFVEMxUywgY29sb3JNb2RlbFVBU1RDLCB0cmFuc2NvZGVyTW9kdWxlLCB0cmFuc2NvZGVLVFgyX2RlZmF1bHQ7CiAgdmFyIGluaXRfdHJhbnNjb2RlS1RYMiA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvdHJhbnNjb2RlS1RYMi5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfUGl4ZWxGb3JtYXQoKTsKICAgICAgaW5pdF9SdW50aW1lRXJyb3IoKTsKICAgICAgaW5pdF9WdWxrYW5Db25zdGFudHMoKTsKICAgICAgaW5pdF9QaXhlbERhdGF0eXBlKCk7CiAgICAgIGluaXRfY3JlYXRlVGFza1Byb2Nlc3NvcldvcmtlcigpOwogICAgICBpbml0X2t0eF9wYXJzZV9tb2Rlcm4oKTsKICAgICAgaW1wb3J0X2Jhc2lzX3RyYW5zY29kZXIgPSBfX3RvRVNNKHJlcXVpcmVfYmFzaXNfdHJhbnNjb2RlcigpLCAxKTsKICAgICAgZmFjZU9yZGVyID0gWwogICAgICAgICJwb3NpdGl2ZVgiLAogICAgICAgICJuZWdhdGl2ZVgiLAogICAgICAgICJwb3NpdGl2ZVkiLAogICAgICAgICJuZWdhdGl2ZVkiLAogICAgICAgICJwb3NpdGl2ZVoiLAogICAgICAgICJuZWdhdGl2ZVoiCiAgICAgIF07CiAgICAgIGNvbG9yTW9kZWxFVEMxUyA9IDE2MzsKICAgICAgY29sb3JNb2RlbFVBU1RDID0gMTY2OwogICAgICB0cmFuc2NvZGVLVFgyX2RlZmF1bHQgPSBjcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyX2RlZmF1bHQodHJhbnNjb2RlS1RYMik7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy90cmFuc2ZlclR5cGVkQXJyYXlUZXN0LmpzCiAgdmFyIHRyYW5zZmVyVHlwZWRBcnJheVRlc3RfZXhwb3J0cyA9IHt9OwogIHZhciBpbml0X3RyYW5zZmVyVHlwZWRBcnJheVRlc3QgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL3RyYW5zZmVyVHlwZWRBcnJheVRlc3QuanMiKCkgewogICAgICBzZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgY29uc3QgYXJyYXkgPSBldmVudC5kYXRhLmFycmF5OwogICAgICAgIGNvbnN0IHBvc3RNZXNzYWdlMiA9IHNlbGYud2Via2l0UG9zdE1lc3NhZ2UgfHwgc2VsZi5wb3N0TWVzc2FnZTsKICAgICAgICB0cnkgewogICAgICAgICAgcG9zdE1lc3NhZ2UyKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgYXJyYXkKICAgICAgICAgICAgfSwKICAgICAgICAgICAgW2FycmF5LmJ1ZmZlcl0KICAgICAgICAgICk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgcG9zdE1lc3NhZ2UyKHt9KTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9JbnRlcnNlY3Rpb25zMkQuanMKICB2YXIgSW50ZXJzZWN0aW9uczJELCBJbnRlcnNlY3Rpb25zMkRfZGVmYXVsdDsKICB2YXIgaW5pdF9JbnRlcnNlY3Rpb25zMkQgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0ludGVyc2VjdGlvbnMyRC5qcyIoKSB7CiAgICAgIGluaXRfQ2FydGVzaWFuMigpOwogICAgICBpbml0X0NhcnRlc2lhbjMoKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBJbnRlcnNlY3Rpb25zMkQgPSB7fTsKICAgICAgSW50ZXJzZWN0aW9uczJELmNsaXBUcmlhbmdsZUF0QXhpc0FsaWduZWRUaHJlc2hvbGQgPSBmdW5jdGlvbih0aHJlc2hvbGQsIGtlZXBBYm92ZSwgdTAsIHUxMiwgdTIyLCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh0aHJlc2hvbGQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgidGhyZXNob2xkIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChrZWVwQWJvdmUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgia2VlcEFib3ZlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh1MCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJ1MCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodTEyKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInUxIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh1MjIpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgidTIgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IFtdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQubGVuZ3RoID0gMDsKICAgICAgICB9CiAgICAgICAgbGV0IHUwQmVoaW5kOwogICAgICAgIGxldCB1MUJlaGluZDsKICAgICAgICBsZXQgdTJCZWhpbmQ7CiAgICAgICAgaWYgKGtlZXBBYm92ZSkgewogICAgICAgICAgdTBCZWhpbmQgPSB1MCA8IHRocmVzaG9sZDsKICAgICAgICAgIHUxQmVoaW5kID0gdTEyIDwgdGhyZXNob2xkOwogICAgICAgICAgdTJCZWhpbmQgPSB1MjIgPCB0aHJlc2hvbGQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHUwQmVoaW5kID0gdTAgPiB0aHJlc2hvbGQ7CiAgICAgICAgICB1MUJlaGluZCA9IHUxMiA+IHRocmVzaG9sZDsKICAgICAgICAgIHUyQmVoaW5kID0gdTIyID4gdGhyZXNob2xkOwogICAgICAgIH0KICAgICAgICBjb25zdCBudW1CZWhpbmQgPSB1MEJlaGluZCArIHUxQmVoaW5kICsgdTJCZWhpbmQ7CiAgICAgICAgbGV0IHUwMVJhdGlvOwogICAgICAgIGxldCB1MDJSYXRpbzsKICAgICAgICBsZXQgdTEyUmF0aW87CiAgICAgICAgbGV0IHUxMFJhdGlvOwogICAgICAgIGxldCB1MjBSYXRpbzsKICAgICAgICBsZXQgdTIxUmF0aW87CiAgICAgICAgaWYgKG51bUJlaGluZCA9PT0gMSkgewogICAgICAgICAgaWYgKHUwQmVoaW5kKSB7CiAgICAgICAgICAgIHUwMVJhdGlvID0gKHRocmVzaG9sZCAtIHUwKSAvICh1MTIgLSB1MCk7CiAgICAgICAgICAgIHUwMlJhdGlvID0gKHRocmVzaG9sZCAtIHUwKSAvICh1MjIgLSB1MCk7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKDEpOwogICAgICAgICAgICByZXN1bHQucHVzaCgyKTsKICAgICAgICAgICAgaWYgKHUwMlJhdGlvICE9PSAxKSB7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLTEpOwogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKDApOwogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKDIpOwogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHUwMlJhdGlvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodTAxUmF0aW8gIT09IDEpIHsKICAgICAgICAgICAgICByZXN1bHQucHVzaCgtMSk7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goMCk7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goMSk7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2godTAxUmF0aW8pOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKHUxQmVoaW5kKSB7CiAgICAgICAgICAgIHUxMlJhdGlvID0gKHRocmVzaG9sZCAtIHUxMikgLyAodTIyIC0gdTEyKTsKICAgICAgICAgICAgdTEwUmF0aW8gPSAodGhyZXNob2xkIC0gdTEyKSAvICh1MCAtIHUxMik7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKDIpOwogICAgICAgICAgICByZXN1bHQucHVzaCgwKTsKICAgICAgICAgICAgaWYgKHUxMFJhdGlvICE9PSAxKSB7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLTEpOwogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKDEpOwogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKDApOwogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHUxMFJhdGlvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodTEyUmF0aW8gIT09IDEpIHsKICAgICAgICAgICAgICByZXN1bHQucHVzaCgtMSk7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goMSk7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goMik7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2godTEyUmF0aW8pOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKHUyQmVoaW5kKSB7CiAgICAgICAgICAgIHUyMFJhdGlvID0gKHRocmVzaG9sZCAtIHUyMikgLyAodTAgLSB1MjIpOwogICAgICAgICAgICB1MjFSYXRpbyA9ICh0aHJlc2hvbGQgLSB1MjIpIC8gKHUxMiAtIHUyMik7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKDApOwogICAgICAgICAgICByZXN1bHQucHVzaCgxKTsKICAgICAgICAgICAgaWYgKHUyMVJhdGlvICE9PSAxKSB7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLTEpOwogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKDIpOwogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKDEpOwogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHUyMVJhdGlvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodTIwUmF0aW8gIT09IDEpIHsKICAgICAgICAgICAgICByZXN1bHQucHVzaCgtMSk7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goMik7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goMCk7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2godTIwUmF0aW8pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChudW1CZWhpbmQgPT09IDIpIHsKICAgICAgICAgIGlmICghdTBCZWhpbmQgJiYgdTAgIT09IHRocmVzaG9sZCkgewogICAgICAgICAgICB1MTBSYXRpbyA9ICh0aHJlc2hvbGQgLSB1MTIpIC8gKHUwIC0gdTEyKTsKICAgICAgICAgICAgdTIwUmF0aW8gPSAodGhyZXNob2xkIC0gdTIyKSAvICh1MCAtIHUyMik7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKDApOwogICAgICAgICAgICByZXN1bHQucHVzaCgtMSk7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKDEpOwogICAgICAgICAgICByZXN1bHQucHVzaCgwKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2godTEwUmF0aW8pOwogICAgICAgICAgICByZXN1bHQucHVzaCgtMSk7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKDIpOwogICAgICAgICAgICByZXN1bHQucHVzaCgwKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2godTIwUmF0aW8pOwogICAgICAgICAgfSBlbHNlIGlmICghdTFCZWhpbmQgJiYgdTEyICE9PSB0aHJlc2hvbGQpIHsKICAgICAgICAgICAgdTIxUmF0aW8gPSAodGhyZXNob2xkIC0gdTIyKSAvICh1MTIgLSB1MjIpOwogICAgICAgICAgICB1MDFSYXRpbyA9ICh0aHJlc2hvbGQgLSB1MCkgLyAodTEyIC0gdTApOwogICAgICAgICAgICByZXN1bHQucHVzaCgxKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goLTEpOwogICAgICAgICAgICByZXN1bHQucHVzaCgyKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goMSk7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHUyMVJhdGlvKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goLTEpOwogICAgICAgICAgICByZXN1bHQucHVzaCgwKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goMSk7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHUwMVJhdGlvKTsKICAgICAgICAgIH0gZWxzZSBpZiAoIXUyQmVoaW5kICYmIHUyMiAhPT0gdGhyZXNob2xkKSB7CiAgICAgICAgICAgIHUwMlJhdGlvID0gKHRocmVzaG9sZCAtIHUwKSAvICh1MjIgLSB1MCk7CiAgICAgICAgICAgIHUxMlJhdGlvID0gKHRocmVzaG9sZCAtIHUxMikgLyAodTIyIC0gdTEyKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goMik7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC0xKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goMCk7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKDIpOwogICAgICAgICAgICByZXN1bHQucHVzaCh1MDJSYXRpbyk7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC0xKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goMSk7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKDIpOwogICAgICAgICAgICByZXN1bHQucHVzaCh1MTJSYXRpbyk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChudW1CZWhpbmQgIT09IDMpIHsKICAgICAgICAgIHJlc3VsdC5wdXNoKDApOwogICAgICAgICAgcmVzdWx0LnB1c2goMSk7CiAgICAgICAgICByZXN1bHQucHVzaCgyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgSW50ZXJzZWN0aW9uczJELmNvbXB1dGVCYXJ5Y2VudHJpY0Nvb3JkaW5hdGVzID0gZnVuY3Rpb24oeCwgeSwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoeCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJ4IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh5KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInkgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHgxKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIngxIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh5MSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJ5MSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoeDIpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgieDIgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHkyKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInkyIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh4MykpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJ4MyBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoeTMpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgieTMgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHgxbXgzID0geDEgLSB4MzsKICAgICAgICBjb25zdCB4M214MiA9IHgzIC0geDI7CiAgICAgICAgY29uc3QgeTJteTMgPSB5MiAtIHkzOwogICAgICAgIGNvbnN0IHkxbXkzID0geTEgLSB5MzsKICAgICAgICBjb25zdCBpbnZlcnNlRGV0ZXJtaW5hbnQgPSAxIC8gKHkybXkzICogeDFteDMgKyB4M214MiAqIHkxbXkzKTsKICAgICAgICBjb25zdCB5bXkzID0geSAtIHkzOwogICAgICAgIGNvbnN0IHhteDMgPSB4IC0geDM7CiAgICAgICAgY29uc3QgbDEgPSAoeTJteTMgKiB4bXgzICsgeDNteDIgKiB5bXkzKSAqIGludmVyc2VEZXRlcm1pbmFudDsKICAgICAgICBjb25zdCBsMiA9ICgteTFteTMgKiB4bXgzICsgeDFteDMgKiB5bXkzKSAqIGludmVyc2VEZXRlcm1pbmFudDsKICAgICAgICBjb25zdCBsMyA9IDEgLSBsMSAtIGwyOwogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0LnggPSBsMTsKICAgICAgICAgIHJlc3VsdC55ID0gbDI7CiAgICAgICAgICByZXN1bHQueiA9IGwzOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQobDEsIGwyLCBsMyk7CiAgICAgIH07CiAgICAgIEludGVyc2VjdGlvbnMyRC5jb21wdXRlTGluZVNlZ21lbnRMaW5lU2VnbWVudEludGVyc2VjdGlvbiA9IGZ1bmN0aW9uKHgwMCwgeTAwLCB4MDEsIHkwMSwgeDEwLCB5MTAsIHgxMSwgeTExLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoIngwMCIsIHgwMCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJ5MDAiLCB5MDApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigieDAxIiwgeDAxKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoInkwMSIsIHkwMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJ4MTAiLCB4MTApOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigieTEwIiwgeTEwKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoIngxMSIsIHgxMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJ5MTEiLCB5MTEpOwogICAgICAgIGNvbnN0IG51bWVyYXRvcjFBID0gKHgxMSAtIHgxMCkgKiAoeTAwIC0geTEwKSAtICh5MTEgLSB5MTApICogKHgwMCAtIHgxMCk7CiAgICAgICAgY29uc3QgbnVtZXJhdG9yMUIgPSAoeDAxIC0geDAwKSAqICh5MDAgLSB5MTApIC0gKHkwMSAtIHkwMCkgKiAoeDAwIC0geDEwKTsKICAgICAgICBjb25zdCBkZW5vbWluYXRvcjEgPSAoeTExIC0geTEwKSAqICh4MDEgLSB4MDApIC0gKHgxMSAtIHgxMCkgKiAoeTAxIC0geTAwKTsKICAgICAgICBpZiAoZGVub21pbmF0b3IxID09PSAwKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHVhMSA9IG51bWVyYXRvcjFBIC8gZGVub21pbmF0b3IxOwogICAgICAgIGNvbnN0IHViMSA9IG51bWVyYXRvcjFCIC8gZGVub21pbmF0b3IxOwogICAgICAgIGlmICh1YTEgPj0gMCAmJiB1YTEgPD0gMSAmJiB1YjEgPj0gMCAmJiB1YjEgPD0gMSkgewogICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgICByZXN1bHQgPSBuZXcgQ2FydGVzaWFuMl9kZWZhdWx0KCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXN1bHQueCA9IHgwMCArIHVhMSAqICh4MDEgLSB4MDApOwogICAgICAgICAgcmVzdWx0LnkgPSB5MDAgKyB1YTEgKiAoeTAxIC0geTAwKTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICB9OwogICAgICBJbnRlcnNlY3Rpb25zMkRfZGVmYXVsdCA9IEludGVyc2VjdGlvbnMyRDsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL3Vwc2FtcGxlUXVhbnRpemVkVGVycmFpbk1lc2guanMKICB2YXIgdXBzYW1wbGVRdWFudGl6ZWRUZXJyYWluTWVzaF9leHBvcnRzID0ge307CiAgX19leHBvcnQodXBzYW1wbGVRdWFudGl6ZWRUZXJyYWluTWVzaF9leHBvcnRzLCB7CiAgICBkZWZhdWx0OiAoKSA9PiB1cHNhbXBsZVF1YW50aXplZFRlcnJhaW5NZXNoX2RlZmF1bHQKICB9KTsKICBmdW5jdGlvbiB1cHNhbXBsZVF1YW50aXplZFRlcnJhaW5NZXNoKHBhcmFtZXRlcnMsIHRyYW5zZmVyYWJsZU9iamVjdHMpIHsKICAgIGNvbnN0IGlzRWFzdENoaWxkID0gcGFyYW1ldGVycy5pc0Vhc3RDaGlsZDsKICAgIGNvbnN0IGlzTm9ydGhDaGlsZCA9IHBhcmFtZXRlcnMuaXNOb3J0aENoaWxkOwogICAgY29uc3QgbWluVSA9IGlzRWFzdENoaWxkID8gaGFsZk1heFNob3J0IDogMDsKICAgIGNvbnN0IG1heFUgPSBpc0Vhc3RDaGlsZCA/IG1heFNob3J0NSA6IGhhbGZNYXhTaG9ydDsKICAgIGNvbnN0IG1pblYgPSBpc05vcnRoQ2hpbGQgPyBoYWxmTWF4U2hvcnQgOiAwOwogICAgY29uc3QgbWF4ViA9IGlzTm9ydGhDaGlsZCA/IG1heFNob3J0NSA6IGhhbGZNYXhTaG9ydDsKICAgIGNvbnN0IHVCdWZmZXIgPSB1U2NyYXRjaDsKICAgIGNvbnN0IHZCdWZmZXIgPSB2U2NyYXRjaDsKICAgIGNvbnN0IGhlaWdodEJ1ZmZlciA9IGhlaWdodFNjcmF0Y2g7CiAgICBjb25zdCBub3JtYWxCdWZmZXIgPSBub3JtYWxzU2NyYXRjaDsKICAgIHVCdWZmZXIubGVuZ3RoID0gMDsKICAgIHZCdWZmZXIubGVuZ3RoID0gMDsKICAgIGhlaWdodEJ1ZmZlci5sZW5ndGggPSAwOwogICAgbm9ybWFsQnVmZmVyLmxlbmd0aCA9IDA7CiAgICBjb25zdCBpbmRpY2VzID0gaW5kaWNlc1NjcmF0Y2g7CiAgICBpbmRpY2VzLmxlbmd0aCA9IDA7CiAgICBjb25zdCB2ZXJ0ZXhNYXAgPSB7fTsKICAgIGNvbnN0IHBhcmVudFZlcnRpY2VzID0gcGFyYW1ldGVycy52ZXJ0aWNlczsKICAgIGxldCBwYXJlbnRJbmRpY2VzID0gcGFyYW1ldGVycy5pbmRpY2VzOwogICAgcGFyZW50SW5kaWNlcyA9IHBhcmVudEluZGljZXMuc3ViYXJyYXkoMCwgcGFyYW1ldGVycy5pbmRleENvdW50V2l0aG91dFNraXJ0cyk7CiAgICBjb25zdCBlbmNvZGluZyA9IFRlcnJhaW5FbmNvZGluZ19kZWZhdWx0LmNsb25lKHBhcmFtZXRlcnMuZW5jb2RpbmcpOwogICAgY29uc3QgaGFzVmVydGV4Tm9ybWFscyA9IGVuY29kaW5nLmhhc1ZlcnRleE5vcm1hbHM7CiAgICBsZXQgdmVydGV4Q291bnQgPSAwOwogICAgY29uc3QgcXVhbnRpemVkVmVydGV4Q291bnQgPSBwYXJhbWV0ZXJzLnZlcnRleENvdW50V2l0aG91dFNraXJ0czsKICAgIGNvbnN0IHBhcmVudE1pbmltdW1IZWlnaHQgPSBwYXJhbWV0ZXJzLm1pbmltdW1IZWlnaHQ7CiAgICBjb25zdCBwYXJlbnRNYXhpbXVtSGVpZ2h0ID0gcGFyYW1ldGVycy5tYXhpbXVtSGVpZ2h0OwogICAgY29uc3QgcGFyZW50VUJ1ZmZlciA9IG5ldyBBcnJheShxdWFudGl6ZWRWZXJ0ZXhDb3VudCk7CiAgICBjb25zdCBwYXJlbnRWQnVmZmVyID0gbmV3IEFycmF5KHF1YW50aXplZFZlcnRleENvdW50KTsKICAgIGNvbnN0IHBhcmVudEhlaWdodEJ1ZmZlciA9IG5ldyBBcnJheShxdWFudGl6ZWRWZXJ0ZXhDb3VudCk7CiAgICBjb25zdCBwYXJlbnROb3JtYWxCdWZmZXIgPSBoYXNWZXJ0ZXhOb3JtYWxzID8gbmV3IEFycmF5KHF1YW50aXplZFZlcnRleENvdW50ICogMikgOiB2b2lkIDA7CiAgICBjb25zdCB0aHJlc2hvbGQgPSAyMDsKICAgIGxldCBoZWlnaHQ7CiAgICBsZXQgaSwgbjsKICAgIGxldCB1MywgdjM7CiAgICBmb3IgKGkgPSAwLCBuID0gMDsgaSA8IHF1YW50aXplZFZlcnRleENvdW50OyArK2ksIG4gKz0gMikgewogICAgICBjb25zdCB0ZXhDb29yZHMgPSBlbmNvZGluZy5kZWNvZGVUZXh0dXJlQ29vcmRpbmF0ZXMoCiAgICAgICAgcGFyZW50VmVydGljZXMsCiAgICAgICAgaSwKICAgICAgICBkZWNvZGVUZXhDb29yZHNTY3JhdGNoCiAgICAgICk7CiAgICAgIGhlaWdodCA9IGVuY29kaW5nLmRlY29kZUhlaWdodChwYXJlbnRWZXJ0aWNlcywgaSk7CiAgICAgIHUzID0gTWF0aF9kZWZhdWx0LmNsYW1wKHRleENvb3Jkcy54ICogbWF4U2hvcnQ1IHwgMCwgMCwgbWF4U2hvcnQ1KTsKICAgICAgdjMgPSBNYXRoX2RlZmF1bHQuY2xhbXAodGV4Q29vcmRzLnkgKiBtYXhTaG9ydDUgfCAwLCAwLCBtYXhTaG9ydDUpOwogICAgICBwYXJlbnRIZWlnaHRCdWZmZXJbaV0gPSBNYXRoX2RlZmF1bHQuY2xhbXAoCiAgICAgICAgKGhlaWdodCAtIHBhcmVudE1pbmltdW1IZWlnaHQpIC8gKHBhcmVudE1heGltdW1IZWlnaHQgLSBwYXJlbnRNaW5pbXVtSGVpZ2h0KSAqIG1heFNob3J0NSB8IDAsCiAgICAgICAgMCwKICAgICAgICBtYXhTaG9ydDUKICAgICAgKTsKICAgICAgaWYgKHUzIDwgdGhyZXNob2xkKSB7CiAgICAgICAgdTMgPSAwOwogICAgICB9CiAgICAgIGlmICh2MyA8IHRocmVzaG9sZCkgewogICAgICAgIHYzID0gMDsKICAgICAgfQogICAgICBpZiAobWF4U2hvcnQ1IC0gdTMgPCB0aHJlc2hvbGQpIHsKICAgICAgICB1MyA9IG1heFNob3J0NTsKICAgICAgfQogICAgICBpZiAobWF4U2hvcnQ1IC0gdjMgPCB0aHJlc2hvbGQpIHsKICAgICAgICB2MyA9IG1heFNob3J0NTsKICAgICAgfQogICAgICBwYXJlbnRVQnVmZmVyW2ldID0gdTM7CiAgICAgIHBhcmVudFZCdWZmZXJbaV0gPSB2MzsKICAgICAgaWYgKGhhc1ZlcnRleE5vcm1hbHMpIHsKICAgICAgICBjb25zdCBlbmNvZGVkTm9ybWFsID0gZW5jb2RpbmcuZ2V0T2N0RW5jb2RlZE5vcm1hbCgKICAgICAgICAgIHBhcmVudFZlcnRpY2VzLAogICAgICAgICAgaSwKICAgICAgICAgIG9jdEVuY29kZWROb3JtYWxTY3JhdGNoCiAgICAgICAgKTsKICAgICAgICBwYXJlbnROb3JtYWxCdWZmZXJbbl0gPSBlbmNvZGVkTm9ybWFsLng7CiAgICAgICAgcGFyZW50Tm9ybWFsQnVmZmVyW24gKyAxXSA9IGVuY29kZWROb3JtYWwueTsKICAgICAgfQogICAgICBpZiAoKGlzRWFzdENoaWxkICYmIHUzID49IGhhbGZNYXhTaG9ydCB8fCAhaXNFYXN0Q2hpbGQgJiYgdTMgPD0gaGFsZk1heFNob3J0KSAmJiAoaXNOb3J0aENoaWxkICYmIHYzID49IGhhbGZNYXhTaG9ydCB8fCAhaXNOb3J0aENoaWxkICYmIHYzIDw9IGhhbGZNYXhTaG9ydCkpIHsKICAgICAgICB2ZXJ0ZXhNYXBbaV0gPSB2ZXJ0ZXhDb3VudDsKICAgICAgICB1QnVmZmVyLnB1c2godTMpOwogICAgICAgIHZCdWZmZXIucHVzaCh2Myk7CiAgICAgICAgaGVpZ2h0QnVmZmVyLnB1c2gocGFyZW50SGVpZ2h0QnVmZmVyW2ldKTsKICAgICAgICBpZiAoaGFzVmVydGV4Tm9ybWFscykgewogICAgICAgICAgbm9ybWFsQnVmZmVyLnB1c2gocGFyZW50Tm9ybWFsQnVmZmVyW25dKTsKICAgICAgICAgIG5vcm1hbEJ1ZmZlci5wdXNoKHBhcmVudE5vcm1hbEJ1ZmZlcltuICsgMV0pOwogICAgICAgIH0KICAgICAgICArK3ZlcnRleENvdW50OwogICAgICB9CiAgICB9CiAgICBjb25zdCB0cmlhbmdsZVZlcnRpY2VzID0gW107CiAgICB0cmlhbmdsZVZlcnRpY2VzLnB1c2gobmV3IFZlcnRleCgpKTsKICAgIHRyaWFuZ2xlVmVydGljZXMucHVzaChuZXcgVmVydGV4KCkpOwogICAgdHJpYW5nbGVWZXJ0aWNlcy5wdXNoKG5ldyBWZXJ0ZXgoKSk7CiAgICBjb25zdCBjbGlwcGVkVHJpYW5nbGVWZXJ0aWNlcyA9IFtdOwogICAgY2xpcHBlZFRyaWFuZ2xlVmVydGljZXMucHVzaChuZXcgVmVydGV4KCkpOwogICAgY2xpcHBlZFRyaWFuZ2xlVmVydGljZXMucHVzaChuZXcgVmVydGV4KCkpOwogICAgY2xpcHBlZFRyaWFuZ2xlVmVydGljZXMucHVzaChuZXcgVmVydGV4KCkpOwogICAgbGV0IGNsaXBwZWRJbmRleDsKICAgIGxldCBjbGlwcGVkMjsKICAgIGZvciAoaSA9IDA7IGkgPCBwYXJlbnRJbmRpY2VzLmxlbmd0aDsgaSArPSAzKSB7CiAgICAgIGNvbnN0IGkwID0gcGFyZW50SW5kaWNlc1tpXTsKICAgICAgY29uc3QgaTEgPSBwYXJlbnRJbmRpY2VzW2kgKyAxXTsKICAgICAgY29uc3QgaTIgPSBwYXJlbnRJbmRpY2VzW2kgKyAyXTsKICAgICAgY29uc3QgdTAgPSBwYXJlbnRVQnVmZmVyW2kwXTsKICAgICAgY29uc3QgdTEyID0gcGFyZW50VUJ1ZmZlcltpMV07CiAgICAgIGNvbnN0IHUyMiA9IHBhcmVudFVCdWZmZXJbaTJdOwogICAgICB0cmlhbmdsZVZlcnRpY2VzWzBdLmluaXRpYWxpemVJbmRleGVkKAogICAgICAgIHBhcmVudFVCdWZmZXIsCiAgICAgICAgcGFyZW50VkJ1ZmZlciwKICAgICAgICBwYXJlbnRIZWlnaHRCdWZmZXIsCiAgICAgICAgcGFyZW50Tm9ybWFsQnVmZmVyLAogICAgICAgIGkwCiAgICAgICk7CiAgICAgIHRyaWFuZ2xlVmVydGljZXNbMV0uaW5pdGlhbGl6ZUluZGV4ZWQoCiAgICAgICAgcGFyZW50VUJ1ZmZlciwKICAgICAgICBwYXJlbnRWQnVmZmVyLAogICAgICAgIHBhcmVudEhlaWdodEJ1ZmZlciwKICAgICAgICBwYXJlbnROb3JtYWxCdWZmZXIsCiAgICAgICAgaTEKICAgICAgKTsKICAgICAgdHJpYW5nbGVWZXJ0aWNlc1syXS5pbml0aWFsaXplSW5kZXhlZCgKICAgICAgICBwYXJlbnRVQnVmZmVyLAogICAgICAgIHBhcmVudFZCdWZmZXIsCiAgICAgICAgcGFyZW50SGVpZ2h0QnVmZmVyLAogICAgICAgIHBhcmVudE5vcm1hbEJ1ZmZlciwKICAgICAgICBpMgogICAgICApOwogICAgICBjb25zdCBjbGlwcGVkID0gSW50ZXJzZWN0aW9uczJEX2RlZmF1bHQuY2xpcFRyaWFuZ2xlQXRBeGlzQWxpZ25lZFRocmVzaG9sZCgKICAgICAgICBoYWxmTWF4U2hvcnQsCiAgICAgICAgaXNFYXN0Q2hpbGQsCiAgICAgICAgdTAsCiAgICAgICAgdTEyLAogICAgICAgIHUyMiwKICAgICAgICBjbGlwU2NyYXRjaAogICAgICApOwogICAgICBjbGlwcGVkSW5kZXggPSAwOwogICAgICBpZiAoY2xpcHBlZEluZGV4ID49IGNsaXBwZWQubGVuZ3RoKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY2xpcHBlZEluZGV4ID0gY2xpcHBlZFRyaWFuZ2xlVmVydGljZXNbMF0uaW5pdGlhbGl6ZUZyb21DbGlwUmVzdWx0KAogICAgICAgIGNsaXBwZWQsCiAgICAgICAgY2xpcHBlZEluZGV4LAogICAgICAgIHRyaWFuZ2xlVmVydGljZXMKICAgICAgKTsKICAgICAgaWYgKGNsaXBwZWRJbmRleCA+PSBjbGlwcGVkLmxlbmd0aCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNsaXBwZWRJbmRleCA9IGNsaXBwZWRUcmlhbmdsZVZlcnRpY2VzWzFdLmluaXRpYWxpemVGcm9tQ2xpcFJlc3VsdCgKICAgICAgICBjbGlwcGVkLAogICAgICAgIGNsaXBwZWRJbmRleCwKICAgICAgICB0cmlhbmdsZVZlcnRpY2VzCiAgICAgICk7CiAgICAgIGlmIChjbGlwcGVkSW5kZXggPj0gY2xpcHBlZC5sZW5ndGgpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjbGlwcGVkSW5kZXggPSBjbGlwcGVkVHJpYW5nbGVWZXJ0aWNlc1syXS5pbml0aWFsaXplRnJvbUNsaXBSZXN1bHQoCiAgICAgICAgY2xpcHBlZCwKICAgICAgICBjbGlwcGVkSW5kZXgsCiAgICAgICAgdHJpYW5nbGVWZXJ0aWNlcwogICAgICApOwogICAgICBjbGlwcGVkMiA9IEludGVyc2VjdGlvbnMyRF9kZWZhdWx0LmNsaXBUcmlhbmdsZUF0QXhpc0FsaWduZWRUaHJlc2hvbGQoCiAgICAgICAgaGFsZk1heFNob3J0LAogICAgICAgIGlzTm9ydGhDaGlsZCwKICAgICAgICBjbGlwcGVkVHJpYW5nbGVWZXJ0aWNlc1swXS5nZXRWKCksCiAgICAgICAgY2xpcHBlZFRyaWFuZ2xlVmVydGljZXNbMV0uZ2V0VigpLAogICAgICAgIGNsaXBwZWRUcmlhbmdsZVZlcnRpY2VzWzJdLmdldFYoKSwKICAgICAgICBjbGlwU2NyYXRjaDIKICAgICAgKTsKICAgICAgYWRkQ2xpcHBlZFBvbHlnb24oCiAgICAgICAgdUJ1ZmZlciwKICAgICAgICB2QnVmZmVyLAogICAgICAgIGhlaWdodEJ1ZmZlciwKICAgICAgICBub3JtYWxCdWZmZXIsCiAgICAgICAgaW5kaWNlcywKICAgICAgICB2ZXJ0ZXhNYXAsCiAgICAgICAgY2xpcHBlZDIsCiAgICAgICAgY2xpcHBlZFRyaWFuZ2xlVmVydGljZXMsCiAgICAgICAgaGFzVmVydGV4Tm9ybWFscwogICAgICApOwogICAgICBpZiAoY2xpcHBlZEluZGV4IDwgY2xpcHBlZC5sZW5ndGgpIHsKICAgICAgICBjbGlwcGVkVHJpYW5nbGVWZXJ0aWNlc1syXS5jbG9uZShjbGlwcGVkVHJpYW5nbGVWZXJ0aWNlc1sxXSk7CiAgICAgICAgY2xpcHBlZFRyaWFuZ2xlVmVydGljZXNbMl0uaW5pdGlhbGl6ZUZyb21DbGlwUmVzdWx0KAogICAgICAgICAgY2xpcHBlZCwKICAgICAgICAgIGNsaXBwZWRJbmRleCwKICAgICAgICAgIHRyaWFuZ2xlVmVydGljZXMKICAgICAgICApOwogICAgICAgIGNsaXBwZWQyID0gSW50ZXJzZWN0aW9uczJEX2RlZmF1bHQuY2xpcFRyaWFuZ2xlQXRBeGlzQWxpZ25lZFRocmVzaG9sZCgKICAgICAgICAgIGhhbGZNYXhTaG9ydCwKICAgICAgICAgIGlzTm9ydGhDaGlsZCwKICAgICAgICAgIGNsaXBwZWRUcmlhbmdsZVZlcnRpY2VzWzBdLmdldFYoKSwKICAgICAgICAgIGNsaXBwZWRUcmlhbmdsZVZlcnRpY2VzWzFdLmdldFYoKSwKICAgICAgICAgIGNsaXBwZWRUcmlhbmdsZVZlcnRpY2VzWzJdLmdldFYoKSwKICAgICAgICAgIGNsaXBTY3JhdGNoMgogICAgICAgICk7CiAgICAgICAgYWRkQ2xpcHBlZFBvbHlnb24oCiAgICAgICAgICB1QnVmZmVyLAogICAgICAgICAgdkJ1ZmZlciwKICAgICAgICAgIGhlaWdodEJ1ZmZlciwKICAgICAgICAgIG5vcm1hbEJ1ZmZlciwKICAgICAgICAgIGluZGljZXMsCiAgICAgICAgICB2ZXJ0ZXhNYXAsCiAgICAgICAgICBjbGlwcGVkMiwKICAgICAgICAgIGNsaXBwZWRUcmlhbmdsZVZlcnRpY2VzLAogICAgICAgICAgaGFzVmVydGV4Tm9ybWFscwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHVPZmZzZXQgPSBpc0Vhc3RDaGlsZCA/IC1tYXhTaG9ydDUgOiAwOwogICAgY29uc3Qgdk9mZnNldCA9IGlzTm9ydGhDaGlsZCA/IC1tYXhTaG9ydDUgOiAwOwogICAgY29uc3Qgd2VzdEluZGljZXMgPSBbXTsKICAgIGNvbnN0IHNvdXRoSW5kaWNlcyA9IFtdOwogICAgY29uc3QgZWFzdEluZGljZXMgPSBbXTsKICAgIGNvbnN0IG5vcnRoSW5kaWNlcyA9IFtdOwogICAgbGV0IG1pbmltdW1IZWlnaHQgPSBOdW1iZXIuTUFYX1ZBTFVFOwogICAgbGV0IG1heGltdW1IZWlnaHQgPSAtbWluaW11bUhlaWdodDsKICAgIGNvbnN0IGNhcnRlc2lhblZlcnRpY2VzID0gdmVydGljZXNTY3JhdGNoOwogICAgY2FydGVzaWFuVmVydGljZXMubGVuZ3RoID0gMDsKICAgIGNvbnN0IGVsbGlwc29pZCA9IEVsbGlwc29pZF9kZWZhdWx0LmNsb25lKHBhcmFtZXRlcnMuZWxsaXBzb2lkKTsKICAgIGNvbnN0IHJlY3RhbmdsZSA9IFJlY3RhbmdsZV9kZWZhdWx0LmNsb25lKHBhcmFtZXRlcnMuY2hpbGRSZWN0YW5nbGUpOwogICAgY29uc3Qgbm9ydGggPSByZWN0YW5nbGUubm9ydGg7CiAgICBjb25zdCBzb3V0aCA9IHJlY3RhbmdsZS5zb3V0aDsKICAgIGxldCBlYXN0ID0gcmVjdGFuZ2xlLmVhc3Q7CiAgICBjb25zdCB3ZXN0ID0gcmVjdGFuZ2xlLndlc3Q7CiAgICBpZiAoZWFzdCA8IHdlc3QpIHsKICAgICAgZWFzdCArPSBNYXRoX2RlZmF1bHQuVFdPX1BJOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IHVCdWZmZXIubGVuZ3RoOyArK2kpIHsKICAgICAgdTMgPSBNYXRoLnJvdW5kKHVCdWZmZXJbaV0pOwogICAgICBpZiAodTMgPD0gbWluVSkgewogICAgICAgIHdlc3RJbmRpY2VzLnB1c2goaSk7CiAgICAgICAgdTMgPSAwOwogICAgICB9IGVsc2UgaWYgKHUzID49IG1heFUpIHsKICAgICAgICBlYXN0SW5kaWNlcy5wdXNoKGkpOwogICAgICAgIHUzID0gbWF4U2hvcnQ1OwogICAgICB9IGVsc2UgewogICAgICAgIHUzID0gdTMgKiAyICsgdU9mZnNldDsKICAgICAgfQogICAgICB1QnVmZmVyW2ldID0gdTM7CiAgICAgIHYzID0gTWF0aC5yb3VuZCh2QnVmZmVyW2ldKTsKICAgICAgaWYgKHYzIDw9IG1pblYpIHsKICAgICAgICBzb3V0aEluZGljZXMucHVzaChpKTsKICAgICAgICB2MyA9IDA7CiAgICAgIH0gZWxzZSBpZiAodjMgPj0gbWF4VikgewogICAgICAgIG5vcnRoSW5kaWNlcy5wdXNoKGkpOwogICAgICAgIHYzID0gbWF4U2hvcnQ1OwogICAgICB9IGVsc2UgewogICAgICAgIHYzID0gdjMgKiAyICsgdk9mZnNldDsKICAgICAgfQogICAgICB2QnVmZmVyW2ldID0gdjM7CiAgICAgIGhlaWdodCA9IE1hdGhfZGVmYXVsdC5sZXJwKAogICAgICAgIHBhcmVudE1pbmltdW1IZWlnaHQsCiAgICAgICAgcGFyZW50TWF4aW11bUhlaWdodCwKICAgICAgICBoZWlnaHRCdWZmZXJbaV0gLyBtYXhTaG9ydDUKICAgICAgKTsKICAgICAgaWYgKGhlaWdodCA8IG1pbmltdW1IZWlnaHQpIHsKICAgICAgICBtaW5pbXVtSGVpZ2h0ID0gaGVpZ2h0OwogICAgICB9CiAgICAgIGlmIChoZWlnaHQgPiBtYXhpbXVtSGVpZ2h0KSB7CiAgICAgICAgbWF4aW11bUhlaWdodCA9IGhlaWdodDsKICAgICAgfQogICAgICBoZWlnaHRCdWZmZXJbaV0gPSBoZWlnaHQ7CiAgICAgIGNhcnRvZ3JhcGhpY1NjcmF0Y2gyLmxvbmdpdHVkZSA9IE1hdGhfZGVmYXVsdC5sZXJwKHdlc3QsIGVhc3QsIHUzIC8gbWF4U2hvcnQ1KTsKICAgICAgY2FydG9ncmFwaGljU2NyYXRjaDIubGF0aXR1ZGUgPSBNYXRoX2RlZmF1bHQubGVycChzb3V0aCwgbm9ydGgsIHYzIC8gbWF4U2hvcnQ1KTsKICAgICAgY2FydG9ncmFwaGljU2NyYXRjaDIuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICBlbGxpcHNvaWQuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oY2FydG9ncmFwaGljU2NyYXRjaDIsIGNhcnRlc2lhbjNTY3JhdGNoOSk7CiAgICAgIGNhcnRlc2lhblZlcnRpY2VzLnB1c2goY2FydGVzaWFuM1NjcmF0Y2g5LngpOwogICAgICBjYXJ0ZXNpYW5WZXJ0aWNlcy5wdXNoKGNhcnRlc2lhbjNTY3JhdGNoOS55KTsKICAgICAgY2FydGVzaWFuVmVydGljZXMucHVzaChjYXJ0ZXNpYW4zU2NyYXRjaDkueik7CiAgICB9CiAgICBjb25zdCBib3VuZGluZ1NwaGVyZSA9IEJvdW5kaW5nU3BoZXJlX2RlZmF1bHQuZnJvbVZlcnRpY2VzKAogICAgICBjYXJ0ZXNpYW5WZXJ0aWNlcywKICAgICAgQ2FydGVzaWFuM19kZWZhdWx0LlpFUk8sCiAgICAgIDMsCiAgICAgIGJvdW5kaW5nU3BoZXJlU2NyYXRjaAogICAgKTsKICAgIGNvbnN0IG9yaWVudGVkQm91bmRpbmdCb3ggPSBPcmllbnRlZEJvdW5kaW5nQm94X2RlZmF1bHQuZnJvbVJlY3RhbmdsZSgKICAgICAgcmVjdGFuZ2xlLAogICAgICBtaW5pbXVtSGVpZ2h0LAogICAgICBtYXhpbXVtSGVpZ2h0LAogICAgICBlbGxpcHNvaWQsCiAgICAgIG9yaWVudGVkQm91bmRpbmdCb3hTY3JhdGNoCiAgICApOwogICAgY29uc3Qgb2NjbHVkZXIgPSBuZXcgRWxsaXBzb2lkYWxPY2NsdWRlcl9kZWZhdWx0KGVsbGlwc29pZCk7CiAgICBjb25zdCBob3Jpem9uT2NjbHVzaW9uUG9pbnQgPSBvY2NsdWRlci5jb21wdXRlSG9yaXpvbkN1bGxpbmdQb2ludEZyb21WZXJ0aWNlc1Bvc3NpYmx5VW5kZXJFbGxpcHNvaWQoCiAgICAgIGJvdW5kaW5nU3BoZXJlLmNlbnRlciwKICAgICAgY2FydGVzaWFuVmVydGljZXMsCiAgICAgIDMsCiAgICAgIGJvdW5kaW5nU3BoZXJlLmNlbnRlciwKICAgICAgbWluaW11bUhlaWdodCwKICAgICAgaG9yaXpvbk9jY2x1c2lvblBvaW50U2NyYXRjaAogICAgKTsKICAgIGNvbnN0IGhlaWdodFJhbmdlID0gbWF4aW11bUhlaWdodCAtIG1pbmltdW1IZWlnaHQ7CiAgICBjb25zdCB2ZXJ0aWNlcyA9IG5ldyBVaW50MTZBcnJheSgKICAgICAgdUJ1ZmZlci5sZW5ndGggKyB2QnVmZmVyLmxlbmd0aCArIGhlaWdodEJ1ZmZlci5sZW5ndGgKICAgICk7CiAgICBmb3IgKGkgPSAwOyBpIDwgdUJ1ZmZlci5sZW5ndGg7ICsraSkgewogICAgICB2ZXJ0aWNlc1tpXSA9IHVCdWZmZXJbaV07CiAgICB9CiAgICBsZXQgc3RhcnQgPSB1QnVmZmVyLmxlbmd0aDsKICAgIGZvciAoaSA9IDA7IGkgPCB2QnVmZmVyLmxlbmd0aDsgKytpKSB7CiAgICAgIHZlcnRpY2VzW3N0YXJ0ICsgaV0gPSB2QnVmZmVyW2ldOwogICAgfQogICAgc3RhcnQgKz0gdkJ1ZmZlci5sZW5ndGg7CiAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0QnVmZmVyLmxlbmd0aDsgKytpKSB7CiAgICAgIHZlcnRpY2VzW3N0YXJ0ICsgaV0gPSBtYXhTaG9ydDUgKiAoaGVpZ2h0QnVmZmVyW2ldIC0gbWluaW11bUhlaWdodCkgLyBoZWlnaHRSYW5nZTsKICAgIH0KICAgIGNvbnN0IGluZGljZXNUeXBlZEFycmF5ID0gSW5kZXhEYXRhdHlwZV9kZWZhdWx0LmNyZWF0ZVR5cGVkQXJyYXkoCiAgICAgIHVCdWZmZXIubGVuZ3RoLAogICAgICBpbmRpY2VzCiAgICApOwogICAgbGV0IGVuY29kZWROb3JtYWxzOwogICAgaWYgKGhhc1ZlcnRleE5vcm1hbHMpIHsKICAgICAgY29uc3Qgbm9ybWFsQXJyYXkgPSBuZXcgVWludDhBcnJheShub3JtYWxCdWZmZXIpOwogICAgICB0cmFuc2ZlcmFibGVPYmplY3RzLnB1c2goCiAgICAgICAgdmVydGljZXMuYnVmZmVyLAogICAgICAgIGluZGljZXNUeXBlZEFycmF5LmJ1ZmZlciwKICAgICAgICBub3JtYWxBcnJheS5idWZmZXIKICAgICAgKTsKICAgICAgZW5jb2RlZE5vcm1hbHMgPSBub3JtYWxBcnJheS5idWZmZXI7CiAgICB9IGVsc2UgewogICAgICB0cmFuc2ZlcmFibGVPYmplY3RzLnB1c2godmVydGljZXMuYnVmZmVyLCBpbmRpY2VzVHlwZWRBcnJheS5idWZmZXIpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgdmVydGljZXM6IHZlcnRpY2VzLmJ1ZmZlciwKICAgICAgZW5jb2RlZE5vcm1hbHMsCiAgICAgIGluZGljZXM6IGluZGljZXNUeXBlZEFycmF5LmJ1ZmZlciwKICAgICAgbWluaW11bUhlaWdodCwKICAgICAgbWF4aW11bUhlaWdodCwKICAgICAgd2VzdEluZGljZXMsCiAgICAgIHNvdXRoSW5kaWNlcywKICAgICAgZWFzdEluZGljZXMsCiAgICAgIG5vcnRoSW5kaWNlcywKICAgICAgYm91bmRpbmdTcGhlcmUsCiAgICAgIG9yaWVudGVkQm91bmRpbmdCb3gsCiAgICAgIGhvcml6b25PY2NsdXNpb25Qb2ludAogICAgfTsKICB9CiAgZnVuY3Rpb24gVmVydGV4KCkgewogICAgdGhpcy52ZXJ0ZXhCdWZmZXIgPSB2b2lkIDA7CiAgICB0aGlzLmluZGV4ID0gdm9pZCAwOwogICAgdGhpcy5maXJzdCA9IHZvaWQgMDsKICAgIHRoaXMuc2Vjb25kID0gdm9pZCAwOwogICAgdGhpcy5yYXRpbyA9IHZvaWQgMDsKICB9CiAgZnVuY3Rpb24gbGVycE9jdEVuY29kZWROb3JtYWwodmVydGV4LCByZXN1bHQpIHsKICAgICsrZGVwdGg7CiAgICBsZXQgZmlyc3QgPSBjYXJ0ZXNpYW5TY3JhdGNoMVtkZXB0aF07CiAgICBsZXQgc2Vjb25kID0gY2FydGVzaWFuU2NyYXRjaDJbZGVwdGhdOwogICAgZmlyc3QgPSBBdHRyaWJ1dGVDb21wcmVzc2lvbl9kZWZhdWx0Lm9jdERlY29kZSgKICAgICAgdmVydGV4LmZpcnN0LmdldE5vcm1hbFgoKSwKICAgICAgdmVydGV4LmZpcnN0LmdldE5vcm1hbFkoKSwKICAgICAgZmlyc3QKICAgICk7CiAgICBzZWNvbmQgPSBBdHRyaWJ1dGVDb21wcmVzc2lvbl9kZWZhdWx0Lm9jdERlY29kZSgKICAgICAgdmVydGV4LnNlY29uZC5nZXROb3JtYWxYKCksCiAgICAgIHZlcnRleC5zZWNvbmQuZ2V0Tm9ybWFsWSgpLAogICAgICBzZWNvbmQKICAgICk7CiAgICBjYXJ0ZXNpYW4zU2NyYXRjaDkgPSBDYXJ0ZXNpYW4zX2RlZmF1bHQubGVycCgKICAgICAgZmlyc3QsCiAgICAgIHNlY29uZCwKICAgICAgdmVydGV4LnJhdGlvLAogICAgICBjYXJ0ZXNpYW4zU2NyYXRjaDkKICAgICk7CiAgICBDYXJ0ZXNpYW4zX2RlZmF1bHQubm9ybWFsaXplKGNhcnRlc2lhbjNTY3JhdGNoOSwgY2FydGVzaWFuM1NjcmF0Y2g5KTsKICAgIEF0dHJpYnV0ZUNvbXByZXNzaW9uX2RlZmF1bHQub2N0RW5jb2RlKGNhcnRlc2lhbjNTY3JhdGNoOSwgcmVzdWx0KTsKICAgIC0tZGVwdGg7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBmdW5jdGlvbiBhZGRDbGlwcGVkUG9seWdvbih1QnVmZmVyLCB2QnVmZmVyLCBoZWlnaHRCdWZmZXIsIG5vcm1hbEJ1ZmZlciwgaW5kaWNlcywgdmVydGV4TWFwLCBjbGlwcGVkLCB0cmlhbmdsZVZlcnRpY2VzLCBoYXNWZXJ0ZXhOb3JtYWxzKSB7CiAgICBpZiAoY2xpcHBlZC5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IG51bVZlcnRpY2VzID0gMDsKICAgIGxldCBjbGlwcGVkSW5kZXggPSAwOwogICAgd2hpbGUgKGNsaXBwZWRJbmRleCA8IGNsaXBwZWQubGVuZ3RoKSB7CiAgICAgIGNsaXBwZWRJbmRleCA9IHBvbHlnb25WZXJ0aWNlc1tudW1WZXJ0aWNlcysrXS5pbml0aWFsaXplRnJvbUNsaXBSZXN1bHQoCiAgICAgICAgY2xpcHBlZCwKICAgICAgICBjbGlwcGVkSW5kZXgsCiAgICAgICAgdHJpYW5nbGVWZXJ0aWNlcwogICAgICApOwogICAgfQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1WZXJ0aWNlczsgKytpKSB7CiAgICAgIGNvbnN0IHBvbHlnb25WZXJ0ZXggPSBwb2x5Z29uVmVydGljZXNbaV07CiAgICAgIGlmICghcG9seWdvblZlcnRleC5pc0luZGV4ZWQoKSkgewogICAgICAgIGNvbnN0IGtleSA9IHBvbHlnb25WZXJ0ZXguZ2V0S2V5KCk7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdCh2ZXJ0ZXhNYXBba2V5XSkpIHsKICAgICAgICAgIHBvbHlnb25WZXJ0ZXgubmV3SW5kZXggPSB2ZXJ0ZXhNYXBba2V5XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgbmV3SW5kZXggPSB1QnVmZmVyLmxlbmd0aDsKICAgICAgICAgIHVCdWZmZXIucHVzaChwb2x5Z29uVmVydGV4LmdldFUoKSk7CiAgICAgICAgICB2QnVmZmVyLnB1c2gocG9seWdvblZlcnRleC5nZXRWKCkpOwogICAgICAgICAgaGVpZ2h0QnVmZmVyLnB1c2gocG9seWdvblZlcnRleC5nZXRIKCkpOwogICAgICAgICAgaWYgKGhhc1ZlcnRleE5vcm1hbHMpIHsKICAgICAgICAgICAgbm9ybWFsQnVmZmVyLnB1c2gocG9seWdvblZlcnRleC5nZXROb3JtYWxYKCkpOwogICAgICAgICAgICBub3JtYWxCdWZmZXIucHVzaChwb2x5Z29uVmVydGV4LmdldE5vcm1hbFkoKSk7CiAgICAgICAgICB9CiAgICAgICAgICBwb2x5Z29uVmVydGV4Lm5ld0luZGV4ID0gbmV3SW5kZXg7CiAgICAgICAgICB2ZXJ0ZXhNYXBba2V5XSA9IG5ld0luZGV4OwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBwb2x5Z29uVmVydGV4Lm5ld0luZGV4ID0gdmVydGV4TWFwW3BvbHlnb25WZXJ0ZXguaW5kZXhdOwogICAgICAgIHBvbHlnb25WZXJ0ZXgudUJ1ZmZlciA9IHVCdWZmZXI7CiAgICAgICAgcG9seWdvblZlcnRleC52QnVmZmVyID0gdkJ1ZmZlcjsKICAgICAgICBwb2x5Z29uVmVydGV4LmhlaWdodEJ1ZmZlciA9IGhlaWdodEJ1ZmZlcjsKICAgICAgICBpZiAoaGFzVmVydGV4Tm9ybWFscykgewogICAgICAgICAgcG9seWdvblZlcnRleC5ub3JtYWxCdWZmZXIgPSBub3JtYWxCdWZmZXI7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobnVtVmVydGljZXMgPT09IDMpIHsKICAgICAgaW5kaWNlcy5wdXNoKHBvbHlnb25WZXJ0aWNlc1swXS5uZXdJbmRleCk7CiAgICAgIGluZGljZXMucHVzaChwb2x5Z29uVmVydGljZXNbMV0ubmV3SW5kZXgpOwogICAgICBpbmRpY2VzLnB1c2gocG9seWdvblZlcnRpY2VzWzJdLm5ld0luZGV4KTsKICAgIH0gZWxzZSBpZiAobnVtVmVydGljZXMgPT09IDQpIHsKICAgICAgaW5kaWNlcy5wdXNoKHBvbHlnb25WZXJ0aWNlc1swXS5uZXdJbmRleCk7CiAgICAgIGluZGljZXMucHVzaChwb2x5Z29uVmVydGljZXNbMV0ubmV3SW5kZXgpOwogICAgICBpbmRpY2VzLnB1c2gocG9seWdvblZlcnRpY2VzWzJdLm5ld0luZGV4KTsKICAgICAgaW5kaWNlcy5wdXNoKHBvbHlnb25WZXJ0aWNlc1swXS5uZXdJbmRleCk7CiAgICAgIGluZGljZXMucHVzaChwb2x5Z29uVmVydGljZXNbMl0ubmV3SW5kZXgpOwogICAgICBpbmRpY2VzLnB1c2gocG9seWdvblZlcnRpY2VzWzNdLm5ld0luZGV4KTsKICAgIH0KICB9CiAgdmFyIG1heFNob3J0NSwgaGFsZk1heFNob3J0LCBjbGlwU2NyYXRjaCwgY2xpcFNjcmF0Y2gyLCB2ZXJ0aWNlc1NjcmF0Y2gsIGNhcnRvZ3JhcGhpY1NjcmF0Y2gyLCBjYXJ0ZXNpYW4zU2NyYXRjaDksIHVTY3JhdGNoLCB2U2NyYXRjaCwgaGVpZ2h0U2NyYXRjaCwgaW5kaWNlc1NjcmF0Y2gsIG5vcm1hbHNTY3JhdGNoLCBob3Jpem9uT2NjbHVzaW9uUG9pbnRTY3JhdGNoLCBib3VuZGluZ1NwaGVyZVNjcmF0Y2gsIG9yaWVudGVkQm91bmRpbmdCb3hTY3JhdGNoLCBkZWNvZGVUZXhDb29yZHNTY3JhdGNoLCBvY3RFbmNvZGVkTm9ybWFsU2NyYXRjaCwgZW5jb2RlZFNjcmF0Y2gsIGRlcHRoLCBjYXJ0ZXNpYW5TY3JhdGNoMSwgY2FydGVzaWFuU2NyYXRjaDIsIHBvbHlnb25WZXJ0aWNlcywgdXBzYW1wbGVRdWFudGl6ZWRUZXJyYWluTWVzaF9kZWZhdWx0OwogIHZhciBpbml0X3Vwc2FtcGxlUXVhbnRpemVkVGVycmFpbk1lc2ggPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL3Vwc2FtcGxlUXVhbnRpemVkVGVycmFpbk1lc2guanMiKCkgewogICAgICBpbml0X0F0dHJpYnV0ZUNvbXByZXNzaW9uKCk7CiAgICAgIGluaXRfQm91bmRpbmdTcGhlcmUoKTsKICAgICAgaW5pdF9DYXJ0ZXNpYW4yKCk7CiAgICAgIGluaXRfQ2FydGVzaWFuMygpOwogICAgICBpbml0X0NhcnRvZ3JhcGhpYygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9FbGxpcHNvaWQoKTsKICAgICAgaW5pdF9FbGxpcHNvaWRhbE9jY2x1ZGVyKCk7CiAgICAgIGluaXRfSW5kZXhEYXRhdHlwZSgpOwogICAgICBpbml0X0ludGVyc2VjdGlvbnMyRCgpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgaW5pdF9PcmllbnRlZEJvdW5kaW5nQm94KCk7CiAgICAgIGluaXRfUmVjdGFuZ2xlKCk7CiAgICAgIGluaXRfVGVycmFpbkVuY29kaW5nKCk7CiAgICAgIGluaXRfY3JlYXRlVGFza1Byb2Nlc3NvcldvcmtlcigpOwogICAgICBtYXhTaG9ydDUgPSAzMjc2NzsKICAgICAgaGFsZk1heFNob3J0ID0gbWF4U2hvcnQ1IC8gMiB8IDA7CiAgICAgIGNsaXBTY3JhdGNoID0gW107CiAgICAgIGNsaXBTY3JhdGNoMiA9IFtdOwogICAgICB2ZXJ0aWNlc1NjcmF0Y2ggPSBbXTsKICAgICAgY2FydG9ncmFwaGljU2NyYXRjaDIgPSBuZXcgQ2FydG9ncmFwaGljX2RlZmF1bHQoKTsKICAgICAgY2FydGVzaWFuM1NjcmF0Y2g5ID0gbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpOwogICAgICB1U2NyYXRjaCA9IFtdOwogICAgICB2U2NyYXRjaCA9IFtdOwogICAgICBoZWlnaHRTY3JhdGNoID0gW107CiAgICAgIGluZGljZXNTY3JhdGNoID0gW107CiAgICAgIG5vcm1hbHNTY3JhdGNoID0gW107CiAgICAgIGhvcml6b25PY2NsdXNpb25Qb2ludFNjcmF0Y2ggPSBuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCk7CiAgICAgIGJvdW5kaW5nU3BoZXJlU2NyYXRjaCA9IG5ldyBCb3VuZGluZ1NwaGVyZV9kZWZhdWx0KCk7CiAgICAgIG9yaWVudGVkQm91bmRpbmdCb3hTY3JhdGNoID0gbmV3IE9yaWVudGVkQm91bmRpbmdCb3hfZGVmYXVsdCgpOwogICAgICBkZWNvZGVUZXhDb29yZHNTY3JhdGNoID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICBvY3RFbmNvZGVkTm9ybWFsU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKTsKICAgICAgVmVydGV4LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBWZXJ0ZXgoKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnVCdWZmZXIgPSB0aGlzLnVCdWZmZXI7CiAgICAgICAgcmVzdWx0LnZCdWZmZXIgPSB0aGlzLnZCdWZmZXI7CiAgICAgICAgcmVzdWx0LmhlaWdodEJ1ZmZlciA9IHRoaXMuaGVpZ2h0QnVmZmVyOwogICAgICAgIHJlc3VsdC5ub3JtYWxCdWZmZXIgPSB0aGlzLm5vcm1hbEJ1ZmZlcjsKICAgICAgICByZXN1bHQuaW5kZXggPSB0aGlzLmluZGV4OwogICAgICAgIHJlc3VsdC5maXJzdCA9IHRoaXMuZmlyc3Q7CiAgICAgICAgcmVzdWx0LnNlY29uZCA9IHRoaXMuc2Vjb25kOwogICAgICAgIHJlc3VsdC5yYXRpbyA9IHRoaXMucmF0aW87CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgVmVydGV4LnByb3RvdHlwZS5pbml0aWFsaXplSW5kZXhlZCA9IGZ1bmN0aW9uKHVCdWZmZXIsIHZCdWZmZXIsIGhlaWdodEJ1ZmZlciwgbm9ybWFsQnVmZmVyLCBpbmRleCkgewogICAgICAgIHRoaXMudUJ1ZmZlciA9IHVCdWZmZXI7CiAgICAgICAgdGhpcy52QnVmZmVyID0gdkJ1ZmZlcjsKICAgICAgICB0aGlzLmhlaWdodEJ1ZmZlciA9IGhlaWdodEJ1ZmZlcjsKICAgICAgICB0aGlzLm5vcm1hbEJ1ZmZlciA9IG5vcm1hbEJ1ZmZlcjsKICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CiAgICAgICAgdGhpcy5maXJzdCA9IHZvaWQgMDsKICAgICAgICB0aGlzLnNlY29uZCA9IHZvaWQgMDsKICAgICAgICB0aGlzLnJhdGlvID0gdm9pZCAwOwogICAgICB9OwogICAgICBWZXJ0ZXgucHJvdG90eXBlLmluaXRpYWxpemVGcm9tQ2xpcFJlc3VsdCA9IGZ1bmN0aW9uKGNsaXBSZXN1bHQsIGluZGV4LCB2ZXJ0aWNlcykgewogICAgICAgIGxldCBuZXh0SW5kZXggPSBpbmRleCArIDE7CiAgICAgICAgaWYgKGNsaXBSZXN1bHRbaW5kZXhdICE9PSAtMSkgewogICAgICAgICAgdmVydGljZXNbY2xpcFJlc3VsdFtpbmRleF1dLmNsb25lKHRoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnZlcnRleEJ1ZmZlciA9IHZvaWQgMDsKICAgICAgICAgIHRoaXMuaW5kZXggPSB2b2lkIDA7CiAgICAgICAgICB0aGlzLmZpcnN0ID0gdmVydGljZXNbY2xpcFJlc3VsdFtuZXh0SW5kZXhdXTsKICAgICAgICAgICsrbmV4dEluZGV4OwogICAgICAgICAgdGhpcy5zZWNvbmQgPSB2ZXJ0aWNlc1tjbGlwUmVzdWx0W25leHRJbmRleF1dOwogICAgICAgICAgKytuZXh0SW5kZXg7CiAgICAgICAgICB0aGlzLnJhdGlvID0gY2xpcFJlc3VsdFtuZXh0SW5kZXhdOwogICAgICAgICAgKytuZXh0SW5kZXg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXh0SW5kZXg7CiAgICAgIH07CiAgICAgIFZlcnRleC5wcm90b3R5cGUuZ2V0S2V5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuaXNJbmRleGVkKCkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmluZGV4OwogICAgICAgIH0KICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgZmlyc3Q6IHRoaXMuZmlyc3QuZ2V0S2V5KCksCiAgICAgICAgICBzZWNvbmQ6IHRoaXMuc2Vjb25kLmdldEtleSgpLAogICAgICAgICAgcmF0aW86IHRoaXMucmF0aW8KICAgICAgICB9KTsKICAgICAgfTsKICAgICAgVmVydGV4LnByb3RvdHlwZS5pc0luZGV4ZWQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZGVmaW5lZF9kZWZhdWx0KHRoaXMuaW5kZXgpOwogICAgICB9OwogICAgICBWZXJ0ZXgucHJvdG90eXBlLmdldEggPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHRoaXMuaW5kZXgpKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5oZWlnaHRCdWZmZXJbdGhpcy5pbmRleF07CiAgICAgICAgfQogICAgICAgIHJldHVybiBNYXRoX2RlZmF1bHQubGVycCh0aGlzLmZpcnN0LmdldEgoKSwgdGhpcy5zZWNvbmQuZ2V0SCgpLCB0aGlzLnJhdGlvKTsKICAgICAgfTsKICAgICAgVmVydGV4LnByb3RvdHlwZS5nZXRVID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdCh0aGlzLmluZGV4KSkgewogICAgICAgICAgcmV0dXJuIHRoaXMudUJ1ZmZlclt0aGlzLmluZGV4XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE1hdGhfZGVmYXVsdC5sZXJwKHRoaXMuZmlyc3QuZ2V0VSgpLCB0aGlzLnNlY29uZC5nZXRVKCksIHRoaXMucmF0aW8pOwogICAgICB9OwogICAgICBWZXJ0ZXgucHJvdG90eXBlLmdldFYgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KHRoaXMuaW5kZXgpKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy52QnVmZmVyW3RoaXMuaW5kZXhdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gTWF0aF9kZWZhdWx0LmxlcnAodGhpcy5maXJzdC5nZXRWKCksIHRoaXMuc2Vjb25kLmdldFYoKSwgdGhpcy5yYXRpbyk7CiAgICAgIH07CiAgICAgIGVuY29kZWRTY3JhdGNoID0gbmV3IENhcnRlc2lhbjJfZGVmYXVsdCgpOwogICAgICBkZXB0aCA9IC0xOwogICAgICBjYXJ0ZXNpYW5TY3JhdGNoMSA9IFtuZXcgQ2FydGVzaWFuM19kZWZhdWx0KCksIG5ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKV07CiAgICAgIGNhcnRlc2lhblNjcmF0Y2gyID0gW25ldyBDYXJ0ZXNpYW4zX2RlZmF1bHQoKSwgbmV3IENhcnRlc2lhbjNfZGVmYXVsdCgpXTsKICAgICAgVmVydGV4LnByb3RvdHlwZS5nZXROb3JtYWxYID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdCh0aGlzLmluZGV4KSkgewogICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsQnVmZmVyW3RoaXMuaW5kZXggKiAyXTsKICAgICAgICB9CiAgICAgICAgZW5jb2RlZFNjcmF0Y2ggPSBsZXJwT2N0RW5jb2RlZE5vcm1hbCh0aGlzLCBlbmNvZGVkU2NyYXRjaCk7CiAgICAgICAgcmV0dXJuIGVuY29kZWRTY3JhdGNoLng7CiAgICAgIH07CiAgICAgIFZlcnRleC5wcm90b3R5cGUuZ2V0Tm9ybWFsWSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQodGhpcy5pbmRleCkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLm5vcm1hbEJ1ZmZlclt0aGlzLmluZGV4ICogMiArIDFdOwogICAgICAgIH0KICAgICAgICBlbmNvZGVkU2NyYXRjaCA9IGxlcnBPY3RFbmNvZGVkTm9ybWFsKHRoaXMsIGVuY29kZWRTY3JhdGNoKTsKICAgICAgICByZXR1cm4gZW5jb2RlZFNjcmF0Y2gueTsKICAgICAgfTsKICAgICAgcG9seWdvblZlcnRpY2VzID0gW107CiAgICAgIHBvbHlnb25WZXJ0aWNlcy5wdXNoKG5ldyBWZXJ0ZXgoKSk7CiAgICAgIHBvbHlnb25WZXJ0aWNlcy5wdXNoKG5ldyBWZXJ0ZXgoKSk7CiAgICAgIHBvbHlnb25WZXJ0aWNlcy5wdXNoKG5ldyBWZXJ0ZXgoKSk7CiAgICAgIHBvbHlnb25WZXJ0aWNlcy5wdXNoKG5ldyBWZXJ0ZXgoKSk7CiAgICAgIHVwc2FtcGxlUXVhbnRpemVkVGVycmFpbk1lc2hfZGVmYXVsdCA9IGNyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXJfZGVmYXVsdCh1cHNhbXBsZVF1YW50aXplZFRlcnJhaW5NZXNoKTsKICAgIH0KICB9KTsKCiAgLy8gaW1wb3J0KCIuLyoqLyouanMiKSBpbiBwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlR2VvbWV0cnkuanMKICB2YXIgZ2xvYkltcG9ydF9qczsKICB2YXIgaW5pdF8gPSBfX2VzbSh7CiAgICAnaW1wb3J0KCIuLyoqLyouanMiKSBpbiBwYWNrYWdlcy9lbmdpbmUvU291cmNlL1dvcmtlcnMvY3JlYXRlR2VvbWV0cnkuanMnKCkgewogICAgICBnbG9iSW1wb3J0X2pzID0gX19nbG9iKHsKICAgICAgICAiLi9jb21iaW5lR2VvbWV0cnkuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NvbWJpbmVHZW9tZXRyeSgpLCBjb21iaW5lR2VvbWV0cnlfZXhwb3J0cykpLAogICAgICAgICIuL2NyZWF0ZUJveEdlb21ldHJ5LmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9jcmVhdGVCb3hHZW9tZXRyeSgpLCBjcmVhdGVCb3hHZW9tZXRyeV9leHBvcnRzKSksCiAgICAgICAgIi4vY3JlYXRlQm94T3V0bGluZUdlb21ldHJ5LmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9jcmVhdGVCb3hPdXRsaW5lR2VvbWV0cnkoKSwgY3JlYXRlQm94T3V0bGluZUdlb21ldHJ5X2V4cG9ydHMpKSwKICAgICAgICAiLi9jcmVhdGVDaXJjbGVHZW9tZXRyeS5qcyI6ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gKGluaXRfY3JlYXRlQ2lyY2xlR2VvbWV0cnkoKSwgY3JlYXRlQ2lyY2xlR2VvbWV0cnlfZXhwb3J0cykpLAogICAgICAgICIuL2NyZWF0ZUNpcmNsZU91dGxpbmVHZW9tZXRyeS5qcyI6ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gKGluaXRfY3JlYXRlQ2lyY2xlT3V0bGluZUdlb21ldHJ5KCksIGNyZWF0ZUNpcmNsZU91dGxpbmVHZW9tZXRyeV9leHBvcnRzKSksCiAgICAgICAgIi4vY3JlYXRlQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnkuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZUNvcGxhbmFyUG9seWdvbkdlb21ldHJ5KCksIGNyZWF0ZUNvcGxhbmFyUG9seWdvbkdlb21ldHJ5X2V4cG9ydHMpKSwKICAgICAgICAiLi9jcmVhdGVDb3BsYW5hclBvbHlnb25PdXRsaW5lR2VvbWV0cnkuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZUNvcGxhbmFyUG9seWdvbk91dGxpbmVHZW9tZXRyeSgpLCBjcmVhdGVDb3BsYW5hclBvbHlnb25PdXRsaW5lR2VvbWV0cnlfZXhwb3J0cykpLAogICAgICAgICIuL2NyZWF0ZUNvcnJpZG9yR2VvbWV0cnkuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZUNvcnJpZG9yR2VvbWV0cnkoKSwgY3JlYXRlQ29ycmlkb3JHZW9tZXRyeV9leHBvcnRzKSksCiAgICAgICAgIi4vY3JlYXRlQ29ycmlkb3JPdXRsaW5lR2VvbWV0cnkuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZUNvcnJpZG9yT3V0bGluZUdlb21ldHJ5KCksIGNyZWF0ZUNvcnJpZG9yT3V0bGluZUdlb21ldHJ5X2V4cG9ydHMpKSwKICAgICAgICAiLi9jcmVhdGVDeWxpbmRlckdlb21ldHJ5LmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9jcmVhdGVDeWxpbmRlckdlb21ldHJ5KCksIGNyZWF0ZUN5bGluZGVyR2VvbWV0cnlfZXhwb3J0cykpLAogICAgICAgICIuL2NyZWF0ZUN5bGluZGVyT3V0bGluZUdlb21ldHJ5LmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9jcmVhdGVDeWxpbmRlck91dGxpbmVHZW9tZXRyeSgpLCBjcmVhdGVDeWxpbmRlck91dGxpbmVHZW9tZXRyeV9leHBvcnRzKSksCiAgICAgICAgIi4vY3JlYXRlRWxsaXBzZUdlb21ldHJ5LmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9jcmVhdGVFbGxpcHNlR2VvbWV0cnkoKSwgY3JlYXRlRWxsaXBzZUdlb21ldHJ5X2V4cG9ydHMpKSwKICAgICAgICAiLi9jcmVhdGVFbGxpcHNlT3V0bGluZUdlb21ldHJ5LmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9jcmVhdGVFbGxpcHNlT3V0bGluZUdlb21ldHJ5KCksIGNyZWF0ZUVsbGlwc2VPdXRsaW5lR2VvbWV0cnlfZXhwb3J0cykpLAogICAgICAgICIuL2NyZWF0ZUVsbGlwc29pZEdlb21ldHJ5LmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9jcmVhdGVFbGxpcHNvaWRHZW9tZXRyeSgpLCBjcmVhdGVFbGxpcHNvaWRHZW9tZXRyeV9leHBvcnRzKSksCiAgICAgICAgIi4vY3JlYXRlRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5LmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9jcmVhdGVFbGxpcHNvaWRPdXRsaW5lR2VvbWV0cnkoKSwgY3JlYXRlRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5X2V4cG9ydHMpKSwKICAgICAgICAiLi9jcmVhdGVGcnVzdHVtR2VvbWV0cnkuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZUZydXN0dW1HZW9tZXRyeSgpLCBjcmVhdGVGcnVzdHVtR2VvbWV0cnlfZXhwb3J0cykpLAogICAgICAgICIuL2NyZWF0ZUZydXN0dW1PdXRsaW5lR2VvbWV0cnkuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZUZydXN0dW1PdXRsaW5lR2VvbWV0cnkoKSwgY3JlYXRlRnJ1c3R1bU91dGxpbmVHZW9tZXRyeV9leHBvcnRzKSksCiAgICAgICAgIi4vY3JlYXRlR2VvbWV0cnkuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZUdlb21ldHJ5KCksIGNyZWF0ZUdlb21ldHJ5X2V4cG9ydHMpKSwKICAgICAgICAiLi9jcmVhdGVHcm91bmRQb2x5bGluZUdlb21ldHJ5LmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9jcmVhdGVHcm91bmRQb2x5bGluZUdlb21ldHJ5KCksIGNyZWF0ZUdyb3VuZFBvbHlsaW5lR2VvbWV0cnlfZXhwb3J0cykpLAogICAgICAgICIuL2NyZWF0ZVBsYW5lR2VvbWV0cnkuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZVBsYW5lR2VvbWV0cnkoKSwgY3JlYXRlUGxhbmVHZW9tZXRyeV9leHBvcnRzKSksCiAgICAgICAgIi4vY3JlYXRlUGxhbmVPdXRsaW5lR2VvbWV0cnkuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZVBsYW5lT3V0bGluZUdlb21ldHJ5KCksIGNyZWF0ZVBsYW5lT3V0bGluZUdlb21ldHJ5X2V4cG9ydHMpKSwKICAgICAgICAiLi9jcmVhdGVQb2x5Z29uR2VvbWV0cnkuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZVBvbHlnb25HZW9tZXRyeSgpLCBjcmVhdGVQb2x5Z29uR2VvbWV0cnlfZXhwb3J0cykpLAogICAgICAgICIuL2NyZWF0ZVBvbHlnb25PdXRsaW5lR2VvbWV0cnkuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZVBvbHlnb25PdXRsaW5lR2VvbWV0cnkoKSwgY3JlYXRlUG9seWdvbk91dGxpbmVHZW9tZXRyeV9leHBvcnRzKSksCiAgICAgICAgIi4vY3JlYXRlUG9seWxpbmVHZW9tZXRyeS5qcyI6ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gKGluaXRfY3JlYXRlUG9seWxpbmVHZW9tZXRyeSgpLCBjcmVhdGVQb2x5bGluZUdlb21ldHJ5X2V4cG9ydHMpKSwKICAgICAgICAiLi9jcmVhdGVQb2x5bGluZVZvbHVtZUdlb21ldHJ5LmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9jcmVhdGVQb2x5bGluZVZvbHVtZUdlb21ldHJ5KCksIGNyZWF0ZVBvbHlsaW5lVm9sdW1lR2VvbWV0cnlfZXhwb3J0cykpLAogICAgICAgICIuL2NyZWF0ZVBvbHlsaW5lVm9sdW1lT3V0bGluZUdlb21ldHJ5LmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9jcmVhdGVQb2x5bGluZVZvbHVtZU91dGxpbmVHZW9tZXRyeSgpLCBjcmVhdGVQb2x5bGluZVZvbHVtZU91dGxpbmVHZW9tZXRyeV9leHBvcnRzKSksCiAgICAgICAgIi4vY3JlYXRlUmVjdGFuZ2xlR2VvbWV0cnkuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZVJlY3RhbmdsZUdlb21ldHJ5KCksIGNyZWF0ZVJlY3RhbmdsZUdlb21ldHJ5X2V4cG9ydHMpKSwKICAgICAgICAiLi9jcmVhdGVSZWN0YW5nbGVPdXRsaW5lR2VvbWV0cnkuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZVJlY3RhbmdsZU91dGxpbmVHZW9tZXRyeSgpLCBjcmVhdGVSZWN0YW5nbGVPdXRsaW5lR2VvbWV0cnlfZXhwb3J0cykpLAogICAgICAgICIuL2NyZWF0ZVNpbXBsZVBvbHlsaW5lR2VvbWV0cnkuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZVNpbXBsZVBvbHlsaW5lR2VvbWV0cnkoKSwgY3JlYXRlU2ltcGxlUG9seWxpbmVHZW9tZXRyeV9leHBvcnRzKSksCiAgICAgICAgIi4vY3JlYXRlU3BoZXJlR2VvbWV0cnkuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZVNwaGVyZUdlb21ldHJ5KCksIGNyZWF0ZVNwaGVyZUdlb21ldHJ5X2V4cG9ydHMpKSwKICAgICAgICAiLi9jcmVhdGVTcGhlcmVPdXRsaW5lR2VvbWV0cnkuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZVNwaGVyZU91dGxpbmVHZW9tZXRyeSgpLCBjcmVhdGVTcGhlcmVPdXRsaW5lR2VvbWV0cnlfZXhwb3J0cykpLAogICAgICAgICIuL2NyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXIuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXIoKSwgY3JlYXRlVGFza1Byb2Nlc3Nvcldvcmtlcl9leHBvcnRzKSksCiAgICAgICAgIi4vY3JlYXRlVmVjdG9yVGlsZUNsYW1wZWRQb2x5bGluZXMuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZVZlY3RvclRpbGVDbGFtcGVkUG9seWxpbmVzKCksIGNyZWF0ZVZlY3RvclRpbGVDbGFtcGVkUG9seWxpbmVzX2V4cG9ydHMpKSwKICAgICAgICAiLi9jcmVhdGVWZWN0b3JUaWxlR2VvbWV0cmllcy5qcyI6ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gKGluaXRfY3JlYXRlVmVjdG9yVGlsZUdlb21ldHJpZXMoKSwgY3JlYXRlVmVjdG9yVGlsZUdlb21ldHJpZXNfZXhwb3J0cykpLAogICAgICAgICIuL2NyZWF0ZVZlY3RvclRpbGVQb2ludHMuanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2NyZWF0ZVZlY3RvclRpbGVQb2ludHMoKSwgY3JlYXRlVmVjdG9yVGlsZVBvaW50c19leHBvcnRzKSksCiAgICAgICAgIi4vY3JlYXRlVmVjdG9yVGlsZVBvbHlnb25zLmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9jcmVhdGVWZWN0b3JUaWxlUG9seWdvbnMoKSwgY3JlYXRlVmVjdG9yVGlsZVBvbHlnb25zX2V4cG9ydHMpKSwKICAgICAgICAiLi9jcmVhdGVWZWN0b3JUaWxlUG9seWxpbmVzLmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9jcmVhdGVWZWN0b3JUaWxlUG9seWxpbmVzKCksIGNyZWF0ZVZlY3RvclRpbGVQb2x5bGluZXNfZXhwb3J0cykpLAogICAgICAgICIuL2NyZWF0ZVZlcnRpY2VzRnJvbUdvb2dsZUVhcnRoRW50ZXJwcmlzZUJ1ZmZlci5qcyI6ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gKGluaXRfY3JlYXRlVmVydGljZXNGcm9tR29vZ2xlRWFydGhFbnRlcnByaXNlQnVmZmVyKCksIGNyZWF0ZVZlcnRpY2VzRnJvbUdvb2dsZUVhcnRoRW50ZXJwcmlzZUJ1ZmZlcl9leHBvcnRzKSksCiAgICAgICAgIi4vY3JlYXRlVmVydGljZXNGcm9tSGVpZ2h0bWFwLmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9jcmVhdGVWZXJ0aWNlc0Zyb21IZWlnaHRtYXAoKSwgY3JlYXRlVmVydGljZXNGcm9tSGVpZ2h0bWFwX2V4cG9ydHMpKSwKICAgICAgICAiLi9jcmVhdGVWZXJ0aWNlc0Zyb21RdWFudGl6ZWRUZXJyYWluTWVzaC5qcyI6ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gKGluaXRfY3JlYXRlVmVydGljZXNGcm9tUXVhbnRpemVkVGVycmFpbk1lc2goKSwgY3JlYXRlVmVydGljZXNGcm9tUXVhbnRpemVkVGVycmFpbk1lc2hfZXhwb3J0cykpLAogICAgICAgICIuL2NyZWF0ZVdhbGxHZW9tZXRyeS5qcyI6ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gKGluaXRfY3JlYXRlV2FsbEdlb21ldHJ5KCksIGNyZWF0ZVdhbGxHZW9tZXRyeV9leHBvcnRzKSksCiAgICAgICAgIi4vY3JlYXRlV2FsbE91dGxpbmVHZW9tZXRyeS5qcyI6ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gKGluaXRfY3JlYXRlV2FsbE91dGxpbmVHZW9tZXRyeSgpLCBjcmVhdGVXYWxsT3V0bGluZUdlb21ldHJ5X2V4cG9ydHMpKSwKICAgICAgICAiLi9kZWNvZGVEcmFjby5qcyI6ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gKGluaXRfZGVjb2RlRHJhY28oKSwgZGVjb2RlRHJhY29fZXhwb3J0cykpLAogICAgICAgICIuL2RlY29kZUdvb2dsZUVhcnRoRW50ZXJwcmlzZVBhY2tldC5qcyI6ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gKGluaXRfZGVjb2RlR29vZ2xlRWFydGhFbnRlcnByaXNlUGFja2V0KCksIGRlY29kZUdvb2dsZUVhcnRoRW50ZXJwcmlzZVBhY2tldF9leHBvcnRzKSksCiAgICAgICAgIi4vZGVjb2RlSTNTLmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9kZWNvZGVJM1MoKSwgZGVjb2RlSTNTX2V4cG9ydHMpKSwKICAgICAgICAiLi9nYXVzc2lhblNwbGF0U29ydGVyLmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9nYXVzc2lhblNwbGF0U29ydGVyKCksIGdhdXNzaWFuU3BsYXRTb3J0ZXJfZXhwb3J0cykpLAogICAgICAgICIuL2dhdXNzaWFuU3BsYXRUZXh0dXJlR2VuZXJhdG9yLmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF9nYXVzc2lhblNwbGF0VGV4dHVyZUdlbmVyYXRvcigpLCBnYXVzc2lhblNwbGF0VGV4dHVyZUdlbmVyYXRvcl9leHBvcnRzKSksCiAgICAgICAgIi4vdHJhbnNjb2RlS1RYMi5qcyI6ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gKGluaXRfdHJhbnNjb2RlS1RYMigpLCB0cmFuc2NvZGVLVFgyX2V4cG9ydHMpKSwKICAgICAgICAiLi90cmFuc2ZlclR5cGVkQXJyYXlUZXN0LmpzIjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoaW5pdF90cmFuc2ZlclR5cGVkQXJyYXlUZXN0KCksIHRyYW5zZmVyVHlwZWRBcnJheVRlc3RfZXhwb3J0cykpLAogICAgICAgICIuL3Vwc2FtcGxlUXVhbnRpemVkVGVycmFpbk1lc2guanMiOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X3Vwc2FtcGxlUXVhbnRpemVkVGVycmFpbk1lc2goKSwgdXBzYW1wbGVRdWFudGl6ZWRUZXJyYWluTWVzaF9leHBvcnRzKSkKICAgICAgfSk7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvV29ya2Vycy9jcmVhdGVHZW9tZXRyeS5qcwogIHZhciBjcmVhdGVHZW9tZXRyeV9leHBvcnRzID0ge307CiAgX19leHBvcnQoY3JlYXRlR2VvbWV0cnlfZXhwb3J0cywgewogICAgZGVmYXVsdDogKCkgPT4gY3JlYXRlR2VvbWV0cnlfZGVmYXVsdAogIH0pOwogIGFzeW5jIGZ1bmN0aW9uIGdldE1vZHVsZShtb2R1bGVOYW1lLCBtb2R1bGVQYXRoKSB7CiAgICBsZXQgbW9kdWxlID0gbW9kdWxlQ2FjaGVbbW9kdWxlUGF0aF0gPz8gbW9kdWxlQ2FjaGVbbW9kdWxlTmFtZV07CiAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG1vZHVsZSkpIHsKICAgICAgcmV0dXJuIG1vZHVsZTsKICAgIH0KICAgIGlmIChkZWZpbmVkX2RlZmF1bHQobW9kdWxlUGF0aCkpIHsKICAgICAgaWYgKHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IikgewogICAgICAgIG1vZHVsZSA9IF9fcmVxdWlyZShtb2R1bGVQYXRoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbXBvcnQobW9kdWxlUGF0aCk7CiAgICAgICAgbW9kdWxlID0gcmVzdWx0LmRlZmF1bHQ7CiAgICAgIH0KICAgICAgbW9kdWxlQ2FjaGVbbW9kdWxlUGF0aF0gPSBtb2R1bGU7CiAgICAgIHJldHVybiBtb2R1bGU7CiAgICB9CiAgICBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICJvYmplY3QiKSB7CiAgICAgIG1vZHVsZSA9IF9fcmVxdWlyZShgV29ya2Vycy8ke21vZHVsZU5hbWV9YCk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCByZXN1bHQgPSBkZWZpbmVkX2RlZmF1bHQobW9kdWxlUGF0aCkgPyBhd2FpdCBpbXBvcnQobW9kdWxlUGF0aCkgOiBhd2FpdCBnbG9iSW1wb3J0X2pzKGAuLyR7bW9kdWxlTmFtZX0uanNgKTsKICAgICAgbW9kdWxlID0gcmVzdWx0LmRlZmF1bHQ7CiAgICB9CiAgICBtb2R1bGVDYWNoZVttb2R1bGVOYW1lXSA9IG1vZHVsZTsKICAgIHJldHVybiBtb2R1bGU7CiAgfQogIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUdlb21ldHJ5KHBhcmFtZXRlcnMsIHRyYW5zZmVyYWJsZU9iamVjdHMpIHsKICAgIGNvbnN0IHN1YlRhc2tzID0gcGFyYW1ldGVycy5zdWJUYXNrczsKICAgIGNvbnN0IGxlbmd0aCA9IHN1YlRhc2tzLmxlbmd0aDsKICAgIGNvbnN0IHJlc3VsdHNPclByb21pc2VzID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IHRhc2sgPSBzdWJUYXNrc1tpXTsKICAgICAgY29uc3QgZ2VvbWV0cnkgPSB0YXNrLmdlb21ldHJ5OwogICAgICBjb25zdCBtb2R1bGVOYW1lID0gdGFzay5tb2R1bGVOYW1lOwogICAgICBjb25zdCBtb2R1bGVQYXRoID0gdGFzay5tb2R1bGVQYXRoOwogICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KG1vZHVsZU5hbWUpICYmIGRlZmluZWRfZGVmYXVsdChtb2R1bGVQYXRoKSkgewogICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJNdXN0IG9ubHkgc2V0IG1vZHVsZU5hbWUgb3IgbW9kdWxlUGF0aCIpOwogICAgICB9CiAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQobW9kdWxlTmFtZSkgfHwgZGVmaW5lZF9kZWZhdWx0KG1vZHVsZVBhdGgpKSB7CiAgICAgICAgcmVzdWx0c09yUHJvbWlzZXNbaV0gPSBnZXRNb2R1bGUobW9kdWxlTmFtZSwgbW9kdWxlUGF0aCkudGhlbigKICAgICAgICAgIChjcmVhdGVGdW5jdGlvbikgPT4gY3JlYXRlRnVuY3Rpb24oZ2VvbWV0cnksIHRhc2sub2Zmc2V0KQogICAgICAgICk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0c09yUHJvbWlzZXNbaV0gPSBnZW9tZXRyeTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIFByb21pc2UuYWxsKHJlc3VsdHNPclByb21pc2VzKS50aGVuKGZ1bmN0aW9uKHJlc3VsdHMpIHsKICAgICAgcmV0dXJuIFByaW1pdGl2ZVBpcGVsaW5lX2RlZmF1bHQucGFja0NyZWF0ZUdlb21ldHJ5UmVzdWx0cygKICAgICAgICByZXN1bHRzLAogICAgICAgIHRyYW5zZmVyYWJsZU9iamVjdHMKICAgICAgKTsKICAgIH0pOwogIH0KICB2YXIgbW9kdWxlQ2FjaGUsIGNyZWF0ZUdlb21ldHJ5X2RlZmF1bHQ7CiAgdmFyIGluaXRfY3JlYXRlR2VvbWV0cnkgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Xb3JrZXJzL2NyZWF0ZUdlb21ldHJ5LmpzIigpIHsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9QcmltaXRpdmVQaXBlbGluZSgpOwogICAgICBpbml0X2NyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXIoKTsKICAgICAgaW5pdF8oKTsKICAgICAgbW9kdWxlQ2FjaGUgPSB7fTsKICAgICAgY3JlYXRlR2VvbWV0cnlfZGVmYXVsdCA9IGNyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXJfZGVmYXVsdChjcmVhdGVHZW9tZXRyeSk7CiAgICB9CiAgfSk7CgogIC8vIDxzdGRpbj4KICB2YXIgc3RkaW5fZXhwb3J0cyA9IHt9OwogIF9fZXhwb3J0KHN0ZGluX2V4cG9ydHMsIHsKICAgIGNvbWJpbmVHZW9tZXRyeTogKCkgPT4gY29tYmluZUdlb21ldHJ5MiwKICAgIGNyZWF0ZUJveEdlb21ldHJ5OiAoKSA9PiBjcmVhdGVCb3hHZW9tZXRyeTIsCiAgICBjcmVhdGVCb3hPdXRsaW5lR2VvbWV0cnk6ICgpID0+IGNyZWF0ZUJveE91dGxpbmVHZW9tZXRyeTIsCiAgICBjcmVhdGVDaXJjbGVHZW9tZXRyeTogKCkgPT4gY3JlYXRlQ2lyY2xlR2VvbWV0cnkyLAogICAgY3JlYXRlQ2lyY2xlT3V0bGluZUdlb21ldHJ5OiAoKSA9PiBjcmVhdGVDaXJjbGVPdXRsaW5lR2VvbWV0cnkyLAogICAgY3JlYXRlQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnk6ICgpID0+IGNyZWF0ZUNvcGxhbmFyUG9seWdvbkdlb21ldHJ5MiwKICAgIGNyZWF0ZUNvcGxhbmFyUG9seWdvbk91dGxpbmVHZW9tZXRyeTogKCkgPT4gY3JlYXRlQ29wbGFuYXJQb2x5Z29uT3V0bGluZUdlb21ldHJ5MiwKICAgIGNyZWF0ZUNvcnJpZG9yR2VvbWV0cnk6ICgpID0+IGNyZWF0ZUNvcnJpZG9yR2VvbWV0cnkyLAogICAgY3JlYXRlQ29ycmlkb3JPdXRsaW5lR2VvbWV0cnk6ICgpID0+IGNyZWF0ZUNvcnJpZG9yT3V0bGluZUdlb21ldHJ5MiwKICAgIGNyZWF0ZUN5bGluZGVyR2VvbWV0cnk6ICgpID0+IGNyZWF0ZUN5bGluZGVyR2VvbWV0cnkyLAogICAgY3JlYXRlQ3lsaW5kZXJPdXRsaW5lR2VvbWV0cnk6ICgpID0+IGNyZWF0ZUN5bGluZGVyT3V0bGluZUdlb21ldHJ5MiwKICAgIGNyZWF0ZUVsbGlwc2VHZW9tZXRyeTogKCkgPT4gY3JlYXRlRWxsaXBzZUdlb21ldHJ5MiwKICAgIGNyZWF0ZUVsbGlwc2VPdXRsaW5lR2VvbWV0cnk6ICgpID0+IGNyZWF0ZUVsbGlwc2VPdXRsaW5lR2VvbWV0cnkyLAogICAgY3JlYXRlRWxsaXBzb2lkR2VvbWV0cnk6ICgpID0+IGNyZWF0ZUVsbGlwc29pZEdlb21ldHJ5MiwKICAgIGNyZWF0ZUVsbGlwc29pZE91dGxpbmVHZW9tZXRyeTogKCkgPT4gY3JlYXRlRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5MiwKICAgIGNyZWF0ZUZydXN0dW1HZW9tZXRyeTogKCkgPT4gY3JlYXRlRnJ1c3R1bUdlb21ldHJ5MiwKICAgIGNyZWF0ZUZydXN0dW1PdXRsaW5lR2VvbWV0cnk6ICgpID0+IGNyZWF0ZUZydXN0dW1PdXRsaW5lR2VvbWV0cnkyLAogICAgY3JlYXRlR2VvbWV0cnk6ICgpID0+IGNyZWF0ZUdlb21ldHJ5MiwKICAgIGNyZWF0ZUdyb3VuZFBvbHlsaW5lR2VvbWV0cnk6ICgpID0+IGNyZWF0ZUdyb3VuZFBvbHlsaW5lR2VvbWV0cnkyLAogICAgY3JlYXRlUGxhbmVHZW9tZXRyeTogKCkgPT4gY3JlYXRlUGxhbmVHZW9tZXRyeTIsCiAgICBjcmVhdGVQbGFuZU91dGxpbmVHZW9tZXRyeTogKCkgPT4gY3JlYXRlUGxhbmVPdXRsaW5lR2VvbWV0cnkyLAogICAgY3JlYXRlUG9seWdvbkdlb21ldHJ5OiAoKSA9PiBjcmVhdGVQb2x5Z29uR2VvbWV0cnkyLAogICAgY3JlYXRlUG9seWdvbk91dGxpbmVHZW9tZXRyeTogKCkgPT4gY3JlYXRlUG9seWdvbk91dGxpbmVHZW9tZXRyeTIsCiAgICBjcmVhdGVQb2x5bGluZUdlb21ldHJ5OiAoKSA9PiBjcmVhdGVQb2x5bGluZUdlb21ldHJ5MiwKICAgIGNyZWF0ZVBvbHlsaW5lVm9sdW1lR2VvbWV0cnk6ICgpID0+IGNyZWF0ZVBvbHlsaW5lVm9sdW1lR2VvbWV0cnkyLAogICAgY3JlYXRlUG9seWxpbmVWb2x1bWVPdXRsaW5lR2VvbWV0cnk6ICgpID0+IGNyZWF0ZVBvbHlsaW5lVm9sdW1lT3V0bGluZUdlb21ldHJ5MiwKICAgIGNyZWF0ZVJlY3RhbmdsZUdlb21ldHJ5OiAoKSA9PiBjcmVhdGVSZWN0YW5nbGVHZW9tZXRyeTIsCiAgICBjcmVhdGVSZWN0YW5nbGVPdXRsaW5lR2VvbWV0cnk6ICgpID0+IGNyZWF0ZVJlY3RhbmdsZU91dGxpbmVHZW9tZXRyeTIsCiAgICBjcmVhdGVTaW1wbGVQb2x5bGluZUdlb21ldHJ5OiAoKSA9PiBjcmVhdGVTaW1wbGVQb2x5bGluZUdlb21ldHJ5MiwKICAgIGNyZWF0ZVNwaGVyZUdlb21ldHJ5OiAoKSA9PiBjcmVhdGVTcGhlcmVHZW9tZXRyeTIsCiAgICBjcmVhdGVTcGhlcmVPdXRsaW5lR2VvbWV0cnk6ICgpID0+IGNyZWF0ZVNwaGVyZU91dGxpbmVHZW9tZXRyeTIsCiAgICBjcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyOiAoKSA9PiBjcmVhdGVUYXNrUHJvY2Vzc29yV29ya2VyMiwKICAgIGNyZWF0ZVZlY3RvclRpbGVDbGFtcGVkUG9seWxpbmVzOiAoKSA9PiBjcmVhdGVWZWN0b3JUaWxlQ2xhbXBlZFBvbHlsaW5lczIsCiAgICBjcmVhdGVWZWN0b3JUaWxlR2VvbWV0cmllczogKCkgPT4gY3JlYXRlVmVjdG9yVGlsZUdlb21ldHJpZXMyLAogICAgY3JlYXRlVmVjdG9yVGlsZVBvaW50czogKCkgPT4gY3JlYXRlVmVjdG9yVGlsZVBvaW50czIsCiAgICBjcmVhdGVWZWN0b3JUaWxlUG9seWdvbnM6ICgpID0+IGNyZWF0ZVZlY3RvclRpbGVQb2x5Z29uczIsCiAgICBjcmVhdGVWZWN0b3JUaWxlUG9seWxpbmVzOiAoKSA9PiBjcmVhdGVWZWN0b3JUaWxlUG9seWxpbmVzMiwKICAgIGNyZWF0ZVZlcnRpY2VzRnJvbUdvb2dsZUVhcnRoRW50ZXJwcmlzZUJ1ZmZlcjogKCkgPT4gY3JlYXRlVmVydGljZXNGcm9tR29vZ2xlRWFydGhFbnRlcnByaXNlQnVmZmVyMiwKICAgIGNyZWF0ZVZlcnRpY2VzRnJvbUhlaWdodG1hcDogKCkgPT4gY3JlYXRlVmVydGljZXNGcm9tSGVpZ2h0bWFwMiwKICAgIGNyZWF0ZVZlcnRpY2VzRnJvbVF1YW50aXplZFRlcnJhaW5NZXNoOiAoKSA9PiBjcmVhdGVWZXJ0aWNlc0Zyb21RdWFudGl6ZWRUZXJyYWluTWVzaDIsCiAgICBjcmVhdGVXYWxsR2VvbWV0cnk6ICgpID0+IGNyZWF0ZVdhbGxHZW9tZXRyeTIsCiAgICBjcmVhdGVXYWxsT3V0bGluZUdlb21ldHJ5OiAoKSA9PiBjcmVhdGVXYWxsT3V0bGluZUdlb21ldHJ5MiwKICAgIGRlY29kZURyYWNvOiAoKSA9PiBkZWNvZGVEcmFjbzIsCiAgICBkZWNvZGVHb29nbGVFYXJ0aEVudGVycHJpc2VQYWNrZXQ6ICgpID0+IGRlY29kZUdvb2dsZUVhcnRoRW50ZXJwcmlzZVBhY2tldDIsCiAgICBkZWNvZGVJM1M6ICgpID0+IGRlY29kZUkzUzIsCiAgICBnYXVzc2lhblNwbGF0U29ydGVyOiAoKSA9PiBnYXVzc2lhblNwbGF0U29ydGVyLAogICAgZ2F1c3NpYW5TcGxhdFRleHR1cmVHZW5lcmF0b3I6ICgpID0+IGdhdXNzaWFuU3BsYXRUZXh0dXJlR2VuZXJhdG9yLAogICAgdHJhbnNjb2RlS1RYMjogKCkgPT4gdHJhbnNjb2RlS1RYMjIsCiAgICB0cmFuc2ZlclR5cGVkQXJyYXlUZXN0OiAoKSA9PiB0cmFuc2ZlclR5cGVkQXJyYXlUZXN0LAogICAgdXBzYW1wbGVRdWFudGl6ZWRUZXJyYWluTWVzaDogKCkgPT4gdXBzYW1wbGVRdWFudGl6ZWRUZXJyYWluTWVzaDIKICB9KTsKICB2YXIgY29tYmluZUdlb21ldHJ5MiA9ICgpID0+IHsKICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gaW5pdF9jb21iaW5lR2VvbWV0cnkoKSk7CiAgfTsKICB2YXIgY3JlYXRlQm94R2VvbWV0cnkyID0gKCkgPT4gewogICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbml0X2NyZWF0ZUJveEdlb21ldHJ5KCkpOwogIH07CiAgdmFyIGNyZWF0ZUJveE91dGxpbmVHZW9tZXRyeTIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfY3JlYXRlQm94T3V0bGluZUdlb21ldHJ5KCkpOwogIH07CiAgdmFyIGNyZWF0ZUNpcmNsZUdlb21ldHJ5MiA9ICgpID0+IHsKICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gaW5pdF9jcmVhdGVDaXJjbGVHZW9tZXRyeSgpKTsKICB9OwogIHZhciBjcmVhdGVDaXJjbGVPdXRsaW5lR2VvbWV0cnkyID0gKCkgPT4gewogICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbml0X2NyZWF0ZUNpcmNsZU91dGxpbmVHZW9tZXRyeSgpKTsKICB9OwogIHZhciBjcmVhdGVDb3BsYW5hclBvbHlnb25HZW9tZXRyeTIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfY3JlYXRlQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnkoKSk7CiAgfTsKICB2YXIgY3JlYXRlQ29wbGFuYXJQb2x5Z29uT3V0bGluZUdlb21ldHJ5MiA9ICgpID0+IHsKICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gaW5pdF9jcmVhdGVDb3BsYW5hclBvbHlnb25PdXRsaW5lR2VvbWV0cnkoKSk7CiAgfTsKICB2YXIgY3JlYXRlQ29ycmlkb3JHZW9tZXRyeTIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfY3JlYXRlQ29ycmlkb3JHZW9tZXRyeSgpKTsKICB9OwogIHZhciBjcmVhdGVDb3JyaWRvck91dGxpbmVHZW9tZXRyeTIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfY3JlYXRlQ29ycmlkb3JPdXRsaW5lR2VvbWV0cnkoKSk7CiAgfTsKICB2YXIgY3JlYXRlQ3lsaW5kZXJHZW9tZXRyeTIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfY3JlYXRlQ3lsaW5kZXJHZW9tZXRyeSgpKTsKICB9OwogIHZhciBjcmVhdGVDeWxpbmRlck91dGxpbmVHZW9tZXRyeTIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfY3JlYXRlQ3lsaW5kZXJPdXRsaW5lR2VvbWV0cnkoKSk7CiAgfTsKICB2YXIgY3JlYXRlRWxsaXBzZUdlb21ldHJ5MiA9ICgpID0+IHsKICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gaW5pdF9jcmVhdGVFbGxpcHNlR2VvbWV0cnkoKSk7CiAgfTsKICB2YXIgY3JlYXRlRWxsaXBzZU91dGxpbmVHZW9tZXRyeTIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfY3JlYXRlRWxsaXBzZU91dGxpbmVHZW9tZXRyeSgpKTsKICB9OwogIHZhciBjcmVhdGVFbGxpcHNvaWRHZW9tZXRyeTIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfY3JlYXRlRWxsaXBzb2lkR2VvbWV0cnkoKSk7CiAgfTsKICB2YXIgY3JlYXRlRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5MiA9ICgpID0+IHsKICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gaW5pdF9jcmVhdGVFbGxpcHNvaWRPdXRsaW5lR2VvbWV0cnkoKSk7CiAgfTsKICB2YXIgY3JlYXRlRnJ1c3R1bUdlb21ldHJ5MiA9ICgpID0+IHsKICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gaW5pdF9jcmVhdGVGcnVzdHVtR2VvbWV0cnkoKSk7CiAgfTsKICB2YXIgY3JlYXRlRnJ1c3R1bU91dGxpbmVHZW9tZXRyeTIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfY3JlYXRlRnJ1c3R1bU91dGxpbmVHZW9tZXRyeSgpKTsKICB9OwogIHZhciBjcmVhdGVHZW9tZXRyeTIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfY3JlYXRlR2VvbWV0cnkoKSk7CiAgfTsKICB2YXIgY3JlYXRlR3JvdW5kUG9seWxpbmVHZW9tZXRyeTIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfY3JlYXRlR3JvdW5kUG9seWxpbmVHZW9tZXRyeSgpKTsKICB9OwogIHZhciBjcmVhdGVQbGFuZUdlb21ldHJ5MiA9ICgpID0+IHsKICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gaW5pdF9jcmVhdGVQbGFuZUdlb21ldHJ5KCkpOwogIH07CiAgdmFyIGNyZWF0ZVBsYW5lT3V0bGluZUdlb21ldHJ5MiA9ICgpID0+IHsKICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gaW5pdF9jcmVhdGVQbGFuZU91dGxpbmVHZW9tZXRyeSgpKTsKICB9OwogIHZhciBjcmVhdGVQb2x5Z29uR2VvbWV0cnkyID0gKCkgPT4gewogICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbml0X2NyZWF0ZVBvbHlnb25HZW9tZXRyeSgpKTsKICB9OwogIHZhciBjcmVhdGVQb2x5Z29uT3V0bGluZUdlb21ldHJ5MiA9ICgpID0+IHsKICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gaW5pdF9jcmVhdGVQb2x5Z29uT3V0bGluZUdlb21ldHJ5KCkpOwogIH07CiAgdmFyIGNyZWF0ZVBvbHlsaW5lR2VvbWV0cnkyID0gKCkgPT4gewogICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbml0X2NyZWF0ZVBvbHlsaW5lR2VvbWV0cnkoKSk7CiAgfTsKICB2YXIgY3JlYXRlUG9seWxpbmVWb2x1bWVHZW9tZXRyeTIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfY3JlYXRlUG9seWxpbmVWb2x1bWVHZW9tZXRyeSgpKTsKICB9OwogIHZhciBjcmVhdGVQb2x5bGluZVZvbHVtZU91dGxpbmVHZW9tZXRyeTIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfY3JlYXRlUG9seWxpbmVWb2x1bWVPdXRsaW5lR2VvbWV0cnkoKSk7CiAgfTsKICB2YXIgY3JlYXRlUmVjdGFuZ2xlR2VvbWV0cnkyID0gKCkgPT4gewogICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbml0X2NyZWF0ZVJlY3RhbmdsZUdlb21ldHJ5KCkpOwogIH07CiAgdmFyIGNyZWF0ZVJlY3RhbmdsZU91dGxpbmVHZW9tZXRyeTIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfY3JlYXRlUmVjdGFuZ2xlT3V0bGluZUdlb21ldHJ5KCkpOwogIH07CiAgdmFyIGNyZWF0ZVNpbXBsZVBvbHlsaW5lR2VvbWV0cnkyID0gKCkgPT4gewogICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbml0X2NyZWF0ZVNpbXBsZVBvbHlsaW5lR2VvbWV0cnkoKSk7CiAgfTsKICB2YXIgY3JlYXRlU3BoZXJlR2VvbWV0cnkyID0gKCkgPT4gewogICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbml0X2NyZWF0ZVNwaGVyZUdlb21ldHJ5KCkpOwogIH07CiAgdmFyIGNyZWF0ZVNwaGVyZU91dGxpbmVHZW9tZXRyeTIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfY3JlYXRlU3BoZXJlT3V0bGluZUdlb21ldHJ5KCkpOwogIH07CiAgdmFyIGNyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXIyID0gKCkgPT4gewogICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbml0X2NyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXIoKSk7CiAgfTsKICB2YXIgY3JlYXRlVmVjdG9yVGlsZUNsYW1wZWRQb2x5bGluZXMyID0gKCkgPT4gewogICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbml0X2NyZWF0ZVZlY3RvclRpbGVDbGFtcGVkUG9seWxpbmVzKCkpOwogIH07CiAgdmFyIGNyZWF0ZVZlY3RvclRpbGVHZW9tZXRyaWVzMiA9ICgpID0+IHsKICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gaW5pdF9jcmVhdGVWZWN0b3JUaWxlR2VvbWV0cmllcygpKTsKICB9OwogIHZhciBjcmVhdGVWZWN0b3JUaWxlUG9pbnRzMiA9ICgpID0+IHsKICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gaW5pdF9jcmVhdGVWZWN0b3JUaWxlUG9pbnRzKCkpOwogIH07CiAgdmFyIGNyZWF0ZVZlY3RvclRpbGVQb2x5Z29uczIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfY3JlYXRlVmVjdG9yVGlsZVBvbHlnb25zKCkpOwogIH07CiAgdmFyIGNyZWF0ZVZlY3RvclRpbGVQb2x5bGluZXMyID0gKCkgPT4gewogICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbml0X2NyZWF0ZVZlY3RvclRpbGVQb2x5bGluZXMoKSk7CiAgfTsKICB2YXIgY3JlYXRlVmVydGljZXNGcm9tR29vZ2xlRWFydGhFbnRlcnByaXNlQnVmZmVyMiA9ICgpID0+IHsKICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gaW5pdF9jcmVhdGVWZXJ0aWNlc0Zyb21Hb29nbGVFYXJ0aEVudGVycHJpc2VCdWZmZXIoKSk7CiAgfTsKICB2YXIgY3JlYXRlVmVydGljZXNGcm9tSGVpZ2h0bWFwMiA9ICgpID0+IHsKICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gaW5pdF9jcmVhdGVWZXJ0aWNlc0Zyb21IZWlnaHRtYXAoKSk7CiAgfTsKICB2YXIgY3JlYXRlVmVydGljZXNGcm9tUXVhbnRpemVkVGVycmFpbk1lc2gyID0gKCkgPT4gewogICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbml0X2NyZWF0ZVZlcnRpY2VzRnJvbVF1YW50aXplZFRlcnJhaW5NZXNoKCkpOwogIH07CiAgdmFyIGNyZWF0ZVdhbGxHZW9tZXRyeTIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfY3JlYXRlV2FsbEdlb21ldHJ5KCkpOwogIH07CiAgdmFyIGNyZWF0ZVdhbGxPdXRsaW5lR2VvbWV0cnkyID0gKCkgPT4gewogICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbml0X2NyZWF0ZVdhbGxPdXRsaW5lR2VvbWV0cnkoKSk7CiAgfTsKICB2YXIgZGVjb2RlRHJhY28yID0gKCkgPT4gewogICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbml0X2RlY29kZURyYWNvKCkpOwogIH07CiAgdmFyIGRlY29kZUdvb2dsZUVhcnRoRW50ZXJwcmlzZVBhY2tldDIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfZGVjb2RlR29vZ2xlRWFydGhFbnRlcnByaXNlUGFja2V0KCkpOwogIH07CiAgdmFyIGRlY29kZUkzUzIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfZGVjb2RlSTNTKCkpOwogIH07CiAgdmFyIGdhdXNzaWFuU3BsYXRTb3J0ZXIgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfZ2F1c3NpYW5TcGxhdFNvcnRlcigpKTsKICB9OwogIHZhciBnYXVzc2lhblNwbGF0VGV4dHVyZUdlbmVyYXRvciA9ICgpID0+IHsKICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gaW5pdF9nYXVzc2lhblNwbGF0VGV4dHVyZUdlbmVyYXRvcigpKTsKICB9OwogIHZhciB0cmFuc2NvZGVLVFgyMiA9ICgpID0+IHsKICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gaW5pdF90cmFuc2NvZGVLVFgyKCkpOwogIH07CiAgdmFyIHRyYW5zZmVyVHlwZWRBcnJheVRlc3QgPSAoKSA9PiB7CiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGluaXRfdHJhbnNmZXJUeXBlZEFycmF5VGVzdCgpKTsKICB9OwogIHZhciB1cHNhbXBsZVF1YW50aXplZFRlcnJhaW5NZXNoMiA9ICgpID0+IHsKICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gaW5pdF91cHNhbXBsZVF1YW50aXplZFRlcnJhaW5NZXNoKCkpOwogIH07CiAgcmV0dXJuIF9fdG9Db21tb25KUyhzdGRpbl9leHBvcnRzKTsKfSkoKTsK");