Klicken Sie auf den unteren Button, um den Inhalt von Leaflet Map zu laden.
Inhalt laden
ICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvamVjdHMtb3ZlcnZpZXciPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvamVjdHMtb3ZlcnZpZXctaGVhZCI+CgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9qZWN0cy1vdmVydmlldy1zZWxlY3Rpb24tYXJlYSBjbGVhcmZpeCI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvamVjdHMtbWFwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVhZmxldC1tYXAgV1BMZWFmbGV0TWFwIiBzdHlsZT0iaGVpZ2h0OjEwMCU7IHdpZHRoOjEwMCU7Ij48L2Rpdj48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcFNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIGJhc2VVcmwgPSBhdG9iKCdhSFIwY0hNNkx5OTdjMzB1ZEdsc1pTNXZjR1Z1YzNSeVpXVjBiV0Z3TG05eVp5OTdlbjB2ZTNoOUwzdDVmUzV3Ym1jPScpOwp2YXIgYmFzZSA9ICghYmFzZVVybCAmJiB3aW5kb3cuTVEpID8KICAgIHdpbmRvdy5NUS5tYXBMYXllcigpIDogTC50aWxlTGF5ZXIoYmFzZVVybCwKICAgICAgICBMLlV0aWwuZXh0ZW5kKHt9LCB7CiAgICAgICAgICAgIGRldGVjdFJldGluYTogMCwKICAgICAgICB9LAogICAgICAgIHsic3ViZG9tYWlucyI6ImFiYyIsIm5vV3JhcCI6ZmFsc2UsIm1heFpvb20iOjIwfSAgICAgICAgKQogICAgKTsKICAgIHZhciBvcHRpb25zID0gTC5VdGlsLmV4dGVuZCh7fSwgewogICAgICAgIGxheWVyczogW2Jhc2VdLAogICAgICAgIGF0dHJpYnV0aW9uQ29udHJvbDogZmFsc2UKICAgIH0sCiAgICB7Inpvb21Db250cm9sIjp0cnVlLCJzY3JvbGxXaGVlbFpvb20iOnRydWUsImRvdWJsZUNsaWNrWm9vbSI6dHJ1ZSwiZml0Qm91bmRzIjpmYWxzZSwibWluWm9vbSI6MCwibWF4Wm9vbSI6MjAsIm1heEJvdW5kcyI6bnVsbCwiYXR0cmlidXRpb24iOiI8YSBocmVmPVwiaHR0cDpcL1wvbGVhZmxldGpzLmNvbVwiIHRpdGxlPVwiQSBKUyBsaWJyYXJ5IGZvciBpbnRlcmFjdGl2ZSBtYXBzXCI+TGVhZmxldDxcL2E+OyBcXHJcXG5cdTAwYTkgPGEgaHJlZj1cImh0dHA6XC9cL3d3dy5vcGVuc3RyZWV0bWFwLm9yZ1wvY29weXJpZ2h0XCI+T3BlblN0cmVldE1hcDxcL2E+IGNvbnRyaWJ1dG9ycyJ9LAogICAge30pOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmNyZWF0ZU1hcChvcHRpb25zKS5zZXRWaWV3KFs1MS4xMzM0ODEsMTAuMDE4MzQzXSw2KTt9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMTg5NjciLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTEuNDQ3ODIzLDcuMjQ1MjI5XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDExMSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OC4xMjU1NzUsMTEuNTc3OTA1XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMjY5MjAiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuNTI2OTg1LDEzLjY2NDUxNV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjEzODcyIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUyLjUyNzc4OCwxMy4zNzU5NTRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxMzg3NCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MS40Mzg1NTYsNi45OTAwNl0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjQ2MzQiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDguNDYzNjkzLDEzLjQyMjM1Nl0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjQ2NjIiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTMuODM0MzA1LDEwLjcwMzU3NV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjIyMjM4IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ4LjEyODEyNCw4LjIzMTUzMl0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjI0MDcwIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzU0LjkyNDgwMSw4LjMxNDUzOV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjE4ODcyIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUzLjYwNjk2OCwxMC4wMzQ0ODddLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI3NTI3IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUxLjYwMDkwOCw3Ljc3NDAyNF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjIzODI3IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzU0LjA5OTk3MiwxMS42MTg2M10sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjQ2NjQiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuMTAyNTM0LDExLjYxNTgwOV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjY4MzIiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuNTE5OTcsMTMuMzk0MjldLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0NjY2IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUzLjYwODY3MiwxMC4xNDQzN10sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjE4OTY1IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUwLjgwMDA2LDYuNzY3NDc1XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDY2OCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MC43MjEzODUsNy4xMTI3ODRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI2NjAzIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUwLjcyMTQxMiw3LjExMjg0N10sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjI4MDI3IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUwLjcyMTM3Myw3LjExMjc3MV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjQ2NzAiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDguNTEwNjE5LDkuMjEzODA5XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDY3MiIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MC43MzQ5ODksNy4wOTQ5NjZdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxODkxMiIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1My4wNzIwOTMsOC44Mzk0MThdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0Njc0IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzU0LjMyMjg0OSwxMC4xMzg5MTRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxNzU4NSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OC4zODU2MTMxNDA0OTcsMTAuODQyMzM0NjIwMjU5XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMTc1MjMiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDkuNTk5NjU2LDExLjAxMjM3OV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjE3NTg3IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ4LjExMDA5NzAwNzMxNSwxMS40Njc2OTk1NDA1NDJdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxNzU5MiIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OC45ODg3MjAzODU1NTUsMTIuMDg4NTU2MzI2NV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjE3NTg5IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ4LjEzNzg4Njc3ODE1OCwxMS42MDIxOTQ2MzU2NDJdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxNzU5NCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OS44MDExNjA3NTEwNTcsOS45NTM5MjU2NTUzNTcxXSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMTg4MTAiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDkuNTk5NjU2LDExLjAxMjM3N10sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjIyOTg0IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUwLjkyMzIwMyw2LjkxNzA4NV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjIyODM1IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUyLjQ3ODk3MTk4MjA0NCwxMy40NTI2NjgyODE2MTRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxMTE0MyIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1My4xNDQ0MDgsOC4xOTcyNjJdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyODAyOSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi40ODEyMzIsMTMuMzE4NjUzXSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDY3NiIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MC40MjYwNTEsOC44NzA1MDRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0Njc4IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ5LjQ4MjI5Myw4LjQ0OTEwOF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjQ2ODIiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuNTgwMzk5LDEzLjM5MjU1XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDY4NCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi41MDUwNSwxMy4yOTAxNTddLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0Njg3IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUwLjczNDgyLDcuMDk0ODFdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI2MDg4IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUyLjUzNTQyOSwxMy4zNzczNThdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyODAzMCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi40ODA3MTUsMTMuMzE4NTU3XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMjQ1NjciLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTAuODY1MzIzMTI4OTYyLDcuMDA5NTA1MzIyMjk0XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDY4OSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OS40MTQzOTgsOC42NzI5NjVdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxMDI1MCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OC40ODA3ODcsOS4wNTUzODRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyMTYxNSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MS4zNDU0MDYsMTIuMzY4MTc3XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiOTQ4OCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi41MTU4OTUsMTMuNDA3MDI3XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDY5OCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MC44Mzg3NCwxMi44NzUxOTJdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0NzAwIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUyLjE1MDQ5OSw3LjMzNjkzNV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjE4OTcxIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUyLjUyMzY5NiwxMy40MTQ1NzNdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0OTIxIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUwLjc3NTUzLDYuMTAxNzE5XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiOTI1MSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OC4xNTA0MDcsMTEuNjIzNDM3XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDcwMiIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MC44MDY1OTYsOC42ODk1MzFdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0NzA1IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUwLjgyMTgzNiwxMi44MjU2OTddLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0NzA3IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUwLjEzOTMxOCw4LjkwNzg4N10sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6Ijk0NDAiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTMuMTQ3NTI5LDcuNTYwNTY2XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNzM1NSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OS45NjQ1ODcsOC4yNjA2MjddLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0NzExIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUxLjMyMjY1NSwxMi4zOTg5MjldLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0NzEzIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUwLjczNDg2Niw3LjA5NDk0OF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjQ3MTYiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTQuMDkxNDI1LDEyLjEwMTM3OF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjQ3MTgiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuNTAyNzU0LDEzLjMzMDU4XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDcyMCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi40NjIzOSwxMy4xNTg5MTFdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0NzIyIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUwLjkyMzMzNCw2LjkxNzU1N10sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjE4OTc1IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUwLjcyMDAzNiw3LjA1OTc4XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMTg4NzAiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTEuMzQyMjM4NTkyMTgsMTIuMzY3Njc5MTEzNDk0XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNjU4NSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi4zOTIyNjYsMTMuMDM4ODg2XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDcyNCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MS4zMTI5NzksOS40MjQzMzRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyNDg0NSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MS4zMzg0NzcsMTIuMzg1MzU3XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMjUxNjAiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTEuMDMwOTg1LDYuOTg3Njk2XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDcyNyIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MS4zMDE0NjksNy4zNDY0Nl0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjQ3MjkiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTMuNTc2NDY4LDkuOTgzNTkxXSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDczMSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MC4xMDcwNDksOC42NjczMTldLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyMTI1MCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MC43NzIzNTYsNi4wODY2OTldLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyMTI1MiIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OS44NzMxMjEsOC42NTIxOThdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyMTI1NCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MS4yMjE0MTUsNi43OTE1NzFdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyMTI1NiIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MS40NDI0ODUsNy4wMDY3NTFdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyMTI1OCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MC4xMTEyMjksOC42NzY0MjddLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyMTI2MCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MS4zMTczNzYsOS40OTE2ODddLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyMTI2MiIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MC45MTE4MTIsNi45NjE3NzFdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyMTI2NCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MC4zODM4NTksOC4wNDk5NjFdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyMTI2NiIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MS45NjA3NDQsNy42MjI5MDZdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0NzA5IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUyLjUyOTY5MywxMy4zNDU2NDZdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0NzMzIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUxLjIzNDAyNSw2LjgyMDc2M10sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjQ2ODAiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDguMTU4NjUyLDExLjU2OTMxNF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjQ3MzUiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDguMTQ4MTY5LDExLjU1NDQzOV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjQ3MzciLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDguNzY1MDEyLDExLjQyNDc3OF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6Ijc1ODMiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTAuNzc2ODkxLDYuMDQzMzc2XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDczOSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0Ny45ODAzODQsNy44Mzg5NjZdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0NzQxIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ5LjExMDAxNyw5Ljc0NTMyNV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjQ5MTUiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuNTI3OTYzLDEzLjM3NDY4NV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjQ4OTciLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuNTE5OTcsMTMuMzk0MjldLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0OTE3IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ4LjE0MjI4NywxMS41OTk0NzddLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0OTE5IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUwLjI2MTk2LDEwLjk1ODgxOV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjQ5MjUiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuNTQxODksMTMuMzUxNzkzXSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNTA4MCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi41NDE4OTgsMTMuMzQ2NzMyXSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNTA4MiIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi43MzI5MjIsMTMuNDg1MjQ4XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDkyMyIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1My42MTk1OTYsOS42NzkyNjRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI1MDk4IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUyLjI0MTI2OSw4LjgwODU0NF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjUxMDAiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDcuNTc2MzM4LDkuODYwMjg4XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNTEwNSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1NC4wMjk4MjQsOC44NDE0NDldLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI1MTAyIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzU0LjE1MTY0MiwxMC45NzYyNzRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI1MTA3IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUyLjQ5MTQyNywxMy40MjMzNDddLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI1MTExIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ5LjQ2Mjc0NiwxMS4wNjM2MDddLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI1MTEzIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ4LjE2NDM2MiwxMS41NzQ3XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiOTI4OCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi4yNjY5ODcsOC4wNTU0XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNTExNSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OC4yMjQ4NiwxNi4zNTY5MjJdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI2OTQ1IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUyLjQ5MzAxNSwxMy40MDc2MTNdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI1MTE3IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ5Ljg1Nzc2NCw4LjQzNjUxM10sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6Ijc1ODYiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuNDY4Mjc2LDEzLjM0MjI4N10sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjE4ODA1IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUxLjQ0MzAxODQyMDM4Nyw3LjAzMjE0ODI4NDY3MDRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyNjYzMCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MS4yNTEyOTc1NTI4ODEsNi45Nzc1MDIxMjgwODY3XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMTg4MDgiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTEuNDMwMjEwMjQ1NDExLDYuODc3MzE5MTA2NzQ2NF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjI4MDMyIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ5LjQxNDEzMiw4LjY3MTU3Nl0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjI4MDMzIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUxLjk2NTM0OSw3LjYyODQwOV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjUxMTkiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTAuNzU5NzI4LDguNzMwODY2XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNTEyMSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi41MzExNTEsMTMuMzgyMDldLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI1MTI0IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUwLjk0NDMzOCw2LjkxMzk0NF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6Ijk0NzUiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTMuNTg5Njk2LDEwLjAxMTA4M10sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjUxMjYiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTAuOTI3OCw2LjkyNTE0OV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjIxNjEwIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ4LjgxNDM2OSw5LjE4Njk5NV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjUxMjgiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuNTE1MDk4LDEzLjQ2NTI2OV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjU4NDYiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDguNDgwODIzLDkuMDU1Mzk1XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNTg1MCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OC41OTczNTIsOS43OTE4OV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjU4NTYiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuMTI5NzQyLDExLjYxNzE5OF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjU4NTkiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTAuMTg2OTI3LDguNTM3NjRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI3MzIzIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ5LjY4OTAxMywxMC4xMzk2NDhdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI1ODYzIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ4LjM3NTU0OSwxMC45MDc3MDhdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxODk2MyIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MS40NDA1ODUsNy4wMjc3NTRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyNjMxMyIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0Ny45MDg5NzEsMTIuNTM2MzldLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI5Mzg0IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ4Ljc4Mzk1OCw5LjE2ODc0MV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjU4NjUiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDguMDAwNTYsOC4zOTE5MTRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI2MDEzIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUyLjUxNzUxOSwxMy4zMDUzNzRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI2MDE1IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ4LjEwNTM0MiwxMS41MjkxMDJdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxMDU3NyIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MS40MzYyMjUsNi45ODkzNzRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI2NTEwIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUyLjM3ODg3MSw5LjgwNDQ4OV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjE4OTIxIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUzLjA4MDUwMiw4Ljc5NzkwOF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjYwMTciLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTAuNzM0OTk2LDcuMDk1MDAyXSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNjAxOSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OC4zOTE4ODYsOS45OTkwNzZdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxODg3NiIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi41MDU4NiwxMy4zMjU1OF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6Ijk0MDgiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuNDM3NTg5LDEzLjQ1NzY3OV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjI2NzkyIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ4Ljc4MTEzMiw5LjE2MzUwMl0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjE4OTczIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUyLjUyODY3OSwxMy4zNzk3OTJdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyNzk5OCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi41MTk5NywxMy4zOTQyOV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjI4MDAxIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUyLjUxOTk3LDEzLjM5NDI5XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMjgwMDIiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuNTE5Nzg3LDEzLjM5NDQ1NF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjEzODgwIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ4Ljc4MzI3Niw5LjE3MzU4XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNTg3OSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OC4xMzg5OTYsMTEuNjA5MDRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI2NDMyIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ4LjIwODUwMSwxNi4zNzE4NzVdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI1ODgxIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ5Ljc1NTM5Miw2LjYzMjYzNF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjU4NjciLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTEuODY5MTM4LDEwLjA0MjMxNl0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjIyOTk0IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUyLjQ1OTUwNywxMy41MjU3NDhdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyODAwNCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi41MDQ5MjksMTMuMjkwMTkyXSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNjQzNCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi41MTQxOTUsMTMuMzM1NDA1XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMjEzNjMiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTAuMDk2NjQ1LDguNjg1MDE4XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNjQzNiIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi41Mjk3NDgsMTMuMzQ1NTddLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyNDc5NCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1NC4zMzUxNTEsMTAuMTQwNzk0XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMTM4ODIiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuNTI3NTk1LDEzLjM3NTI3Nl0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6Ijc1NzYiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuMTAyNjA0LDExLjYxNTg1NF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjEzODcwIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUyLjUxODM3MSwxMy40MDc4NF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjY0MzgiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTAuNzIzODQ3LDcuMTEyNTQ5XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNTg3MSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OC4wOTMwNTYsOC4xODg3Nl0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6Ijc1NzMiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTAuMDU3ODEzLDguNzUzOTU5XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMjU0ODAiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDguMTIxMDY5LDExLjU1OTYwNV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjEzODc2IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ4LjQzNjI1MSwxMC4wMjgyMjVdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI2NDQyIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUxLjQzNzgzNSw3LjAyNjc2M10sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjY0NDQiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuNTE3NTMzLDEzLjMwNTI4XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNTg4NCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OC4xMTEzNywxMS41MTUwMjZdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI2NDQ3IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ3Ljc1OTM4LDExLjU4MjM2OV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjY0NDkiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDkuODY3MjU5LDcuOTg0MjQ1XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNjQ1NCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MS40NzYyNDQsNy4yMjkyNTNdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxODMzOSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OS44MDA3NzYsOS45NTQ0NTFdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyODAxMSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MS45NjUyMjcsNy42Mjc5OV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjI0ODc3IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUxLjAyMjQsMTEuNTIyMTM0XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNjQ1NiIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi4zOTUwNzYsMTMuMDkzNzM4XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMjE2MTMiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTEuMDU4NzY0LDEzLjc4OTk5N10sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjI0ODIzIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUwLjg2NzMyOSwxMi4wNTA4NjldLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI2NDU4IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUwLjcyMTM5Nyw3LjExMjc5Nl0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjY0NTEiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTAuNzM0NzYsNy4wOTQ5NTFdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI3MjI5IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUzLjU0ODYzOSw5Ljk5NzgyNl0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjY0NjQiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuNDUzNzYzLDEzLjQzMDg0OV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjYwNTEiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDAuNzE3MTQyLC03NC4wMDY4MDRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI3MTE3IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ5LjIzOTg4NSw2Ljk5Nzg2Nl0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjYwNDgiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTEuNTE2MzQzLC0wLjEzNDk4OV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjY0NjAiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDcuOTgyMDI3LDcuOTAxNDMzXSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNjQ2MiIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OC45ODUyNTQsMTIuMTczMTg5XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDc0NSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLXRyZWZmcHVua3RlLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi41MDk1NzYsMTMuNDAyNzY5XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDc0OCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLXRyZWZmcHVua3RlLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MC43MzM3NjksNy4wOTg3OTNdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxMTg4NCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLXRyZWZmcHVua3RlLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi4zNTI0MzIsMTMuMDM1NjQ1XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDc1MCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLXRyZWZmcHVua3RlLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MS4wNDQzNDYsMTMuNzM4MTc3XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDc3MSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLXRyZWZmcHVua3RlLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MS4yMjE1NTgsNi43NzkyOV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjI2MzU5IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXItdHJlZmZwdW5rdGUucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUxLjA1MTU4MiwxMy43NDAyNTZdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI1NjY5IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXItdHJlZmZwdW5rdGUucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUwLjEwMTYxMyw4LjY3ODM4MV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjIzNDg0IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXItdHJlZmZwdW5rdGUucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUxLjQ4MTM4MiwxMS45Njk3MTJdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0NzUyIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXItdHJlZmZwdW5rdGUucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUzLjU0NjEwNyw5Ljk3NTE1M10sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjM0MzIiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuMzY5ODg5LDkuNzMzOTc4XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDc1NSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLXRyZWZmcHVua3RlLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OS4zOTYzMSw4LjY3MTkyOV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjkwNjMiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDkuMTQ1MzA1LDkuMjEzNzc1XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMTE5NzgiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTEuMzExMDQxLDkuNDgwMTQ1XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMTA5MDMiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTAuMzU0NDY3LDcuNTg4NjkzXSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDc1NyIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLXRyZWZmcHVua3RlLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MC45MzE1OTgsNi45NTQyMDRdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxNjkwMSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLXRyZWZmcHVua3RlLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1My44NjU4NDgsMTAuNjc3NjIzXSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDc1OSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLXRyZWZmcHVua3RlLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi4xMTYxMjUsMTEuNjIyNTgyXSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNjk4NSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLXRyZWZmcHVua3RlLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MC4wMzUzNDUsOC4yMTE3NjddLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0NzYxIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXItdHJlZmZwdW5rdGUucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUwLjY4MDA3Niw4LjczNTI1OV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjQ3NjMiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTEuOTU1LDcuNjIyMDUyXSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMjY5MTciLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuMjc3MjU0LDguMDQyMDI1XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMTE3OTYiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDkuNDUyNTkyLDExLjA3NjMyM10sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjExODA4IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXItdHJlZmZwdW5rdGUucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ5Ljk0NDQzMiwxMS41NzQ2NDFdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxMDQ0MiIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLXRyZWZmcHVua3RlLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1NC4xMDc3NjcsMTAuNzQ1MjA0XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMTUzMzAiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuMDI3OTAxLDguNTI0NzJdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyODAxNiIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLXRyZWZmcHVua3RlLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi41MzU0NzIzNTQzMDIsMTMuMzc3MzUzOTkzODg0XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMTAyMTkiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTQuMDg4MzAzLDEyLjExMTc4Ml0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjI2OTE1IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXItdHJlZmZwdW5rdGUucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUxLjQ4MzQ4OSw3LjIxNTc0NV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjQ3NjUiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTEuNTEzMzA0LDcuNDY1MDg5XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMjY5MTYiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTEuNDU2OTU5LDcuMDIxNzM0XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiOTM2OSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLXRyZWZmcHVua3RlLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OS4yOTgyMjMsNi45OTc3NDhdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI0NzY3IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXItdHJlZmZwdW5rdGUucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ4Ljc2OTA3OSw5LjE4MTMwN10sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjExMTg1IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXItdHJlZmZwdW5rdGUucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUxLjU0NzQ0OCw5LjkyNzU3MV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjQ3NjkiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTAuOTIzNTUyLDExLjU4ODcyMl0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjEwMzg2IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXItdHJlZmZwdW5rdGUucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ5Ljc0NDkxMyw2LjYzNzY5OF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6Ijk0MTciLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDguMzk5MDc4LDkuOTkyMjVdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxMDI2NyIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLXRyZWZmcHVua3RlLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MC40Nzc5NjUsMTIuMTQwODE0XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMTUyNTYiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTMuMTM5NTA5LDguMjEzMjYxXSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDYzOSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLXRyZWZmcHVua3RlLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OC4zNjc4NTcsMTAuODk4MDldLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI2OTk1IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXItdHJlZmZwdW5rdGUucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzQ3Ljk5NjQzNCw3Ljg0MzIyM10sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6Ijk0MjAiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDguNzYzNTQxLDExLjQyNjQ4M10sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjcxMTAiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTEuMzM3ODM1LDEyLjM3MjM0NF0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjcxMDgiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci10cmVmZnB1bmt0ZS5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNDguMTQ4MiwxMS41NTQzNjldLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxNTc3OCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLXRyZWZmcHVua3RlLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OS4wMjMwNzksMTIuMDk1MTQ3XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNDc3MyIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLXRyZWZmcHVua3RlLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1NC4zMDU2MTIsMTMuMDgwMjYyXSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiOTQxMCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MC4wOTQ5NDUsOC42NjEzMjhdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxMzg3OCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OS4wNDc2MDUsOC4yNjE3NjldLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI1ODc3IiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUzLjU5MDc4Niw5Ljk3Mzk1MV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjI4MDIyIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUyLjUwNjYzMjExNzkwNiwxMy4zOTI5MTgwMzk5MDNdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIyNjkyMSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1Mi41NDExODMsMTMuNDIzNTMzXSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiMjgwMjMiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTIuNDc5OTU0LDEzLjMxNzk1MV0sCiAgICBtYXJrZXJfb3B0aW9ucwopOwp2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwppZiAobWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCk7CiAgICAgICAgdmFyIGxhdCA9IGxhdGxuZy5sYXQ7CiAgICAgICAgdmFyIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgfQogICAgfSk7Cn0KbWFya2VyLmFkZFRvKCBncm91cCApOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7PC9zY3JpcHQ+PHNjcmlwdD4Kd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiBXUExlYWZsZXRNYXJrZXJTaG9ydGNvZGUoKSB7Lyo8c2NyaXB0PiovCnZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKdmFyIG1hcmtlcl9vcHRpb25zID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRJY29uT3B0aW9ucyh7ImFsdCI6IjY0NjkiLCJpY29uVXJsIjoiaHR0cHM6XC9cL3RlNC5kZW1vLmhlbGxvLWl0LmV1XC93cC1jb250ZW50XC90aGVtZXNcL25ldmUtY2hpbGQtbWFzdGVyXC9pbWFnZXNcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6IjMwLDQyIiwiaWNvbkFuY2hvciI6IjEzLDM3In0pOwp2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICBbNTEuOTA4NDQxLDguNDE4OTA2XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNjQ3MSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs0OC4zOTY0MzgsOC4wNzI0ODNdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiI2NTEyIiwiaWNvblVybCI6Imh0dHBzOlwvXC90ZTQuZGVtby5oZWxsby1pdC5ldVwvd3AtY29udGVudFwvdGhlbWVzXC9uZXZlLWNoaWxkLW1hc3RlclwvaW1hZ2VzXC9tYXJrZXIucG5nIiwiaWNvblNpemUiOiIzMCw0MiIsImljb25BbmNob3IiOiIxMywzNyJ9KTsKdmFyIG1hcmtlciA9IEwubWFya2VyKAogICAgWzUxLjQ1NTYxNyw2LjczMjk5XSwKICAgIG1hcmtlcl9vcHRpb25zCik7CnZhciBpc19pbWFnZSA9IG1hcC5pc19pbWFnZV9tYXA7CmlmIChtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGUpIHsKICAgIG1hcmtlci5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbGF0bG5nID0gdGhpcy5nZXRMYXRMbmcoKTsKICAgICAgICB2YXIgbGF0ID0gbGF0bG5nLmxhdDsKICAgICAgICB2YXIgbG5nID0gbGF0bG5nLmxuZzsKICAgICAgICBpZiAoaXNfaW1hZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIHk9JyArIGxhdCArICcgeD0nICsgbG5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgbGF0PScgKyBsYXQgKyAnIGxuZz0nICsgbG5nKTsKICAgICAgICB9CiAgICB9KTsKfQptYXJrZXIuYWRkVG8oIGdyb3VwICk7CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFya2Vycy5wdXNoKCBtYXJrZXIgKTsKICAgICAgICB9KTs8L3NjcmlwdD48c2NyaXB0Pgp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiB8fCBbXTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uIFdQTGVhZmxldE1hcmtlclNob3J0Y29kZSgpIHsvKjxzY3JpcHQ+Ki8KdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwp2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwp2YXIgbWFya2VyX29wdGlvbnMgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEljb25PcHRpb25zKHsiYWx0IjoiNjUxNCIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MS4yNjc2MTgsNi41MzM2MzldLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PjxzY3JpcHQ+CndpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwp3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnB1c2goZnVuY3Rpb24gV1BMZWFmbGV0TWFya2VyU2hvcnRjb2RlKCkgey8qPHNjcmlwdD4qLwp2YXIgbWFwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50TWFwKCk7CnZhciBncm91cCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudEdyb3VwKCk7CnZhciBtYXJrZXJfb3B0aW9ucyA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0SWNvbk9wdGlvbnMoeyJhbHQiOiIxODk2OSIsImljb25VcmwiOiJodHRwczpcL1wvdGU0LmRlbW8uaGVsbG8taXQuZXVcL3dwLWNvbnRlbnRcL3RoZW1lc1wvbmV2ZS1jaGlsZC1tYXN0ZXJcL2ltYWdlc1wvbWFya2VyLnBuZyIsImljb25TaXplIjoiMzAsNDIiLCJpY29uQW5jaG9yIjoiMTMsMzcifSk7CnZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgIFs1MC45MjMyMDMsNi45MTcwODVdLAogICAgbWFya2VyX29wdGlvbnMKKTsKdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKaWYgKG1hcmtlcl9vcHRpb25zLmRyYWdnYWJsZSkgewogICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpOwogICAgICAgIHZhciBsYXQgPSBsYXRsbmcubGF0OwogICAgICAgIHZhciBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgIH0KICAgIH0pOwp9Cm1hcmtlci5hZGRUbyggZ3JvdXAgKTsKd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOzwvc2NyaXB0PiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0icHJvamVjdC1kZXRhaWxzIiBjbGFzcz0icHJvamVjdC1kZXRhaWxzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0icHJvamVjdC10aXRsZSIgY2xhc3M9InByb2plY3QtdGl0bGUiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9InByb2plY3QtZGVzY3JpcHRpb24iIGNsYXNzPSJwcm9qZWN0LWRlc2NyaXB0aW9uIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9qZWN0LW5leHQtZXZlbnQiIGlkPSJwcm9qZWN0LW5leHQtZXZlbnQiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByb2plY3QtY29udGFjdHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvamVjdC1jb250YWN0cy1oZWFkIHByb2plY3QtY29udGFjdHMtaGVhZC1tYWlsLXBob25lIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLb250YWt0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9qZWN0LWNvbnRhY3Qtcm93IiBkYXRhLXR5cGU9Im1haWwiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Imh0dHBzOi8vdGU0LmRlbW8uaGVsbG8taXQuZXUvd3AtY29udGVudC90aGVtZXMvbmV2ZS1jaGlsZC1tYXN0ZXIvaW1hZ2VzL2NoZXZyb24tcmlnaHQucG5nIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJwcm9qZWN0LWNvbnRhY3QtbWFpbCI+RS1NYWlsIHNjaHJlaWJlbjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvamVjdC1jb250YWN0LXJvdyIgZGF0YS10eXBlPSJhZGRyZXNzIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJodHRwczovL3RlNC5kZW1vLmhlbGxvLWl0LmV1L3dwLWNvbnRlbnQvdGhlbWVzL25ldmUtY2hpbGQtbWFzdGVyL2ltYWdlcy9tYXAucG5nIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJwcm9qZWN0LWNvbnRhY3QtYWRkcmVzcyI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9qZWN0LWNvbnRhY3Qtcm93IiBkYXRhLXR5cGU9InBob25lIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJodHRwczovL3RlNC5kZW1vLmhlbGxvLWl0LmV1L3dwLWNvbnRlbnQvdGhlbWVzL25ldmUtY2hpbGQtbWFzdGVyL2ltYWdlcy9waG9uZS5wbmciIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9InByb2plY3QtY29udGFjdC1waG9uZSI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9qZWN0LWNvbnRhY3RzLWhlYWQgcHJvamVjdC1jb250YWN0cy1oZWFkLXNvY2lhbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5nZWJvdCBhdWY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9qZWN0LWNvbnRhY3Qtcm93IHByb2plY3QtY29udGFjdC1yb3ctc29jaWFsIiBkYXRhLXR5cGU9ImZhY2Vib29rIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0icHJvamVjdC1jb250YWN0LWZhY2Vib29rIiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iaHR0cHM6Ly90ZTQuZGVtby5oZWxsby1pdC5ldS93cC1jb250ZW50L3RoZW1lcy9uZXZlLWNoaWxkLW1hc3Rlci9pbWFnZXMvZmFjZWJvb2sucG5nIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvamVjdC1jb250YWN0LXJvdyBwcm9qZWN0LWNvbnRhY3Qtcm93LXNvY2lhbCIgZGF0YS10eXBlPSJ0d2l0dGVyIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0icHJvamVjdC1jb250YWN0LXR3aXR0ZXIiIHRhcmdldD0iX2JsYW5rIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJodHRwczovL3RlNC5kZW1vLmhlbGxvLWl0LmV1L3dwLWNvbnRlbnQvdGhlbWVzL25ldmUtY2hpbGQtbWFzdGVyL2ltYWdlcy90d2l0dGVyLnBuZyIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByb2plY3QtY29udGFjdC1yb3cgcHJvamVjdC1jb250YWN0LXJvdy1zb2NpYWwiIGRhdGEtdHlwZT0iaW5zdGFncmFtIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0icHJvamVjdC1jb250YWN0LWluc3RhZ3JhbSIgdGFyZ2V0PSJfYmxhbmsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Imh0dHBzOi8vdGU0LmRlbW8uaGVsbG8taXQuZXUvd3AtY29udGVudC90aGVtZXMvbmV2ZS1jaGlsZC1tYXN0ZXIvaW1hZ2VzL2luc3RhZ3JhbS5wbmciIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvamVjdC1jb250YWN0LXJvdyIgZGF0YS10eXBlPSJleHRlcm5hbCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iaHR0cHM6Ly90ZTQuZGVtby5oZWxsby1pdC5ldS93cC1jb250ZW50L3RoZW1lcy9uZXZlLWNoaWxkLW1hc3Rlci9pbWFnZXMvZXh0ZXJuYWwucG5nIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJwcm9qZWN0LWNvbnRhY3QtZXh0ZXJuYWwiIHRhcmdldD0iX2JsYW5rIj5adW0gQW5nZWJvdDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvamVjdC1jb250YWN0LXJvdyIgZGF0YS10eXBlPSJpbnRlcm5hbCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iaHR0cHM6Ly90ZTQuZGVtby5oZWxsby1pdC5ldS93cC1jb250ZW50L3RoZW1lcy9uZXZlLWNoaWxkLW1hc3Rlci9pbWFnZXMvZXh0ZXJuYWwucG5nIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJwcm9qZWN0LWNvbnRhY3QtaW50ZXJuYWwiPlp1bSBBbmdlYm90PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8IS0tCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByb2plY3QtZGV0YWlscy1uYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJwcm9qZWN0LWxpbmsiIGhyZWY9IiMiPnp1bSBUcmVmZnB1bmt0PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+