Medau Therapy Services GmbH | Schloss Hohenfels | 96450 Coburg
Medau Therapy Services GmbH | Schloss Hohenfels | 96450 Coburg
MEDAUtherapie Hygiene neu

MEDAUlogo Praxen für Logopädie

Ihr Partner für die Behandlung von Sprach-, Sprech-, Stimm- und Schluckstörungen an verschiedenen Standorten in Bayern

In den MEDAUlogo Praxen werden Sie von erfahrenen Lehrkräften und Therapeutinnen behandelt, die Expertinnen in ihrem jeweiligen Fachgebiet sind. Hiermit garantieren wir Ihnen eine optimale Behandlung nach aktuellen wissenschaftlichen Leitlinien.

MEDAUlogo ist ein Unternehmenszweig der Medau Therapy Services GmbH.

MEDAUlogo Praxen für Logopädie

Ihr Partner für die Behandlung von Sprach-, Sprech-, Stimm- und Schluckstörungen an verschiedenen Standorten in Bayern

In den MEDAUlogo Praxen werden Sie von erfahrenen Lehrkräften und Therapeutinnen behandelt, die Expertinnen in ihrem jeweiligen Fachgebiet sind. Hiermit garantieren wir Ihnen eine optimale Behandlung nach aktuellen wissenschaftlichen Leitlinien.

MEDAUlogo ist ein Unternehmenszweig der Medau Therapy Services GmbH.

BAMBERG

COBURG

NÜRNBERG

MÜNCHEN

OpenStreetMap

Mit dem Laden der Karte akzeptieren Sie die Datenschutzerklärung von OpenStreetMap Foundation.
Mehr erfahren

Karte laden

ICAgICAgICA8ZGl2IAogICAgICAgICAgICBpZD0ibGVhZmxldC1tYXAtMSIgCiAgICAgICAgICAgIGNsYXNzPSJsZWFmbGV0LW1hcCIgCiAgICAgICAgICAgIHN0eWxlPSJoZWlnaHQ6NTAwcHg7IHdpZHRoOjEwMCU7Ij48L2Rpdj4KICAgICAgICA8c2NyaXB0PgogICAgICAgIHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwogICAgICAgIHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBiYXNlVXJsID0gJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIGJhc2UgPSAoIWJhc2VVcmwgJiYgd2luZG93Lk1RKSA/IAogICAgICAgICAgICAgICAgICAgIE1RLm1hcExheWVyKCkgOiBMLnRpbGVMYXllcihiYXNlVXJsLCB7IAogICAgICAgICAgICAgICAgICAgICAgICBzdWJkb21haW5zOiAnYWJjJwogICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgb3B0aW9ucyA9IEwuVXRpbC5leHRlbmQoe30sIHsKICAgICAgICAgICAgICAgICAgICBtYXhab29tOiAyMCwKICAgICAgICAgICAgICAgICAgICBtaW5ab29tOiAwLAogICAgICAgICAgICAgICAgICAgIGxheWVyczogW2Jhc2VdLAogICAgICAgICAgICAgICAgICAgIHpvb21Db250cm9sOiAxLAogICAgICAgICAgICAgICAgICAgIHNjcm9sbFdoZWVsWm9vbTogMCwKICAgICAgICAgICAgICAgICAgICBkb3VibGVDbGlja1pvb206IDAsCiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRpb25Db250cm9sOiBmYWxzZQogICAgICAgICAgICAgICAgfSwge30pLAogICAgICAgICAgICAgICAgbWFwID0gTC5tYXAoJ2xlYWZsZXQtbWFwLTEnLCBvcHRpb25zKQogICAgICAgICAgICAgICAgICAgIC5zZXRWaWV3KFs0OS4zNDQ5MzIsMTAuNjUxNTA1XSw3KTsKICAgICAgICAgICAgaWYgKDApIHsKICAgICAgICAgICAgICAgIG1hcC5fc2hvdWxkRml0Qm91bmRzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dENvbnRyb2wgPSBMLmNvbnRyb2wuYXR0cmlidXRpb24oe3ByZWZpeDpmYWxzZX0pLmFkZFRvKG1hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dENvbnRyb2wuYWRkQXR0cmlidXRpb24oJzxhIGhyZWY9Imh0dHA6Ly9sZWFmbGV0anMuY29tIiB0aXRsZT0iRWluZSBKYXZhc2NyaXB0LUJpYmxpb3RoZWsgZsO8ciBpbnRlcmFrdGl2ZSBLYXJ0ZW4iPkxlYWZsZXQ8L2E+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dENvbnRyb2wuYWRkQXR0cmlidXRpb24oJ1xyXG7CqSA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodCI+T3BlblN0cmVldE1hcDwvYT4gTWl0d2lya2VuZGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ubWFwcy5wdXNoKG1hcCk7CiAgICAgICAgfSk7IC8vIGVuZCBhZGQKICAgICAgICA8L3NjcmlwdD4gICAgICAgIDxzY3JpcHQ+CiAgICAgICAgd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CiAgICAgICAgd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIG1hcmtlcl9vcHRpb25zID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBfb3B0aW9ucyA9IHsiaWNvblVybCI6Ilwvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAxN1wvMDhcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6WyI1MSw1OCJdLCJpY29uQW5jaG9yIjpbIjI1LjUsNTgiXX07CiAgICAgICAgICAgICAgICB2YXIgaWNvbkFycmF5cyA9IFsKICAgICAgICAgICAgICAgICAgICAnaWNvblNpemUnLCAKICAgICAgICAgICAgICAgICAgICAnaWNvbkFuY2hvcicsIAogICAgICAgICAgICAgICAgICAgICdzaGFkb3dTaXplJywgCiAgICAgICAgICAgICAgICAgICAgJ3NoYWRvd0FuY2hvcicsCiAgICAgICAgICAgICAgICAgICAgJ3BvcHVwQW5jaG9yJwogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0X2ljb24gPSBMLkljb24uRGVmYXVsdC5wcm90b3R5cGUub3B0aW9uczsKICAgICAgICAgICAgICAgIGlmIChfb3B0aW9ucy5pY29uVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXlzIGFyZSBzdHJpbmdzLCB1bmZvcnR1bmF0ZWx5Li4uCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGljb25BcnJheXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbl9uYW1lID0gaWNvbkFycmF5c1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9IF9vcHRpb25zWyBvcHRpb25fbmFtZSBdOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0ICIxLDIiIHRvIFsxLCAyXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyciA9IG9wdGlvbi5qb2luKCcnKS5zcGxpdCgnLCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkubWFwIGZvciBpZTw5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMCwgbGVuSiA9IGFyci5sZW5ndGg7IGogPCBsZW5KOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJbal0gPSBOdW1iZXIoYXJyW2pdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25zWyBvcHRpb25fbmFtZSBdID0gYXJyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgcG9wdXBBbmNob3IKICAgICAgICAgICAgICAgICAgICBpZiAoIV9vcHRpb25zLnBvcHVwQW5jaG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCAocm91Z2hseSkgdG8gc2l6ZSBvZiBpY29uCiAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25zLnBvcHVwQW5jaG9yID0gKGZ1bmN0aW9uIChpX3NpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfc2l6ZSA9IGlfc2l6ZS5zbGljZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZlcnNlIGNvb3JkaW5hdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpX3NpemVbMF0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaV9zaXplWzFdICo9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90dG9tIHBvc2l0aW9uIG9uIHBvcHVwIGlzIDdweAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaV9zaXplWzFdIC09IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaV9zaXplOwogICAgICAgICAgICAgICAgICAgICAgICB9KShfb3B0aW9ucy5pY29uU2l6ZSB8fCBkZWZhdWx0X2ljb24uaWNvblNpemUpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgX29wdGlvbnMuaWNvbiA9IG5ldyBMLkljb24oIF9vcHRpb25zICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gX29wdGlvbnM7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICAgIHZhciBkcmFnZ2FibGUgPSBtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGU7CiAgICAgICAgICAgIHZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4yNjY5MzQ0LDEwLjk1MDc3MzQ5OTk5OTk2OF0sIAogICAgICAgICAgICAgICAgbWFya2VyX29wdGlvbnMKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwogICAgICAgICAgICB2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwogICAgICAgICAgICB2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJhZ2dhYmxlKSB7CiAgICAgICAgICAgICAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGxhdCA9IGxhdGxuZy5sYXQsCiAgICAgICAgICAgICAgICAgICAgICAgIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbWFya2VyLmFkZFRvKCBncm91cCApOwogICAgICAgICAgICBtYXJrZXIuYmluZFBvcHVwKHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4udW5lc2NhcGUoJyZsdDtzdHJvbmcmZ3Q7TUVEQVVsb2dvIFNjaGxvc3MgSG9oZW5mZWxzJmx0Oy9zdHJvbmcmZ3Q7Jmx0O2JyIC8mZ3Q7U2NobG/DnyBIb2hlbmZlbHMmbHQ7YnIgLyZndDs5NjQ1MCBDb2J1cmcmbHQ7YnIgLyZndDtUZWxlZm9uOiAmbHQ7YSBocmVmPVwmcXVvdDt0ZWw6MDk1NjEyMzUxMFwmcXVvdDsmZ3Q7MDk1NjEgMjM1MTAmbHQ7L2EmZ3Q7Jmx0O2JyIC8mZ3Q7RmF4OiArNDkgKDApOTU2MSAvIDIzNTEtMzQmbHQ7YnIgLyZndDtFLU1haWw6ICZsdDthIGhyZWY9XCZxdW90O21haWx0bzpwcmF4aXMtaG9oZW5mZWxzQG1lZGF1LWxvZ28uZGVcJnF1b3Q7Jmd0O3ByYXhpcy1ob2hlbmZlbHNAbWVkYXUtbG9nby5kZSZsdDsvYSZndDsnKSk7ICAgICAgICAgICAgd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOyAvLyBlbmQgYWRkIGZ1bmN0aW9uCiAgICAgICAgPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICA8c2NyaXB0PgogICAgICAgIHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luIHx8IFtdOwogICAgICAgIHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4ucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBtYXJrZXJfb3B0aW9ucyA9IChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgX29wdGlvbnMgPSB7Imljb25VcmwiOiJcL3dwLWNvbnRlbnRcL3VwbG9hZHNcLzIwMTdcLzA4XC9tYXJrZXIucG5nIiwiaWNvblNpemUiOlsiNTEsNTgiXSwiaWNvbkFuY2hvciI6WyIyNS41LDU4Il19OwogICAgICAgICAgICAgICAgdmFyIGljb25BcnJheXMgPSBbCiAgICAgICAgICAgICAgICAgICAgJ2ljb25TaXplJywgCiAgICAgICAgICAgICAgICAgICAgJ2ljb25BbmNob3InLCAKICAgICAgICAgICAgICAgICAgICAnc2hhZG93U2l6ZScsIAogICAgICAgICAgICAgICAgICAgICdzaGFkb3dBbmNob3InLAogICAgICAgICAgICAgICAgICAgICdwb3B1cEFuY2hvcicKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICB2YXIgZGVmYXVsdF9pY29uID0gTC5JY29uLkRlZmF1bHQucHJvdG90eXBlLm9wdGlvbnM7CiAgICAgICAgICAgICAgICBpZiAoX29wdGlvbnMuaWNvblVybCkgewogICAgICAgICAgICAgICAgICAgIC8vIGFycmF5cyBhcmUgc3RyaW5ncywgdW5mb3J0dW5hdGVseS4uLgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBpY29uQXJyYXlzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25fbmFtZSA9IGljb25BcnJheXNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSBfb3B0aW9uc1sgb3B0aW9uX25hbWUgXTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCAiMSwyIiB0byBbMSwgMl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcnIgPSBvcHRpb24uam9pbignJykuc3BsaXQoJywnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5Lm1hcCBmb3IgaWU8OQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGxlbkogPSBhcnIubGVuZ3RoOyBqIDwgbGVuSjsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyW2pdID0gTnVtYmVyKGFycltqXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3B0aW9uc1sgb3B0aW9uX25hbWUgXSA9IGFycjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHBvcHVwQW5jaG9yCiAgICAgICAgICAgICAgICAgICAgaWYgKCFfb3B0aW9ucy5wb3B1cEFuY2hvcikgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgKHJvdWdobHkpIHRvIHNpemUgb2YgaWNvbgogICAgICAgICAgICAgICAgICAgICAgICBfb3B0aW9ucy5wb3B1cEFuY2hvciA9IChmdW5jdGlvbiAoaV9zaXplKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpX3NpemUgPSBpX3NpemUuc2xpY2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52ZXJzZSBjb29yZGluYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaV9zaXplWzBdID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfc2l6ZVsxXSAqPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdHRvbSBwb3NpdGlvbiBvbiBwb3B1cCBpcyA3cHgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfc2l6ZVsxXSAtPSAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlfc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkoX29wdGlvbnMuaWNvblNpemUgfHwgZGVmYXVsdF9pY29uLmljb25TaXplKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIF9vcHRpb25zLmljb24gPSBuZXcgTC5JY29uKCBfb3B0aW9ucyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIF9vcHRpb25zOwogICAgICAgICAgICB9KSgpOwogICAgICAgICAgICB2YXIgZHJhZ2dhYmxlID0gbWFya2VyX29wdGlvbnMuZHJhZ2dhYmxlOwogICAgICAgICAgICB2YXIgbWFya2VyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDguMTI2MzU0MiwxMS41NTE1NzU4MDAwMDAwMjNdLCAKICAgICAgICAgICAgICAgIG1hcmtlcl9vcHRpb25zCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKICAgICAgICAgICAgdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKICAgICAgICAgICAgdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyYWdnYWJsZSkgewogICAgICAgICAgICAgICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpLAogICAgICAgICAgICAgICAgICAgICAgICBsYXQgPSBsYXRsbmcubGF0LAogICAgICAgICAgICAgICAgICAgICAgICBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgICAgICAgICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1hcmtlci5hZGRUbyggZ3JvdXAgKTsKICAgICAgICAgICAgbWFya2VyLmJpbmRQb3B1cCh3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnVuZXNjYXBlKCcmbHQ7c3Ryb25nJmd0O01FREFVbG9nbyBMaW5kd3VybXN0cmHDn2UmbHQ7L3N0cm9uZyZndDsmbHQ7YnIgLyZndDtMaW5kd3VybXN0ci4gMTI5Jmx0O2JyIC8mZ3Q7ODAzMzcgTcO8bmNoZW4mbHQ7YnIgLyZndDtUZWxlZm9uOiAmbHQ7YSBocmVmPVwmcXVvdDt0ZWw6MDg5NzQ2NTQ0MDIwXCZxdW90OyZndDswODkgNzQ2NTQ0MDIwJmx0Oy9hJmd0OyZsdDticiAvJmd0O0UtTWFpbDogJmx0O2EgaHJlZj1cJnF1b3Q7bWFpbHRvOnByYXhpcy1saW5kd3VybXN0cmFzc2VAbWVkYXUtbG9nby5kZVwmcXVvdDsmZ3Q7cHJheGlzLWxpbmR3dXJtc3RyYXNzZUBtZWRhdS1sb2dvLmRlJmx0Oy9hJmd0OycpKTsgICAgICAgICAgICB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7IC8vIGVuZCBhZGQgZnVuY3Rpb24KICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgICAgICAgIDxzY3JpcHQ+CiAgICAgICAgd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CiAgICAgICAgd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIG1hcmtlcl9vcHRpb25zID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBfb3B0aW9ucyA9IHsiaWNvblVybCI6Ilwvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAxN1wvMDhcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6WyI1MSw1OCJdLCJpY29uQW5jaG9yIjpbIjI1LjUsNTgiXX07CiAgICAgICAgICAgICAgICB2YXIgaWNvbkFycmF5cyA9IFsKICAgICAgICAgICAgICAgICAgICAnaWNvblNpemUnLCAKICAgICAgICAgICAgICAgICAgICAnaWNvbkFuY2hvcicsIAogICAgICAgICAgICAgICAgICAgICdzaGFkb3dTaXplJywgCiAgICAgICAgICAgICAgICAgICAgJ3NoYWRvd0FuY2hvcicsCiAgICAgICAgICAgICAgICAgICAgJ3BvcHVwQW5jaG9yJwogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0X2ljb24gPSBMLkljb24uRGVmYXVsdC5wcm90b3R5cGUub3B0aW9uczsKICAgICAgICAgICAgICAgIGlmIChfb3B0aW9ucy5pY29uVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXlzIGFyZSBzdHJpbmdzLCB1bmZvcnR1bmF0ZWx5Li4uCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGljb25BcnJheXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbl9uYW1lID0gaWNvbkFycmF5c1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9IF9vcHRpb25zWyBvcHRpb25fbmFtZSBdOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0ICIxLDIiIHRvIFsxLCAyXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyciA9IG9wdGlvbi5qb2luKCcnKS5zcGxpdCgnLCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkubWFwIGZvciBpZTw5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMCwgbGVuSiA9IGFyci5sZW5ndGg7IGogPCBsZW5KOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJbal0gPSBOdW1iZXIoYXJyW2pdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25zWyBvcHRpb25fbmFtZSBdID0gYXJyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgcG9wdXBBbmNob3IKICAgICAgICAgICAgICAgICAgICBpZiAoIV9vcHRpb25zLnBvcHVwQW5jaG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCAocm91Z2hseSkgdG8gc2l6ZSBvZiBpY29uCiAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25zLnBvcHVwQW5jaG9yID0gKGZ1bmN0aW9uIChpX3NpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfc2l6ZSA9IGlfc2l6ZS5zbGljZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZlcnNlIGNvb3JkaW5hdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpX3NpemVbMF0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaV9zaXplWzFdICo9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90dG9tIHBvc2l0aW9uIG9uIHBvcHVwIGlzIDdweAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaV9zaXplWzFdIC09IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaV9zaXplOwogICAgICAgICAgICAgICAgICAgICAgICB9KShfb3B0aW9ucy5pY29uU2l6ZSB8fCBkZWZhdWx0X2ljb24uaWNvblNpemUpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgX29wdGlvbnMuaWNvbiA9IG5ldyBMLkljb24oIF9vcHRpb25zICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gX29wdGlvbnM7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICAgIHZhciBkcmFnZ2FibGUgPSBtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGU7CiAgICAgICAgICAgIHZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS40Njg1NiwxMS4wODExMDk5OTk5OTk5NjddLCAKICAgICAgICAgICAgICAgIG1hcmtlcl9vcHRpb25zCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHZhciBtYXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRNYXAoKTsKICAgICAgICAgICAgdmFyIGlzX2ltYWdlID0gbWFwLmlzX2ltYWdlX21hcDsKICAgICAgICAgICAgdmFyIGdyb3VwID0gd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5nZXRDdXJyZW50R3JvdXAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyYWdnYWJsZSkgewogICAgICAgICAgICAgICAgbWFya2VyLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBsYXRsbmcgPSB0aGlzLmdldExhdExuZygpLAogICAgICAgICAgICAgICAgICAgICAgICBsYXQgPSBsYXRsbmcubGF0LAogICAgICAgICAgICAgICAgICAgICAgICBsbmcgPSBsYXRsbmcubG5nOwogICAgICAgICAgICAgICAgICAgIGlmIChpc19pbWFnZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbGVhZmxldC1tYXJrZXIgeT0nICsgbGF0ICsgJyB4PScgKyBsbmcpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciBsYXQ9JyArIGxhdCArICcgbG5nPScgKyBsbmcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1hcmtlci5hZGRUbyggZ3JvdXAgKTsKICAgICAgICAgICAgbWFya2VyLmJpbmRQb3B1cCh3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLnVuZXNjYXBlKCcmbHQ7c3Ryb25nJmd0O01FREFVbG9nbyBSb2xsbmVyc3RyYcOfZSZsdDsvc3Ryb25nJmd0OyZsdDticiAvJmd0O1JvbGxuZXJzdHIuIDExMSZsdDticiAvJmd0OzkwNDA4IE7DvHJuYmVyZyZsdDticiAvJmd0O1RlbGVmb246ICZsdDthIGhyZWY9XCZxdW90O3RlbDowOTExOTM3NzE5NzQ2XCZxdW90OyZndDswOTExIDkzNzcxOTc0NiZsdDsvYSZndDsmbHQ7YnIgLyZndDtGYXg6IDA5MTEgOTM3NzE5NzUwJmx0O2JyIC8mZ3Q7RS1NYWlsOiAmbHQ7YSBocmVmPVwmcXVvdDttYWlsdG86cHJheGlzLXJvbGxuZXJzdHJhc3NlQG1lZGF1LWxvZ28uZGVcJnF1b3Q7Jmd0O3ByYXhpcy1yb2xsbmVyc3RyYXNzZUBtZWRhdS1sb2dvLmRlJmx0Oy9hJmd0OycpKTsgICAgICAgICAgICB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLm1hcmtlcnMucHVzaCggbWFya2VyICk7CiAgICAgICAgfSk7IC8vIGVuZCBhZGQgZnVuY3Rpb24KICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgICAgICAgIDxzY3JpcHQ+CiAgICAgICAgd2luZG93LldQTGVhZmxldE1hcFBsdWdpbiA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4gfHwgW107CiAgICAgICAgd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5wdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIG1hcmtlcl9vcHRpb25zID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBfb3B0aW9ucyA9IHsiaWNvblVybCI6Ilwvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAxN1wvMDhcL21hcmtlci5wbmciLCJpY29uU2l6ZSI6WyI1MSw1OCJdLCJpY29uQW5jaG9yIjpbIjI1LjUsNTgiXX07CiAgICAgICAgICAgICAgICB2YXIgaWNvbkFycmF5cyA9IFsKICAgICAgICAgICAgICAgICAgICAnaWNvblNpemUnLCAKICAgICAgICAgICAgICAgICAgICAnaWNvbkFuY2hvcicsIAogICAgICAgICAgICAgICAgICAgICdzaGFkb3dTaXplJywgCiAgICAgICAgICAgICAgICAgICAgJ3NoYWRvd0FuY2hvcicsCiAgICAgICAgICAgICAgICAgICAgJ3BvcHVwQW5jaG9yJwogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0X2ljb24gPSBMLkljb24uRGVmYXVsdC5wcm90b3R5cGUub3B0aW9uczsKICAgICAgICAgICAgICAgIGlmIChfb3B0aW9ucy5pY29uVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXlzIGFyZSBzdHJpbmdzLCB1bmZvcnR1bmF0ZWx5Li4uCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGljb25BcnJheXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbl9uYW1lID0gaWNvbkFycmF5c1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9IF9vcHRpb25zWyBvcHRpb25fbmFtZSBdOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0ICIxLDIiIHRvIFsxLCAyXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyciA9IG9wdGlvbi5qb2luKCcnKS5zcGxpdCgnLCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkubWFwIGZvciBpZTw5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMCwgbGVuSiA9IGFyci5sZW5ndGg7IGogPCBsZW5KOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJbal0gPSBOdW1iZXIoYXJyW2pdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25zWyBvcHRpb25fbmFtZSBdID0gYXJyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgcG9wdXBBbmNob3IKICAgICAgICAgICAgICAgICAgICBpZiAoIV9vcHRpb25zLnBvcHVwQW5jaG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCAocm91Z2hseSkgdG8gc2l6ZSBvZiBpY29uCiAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25zLnBvcHVwQW5jaG9yID0gKGZ1bmN0aW9uIChpX3NpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfc2l6ZSA9IGlfc2l6ZS5zbGljZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZlcnNlIGNvb3JkaW5hdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpX3NpemVbMF0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaV9zaXplWzFdICo9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90dG9tIHBvc2l0aW9uIG9uIHBvcHVwIGlzIDdweAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaV9zaXplWzFdIC09IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaV9zaXplOwogICAgICAgICAgICAgICAgICAgICAgICB9KShfb3B0aW9ucy5pY29uU2l6ZSB8fCBkZWZhdWx0X2ljb24uaWNvblNpemUpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgX29wdGlvbnMuaWNvbiA9IG5ldyBMLkljb24oIF9vcHRpb25zICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gX29wdGlvbnM7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICAgIHZhciBkcmFnZ2FibGUgPSBtYXJrZXJfb3B0aW9ucy5kcmFnZ2FibGU7CiAgICAgICAgICAgIHZhciBtYXJrZXIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44OTA4MDExLDEwLjg5MzIwNDQwMDAwMDA1OV0sIAogICAgICAgICAgICAgICAgbWFya2VyX29wdGlvbnMKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdmFyIG1hcCA9IHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4uZ2V0Q3VycmVudE1hcCgpOwogICAgICAgICAgICB2YXIgaXNfaW1hZ2UgPSBtYXAuaXNfaW1hZ2VfbWFwOwogICAgICAgICAgICB2YXIgZ3JvdXAgPSB3aW5kb3cuV1BMZWFmbGV0TWFwUGx1Z2luLmdldEN1cnJlbnRHcm91cCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJhZ2dhYmxlKSB7CiAgICAgICAgICAgICAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuZ2V0TGF0TG5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGxhdCA9IGxhdGxuZy5sYXQsCiAgICAgICAgICAgICAgICAgICAgICAgIGxuZyA9IGxhdGxuZy5sbmc7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2ltYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsZWFmbGV0LW1hcmtlciB5PScgKyBsYXQgKyAnIHg9JyArIGxuZyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2xlYWZsZXQtbWFya2VyIGxhdD0nICsgbGF0ICsgJyBsbmc9JyArIGxuZyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbWFya2VyLmFkZFRvKCBncm91cCApOwogICAgICAgICAgICBtYXJrZXIuYmluZFBvcHVwKHdpbmRvdy5XUExlYWZsZXRNYXBQbHVnaW4udW5lc2NhcGUoJyZsdDtzdHJvbmcmZ3Q7TUVEQVVsb2dvIEhhaW5zdHJhw59lJmx0Oy9zdHJvbmcmZ3Q7Jmx0O2JyIC8mZ3Q7SGFpbnN0cmHDn2UgMSZsdDticiAvJmd0Ozk2MDQ3IEJhbWJlcmcmbHQ7YnIgLyZndDtUZWxlZm9uOgkmbHQ7YSBocmVmPVwmcXVvdDt0ZWw6MDk1MTIwODM0MTZcJnF1b3Q7Jmd0OzA5NTEgMjA4MzQxNiZsdDsvYSZndDsmbHQ7YnIgLyZndDtGYXg6CTA5NTEgMjA4MzQ2MiZsdDticiAvJmd0O0UtTWFpbDogJmx0O2EgaHJlZj1cJnF1b3Q7bWFpbHRvOnByYXhpcy1oYWluc3RyYXNzZUBtZWRhdS1sb2dvLmRlXCZxdW90OyZndDtwcmF4aXMtaGFpbnN0cmFzc2VAbWVkYXUtbG9nby5kZSZsdDsvYSZndDsnKSk7ICAgICAgICAgICAgd2luZG93LldQTGVhZmxldE1hcFBsdWdpbi5tYXJrZXJzLnB1c2goIG1hcmtlciApOwogICAgICAgIH0pOyAvLyBlbmQgYWRkIGZ1bmN0aW9uCiAgICAgICAgPC9zY3JpcHQ+CiAgICAgICAg