Medicare Pathway
The interactive Medicare tool couldn’t load on this page. Please contact a BKM advisor and we’ll walk through your Medicare options with you.
Unlock your full report
See your complete Medicare plan Enter your contact information to view and download your full personalized report. A BKM advisor may follow up to answer your questions.
This interactive tool needs JavaScript. Please enable it in your browser, or contact a BKM advisor .
CihmdW5jdGlvbiAoKSB7CiAgInVzZSBzdHJpY3QiOwogIGZ1bmN0aW9uIGluaXQoKSB7CiAgICB2YXIgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJia21tcCIpOwogICAgaWYgKCFyb290IHx8IHJvb3QuZ2V0QXR0cmlidXRlKCJkYXRhLXJlYWR5IikpIHJldHVybjsKICAgIHJvb3Quc2V0QXR0cmlidXRlKCJkYXRhLXJlYWR5IiwgIjEiKTsKICAgIHZhciBCT09LSU5HX1VSTCA9ICJodHRwczovL291dGxvb2sub2ZmaWNlLmNvbS9ib29rL0JLTVdlYWx0aE1hbmFnZW1lbnQxQGJrbXdtLmNvbS9zL0FOSG5hMko4SlVpQjFBcVh6bHdlalEyP2lzbXNhbGpzYXV0aGVuYWJsZWQiOwogICAgdmFyIFdFQlNJVEVfVVJMID0gImh0dHBzOi8vd3d3LmJrbXdtLmNvbSI7CiAgICB2YXIgTU9OVEhTID0gWyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdOwogICAgdmFyIHRvZGF5ID0gbmV3IERhdGUoKTsKICAgIHZhciBOT1cgPSB7IHk6IHRvZGF5LmdldEZ1bGxZZWFyKCksIG06IHRvZGF5LmdldE1vbnRoKCkgKyAxLCBkOiB0b2RheS5nZXREYXRlKCkgfTsKICAgIHZhciBUT0RBWSA9IHsgeTogTk9XLnksIG06IE5PVy5tLCBkOiBOT1cuZCB9OwogICAgLyogLS0tLS0tLS0tLSBkYXRlIGhlbHBlcnMgKG1vbnRocyAxLTEyKSAtLS0tLS0tLS0tICovCiAgICBmdW5jdGlvbiB5bSh5LCBtKSB7IHJldHVybiB7IHk6IHkgKyBNYXRoLmZsb29yKChtIC0gMSkgLyAxMiksIG06ICgoKChtIC0gMSkgJSAxMikgKyAxMikgJSAxMikgKyAxIH07IH0KICAgIGZ1bmN0aW9uIGFkZE1vbnRocyhwLCBkKSB7IHJldHVybiB5bShwLnksIHAubSArIGQpOyB9CiAgICBmdW5jdGlvbiBjbXAoYSwgYikgeyByZXR1cm4gKGEueSAtIGIueSkgfHwgKGEubSAtIGIubSk7IH0KICAgIGZ1bmN0aW9uIG1heFAoYSwgYikgeyByZXR1cm4gY21wKGEsIGIpID49IDAgPyBhIDogYjsgfQogICAgZnVuY3Rpb24gZm10KHApIHsgcmV0dXJuIE1PTlRIU1twLm0gLSAxXSArICIgIiArIHAueTsgfQogICAgZnVuY3Rpb24gc3BhbihhLCBiKSB7IHJldHVybiBjbXAoYSwgYikgPT09IDAgPyBmbXQoYSkgOiBmbXQoYSkgKyAiIFx1MjAxMyAiICsgZm10KGIpOyB9CiAgICBmdW5jdGlvbiBlZmY2NShiLCBmaXJzdCkgeyB2YXIgcCA9IHsgeTogYi55ICsgNjUsIG06IGIubSB9OyByZXR1cm4gZmlyc3QgPyBhZGRNb250aHMocCwgLTEpIDogcDsgfQogICAgZnVuY3Rpb24gZ2VwVGV4dCgpIHsgcmV0dXJuIE5PVy5tIDw9IDMgPyAiSmFudWFyeSAxIFx1MjAxMyBNYXJjaCAzMSwgIiArIE5PVy55ICsgIiAob3BlbiBub3cpIiA6ICJKYW51YXJ5IDEgXHUyMDEzIE1hcmNoIDMxLCAiICsgKE5PVy55ICsgMSk7IH0KICAgIGZ1bmN0aW9uIG9lcFRleHQoKSB7CiAgICAgIHZhciBvcGVuID0gTk9XLm0gPT09IDEwIHx8IE5PVy5tID09PSAxMSB8fCAoTk9XLm0gPT09IDEyICYmIE5PVy5kIDw9IDcpOwogICAgICB2YXIgeSA9IChOT1cubSA9PT0gMTIgJiYgTk9XLmQgPiA3KSA/IE5PVy55ICsgMSA6IE5PVy55OwogICAgICByZXR1cm4gIk9jdG9iZXIgMTUgXHUyMDEzIERlY2VtYmVyIDcsICIgKyB5ICsgKG9wZW4gPyAiIChvcGVuIG5vdykiIDogIiIpOwogICAgfQogICAgLyogLS0tLS0tLS0tLSBwcmVmZXJlbmNlIHF1ZXN0aW9ucyAtLS0tLS0tLS0tICovCiAgICB2YXIgQ0hPSUNFX1FVRVNUSU9OUyA9IFsKICAgICAgeyBpZDogInByb3ZpZGVycyIsIGV5ZWJyb3c6ICJZb3VyIGRvY3RvcnMiLCB0aXRsZTogIkhvdyBpbXBvcnRhbnQgaXMgY2hvb3NpbmcgeW91ciBvd24gZG9jdG9ycz8iLCBvcHRpb25zOiBbCiAgICAgICAgeyB2YWx1ZTogImFueV9kb2N0b3IiLCBsYWJlbDogIlZlcnkgXHUyMDE0IEkgd2FudCBhbnkgZG9jdG9yIG9yIHNwZWNpYWxpc3QsIG5vIG5ldHdvcmtzIG9yIHJlZmVycmFscyIsIHNjb3JlOiB7IG06IDIsIGE6IDAgfSB9LAogICAgICAgIHsgdmFsdWU6ICJuZXR3b3JrX29rIiwgbGFiZWw6ICJJJ20gY29tZm9ydGFibGUgdXNpbmcgYSBwbGFuJ3MgbmV0d29yayBvZiBkb2N0b3JzIiwgc2NvcmU6IHsgbTogMCwgYTogMiB9IH0sCiAgICAgICAgeyB2YWx1ZTogIm5vX3ByZWYiLCBsYWJlbDogIk5vIHN0cm9uZyBwcmVmZXJlbmNlIiwgc2NvcmU6IHsgbTogMCwgYTogMCB9IH0gXSB9LAogICAgICB7IGlkOiAidHJhdmVsIiwgZXllYnJvdzogIldoZXJlIHlvdSBsaXZlIiwgdGl0bGU6ICJIb3cgbXVjaCBkbyB5b3UgdHJhdmVsIG9yIGxpdmUgaW4gbW9yZSB0aGFuIG9uZSBwbGFjZT8iLCBvcHRpb25zOiBbCiAgICAgICAgeyB2YWx1ZTogInNub3diaXJkIiwgbGFiZWw6ICJPZnRlbiBcdTIwMTQgSSBzcGxpdCB0aW1lIGJldHdlZW4gc3RhdGVzIG9yIHRyYXZlbCBhIGxvdCBpbiB0aGUgVS5TLiIsIHNjb3JlOiB7IG06IDIsIGE6IDAgfSB9LAogICAgICAgIHsgdmFsdWU6ICJpbnRlcm5hdGlvbmFsIiwgbGFiZWw6ICJJIHRyYXZlbCBpbnRlcm5hdGlvbmFsbHkgZmFpcmx5IG9mdGVuIiwgc2NvcmU6IHsgbTogMSwgYTogMCB9IH0sCiAgICAgICAgeyB2YWx1ZTogImxvY2FsIiwgbGFiZWw6ICJJIG1vc3RseSBzdGF5IGNsb3NlIHRvIGhvbWUiLCBzY29yZTogeyBtOiAwLCBhOiAxIH0gfSBdIH0sCiAgICAgIHsgaWQ6ICJidWRnZXQiLCBleWVicm93OiAiWW91ciBidWRnZXQiLCB0aXRsZTogIldoaWNoIGNvc3Qgc3R5bGUgZml0cyB5b3UgYmV0dGVyPyIsIG9wdGlvbnM6IFsKICAgICAgICB7IHZhbHVlOiAicHJlZGljdGFibGUiLCBsYWJlbDogIlByZWRpY3RhYmxlIGJpbGxzIFx1MjAxNCBJJ2xsIHBheSBhIGhpZ2hlciBtb250aGx5IHByZW1pdW0gdG8gYXZvaWQgc3VycHJpc2VzIiwgc2NvcmU6IHsgbTogMiwgYTogMCB9IH0sCiAgICAgICAgeyB2YWx1ZTogImxvd2VzdF9wcmVtaXVtIiwgbGFiZWw6ICJMb3dlc3QgbW9udGhseSBwcmVtaXVtIFx1MjAxNCBJIGNhbiBoYW5kbGUgY29wYXlzIGFzIHRoZXkgY29tZSIsIHNjb3JlOiB7IG06IDAsIGE6IDIgfSB9LAogICAgICAgIHsgdmFsdWU6ICJiYWxhbmNlZCIsIGxhYmVsOiAiU29tZXdoZXJlIGluIGJldHdlZW4iLCBzY29yZTogeyBtOiAwLCBhOiAwIH0gfSBdIH0sCiAgICAgIHsgaWQ6ICJoZWFsdGgiLCBleWVicm93OiAiWW91ciBoZWFsdGgiLCB0aXRsZTogIldoYXQgZG9lcyB5b3VyIGNhcmUgbG9vayBsaWtlIHJpZ2h0IG5vdz8iLCBvcHRpb25zOiBbCiAgICAgICAgeyB2YWx1ZTogImNocm9uaWMiLCBsYWJlbDogIkkgbWFuYWdlIGNocm9uaWMgY29uZGl0aW9ucyBvciBleHBlY3Qgc2lnbmlmaWNhbnQgY2FyZSIsIHNjb3JlOiB7IG06IDIsIGE6IDAgfSB9LAogICAgICAgIHsgdmFsdWU6ICJoZWFsdGh5IiwgbGFiZWw6ICJHZW5lcmFsbHkgaGVhbHRoeSB3aXRoIHJvdXRpbmUgbmVlZHMiLCBzY29yZTogeyBtOiAwLCBhOiAxIH0gfSwKICAgICAgICB7IHZhbHVlOiAibWl4ZWQiLCBsYWJlbDogIkEgbWl4IC8gbm90IHN1cmUiLCBzY29yZTogeyBtOiAwLCBhOiAwIH0gfSBdIH0sCiAgICAgIHsgaWQ6ICJkcnVncyIsIGV5ZWJyb3c6ICJQcmVzY3JpcHRpb25zIiwgdGl0bGU6ICJIb3cgd291bGQgeW91IGRlc2NyaWJlIHlvdXIgcHJlc2NyaXB0aW9ucz8iLCBoZWxwOiAiRWl0aGVyIHBhdGggY2FuIGluY2x1ZGUgZHJ1ZyBjb3ZlcmFnZSBcdTIwMTQgdGhpcyBoZWxwcyB1cyBmbGFnIHdoYXQgdG8gY2hlY2suIiwgb3B0aW9uczogWwogICAgICAgIHsgdmFsdWU6ICJoaWdoX3J4IiwgbGFiZWw6ICJTZXZlcmFsLCBvciBvbmUgb3IgbW9yZSBleHBlbnNpdmUgc3BlY2lhbHR5IGRydWdzIiwgc2NvcmU6IHsgbTogMCwgYTogMCB9IH0sCiAgICAgICAgeyB2YWx1ZTogImxvd19yeCIsIGxhYmVsOiAiRmV3IG9yIG5vbmUgcmlnaHQgbm93Iiwgc2NvcmU6IHsgbTogMCwgYTogMCB9IH0gXSB9LAogICAgICB7IGlkOiAiZXh0cmFzIiwgZXllYnJvdzogIkV4dHJhIGJlbmVmaXRzIiwgdGl0bGU6ICJIb3cgbXVjaCBkbyBkZW50YWwsIHZpc2lvbiwgYW5kIGhlYXJpbmcgYmVuZWZpdHMgbWF0dGVyPyIsIG9wdGlvbnM6IFsKICAgICAgICB7IHZhbHVlOiAid2FudHNfZXh0cmFzIiwgbGFiZWw6ICJJbXBvcnRhbnQgXHUyMDE0IEknZCBsaWtlIHRoZW0gaW5jbHVkZWQiLCBzY29yZTogeyBtOiAwLCBhOiAxIH0gfSwKICAgICAgICB7IHZhbHVlOiAiZXh0cmFzX25ldXRyYWwiLCBsYWJlbDogIk5pY2UgdG8gaGF2ZSwgbm90IGEgZGVjaWRpbmcgZmFjdG9yIiwgc2NvcmU6IHsgbTogMCwgYTogMCB9IH0gXSB9CiAgICBdOwogICAgdmFyIENPVkVSQUdFX09QVElPTlMgPSBbCiAgICAgIHsgdjogImVtcGxveWVyX3NlbGYiLCBsOiAiQW4gYWN0aXZlIGVtcGxveWVyIG9yIHVuaW9uIHBsYW4gdGhyb3VnaCBteSBvd24gam9iIiwgczogImFjdGl2ZSBlbXBsb3llciBwbGFuIChvd24gam9iKSIgfSwKICAgICAgeyB2OiAiZW1wbG95ZXJfc3BvdXNlIiwgbDogIk15IHNwb3VzZSdzIG9yIHBhcnRuZXIncyBhY3RpdmUgZW1wbG95ZXIgcGxhbiIsIHM6ICJzcG91c2UncyBhY3RpdmUgZW1wbG95ZXIgcGxhbiIgfSwKICAgICAgeyB2OiAicmV0aXJlZV9jb2JyYSIsIGw6ICJSZXRpcmVlIGNvdmVyYWdlIG9yIENPQlJBIiwgczogInJldGlyZWUgY292ZXJhZ2Ugb3IgQ09CUkEiIH0sCiAgICAgIHsgdjogIm1hcmtldHBsYWNlIiwgbDogIkEgTWFya2V0cGxhY2UgLyBpbmRpdmlkdWFsIHBsYW4iLCBzOiAiTWFya2V0cGxhY2UgcGxhbiIgfSwKICAgICAgeyB2OiAidmEiLCBsOiAiVkEgaGVhbHRoIGNhcmUiLCBzOiAiVkEgaGVhbHRoIGNhcmUiIH0sCiAgICAgIHsgdjogIm5vbmVfb3RoZXIiLCBsOiAiTWVkaWNhaWQsIG5vIGNvdmVyYWdlLCBvciBzb21ldGhpbmcgZWxzZSIsIHM6ICJNZWRpY2FpZCAvIG5vbmUgLyBvdGhlciIgfSwKICAgICAgeyB2OiAiYWxyZWFkeV9tZWRpY2FyZSIsIGw6ICJJJ20gYWxyZWFkeSBlbnJvbGxlZCBpbiBNZWRpY2FyZSBQYXJ0cyBBIGFuZCBCIiwgczogImFscmVhZHkgb24gTWVkaWNhcmUiIH0KICAgIF07CiAgICAvKiAtLS0tLS0tLS0tIHN0YXRlIC0tLS0tLS0tLS0gKi8KICAgIGZ1bmN0aW9uIGJsYW5rSW50YWtlKCkgewogICAgICByZXR1cm4geyBiaXJ0aE06ICIiLCBiaXJ0aFk6ICIiLCBiaXJ0aDFzdDogZmFsc2UsIG1hcnJpZWQ6ICIiLCBzcG91c2VCaXJ0aE06ICIiLCBzcG91c2VCaXJ0aFk6ICIiLCBzcG91c2Uxc3Q6IGZhbHNlLAogICAgICAgIGNvdmVyYWdlVHlwZTogIiIsIGVtcFNpemU6ICIiLCBlbmRNOiAiIiwgZW5kWTogIiIsIGVuZFVua25vd246IGZhbHNlLCBoc2E6ICIiLCBvblNTOiAiIiwKICAgICAgICBzcG91c2VDb3Y6ICIiLCBzcG91c2VFbXBTaXplOiAiIiwgc3BvdXNlRW5kTTogIiIsIHNwb3VzZUVuZFk6ICIiLCBzcG91c2VFbmRVbmtub3duOiBmYWxzZSwgc3BvdXNlSHNhOiAiIiB9OwogICAgfQogICAgdmFyIHN0YXRlID0geyBzY3JlZW46ICJpbnRybyIsIHN0ZXA6IDAsIGludGFrZTogYmxhbmtJbnRha2UoKSwgYW5zd2Vyczoge30sIHVubG9ja2VkOiBmYWxzZSB9OwogICAgdmFyIGxlYWQgPSBudWxsOwogICAgZnVuY3Rpb24gYjY0dXJsKHN0cikgeyByZXR1cm4gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSkpLnJlcGxhY2UoL1wrL2csICItIikucmVwbGFjZSgvXC8vZywgIl8iKS5yZXBsYWNlKC89KyQvLCAiIik7IH0KICAgIGZ1bmN0aW9uIHVuYjY0dXJsKHMpIHsgcyA9IHMucmVwbGFjZSgvLS9nLCAiKyIpLnJlcGxhY2UoL18vZywgIi8iKTsgd2hpbGUgKHMubGVuZ3RoICUgNCkgcyArPSAiPSI7IHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGF0b2IocykpKTsgfQogICAgZnVuY3Rpb24gcmVwb3J0TGluaygpIHsKICAgICAgdmFyIGkgPSBzdGF0ZS5pbnRha2UsIHNsaW0gPSB7fTsKICAgICAgZm9yICh2YXIgayBpbiBpKSB7IGlmIChpW2tdICE9PSAiIiAmJiBpW2tdICE9PSBmYWxzZSkgc2xpbVtrXSA9IGlba107IH0KICAgICAgdmFyIGNvZGUgPSBiNjR1cmwoSlNPTi5zdHJpbmdpZnkoeyB2OiAxLCBkOiBbTk9XLnksIE5PVy5tLCBOT1cuZF0sIGk6IHNsaW0sIGE6IHN0YXRlLmFuc3dlcnMgfSkpOwogICAgICB2YXIgYmFzZSA9IGxvY2F0aW9uLm9yaWdpbiArIGxvY2F0aW9uLnBhdGhuYW1lOwogICAgICBpZiAobG9jYXRpb24ucGF0aG5hbWUgPT09ICIvIiAmJiBsb2NhdGlvbi5zZWFyY2gpIGJhc2UgKz0gbG9jYXRpb24uc2VhcmNoLnJlcGxhY2UoL1s/Jl1wcmV2aWV3W14mXSovZywgIiIpLnJlcGxhY2UoL14mLywgIj8iKTsKICAgICAgcmV0dXJuIGJhc2UgKyAiI2JrbXJlcG9ydD0iICsgY29kZTsKICAgIH0KICAgIGZ1bmN0aW9uIGxvYWRTYXZlZFJlcG9ydCgpIHsKICAgICAgdmFyIG0gPSAobG9jYXRpb24uaGFzaCB8fCAiIikubWF0Y2goL2JrbXJlcG9ydD0oW0EtWmEtejAtOV8tXSspLyk7CiAgICAgIGlmICghbSkgcmV0dXJuIGZhbHNlOwogICAgICB0cnkgewogICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZSh1bmI2NHVybChtWzFdKSk7CiAgICAgICAgaWYgKCFkYXRhIHx8IGRhdGEudiAhPT0gMSB8fCAhZGF0YS5pIHx8ICFkYXRhLmEgfHwgIWRhdGEuZCkgcmV0dXJuIGZhbHNlOwogICAgICAgIHZhciBpbnRha2UgPSBibGFua0ludGFrZSgpOwogICAgICAgIGZvciAodmFyIGsgaW4gZGF0YS5pKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaW50YWtlLCBrKSkgaW50YWtlW2tdID0gZGF0YS5pW2tdOyB9CiAgICAgICAgTk9XID0geyB5OiArZGF0YS5kWzBdLCBtOiArZGF0YS5kWzFdLCBkOiArZGF0YS5kWzJdIH07CiAgICAgICAgc3RhdGUgPSB7IHNjcmVlbjogInJlc3VsdHMiLCBzdGVwOiAwLCBpbnRha2U6IGludGFrZSwgYW5zd2VyczogZGF0YS5hLCB1bmxvY2tlZDogdHJ1ZSwgc2F2ZWQ6IHRydWUgfTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0KICAgIH0KICAgIGZ1bmN0aW9uIGV4aXRTYXZlZCgpIHsKICAgICAgaWYgKCFzdGF0ZS5zYXZlZCkgcmV0dXJuOwogICAgICBzdGF0ZS5zYXZlZCA9IGZhbHNlOwogICAgICBOT1cgPSB7IHk6IFRPREFZLnksIG06IFRPREFZLm0sIGQ6IFRPREFZLmQgfTsKICAgICAgdHJ5IHsgaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgIiIsIGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoKTsgfSBjYXRjaCAoZSkge30KICAgIH0KICAgIGZ1bmN0aW9uIGlzRW1wVHlwZSh0KSB7IHJldHVybiB0ID09PSAiZW1wbG95ZXJfc2VsZiIgfHwgdCA9PT0gImVtcGxveWVyX3Nwb3VzZSI7IH0KICAgIGZ1bmN0aW9uIHN0ZXBzKCkgewogICAgICB2YXIgaSA9IHN0YXRlLmludGFrZSwgcyA9IFsiYWdlcyIsICJjb3ZlcmFnZSJdOwogICAgICBpZiAoaS5tYXJyaWVkID09PSAieWVzIiAmJiBpLmNvdmVyYWdlVHlwZSAhPT0gImVtcGxveWVyX3Nwb3VzZSIpIHMucHVzaCgic3BvdXNlIik7CiAgICAgIENIT0lDRV9RVUVTVElPTlMuZm9yRWFjaChmdW5jdGlvbiAocSkgeyBzLnB1c2gocS5pZCk7IH0pOwogICAgICByZXR1cm4gczsKICAgIH0KICAgIC8qIC0tLS0tLS0tLS0gdmFsaWRhdGlvbiAtLS0tLS0tLS0tICovCiAgICBmdW5jdGlvbiB2YWxpZEFnZXMoKSB7CiAgICAgIHZhciBpID0gc3RhdGUuaW50YWtlOwogICAgICByZXR1cm4gISEoaS5iaXJ0aE0gJiYgaS5iaXJ0aFkgJiYgaS5tYXJyaWVkICYmIChpLm1hcnJpZWQgPT09ICJubyIgfHwgKGkuc3BvdXNlQmlydGhNICYmIGkuc3BvdXNlQmlydGhZKSkpOwogICAgfQogICAgZnVuY3Rpb24gdmFsaWRDb3ZlcmFnZSgpIHsKICAgICAgdmFyIGkgPSBzdGF0ZS5pbnRha2U7CiAgICAgIGlmICghaS5jb3ZlcmFnZVR5cGUpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKGlzRW1wVHlwZShpLmNvdmVyYWdlVHlwZSkgJiYgIShpLmVtcFNpemUgJiYgKGkuZW5kVW5rbm93biB8fCAoaS5lbmRNICYmIGkuZW5kWSkpICYmIGkuaHNhKSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoaS5jb3ZlcmFnZVR5cGUgIT09ICJhbHJlYWR5X21lZGljYXJlIiAmJiAhaS5vblNTKSByZXR1cm4gZmFsc2U7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gdmFsaWRTcG91c2UoKSB7CiAgICAgIHZhciBpID0gc3RhdGUuaW50YWtlOwogICAgICBpZiAoIWkuc3BvdXNlQ292KSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChpLnNwb3VzZUNvdiA9PT0gIm15X2VtcGxveWVyIiAmJiBpLmNvdmVyYWdlVHlwZSAhPT0gImVtcGxveWVyX3NlbGYiKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChpLnNwb3VzZUNvdiA9PT0gIm93bl9lbXBsb3llciIgJiYgIShpLnNwb3VzZUVtcFNpemUgJiYgKGkuc3BvdXNlRW5kVW5rbm93biB8fCAoaS5zcG91c2VFbmRNICYmIGkuc3BvdXNlRW5kWSkpICYmIGkuc3BvdXNlSHNhKSkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0ZXBWYWxpZCgpIHsKICAgICAgdmFyIGlkID0gc3RlcHMoKVtzdGF0ZS5zdGVwXTsKICAgICAgaWYgKGlkID09PSAiYWdlcyIpIHJldHVybiB2YWxpZEFnZXMoKTsKICAgICAgaWYgKGlkID09PSAiY292ZXJhZ2UiKSByZXR1cm4gdmFsaWRDb3ZlcmFnZSgpOwogICAgICBpZiAoaWQgPT09ICJzcG91c2UiKSByZXR1cm4gdmFsaWRTcG91c2UoKTsKICAgICAgcmV0dXJuICEhc3RhdGUuYW5zd2Vyc1tpZF07CiAgICB9CiAgICAvKiAtLS0tLS0tLS0tIHByb2ZpbGUgLS0tLS0tLS0tLSAqLwogICAgZnVuY3Rpb24gcHJvZmlsZSgpIHsKICAgICAgdmFyIGkgPSBzdGF0ZS5pbnRha2UsIHAgPSB7fTsKICAgICAgcC5iaXJ0aCA9IChpLmJpcnRoTSAmJiBpLmJpcnRoWSkgPyB7IHk6ICtpLmJpcnRoWSwgbTogK2kuYmlydGhNIH0gOiBudWxsOwogICAgICBwLmU2NSA9IHAuYmlydGggPyBlZmY2NShwLmJpcnRoLCBpLmJpcnRoMXN0KSA6IG51bGw7CiAgICAgIHAubWFycmllZCA9IGkubWFycmllZCA9PT0gInllcyI7CiAgICAgIHAuc3BFNjUgPSAocC5tYXJyaWVkICYmIGkuc3BvdXNlQmlydGhNICYmIGkuc3BvdXNlQmlydGhZKSA/IGVmZjY1KHsgeTogK2kuc3BvdXNlQmlydGhZLCBtOiAraS5zcG91c2VCaXJ0aE0gfSwgaS5zcG91c2Uxc3QpIDogbnVsbDsKICAgICAgcC50eXBlID0gaS5jb3ZlcmFnZVR5cGU7CiAgICAgIHAuZW1wID0gaXNFbXBUeXBlKHAudHlwZSkgPyB7CiAgICAgICAga25vd246ICFpLmVuZFVua25vd24gJiYgISEoaS5lbmRNICYmIGkuZW5kWSksCiAgICAgICAgZW5kOiAoaS5lbmRNICYmIGkuZW5kWSkgPyB7IHk6ICtpLmVuZFksIG06ICtpLmVuZE0gfSA6IG51bGwsCiAgICAgICAgbGFyZ2U6IGkuZW1wU2l6ZSAhPT0gIm5vIiwgdW5zdXJlOiBpLmVtcFNpemUgPT09ICJ1bnN1cmUiIH0gOiBudWxsOwogICAgICBwLmhzYSA9IGlzRW1wVHlwZShwLnR5cGUpICYmIGkuaHNhID09PSAieWVzIjsKICAgICAgcC5vblNTID0gaS5vblNTID09PSAieWVzIjsKICAgICAgcC5zcENvdiA9IG51bGw7IHAuc3BFbXAgPSBudWxsOyBwLnNwSHNhID0gZmFsc2U7CiAgICAgIGlmIChwLm1hcnJpZWQpIHsKICAgICAgICBpZiAocC50eXBlID09PSAiZW1wbG95ZXJfc3BvdXNlIikgeyBwLnNwQ292ID0gIm93bl9lbXBsb3llciI7IHAuc3BFbXAgPSBwLmVtcDsgcC5zcEhzYSA9IHAuaHNhOyB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgc2MgPSBpLnNwb3VzZUNvdjsKICAgICAgICAgIGlmIChzYyA9PT0gIm15X2VtcGxveWVyIiAmJiBwLnR5cGUgIT09ICJlbXBsb3llcl9zZWxmIikgc2MgPSAib3RoZXIiOwogICAgICAgICAgcC5zcENvdiA9IHNjOwogICAgICAgICAgaWYgKHNjID09PSAibXlfZW1wbG95ZXIiKSB7IHAuc3BFbXAgPSBwLmVtcDsgcC5zcEhzYSA9IHAuaHNhOyB9CiAgICAgICAgICBlbHNlIGlmIChzYyA9PT0gIm93bl9lbXBsb3llciIpIHsKICAgICAgICAgICAgcC5zcEVtcCA9IHsga25vd246ICFpLnNwb3VzZUVuZFVua25vd24gJiYgISEoaS5zcG91c2VFbmRNICYmIGkuc3BvdXNlRW5kWSksCiAgICAgICAgICAgICAgZW5kOiAoaS5zcG91c2VFbmRNICYmIGkuc3BvdXNlRW5kWSkgPyB7IHk6ICtpLnNwb3VzZUVuZFksIG06ICtpLnNwb3VzZUVuZE0gfSA6IG51bGwsCiAgICAgICAgICAgICAgbGFyZ2U6IGkuc3BvdXNlRW1wU2l6ZSAhPT0gIm5vIiwgdW5zdXJlOiBpLnNwb3VzZUVtcFNpemUgPT09ICJ1bnN1cmUiIH07CiAgICAgICAgICAgIHAuc3BIc2EgPSBpLnNwb3VzZUhzYSA9PT0gInllcyI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBwOwogICAgfQogICAgLyogLS0tLS0tLS0tLSB0aW1lbGluZSBlbmdpbmUgLS0tLS0tLS0tLSAqLwogICAgZnVuY3Rpb24gbWVkaWdhcEJsb2NrKG91dCwgdiwgc3RhcnQpIHsKICAgICAgdmFyIGVuZCA9IGFkZE1vbnRocyhzdGFydCwgNSk7CiAgICAgIGlmIChjbXAoZW5kLCBOT1cpIDwgMCkgewogICAgICAgIG91dC5wdXNoKHsgdGFnOiAiQ2xvc2VkIiwgaDogdi5wcmUgKyAiTWVkaWdhcCBndWFyYW50ZWVkLWlzc3VlIHdpbmRvdyBjbG9zZWQgIiArIGZtdChlbmQpLAogICAgICAgICAgYjogIlRoYXQgNi1tb250aCB3aW5kb3cgYmVnYW4gd2hlbiBQYXJ0IEIgc3RhcnRlZC4gSW5zdXJlcnMgY2FuIG5vdyB1c3VhbGx5IGFzayBoZWFsdGggcXVlc3Rpb25zIGFuZCBtYXkgZGVjbGluZSBvciBjaGFyZ2UgbW9yZS4gQSBmZXcgc3RhdGVzIChzdWNoIGFzIE5ldyBZb3JrIGFuZCBDb25uZWN0aWN1dCkgb2ZmZXIgYnJvYWRlciBwcm90ZWN0aW9ucy4iIH0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgb3BlbiA9IGNtcChzdGFydCwgTk9XKSA8PSAwOwogICAgICBvdXQucHVzaCh7IHRhZzogb3BlbiA/ICJBY3Rpb24gbmVlZGVkIiA6ICJLZXkgZGF0ZSIsIGg6IHYucHJlICsgIk1lZGlnYXAgZ3VhcmFudGVlZC1pc3N1ZSB3aW5kb3c6ICIgKyBzcGFuKHN0YXJ0LCBlbmQpICsgKG9wZW4gPyAiIChvcGVuIG5vdykiIDogIiIpLAogICAgICAgIGI6ICJJZiBjaG9vc2luZyBNZWRpZ2FwLCBidXkgZHVyaW5nIHRoZXNlIDYgbW9udGhzLCB3aGljaCBiZWdpbiB0aGUgbW9udGggUGFydCBCIHN0YXJ0cy4gSW5zdXJlcnMgY2FuJ3QgZGVueSBjb3ZlcmFnZSBvciBjaGFyZ2UgbW9yZSBmb3IgaGVhbHRoIGNvbmRpdGlvbnMgZHVyaW5nIHRoaXMgd2luZG93LiBBZnRlciBpdCBjbG9zZXMsIHRoZXkgdXN1YWxseSBjYW4uIiB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGRydWdDbG9zZWRCbG9jayhvdXQsIHYsIGJ5KSB7CiAgICAgIG91dC5wdXNoKHsgdGFnOiAiQ2xvc2VkIiwgaDogdi5wcmUgKyAiVGhlIDItbW9udGggd2luZG93IHRvIGpvaW4gYSBkcnVnIHBsYW4gY2xvc2VkICIgKyBmbXQoYnkpLAogICAgICAgIGI6ICJUaGUgbmV4dCBjaGFuY2UgdG8gam9pbiBhIFBhcnQgRCBvciBNZWRpY2FyZSBBZHZhbnRhZ2UgcGxhbiBpcyBPcGVuIEVucm9sbG1lbnQsICIgKyBvZXBUZXh0KCkgKyAiLCB3aXRoIGNvdmVyYWdlIHN0YXJ0aW5nIEphbnVhcnkgMS4gQSBwZXJtYW5lbnQgUGFydCBEIGxhdGUgcGVuYWx0eSBtYXkgYXBwbHkgZm9yIGFueSBzdHJldGNoIG9mIDYzKyBkYXlzIHdpdGhvdXQgY3JlZGl0YWJsZSBkcnVnIGNvdmVyYWdlLiIgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBoc2FCbG9jayhvdXQsIHYsIGU2NSwgYXBwbHlNb250aCkgewogICAgICB2YXIgYVN0YXJ0ID0gbWF4UChhZGRNb250aHMoYXBwbHlNb250aCwgLTYpLCBlNjUpOwogICAgICB2YXIgbGFzdCA9IGFkZE1vbnRocyhhU3RhcnQsIC0xKTsKICAgICAgaWYgKGNtcChsYXN0LCBOT1cpID49IDApIHsKICAgICAgICBvdXQucHVzaCh7IHRhZzogIkhlYWRzLXVwIiwgaDogdi5wcmUgKyAiTGFzdCBtb250aCBmb3IgSFNBIGNvbnRyaWJ1dGlvbnM6ICIgKyBmbXQobGFzdCksCiAgICAgICAgICBiOiAiV2hlbiBlbnJvbGxpbmcgaW4gTWVkaWNhcmUgYWZ0ZXIgNjUsIFBhcnQgQSBpcyBiYWNrZGF0ZWQgdXAgdG8gNiBtb250aHMgKG5ldmVyIGVhcmxpZXIgdGhhbiAiICsgZm10KGU2NSkgKyAiKS4gQXBwbHlpbmcgaW4gIiArIGZtdChhcHBseU1vbnRoKSArICIgbWVhbnMgUGFydCBBIHdvdWxkIHN0YXJ0ICIgKyBmbXQoYVN0YXJ0KSArICIsIHNvIGNvbnRyaWJ1dGlvbnMgZm9yICIgKyBmbXQoYVN0YXJ0KSArICIgb253YXJkIHdvdWxkIGNvdW50IGFzIGV4Y2VzcyBhbmQgYmUgcGVuYWxpemVkLiBUaGUgSFNBIGNhbiBzdGlsbCBiZSB1c2VkIGZvciBtZWRpY2FsIGNvc3RzLiIgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJBY3Rpb24gbmVlZGVkIiwgaDogdi5wcmUgKyAiU3RvcCBIU0EgY29udHJpYnV0aW9ucyBub3ciLAogICAgICAgICAgYjogIldoZW4gZW5yb2xsaW5nIGluIE1lZGljYXJlIGFmdGVyIDY1LCBQYXJ0IEEgaXMgYmFja2RhdGVkIHVwIHRvIDYgbW9udGhzIChuZXZlciBlYXJsaWVyIHRoYW4gIiArIGZtdChlNjUpICsgIikuIEFwcGx5aW5nIGluICIgKyBmbXQoYXBwbHlNb250aCkgKyAiIG1lYW5zIFBhcnQgQSB3b3VsZCBzdGFydCAiICsgZm10KGFTdGFydCkgKyAiLCB3aGljaCBoYXMgYWxyZWFkeSBwYXNzZWQsIHNvIGNvbnRyaWJ1dGlvbnMgZm9yIHRob3NlIG1vbnRocyBjb3VudCBhcyBleGNlc3MuIEFzayB5b3VyIEJLTSBhZHZpc29yIGFib3V0IHdpdGhkcmF3aW5nIHRoZW0gYmVmb3JlIHRoZSB0YXgtZmlsaW5nIGRlYWRsaW5lLiIgfSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGRlbGF5UGF0aChvdXQsIHYsIGU2NSwgZW1wLCBoc2EsIG9uU1MpIHsKICAgICAgdmFyIGllcFMgPSBhZGRNb250aHMoZTY1LCAtMyk7CiAgICAgIHZhciBlbmRlZCA9IGVtcC5rbm93biAmJiBjbXAoZW1wLmVuZCwgTk9XKSA8IDA7CiAgICAgIGlmIChjbXAoZTY1LCBOT1cpID4gMCkgewogICAgICAgIGlmIChvblNTID09PSB0cnVlKSB7CiAgICAgICAgICBvdXQucHVzaCh7IHRhZzogIkhlYWRzLXVwIiwgaDogdi5wcmUgKyAiTWVkaWNhcmUgY2FyZCBhcnJpdmVzIGFyb3VuZCAiICsgZm10KGllcFMpLAogICAgICAgICAgICBiOiAiU2luY2UgU29jaWFsIFNlY3VyaXR5IGJlbmVmaXRzIGhhdmUgYWxyZWFkeSBzdGFydGVkLCBQYXJ0cyBBIGFuZCBCIGJlZ2luIGF1dG9tYXRpY2FsbHkgaW4gIiArIGZtdChlNjUpICsgIi4gS2VlcCBQYXJ0IEEsIGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyB3aXRoIHRoZSBjYXJkIHRvIGRlY2xpbmUgUGFydCBCIHdoaWxlIHRoZSBlbXBsb3llciBwbGFuIGlzIGluIHBsYWNlLiBQYXJ0IEEgY2FuJ3QgYmUgZGVjbGluZWQgd2l0aG91dCByZXBheWluZyBTb2NpYWwgU2VjdXJpdHkgYmVuZWZpdHMuIiArCiAgICAgICAgICAgICAgKGhzYSA/ICIgQmVjYXVzZSBQYXJ0IEEgc3RhcnRzIGF1dG9tYXRpY2FsbHksIEhTQSBjb250cmlidXRpb25zIG11c3Qgc3RvcCBhZnRlciAiICsgZm10KGFkZE1vbnRocyhlNjUsIC0xKSkgKyAiLiIgOiAiIikgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG91dC5wdXNoKHsgaDogdi5wcmUgKyAiUGFydCBBIGRlY2lzaW9uIGF0IDY1ICgiICsgZm10KGU2NSkgKyAiKSIsCiAgICAgICAgICAgIGI6ICJQYXJ0IEIgY2FuIHdhaXQgd2hpbGUgdGhpcyBlbXBsb3llciBwbGFuIGlzIGluIHBsYWNlLiBQcmVtaXVtLWZyZWUgUGFydCBBIGlzIG9wdGlvbmFsOyBtYW55IHBlb3BsZSB0YWtlIGl0IGF0IDY1IGJ5IGFwcGx5aW5nICIgKyBzcGFuKG1heFAoaWVwUywgTk9XKSwgYWRkTW9udGhzKGU2NSwgLTEpKSArICIuIiArCiAgICAgICAgICAgICAgKGhzYSA/ICIgV2l0aCBIU0EgY29udHJpYnV0aW9ucywgaXQgdXN1YWxseSBtYWtlcyBzZW5zZSB0byB3YWl0IG9uIFBhcnQgQSBhcyB3ZWxsLCBzaW5jZSBlbnJvbGxpbmcgaW4gYW55IHBhcnQgb2YgTWVkaWNhcmUgZW5kcyBIU0EgZWxpZ2liaWxpdHkuIiA6ICIiKSArCiAgICAgICAgICAgICAgKG9uU1MgPT09IG51bGwgPyAiIElmIFNvY2lhbCBTZWN1cml0eSBiZW5lZml0cyBoYXZlIHN0YXJ0ZWQsIFBhcnQgQSBpcyBhdXRvbWF0aWMgYW5kIGNhbid0IGJlIGRlY2xpbmVkLiIgOiAiIikgfSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCFlbmRlZCkgewogICAgICAgIG91dC5wdXNoKHsgaDogdi5wcmUgKyAiUGFzdCA2NSBhbmQgc3RpbGwgb24gdGhlIGVtcGxveWVyIHBsYW4iLAogICAgICAgICAgYjogIlRoZXJlJ3Mgbm8gUGFydCBCIGRlYWRsaW5lIHdoaWxlIHRoaXMgY292ZXJhZ2UgY29udGludWVzLiBUaGUga2V5IGRhdGVzIGRlcGVuZCBvbiB3aGVuIGl0IGVuZHMuIiB9KTsKICAgICAgICBpZiAob25TUyA9PT0gdHJ1ZSAmJiBoc2EpIHsKICAgICAgICAgIG91dC5wdXNoKHsgdGFnOiAiSGVhZHMtdXAiLCBoOiB2LnByZSArICJIU0EgY29udHJpYnV0aW9ucyIsCiAgICAgICAgICAgIGI6ICJSZWNlaXZpbmcgU29jaWFsIFNlY3VyaXR5IGFmdGVyIDY1IG1lYW5zIFBhcnQgQSBpcyBhbHJlYWR5IGluIGVmZmVjdCwgc28gSFNBIGNvbnRyaWJ1dGlvbnMgYXJlbid0IGFsbG93ZWQuIElmIGFueSB3ZXJlIG1hZGUsIGFzayB5b3VyIEJLTSBhZHZpc29yIGFib3V0IGNvcnJlY3RpbmcgdGhlbS4iIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIWVtcC5rbm93bikgewogICAgICAgIG91dC5wdXNoKHsgaDogdi5wcmUgKyAiT25jZSBhIHJldGlyZW1lbnQgZGF0ZSBpcyBzZXQiLAogICAgICAgICAgYjogIkFwcGx5IGZvciBQYXJ0IEIgMVx1MjAxMzIgbW9udGhzIGJlZm9yZSB0aGUgZW1wbG95ZXIgY292ZXJhZ2UgZW5kcywgdXNpbmcgRm9ybSBDTVMtNDBCIHBsdXMgRm9ybSBDTVMtTDU2NCAodGhlIGVtcGxveWVyIGNvbXBsZXRlcyB0aGUgTDU2NCB0byBjb25maXJtIHRoZSBjb3ZlcmFnZSksIGFuZCBhc2sgZm9yIFBhcnQgQiB0byBzdGFydCB0aGUgbW9udGggYWZ0ZXIgY292ZXJhZ2UgZW5kcy4gSm9pbiBhIGRydWcgb3IgTWVkaWNhcmUgQWR2YW50YWdlIHBsYW4gd2l0aGluIDIgbW9udGhzIG9mIHRoZSBjb3ZlcmFnZSBlbmRpbmcuIFJ1biB0aGlzIHRvb2wgYWdhaW4gd2l0aCB0aGUgZGF0ZSB0byBzZWUgZXhhY3QgZGVhZGxpbmVzLiIgfSk7CiAgICAgICAgaWYgKGhzYSAmJiBvblNTICE9PSB0cnVlKSB7CiAgICAgICAgICBvdXQucHVzaCh7IHRhZzogIkhlYWRzLXVwIiwgaDogdi5wcmUgKyAiSFNBIHRpbWluZyIsCiAgICAgICAgICAgIGI6ICJXaGVuIGVucm9sbGluZyBpbiBNZWRpY2FyZSBhZnRlciA2NSwgUGFydCBBIGlzIGJhY2tkYXRlZCB1cCB0byA2IG1vbnRocyAobmV2ZXIgZWFybGllciB0aGFuICIgKyBmbXQoZTY1KSArICIpLiBTdG9wIEhTQSBjb250cmlidXRpb25zIDYgbW9udGhzIGJlZm9yZSBhcHBseWluZyB0byBhdm9pZCBleGNlc3MtY29udHJpYnV0aW9uIHBlbmFsdGllcy4iIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIGVuZCA9IGVtcC5lbmQsIGJTdGFydCA9IGFkZE1vbnRocyhlbmQsIDEpLCBzZXBFID0gYWRkTW9udGhzKGVuZCwgOCksIHBkQnkgPSBhZGRNb250aHMoZW5kLCAyKTsKICAgICAgaWYgKCFlbmRlZCkgewogICAgICAgIHZhciBmcm9tID0gbWF4UChhZGRNb250aHMoZW5kLCAtMiksIE5PVyk7CiAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJLZXkgZGF0ZSIsIGg6IHYucHJlICsgIkFwcGx5IGZvciBQYXJ0IEIgaW4gIiArIHNwYW4oZnJvbSwgZW5kKSArICIgc28gaXQgc3RhcnRzICIgKyBmbXQoYlN0YXJ0KSwKICAgICAgICAgIGI6ICJUaGUgZW1wbG95ZXIgY292ZXJhZ2UgcnVucyB0aHJvdWdoICIgKyBmbXQoZW5kKSArICIuIEFwcGx5IG9ubGluZSBhdCBzc2EuZ292IG9yIGJ5IHBob25lLCBhbmQgaW5jbHVkZSBGb3JtIENNUy00MEIgcGx1cyBGb3JtIENNUy1MNTY0LCB3aGljaCB0aGUgZW1wbG95ZXIgY29tcGxldGVzIHRvIGNvbmZpcm0gdGhlIGNvdmVyYWdlLiBBc2sgZm9yIFBhcnQgQiB0byBiZWdpbiAiICsgZm10KGJTdGFydCkgKyAiIHNvIHRoZXJlJ3Mgbm8gZ2FwIGFuZCBubyBwYXlpbmcgZm9yIFBhcnQgQiB3aGlsZSBzdGlsbCBvbiB0aGUgZW1wbG95ZXIgcGxhbi4gVGhlIDgtbW9udGggU3BlY2lhbCBFbnJvbGxtZW50IFBlcmlvZCBzdGF5cyBvcGVuIHRocm91Z2ggIiArIGZtdChzZXBFKSArICIsIGJ1dCBhcHBseWluZyBsYXRlIGxlYXZlcyBhIGdhcCBpbiBjb3ZlcmFnZS4iIH0pOwogICAgICAgIG91dC5wdXNoKHsgdGFnOiAiS2V5IGRhdGUiLCBoOiB2LnByZSArICJKb2luIGEgZHJ1ZyBwbGFuIG9yIE1lZGljYXJlIEFkdmFudGFnZSBwbGFuIGJ5ICIgKyBmbXQocGRCeSksCiAgICAgICAgICBiOiAiVGhpcyBkZWFkbGluZSBpcyBtdWNoIHNob3J0ZXIgdGhhbiBQYXJ0IEInczogMiBtb250aHMgYWZ0ZXIgdGhlIGVtcGxveWVyIGNvdmVyYWdlIGVuZHMsIG5vdCA4LiBFbnJvbGwgYmVmb3JlICIgKyBmbXQoZW5kKSArICIgZW5kcyBzbyB0aGUgbmV3IHBsYW4gc3RhcnRzICIgKyBmbXQoYlN0YXJ0KSArICIuIEdvaW5nIDYzIGRheXMgb3IgbW9yZSB3aXRob3V0IGNyZWRpdGFibGUgZHJ1ZyBjb3ZlcmFnZSBhZGRzIGEgcGVybWFuZW50IFBhcnQgRCBsYXRlIHBlbmFsdHkuIiB9KTsKICAgICAgICBtZWRpZ2FwQmxvY2sob3V0LCB2LCBiU3RhcnQpOwogICAgICAgIGlmIChoc2EgJiYgb25TUyAhPT0gdHJ1ZSkgaHNhQmxvY2sob3V0LCB2LCBlNjUsIG1heFAoYWRkTW9udGhzKGVuZCwgLTEpLCBOT1cpKTsKICAgICAgfSBlbHNlIGlmIChjbXAoTk9XLCBzZXBFKSA8PSAwKSB7CiAgICAgICAgdmFyIGJzID0gYWRkTW9udGhzKE5PVywgMSk7CiAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJBY3Rpb24gbmVlZGVkIiwgaDogdi5wcmUgKyAiQXBwbHkgZm9yIFBhcnQgQiBub3cgXHUyMDE0IHRoZSB3aW5kb3cgY2xvc2VzICIgKyBmbXQoc2VwRSksCiAgICAgICAgICBiOiAiVGhlIGVtcGxveWVyIGNvdmVyYWdlIGVuZGVkICIgKyBmbXQoZW5kKSArICIsIHdoaWNoIG9wZW5lZCBhbiA4LW1vbnRoIFNwZWNpYWwgRW5yb2xsbWVudCBQZXJpb2QgKCIgKyBzcGFuKGJTdGFydCwgc2VwRSkgKyAiKS4gQXBwbHkgdGhpcyBtb250aCB3aXRoIEZvcm1zIENNUy00MEIgYW5kIENNUy1MNTY0OyBQYXJ0IEIgd291bGQgc3RhcnQgIiArIGZtdChicykgKyAiLiBBbHJlYWR5IGVucm9sbGVkPyBTa2lwIHRoaXMgc3RlcC4iIH0pOwogICAgICAgIGlmIChjbXAoTk9XLCBwZEJ5KSA8PSAwKSB7CiAgICAgICAgICBvdXQucHVzaCh7IHRhZzogIkFjdGlvbiBuZWVkZWQiLCBoOiB2LnByZSArICJKb2luIGEgZHJ1ZyBvciBNZWRpY2FyZSBBZHZhbnRhZ2UgcGxhbiBieSAiICsgZm10KHBkQnkpLAogICAgICAgICAgICBiOiAiVGhlIHdpbmRvdyBpcyAyIG1vbnRocyBhZnRlciBlbXBsb3llciBjb3ZlcmFnZSBlbmRzLiBHb2luZyA2MyBkYXlzIG9yIG1vcmUgd2l0aG91dCBjcmVkaXRhYmxlIGRydWcgY292ZXJhZ2UgYWRkcyBhIHBlcm1hbmVudCBQYXJ0IEQgbGF0ZSBwZW5hbHR5LiIgfSk7CiAgICAgICAgfSBlbHNlIHsgZHJ1Z0Nsb3NlZEJsb2NrKG91dCwgdiwgcGRCeSk7IH0KICAgICAgICBtZWRpZ2FwQmxvY2sob3V0LCB2LCBicyk7CiAgICAgICAgaWYgKGhzYSAmJiBvblNTICE9PSB0cnVlKSBoc2FCbG9jayhvdXQsIHYsIGU2NSwgTk9XKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvdXQucHVzaCh7IHRhZzogIkNsb3NlZCIsIGg6IHYucHJlICsgIlNwZWNpYWwgRW5yb2xsbWVudCBQZXJpb2QgY2xvc2VkICIgKyBmbXQoc2VwRSksCiAgICAgICAgICBiOiAiQWxyZWFkeSBlbnJvbGxlZCBpbiBQYXJ0IEI/IFNraXAgdGhpcyBzdGVwLiBJZiBub3QsIHRoZSBuZXh0IGNoYW5jZSBpcyB0aGUgR2VuZXJhbCBFbnJvbGxtZW50IFBlcmlvZCwgIiArIGdlcFRleHQoKSArICIuIFBhcnQgQiBzdGFydHMgdGhlIG1vbnRoIGFmdGVyIHNpZ25pbmcgdXAsIGFuZCBhIGxpZmVsb25nIGxhdGUgcGVuYWx0eSBtYXkgYXBwbHk6IDEwJSBvZiB0aGUgcHJlbWl1bSBmb3IgZWFjaCBmdWxsIDEyIG1vbnRocyB3aXRob3V0IFBhcnQgQiBhZnRlciB0aGUgZW1wbG95ZXIgY292ZXJhZ2UgZW5kZWQuIFJldmlldyB0aGlzIHdpdGggeW91ciBCS00gYWR2aXNvci4iIH0pOwogICAgICAgIGRydWdDbG9zZWRCbG9jayhvdXQsIHYsIHBkQnkpOwogICAgICAgIG91dC5wdXNoKHsgaDogdi5wcmUgKyAiTWVkaWdhcCB0aW1pbmciLAogICAgICAgICAgYjogIlRoZSA2LW1vbnRoIE1lZGlnYXAgZ3VhcmFudGVlZC1pc3N1ZSB3aW5kb3cgc3RhcnRzIHRoZSBtb250aCBQYXJ0IEIgYmVnaW5zLiBJZiBQYXJ0IEIgc3RhcnRlZCBtb3JlIHRoYW4gNiBtb250aHMgYWdvLCBpbnN1cmVycyBjYW4gdXN1YWxseSByZXF1aXJlIG1lZGljYWwgdW5kZXJ3cml0aW5nLiIgfSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGllcFBhdGgob3V0LCB2LCBlNjUsIG9uU1MpIHsKICAgICAgdmFyIGllcFMgPSBhZGRNb250aHMoZTY1LCAtMyksIGllcEUgPSBhZGRNb250aHMoZTY1LCAzKSwgcHJlID0gYWRkTW9udGhzKGU2NSwgLTEpOwogICAgICBpZiAoY21wKE5PVywgaWVwUykgPCAwKSB7CiAgICAgICAgaWYgKG9uU1MgPT09IHRydWUpIHsKICAgICAgICAgIG91dC5wdXNoKHsgdGFnOiAiS2V5IGRhdGUiLCBoOiB2LnByZSArICJBdXRvbWF0aWMgZW5yb2xsbWVudCBpbiAiICsgZm10KGU2NSksCiAgICAgICAgICAgIGI6ICJTaW5jZSBTb2NpYWwgU2VjdXJpdHkgYmVuZWZpdHMgaGF2ZSBhbHJlYWR5IHN0YXJ0ZWQsIFBhcnRzIEEgYW5kIEIgYmVnaW4gYXV0b21hdGljYWxseSBpbiAiICsgZm10KGU2NSkgKyAiLCBhbmQgdGhlIE1lZGljYXJlIGNhcmQgYXJyaXZlcyBhcm91bmQgIiArIGZtdChpZXBTKSArICIuIE5vIGFwcGxpY2F0aW9uIGlzIG5lZWRlZC4iIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvdXQucHVzaCh7IHRhZzogIktleSBkYXRlIiwgaDogdi5wcmUgKyAiSW5pdGlhbCBFbnJvbGxtZW50IFBlcmlvZDogIiArIHNwYW4oaWVwUywgaWVwRSksCiAgICAgICAgICAgIGI6ICJBcHBseSBpbiAiICsgc3BhbihpZXBTLCBwcmUpICsgIiBzbyBjb3ZlcmFnZSBzdGFydHMgIiArIGZtdChlNjUpICsgIiB3aXRoIG5vIGdhcC4gQXBwbHlpbmcgbGF0ZXIgaW4gdGhlIHdpbmRvdyBwdXNoZXMgdGhlIHN0YXJ0IGRhdGUgYmFjay4iICsKICAgICAgICAgICAgICAob25TUyA9PT0gbnVsbCA/ICIgSWYgU29jaWFsIFNlY3VyaXR5IGJlbmVmaXRzIGhhdmUgc3RhcnRlZCwgZW5yb2xsbWVudCBpcyBhdXRvbWF0aWMuIiA6ICIiKSB9KTsKICAgICAgICB9CiAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJLZXkgZGF0ZSIsIGg6IHYucHJlICsgIkNob29zZSBhIGRydWcgcGxhbiBvciBNZWRpY2FyZSBBZHZhbnRhZ2UgcGxhbiBieSAiICsgZm10KHByZSksCiAgICAgICAgICBiOiAiUGljayBhIFBhcnQgRCBwbGFuIChvciBhIE1lZGljYXJlIEFkdmFudGFnZSBwbGFuIHdpdGggZHJ1ZyBjb3ZlcmFnZSkgZHVyaW5nIHRoZSBzYW1lIHdpbmRvdyBzbyBpdCBzdGFydHMgIiArIGZtdChlNjUpICsgIi4gU2tpcHBpbmcgaXQgd2l0aG91dCBvdGhlciBjcmVkaXRhYmxlIGRydWcgY292ZXJhZ2UgYWRkcyBhIHBlcm1hbmVudCBQYXJ0IEQgbGF0ZSBwZW5hbHR5LiIgfSk7CiAgICAgICAgbWVkaWdhcEJsb2NrKG91dCwgdiwgZTY1KTsKICAgICAgfSBlbHNlIGlmIChjbXAoTk9XLCBpZXBFKSA8PSAwKSB7CiAgICAgICAgdmFyIGJzID0gY21wKE5PVywgZTY1KSA8IDAgPyBlNjUgOiBhZGRNb250aHMoTk9XLCAxKTsKICAgICAgICBvdXQucHVzaCh7IHRhZzogIkFjdGlvbiBuZWVkZWQiLCBoOiB2LnByZSArICJFbnJvbGxtZW50IHdpbmRvdyBpcyBvcGVuIG5vdyBcdTIwMTQgdGhyb3VnaCAiICsgZm10KGllcEUpLAogICAgICAgICAgYjogb25TUyA9PT0gdHJ1ZSA/ICJQYXJ0cyBBIGFuZCBCIGFyZSBhdXRvbWF0aWMgc2luY2UgU29jaWFsIFNlY3VyaXR5IGJlbmVmaXRzIGhhdmUgc3RhcnRlZDsgd2F0Y2ggZm9yIHRoZSBNZWRpY2FyZSBjYXJkLiIgOiAiQXBwbHkgdGhpcyBtb250aDsgY292ZXJhZ2Ugd291bGQgc3RhcnQgIiArIGZtdChicykgKyAiLiBXYWl0aW5nIHB1c2hlcyB0aGUgc3RhcnQgZGF0ZSBiYWNrLiIgfSk7CiAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJBY3Rpb24gbmVlZGVkIiwgaDogdi5wcmUgKyAiQ2hvb3NlIGEgZHJ1ZyBwbGFuIG9yIE1lZGljYXJlIEFkdmFudGFnZSBwbGFuIG5vdyIsCiAgICAgICAgICBiOiAiRW5yb2xsIGluIFBhcnQgRCBvciBhIE1lZGljYXJlIEFkdmFudGFnZSBwbGFuIGR1cmluZyB0aGlzIHNhbWUgd2luZG93ICh0aHJvdWdoICIgKyBmbXQoaWVwRSkgKyAiKSB0byBhdm9pZCB0aGUgcGVybWFuZW50IFBhcnQgRCBsYXRlIHBlbmFsdHkuIiB9KTsKICAgICAgICBtZWRpZ2FwQmxvY2sob3V0LCB2LCBicyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJDbG9zZWQiLCBoOiB2LnByZSArICJJbml0aWFsIEVucm9sbG1lbnQgUGVyaW9kIGNsb3NlZCAoIiArIHNwYW4oaWVwUywgaWVwRSkgKyAiKSIsCiAgICAgICAgICBiOiAiQWxyZWFkeSBlbnJvbGxlZCBpbiBNZWRpY2FyZT8gU2tpcCB0aGlzIHN0ZXAuIElmIG5vdCwgdGhlIG5leHQgY2hhbmNlIGlzIHRoZSBHZW5lcmFsIEVucm9sbG1lbnQgUGVyaW9kLCAiICsgZ2VwVGV4dCgpICsgIi4gUGFydCBCIHN0YXJ0cyB0aGUgbW9udGggYWZ0ZXIgc2lnbmluZyB1cCwgYW5kIGEgbGlmZWxvbmcgbGF0ZSBwZW5hbHR5IG1heSBhcHBseTogMTAlIG9mIHRoZSBwcmVtaXVtIGZvciBlYWNoIGZ1bGwgMTIgbW9udGhzIHdpdGhvdXQgUGFydCBCICh0aW1lIG9uIHF1YWxpZnlpbmcgZW1wbG95ZXIgY292ZXJhZ2UgZG9lc24ndCBjb3VudCkuIFJldmlldyB0aGlzIHdpdGggeW91ciBCS00gYWR2aXNvci4iIH0pOwogICAgICAgIG91dC5wdXNoKHsgaDogdi5wcmUgKyAiRHJ1ZyBhbmQgTWVkaWdhcCBjb3ZlcmFnZSIsCiAgICAgICAgICBiOiAiQSBkcnVnIG9yIE1lZGljYXJlIEFkdmFudGFnZSBwbGFuIGNhbiBiZSBhZGRlZCBkdXJpbmcgT3BlbiBFbnJvbGxtZW50ICgiICsgb2VwVGV4dCgpICsgIikgb3IgaW4gdGhlIHNwZWNpYWwgd2luZG93IHRoYXQgZm9sbG93cyBhIG5ldyBQYXJ0IEIgZW5yb2xsbWVudC4gVGhlIE1lZGlnYXAgZ3VhcmFudGVlZC1pc3N1ZSB3aW5kb3cgc3RhcnRzIHRoZSBtb250aCBQYXJ0IEIgYmVnaW5zOyBpZiB0aGF0IHdhcyBtb3JlIHRoYW4gNiBtb250aHMgYWdvLCBpbnN1cmVycyBjYW4gdXN1YWxseSByZXF1aXJlIG1lZGljYWwgdW5kZXJ3cml0aW5nLiIgfSk7CiAgICAgIH0KICAgIH0KICAgIHZhciBUWVBFX1dBUk5JTkdTID0gewogICAgICByZXRpcmVlX2NvYnJhOiB7IGg6ICJSZXRpcmVlIGNvdmVyYWdlIGFuZCBDT0JSQSBkb24ndCBsZXQgeW91IGRlbGF5IFBhcnQgQiIsIGI6ICJFbnJvbGwgZHVyaW5nIHRoZSB3aW5kb3cgYWJvdmUuIE9uY2UgeW91J3JlIGVsaWdpYmxlIGZvciBNZWRpY2FyZSwgdGhlc2UgcGxhbnMgdHlwaWNhbGx5IHBheSBzZWNvbmQsIGFuZCBzb21lIHBheSBub3RoaW5nIGZvciBjbGFpbXMgTWVkaWNhcmUgd291bGQgaGF2ZSBjb3ZlcmVkLiIgfSwKICAgICAgbWFya2V0cGxhY2U6IHsgaDogIk1hcmtldHBsYWNlIHBsYW5zIGRvbid0IGxldCB5b3UgZGVsYXkgUGFydCBCIiwgYjogIkVucm9sbCBkdXJpbmcgdGhlIHdpbmRvdyBhYm92ZSwgdGhlbiBjYW5jZWwgdGhlIE1hcmtldHBsYWNlIHBsYW4gZWZmZWN0aXZlIHRoZSBkYXkgTWVkaWNhcmUgc3RhcnRzLiBQcmVtaXVtIHRheCBjcmVkaXRzIGVuZCBvbmNlIHlvdSdyZSBlbGlnaWJsZSBmb3IgcHJlbWl1bS1mcmVlIFBhcnQgQS4iIH0sCiAgICAgIHZhOiB7IGg6ICJWQSBoZWFsdGggY2FyZSBkb2Vzbid0IGxldCB5b3UgZGVsYXkgUGFydCBCIHdpdGhvdXQgYSBwZW5hbHR5IiwgYjogIk1hbnkgdmV0ZXJhbnMgZW5yb2xsIGluIFBhcnQgQiBhbnl3YXkgc28gdGhleSBjYW4gc2VlIG5vbi1WQSBkb2N0b3JzLiBJZiB5b3Ugc2tpcCBQYXJ0IEIgYW5kIHdhbnQgaXQgbGF0ZXIsIHRoZSBsaWZlbG9uZyBsYXRlIHBlbmFsdHkgYXBwbGllcy4iIH0sCiAgICAgIG5vbmVfb3RoZXI6IHsgaDogIklmIHlvdSBoYXZlIE1lZGljYWlkIiwgYjogIllvdSBtYXkgcXVhbGlmeSBmb3IgaGVscCBwYXlpbmcgTWVkaWNhcmUgcHJlbWl1bXMgYW5kIGNvc3RzIHRocm91Z2ggYSBNZWRpY2FyZSBTYXZpbmdzIFByb2dyYW0uIENvbnRhY3QgeW91ciBzdGF0ZSBNZWRpY2FpZCBvZmZpY2UuIiB9CiAgICB9OwogICAgZnVuY3Rpb24gcGxhbkZvcihvdXQsIHYsIGU2NSwgZW1wLCBoc2EsIG9uU1MsIHR5cGUpIHsKICAgICAgdmFyIGNyZWRpdGFibGUgPSBlbXAgJiYgZW1wLmxhcmdlICYmICghZW1wLmtub3duIHx8IGNtcChlbXAuZW5kLCBlNjUpID49IDApOwogICAgICBpZiAoY3JlZGl0YWJsZSkgewogICAgICAgIGRlbGF5UGF0aChvdXQsIHYsIGU2NSwgZW1wLCBoc2EsIG9uU1MpOwogICAgICAgIGlmIChlbXAudW5zdXJlKSB7CiAgICAgICAgICB2YXIgaWVwRSA9IGFkZE1vbnRocyhlNjUsIDMpOwogICAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJIZWFkcy11cCIsIGg6IHYucHJlICsgIkNvbmZpcm0gdGhlIGVtcGxveWVyIGhhcyAyMCBvciBtb3JlIGVtcGxveWVlcyIsCiAgICAgICAgICAgIGI6ICJUaGVzZSBkYXRlcyBhc3N1bWUgaXQgZG9lcy4gV2l0aCBmZXdlciB0aGFuIDIwIGVtcGxveWVlcywgTWVkaWNhcmUgcGF5cyBmaXJzdCBhdCA2NSwgc28gZW5yb2xsbWVudCBpbiBQYXJ0cyBBIGFuZCBCIGJlbG9uZ3MgaW4gdGhlIEluaXRpYWwgRW5yb2xsbWVudCBQZXJpb2QsICIgKyBzcGFuKGFkZE1vbnRocyhlNjUsIC0zKSwgaWVwRSkgKyAiLiIgKyAoY21wKE5PVywgaWVwRSkgPiAwID8gIiBUaGF0IHdpbmRvdyBoYXMgcGFzc2VkOyB0YWxrIHdpdGggeW91ciBCS00gYWR2aXNvci4iIDogIiIpIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGVtcCAmJiBlbXAua25vd24gJiYgY21wKGVtcC5lbmQsIGU2NSkgPCAwICYmIGNtcChlNjUsIE5PVykgPiAwKSB7CiAgICAgICAgdmFyIGVuZGVkQWxyZWFkeSA9IGNtcChlbXAuZW5kLCBOT1cpIDwgMDsKICAgICAgICBvdXQucHVzaCh7IHRhZzogIkhlYWRzLXVwIiwgaDogdi5wcmUgKyAiQnJpZGdlIHRoZSBnYXAgdW50aWwgTWVkaWNhcmUgc3RhcnRzIGluICIgKyBmbXQoZTY1KSwKICAgICAgICAgIGI6ICJUaGUgZW1wbG95ZXIgY292ZXJhZ2UgIiArIChlbmRlZEFscmVhZHkgPyAiZW5kZWQgIiA6ICJlbmRzICIpICsgZm10KGVtcC5lbmQpICsgIiwgYmVmb3JlIGFnZSA2NS4gQXJyYW5nZSBDT0JSQSBvciBhIE1hcmtldHBsYWNlIHBsYW4gdG8gY292ZXIgIiArIHNwYW4oYWRkTW9udGhzKGVtcC5lbmQsIDEpLCBhZGRNb250aHMoZTY1LCAtMSkpICsgIi4gTG9zaW5nIGpvYi1iYXNlZCBjb3ZlcmFnZSBvcGVucyBhIDYwLWRheSB3aW5kb3cgdG8gZW5yb2xsIGluIGEgTWFya2V0cGxhY2UgcGxhbi4iIH0pOwogICAgICB9CiAgICAgIGlmIChlbXAgJiYgIWVtcC5sYXJnZSAmJiAoIWVtcC5rbm93biB8fCBjbXAoZW1wLmVuZCwgZTY1KSA+PSAwKSkgewogICAgICAgIG91dC5wdXNoKHsgdGFnOiAiSGVhZHMtdXAiLCBoOiB2LnByZSArICJTbWFsbCBlbXBsb3llcjogTWVkaWNhcmUgcGF5cyBmaXJzdCBhdCA2NSIsCiAgICAgICAgICBiOiAiV2l0aCBmZXdlciB0aGFuIDIwIGVtcGxveWVlcywgdGhlIGVtcGxveWVyIHBsYW4gcGF5cyBzZWNvbmQgb25jZSBNZWRpY2FyZSBlbGlnaWJpbGl0eSBiZWdpbnMuIEVucm9sbCBpbiBQYXJ0cyBBIGFuZCBCIGR1cmluZyB0aGUgSW5pdGlhbCBFbnJvbGxtZW50IFBlcmlvZCBiZWxvdzsgb3RoZXJ3aXNlIHRoZSBwbGFuIG1heSByZWZ1c2UgdG8gcGF5IGNsYWltcyBNZWRpY2FyZSB3b3VsZCBoYXZlIGNvdmVyZWQuIiB9KTsKICAgICAgfQogICAgICBpZXBQYXRoKG91dCwgdiwgZTY1LCBvblNTKTsKICAgICAgaWYgKHR5cGUgJiYgVFlQRV9XQVJOSU5HU1t0eXBlXSkgb3V0LnB1c2goeyB0YWc6ICJIZWFkcy11cCIsIGg6IFRZUEVfV0FSTklOR1NbdHlwZV0uaCwgYjogVFlQRV9XQVJOSU5HU1t0eXBlXS5iIH0pOwogICAgfQogICAgZnVuY3Rpb24gdGltZWxpbmUocCkgewogICAgICB2YXIgb3V0ID0gW107CiAgICAgIGlmICghcC5lNjUpIHJldHVybiBvdXQ7CiAgICAgIHZhciB5b3UgPSB7IHByZTogIiIgfSwgc3AgPSB7IHByZTogIllvdXIgc3BvdXNlOiAiIH07CiAgICAgIGlmIChwLnR5cGUgPT09ICJhbHJlYWR5X21lZGljYXJlIikgewogICAgICAgIG91dC5wdXNoKHsgaDogIllvdSdyZSBhbHJlYWR5IGVucm9sbGVkIGluIE1lZGljYXJlIiwgYjogIlRoZXJlIGFyZSBubyBlbnJvbGxtZW50IGRlYWRsaW5lcyB0byBtZWV0LiBUaGUgZGVjaXNpb25zIG5vdyBhcmUgd2hpY2ggcGxhbnMgdG8gaG9sZCBhbmQgd2hlbiB5b3UgY2FuIGNoYW5nZSB0aGVtLiIgfSk7CiAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJIZWFkcy11cCIsIGg6ICJTd2l0Y2hpbmcgdG8gTWVkaWdhcCBsYXRlciBpc24ndCBndWFyYW50ZWVkIiwgYjogIlRoZSA2LW1vbnRoIE1lZGlnYXAgZ3VhcmFudGVlZC1pc3N1ZSB3aW5kb3cgc3RhcnRlZCB3aGVuIFBhcnQgQiBiZWdhbi4gSWYgdGhhdCB3YXMgbW9yZSB0aGFuIDYgbW9udGhzIGFnbywgaW5zdXJlcnMgY2FuIHVzdWFsbHkgcmVxdWlyZSBtZWRpY2FsIHVuZGVyd3JpdGluZyBhbmQgbWF5IGRlY2xpbmUgeW91LiBBIGZldyBzdGF0ZXMgKHN1Y2ggYXMgTmV3IFlvcmsgYW5kIENvbm5lY3RpY3V0KSBvZmZlciBicm9hZGVyIHByb3RlY3Rpb25zLiIgfSk7CiAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJLZXkgZGF0ZSIsIGg6ICJOZXh0IE9wZW4gRW5yb2xsbWVudDogIiArIG9lcFRleHQoKSwgYjogIlJldmlldyB5b3VyIGRydWcgb3IgQWR2YW50YWdlIHBsYW4gZXZlcnkgZmFsbCB1c2luZyB0aGUgUGxhbiBGaW5kZXIgYXQgTWVkaWNhcmUuZ292LiBQcmVtaXVtcywgZm9ybXVsYXJpZXMsIGFuZCBuZXR3b3JrcyBjaGFuZ2UgZWFjaCBKYW51YXJ5LiBBZHZhbnRhZ2UgbWVtYmVycyBhbHNvIGdldCBhIHNlY29uZCBjaGFuY2UgSmFudWFyeSAxIFx1MjAxMyBNYXJjaCAzMS4iIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIG91dC5wdXNoKHsgaDogIkhvdyB0byBhcHBseSIsIGI6ICJBcHBseSBvbmxpbmUgYXQgc3NhLmdvdi9tZWRpY2FyZSwgYnkgcGhvbmUgYXQgMS04MDAtNzcyLTEyMTMsIG9yIGF0IGEgbG9jYWwgU29jaWFsIFNlY3VyaXR5IG9mZmljZS4gRHJ1ZywgQWR2YW50YWdlLCBhbmQgTWVkaWdhcCBwbGFucyBhcmUgY2hvc2VuIHNlcGFyYXRlbHk7IGNvbXBhcmUgdGhlbSBhdCBNZWRpY2FyZS5nb3YuIiB9KTsKICAgICAgICBwbGFuRm9yKG91dCwgeW91LCBwLmU2NSwgcC5lbXAsIHAuaHNhLCBwLm9uU1MsIHAudHlwZSk7CiAgICAgIH0KICAgICAgaWYgKHAuc3BFNjUpIHsKICAgICAgICBpZiAocC5zcENvdiA9PT0gIm1lZGljYXJlIikgewogICAgICAgICAgb3V0LnB1c2goeyBoOiAiWW91ciBzcG91c2U6IGFscmVhZHkgb24gTWVkaWNhcmUiLCBiOiAiTm8gZW5yb2xsbWVudCBkZWFkbGluZXMuIFJldmlldyB0aGVpciBwbGFucyBlYWNoIGZhbGwgZHVyaW5nIE9wZW4gRW5yb2xsbWVudC4iIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwbGFuRm9yKG91dCwgc3AsIHAuc3BFNjUsIHAuc3BFbXAsIHAuc3BIc2EsIG51bGwsIG51bGwpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAocC50eXBlICE9PSAiYWxyZWFkeV9tZWRpY2FyZSIpIG91dC5wdXNoKHsgaDogIkNvbXBhcmUgcGxhbnMgYW5kIHJldmlldyBldmVyeSBmYWxsIiwgYjogIlVzZSB0aGUgUGxhbiBGaW5kZXIgYXQgTWVkaWNhcmUuZ292IHdpdGggeW91ciBleGFjdCBkcnVnIGxpc3QuIEVhY2ggeWVhciwgT3BlbiBFbnJvbGxtZW50IChPY3RvYmVyIDE1IFx1MjAxMyBEZWNlbWJlciA3KSBsZXRzIHlvdSBzd2l0Y2ggZHJ1ZyBvciBBZHZhbnRhZ2UgcGxhbnMsIGFuZCBBZHZhbnRhZ2UgbWVtYmVycyBnZXQgYSBzZWNvbmQgY2hhbmNlIEphbnVhcnkgMSBcdTIwMTMgTWFyY2ggMzEuIiB9KTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIC8qIC0tLS0tLS0tLS0gcmVjb21tZW5kYXRpb24gLS0tLS0tLS0tLSAqLwogICAgZnVuY3Rpb24gY29tcHV0ZVJlc3VsdChhbnN3ZXJzKSB7CiAgICAgIHZhciBtID0gMCwgYSA9IDA7CiAgICAgIENIT0lDRV9RVUVTVElPTlMuZm9yRWFjaChmdW5jdGlvbiAocSkgewogICAgICAgIHZhciB2YWwgPSBhbnN3ZXJzW3EuaWRdOyBpZiAoIXZhbCkgcmV0dXJuOwogICAgICAgIHEub3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7IGlmIChvLnZhbHVlID09PSB2YWwpIHsgbSArPSBvLnNjb3JlLm07IGEgKz0gby5zY29yZS5hOyB9IH0pOwogICAgICB9KTsKICAgICAgdmFyIGRpZmYgPSBtIC0gYTsKICAgICAgcmV0dXJuIHsgcGF0aDogZGlmZiA+PSAyID8gIm1lZGlnYXAiIDogZGlmZiA8PSAtMiA/ICJhZHZhbnRhZ2UiIDogImJhbGFuY2VkIiwgbGVhbjogZGlmZiA+IDAgPyAibWVkaWdhcCIgOiBkaWZmIDwgMCA/ICJhZHZhbnRhZ2UiIDogIm5vbmUiIH07CiAgICB9CiAgICAvKiAtLS0tLS0tLS0tIGh0bWwgaGVscGVycyAtLS0tLS0tLS0tICovCiAgICBmdW5jdGlvbiBtb250aE9wdHMoKSB7IHJldHVybiBNT05USFMubWFwKGZ1bmN0aW9uIChuLCBpKSB7IHJldHVybiB7IHZhbHVlOiBTdHJpbmcoaSArIDEpLCBsYWJlbDogbiB9OyB9KTsgfQogICAgZnVuY3Rpb24geWVhck9wdHMoc3RhcnQsIGVuZCwgYXNjKSB7CiAgICAgIHZhciBhcnIgPSBbXTsKICAgICAgZm9yICh2YXIgeSA9IGVuZDsgeSA+PSBzdGFydDsgeS0tKSBhcnIucHVzaCh7IHZhbHVlOiBTdHJpbmcoeSksIGxhYmVsOiBTdHJpbmcoeSkgfSk7CiAgICAgIGlmIChhc2MpIGFyci5yZXZlcnNlKCk7CiAgICAgIHJldHVybiBhcnI7CiAgICB9CiAgICBmdW5jdGlvbiBzZWxlY3RIVE1MKGZpZWxkLCBwaCwgb3B0cywgYXJpYSkgewogICAgICB2YXIgdiA9IFN0cmluZyhzdGF0ZS5pbnRha2VbZmllbGRdKTsKICAgICAgdmFyIGggPSAiPGRpdiBjbGFzcz0nYmttLXNlbGVjdHdyYXAnPjxzZWxlY3QgY2xhc3M9J2JrbS1zZWxlY3QnIGlkPSdia20tZi0iICsgZmllbGQgKyAiJyBkYXRhLWZpZWxkPSciICsgZmllbGQgKyAiJyBhcmlhLWxhYmVsPSciICsgYXJpYSArICInPjxvcHRpb24gdmFsdWU9Jyc+IiArIHBoICsgIjwvb3B0aW9uPiI7CiAgICAgIG9wdHMuZm9yRWFjaChmdW5jdGlvbiAobykgeyBoICs9ICI8b3B0aW9uIHZhbHVlPSciICsgby52YWx1ZSArICInIiArICh2ID09PSBvLnZhbHVlID8gIiBzZWxlY3RlZCIgOiAiIikgKyAiPiIgKyBvLmxhYmVsICsgIjwvb3B0aW9uPiI7IH0pOwogICAgICByZXR1cm4gaCArICI8L3NlbGVjdD48L2Rpdj4iOwogICAgfQogICAgZnVuY3Rpb24gbGFiZWxIVE1MKGZpZWxkLCB0ZXh0KSB7IHJldHVybiAiPHAgY2xhc3M9J2JrbS1sYWJlbCcgaWQ9J2JrbS1sLSIgKyBmaWVsZCArICInPiIgKyB0ZXh0ICsgIjwvcD4iOyB9CiAgICBmdW5jdGlvbiBwaWxsc0hUTUwoZmllbGQsIG9wdHMpIHsKICAgICAgdmFyIHYgPSBzdGF0ZS5pbnRha2VbZmllbGRdOwogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9J2JrbS1waWxscm93JyByb2xlPSdyYWRpb2dyb3VwJyBhcmlhLWxhYmVsbGVkYnk9J2JrbS1sLSIgKyBmaWVsZCArICInPiIgKyBvcHRzLm1hcChmdW5jdGlvbiAobykgewogICAgICAgIHZhciBvbiA9IHYgPT09IG8udjsKICAgICAgICByZXR1cm4gIjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nYmttLXBpbGwiICsgKG9uID8gIiBpcy1hY3RpdmUiIDogIiIpICsgIicgcm9sZT0ncmFkaW8nIGFyaWEtY2hlY2tlZD0nIiArIG9uICsgIicgZGF0YS1hY3Rpb249J3NldCcgZGF0YS1maWVsZD0nIiArIGZpZWxkICsgIicgZGF0YS12YWw9JyIgKyBvLnYgKyAiJz4iICsgby5sICsgIjwvYnV0dG9uPiI7CiAgICAgIH0pLmpvaW4oIiIpICsgIjwvZGl2PiI7CiAgICB9CiAgICBmdW5jdGlvbiBvcHRzSFRNTChmaWVsZCwgb3B0cywgdGlnaHQpIHsKICAgICAgdmFyIHYgPSBzdGF0ZS5pbnRha2VbZmllbGRdOwogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9J2JrbS1vcHRpb25zIiArICh0aWdodCA/ICIgaXMtdGlnaHQiIDogIiIpICsgIicgcm9sZT0ncmFkaW9ncm91cCcgYXJpYS1sYWJlbGxlZGJ5PSdia20tbC0iICsgZmllbGQgKyAiJz4iICsgb3B0cy5tYXAoZnVuY3Rpb24gKG8pIHsKICAgICAgICB2YXIgb24gPSB2ID09PSBvLnY7CiAgICAgICAgcmV0dXJuICI8YnV0dG9uIHR5cGU9J2J1dHRvbicgY2xhc3M9J2JrbS1vcHQiICsgKG9uID8gIiBpcy1zZWxlY3RlZCIgOiAiIikgKyAiJyByb2xlPSdyYWRpbycgYXJpYS1jaGVja2VkPSciICsgb24gKyAiJyBkYXRhLWFjdGlvbj0nc2V0JyBkYXRhLWZpZWxkPSciICsgZmllbGQgKyAiJyBkYXRhLXZhbD0nIiArIG8udiArICInPjxzcGFuIGNsYXNzPSdia20tb3B0LWRvdCc+PC9zcGFuPjxzcGFuIGNsYXNzPSdia20tb3B0LWxhYmVsJz4iICsgby5sICsgIjwvc3Bhbj48L2J1dHRvbj4iOwogICAgICB9KS5qb2luKCIiKSArICI8L2Rpdj4iOwogICAgfQogICAgZnVuY3Rpb24gY2hlY2tIVE1MKGZpZWxkLCB0ZXh0KSB7CiAgICAgIHJldHVybiAiPGxhYmVsIGNsYXNzPSdia20tY2hlY2snPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgaWQ9J2JrbS1mLSIgKyBmaWVsZCArICInIGRhdGEtZmllbGQ9JyIgKyBmaWVsZCArICInIiArIChzdGF0ZS5pbnRha2VbZmllbGRdID8gIiBjaGVja2VkIiA6ICIiKSArICI+PHNwYW4+IiArIHRleHQgKyAiPC9zcGFuPjwvbGFiZWw+IjsKICAgIH0KICAgIGZ1bmN0aW9uIG5hdkhUTUwobGFiZWwsIGRpc2FibGVkKSB7CiAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nYmttLW5hdic+PGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSdia20tYnRuLWdob3N0JyBkYXRhLWFjdGlvbj0nYmFjayc+QmFjazwvYnV0dG9uPjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nYmttLWJ0bicgZGF0YS1hY3Rpb249J25leHQnIiArIChkaXNhYmxlZCA/ICIgZGlzYWJsZWQiIDogIiIpICsgIj4iICsgbGFiZWwgKyAiPC9idXR0b24+PC9kaXY+IjsKICAgIH0KICAgIGZ1bmN0aW9uIHN0ZXBIZWFkKGV5ZWJyb3csIHRpdGxlLCBoZWxwKSB7CiAgICAgIHZhciBzdCA9IHN0ZXBzKCk7CiAgICAgIHJldHVybiAiPHAgY2xhc3M9J2JrbS1leWVicm93Jz4iICsgZXllYnJvdyArICIgJm1pZGRvdDsgU3RlcCAiICsgKHN0YXRlLnN0ZXAgKyAxKSArICIgb2YgIiArIHN0Lmxlbmd0aCArICI8L3A+PGgyIGNsYXNzPSdia20tcSBia20tZm9jdXMnIHRhYmluZGV4PSctMSc+IiArIHRpdGxlICsgIjwvaDI+IiArIChoZWxwID8gIjxwIGNsYXNzPSdia20taGVscCc+IiArIGhlbHAgKyAiPC9wPiIgOiAiIik7CiAgICB9CiAgICB2YXIgWU4gPSBbeyB2OiAieWVzIiwgbDogIlllcyIgfSwgeyB2OiAibm8iLCBsOiAiTm8iIH1dOwogICAgdmFyIFlOVSA9IFt7IHY6ICJ5ZXMiLCBsOiAiWWVzIiB9LCB7IHY6ICJubyIsIGw6ICJObyIgfSwgeyB2OiAidW5zdXJlIiwgbDogIk5vdCBzdXJlIiB9XTsKICAgIGZ1bmN0aW9uIGVuZERhdGVIVE1MKG1GLCB5RiwgdUYsIGxhYmVsLCBoaW50KSB7CiAgICAgIHZhciBpID0gc3RhdGUuaW50YWtlOwogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9J2JrbS1maWVsZCc+IiArIGxhYmVsSFRNTChtRiwgbGFiZWwpICsKICAgICAgICAiPGRpdiBjbGFzcz0nYmttLWRhdGVyb3ciICsgKGlbdUZdID8gIiBpcy1kaXNhYmxlZCIgOiAiIikgKyAiJz4iICsgc2VsZWN0SFRNTChtRiwgIk1vbnRoIiwgbW9udGhPcHRzKCksICJNb250aCIpICsgc2VsZWN0SFRNTCh5RiwgIlllYXIiLCB5ZWFyT3B0cyhOT1cueSAtIDMsIE5PVy55ICsgMTUsIHRydWUpLCAiWWVhciIpICsgIjwvZGl2PiIgKwogICAgICAgIGNoZWNrSFRNTCh1RiwgIk5vIGVuZCBkYXRlIHBsYW5uZWQgeWV0IikgKyAiPHAgY2xhc3M9J2JrbS1zbWFsbCc+IiArIGhpbnQgKyAiPC9wPjwvZGl2PiI7CiAgICB9CiAgICAvKiAtLS0tLS0tLS0tIHNjcmVlbnMgLS0tLS0tLS0tLSAqLwogICAgZnVuY3Rpb24gaW50cm9IVE1MKCkgewogICAgICByZXR1cm4gIjxzZWN0aW9uIGNsYXNzPSdia20tY2FyZCBia20tZmFkZSc+PHAgY2xhc3M9J2JrbS1leWVicm93Jz5BIGd1aWRlZCBkZWNpc2lvbiB0b29sIGZvciBCS00gY2xpZW50czwvcD4iICsKICAgICAgICAiPGgxIGNsYXNzPSdia20taDEgYmttLWZvY3VzJyB0YWJpbmRleD0nLTEnPkZpbmQgeW91ciBNZWRpY2FyZSA8ZW0+cGF0aHdheTwvZW0+LjwvaDE+IiArCiAgICAgICAgIjxwIGNsYXNzPSdia20tbGVhZCc+QSBmZXcgcXVlc3Rpb25zIGFib3V0IHlvdXIgZGF0ZXMsIHlvdXIgY292ZXJhZ2UsIGFuZCBob3cgeW91IGxpa2UgdG8gbWFuYWdlIGNvc3RzLiBXZSdsbCBwb2ludCB5b3UgdG93YXJkIHRoZSBwYXRoIHRoYXQgdGVuZHMgdG8gZml0IGJlc3QgJm1kYXNoOyBhIE1lZGljYXJlIFN1cHBsZW1lbnQgKE1lZGlnYXApIGFwcHJvYWNoIG9yIGEgTWVkaWNhcmUgQWR2YW50YWdlIGFwcHJvYWNoICZtZGFzaDsgd2l0aCB0aGUgcmlnaHQgYWRkLW9ucyBhbmQgYW4gZW5yb2xsbWVudCB0aW1lbGluZSBidWlsdCBmcm9tIHlvdXIgYWN0dWFsIGRhdGVzLjwvcD4iICsKICAgICAgICAiPHVsIGNsYXNzPSdia20taW50cm9saXN0Jz48bGk+PGI+QWJvdXQgNCBtaW51dGVzLjwvYj4gT25lIHN0ZXAgYXQgYSB0aW1lLjwvbGk+PGxpPjxiPkEgZGF0ZWQgcGxhbi48L2I+IEV4YWN0IGVucm9sbG1lbnQgd2luZG93cyBmb3IgeW91IGFuZCB5b3VyIHNwb3VzZS48L2xpPjxsaT48Yj5Qcml2YXRlLjwvYj4gWW91ciBhbnN3ZXJzIHN0YXkgaW4geW91ciBicm93c2VyIHVubGVzcyB5b3UgY2hvb3NlIHRvIHJlcXVlc3QgeW91ciBmdWxsIHJlcG9ydC48L2xpPjwvdWw+IiArCiAgICAgICAgIjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nYmttLWJ0biBia20tYnRuLWxnJyBkYXRhLWFjdGlvbj0nYmVnaW4nPkJlZ2luPC9idXR0b24+PC9zZWN0aW9uPiI7CiAgICB9CiAgICBmdW5jdGlvbiBhZ2VzSFRNTCgpIHsKICAgICAgdmFyIGkgPSBzdGF0ZS5pbnRha2U7CiAgICAgIHZhciBhZ2UgPSAoaS5iaXJ0aE0gJiYgaS5iaXJ0aFkpID8gTk9XLnkgLSAoK2kuYmlydGhZKSAtIChOT1cubSA8ICtpLmJpcnRoTSA/IDEgOiAwKSA6IG51bGw7CiAgICAgIHZhciBoID0gIjxzZWN0aW9uIGNsYXNzPSdia20tY2FyZCBia20tZmFkZSc+IiArIHN0ZXBIZWFkKCJBYm91dCB5b3UiLCAiRmlyc3QsIHlvdXIgYWdlcyIsICJZb3VyIGJpcnRoIG1vbnRoIHNldHMgeW91ciBNZWRpY2FyZSBlbnJvbGxtZW50IGRhdGVzLiIpOwogICAgICBoICs9ICI8ZGl2IGNsYXNzPSdia20tZmllbGQnPiIgKyBsYWJlbEhUTUwoImJpcnRoTSIsICJZb3VyIGRhdGUgb2YgYmlydGgiKSArICI8ZGl2IGNsYXNzPSdia20tZGF0ZXJvdyc+IiArIHNlbGVjdEhUTUwoImJpcnRoTSIsICJNb250aCIsIG1vbnRoT3B0cygpLCAiQmlydGggbW9udGgiKSArIHNlbGVjdEhUTUwoImJpcnRoWSIsICJZZWFyIiwgeWVhck9wdHMoMTkzMCwgTk9XLnkgLSA0MCksICJCaXJ0aCB5ZWFyIikgKyAiPC9kaXY+IiArCiAgICAgICAgY2hlY2tIVE1MKCJiaXJ0aDFzdCIsICJJIHdhcyBib3JuIG9uIHRoZSAxc3Qgb2YgdGhlIG1vbnRoIikgKyAoYWdlICE9PSBudWxsID8gIjxwIGNsYXNzPSdia20tbm90ZSc+WW91J3JlIGFib3V0ICIgKyBhZ2UgKyAiIHllYXJzIG9sZCB0b2RheS48L3A+IiA6ICIiKSArICI8L2Rpdj4iOwogICAgICBoICs9ICI8ZGl2IGNsYXNzPSdia20tZmllbGQnPiIgKyBsYWJlbEhUTUwoIm1hcnJpZWQiLCAiQXJlIHlvdSBtYXJyaWVkIG9yIHBhcnRuZXJlZD8iKSArIHBpbGxzSFRNTCgibWFycmllZCIsIFt7IHY6ICJ5ZXMiLCBsOiAiWWVzIiB9LCB7IHY6ICJubyIsIGw6ICJKdXN0IG1lIiB9XSkgKyAiPC9kaXY+IjsKICAgICAgaWYgKGkubWFycmllZCA9PT0gInllcyIpIHsKICAgICAgICBoICs9ICI8ZGl2IGNsYXNzPSdia20tZmllbGQnPiIgKyBsYWJlbEhUTUwoInNwb3VzZUJpcnRoTSIsICJZb3VyIHNwb3VzZSdzIG9yIHBhcnRuZXIncyBkYXRlIG9mIGJpcnRoIikgKyAiPGRpdiBjbGFzcz0nYmttLWRhdGVyb3cnPiIgKyBzZWxlY3RIVE1MKCJzcG91c2VCaXJ0aE0iLCAiTW9udGgiLCBtb250aE9wdHMoKSwgIlNwb3VzZSBiaXJ0aCBtb250aCIpICsgc2VsZWN0SFRNTCgic3BvdXNlQmlydGhZIiwgIlllYXIiLCB5ZWFyT3B0cygxOTMwLCBOT1cueSAtIDMwKSwgIlNwb3VzZSBiaXJ0aCB5ZWFyIikgKyAiPC9kaXY+IiArCiAgICAgICAgICBjaGVja0hUTUwoInNwb3VzZTFzdCIsICJNeSBzcG91c2Ugd2FzIGJvcm4gb24gdGhlIDFzdCBvZiB0aGUgbW9udGgiKSArICI8L2Rpdj4iOwogICAgICB9CiAgICAgIGggKz0gIjxwIGNsYXNzPSdia20tc21hbGwnIHN0eWxlPSdtYXJnaW46LThweCAwIDIwcHgnPldoeSB0aGUgMXN0PyBTb2NpYWwgU2VjdXJpdHkgdHJlYXRzIGFueW9uZSBib3JuIG9uIHRoZSAxc3QgYXMgdHVybmluZyA2NSB0aGUgbW9udGggYmVmb3JlLCBzbyBldmVyeSB3aW5kb3cgc3RhcnRzIG9uZSBtb250aCBlYXJsaWVyLjwvcD4iOwogICAgICByZXR1cm4gaCArIG5hdkhUTUwoIkNvbnRpbnVlIiwgIXZhbGlkQWdlcygpKSArICI8L3NlY3Rpb24+IjsKICAgIH0KICAgIGZ1bmN0aW9uIGNvdmVyYWdlSFRNTCgpIHsKICAgICAgdmFyIGkgPSBzdGF0ZS5pbnRha2U7CiAgICAgIHZhciBoID0gIjxzZWN0aW9uIGNsYXNzPSdia20tY2FyZCBia20tZmFkZSc+IiArIHN0ZXBIZWFkKCJZb3VyIGNvdmVyYWdlIiwgIllvdXIgY292ZXJhZ2UgdG9kYXkiLCAiVGhpcyBkZWNpZGVzIHlvdXIgZGVhZGxpbmVzLiBTb21lIGNvdmVyYWdlIGxldHMgeW91IGRlbGF5IFBhcnQgQiwgYW5kIHNvbWUgZG9lc24ndC4iKTsKICAgICAgaCArPSAiPGRpdiBjbGFzcz0nYmttLWZpZWxkJz4iICsgbGFiZWxIVE1MKCJjb3ZlcmFnZVR5cGUiLCAiV2hpY2ggYmVzdCBkZXNjcmliZXMgeW91ciBoZWFsdGggY292ZXJhZ2UgdG9kYXk/IikgKyBvcHRzSFRNTCgiY292ZXJhZ2VUeXBlIiwgQ09WRVJBR0VfT1BUSU9OUywgdHJ1ZSkgKyAiPC9kaXY+IjsKICAgICAgaWYgKGlzRW1wVHlwZShpLmNvdmVyYWdlVHlwZSkpIHsKICAgICAgICBoICs9ICI8ZGl2IGNsYXNzPSdia20tZmllbGQnPiIgKyBsYWJlbEhUTUwoImVtcFNpemUiLCAiRG9lcyB0aGF0IGVtcGxveWVyIGhhdmUgMjAgb3IgbW9yZSBlbXBsb3llZXM/IikgKyBwaWxsc0hUTUwoImVtcFNpemUiLCBZTlUpICsgIjwvZGl2PiI7CiAgICAgICAgaCArPSBlbmREYXRlSFRNTCgiZW5kTSIsICJlbmRZIiwgImVuZFVua25vd24iLCAiV2hhdCdzIHRoZSBsYXN0IG1vbnRoIHlvdSBleHBlY3QgdG8gaGF2ZSB0aGF0IGVtcGxveWVyIGNvdmVyYWdlPyIsCiAgICAgICAgICAoaS5jb3ZlcmFnZVR5cGUgPT09ICJlbXBsb3llcl9zcG91c2UiID8gIlVzdWFsbHkgdGhlIG1vbnRoIHlvdXIgc3BvdXNlIHJldGlyZXMuICIgOiAiVXN1YWxseSB0aGUgbW9udGggeW91IHJldGlyZS4gIikgKyAiSWYgaXQgYWxyZWFkeSBlbmRlZCwgY2hvb3NlIHRoZSBtb250aCBpdCBlbmRlZC4iKTsKICAgICAgICBoICs9ICI8ZGl2IGNsYXNzPSdia20tZmllbGQnPiIgKyBsYWJlbEhUTUwoImhzYSIsICJEb2VzIGFueW9uZSBpbiB5b3VyIGhvdXNlaG9sZCBjb250cmlidXRlIHRvIGEgSGVhbHRoIFNhdmluZ3MgQWNjb3VudCAoSFNBKT8iKSArIHBpbGxzSFRNTCgiaHNhIiwgWU4pICsgIjwvZGl2PiI7CiAgICAgIH0KICAgICAgaWYgKGkuY292ZXJhZ2VUeXBlICYmIGkuY292ZXJhZ2VUeXBlICE9PSAiYWxyZWFkeV9tZWRpY2FyZSIpIHsKICAgICAgICBoICs9ICI8ZGl2IGNsYXNzPSdia20tZmllbGQnPiIgKyBsYWJlbEhUTUwoIm9uU1MiLCAiQXJlIHlvdSBhbHJlYWR5IHJlY2VpdmluZyBTb2NpYWwgU2VjdXJpdHkgYmVuZWZpdHM/IikgKyBwaWxsc0hUTUwoIm9uU1MiLCBZTikgKyAiPC9kaXY+IjsKICAgICAgfQogICAgICByZXR1cm4gaCArIG5hdkhUTUwoIkNvbnRpbnVlIiwgIXZhbGlkQ292ZXJhZ2UoKSkgKyAiPC9zZWN0aW9uPiI7CiAgICB9CiAgICBmdW5jdGlvbiBzcG91c2VIVE1MKCkgewogICAgICB2YXIgaSA9IHN0YXRlLmludGFrZTsKICAgICAgdmFyIG9wdHMgPSBbXTsKICAgICAgaWYgKGkuY292ZXJhZ2VUeXBlID09PSAiZW1wbG95ZXJfc2VsZiIpIG9wdHMucHVzaCh7IHY6ICJteV9lbXBsb3llciIsIGw6ICJDb3ZlcmVkIG9uIG15IGVtcGxveWVyIHBsYW4iIH0pOwogICAgICBvcHRzLnB1c2goeyB2OiAib3duX2VtcGxveWVyIiwgbDogIlRoZWlyIG93biBhY3RpdmUgZW1wbG95ZXIgb3IgdW5pb24gcGxhbiIgfSk7CiAgICAgIG9wdHMucHVzaCh7IHY6ICJtZWRpY2FyZSIsIGw6ICJBbHJlYWR5IGVucm9sbGVkIGluIE1lZGljYXJlIiB9KTsKICAgICAgb3B0cy5wdXNoKHsgdjogIm90aGVyIiwgbDogIlNvbWV0aGluZyBlbHNlIChyZXRpcmVlIHBsYW4sIENPQlJBLCBNYXJrZXRwbGFjZSwgVkEsIG9yIG5vbmUpIiB9KTsKICAgICAgdmFyIGggPSAiPHNlY3Rpb24gY2xhc3M9J2JrbS1jYXJkIGJrbS1mYWRlJz4iICsgc3RlcEhlYWQoIllvdXIgc3BvdXNlIiwgIllvdXIgc3BvdXNlJ3MgY292ZXJhZ2UiLCAiTWVkaWNhcmUgaXMgaW5kaXZpZHVhbCwgc28geW91ciBzcG91c2UgaGFzIHNlcGFyYXRlIGRlYWRsaW5lcy4iKTsKICAgICAgaCArPSAiPGRpdiBjbGFzcz0nYmttLWZpZWxkJz4iICsgbGFiZWxIVE1MKCJzcG91c2VDb3YiLCAiSG93IGlzIHlvdXIgc3BvdXNlIG9yIHBhcnRuZXIgY292ZXJlZCB0b2RheT8iKSArIG9wdHNIVE1MKCJzcG91c2VDb3YiLCBvcHRzLCB0cnVlKSArICI8L2Rpdj4iOwogICAgICBpZiAoaS5zcG91c2VDb3YgPT09ICJvd25fZW1wbG95ZXIiKSB7CiAgICAgICAgaCArPSAiPGRpdiBjbGFzcz0nYmttLWZpZWxkJz4iICsgbGFiZWxIVE1MKCJzcG91c2VFbXBTaXplIiwgIkRvZXMgdGhlaXIgZW1wbG95ZXIgaGF2ZSAyMCBvciBtb3JlIGVtcGxveWVlcz8iKSArIHBpbGxzSFRNTCgic3BvdXNlRW1wU2l6ZSIsIFlOVSkgKyAiPC9kaXY+IjsKICAgICAgICBoICs9IGVuZERhdGVIVE1MKCJzcG91c2VFbmRNIiwgInNwb3VzZUVuZFkiLCAic3BvdXNlRW5kVW5rbm93biIsICJXaGF0J3MgdGhlIGxhc3QgbW9udGggdGhleSBleHBlY3QgdG8gaGF2ZSB0aGF0IGNvdmVyYWdlPyIsICJVc3VhbGx5IHRoZSBtb250aCB0aGV5IHJldGlyZS4gSWYgaXQgYWxyZWFkeSBlbmRlZCwgY2hvb3NlIHRoZSBtb250aCBpdCBlbmRlZC4iKTsKICAgICAgICBoICs9ICI8ZGl2IGNsYXNzPSdia20tZmllbGQnPiIgKyBsYWJlbEhUTUwoInNwb3VzZUhzYSIsICJEb2VzIHlvdXIgc3BvdXNlIGNvbnRyaWJ1dGUgdG8gYW4gSFNBPyIpICsgcGlsbHNIVE1MKCJzcG91c2VIc2EiLCBZTikgKyAiPC9kaXY+IjsKICAgICAgfQogICAgICByZXR1cm4gaCArIG5hdkhUTUwoIkNvbnRpbnVlIiwgIXZhbGlkU3BvdXNlKCkpICsgIjwvc2VjdGlvbj4iOwogICAgfQogICAgZnVuY3Rpb24gY2hvaWNlSFRNTChpZCkgewogICAgICB2YXIgcSA9IG51bGw7CiAgICAgIENIT0lDRV9RVUVTVElPTlMuZm9yRWFjaChmdW5jdGlvbiAoeCkgeyBpZiAoeC5pZCA9PT0gaWQpIHEgPSB4OyB9KTsKICAgICAgdmFyIHNlbCA9IHN0YXRlLmFuc3dlcnNbcS5pZF0sIGxhc3QgPSBzdGF0ZS5zdGVwID09PSBzdGVwcygpLmxlbmd0aCAtIDE7CiAgICAgIHZhciBvcHRzID0gcS5vcHRpb25zLm1hcChmdW5jdGlvbiAobykgewogICAgICAgIHZhciBvbiA9IHNlbCA9PT0gby52YWx1ZTsKICAgICAgICByZXR1cm4gIjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nYmttLW9wdCIgKyAob24gPyAiIGlzLXNlbGVjdGVkIiA6ICIiKSArICInIHJvbGU9J3JhZGlvJyBhcmlhLWNoZWNrZWQ9JyIgKyBvbiArICInIGRhdGEtYWN0aW9uPSdjaG9pY2UnIGRhdGEtcWlkPSciICsgcS5pZCArICInIGRhdGEtdmFsPSciICsgby52YWx1ZSArICInPjxzcGFuIGNsYXNzPSdia20tb3B0LWRvdCc+PC9zcGFuPjxzcGFuIGNsYXNzPSdia20tb3B0LWxhYmVsJz4iICsgby5sYWJlbCArICI8L3NwYW4+PC9idXR0b24+IjsKICAgICAgfSkuam9pbigiIik7CiAgICAgIHJldHVybiAiPHNlY3Rpb24gY2xhc3M9J2JrbS1jYXJkIGJrbS1mYWRlJz4iICsgc3RlcEhlYWQocS5leWVicm93LCBxLnRpdGxlLCBxLmhlbHApICsgIjxkaXYgY2xhc3M9J2JrbS1vcHRpb25zJyByb2xlPSdyYWRpb2dyb3VwJyBhcmlhLWxhYmVsPSdDaG9pY2VzJz4iICsgb3B0cyArICI8L2Rpdj4iICsgbmF2SFRNTChsYXN0ID8gIlNlZSBteSBwYXRod2F5IiA6ICJDb250aW51ZSIsICFzZWwpICsgIjwvc2VjdGlvbj4iOwogICAgfQogICAgZnVuY3Rpb24gbGlzdChpdGVtcykgeyByZXR1cm4gaXRlbXMubWFwKGZ1bmN0aW9uICh0KSB7IHJldHVybiAiPGxpPiIgKyB0ICsgIjwvbGk+IjsgfSkuam9pbigiIik7IH0KICAgIGZ1bmN0aW9uIGJhc2lzVGV4dChwKSB7CiAgICAgIHZhciBwYXJ0cyA9IFtdOwogICAgICBwYXJ0cy5wdXNoKCJBZ2UgNjU6ICIgKyBmbXQocC5lNjUpKTsKICAgICAgaWYgKHAuc3BFNjUpIHBhcnRzLnB1c2goInNwb3VzZSBhZ2UgNjU6ICIgKyBmbXQocC5zcEU2NSkpOwogICAgICBDT1ZFUkFHRV9PUFRJT05TLmZvckVhY2goZnVuY3Rpb24gKG8pIHsgaWYgKG8udiA9PT0gcC50eXBlKSBwYXJ0cy5wdXNoKG8ucyk7IH0pOwogICAgICBpZiAocC5lbXApIHBhcnRzLnB1c2gocC5lbXAua25vd24gJiYgcC5lbXAuZW5kID8gImVtcGxveWVyIGNvdmVyYWdlIHRocm91Z2ggIiArIGZtdChwLmVtcC5lbmQpIDogIm5vIGVuZCBkYXRlIHNldCIpOwogICAgICBwYXJ0cy5wdXNoKCJjYWxjdWxhdGVkICIgKyBNT05USFNbTk9XLm0gLSAxXSArICIgIiArIE5PVy5kICsgIiwgIiArIE5PVy55KTsKICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oIiAmbWlkZG90OyAiKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc3VsdHNIVE1MKCkgewogICAgICB2YXIgciA9IGNvbXB1dGVSZXN1bHQoc3RhdGUuYW5zd2VycyksIHAgPSBwcm9maWxlKCksIEEgPSBzdGF0ZS5hbnN3ZXJzOwogICAgICB2YXIgaXNNID0gci5wYXRoID09PSAibWVkaWdhcCIsIGlzQSA9IHIucGF0aCA9PT0gImFkdmFudGFnZSIsIGlzQiA9IHIucGF0aCA9PT0gImJhbGFuY2VkIjsKICAgICAgdmFyIGV4dHJhcyA9IEEuZXh0cmFzID09PSAid2FudHNfZXh0cmFzIiwgaW50bCA9IEEudHJhdmVsID09PSAiaW50ZXJuYXRpb25hbCI7CiAgICAgIHZhciBoZWFkbGluZSwgc3VtbWFyeTsKICAgICAgaWYgKGlzTSkgewogICAgICAgIGhlYWRsaW5lID0gIk9yaWdpbmFsIE1lZGljYXJlICsgYSBNZWRpZ2FwIHBvbGljeSArIGEgUGFydCBEIGRydWcgcGxhbiI7CiAgICAgICAgc3VtbWFyeSA9ICJPcmlnaW5hbCBNZWRpY2FyZSAoUGFydHMgQSBhbmQgQikgcGFpcmVkIHdpdGggYSBNZWRpY2FyZSBTdXBwbGVtZW50IHBvbGljeSAoUGxhbiBHIGFuZCBQbGFuIE4gYXJlIHRoZSBtb3N0IHBvcHVsYXIpLCBwbHVzIGEgc3RhbmQtYWxvbmUgUGFydCBEIHByZXNjcmlwdGlvbiBwbGFuLiBIaWdoZXIgbW9udGhseSBwcmVtaXVtLCBidXQgdmVyeSBwcmVkaWN0YWJsZSBiaWxscyBhbmQgYW55LXByb3ZpZGVyIGFjY2VzcyBuYXRpb253aWRlLiI7CiAgICAgIH0gZWxzZSBpZiAoaXNBKSB7CiAgICAgICAgaGVhZGxpbmUgPSAiQSBNZWRpY2FyZSBBZHZhbnRhZ2UgcGxhbiB3aXRoIGJ1aWx0LWluIGRydWcgY292ZXJhZ2UiICsgKGV4dHJhcyA/ICIsIGRlbnRhbCAmYW1wOyB2aXNpb24iIDogIiIpOwogICAgICAgIHN1bW1hcnkgPSAiQSBNZWRpY2FyZSBBZHZhbnRhZ2UgKFBhcnQgQykgcGxhbiBidW5kbGVzIFBhcnRzIEEsIEIsIGFuZCB1c3VhbGx5IEQsIGFuZCBvZnRlbiBhZGRzIGRlbnRhbCwgdmlzaW9uLCBoZWFyaW5nLCBhbmQgZml0bmVzcyBiZW5lZml0cywgZnJlcXVlbnRseSBmb3IgYSBsb3cgb3IgJDAgcGxhbiBwcmVtaXVtICh5b3Ugc3RpbGwgcGF5IHRoZSBQYXJ0IEIgcHJlbWl1bSkuIExvd2VyIGZpeGVkIGNvc3QsIGluIGV4Y2hhbmdlIGZvciB1c2luZyBhIGxvY2FsIG5ldHdvcmsuIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBoZWFkbGluZSA9ICJFaXRoZXIgcGF0aCBjYW4gd29yayAmbWRhc2g7IGhlcmUncyBob3cgdG8gY2hvb3NlIjsKICAgICAgICBzdW1tYXJ5ID0gIllvdXIgYW5zd2VycyBkb24ndCBwb2ludCBzdHJvbmdseSBvbmUgd2F5LiBUaGUgY29yZSB0cmFkZS1vZmY6IE1lZGlnYXAgbWVhbnMgYSBoaWdoZXIgcHJlbWl1bSB3aXRoIHByZWRpY3RhYmxlIGJpbGxzIGFuZCBhbnkgcHJvdmlkZXIgbmF0aW9ud2lkZTsgTWVkaWNhcmUgQWR2YW50YWdlIG1lYW5zIGEgbG93ZXIgcHJlbWl1bSB3aXRoIGxvY2FsIG5ldHdvcmtzIGFuZCBidW5kbGVkIGV4dHJhcy4iICsKICAgICAgICAgIChyLmxlYW4gPT09ICJtZWRpZ2FwIiA/ICIgWW91IGxlYW4gc2xpZ2h0bHkgdG93YXJkIHRoZSBNZWRpZ2FwIHNpZGUuIiA6IHIubGVhbiA9PT0gImFkdmFudGFnZSIgPyAiIFlvdSBsZWFuIHNsaWdodGx5IHRvd2FyZCB0aGUgTWVkaWNhcmUgQWR2YW50YWdlIHNpZGUuIiA6ICIiKTsKICAgICAgfQogICAgICB2YXIgd2h5ID0gW107CiAgICAgIGlmIChpc00pIHsKICAgICAgICBpZiAoQS5oZWFsdGggPT09ICJjaHJvbmljIikgd2h5LnB1c2goIldpdGggb25nb2luZyBjYXJlIG5lZWRzLCBwcmVkaWN0YWJsZSBvdXQtb2YtcG9ja2V0IGNvc3RzIGFuZCBvcGVuIHNwZWNpYWxpc3QgYWNjZXNzIGNhcnJ5IHJlYWwgdmFsdWUuIik7CiAgICAgICAgaWYgKEEucHJvdmlkZXJzID09PSAiYW55X2RvY3RvciIpIHdoeS5wdXNoKCJZb3UgY2FuIHNlZSBhbnkgZG9jdG9yIG9yIHNwZWNpYWxpc3QgbmF0aW9ud2lkZSB0aGF0IGFjY2VwdHMgTWVkaWNhcmUgJm1kYXNoOyBubyBuZXR3b3Jrcywgbm8gcmVmZXJyYWxzLiIpOwogICAgICAgIGlmIChBLnRyYXZlbCA9PT0gInNub3diaXJkIikgd2h5LnB1c2goIllvdXIgY292ZXJhZ2UgdHJhdmVscyB3aXRoIHlvdSBhY3Jvc3MgYWxsIDUwIHN0YXRlcywgd2hpY2ggZml0cyB5b3VyIHRpbWUgaW4gbW9yZSB0aGFuIG9uZSBwbGFjZS4iKTsKICAgICAgICBpZiAoaW50bCkgd2h5LnB1c2goIk1lZGlnYXAgUGxhbnMgRyBhbmQgTiBoZWxwIHdpdGggZW1lcmdlbmN5IGNhcmUgYWJyb2FkLCB3aGljaCBPcmlnaW5hbCBNZWRpY2FyZSBhbG9uZSBnZW5lcmFsbHkgZG9lc24ndCBjb3Zlci4iKTsKICAgICAgICBpZiAoQS5idWRnZXQgPT09ICJwcmVkaWN0YWJsZSIpIHdoeS5wdXNoKCJBZnRlciB5b3VyIHByZW1pdW0gYW5kIHRoZSBQYXJ0IEIgZGVkdWN0aWJsZSwgUGxhbiBHIGNvdmVycyBuZWFybHkgZXZlcnkgcmVtYWluaW5nIGdhcCwgc28gdGhlcmUgYXJlIHZlcnkgZmV3IHN1cnByaXNlIGJpbGxzLiIpOwogICAgICB9CiAgICAgIGlmIChpc0EpIHsKICAgICAgICBpZiAoQS5wcm92aWRlcnMgPT09ICJuZXR3b3JrX29rIikgd2h5LnB1c2goIllvdSdyZSBjb21mb3J0YWJsZSB1c2luZyBhIHBsYW4ncyBsb2NhbCBuZXR3b3JrIG9mIGRvY3RvcnMuIik7CiAgICAgICAgaWYgKEEuYnVkZ2V0ID09PSAibG93ZXN0X3ByZW1pdW0iKSB3aHkucHVzaCgiTG93IG1vbnRobHkgcHJlbWl1bXMgZml0IHlvdXIgcHJlZmVyZW5jZSB0byBrZWVwIGZpeGVkIGNvc3RzIGRvd24uIik7CiAgICAgICAgaWYgKEEudHJhdmVsID09PSAibG9jYWwiKSB3aHkucHVzaCgiWW91IG1vc3RseSByZWNlaXZlIGNhcmUgY2xvc2UgdG8gaG9tZSwgd2hlcmUgQWR2YW50YWdlIG5ldHdvcmtzIHdvcmsgYmVzdC4iKTsKICAgICAgICBpZiAoZXh0cmFzKSB3aHkucHVzaCgiTWFueSBBZHZhbnRhZ2UgcGxhbnMgYnVuZGxlIGRlbnRhbCwgdmlzaW9uLCBoZWFyaW5nLCBhbmQgZml0bmVzcyBiZW5lZml0cyBhdCBubyBleHRyYSBwcmVtaXVtLiIpOwogICAgICAgIGlmIChBLmhlYWx0aCA9PT0gImhlYWx0aHkiKSB3aHkucHVzaCgiV2l0aCByb3V0aW5lIGNhcmUgbmVlZHMsIHRoZSBsb3dlciBwcmVtaXVtIGFuZCBjb3BheSBzdHJ1Y3R1cmUgY2FuIHdvcmsgd2VsbC4iKTsKICAgICAgfQogICAgICB2YXIgZHJ1ZyA9ICI8Yj5QcmVzY3JpcHRpb24gZHJ1ZyBjb3ZlcmFnZS48L2I+ICIgKwogICAgICAgIChpc0EgPyAiTW9zdCBBZHZhbnRhZ2UgcGxhbnMgaW5jbHVkZSBpdDsgY29uZmlybSB5b3VyIG1lZGljYXRpb25zIGFyZSBvbiB0aGUgcGxhbidzIGZvcm11bGFyeS4iIDogaXNNID8gIkFkZCBhIHN0YW5kLWFsb25lIFBhcnQgRCBwbGFuLiIgOiAiV2l0aCBNZWRpZ2FwLCBhZGQgYSBzdGFuZC1hbG9uZSBQYXJ0IEQgcGxhbjsgTWVkaWNhcmUgQWR2YW50YWdlIHBsYW5zIHVzdWFsbHkgaW5jbHVkZSBkcnVnIGNvdmVyYWdlLiIpICsKICAgICAgICAiIEluIDIwMjYsIGNvdmVyZWQgZHJ1ZyBjb3N0cyBhcmUgY2FwcGVkIGF0IDxiPiQyLDEwMDwvYj4gb3V0IG9mIHBvY2tldC4iICsKICAgICAgICAoQS5kcnVncyA9PT0gImxvd19yeCIgPyAiIEV2ZW4gd2l0aCBmZXcgcHJlc2NyaXB0aW9ucywgZW5yb2xsIG9uIHRpbWUgdG8gYXZvaWQgdGhlIHBlcm1hbmVudCBsYXRlLWVucm9sbG1lbnQgcGVuYWx0eSwgdW5sZXNzIHlvdSBoYXZlIGNyZWRpdGFibGUgZHJ1ZyBjb3ZlcmFnZSBmcm9tIGFuIGVtcGxveWVyLiIgOiAiIikgKwogICAgICAgIChBLmRydWdzID09PSAiaGlnaF9yeCIgPyAiIFdpdGggaGlnaGVyIGRydWcgdXNlLCBydW4geW91ciBleGFjdCBkcnVnIGxpc3QgdGhyb3VnaCBNZWRpY2FyZSdzIFBsYW4gRmluZGVyOyB0aGUgcmlnaHQgZm9ybXVsYXJ5IGNhbiBzYXZlIHRob3VzYW5kcyBiZWZvcmUgeW91IHJlYWNoIHRoZSBjYXAuIiA6ICIiKTsKICAgICAgdmFyIGFkZG9ucyA9IFtkcnVnXTsKICAgICAgaWYgKGV4dHJhcyAmJiBpc00pIGFkZG9ucy5wdXNoKCI8Yj5EZW50YWwgYW5kIHZpc2lvbi48L2I+IE1lZGlnYXAgZG9lc24ndCBpbmNsdWRlIHRoZXNlLCBzbyBhZGQgYSBzdGFuZC1hbG9uZSBkZW50YWwvdmlzaW9uIChhbmQgaGVhcmluZykgcGxhbi4iKTsKICAgICAgaWYgKGV4dHJhcyAmJiBpc0IpIGFkZG9ucy5wdXNoKCI8Yj5EZW50YWwgYW5kIHZpc2lvbi48L2I+IE1lZGlnYXAgZG9lc24ndCBpbmNsdWRlIHRoZXNlIChhZGQgYSBzdGFuZC1hbG9uZSBwbGFuKSwgd2hpbGUgbWFueSBBZHZhbnRhZ2UgcGxhbnMgYnVuZGxlIHRoZW0uIik7CiAgICAgIGlmIChleHRyYXMgJiYgaXNBKSBhZGRvbnMucHVzaCgiPGI+Q2hlY2sgdGhlIGZpbmUgcHJpbnQgb24gZXh0cmFzLjwvYj4gRGVudGFsLCB2aXNpb24sIGFuZCBoZWFyaW5nIGxpbWl0cyB2YXJ5IHdpZGVseSBiZXR3ZWVuIEFkdmFudGFnZSBwbGFucywgc28gY29tcGFyZSB0aGUgYW5udWFsIG1heGltdW1zLiIpOwogICAgICBpZiAoaW50bCkgYWRkb25zLnB1c2goIjxiPkNhcmUgYWJyb2FkLjwvYj4gT3JpZ2luYWwgTWVkaWNhcmUgZ2VuZXJhbGx5IGRvZXNuJ3QgY292ZXIgY2FyZSBvdXRzaWRlIHRoZSBVLlMuIE1lZGlnYXAgUGxhbnMgRyBhbmQgTiBjb3ZlciA4MCUgb2YgZW1lcmdlbmN5IGNhcmUgYWJyb2FkIGR1cmluZyB0aGUgZmlyc3QgNjAgZGF5cyBvZiBhIHRyaXAsIGFmdGVyIGEgJDI1MCBkZWR1Y3RpYmxlLCB1cCB0byAkNTAsMDAwIGxpZmV0aW1lLiBTb21lIEFkdmFudGFnZSBwbGFucyBpbmNsdWRlIGxpbWl0ZWQgd29ybGR3aWRlIGVtZXJnZW5jeSBjb3ZlcmFnZTsgY2hlY2sgYmVmb3JlIHlvdSB0cmF2ZWwuIik7CiAgICAgIGlmIChpc0EpIGFkZG9ucy5wdXNoKCI8Yj5Db25maXJtIHlvdXIgbmV0d29yay48L2I+IFZlcmlmeSB5b3VyIGRvY3RvcnMgYW5kIHByZWZlcnJlZCBob3NwaXRhbHMgYXJlIGluLW5ldHdvcmsgYmVmb3JlIHlvdSBlbnJvbGwuIik7CiAgICAgIGlmIChpc0EgfHwgaXNCKSBhZGRvbnMucHVzaCgiPGI+VGhpbmsgYWJvdXQgc3dpdGNoaW5nIGJhY2suPC9iPiBJZiB5b3Ugam9pbiBNZWRpY2FyZSBBZHZhbnRhZ2Ugd2hlbiBmaXJzdCBlbGlnaWJsZSwgeW91IGdldCBhIDEyLW1vbnRoIHRyaWFsIHJpZ2h0IHRvIHJldHVybiB0byBPcmlnaW5hbCBNZWRpY2FyZSBhbmQgYnV5IE1lZGlnYXAgd2l0aG91dCBoZWFsdGggcXVlc3Rpb25zLiBBZnRlciB0aGF0LCBtb3ZpbmcgdG8gTWVkaWdhcCB1c3VhbGx5IHJlcXVpcmVzIG1lZGljYWwgdW5kZXJ3cml0aW5nLCBhbmQgeW91IGNhbiBiZSBkZWNsaW5lZC4iKTsKICAgICAgaWYgKGlzTSkgYWRkb25zLnB1c2goIjxiPkNvbXBhcmUgTWVkaWdhcCBieSBwcmljZS48L2I+IEVhY2ggcGxhbiBsZXR0ZXIgKGZvciBleGFtcGxlLCBQbGFuIEcpIGlzIHN0YW5kYXJkaXplZCBieSBsYXcsIHNvIGJlbmVmaXRzIGFyZSBpZGVudGljYWwgYWNyb3NzIGluc3VyZXJzOyBjb21wYXJlIHByZW1pdW0sIHJhdGUgaGlzdG9yeSwgYW5kIHNlcnZpY2UuIik7CiAgICAgIHZhciBsZWFuTSA9IChpc00gfHwgci5sZWFuID09PSAibWVkaWdhcCIpID8gIiBpcy1sZWFuIiA6ICIiLCBsZWFuQSA9IChpc0EgfHwgci5sZWFuID09PSAiYWR2YW50YWdlIikgPyAiIGlzLWxlYW4iIDogIiI7CiAgICAgIHZhciBjb21wYXJlID0gIjxkaXYgY2xhc3M9J2JrbS1jb21wYXJlJz48ZGl2IGNsYXNzPSdia20tY29sIiArIGxlYW5NICsgIic+PGg0Pk1lZGlnYXAgcGF0aDwvaDQ+PHVsPiIgKwogICAgICAgIGxpc3QoWyJBbnkgcHJvdmlkZXIgdGhhdCB0YWtlcyBNZWRpY2FyZSwgbmF0aW9ud2lkZSIsICJObyByZWZlcnJhbHMgb3IgbmV0d29ya3MiLCAiSGlnaGVyIHByZW1pdW0sIHZlcnkgcHJlZGljdGFibGUgYmlsbHMiLCAiQWRkIGEgc2VwYXJhdGUgUGFydCBEIHBsYW4gYW5kIGRlbnRhbC92aXNpb24iLCAiQnV5IGR1cmluZyB5b3VyIG9uZS10aW1lIDYtbW9udGggTWVkaWdhcCB3aW5kb3ciXSkgKwogICAgICAgICI8L3VsPjwvZGl2PjxkaXYgY2xhc3M9J2JrbS1jb2wiICsgbGVhbkEgKyAiJz48aDQ+TWVkaWNhcmUgQWR2YW50YWdlIHBhdGg8L2g0Pjx1bD4iICsKICAgICAgICBsaXN0KFsiTG9jYWwgcHJvdmlkZXIgbmV0d29yazsgcmVmZXJyYWxzIHBvc3NpYmxlIiwgIkxvd2VyIG9yICQwIHBsYW4gcHJlbWl1bSIsICJDb3BheXMgYXMgeW91IGdvLCB1cCB0byBhIHllYXJseSBtYXhpbXVtIiwgIk9mdGVuIGJ1bmRsZXMgZHJ1ZywgZGVudGFsLCB2aXNpb24sIGhlYXJpbmciLCAiU3dpdGNoIHBsYW5zIHllYXJseSwgYnV0IG1vdmluZyB0byBNZWRpZ2FwIGxhdGVyIG1heSByZXF1aXJlIGhlYWx0aCB1bmRlcndyaXRpbmciXSkgKwogICAgICAgICI8L3VsPjwvZGl2PjwvZGl2PiI7CiAgICAgIHZhciBibG9ja3MgPSB0aW1lbGluZShwKTsKICAgICAgdmFyIHRsID0gYmxvY2tzLm1hcChmdW5jdGlvbiAoYiwgaWR4KSB7CiAgICAgICAgdmFyIHRhZ0NscyA9IHsgIkFjdGlvbiBuZWVkZWQiOiAidC1hY3Rpb24iLCAiS2V5IGRhdGUiOiAidC1rZXkiLCAiQ2xvc2VkIjogInQtY2xvc2VkIiwgIkhlYWRzLXVwIjogInQtaGVhZHMiIH1bYi50YWddOwogICAgICAgIHZhciBsaUNscyA9IGIudGFnID09PSAiQWN0aW9uIG5lZWRlZCIgPyAiIGNsYXNzPSdpcy11cmdlbnQnIiA6IGIudGFnID09PSAiQ2xvc2VkIiA/ICIgY2xhc3M9J2lzLWNsb3NlZCciIDogIiI7CiAgICAgICAgcmV0dXJuICI8bGkiICsgbGlDbHMgKyAiPjxzcGFuIGNsYXNzPSdia20tdGwtc3RlcCc+IiArIChpZHggKyAxKSArICI8L3NwYW4+PGRpdj4iICsgKGIudGFnID8gIjxzcGFuIGNsYXNzPSdia20tdGFnICIgKyB0YWdDbHMgKyAiJz4iICsgYi50YWcgKyAiPC9zcGFuPiIgOiAiIikgKwogICAgICAgICAgIjxwIGNsYXNzPSdia20tdGwtaCc+IiArIGIuaCArICI8L3A+PHAgY2xhc3M9J2JrbS10bC1iJz4iICsgYi5iICsgIjwvcD48L2Rpdj48L2xpPiI7CiAgICAgIH0pLmpvaW4oIiIpOwogICAgICB2YXIgZmlncyA9IFtbIiQyMDIuOTAvbW8iLCAiU3RhbmRhcmQgUGFydCBCIHByZW1pdW0gKG1vcmUgYWJvdmUgdGhlIElSTUFBIGluY29tZSBsaW1pdHMpIl0sIFsiJDI4MyIsICJQYXJ0IEIgYW5udWFsIGRlZHVjdGlibGUiXSwgWyIkMSw3MzYiLCAiUGFydCBBIGhvc3BpdGFsIGRlZHVjdGlibGUsIHBlciBiZW5lZml0IHBlcmlvZCJdLAogICAgICAgIFsiJDIsMTAwIiwgIlBhcnQgRCBvdXQtb2YtcG9ja2V0IGNhcCJdLCBbIiQ2MTUiLCAiTWF4aW11bSBQYXJ0IEQgZHJ1ZyBkZWR1Y3RpYmxlIl0sIFsiJDEwOWsgLyAkMjE4ayIsICJNQUdJIHdoZXJlIElSTUFBIHN1cmNoYXJnZXMgYmVnaW4gKHNpbmdsZSAvIGpvaW50KSJdXQogICAgICAgIC5tYXAoZnVuY3Rpb24gKGYpIHsgcmV0dXJuICI8ZGl2IGNsYXNzPSdia20tZmlnJz48c3BhbiBjbGFzcz0nYmttLWZpZy12Jz4iICsgZlswXSArICI8L3NwYW4+PHNwYW4gY2xhc3M9J2JrbS1maWctbCc+IiArIGZbMV0gKyAiPC9zcGFuPjwvZGl2PiI7IH0pLmpvaW4oIiIpOwogICAgICB2YXIga2V5cyA9IGJsb2Nrcy5maWx0ZXIoZnVuY3Rpb24gKGIpIHsgcmV0dXJuIGIudGFnID09PSAiQWN0aW9uIG5lZWRlZCIgfHwgYi50YWcgPT09ICJLZXkgZGF0ZSI7IH0pOwogICAgICBpZiAoa2V5cy5sZW5ndGggPCAyKSBrZXlzID0ga2V5cy5jb25jYXQoYmxvY2tzLmZpbHRlcihmdW5jdGlvbiAoYikgeyByZXR1cm4gYi50YWcgPT09ICJDbG9zZWQiIHx8IGIudGFnID09PSAiSGVhZHMtdXAiOyB9KSk7CiAgICAgIGtleXMgPSBrZXlzLnNsaWNlKDAsIDIpOwogICAgICB2YXIgdGFnQ2xhc3MgPSB7ICJBY3Rpb24gbmVlZGVkIjogInQtYWN0aW9uIiwgIktleSBkYXRlIjogInQta2V5IiwgIkNsb3NlZCI6ICJ0LWNsb3NlZCIsICJIZWFkcy11cCI6ICJ0LWhlYWRzIiB9OwogICAgICB2YXIga2V5SFRNTCA9IGtleXMubGVuZ3RoID8gIjxkaXYgY2xhc3M9J2JrbS1wYW5lbCBia20ta2V5ZGF0ZXMnPjxoMyBjbGFzcz0nYmttLXN1YmhlYWQnPllvdXIga2V5IGRhdGVzPC9oMz48b2wgY2xhc3M9J2JrbS10aW1lbGluZSc+IiArIGtleXMubWFwKGZ1bmN0aW9uIChiLCBpZHgpIHsKICAgICAgICByZXR1cm4gIjxsaSIgKyAoYi50YWcgPT09ICJBY3Rpb24gbmVlZGVkIiA/ICIgY2xhc3M9J2lzLXVyZ2VudCciIDogYi50YWcgPT09ICJDbG9zZWQiID8gIiBjbGFzcz0naXMtY2xvc2VkJyIgOiAiIikgKyAiPjxzcGFuIGNsYXNzPSdia20tdGwtc3RlcCc+IiArIChpZHggKyAxKSArICI8L3NwYW4+PGRpdj48c3BhbiBjbGFzcz0nYmttLXRhZyAiICsgdGFnQ2xhc3NbYi50YWddICsgIic+IiArIGIudGFnICsgIjwvc3Bhbj48cCBjbGFzcz0nYmttLXRsLWgnPiIgKyBiLmggKyAiPC9wPjwvZGl2PjwvbGk+IjsKICAgICAgfSkuam9pbigiIikgKyAiPC9vbD48L2Rpdj4iIDogIiI7CiAgICAgIHZhciBzYXZlZEhUTUwgPSBzdGF0ZS5zYXZlZCA/ICI8ZGl2IGNsYXNzPSdia20tc2F2ZWQnPjxiPlNhdmVkIHJlcG9ydC48L2I+IENhbGN1bGF0ZWQgIiArIE1PTlRIU1tOT1cubSAtIDFdICsgIiAiICsgTk9XLmQgKyAiLCAiICsgTk9XLnkgKyAiLCBzbyBkYXRlcyBhbmQgb3Blbi9jbG9zZWQgbGFiZWxzIHJlZmxlY3QgdGhhdCBkYXkuPC9kaXY+IiA6ICIiOwogICAgICB2YXIgcmVjSFRNTCA9IHNhdmVkSFRNTCArICI8ZGl2IGNsYXNzPSdia20tcmVjJz48cCBjbGFzcz0nYmttLWV5ZWJyb3cnPllvdXIgYmVzdC1maXQgY292ZXJhZ2U8L3A+PGgyIGNsYXNzPSdia20tcmVjLXRpdGxlIGJrbS1mb2N1cycgdGFiaW5kZXg9Jy0xJz4iICsgaGVhZGxpbmUgKyAiPC9oMj48cCBjbGFzcz0nYmttLXJlYy1zdW1tYXJ5Jz4iICsgc3VtbWFyeSArICI8L3A+IiArCiAgICAgICAgKHN0YXRlLnVubG9ja2VkICYmIHdoeS5sZW5ndGggPyAiPGgzIGNsYXNzPSdia20tc3ViaGVhZCc+V2h5IHRoaXMgZml0cyB5b3U8L2gzPjx1bCBjbGFzcz0nYmttLWNoZWNrbGlzdCc+IiArIGxpc3Qod2h5KSArICI8L3VsPiIgOiAiIikgKyAiPC9kaXY+IjsKICAgICAgbGVhZCA9IHsKICAgICAgICByZXN1bHQ6IHBsYWluKGhlYWRsaW5lKSwKICAgICAgICBkYXRlczoga2V5cy5tYXAoZnVuY3Rpb24gKGIpIHsgcmV0dXJuIHBsYWluKGIuaCk7IH0pLmpvaW4oIiB8ICIpLAogICAgICAgIGRldGFpbHM6IGxlYWREZXRhaWxzKHAsIGJsb2NrcywgYWRkb25zKSwKICAgICAgICBsaW5rOiByZXBvcnRMaW5rKCkKICAgICAgfTsKICAgICAgaWYgKCFzdGF0ZS51bmxvY2tlZCkgewogICAgICAgIHZhciBpbmMgPSBbIllvdXIgY29tcGxldGUgc3RlcC1ieS1zdGVwIGVucm9sbG1lbnQgdGltZWxpbmUgKCIgKyBibG9ja3MubGVuZ3RoICsgIiBzdGVwcyIgKyAocC5zcEU2NSA/ICIsIGluY2x1ZGluZyB5b3VyIHNwb3VzZSdzIGRhdGVzIiA6ICIiKSArICIpIl07CiAgICAgICAgaWYgKHdoeS5sZW5ndGgpIGluYy5wdXNoKCJXaHkgdGhpcyBjb3ZlcmFnZSBmaXRzIHlvdXIgYW5zd2VycyIpOwogICAgICAgIGluYyA9IGluYy5jb25jYXQoWyJBZGQtb25zIHRvIHNldCB1cCBhbmQgd2hhdCB0byBjaGVjayBiZWZvcmUgeW91IGVucm9sbCIsICJBIHNpZGUtYnktc2lkZSBjb21wYXJpc29uIG9mIGJvdGggTWVkaWNhcmUgcGF0aHMiLCAiMjAyNiBjb3N0cyBhbmQgdGhlIGluY29tZSBsaW1pdHMgdGhhdCByYWlzZSBwcmVtaXVtcyAoSVJNQUEpIiwgIkEgUERGIHRvIHNhdmUgb3IgYnJpbmcgdG8gYW4gYWR2aXNvciBtZWV0aW5nIl0pOwogICAgICAgIHJldHVybiAiPHNlY3Rpb24gY2xhc3M9J2JrbS1yZXN1bHRzIGJrbS1mYWRlJz4iICsgcmVjSFRNTCArIGtleUhUTUwgKwogICAgICAgICAgIjxkaXYgY2xhc3M9J2JrbS1wYW5lbCBia20tbG9ja2VkJz48aDMgY2xhc3M9J2JrbS1zdWJoZWFkJz5Zb3VyIGZ1bGwgcmVwb3J0IGluY2x1ZGVzPC9oMz48dWwgY2xhc3M9J2JrbS1jaGVja2xpc3QnPiIgKyBsaXN0KGluYykgKyAiPC91bD48L2Rpdj4iICsKICAgICAgICAgICI8ZGl2IGNsYXNzPSdia20tbmF2Jz48YnV0dG9uIHR5cGU9J2J1dHRvbicgY2xhc3M9J2JrbS1idG4tZ2hvc3QnIGRhdGEtYWN0aW9uPSdiYWNrJz5DaGFuZ2UgbXkgYW5zd2VyczwvYnV0dG9uPjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nYmttLWJ0bi1naG9zdCcgZGF0YS1hY3Rpb249J3Jlc3RhcnQnPlN0YXJ0IG92ZXI8L2J1dHRvbj48L2Rpdj48L3NlY3Rpb24+IjsKICAgICAgfQogICAgICByZXR1cm4gIjxzZWN0aW9uIGNsYXNzPSdia20tcmVzdWx0cyBia20tZmFkZSc+IiArIHJlY0hUTUwgKyBrZXlIVE1MICsKICAgICAgICAiPGRpdiBjbGFzcz0nYmttLXBhbmVsJz48aDMgY2xhc3M9J2JrbS1zdWJoZWFkJz5BZGQtb25zIGFuZCB0aGluZ3MgdG8gY2hlY2s8L2gzPjx1bCBjbGFzcz0nYmttLWNoZWNrbGlzdCc+IiArIGxpc3QoYWRkb25zKSArICI8L3VsPjwvZGl2PiIgKwogICAgICAgICI8ZGl2IGNsYXNzPSdia20tcGFuZWwnPjxoMyBjbGFzcz0nYmttLXN1YmhlYWQnPllvdXIgZnVsbCBlbnJvbGxtZW50IHRpbWVsaW5lPC9oMz48cCBjbGFzcz0nYmttLWJhc2lzJz4iICsgYmFzaXNUZXh0KHApICsgIjwvcD48b2wgY2xhc3M9J2JrbS10aW1lbGluZSc+IiArIHRsICsgIjwvb2w+PC9kaXY+IiArCiAgICAgICAgIjxkaXYgY2xhc3M9J2JrbS1wYW5lbCc+PGgzIGNsYXNzPSdia20tc3ViaGVhZCc+VGhlIHR3byBwYXRocyBhdCBhIGdsYW5jZTwvaDM+IiArIGNvbXBhcmUgKyAiPC9kaXY+IiArCiAgICAgICAgIjxkaXYgY2xhc3M9J2JrbS1wYW5lbCc+PGgzIGNsYXNzPSdia20tc3ViaGVhZCc+S2V5IDIwMjYgbnVtYmVyczwvaDM+PGRpdiBjbGFzcz0nYmttLWZpZ3MnPiIgKyBmaWdzICsgIjwvZGl2PjwvZGl2PiIgKwogICAgICAgICI8ZGl2IGNsYXNzPSdia20tYWR2aXNvcic+PGgzIGNsYXNzPSdia20tc3ViaGVhZCc+VGFsayBpdCB0aHJvdWdoIHdpdGggYSBCS00gYWR2aXNvcjwvaDM+IiArCiAgICAgICAgIjxwPllvdXIgUGFydCBCIGFuZCBQYXJ0IEQgcHJlbWl1bXMgcmlzZSB3aXRoIGluY29tZSAoSVJNQUEpLCBiYXNlZCBvbiB5b3VyIHRheCByZXR1cm4gZnJvbSB0d28geWVhcnMgZWFybGllcjsgeW91ciAyMDI0IHJldHVybiBkcml2ZXMgMjAyNiBwcmVtaXVtcy4gV2UgY2FuIGhlbHAgbWFuYWdlIHlvdXIgbW9kaWZpZWQgYWRqdXN0ZWQgZ3Jvc3MgaW5jb21lIHRocm91Z2ggUm90aC1jb252ZXJzaW9uIHRpbWluZywgY2FwaXRhbC1nYWlucyBwbGFubmluZywgYW5kIHRoZSBvcmRlciB5b3UgZHJhdyBmcm9tIGFjY291bnRzLCBzbyBhIG9uZS10aW1lIGluY29tZSBzcGlrZSBkb2Vzbid0IHF1aWV0bHkgcmFpc2UgeW91ciBNZWRpY2FyZSBwcmVtaXVtcy4gV2UnbGwgYWxzbyBmaXQgeW91ciBjb3ZlcmFnZSBjaG9pY2UgaW50byB5b3VyIGJyb2FkZXIgcmV0aXJlbWVudC1pbmNvbWUgYW5kIHRheCBwbGFuLjwvcD4iICsKICAgICAgICAiPGRpdiBjbGFzcz0nYmttLWJ0bnJvdyc+PGEgY2xhc3M9J2JrbS1ib29rJyBocmVmPSciICsgQk9PS0lOR19VUkwgKyAiJyB0YXJnZXQ9J19ibGFuaycgcmVsPSdub29wZW5lciBub3JlZmVycmVyJz5Cb29rIGEgdGltZSB0byBtZWV0IHdpdGggYSBCS00gYWR2aXNvciAmcmFycjs8L2E+IiArCiAgICAgICAgIjxhIGNsYXNzPSdia20tbGVhcm4nIGhyZWY9JyIgKyBXRUJTSVRFX1VSTCArICInIHRhcmdldD0nX2JsYW5rJyByZWw9J25vb3BlbmVyIG5vcmVmZXJyZXInPkxlYXJuIG1vcmUgYWJvdXQgQktNICZyYXJyOzwvYT48L2Rpdj4iICsKICAgICAgICAiPHAgY2xhc3M9J2JrbS1wcmludG9ubHknPlRvIGJvb2sgYSB0aW1lIHdpdGggYSBCS00gYWR2aXNvciwgdmlzaXQgd3d3LmJrbXdtLmNvbS48L3A+PC9kaXY+IiArCiAgICAgICAgIjxkaXYgY2xhc3M9J2JrbS1uYXYnPjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nYmttLWJ0bi1naG9zdCcgZGF0YS1hY3Rpb249J2JhY2snPkNoYW5nZSBteSBhbnN3ZXJzPC9idXR0b24+PHNwYW4+PGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSdia20tYnRuJyBkYXRhLWFjdGlvbj0ncHJpbnQnPkRvd25sb2FkIFBERjwvYnV0dG9uPiA8YnV0dG9uIHR5cGU9J2J1dHRvbicgY2xhc3M9J2JrbS1idG4tZ2hvc3QnIGRhdGEtYWN0aW9uPSdyZXN0YXJ0Jz5TdGFydCBvdmVyPC9idXR0b24+PC9zcGFuPjwvZGl2PiIgKwogICAgICAgICI8cCBjbGFzcz0nYmttLXBkZm5vdGUnPkRvd25sb2FkIFBERiBvcGVucyB5b3VyIHByaW50IHdpbmRvdy4gQ2hvb3NlICZsZHF1bztTYXZlIGFzIFBERiZyZHF1bzsgYXMgdGhlIHByaW50ZXIuPC9wPjwvc2VjdGlvbj4iOwogICAgfQogICAgZnVuY3Rpb24gcGxhaW4ocykgewogICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7CiAgICAgIHQuaW5uZXJIVE1MID0gU3RyaW5nKHMpLnJlcGxhY2UoLzxbXj5dKz4vZywgIiIpOwogICAgICByZXR1cm4gdC52YWx1ZS5yZXBsYWNlKC9ccysvZywgIiAiKS50cmltKCk7CiAgICB9CiAgICBmdW5jdGlvbiBsZWFkRGV0YWlscyhwLCBibG9ja3MsIGFkZG9ucykgewogICAgICB2YXIgaSA9IHN0YXRlLmludGFrZSwgcGFydHMgPSBbXTsKICAgICAgcGFydHMucHVzaCgiSW5wdXRzOiAiICsgcGxhaW4oYmFzaXNUZXh0KHApKSk7CiAgICAgIHBhcnRzLnB1c2goIkJvcm4gb24gdGhlIDFzdDogIiArIChpLmJpcnRoMXN0ID8gInllcyIgOiAibm8iKSk7CiAgICAgIGlmIChpc0VtcFR5cGUocC50eXBlKSkgcGFydHMucHVzaCgiRW1wbG95ZXIgMjArIGVtcGxveWVlczogIiArIGkuZW1wU2l6ZSArICI7IEhTQTogIiArIGkuaHNhKTsKICAgICAgaWYgKHAudHlwZSAhPT0gImFscmVhZHlfbWVkaWNhcmUiKSBwYXJ0cy5wdXNoKCJSZWNlaXZpbmcgU29jaWFsIFNlY3VyaXR5OiAiICsgaS5vblNTKTsKICAgICAgaWYgKHAubWFycmllZCkgcGFydHMucHVzaCgiU3BvdXNlIGNvdmVyYWdlOiAiICsgKHAudHlwZSA9PT0gImVtcGxveWVyX3Nwb3VzZSIgPyAib3duX2VtcGxveWVyIiA6IGkuc3BvdXNlQ292KSArIChpLnNwb3VzZUNvdiA9PT0gIm93bl9lbXBsb3llciIgPyAiICgyMCsgZW1wbG95ZWVzOiAiICsgaS5zcG91c2VFbXBTaXplICsgIjsgZW5kcyAiICsgKGkuc3BvdXNlRW5kVW5rbm93biA/ICJ1bmtub3duIiA6IE1PTlRIU1sraS5zcG91c2VFbmRNIC0gMV0gKyAiICIgKyBpLnNwb3VzZUVuZFkpICsgIjsgSFNBOiAiICsgaS5zcG91c2VIc2EgKyAiKSIgOiAiIikpOwogICAgICB2YXIgcHJlZnMgPSBbXTsKICAgICAgQ0hPSUNFX1FVRVNUSU9OUy5mb3JFYWNoKGZ1bmN0aW9uIChxKSB7IHEub3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7IGlmIChvLnZhbHVlID09PSBzdGF0ZS5hbnN3ZXJzW3EuaWRdKSBwcmVmcy5wdXNoKHEuZXllYnJvdyArICI6ICIgKyBwbGFpbihvLmxhYmVsKSk7IH0pOyB9KTsKICAgICAgcGFydHMucHVzaCgiUHJlZmVyZW5jZXM6ICIgKyBwcmVmcy5qb2luKCI7ICIpKTsKICAgICAgcGFydHMucHVzaCgiQWRkLW9uczogIiArIGFkZG9ucy5tYXAocGxhaW4pLmpvaW4oIiAvICIpKTsKICAgICAgcGFydHMucHVzaCgiVGltZWxpbmU6ICIgKyBibG9ja3MubWFwKGZ1bmN0aW9uIChiLCBuKSB7IHJldHVybiAobiArIDEpICsgIi4gIiArIChiLnRhZyA/ICJbIiArIGIudGFnICsgIl0gIiA6ICIiKSArIHBsYWluKGIuaCkgKyAiICgiICsgcGxhaW4oYi5iKSArICIpIjsgfSkuam9pbigiIC8gIikpOwogICAgICByZXR1cm4gcGFydHMuam9pbigiIHwgIik7CiAgICB9CiAgICAvKiAtLS0tLS0tLS0tIHJlbmRlciAtLS0tLS0tLS0tICovCiAgICB2YXIgc3RhZ2UgPSByb290LnF1ZXJ5U2VsZWN0b3IoIltkYXRhLWJrbT1zdGFnZV0iKTsKICAgIHZhciB0cmFjayA9IHJvb3QucXVlcnlTZWxlY3RvcigiW2RhdGEtYmttPXRyYWNrXSIpOwogICAgdmFyIGZpbGwgPSByb290LnF1ZXJ5U2VsZWN0b3IoIltkYXRhLWJrbT1maWxsXSIpOwogICAgdmFyIG5vZGVzID0gcm9vdC5xdWVyeVNlbGVjdG9yKCJbZGF0YS1ia209bm9kZXNdIik7CiAgICB2YXIgZ2F0ZSA9IHJvb3QucXVlcnlTZWxlY3RvcigiW2RhdGEtYmttPWdhdGVdIik7CiAgICB2YXIgc2xvdCA9IHJvb3QucXVlcnlTZWxlY3RvcigiW2RhdGEtYmttPWZvcm1zbG90XSIpOwogICAgdmFyIGxlYWRGb3JtID0gbnVsbCwgd2F0Y2hlZCA9IGZhbHNlOwogICAgdmFyIGluRWRpdG9yID0gL1s/Jl1lbGVtZW50b3ItcHJldmlldz0vLnRlc3QobG9jYXRpb24uc2VhcmNoKSB8fCAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmNsYXNzTmFtZS5pbmRleE9mKCJlbGVtZW50b3ItZWRpdG9yLWFjdGl2ZSIpID4gLTEpOwogICAgZnVuY3Rpb24gZmluZExlYWRGb3JtKCkgewogICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYmttLWxlYWQtZm9ybSIpOwogICAgICBpZiAoZWwpIHJldHVybiBlbDsKICAgICAgdmFyIGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZm9ybS1maWVsZC1tZWRpY2FyZV9yZXN1bHQiKSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJbbmFtZT0nZm9ybV9maWVsZHNbbWVkaWNhcmVfcmVzdWx0XSddIik7CiAgICAgIGlmICghaCkgewogICAgICAgIHZhciBuYW1lZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImZvcm1bbmFtZT0nTWVkaWNhcmUgUGF0aHdheSBMZWFkJ10iKTsKICAgICAgICBpZiAobmFtZWQpIGggPSBuYW1lZDsKICAgICAgfQogICAgICBpZiAoIWgpIHJldHVybiBudWxsOwogICAgICBlbCA9IGg7CiAgICAgIHdoaWxlIChlbCAmJiBlbCAhPT0gZG9jdW1lbnQuYm9keSkgewogICAgICAgIGlmIChlbC5jbGFzc05hbWUgJiYgdHlwZW9mIGVsLmNsYXNzTmFtZSA9PT0gInN0cmluZyIgJiYgZWwuY2xhc3NOYW1lLmluZGV4T2YoImVsZW1lbnRvci13aWRnZXQtZm9ybSIpID4gLTEpIHJldHVybiBlbDsKICAgICAgICBlbCA9IGVsLnBhcmVudE5vZGU7CiAgICAgIH0KICAgICAgZWwgPSBoOwogICAgICB3aGlsZSAoZWwgJiYgZWwudGFnTmFtZSAhPT0gIkZPUk0iKSBlbCA9IGVsLnBhcmVudE5vZGU7CiAgICAgIHJldHVybiBlbCB8fCBudWxsOwogICAgfQogICAgZnVuY3Rpb24gdW5sb2NrKCkgeyBpZiAoc3RhdGUudW5sb2NrZWQpIHJldHVybjsgc3RhdGUudW5sb2NrZWQgPSB0cnVlOyByZW5kZXIodHJ1ZSk7IH0KICAgIGZ1bmN0aW9uIGF0dGFjaEZvcm0oKSB7CiAgICAgIGlmIChpbkVkaXRvcikgcmV0dXJuIGZhbHNlOwogICAgICBpZiAobGVhZEZvcm0pIHJldHVybiB0cnVlOwogICAgICB2YXIgZiA9IGZpbmRMZWFkRm9ybSgpOwogICAgICBpZiAoIWYpIHJldHVybiBmYWxzZTsKICAgICAgbGVhZEZvcm0gPSBmOwogICAgICBsZWFkRm9ybS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgICAgc2xvdC5hcHBlbmRDaGlsZChsZWFkRm9ybSk7CiAgICAgIGlmICghd2F0Y2hlZCkgewogICAgICAgIHdhdGNoZWQgPSB0cnVlOwogICAgICAgIGlmICh3aW5kb3cualF1ZXJ5KSB3aW5kb3cualF1ZXJ5KGxlYWRGb3JtKS5vbigic3VibWl0X3N1Y2Nlc3MiLCB1bmxvY2spOwogICAgICAgIGlmICh3aW5kb3cuTXV0YXRpb25PYnNlcnZlcikgewogICAgICAgICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKCkgeyBpZiAobGVhZEZvcm0ucXVlcnlTZWxlY3RvcigiLmVsZW1lbnRvci1tZXNzYWdlLXN1Y2Nlc3MiKSkgdW5sb2NrKCk7IH0pLm9ic2VydmUobGVhZEZvcm0sIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGhpZGVTdHJheUZvcm0oKSB7CiAgICAgIGlmIChpbkVkaXRvcikgcmV0dXJuOwogICAgICB2YXIgZiA9IGZpbmRMZWFkRm9ybSgpOwogICAgICBpZiAoZiAmJiAhc2xvdC5jb250YWlucyhmKSkgZi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgfQogICAgaGlkZVN0cmF5Rm9ybSgpOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCBoaWRlU3RyYXlGb3JtKTsKICAgIGZ1bmN0aW9uIHNldEZpZWxkKGlkLCB2YWwpIHsKICAgICAgaWYgKCFsZWFkRm9ybSkgcmV0dXJuOwogICAgICB2YXIgZWwgPSBsZWFkRm9ybS5xdWVyeVNlbGVjdG9yKCIjZm9ybS1maWVsZC0iICsgaWQpIHx8IGxlYWRGb3JtLnF1ZXJ5U2VsZWN0b3IoIltuYW1lPSdmb3JtX2ZpZWxkc1siICsgaWQgKyAiXSddIik7CiAgICAgIGlmIChlbCkgZWwudmFsdWUgPSB2YWw7CiAgICB9CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyVHJhY2soc3QpIHsKICAgICAgaWYgKHN0YXRlLnNjcmVlbiA9PT0gImludHJvIikgeyB0cmFjay5oaWRkZW4gPSB0cnVlOyByZXR1cm47IH0KICAgICAgdHJhY2suaGlkZGVuID0gZmFsc2U7CiAgICAgIHZhciB0b3RhbCA9IHN0Lmxlbmd0aCwgcHJvZyA9IHN0YXRlLnNjcmVlbiA9PT0gInJlc3VsdHMiID8gdG90YWwgOiBzdGF0ZS5zdGVwLCBoID0gIiI7CiAgICAgIGZpbGwuc3R5bGUud2lkdGggPSAocHJvZyAvIHRvdGFsICogMTAwKSArICIlIjsKICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0b3RhbDsgaysrKSBoICs9ICI8c3BhbiBjbGFzcz0nYmttLW5vZGUiICsgKGsgPCBwcm9nID8gIiBpcy1kb25lIiA6ICIiKSArIChzdGF0ZS5zY3JlZW4gPT09ICJmbG93IiAmJiBrID09PSBzdGF0ZS5zdGVwID8gIiBpcy1jdXJyZW50IiA6ICIiKSArICInPjwvc3Bhbj4iOwogICAgICBub2Rlcy5pbm5lckhUTUwgPSBoICsgIjxzcGFuIGNsYXNzPSdia20tbm9kZSBia20tbm9kZS1lbmQiICsgKHN0YXRlLnNjcmVlbiA9PT0gInJlc3VsdHMiID8gIiBpcy1jdXJyZW50IiA6ICIiKSArICInPjwvc3Bhbj4iOwogICAgfQogICAgZnVuY3Rpb24gZm9jdXNLZXkoKSB7CiAgICAgIHZhciBhID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKICAgICAgaWYgKCFhIHx8ICFyb290LmNvbnRhaW5zKGEpIHx8IGEgPT09IHJvb3QpIHJldHVybiBudWxsOwogICAgICBpZiAoYS5pZCkgcmV0dXJuICIjIiArIGEuaWQ7CiAgICAgIHZhciBhY3QgPSBhLmdldEF0dHJpYnV0ZSgiZGF0YS1hY3Rpb24iKTsKICAgICAgaWYgKCFhY3QpIHJldHVybiBudWxsOwogICAgICB2YXIgcyA9ICJbZGF0YS1hY3Rpb249JyIgKyBhY3QgKyAiJ10iOwogICAgICBbImRhdGEtZmllbGQiLCAiZGF0YS12YWwiLCAiZGF0YS1xaWQiXS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IHZhciB2ID0gYS5nZXRBdHRyaWJ1dGUoayk7IGlmICh2KSBzICs9ICJbIiArIGsgKyAiPSciICsgdiArICInXSI7IH0pOwogICAgICByZXR1cm4gczsKICAgIH0KICAgIGZ1bmN0aW9uIGZvY3VzRWwoZWwpIHsgaWYgKCFlbCkgcmV0dXJuOyB0cnkgeyBlbC5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7IH0gY2F0Y2ggKGUpIHsgZWwuZm9jdXMoKTsgfSB9CiAgICBmdW5jdGlvbiBzY3JvbGxUb1Rvb2woKSB7CiAgICAgIHZhciByID0gcm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgdmggPSB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgNzAwOwogICAgICBpZiAoci50b3AgPCAwIHx8IHIudG9wID4gdmggKiAwLjYpIHsgdHJ5IHsgcm9vdC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAic21vb3RoIiwgYmxvY2s6ICJzdGFydCIgfSk7IH0gY2F0Y2ggKGUpIHsgcm9vdC5zY3JvbGxJbnRvVmlldyh0cnVlKTsgfSB9CiAgICB9CiAgICBmdW5jdGlvbiBwb3N0SGVpZ2h0KCkgewogICAgICB0cnkgeyBpZiAod2luZG93LnBhcmVudCAmJiB3aW5kb3cucGFyZW50ICE9PSB3aW5kb3cpIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoeyB0eXBlOiAiYmttLXJlc2l6ZSIsIGhlaWdodDogTWF0aC5jZWlsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpIH0sICIqIik7IH0gY2F0Y2ggKGUpIHt9CiAgICB9CiAgICBmdW5jdGlvbiByZW5kZXIobmF2KSB7CiAgICAgIHZhciBrZXkgPSBuYXYgPyBudWxsIDogZm9jdXNLZXkoKTsKICAgICAgdmFyIHN0ID0gc3RlcHMoKTsKICAgICAgaWYgKHN0YXRlLnN0ZXAgPiBzdC5sZW5ndGggLSAxKSBzdGF0ZS5zdGVwID0gc3QubGVuZ3RoIC0gMTsKICAgICAgcmVuZGVyVHJhY2soc3QpOwogICAgICB2YXIgaHRtbDsKICAgICAgaWYgKHN0YXRlLnNjcmVlbiA9PT0gImludHJvIikgaHRtbCA9IGludHJvSFRNTCgpOwogICAgICBlbHNlIGlmIChzdGF0ZS5zY3JlZW4gPT09ICJyZXN1bHRzIikgaHRtbCA9IHJlc3VsdHNIVE1MKCk7CiAgICAgIGVsc2UgewogICAgICAgIHZhciBpZCA9IHN0W3N0YXRlLnN0ZXBdOwogICAgICAgIGh0bWwgPSBpZCA9PT0gImFnZXMiID8gYWdlc0hUTUwoKSA6IGlkID09PSAiY292ZXJhZ2UiID8gY292ZXJhZ2VIVE1MKCkgOiBpZCA9PT0gInNwb3VzZSIgPyBzcG91c2VIVE1MKCkgOiBjaG9pY2VIVE1MKGlkKTsKICAgICAgfQogICAgICBpZiAoc3RhdGUuc2NyZWVuID09PSAicmVzdWx0cyIgJiYgIXN0YXRlLnVubG9ja2VkICYmICFhdHRhY2hGb3JtKCkpIHsKICAgICAgICBpZiAod2luZG93LmNvbnNvbGUpIGNvbnNvbGUud2FybigiQktNIE1lZGljYXJlIFBhdGh3YXk6IGNvdWxkIG5vdCBmaW5kIHRoZSBFbGVtZW50b3IgZm9ybSAoQ1NTIElEIGJrbS1sZWFkLWZvcm0gb3IgaGlkZGVuIGZpZWxkIG1lZGljYXJlX3Jlc3VsdCksIHNvIHRoZSBmdWxsIHJlcG9ydCBpcyBzaG93biB3aXRob3V0IGEgZm9ybS4iKTsKICAgICAgICBzdGF0ZS51bmxvY2tlZCA9IHRydWU7CiAgICAgICAgaHRtbCA9IHJlc3VsdHNIVE1MKCk7CiAgICAgIH0KICAgICAgc3RhZ2UuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgdmFyIGdhdGVPbiA9IHN0YXRlLnNjcmVlbiA9PT0gInJlc3VsdHMiICYmICFzdGF0ZS51bmxvY2tlZCAmJiAhIWxlYWRGb3JtOwogICAgICBnYXRlLmhpZGRlbiA9ICFnYXRlT247CiAgICAgIGlmIChnYXRlT24gJiYgbGVhZCkgeyBzZXRGaWVsZCgibWVkaWNhcmVfcmVzdWx0IiwgbGVhZC5yZXN1bHQpOyBzZXRGaWVsZCgibWVkaWNhcmVfZGF0ZXMiLCBsZWFkLmRhdGVzKTsgc2V0RmllbGQoIm1lZGljYXJlX2RldGFpbHMiLCBsZWFkLmRldGFpbHMpOyBzZXRGaWVsZCgibWVkaWNhcmVfcmVwb3J0X2xpbmsiLCBsZWFkLmxpbmspOyB9CiAgICAgIGlmIChuYXYpIHsgZm9jdXNFbChzdGFnZS5xdWVyeVNlbGVjdG9yKCIuYmttLWZvY3VzIikpOyBzY3JvbGxUb1Rvb2woKTsgfQogICAgICBlbHNlIGlmIChrZXkpIHsgZm9jdXNFbChyb290LnF1ZXJ5U2VsZWN0b3Ioa2V5KSk7IH0KICAgICAgcG9zdEhlaWdodCgpOwogICAgfQogICAgZnVuY3Rpb24gZG9QcmludCgpIHsKICAgICAgdmFyIGRlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBib2R5ID0gZG9jdW1lbnQuYm9keTsKICAgICAgdmFyIG1hcmtlciA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoImJrbS1wcmludC1tYXJrZXIiKTsKICAgICAgcm9vdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShtYXJrZXIsIHJvb3QpOwogICAgICBib2R5LmFwcGVuZENoaWxkKHJvb3QpOwogICAgICBkZS5jbGFzc05hbWUgKz0gIiBia20tcHJpbnRpbmciOwogICAgICB2YXIgZG9uZSA9IGZhbHNlOwogICAgICB2YXIgY2xlYW51cCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoZG9uZSkgcmV0dXJuOyBkb25lID0gdHJ1ZTsKICAgICAgICBkZS5jbGFzc05hbWUgPSBkZS5jbGFzc05hbWUucmVwbGFjZSgvXHMqYmttLXByaW50aW5nL2csICIiKTsKICAgICAgICBpZiAobWFya2VyLnBhcmVudE5vZGUpIHsgbWFya2VyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHJvb3QsIG1hcmtlcik7IG1hcmtlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG1hcmtlcik7IH0KICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWZ0ZXJwcmludCIsIGNsZWFudXApOwogICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgY2xlYW51cCwgdHJ1ZSk7CiAgICAgIH07CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJhZnRlcnByaW50IiwgY2xlYW51cCk7CiAgICAgIHdpbmRvdy5wcmludCgpOwogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmRvd24iLCBjbGVhbnVwLCB0cnVlKTsgfSwgODAwKTsKICAgIH0KICAgIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgICB2YXIgZWwgPSBlLnRhcmdldDsKICAgICAgd2hpbGUgKGVsICYmIGVsICE9PSByb290ICYmICEoZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZSgiZGF0YS1hY3Rpb24iKSkpIGVsID0gZWwucGFyZW50Tm9kZTsKICAgICAgaWYgKCFlbCB8fCBlbCA9PT0gcm9vdCkgcmV0dXJuOwogICAgICB2YXIgYSA9IGVsLmdldEF0dHJpYnV0ZSgiZGF0YS1hY3Rpb24iKTsKICAgICAgaWYgKGEgPT09ICJiZWdpbiIpIHsgc3RhdGUuc2NyZWVuID0gImZsb3ciOyBzdGF0ZS5zdGVwID0gMDsgcmVuZGVyKHRydWUpOyB9CiAgICAgIGVsc2UgaWYgKGEgPT09ICJuZXh0IikgewogICAgICAgIGlmICghc3RlcFZhbGlkKCkpIHJldHVybjsKICAgICAgICBpZiAoc3RhdGUuc3RlcCA8IHN0ZXBzKCkubGVuZ3RoIC0gMSkgc3RhdGUuc3RlcCsrOyBlbHNlIHN0YXRlLnNjcmVlbiA9ICJyZXN1bHRzIjsKICAgICAgICByZW5kZXIodHJ1ZSk7CiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gImJhY2siKSB7CiAgICAgICAgZXhpdFNhdmVkKCk7CiAgICAgICAgaWYgKHN0YXRlLnNjcmVlbiA9PT0gInJlc3VsdHMiKSB7IHN0YXRlLnNjcmVlbiA9ICJmbG93Ijsgc3RhdGUuc3RlcCA9IHN0ZXBzKCkubGVuZ3RoIC0gMTsgfQogICAgICAgIGVsc2UgaWYgKHN0YXRlLnN0ZXAgPiAwKSBzdGF0ZS5zdGVwLS07IGVsc2Ugc3RhdGUuc2NyZWVuID0gImludHJvIjsKICAgICAgICByZW5kZXIodHJ1ZSk7CiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gInNldCIpIHsKICAgICAgICB2YXIgZiA9IGVsLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZCIpLCB2ID0gZWwuZ2V0QXR0cmlidXRlKCJkYXRhLXZhbCIpOwogICAgICAgIHN0YXRlLmludGFrZVtmXSA9IHY7CiAgICAgICAgaWYgKGYgPT09ICJtYXJyaWVkIiAmJiB2ID09PSAibm8iKSB7IHN0YXRlLmludGFrZS5zcG91c2VCaXJ0aE0gPSAiIjsgc3RhdGUuaW50YWtlLnNwb3VzZUJpcnRoWSA9ICIiOyBzdGF0ZS5pbnRha2Uuc3BvdXNlMXN0ID0gZmFsc2U7IHN0YXRlLmludGFrZS5zcG91c2VDb3YgPSAiIjsgfQogICAgICAgIHJlbmRlcihmYWxzZSk7CiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gImNob2ljZSIpIHsgc3RhdGUuYW5zd2Vyc1tlbC5nZXRBdHRyaWJ1dGUoImRhdGEtcWlkIildID0gZWwuZ2V0QXR0cmlidXRlKCJkYXRhLXZhbCIpOyByZW5kZXIoZmFsc2UpOyB9CiAgICAgIGVsc2UgaWYgKGEgPT09ICJwcmludCIpIHsgZG9QcmludCgpOyB9CiAgICAgIGVsc2UgaWYgKGEgPT09ICJyZXN0YXJ0IikgeyBleGl0U2F2ZWQoKTsgc3RhdGUgPSB7IHNjcmVlbjogImludHJvIiwgc3RlcDogMCwgaW50YWtlOiBibGFua0ludGFrZSgpLCBhbnN3ZXJzOiB7fSwgdW5sb2NrZWQ6IHN0YXRlLnVubG9ja2VkIH07IHJlbmRlcih0cnVlKTsgfQogICAgfSk7CiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIHZhciBlbCA9IGUudGFyZ2V0LCBmID0gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZCIpOwogICAgICBpZiAoIWYpIHJldHVybjsKICAgICAgc3RhdGUuaW50YWtlW2ZdID0gZWwudHlwZSA9PT0gImNoZWNrYm94IiA/IGVsLmNoZWNrZWQgOiBlbC52YWx1ZTsKICAgICAgcmVuZGVyKGZhbHNlKTsKICAgIH0pOwogICAgaWYgKGxvYWRTYXZlZFJlcG9ydCgpKSByZW5kZXIodHJ1ZSk7IGVsc2UgcmVuZGVyKGZhbHNlKTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgcG9zdEhlaWdodCk7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIiwgcG9zdEhlaWdodCk7CiAgfQogIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAibG9hZGluZyIpIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBpbml0KTsgZWxzZSBpbml0KCk7Cn0pKCk7Cg==