LLMentry Portal
Document Studio
Voer het teamwachtwoord in om toegang te krijgen tot de whitepaper & factsheet generator.
PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9Im5sIj4KPGhlYWQ+CiAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgogIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4KICA8dGl0bGU+TExNZW50cnkgRG9jdW1lbnQgU3R1ZGlvIOKAlCBXaGl0ZXBhcGVyICZhbXA7IEZhY3RzaGVldCBHZW5lcmF0b3I8L3RpdGxlPgoKICA8IS0tIFR5cG9ncmFwaHk6IFBsdXMgSmFrYXJ0YSBTYW5zLCBJbnRlciwgSmV0QnJhaW5zIE1vbm8gLS0+CiAgPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tIj4KICA8bGluayByZWw9InByZWNvbm5lY3QiIGhyZWY9Imh0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb20iIGNyb3Nzb3JpZ2luPgogIDxsaW5rIGhyZWY9Imh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6aXRhbCx3Z2h0QDAsNDAwOzAsNTAwOzAsNjAwOzAsNzAwOzAsODAwOzEsNDAwOzEsNTAwOzEsNjAwOzEsNzAwOzEsODAwJmZhbWlseT1QbHVzK0pha2FydGErU2FuczppdGFsLHdnaHRAMCw3MDA7MCw4MDA7MSw3MDA7MSw4MDAmZmFtaWx5PUpldEJyYWlucytNb25vOndnaHRANDAwOzUwMDs3MDAmZGlzcGxheT1zd2FwIiByZWw9InN0eWxlc2hlZXQiPgogIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AZm9udHNvdXJjZS9wbHVzLWpha2FydGEtc2Fuc0A1LjAuMjEvNzAwLmNzcyI+CiAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0Bmb250c291cmNlL3BsdXMtamFrYXJ0YS1zYW5zQDUuMC4yMS84MDAuY3NzIj4KICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQGZvbnRzb3VyY2UvaW50ZXJANS4wLjIxLzQwMC5jc3MiPgogIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AZm9udHNvdXJjZS9pbnRlckA1LjAuMjEvNTAwLmNzcyI+CiAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0Bmb250c291cmNlL2ludGVyQDUuMC4yMS82MDAuY3NzIj4KICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQGZvbnRzb3VyY2UvamV0YnJhaW5zLW1vbm9ANS4wLjIxLzUwMC5jc3MiPgoKICA8IS0tIE1hbW1vdGguanMgZm9yIGNsaWVudC1zaWRlIFdvcmQgLmRvY3ggcGFyc2luZyAtLT4KICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbWFtbW90aC8xLjYuMC9tYW1tb3RoLmJyb3dzZXIubWluLmpzIj48L3NjcmlwdD4KCiAgPHN0eWxlPgogICAgOnJvb3QgewogICAgICAvKiBCcmFuZCBDb2xvciBTeXN0ZW0gKi8KICAgICAgLS1jb2xvci1hbGFiYXN0ZXI6ICNGOUY4RjY7CiAgICAgIC0tY29sb3ItY3JlYW0tY2FyZDogI0ZBRjdGMjsKICAgICAgLS1jb2xvci1lbWJlci1nbG93OiAjRTA3QTVGOwogICAgICAtLWNvbG9yLWVtYmVyLXRlcnJhOiAjRDc4NTcwOwogICAgICAtLWNvbG9yLW5ldXJhbC1zYWdlOiAjN0M5RDk2OwogICAgICAtLWNvbG9yLWRlZXAtc2FnZTogIzYyODM3RDsKICAgICAgLS1jb2xvci1zb2Z0LXNhZ2U6ICM5OEIxQUI7CiAgICAgIAogICAgICAvKiBEYXJrIENvbnRhaW5lcnMgKi8KICAgICAgLS1jb2xvci1vYnNpZGlhbi1kYXJrOiAjMTYyMTI3OwogICAgICAtLWNvbG9yLW9ic2lkaWFuLWNhcmQ6ICMxMjFBMUY7CiAgICAgIAogICAgICAvKiBBY2NlbnQgQmFja2dyb3VuZCBCYW5kcyAqLwogICAgICAtLWNvbG9yLXRlYWwtYmFuZDogIzM1NTA0QTsKICAgICAgLS1jb2xvci10ZXJyYS1iYW5kOiAjRDc4NTcwOwoKICAgICAgLyogVGV4dCAqLwogICAgICAtLWNvbG9yLXRleHQtd2hpdGU6ICNGRkZGRkY7CiAgICAgIC0tY29sb3ItdGV4dC1saWdodDogI0VERUJFODsKICAgICAgLS1jb2xvci10ZXh0LW11dGVkLWRhcms6ICNBMEFBQjU7CiAgICAgIC0tY29sb3ItdGV4dC1kYXJrOiAjMUYyNDI5OwogICAgICAtLWNvbG9yLXRleHQtbXV0ZWQtbGlnaHQ6ICM1QTYyNkE7CiAgICAgIC0tY29sb3ItYm9yZGVyLWxpZ2h0OiAjRTVFM0RGOwoKICAgICAgLyogRm9udHMgKi8KICAgICAgLS1mb250LWhlYWRsaW5lOiAnUGx1cyBKYWthcnRhIFNhbnMnLCBBcmlhbCwgc2Fucy1zZXJpZjsKICAgICAgLS1mb250LWJvZHk6ICdJbnRlcicsIEFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAtLWZvbnQtbW9ubzogJ0pldEJyYWlucyBNb25vJywgQ29uc29sYXMsIG1vbm9zcGFjZTsKCiAgICAgIC8qIFJhZGlpICovCiAgICAgIC0tcmFkaXVzLWNvdmVyOiAzMnB4IDMycHggMzJweCAwOwogICAgICAtLXJhZGl1cy1iZW50bzogMjJweDsKICAgICAgLS1yYWRpdXMtc206IDhweDsKCiAgICAgIC8qIFN0dWRpbyBBcHAgQ2hyb21lICovCiAgICAgIC0tc3R1ZGlvLXNpZGViYXItdzogNDMwcHg7CiAgICAgIC0tc3R1ZGlvLWJnOiAjMEIwRTExOwogICAgICAtLXN0dWRpby1zaWRlYmFyLWJnOiAjMTIxNzFDOwogICAgICAtLXN0dWRpby1ib3JkZXI6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOSk7CiAgICB9CgogICAgKiwgKjo6YmVmb3JlLCAqOjphZnRlciB7CiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIG1hcmdpbjogMDsKICAgICAgcGFkZGluZzogMDsKICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQgIWltcG9ydGFudDsKICAgICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZSAhaW1wb3J0YW50OwogICAgfQoKICAgIGJvZHkgewogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zdHVkaW8tYmcpOwogICAgICBjb2xvcjogdmFyKC0tY29sb3ItdGV4dC1saWdodCk7CiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWJvZHkpOwogICAgICBmb250LXNpemU6IDEzLjVweDsKICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIH0KCiAgICAvKiBIZWFkaW5ncyBzdHJpY3RseSBpbiBQbHVzIEpha2FydGEgU2FucyAqLwogICAgaDEsIGgyLCBoMywgaDQsIC5kaXNwbGF5LXRpdGxlLCAuc2VjdGlvbi1zdWJ0aXRsZSwgLmJlbnRvLWNhcmQtdGl0bGUsIC5icmFuZC10aXRsZSwgLnByb29mLW51bS10aXRsZSB7CiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWhlYWRsaW5lKSAhaW1wb3J0YW50OwogICAgICBmb250LXdlaWdodDogODAwOwogICAgfQoKICAgIC8qIFN0dWRpbyBUb3AgTmF2YmFyICovCiAgICAuc3R1ZGlvLW5hdmJhciB7CiAgICAgIGhlaWdodDogNTJweDsKICAgICAgYmFja2dyb3VuZDogIzE0MUIyMDsKICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXN0dWRpby1ib3JkZXIpOwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIHBhZGRpbmc6IDAgMjBweDsKICAgICAgei1pbmRleDogMTAwMDsKICAgICAgZmxleC1zaHJpbms6IDA7CiAgICB9CgogICAgLnN0dWRpby1icmFuZC1ncm91cCB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGdhcDogMTJweDsKICAgIH0KCiAgICAuc3R1ZGlvLWxvZ28tYmFkZ2UgewogICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCB2YXIoLS1jb2xvci1lbWJlci1nbG93KSwgdmFyKC0tY29sb3ItZW1iZXItdGVycmEpKTsKICAgICAgY29sb3I6ICNGRkY7CiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWhlYWRsaW5lKTsKICAgICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICBwYWRkaW5nOiA0cHggMTBweDsKICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogICAgfQoKICAgIC5zdHVkaW8tYnJhbmQtbmFtZSB7CiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWhlYWRsaW5lKTsKICAgICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgICAgZm9udC1zaXplOiAxNXB4OwogICAgICBjb2xvcjogI0ZGRjsKICAgIH0KCiAgICAuc3R1ZGlvLWJyYW5kLXN1YiB7CiAgICAgIGNvbG9yOiB2YXIoLS1jb2xvci1zb2Z0LXNhZ2UpOwogICAgICBmb250LXNpemU6IDEycHg7CiAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTsKICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4OwogICAgfQoKICAgIC5zdHVkaW8tbmF2LWFjdGlvbnMgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBnYXA6IDhweDsKICAgIH0KCiAgICAuYnRuLXN0dWRpbyB7CiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICAgIGNvbG9yOiAjRURFQkU4OwogICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICBmb250LXNpemU6IDEycHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGdhcDogNnB4OwogICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtYm9keSk7CiAgICB9CiAgICAuYnRuLXN0dWRpbzpob3ZlciB7CiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICAgIGNvbG9yOiAjRkZGOwogICAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7CiAgICB9CgogICAgLmJ0bi1zdHVkaW8tcHJpbWFyeSB7CiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbG9yLWVtYmVyLWdsb3cpOwogICAgICBjb2xvcjogI0ZGRjsKICAgICAgYm9yZGVyOiBub25lOwogICAgICBmb250LXdlaWdodDogNzAwOwogICAgICBib3gtc2hhZG93OiAwIDRweCAxNHB4IHJnYmEoMjI0LCAxMjIsIDk1LCAwLjM1KTsKICAgIH0KICAgIC5idG4tc3R1ZGlvLXByaW1hcnk6aG92ZXIgewogICAgICBiYWNrZ3JvdW5kOiAjRDQ2QzUxOwogICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgICB9CgogICAgLmJ0bi1zdHVkaW8tdGVhbCB7CiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTI0LCAxNTcsIDE1MCwgMC4yKTsKICAgICAgY29sb3I6ICNBM0M5QzE7CiAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgxMjQsIDE1NywgMTUwLCAwLjM1KTsKICAgIH0KICAgIC5idG4tc3R1ZGlvLXRlYWw6aG92ZXIgewogICAgICBiYWNrZ3JvdW5kOiByZ2JhKDEyNCwgMTU3LCAxNTAsIDAuMzUpOwogICAgICBjb2xvcjogI0ZGRjsKICAgIH0KCiAgICAvKiBXb3Jrc3BhY2UgTGF5b3V0ICovCiAgICAuc3R1ZGlvLXdvcmtzcGFjZSB7CiAgICAgIGZsZXg6IDE7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIH0KCiAgICAvKiBMZWZ0IFNpZGViYXI6IENvbnRyb2xzICYgSW5wdXRzICovCiAgICAuc3R1ZGlvLXNpZGViYXIgewogICAgICB3aWR0aDogdmFyKC0tc3R1ZGlvLXNpZGViYXItdyk7CiAgICAgIG1pbi13aWR0aDogMzYwcHg7CiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXN0dWRpby1zaWRlYmFyLWJnKTsKICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tc3R1ZGlvLWJvcmRlcik7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB6LWluZGV4OiAxMDA7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjI1cyBlYXNlOwogICAgfQoKICAgIC5zdHVkaW8tc2lkZWJhci5jb2xsYXBzZWQgewogICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpOwogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIGhlaWdodDogMTAwJTsKICAgIH0KCiAgICAuc2lkZWJhci10YWJzLWhlYWRlciB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1zdHVkaW8tYm9yZGVyKTsKICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsKICAgIH0KCiAgICAuc2lkZWJhci10YWItYnRuIHsKICAgICAgZmxleDogMTsKICAgICAgcGFkZGluZzogMTJweCA2cHg7CiAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgY29sb3I6IHZhcigtLWNvbG9yLXNvZnQtc2FnZSk7CiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICBib3JkZXI6IG5vbmU7CiAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1czsKICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtaGVhZGxpbmUpOwogICAgfQogICAgLnNpZGViYXItdGFiLWJ0bi5hY3RpdmUgewogICAgICBjb2xvcjogI0ZGRjsKICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tY29sb3ItZW1iZXItZ2xvdyk7CiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7CiAgICB9CgogICAgLnNpZGViYXItdGFiLWNvbnRlbnQgewogICAgICBmbGV4OiAxOwogICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICBwYWRkaW5nOiAxNnB4OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDE0cHg7CiAgICB9CgogICAgLyogRm9ybSBFbGVtZW50cyAqLwogICAgLmZvcm0tZ3JvdXAgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDVweDsKICAgIH0KCiAgICAuZm9ybS1sYWJlbCB7CiAgICAgIGZvbnQtc2l6ZTogMTAuNXB4OwogICAgICBmb250LXdlaWdodDogNzAwOwogICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICBsZXR0ZXItc3BhY2luZzogMC4wNmVtOwogICAgICBjb2xvcjogdmFyKC0tY29sb3Itc29mdC1zYWdlKTsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgfQoKICAgIC5mb3JtLWlucHV0LCAuZm9ybS10ZXh0YXJlYSwgLmZvcm0tc2VsZWN0IHsKICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgY29sb3I6ICNGRkY7CiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWJvZHkpOwogICAgICBmb250LXNpemU6IDEycHg7CiAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1czsKICAgIH0KICAgIC5mb3JtLWlucHV0OmZvY3VzLCAuZm9ybS10ZXh0YXJlYTpmb2N1cywgLmZvcm0tc2VsZWN0OmZvY3VzIHsKICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2xvci1lbWJlci1nbG93KTsKICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjQ1KTsKICAgIH0KCiAgICAuZm9ybS10ZXh0YXJlYSB7CiAgICAgIG1pbi1oZWlnaHQ6IDEyMHB4OwogICAgICByZXNpemU6IHZlcnRpY2FsOwogICAgICBsaW5lLWhlaWdodDogMS41OwogICAgfQoKICAgIC8qIERyb3AgWm9uZSAqLwogICAgLmRyb3B6b25lLWJveCB7CiAgICAgIGJvcmRlcjogMnB4IGRhc2hlZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpOwogICAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICBwYWRkaW5nOiAxNnB4OwogICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAyKTsKICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgIH0KICAgIC5kcm9wem9uZS1ib3g6aG92ZXIsIC5kcm9wem9uZS1ib3guZHJhZ292ZXIgewogICAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbG9yLWVtYmVyLWdsb3cpOwogICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIyNCwgMTIyLCA5NSwgMC4wNik7CiAgICB9CgogICAgLmRyb3B6b25lLXRpdGxlIHsKICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICBjb2xvcjogI0ZGRjsKICAgICAgbWFyZ2luLWJvdHRvbTogM3B4OwogICAgfQoKICAgIC5kcm9wem9uZS1zdWIgewogICAgICBmb250LXNpemU6IDExcHg7CiAgICAgIGNvbG9yOiB2YXIoLS1jb2xvci1zb2Z0LXNhZ2UpOwogICAgfQoKICAgIC8qIEZvcm1hdCBTZWxlY3RvciBDYXJkcyAqLwogICAgLmZvcm1hdC1zZWxlY3Rvci1ncmlkIHsKICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgMWZyKTsKICAgICAgZ2FwOiA4cHg7CiAgICB9CgogICAgLmZvcm1hdC1jYXJkLWJ0biB7CiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICBwYWRkaW5nOiAxMHB4IDZweDsKICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1czsKICAgICAgY29sb3I6ICNFREVCRTg7CiAgICB9CiAgICAuZm9ybWF0LWNhcmQtYnRuOmhvdmVyIHsKICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpOwogICAgfQogICAgLmZvcm1hdC1jYXJkLWJ0bi5hY3RpdmUgewogICAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbG9yLWVtYmVyLWdsb3cpOwogICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIyNCwgMTIyLCA5NSwgMC4xMik7CiAgICAgIGNvbG9yOiAjRkZGOwogICAgfQoKICAgIC5mb3JtYXQtaWNvbiB7IGZvbnQtc2l6ZTogMTdweDsgbWFyZ2luLWJvdHRvbTogMnB4OyB9CiAgICAuZm9ybWF0LW5hbWUgeyBmb250LXdlaWdodDogODAwOyBmb250LXNpemU6IDExcHg7IGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWhlYWRsaW5lKTsgfQogICAgLmZvcm1hdC1wYWdlcyB7IGZvbnQtc2l6ZTogMTBweDsgY29sb3I6IHZhcigtLWNvbG9yLXNvZnQtc2FnZSk7IH0KCiAgICAvKiBSaWdodCBQcmV2aWV3IFBhbmUgKi8KICAgIC5zdHVkaW8tcHJldmlldy1wYW5lIHsKICAgICAgZmxleDogMTsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgYmFja2dyb3VuZDogIzA4MEEwQzsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgfQoKICAgIC5wcmV2aWV3LXRvb2xiYXIgewogICAgICBoZWlnaHQ6IDQ0cHg7CiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTgsIDIzLCAyOCwgMC44NSk7CiAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXN0dWRpby1ib3JkZXIpOwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIHotaW5kZXg6IDUwOwogICAgfQoKICAgIC56b29tLWdyb3VwIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgZ2FwOiA2cHg7CiAgICAgIGZvbnQtc2l6ZTogMTEuNXB4OwogICAgICBjb2xvcjogdmFyKC0tY29sb3Itc29mdC1zYWdlKTsKICAgIH0KCiAgICAuYnRuLXpvb20gewogICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgICBjb2xvcjogI0VERUJFODsKICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgICAgd2lkdGg6IDI2cHg7CiAgICAgIGhlaWdodDogMjZweDsKICAgICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgfQogICAgLmJ0bi16b29tOmhvdmVyIHsgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsgY29sb3I6ICNGRkY7IH0KCiAgICAucHJldmlldy12aWV3cG9ydC1zY3JvbGwgewogICAgICBmbGV4OiAxOwogICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICBwYWRkaW5nOiAzMHB4IDIwcHggODBweCAyMHB4OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICB9CgogICAgLmRvY3VtZW50LXZpZXdwb3J0LXdyYXBwZXIgewogICAgICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgY2VudGVyOwogICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4xOHMgZWFzZTsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgZ2FwOiA0MHB4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgfQoKICAgIC8qIFNlbGVjdGVkIEN1c3RvbSBUYXJnZXQgSGlnaGxpZ2h0aW5nICovCiAgICAuc2VsZWN0ZWQtY3VzdG9tLXRhcmdldCB7CiAgICAgIG91dGxpbmU6IDJweCBkYXNoZWQgI0UwN0E1RiAhaW1wb3J0YW50OwogICAgICBvdXRsaW5lLW9mZnNldDogM3B4ICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgIFNQQUNJT1VTIENPTlRFWFQtQVdBUkUgUVVJQ0sgQ1VTVE9NSVpFUiBQQU5FTCAoTUFTVEVSIEVOR0lORSBWMy4zKQogICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KICAgIC5xdWljay1jdXN0b21pemVyLXBhbmVsIHsKICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICBib3R0b206IDIwcHg7CiAgICAgIHJpZ2h0OiAyMHB4OwogICAgICB6LWluZGV4OiAxMDAxOwogICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE4LCAyNSwgMzAsIDAuOTgpOwogICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTZweCk7CiAgICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDE2cHgpOwogICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpOwogICAgICBib3JkZXItcmFkaXVzOiAxNHB4OwogICAgICBwYWRkaW5nOiAxNnB4IDE4cHg7CiAgICAgIGJveC1zaGFkb3c6IDAgMjBweCA1MHB4IHJnYmEoMCwgMCwgMCwgMC42NSk7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIGdhcDogMTBweDsKICAgICAgd2lkdGg6IDQxMHB4OwogICAgICBtYXgtd2lkdGg6IDkydnc7CiAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgY29sb3I6ICNFREVCRTg7CiAgICAgIG1heC1oZWlnaHQ6IDg4dmg7CiAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICB9CgogICAgLnF1aWNrLWN1c3RvbWl6ZXItcGFuZWwubWluaW1pemVkIHsKICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICBwYWRkaW5nLWJvdHRvbTogMDsKICAgIH0KCiAgICAucGFuZWwtaGVhZGVyIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBmb250LXdlaWdodDogODAwOwogICAgICBjb2xvcjogI0ZGRjsKICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICAgIHBhZGRpbmctYm90dG9tOiA4cHg7CiAgICB9CgogICAgLmJ0bi10b29sLWljb24gewogICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7CiAgICAgIGNvbG9yOiAjZmZmOwogICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgIHdpZHRoOiAyNnB4OwogICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBmb250LXNpemU6IDEycHg7CiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1czsKICAgIH0KICAgIC5idG4tdG9vbC1pY29uOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI1KTsgY29sb3I6ICNmZmY7IH0KICAgIC5idG4tdG9vbC1pY29uOmRpc2FibGVkIHsgb3BhY2l0eTogMC4zNTsgY3Vyc29yOiBub3QtYWxsb3dlZDsgfQoKICAgIC8qIEFjdGl2ZSBTZWxlY3Rpb24gQ29udGV4dCBJbmRpY2F0b3IgKi8KICAgIC5hY3RpdmUtY29udGV4dC1iYXIgewogICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIGdhcDogOHB4OwogICAgfQoKICAgIC5jb250ZXh0LWxhYmVsIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgZ2FwOiA2cHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgIGNvbG9yOiB2YXIoLS1jb2xvci1lbWJlci1nbG93KTsKICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIH0KCiAgICAuY29udGV4dC1hY3Rpb25zIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgZ2FwOiA0cHg7CiAgICB9CgogICAgLmJ0bi1jb250ZXh0LWp1bXAgewogICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgICBjb2xvcjogI0VERUJFODsKICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICBwYWRkaW5nOiAycHggNnB4OwogICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIH0KICAgIC5idG4tY29udGV4dC1qdW1wOmhvdmVyIHsgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI1KTsgY29sb3I6ICNmZmY7IH0KCiAgICAvKiBDdXN0b21pemVyIFNsaWRlcnMgJiBTd2F0Y2hlcyAqLwogICAgLmVkaXRvci10YWItc2VjdGlvbiB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIGdhcDogOXB4OwogICAgfQoKICAgIC5wYW5lbC1zZWN0aW9uLXRpdGxlIHsKICAgICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgICAgY29sb3I6ICNGRkY7CiAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTsKICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtaGVhZGxpbmUpOwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBnYXA6IDZweDsKICAgIH0KCiAgICAuc3dhdGNoLXJvdy13cmFwcGVyLCAuc2xpZGVyLXJvdy13cmFwcGVyIHsKICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsKICAgICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgZ2FwOiA2cHg7CiAgICB9CgogICAgLnN3YXRjaC1sYWJlbCB7CiAgICAgIGZvbnQtc2l6ZTogMTAuNXB4OwogICAgICBmb250LXdlaWdodDogNjAwOwogICAgICBjb2xvcjogdmFyKC0tY29sb3Itc29mdC1zYWdlKTsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgfQoKICAgIC5zd2F0Y2gtbGlzdCB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGdhcDogN3B4OwogICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICB9CgogICAgLmNvbG9yLXN3YXRjaC1yb3VuZCB7CiAgICAgIHdpZHRoOiAyMnB4OwogICAgICBoZWlnaHQ6IDIycHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBib3JkZXI6IDJweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjE1cyBlYXNlOwogICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB9CiAgICAuY29sb3Itc3dhdGNoLXJvdW5kOmhvdmVyIHsKICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjI1KTsKICAgICAgYm9yZGVyLWNvbG9yOiAjRkZGRkZGOwogICAgICBib3gtc2hhZG93OiAwIDAgMTBweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCk7CiAgICB9CgogICAgLmxpdmUtcmFuZ2Utc2xpZGVyIHsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgYXBwZWFyYW5jZTogbm9uZTsKICAgICAgaGVpZ2h0OiA2cHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTsKICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgfQogICAgLmxpdmUtcmFuZ2Utc2xpZGVyOjotd2Via2l0LXNsaWRlci10aHVtYiB7CiAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgYXBwZWFyYW5jZTogbm9uZTsKICAgICAgd2lkdGg6IDE1cHg7CiAgICAgIGhlaWdodDogMTVweDsKICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICBiYWNrZ3JvdW5kOiAjRTA3QTVGOwogICAgICBib3JkZXI6IDJweCBzb2xpZCAjRkZGOwogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB9CgogICAgLnByZXNldC1waWxsLWdyb3VwIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZ2FwOiA0cHg7CiAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIH0KCiAgICAuYnV0dG9uLXBpbGwtZ3JpZCB7CiAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIDFmcik7CiAgICAgIGdhcDogNXB4OwogICAgfQoKICAgIC5idXR0b24tcGlsbC1ncmlkLTMgewogICAgICBkaXNwbGF5OiBncmlkOwogICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLCAxZnIpOwogICAgICBnYXA6IDRweDsKICAgIH0KCiAgICAuYnRuLXByZXNldC1waWxsIHsKICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgICAgY29sb3I6ICNFREVCRTg7CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgICAgZm9udC1zaXplOiAxMC41cHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXM7CiAgICB9CiAgICAuYnRuLXByZXNldC1waWxsOmhvdmVyIHsgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpOyBjb2xvcjogI2ZmZjsgfQoKICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICBBNCBQT1JUUkFJVCBET0NVTUVOVCBFWEFDVCBFTkdJTkUgKDIxMG1tIMOXIDI5N21tKQogICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KICAgIC5hNC1wYWdlIHsKICAgICAgd2lkdGg6IDIxMG1tOwogICAgICBoZWlnaHQ6IDI5N21tOwogICAgICBtaW4taGVpZ2h0OiAyOTdtbTsKICAgICAgbWF4LWhlaWdodDogMjk3bW07CiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgLS1wYWdlLWJnLXRvcDogIzE2MjEyNzsKICAgICAgLS1wYWdlLWJnLWJvdHRvbTogIzM1NTA0QTsKICAgICAgLS1wYWdlLXNwbGl0LXBvczogNDIlOwogICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCB2YXIoLS1wYWdlLWJnLXRvcCkgMCUsIHZhcigtLXBhZ2UtYmctdG9wKSB2YXIoLS1wYWdlLXNwbGl0LXBvcyksIHZhcigtLXBhZ2UtYmctYm90dG9tKSB2YXIoLS1wYWdlLXNwbGl0LXBvcyksIHZhcigtLXBhZ2UtYmctYm90dG9tKSAxMDAlKSAhaW1wb3J0YW50OwogICAgICBib3gtc2hhZG93OiAwIDE1cHggNDVweCByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnM7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIH0KCiAgICAucGFnZS1pbm5lciB7CiAgICAgIHBhZGRpbmc6IDIwbW0gMjBtbSAxNm1tIDIwbW07CiAgICAgIGZsZXg6IDE7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgfQoKICAgIC5wYWdlLWludHJvLWJsb2NrIHsKICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE4cyBlYXNlOwogICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtYmVudG8pOwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgfQoKICAgIC8qIEhlYWRpbmdzICYgVGV4dHMgKi8KICAgIC5kaXNwbGF5LXRpdGxlIHsKICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtaGVhZGxpbmUpICFpbXBvcnRhbnQ7CiAgICAgIGZvbnQtc2l6ZTogMjRwdDsKICAgICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAyZW07CiAgICAgIGxpbmUtaGVpZ2h0OiAxLjE7CiAgICAgIG1hcmdpbi1ib3R0b206IDZweDsKICAgIH0KCiAgICAuc2VjdGlvbi1zdWJ0aXRsZSB7CiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWhlYWRsaW5lKSAhaW1wb3J0YW50OwogICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgIGNvbG9yOiB2YXIoLS1jb2xvci1zb2Z0LXNhZ2UpOwogICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICAgIGxpbmUtaGVpZ2h0OiAxLjI1OwogICAgfQoKICAgIC5sZWFkLXBhcmFncmFwaCB7CiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWJvZHkpOwogICAgICBmb250LXNpemU6IDkuNXB0OwogICAgICBsaW5lLWhlaWdodDogMS41NTsKICAgICAgY29sb3I6IHZhcigtLWNvbG9yLXRleHQtbGlnaHQpOwogICAgfQoKICAgIC8qIE9mZmljaWFsIFR3by1Db2xvciBCcmFuZCBBY2NlbnRzICovCiAgICAuZW1iZXIsIC5jb2xvci1lbWJlciB7IGNvbG9yOiB2YXIoLS1jb2xvci1lbWJlci1nbG93KSAhaW1wb3J0YW50OyB9CiAgICAuc2FnZSwgLmNvbG9yLXNhZ2UgeyBjb2xvcjogdmFyKC0tY29sb3ItbmV1cmFsLXNhZ2UpICFpbXBvcnRhbnQ7IH0KICAgIC53aGl0ZSwgLmNvbG9yLXdoaXRlIHsgY29sb3I6ICNGRkZGRkYgIWltcG9ydGFudDsgfQogICAgLmRhcmstb2JzaWRpYW4sIC5jb2xvci1kYXJrIHsgY29sb3I6IHZhcigtLWNvbG9yLW9ic2lkaWFuLWRhcmspICFpbXBvcnRhbnQ7IH0KICAgIC5kZWVwLXNhZ2UsIC5jb2xvci1kZWVwLXNhZ2UgeyBjb2xvcjogdmFyKC0tY29sb3ItZGVlcC1zYWdlKSAhaW1wb3J0YW50OyB9CgogICAgLyogQmVudG8gRmxvdyAmIE11bHRpLUNvbHVtbiBMYXlvdXRzICovCiAgICAuYmVudG8tZmxvdy1jb250YWluZXIgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDEycHg7CiAgICAgIG1hcmdpbjogNnB4IDA7CiAgICB9CgogICAgLmJlbnRvLWZsb3ctY29udGFpbmVyLmxheW91dC0yY29sLWdyaWQgewogICAgICBkaXNwbGF5OiBncmlkICFpbXBvcnRhbnQ7CiAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmciAhaW1wb3J0YW50OwogICAgICBnYXA6IDEycHggIWltcG9ydGFudDsKICAgIH0KCiAgICAuYmVudG8tY2FyZCB7CiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1iZW50byk7CiAgICAgIHBhZGRpbmc6IDE2cHggMjBweDsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMThzIGVhc2U7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIH0KCiAgICAuY2FyZC1iZy1vYnNpZGlhbiB7CiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbG9yLW9ic2lkaWFuLWNhcmQpOwogICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgICBjb2xvcjogdmFyKC0tY29sb3ItdGV4dC1saWdodCk7CiAgICB9CgogICAgLmNhcmQtYmctd2hpdGUgewogICAgICBiYWNrZ3JvdW5kOiAjRkZGRkZGOwogICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jb2xvci1ib3JkZXItbGlnaHQpOwogICAgICBjb2xvcjogdmFyKC0tY29sb3ItdGV4dC1kYXJrKTsKICAgICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMDYpOwogICAgfQoKICAgIC5jYXJkLWJnLWNyZWFtIHsKICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sb3ItY3JlYW0tY2FyZCk7CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbG9yLWJvcmRlci1saWdodCk7CiAgICAgIGNvbG9yOiB2YXIoLS1jb2xvci10ZXh0LWRhcmspOwogICAgfQoKICAgIC5jYXJkLWJnLXRlYWwgewogICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xvci10ZWFsLWJhbmQpOwogICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgICBjb2xvcjogI0ZGRkZGRjsKICAgIH0KCiAgICAuY2FyZC1ib3JkZXItZW1iZXIgeyBib3JkZXItbGVmdDogNXB4IHNvbGlkIHZhcigtLWNvbG9yLWVtYmVyLWdsb3cpICFpbXBvcnRhbnQ7IH0KICAgIC5jYXJkLWJvcmRlci1zYWdlIHsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB2YXIoLS1jb2xvci1kZWVwLXNhZ2UpICFpbXBvcnRhbnQ7IH0KCiAgICAuYmVudG8tY2FyZC10aXRsZSB7CiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWhlYWRsaW5lKSAhaW1wb3J0YW50OwogICAgICBmb250LXNpemU6IDEwLjVwdDsKICAgICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICBjb2xvcjogdmFyKC0tY29sb3ItZW1iZXItZ2xvdyk7CiAgICB9CgogICAgLmJlbnRvLWNhcmQtdGV4dCB7CiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWJvZHkpOwogICAgICBmb250LXNpemU6IDguNXB0OwogICAgICBsaW5lLWhlaWdodDogMS41OwogICAgfQoKICAgIC8qIEFzeW1tZXRyaWNhbCBTdGFnZ2VyZWQgQmVudG8gR3JpZCAqLwogICAgLnN0YWdnZXJlZC1iZW50by1sYXlvdXQgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDEycHg7CiAgICAgIG1hcmdpbi10b3A6IDZweDsKICAgIH0KCiAgICAuY2FyZC1zdGFnZ2VyLWxlZnQgewogICAgICB3aWR0aDogNTYlOwogICAgICBtYXgtd2lkdGg6IDU2JTsKICAgICAgbWFyZ2luLXJpZ2h0OiBhdXRvOwogICAgICBtYXJnaW4tbGVmdDogMDsKICAgIH0KCiAgICAuY2FyZC1zdGFnZ2VyLXJpZ2h0IHsKICAgICAgd2lkdGg6IDU2JTsKICAgICAgbWF4LXdpZHRoOiA1NiU7CiAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICBtYXJnaW4tcmlnaHQ6IDA7CiAgICB9CgogICAgLyogQ292ZXIgU3R5bGluZyAqLwogICAgLmNvdmVyLWNhbnZhcyB7CiAgICAgIC0tcGFnZS1iZy10b3A6ICNGQUY3RjIgIWltcG9ydGFudDsKICAgICAgLS1wYWdlLWJnLWJvdHRvbTogI0ZBRjdGMiAhaW1wb3J0YW50OwogICAgICBiYWNrZ3JvdW5kOiAjRkFGN0YyICFpbXBvcnRhbnQ7CiAgICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICBoZWlnaHQ6IDI5N21tOwogICAgfQoKICAgIC5jb3Zlci1mcmFtZS1vdXRlciB7CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIGhlaWdodDogMjQybW07CiAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgfQoKICAgIC5jb3Zlci1hY2NlbnQtdGVycmEgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogMzZtbTsKICAgICAgcmlnaHQ6IDA7CiAgICAgIHdpZHRoOiAzMiU7CiAgICAgIGhlaWdodDogMTkwbW07CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLXRlcnJhLWJhbmQpOwogICAgICBib3JkZXItcmFkaXVzOiAwIDAgMCAzOHB4OwogICAgICB6LWluZGV4OiAxOwogICAgfQoKICAgIC5jb3Zlci1tYWluLWNhcmQgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogMThtbTsKICAgICAgbGVmdDogMDsKICAgICAgd2lkdGg6IDgyJTsKICAgICAgaGVpZ2h0OiAyMjBtbTsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3Itb2JzaWRpYW4tZGFyayk7CiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jb3Zlcik7CiAgICAgIHotaW5kZXg6IDI7CiAgICAgIHBhZGRpbmc6IDI0bW0gMThtbSAyMG1tIDE4bW07CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgYm94LXNoYWRvdzogMCAyNHB4IDYwcHggcmdiYSgwLDAsMCwwLjMpOwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB9CgogICAgLmNvdmVyLW1ldGEtYmFkZ2UgewogICAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1oZWFkbGluZSk7CiAgICAgIGZvbnQtc2l6ZTogOC41cHQ7CiAgICAgIGZvbnQtd2VpZ2h0OiA4MDA7CiAgICAgIGNvbG9yOiB2YXIoLS1jb2xvci1lbWJlci1nbG93KTsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMWVtOwogICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICB9CgogICAgLmNvdmVyLW1ldGEtZ3JpZCB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGdhcDogMjRweDsKICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7CiAgICAgIHBhZGRpbmctdG9wOiAxNHB4OwogICAgfQoKICAgIC5jb3Zlci1tZXRhLWl0ZW0gewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDNweDsKICAgIH0KCiAgICAuY292ZXItbWV0YS1sYWJlbCB7CiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWhlYWRsaW5lKTsKICAgICAgZm9udC1zaXplOiA3LjVwdDsKICAgICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDhlbTsKICAgICAgY29sb3I6IHZhcigtLWNvbG9yLXNvZnQtc2FnZSk7CiAgICB9CgogICAgLmNvdmVyLW1ldGEtdmFsIHsKICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtbW9ubyk7CiAgICAgIGZvbnQtc2l6ZTogOS41cHQ7CiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgIGNvbG9yOiAjRkZGOwogICAgfQoKICAgIC5jb3Zlci1mb290ZXItYmFyIHsKICAgICAgaGVpZ2h0OiA1NW1tOwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICBwYWRkaW5nOiAwIDE4bW0gMTJtbSAxOG1tOwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIH0KCiAgICAuY292ZXItZm9vdGVyLXRleHQgewogICAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1ib2R5KTsKICAgICAgZm9udC1zaXplOiA4LjVwdDsKICAgICAgY29sb3I6IHZhcigtLWNvbG9yLXRleHQtbXV0ZWQtZGFyayk7CiAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICB9CgogICAgLmNvdmVyLWZvb3Rlci11cmwgewogICAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTsKICAgICAgZm9udC1zaXplOiA4LjVwdDsKICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgY29sb3I6IHZhcigtLWNvbG9yLW9ic2lkaWFuLWRhcmspOwogICAgfQoKICAgIC8qIEhlYWRlcnMgJiBGb290ZXJzICovCiAgICAucGFnZS1oZWFkZXIgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpOwogICAgICBwYWRkaW5nLWJvdHRvbTogOHB4OwogICAgICBtYXJnaW4tYm90dG9tOiAxOHB4OwogICAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1oZWFkbGluZSk7CiAgICAgIGZvbnQtc2l6ZTogOHB0OwogICAgICBmb250LXdlaWdodDogNzAwOwogICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICBsZXR0ZXItc3BhY2luZzogMC4wOGVtOwogICAgICBjb2xvcjogdmFyKC0tY29sb3Itc29mdC1zYWdlKTsKICAgIH0KCiAgICAucGFnZS1mb290ZXIgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpOwogICAgICBwYWRkaW5nLXRvcDogOHB4OwogICAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTsKICAgICAgZm9udC1zaXplOiA4cHQ7CiAgICAgIGNvbG9yOiB2YXIoLS1jb2xvci1zb2Z0LXNhZ2UpOwogICAgfQoKICAgIC8qIExpZ2h0IFBhZ2UgSGlnaC1Db250cmFzdCBPdmVycmlkZXMgKi8KICAgIC5hNC1wYWdlW3N0eWxlKj0iI0ZBRjdGMiJdIC5wYWdlLWhlYWRlciwKICAgIC5hNC1wYWdlW3N0eWxlKj0iI0Y5RjhGNiJdIC5wYWdlLWhlYWRlciB7CiAgICAgIGNvbG9yOiB2YXIoLS1jb2xvci1vYnNpZGlhbi1kYXJrKSAhaW1wb3J0YW50OwogICAgICBib3JkZXItYm90dG9tLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTIpICFpbXBvcnRhbnQ7CiAgICB9CiAgICAuYTQtcGFnZVtzdHlsZSo9IiNGQUY3RjIiXSAuZGlzcGxheS10aXRsZSwKICAgIC5hNC1wYWdlW3N0eWxlKj0iI0Y5RjhGNiJdIC5kaXNwbGF5LXRpdGxlIHsKICAgICAgY29sb3I6IHZhcigtLWNvbG9yLW9ic2lkaWFuLWRhcmspICFpbXBvcnRhbnQ7CiAgICB9CiAgICAuYTQtcGFnZVtzdHlsZSo9IiNGQUY3RjIiXSAuc2VjdGlvbi1zdWJ0aXRsZSwKICAgIC5hNC1wYWdlW3N0eWxlKj0iI0Y5RjhGNiJdIC5zZWN0aW9uLXN1YnRpdGxlIHsKICAgICAgY29sb3I6IHZhcigtLWNvbG9yLWRlZXAtc2FnZSkgIWltcG9ydGFudDsKICAgIH0KICAgIC5hNC1wYWdlW3N0eWxlKj0iI0ZBRjdGMiJdIC5sZWFkLXBhcmFncmFwaCwKICAgIC5hNC1wYWdlW3N0eWxlKj0iI0Y5RjhGNiJdIC5sZWFkLXBhcmFncmFwaCB7CiAgICAgIGNvbG9yOiB2YXIoLS1jb2xvci10ZXh0LWRhcmspICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLyogSW4tcGxhY2UgRWRpdGFibGUgSGlnaGxpZ2h0aW5nICovCiAgICBbY29udGVudGVkaXRhYmxlPSJ0cnVlIl0gewogICAgICBvdXRsaW5lOiAxcHggZGFzaGVkIHJnYmEoMjI0LCAxMjIsIDk1LCAwLjUpOwogICAgICBvdXRsaW5lLW9mZnNldDogMnB4OwogICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgIGN1cnNvcjogdGV4dDsKICAgIH0KICAgIFtjb250ZW50ZWRpdGFibGU9InRydWUiXTpmb2N1cyB7CiAgICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1jb2xvci1lbWJlci1nbG93KSAhaW1wb3J0YW50OwogICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIyNCwgMTIyLCA5NSwgMC4wNSk7CiAgICB9CgogICAgLyogUHJpbnQgQXJjaGl0ZWN0dXJlICovCiAgICBAbWVkaWEgcHJpbnQgewogICAgICBib2R5IHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsgb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7IH0KICAgICAgLnN0dWRpby1uYXZiYXIsIC5zdHVkaW8tc2lkZWJhciwgLnByZXZpZXctdG9vbGJhciwgLnF1aWNrLWN1c3RvbWl6ZXItcGFuZWwgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KICAgICAgLnN0dWRpby13b3Jrc3BhY2UsIC5zdHVkaW8tcHJldmlldy1wYW5lLCAucHJldmlldy12aWV3cG9ydC1zY3JvbGwgewogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7CiAgICAgICAgcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgLmRvY3VtZW50LXZpZXdwb3J0LXdyYXBwZXIgewogICAgICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgIGdhcDogMCAhaW1wb3J0YW50OwogICAgICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgLmE0LXBhZ2UgewogICAgICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICBwYWdlLWJyZWFrLWFmdGVyOiBhbHdheXMgIWltcG9ydGFudDsKICAgICAgICBicmVhay1hZnRlcjogcGFnZSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICAgIHdpZHRoOiAyMTBtbSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMjk3bW0gIWltcG9ydGFudDsKICAgICAgICAtd2Via2l0LXByaW50LWNvbG9yLWFkanVzdDogZXhhY3QgIWltcG9ydGFudDsKICAgICAgICBwcmludC1jb2xvci1hZGp1c3Q6IGV4YWN0ICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgLnNlbGVjdGVkLWN1c3RvbS10YXJnZXQgeyBvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7IH0KICAgICAgW2NvbnRlbnRlZGl0YWJsZT0idHJ1ZSJdIHsgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50OyB9CiAgICB9CiAgPC9zdHlsZT4KPC9oZWFkPgo8Ym9keT4KCiAgPCEtLSBUb3AgU3R1ZGlvIE5hdmJhciAtLT4KICA8aGVhZGVyIGNsYXNzPSJzdHVkaW8tbmF2YmFyIj4KICAgIDxkaXYgY2xhc3M9InN0dWRpby1icmFuZC1ncm91cCI+CiAgICAgIDxzcGFuIGNsYXNzPSJzdHVkaW8tbG9nby1iYWRnZSI+TExNZW50cnk8L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJzdHVkaW8tYnJhbmQtbmFtZSI+RG9jdW1lbnQgU3R1ZGlvPC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0ic3R1ZGlvLWJyYW5kLXN1YiI+TWFzdGVyIEVuZ2luZSB2My4zPC9zcGFuPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0ic3R1ZGlvLW5hdi1hY3Rpb25zIj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXN0dWRpbyIgaWQ9Imdsb2JhbFVuZG9CdG4iIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJ1bmRvKCkiIHRpdGxlPSJVbmRvIChDdHJsK1opIj7ihqnvuI8gVW5kbzwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJidG4tc3R1ZGlvIiBpZD0iZ2xvYmFsUmVkb0J0biIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9InJlZG8oKSIgdGl0bGU9IlJlZG8gKEN0cmwrWSkiPuKGqu+4jyBSZWRvPC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1zdHVkaW8gYnRuLXN0dWRpby10ZWFsIiBpZD0idG9nZ2xlTGl2ZUVkaXRCdG4iIG9uY2xpY2s9InRvZ2dsZUxpdmVFZGl0aW5nKCkiPgogICAgICAgIOKcj++4jyBMaXZlIFR5cGVuOiBVSVQKICAgICAgPC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1zdHVkaW8iIG9uY2xpY2s9ImNvcHlEb2N1bWVudEh0bWwoKSIgdGl0bGU9IktvcGllZXIgSFRNTCBuYWFyIGtsZW1ib3JkIj4KICAgICAgICDwn5OLIEtvcGllZXIgSFRNTAogICAgICA8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXN0dWRpbyIgb25jbGljaz0iZG93bmxvYWREb2N1bWVudEh0bWwoKSIgdGl0bGU9IlNsYSB6ZWxmc3RhbmRpZyBIVE1MIGJlc3RhbmQgb3AiPgogICAgICAgIPCfkr4gRG93bmxvYWQgSFRNTAogICAgICA8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXN0dWRpbyBidG4tc3R1ZGlvLXByaW1hcnkiIG9uY2xpY2s9IndpbmRvdy5wcmludCgpIiB0aXRsZT0iRGlyZWN0IGV4cG9ydGVyZW4gYWxzIEE0IFBERiI+CiAgICAgICAg8J+WqO+4jyBFeHBvcnRlZXIgbmFhciBQREYKICAgICAgPC9idXR0b24+CiAgICA8L2Rpdj4KICA8L2hlYWRlcj4KCiAgPCEtLSBXb3Jrc3BhY2U6IFNpZGViYXIgKENvbnRyb2xzKSArIFZpZXdwb3J0IChEb2N1bWVudCBQcmV2aWV3KSAtLT4KICA8ZGl2IGNsYXNzPSJzdHVkaW8td29ya3NwYWNlIj4KCiAgICA8IS0tIExlZnQgQ29udHJvbCBTaWRlYmFyIC0tPgogICAgPGFzaWRlIGNsYXNzPSJzdHVkaW8tc2lkZWJhciIgaWQ9InN0dWRpb1NpZGViYXIiPgogICAgICA8IS0tIFRhYnMgSGVhZGVyIC0tPgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXRhYnMtaGVhZGVyIj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJzaWRlYmFyLXRhYi1idG4gYWN0aXZlIiBvbmNsaWNrPSJzd2l0Y2hTaWRlYmFyVGFiKCdpbnB1dFRhYicpIj7inKggRG9jdW1lbnQgR2VuZXJhdG9yPC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0ic2lkZWJhci10YWItYnRuIiBvbmNsaWNrPSJzd2l0Y2hTaWRlYmFyVGFiKCdtZXRhVGFiJykiPvCfj7fvuI8gR2VnZXZlbnM8L2J1dHRvbj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJzaWRlYmFyLXRhYi1idG4iIG9uY2xpY2s9InN3aXRjaFNpZGViYXJUYWIoJ3RpcHNUYWInKSI+8J+SoSBIdWxwPC9idXR0b24+CiAgICAgIDwvZGl2PgoKICAgICAgPCEtLSBUYWIgMTogQUkgRG9jdW1lbnQgR2VuZXJhdG9yIChVbmlmaWVkIEFJIFdvcmtmbG93KSAtLT4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci10YWItY29udGVudCIgaWQ9ImlucHV0VGFiIj4KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1sYWJlbCI+MS4gS2llcyBEb2N1bWVudHR5cGU8L2xhYmVsPgogICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybWF0LXNlbGVjdG9yLWdyaWQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtYXQtY2FyZC1idG4iIGlkPSJmb3JtYXRGYWN0c2hlZXQiIG9uY2xpY2s9InNlbGVjdERvY3VtZW50Rm9ybWF0KCdmYWN0c2hlZXQnKSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybWF0LWljb24iPvCfk4Q8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtYXQtbmFtZSI+RmFjdHNoZWV0PC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybWF0LXBhZ2VzIj4xIFBhZ2luYTwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybWF0LWNhcmQtYnRuIiBpZD0iZm9ybWF0QnJpZWZpbmciIG9uY2xpY2s9InNlbGVjdERvY3VtZW50Rm9ybWF0KCdicmllZmluZycpIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtYXQtaWNvbiI+8J+TkTwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm1hdC1uYW1lIj5CcmllZmluZzwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm1hdC1wYWdlcyI+MiBQYWdpbmEnczwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybWF0LWNhcmQtYnRuIGFjdGl2ZSIgaWQ9ImZvcm1hdFdoaXRlcGFwZXIiIG9uY2xpY2s9InNlbGVjdERvY3VtZW50Rm9ybWF0KCd3aGl0ZXBhcGVyJykiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm1hdC1pY29uIj7wn5OYPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybWF0LW5hbWUiPldoaXRlcGFwZXI8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtYXQtcGFnZXMiPjQgUGFnaW5hJ3M8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tbGFiZWwiPgogICAgICAgICAgICA8c3Bhbj4yLiBCZXN0YW5kIFNsZXBlbiBvZiBVcGxvYWRlbjwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBweDsgY29sb3I6IHZhcigtLWNvbG9yLXNvZnQtc2FnZSk7Ij5Xb3JkICguZG9jeCkgLyAubWQgLyAudHh0PC9zcGFuPgogICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRyb3B6b25lLWJveCIgaWQ9ImZpbGVEcm9wWm9uZSIgb25jbGljaz0iZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGVVcGxvYWRJbnB1dCcpLmNsaWNrKCkiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkcm9wem9uZS10aXRsZSI+8J+TgSBTbGVlcCBoaWVyIGVlbiBXb3JkIG9mIHRla3N0YmVzdGFuZCBoZWVuPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRyb3B6b25lLXN1YiI+V29yZCAoLmRvY3gpLCBNYXJrZG93biAoLm1kKSBlbiBwbGF0dGUgdGVrc3QgKC50eHQpPC9kaXY+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBpZD0iZmlsZVVwbG9hZElucHV0IiBhY2NlcHQ9Ii50eHQsLm1kLC5tYXJrZG93biwuZG9jeCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IiBvbmNoYW5nZT0iaGFuZGxlRmlsZVVwbG9hZChldmVudCkiPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1sYWJlbCI+CiAgICAgICAgICAgIDxzcGFuPjMuIE9mIFBsYWsgSGllciBUZWtzdDwvc3Bhbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXN0dWRpbyIgc3R5bGU9InBhZGRpbmc6IDJweCA3cHg7IGZvbnQtc2l6ZTogMTBweDsiIG9uY2xpY2s9ImxvYWRTYW1wbGVUZXh0KCkiPlZvb3JiZWVsZCBJbmxhZGVuPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz0iZm9ybS10ZXh0YXJlYSIgaWQ9InJhd0NvbnRlbnRJbnB1dCIgcGxhY2Vob2xkZXI9IlBsYWsgaGllciBlZW4gYXJ0aWtlbCwgcmFwcG9ydCwgbWVtbyBvZiBub3RpdGllcy4gRGUgQUkgYW5hbHlzZWVydCBkZSBpbmhvdWQgZW4gbWFha3QgYXV0b21hdGlzY2ggZGUganVpc3RlIG9wbWFhaywga29wcGVuIGVuIGJlbnRvLWJsb2trZW4uLi4iPjwvdGV4dGFyZWE+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDwhLS0gQUkgRW5naW5lIENvbmZpZ3VyYXRpb24gKEludGVncmF0ZWQgZGlyZWN0bHkgaW50byB0aGUgd29ya2Zsb3cpIC0tPgogICAgICAgIDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6IHJnYmEoMjI0LCAxMjIsIDk1LCAwLjA4KTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMjQsIDEyMiwgOTUsIDAuMjUpOyBib3JkZXItcmFkaXVzOiAxMHB4OyBwYWRkaW5nOiAxMnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4OyI+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDhweDsiPgogICAgICAgICAgICA8c3Ryb25nIHN0eWxlPSJjb2xvcjogdmFyKC0tY29sb3ItZW1iZXItZ2xvdyk7IGZvbnQtc2l6ZTogMTFweDsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTsiPgogICAgICAgICAgICAgIPCfpJYgQUkgUmVkYWN0aWUgRW5naW5lCiAgICAgICAgICAgIDwvc3Ryb25nPgogICAgICAgICAgICA8c3BhbiBpZD0iYXBpS2V5U3RhdHVzQmFkZ2UiIHN0eWxlPSJmb250LXNpemU6IDEwcHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiAjN0M5RDk2OyI+CiAgICAgICAgICAgICAg8J+UkSBTbGV1dGVsIFZlcmVpc3QKICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDhweDsgbWFyZ2luLWJvdHRvbTogOHB4OyI+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPSJmb250LXNpemU6IDEwcHg7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiB2YXIoLS1jb2xvci1zb2Z0LXNhZ2UpOyBkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogM3B4OyI+UHJvdmlkZXI8L2xhYmVsPgogICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImZvcm0tc2VsZWN0IiBpZD0iYWlQcm92aWRlclNlbGVjdCIgc3R5bGU9ImZvbnQtc2l6ZTogMTFweDsgcGFkZGluZzogNXB4IDhweDsiIG9uY2hhbmdlPSJ1cGRhdGVNb2RlbE9wdGlvbnMoKSI+CiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJnZW1pbmkiPkdvb2dsZSBHZW1pbmk8L29wdGlvbj4KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Im9wZW5haSI+T3BlbkFJPC9vcHRpb24+CiAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0iZm9udC1zaXplOiAxMHB4OyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBmb250LXdlaWdodDogNzAwOyBjb2xvcjogdmFyKC0tY29sb3Itc29mdC1zYWdlKTsgZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDNweDsiPk1vZGVsPC9sYWJlbD4KICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJmb3JtLXNlbGVjdCIgaWQ9ImFpTW9kZWxTZWxlY3QiIHN0eWxlPSJmb250LXNpemU6IDExcHg7IHBhZGRpbmc6IDVweCA4cHg7IiBvbmNoYW5nZT0iaGFuZGxlTW9kZWxTZWxlY3RDaGFuZ2UoKSI+CiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJnZW1pbmktMi41LWZsYXNoIj5HZW1pbmkgMi41IEZsYXNoIChBYW5iZXZvbGVuKTwvb3B0aW9uPgogICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZ2VtaW5pLTIuMC1mbGFzaCI+R2VtaW5pIDIuMCBGbGFzaDwvb3B0aW9uPgogICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZ2VtaW5pLTMuOC1mbGFzaCI+R2VtaW5pIDMuOCBGbGFzaDwvb3B0aW9uPgogICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZ2VtaW5pLTEuNS1mbGFzaC1sYXRlc3QiPkdlbWluaSAxLjUgRmxhc2g8L29wdGlvbj4KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImdlbWluaS0yLjUtcHJvIj5HZW1pbmkgMi41IFBybzwvb3B0aW9uPgogICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iY3VzdG9tIj5BbmRlciBtb2RlbC4uLjwvb3B0aW9uPgogICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWlucHV0IiBpZD0iY3VzdG9tTW9kZWxJbnB1dCIgcGxhY2Vob2xkZXI9IlR5cCBtb2RlbG5hYW0uLi4iIHN0eWxlPSJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiA4cHg7IGZvbnQtc2l6ZTogMTFweDsiPgoKICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogNHB4OyI+CiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPSJmb250LXNpemU6IDEwcHg7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiB2YXIoLS1jb2xvci1zb2Z0LXNhZ2UpOyI+QVBJIFNsZXV0ZWw8L2xhYmVsPgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vYWlzdHVkaW8uZ29vZ2xlLmNvbS8iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiIHN0eWxlPSJmb250LXNpemU6IDEwcHg7IGNvbG9yOiB2YXIoLS1jb2xvci1lbWJlci1nbG93KTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyI+8J+RiSBHcmF0aXMgR2VtaW5pIGtleTwvYT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZTsiPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJwYXNzd29yZCIgY2xhc3M9ImZvcm0taW5wdXQiIGlkPSJhaUFwaUtleUlucHV0IiBwbGFjZWhvbGRlcj0iUGxhayBoaWVyIGplIEdlbWluaSBBUEkga2V5IChBSXphU3kuLi4pIiBzdHlsZT0icGFkZGluZy1yaWdodDogMzZweDsgZm9udC1zaXplOiAxMXB4OyIgb25pbnB1dD0ic2F2ZUFwaUtleVRvTG9jYWwoKSI+CiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIG9uY2xpY2s9InRvZ2dsZUFwaUtleVZpc2liaWxpdHkoKSIgc3R5bGU9InBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IDhweDsgdG9wOiA1MCU7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsgYmFja2dyb3VuZDogbm9uZTsgYm9yZGVyOiBub25lOyBjb2xvcjogdmFyKC0tY29sb3Itc29mdC1zYWdlKTsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDEycHg7IiB0aXRsZT0iVG9vbi92ZXJiZXJnIHNsZXV0ZWwiPvCfkYHvuI88L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPCEtLSBUaGUgU2luZ2xlLCBQcmltYXJ5IEFjdGlvbiBCdXR0b24hIC0tPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1zdHVkaW8gYnRuLXN0dWRpby1wcmltYXJ5IiBpZD0iYnRuUnVuQWlGb3JtYXQiIHN0eWxlPSJqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgcGFkZGluZzogMTNweDsgZm9udC1zaXplOiAxMy41cHg7IGZvbnQtd2VpZ2h0OiA4MDA7IHdpZHRoOiAxMDAlOyBib3gtc2hhZG93OiAwIDRweCAxNXB4IHJnYmEoMjI0LCAxMjIsIDk1LCAwLjM1KTsiIG9uY2xpY2s9InJ1bkFpU3RydWN0dXJpbmcoKSI+CiAgICAgICAgICDinKggR2VuZXJlZXIgRG9jdW1lbnQgbWV0IEFJCiAgICAgICAgPC9idXR0b24+CgogICAgICAgIDxkaXYgaWQ9ImFpU3RhdHVzTWVzc2FnZSIgc3R5bGU9ImZvbnQtc2l6ZTogMTEuNXB4OyBjb2xvcjogdmFyKC0tY29sb3Itc29mdC1zYWdlKTsgZGlzcGxheTogbm9uZTsgbGluZS1oZWlnaHQ6IDEuNDsgbWFyZ2luLXRvcDogMTBweDsgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjMpOyBwYWRkaW5nOiA5cHggMTJweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXItbGVmdDogM3B4IHNvbGlkIHZhcigtLWNvbG9yLWVtYmVyLWdsb3cpOyI+PC9kaXY+CgogICAgICA8L2Rpdj4KCiAgICAgIDwhLS0gVGFiIDM6IE1ldGFkYXRhICYgVmVsZGVuIC0tPgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXRhYi1jb250ZW50IiBpZD0ibWV0YVRhYiIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1sYWJlbCI+RG9zc2llciBUeXBlIC8gQmFkZ2U8L2xhYmVsPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWlucHV0IiBpZD0ibWV0YUJhZGdlSW5wdXQiIHZhbHVlPSJFWEVDVVRJVkUgQlJJRUZJTkcgJmFtcDsgVEVDSE5JQ0FMIEJMVUVQUklOVCIgb25pbnB1dD0idXBkYXRlTGl2ZU1ldGEoKSI+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgPGxhYmVsIGNsYXNzPSJmb3JtLWxhYmVsIj5Ib29mZHRpdGVsIChvbmRlcnN0ZXVudCAmbHQ7c3BhbiBjbGFzcz0iZW1iZXIiJmd0Oyk8L2xhYmVsPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWlucHV0IiBpZD0ibWV0YVRpdGxlSW5wdXQiIHZhbHVlPSJUT0tFTiBTUVVFRVpFOiBERSBWRVJCT1JHRU4gTUFSR0lOIEtJTExFUiBJTiBBSSBTRUFSQ0giIG9uaW5wdXQ9InVwZGF0ZUxpdmVNZXRhKCkiPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1sYWJlbCI+U3VidGl0ZWwgLyBJbnRyb2R1Y3RpZXppbjwvbGFiZWw+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImZvcm0taW5wdXQiIGlkPSJtZXRhU3VidGl0bGVJbnB1dCIgdmFsdWU9IldhYXJvbSB3ZWJzaXRlcyBtZXQgJ2Jsb2F0ZWQnIEhUTUwgZW4gdHJhY2tlcnMgZG9vciBMTE0gY29udGV4dCB3aW5kb3dzIHZhbGxlbi4iIG9uaW5wdXQ9InVwZGF0ZUxpdmVNZXRhKCkiPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1sYWJlbCI+TGVhZCBQYXJhZ3JhYWY8L2xhYmVsPgogICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJmb3JtLXRleHRhcmVhIiBzdHlsZT0ibWluLWhlaWdodDogODBweDsiIGlkPSJtZXRhTGVhZElucHV0IiBvbmlucHV0PSJ1cGRhdGVMaXZlTWV0YSgpIj5Hcm90ZSB0YWFsbW9kZWxsZW4gbGV6ZW4gZ2VlbiB3ZWJwYWdpbmEncyB6b2FscyBicm93c2VycyBkYXQgZG9lbjsgemUgY29uc3VtZXJlbiB0b2tlbnMuIFNpdGVzIG1ldCBob25kZXJkZW4ga2lsb2J5dGVzIGFhbiBib2lsZXJwbGF0ZSBjb2RlIHdvcmRlbiBnZW5hZGVsb29zIGFmZ2VrYXB0IHbDs8OzcmRhdCBkZSBrZXJuYm9vZHNjaGFwIHdvcmR0IGJlcmVpa3QuPC90ZXh0YXJlYT4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDhweDsiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1sYWJlbCI+TGVlc3RpamQ8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImZvcm0taW5wdXQiIGlkPSJtZXRhUmVhZFRpbWVJbnB1dCIgdmFsdWU9IjQgTUlOVVRFTiIgb25pbnB1dD0idXBkYXRlTGl2ZU1ldGEoKSI+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tbGFiZWwiPkRvZWxncm9lcDwvbGFiZWw+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1pbnB1dCIgaWQ9Im1ldGFBdWRpZW5jZUlucHV0IiB2YWx1ZT0iQ1RPLCBDTU8sIFRFQ0ggU0VPIiBvbmlucHV0PSJ1cGRhdGVMaXZlTWV0YSgpIj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1sYWJlbCI+QXV0ZXVyIC8gQWZ6ZW5kZXI8L2xhYmVsPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWlucHV0IiBpZD0ibWV0YUF1dGhvcklucHV0IiB2YWx1ZT0iTExNZW50cnkgUmVzZWFyY2ggTGFiIiBvbmlucHV0PSJ1cGRhdGVMaXZlTWV0YSgpIj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8IS0tIFRhYiA0OiBIYW5kaWdlIFRpcHMgLS0+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItdGFiLWNvbnRlbnQiIGlkPSJ0aXBzVGFiIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgPGxhYmVsIGNsYXNzPSJmb3JtLWxhYmVsIj7wn46vIEhvZSBwYXMgamUgc3BlY2lmaWVrZSBlbGVtZW50ZW4gYWFuPzwvbGFiZWw+CiAgICAgICAgICA8dWwgc3R5bGU9ImZvbnQtc2l6ZTogMTEuNXB4OyBjb2xvcjogdmFyKC0tY29sb3Itc29mdC1zYWdlKTsgbGluZS1oZWlnaHQ6IDEuNTsgcGFkZGluZy1sZWZ0OiAxNnB4OyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDsiPgogICAgICAgICAgICA8bGk+PHN0cm9uZz5FbGsgb25kZXJkZWVsIGlzIGluZGl2aWR1ZWVsIGtsaWtiYWFyOjwvc3Ryb25nPiBLbGlrIG9wIGVlbiBwYWdpbmEsIGVlbiBiZW50by1rYWFydCwgZWVuIGtvcCBvZiBlZW4gYWxpbmVhLiBEZSB6d2V2ZW5kZSA8ZW0+Q3VzdG9taXplciBTdHVkaW88L2VtPiByZWNodHNvbmRlciBwYXN0IHppY2ggZGlyZWN0IGFhbiBkw6F0IGVsZW1lbnQgYWFuITwvbGk+CiAgICAgICAgICAgIDxsaT48c3Ryb25nPkFjaHRlcmdyb25kIHBlciBwYWdpbmE6PC9zdHJvbmc+IEtsaWsgb3AgUGFnaW5hIDIgb20gYWxsw6nDqW4gUGFnaW5hIDIgYWFuIHRlIHBhc3Nlbi4gUGFnaW5hIDEsIDMgZW4gNCBibGlqdmVuIGludGFjdCE8L2xpPgogICAgICAgICAgICA8bGk+PHN0cm9uZz5UaXRlbHMgaW4gMiBrbGV1cmVuOjwvc3Ryb25nPiBTZWxlY3RlZXIgZWVuIHNwZWNpZmllayB3b29yZCBtZXQgamUgbXVpcyBlbiBrbGlrIG9wIGhldCBvcmFuamUgYm9sbGV0amUgKDxzcGFuIHN0eWxlPSJjb2xvcjogI0UwN0E1RjsiPkFtYmVyIEdsb3c8L3NwYW4+KSBvZiBncm9lbmUgYm9sbGV0amUgKDxzcGFuIHN0eWxlPSJjb2xvcjogIzdDOUQ5NjsiPk5ldXJhbCBTYWdlPC9zcGFuPikuPC9saT4KICAgICAgICAgICAgPGxpPjxzdHJvbmc+RGlyZWN0IHR5cGVuOjwvc3Ryb25nPiBEdWJiZWxrbGlrIG9wIGVlbiB0ZWtzdCBvZiB6ZXQgPHN0cm9uZz5MaXZlIFR5cGVuOiBBQU48L3N0cm9uZz4gcmVjaHRzYm92ZW4gb20gZGlyZWN0IGluIGRlIEE0IHBhZ2luYSdzIHRlIHR5cGVuLjwvbGk+CiAgICAgICAgICAgIDxsaT48c3Ryb25nPk9uZ2VkYWFuIG1ha2VuOjwvc3Ryb25nPiBHZWJydWlrIDxjb2RlPkN0cmwrWjwvY29kZT4gKFVuZG8pIGVuIDxjb2RlPkN0cmwrWTwvY29kZT4gKFJlZG8pLjwvbGk+CiAgICAgICAgICA8L3VsPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICA8L2FzaWRlPgoKICAgIDwhLS0gUmlnaHQgTGl2ZSBQcmV2aWV3IFBhbmUgLS0+CiAgICA8bWFpbiBjbGFzcz0ic3R1ZGlvLXByZXZpZXctcGFuZSI+CiAgICAgIDwhLS0gUHJldmlldyBTdWItYmFyIC0tPgogICAgICA8ZGl2IGNsYXNzPSJwcmV2aWV3LXRvb2xiYXIiPgogICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDsiPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXN0dWRpbyIgc3R5bGU9InBhZGRpbmc6IDRweCA4cHg7IGZvbnQtc2l6ZTogMTFweDsiIG9uY2xpY2s9InRvZ2dsZVNpZGViYXIoKSI+CiAgICAgICAgICAgIOKYsCBaaWpiYWxrCiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiAjRkZGOyIgaWQ9InByZXZpZXdEb2N1bWVudEJhZGdlIj4KICAgICAgICAgICAg8J+TmCBTdGFuZGFhcmQgV2hpdGVwYXBlciAoNCBQYWdpbmEncykKICAgICAgICAgIDwvc3Bhbj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iem9vbS1ncm91cCI+CiAgICAgICAgICA8c3Bhbj5TY2hhYWw6PC9zcGFuPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXpvb20iIG9uY2xpY2s9ImFkanVzdFpvb20oLTAuMSkiPi08L2J1dHRvbj4KICAgICAgICAgIDxzcGFuIGlkPSJ6b29tTGV2ZWxEaXNwbGF5IiBzdHlsZT0iZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtbW9ubyk7IGZvbnQtd2VpZ2h0OiA3MDA7IHdpZHRoOiA0NHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7Ij43NSU8L3NwYW4+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tem9vbSIgb25jbGljaz0iYWRqdXN0Wm9vbSgwLjEpIj4rPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tc3R1ZGlvIiBzdHlsZT0icGFkZGluZzogM3B4IDhweDsgZm9udC1zaXplOiAxMXB4OyIgb25jbGljaz0ic2V0Wm9vbSgwLjc1KSI+UGFzc2VuZDwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXN0dWRpbyIgc3R5bGU9InBhZGRpbmc6IDNweCA4cHg7IGZvbnQtc2l6ZTogMTFweDsiIG9uY2xpY2s9InNldFpvb20oMS4wKSI+MTAwJTwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXN0dWRpbyIgc3R5bGU9InBhZGRpbmc6IDNweCA4cHg7IGZvbnQtc2l6ZTogMTFweDsgbWFyZ2luLWxlZnQ6IDZweDsiIG9uY2xpY2s9InRvZ2dsZUN1c3RvbWl6ZXJQYW5lbCgpIj4KICAgICAgICAgICAg4pqZ77iPIEN1c3RvbWl6ZXIgU3R1ZGlvCiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8IS0tIFZpZXdwb3J0IFNjcm9sbGFibGUgQXJlYSAtLT4KICAgICAgPGRpdiBjbGFzcz0icHJldmlldy12aWV3cG9ydC1zY3JvbGwiIGlkPSJwcmV2aWV3U2Nyb2xsQXJlYSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnQtdmlld3BvcnQtd3JhcHBlciBkb2N1bWVudC12aWV3cG9ydCIgaWQ9ImRvY3VtZW50Vmlld3BvcnRXcmFwcGVyIiBzdHlsZT0idHJhbnNmb3JtOiBzY2FsZSgwLjc1KTsiPgogICAgICAgICAgPCEtLSBEeW5hbWljIEE0IFBhZ2VzIHdpbGwgYmUgcmVuZGVyZWQgaGVyZSBieSBKUyAtLT4KICAgICAgICAgIDxkaXYgaWQ9InJlbmRlcmVkRG9jdW1lbnRSb290IiBzdHlsZT0iZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA0MHB4OyBhbGlnbi1pdGVtczogY2VudGVyOyI+PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9tYWluPgoKICA8L2Rpdj4KCiAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgU1BBQ0lPVVMgQ09OVEVYVC1BV0FSRSBRVUlDSyBDVVNUT01JWkVSIFBBTkVMIChWMy4zIFBSRUNJU0lPTiBFTkdJTkUpCiAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICA8YXNpZGUgY2xhc3M9InF1aWNrLWN1c3RvbWl6ZXItcGFuZWwiIGlkPSJjdXN0b21pemVyUGFuZWwiPgogICAgPGRpdiBjbGFzcz0icGFuZWwtaGVhZGVyIj4KICAgICAgPHNwYW4+4pqZ77iPIEN1c3RvbWl6ZXIgU3R1ZGlvIChQZXIgRWxlbWVudCk8L3NwYW4+CiAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGdhcDogNHB4OyI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXRvb2wtaWNvbiIgaWQ9InBhbmVsVW5kb0J0biIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9InVuZG8oKSIgdGl0bGU9IlVuZG8gKEN0cmwrWikiPuKGqe+4jzwvYnV0dG9uPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi10b29sLWljb24iIGlkPSJwYW5lbFJlZG9CdG4iIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJyZWRvKCkiIHRpdGxlPSJSZWRvIChDdHJsK1kpIj7ihqrvuI88L2J1dHRvbj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tdG9vbC1pY29uIiBvbmNsaWNrPSJ0b2dnbGVDdXN0b21pemVyUGFuZWwoKSIgdGl0bGU9Ik1pbmltYWxpc2VlciI+4pyVPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPCEtLSBDb250ZXh0IFN3aXRjaGVyICYgQWN0aXZlIFRhcmdldCBCYWRnZSAtLT4KICAgIDxkaXYgY2xhc3M9ImFjdGl2ZS1jb250ZXh0LWJhciI+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRleHQtbGFiZWwiIGlkPSJhY3RpdmVDb250ZXh0TGFiZWwiPgogICAgICAgIDxzcGFuPvCfjq88L3NwYW4+CiAgICAgICAgPHNwYW4gaWQ9InRhcmdldFRhZ05hbWUiPkdlZW4gRWxlbWVudCBHZXNlbGVjdGVlcmQ8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250ZXh0LWFjdGlvbnMiPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1jb250ZXh0LWp1bXAiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJzZWxlY3RQYXJlbnRJbnRybygpIiB0aXRsZT0iU2VsZWN0ZWVyIEtvcCAmYW1wOyBJbnRybyBCbG9rIj7wn4+377iPIEtvcGdyb2VwPC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLWNvbnRleHQtanVtcCIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9InNlbGVjdFBhcmVudENhcmQoKSIgdGl0bGU9IlNlbGVjdGVlciBvbXJpbmdlbmRlIGthYXJ0Ij7wn460IFZsYWs8L2J1dHRvbj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tY29udGV4dC1qdW1wIiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0ic2VsZWN0Q3VycmVudFBhZ2UoKSIgdGl0bGU9IlNlbGVjdGVlciBwYWdpbmEiPvCfk4QgUGFnaW5hPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPCEtLSBTZWN0aW9uIDE6IFBhZ2UgQmFja2dyb3VuZCAmIFNwbGl0IENvbnRyb2xzIChBcHBsaWVzIHRvIFNFTEVDVEVEIHBhZ2Ugb25seSkgLS0+CiAgICA8ZGl2IGNsYXNzPSJlZGl0b3ItdGFiLXNlY3Rpb24iIGlkPSJzZWN0aW9uUGFnZUNvbnRyb2xzIj4KICAgICAgPGRpdiBjbGFzcz0icGFuZWwtc2VjdGlvbi10aXRsZSI+8J+ThCBHZXNlbGVjdGVlcmRlIFBhZ2luYSBBY2h0ZXJncm9uZCAmYW1wOyBTcGxpdDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLXJvdy13cmFwcGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzd2F0Y2gtbGFiZWwiPgogICAgICAgICAgPHNwYW4+U3BsaXQgU2NoZWlkaW5nc2xpam48L3NwYW4+CiAgICAgICAgICA8c3BhbiBpZD0ic3BsaXRWYWx1ZUJhZGdlIiBzdHlsZT0iY29sb3I6IHZhcigtLWNvbG9yLWVtYmVyLWdsb3cpOyBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTsgZm9udC13ZWlnaHQ6IDcwMDsiPjQyJTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8aW5wdXQgdHlwZT0icmFuZ2UiIG1pbj0iMTUiIG1heD0iODUiIHZhbHVlPSI0MiIgY2xhc3M9ImxpdmUtcmFuZ2Utc2xpZGVyIiBpZD0ic3BsaXRTbGlkZXIiIG9uaW5wdXQ9InVwZGF0ZVBhZ2VTcGxpdCh0aGlzLnZhbHVlKSI+CiAgICAgICAgPGRpdiBjbGFzcz0icHJlc2V0LXBpbGwtZ3JvdXAiIHN0eWxlPSJtYXJnaW4tdG9wOiA0cHg7Ij4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1wcmVzZXQtcGlsbCIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9InNldFNwbGl0UHJlc2V0KDM0KSI+MzQvNjY8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1wcmVzZXQtcGlsbCIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9InNldFNwbGl0UHJlc2V0KDQyKSI+NDIvNTg8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1wcmVzZXQtcGlsbCIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9InNldFNwbGl0UHJlc2V0KDU2KSI+NTYvNDQgKEFzeW0pPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0ic3dhdGNoLXJvdy13cmFwcGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzd2F0Y2gtbGFiZWwiPkJvdmVuc3RlIFZsYWsgS2xldXIgKEFsbGVlbiBEZXplIFBhZ2luYSk8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzd2F0Y2gtbGlzdCI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3Itc3dhdGNoLXJvdW5kIiBzdHlsZT0iYmFja2dyb3VuZDojMTYyMTI3OyIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9InNldFBhZ2VCZ0NvbG9yKCd0b3AnLCAnIzE2MjEyNycpIiB0aXRsZT0iT2JzaWRpYW4gRG9ua2VyIj48L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3Itc3dhdGNoLXJvdW5kIiBzdHlsZT0iYmFja2dyb3VuZDojMzU1MDRBOyIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9InNldFBhZ2VCZ0NvbG9yKCd0b3AnLCAnIzM1NTA0QScpIiB0aXRsZT0iRGVlcCBUZWFsIj48L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3Itc3dhdGNoLXJvdW5kIiBzdHlsZT0iYmFja2dyb3VuZDojRDc4NTcwOyIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9InNldFBhZ2VCZ0NvbG9yKCd0b3AnLCAnI0Q3ODU3MCcpIiB0aXRsZT0iVGVycmEgT3JhbmplIj48L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3Itc3dhdGNoLXJvdW5kIiBzdHlsZT0iYmFja2dyb3VuZDojRkFGN0YyOyIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9InNldFBhZ2VCZ0NvbG9yKCd0b3AnLCAnI0ZBRjdGMicpIiB0aXRsZT0iQ3LDqG1lIj48L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3Itc3dhdGNoLXJvdW5kIiBzdHlsZT0iYmFja2dyb3VuZDojRjlGOEY2OyIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9InNldFBhZ2VCZ0NvbG9yKCd0b3AnLCAnI0Y5RjhGNicpIiB0aXRsZT0iQWxhYmFzdGVyIFdpdCI+PC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9InN3YXRjaC1yb3ctd3JhcHBlciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic3dhdGNoLWxhYmVsIj5PbmRlcnN0ZSBWbGFrIEtsZXVyIChBbGxlZW4gRGV6ZSBQYWdpbmEpPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic3dhdGNoLWxpc3QiPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLXN3YXRjaC1yb3VuZCIgc3R5bGU9ImJhY2tncm91bmQ6IzM1NTA0QTsiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJzZXRQYWdlQmdDb2xvcignYm90dG9tJywgJyMzNTUwNEEnKSIgdGl0bGU9IkRlZXAgVGVhbCI+PC9zcGFuPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLXN3YXRjaC1yb3VuZCIgc3R5bGU9ImJhY2tncm91bmQ6IzE2MjEyNzsiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJzZXRQYWdlQmdDb2xvcignYm90dG9tJywgJyMxNjIxMjcnKSIgdGl0bGU9Ik9ic2lkaWFuIERvbmtlciI+PC9zcGFuPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLXN3YXRjaC1yb3VuZCIgc3R5bGU9ImJhY2tncm91bmQ6I0Q3ODU3MDsiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJzZXRQYWdlQmdDb2xvcignYm90dG9tJywgJyNENzg1NzAnKSIgdGl0bGU9IlRlcnJhIE9yYW5qZSI+PC9zcGFuPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLXN3YXRjaC1yb3VuZCIgc3R5bGU9ImJhY2tncm91bmQ6I0ZBRjdGMjsiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJzZXRQYWdlQmdDb2xvcignYm90dG9tJywgJyNGQUY3RjInKSIgdGl0bGU9IkNyw6htZSI+PC9zcGFuPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLXN3YXRjaC1yb3VuZCIgc3R5bGU9ImJhY2tncm91bmQ6I0Y5RjhGNjsiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJzZXRQYWdlQmdDb2xvcignYm90dG9tJywgJyNGOUY4RjYnKSIgdGl0bGU9IkFsYWJhc3RlciBXaXQiPjwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8IS0tIFNlY3Rpb24gMjogU2VsZWN0ZWQgQ2FyZCAvIEJveCBBZGp1c3RtZW50cyAtLT4KICAgIDxkaXYgY2xhc3M9ImVkaXRvci10YWItc2VjdGlvbiIgaWQ9InNlY3Rpb25DYXJkQ29udHJvbHMiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICAgIDxkaXYgY2xhc3M9InBhbmVsLXNlY3Rpb24tdGl0bGUiIGlkPSJjYXJkU2VjdGlvblRpdGxlIj7wn460IEdlc2VsZWN0ZWVyZCBWbGFrIC8gS2FhcnQ8L2Rpdj4KICAgICAgCiAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1yb3ctd3JhcHBlciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic3dhdGNoLWxhYmVsIj4KICAgICAgICAgIDxzcGFuPuKGle+4jyBZLVBvc2l0aWUgTnVkZ2U8L3NwYW4+CiAgICAgICAgICA8c3BhbiBpZD0iY2FyZE51ZGdlQmFkZ2UiIHN0eWxlPSJjb2xvcjogdmFyKC0tY29sb3ItZW1iZXItZ2xvdyk7IGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LW1vbm8pOyBmb250LXdlaWdodDogNzAwOyI+MHB4PC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICAgIDxpbnB1dCB0eXBlPSJyYW5nZSIgbWluPSItMjAwIiBtYXg9IjIwMCIgdmFsdWU9IjAiIGNsYXNzPSJsaXZlLXJhbmdlLXNsaWRlciIgaWQ9ImNhcmROdWRnZVNsaWRlciIgb25pbnB1dD0idXBkYXRlQ2FyZE51ZGdlWSh0aGlzLnZhbHVlKSI+CiAgICAgICAgPGRpdiBjbGFzcz0icHJlc2V0LXBpbGwtZ3JvdXAiIHN0eWxlPSJtYXJnaW4tdG9wOiA0cHg7Ij4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1wcmVzZXQtcGlsbCIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9Im51ZGdlQ2FyZFN0ZXAoLTMwKSI+4payIC0zMHB4PC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tcHJlc2V0LXBpbGwiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJudWRnZUNhcmRTdGVwKC0xMCkiPuKWsiAtMTBweDwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXByZXNldC1waWxsIiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0ibnVkZ2VDYXJkU3RlcCgwKSI+4o+677iPIDBweDwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXByZXNldC1waWxsIiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0ibnVkZ2VDYXJkU3RlcCgxMCkiPuKWvCArMTBweDwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXByZXNldC1waWxsIiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0ibnVkZ2VDYXJkU3RlcCgzMCkiPuKWvCArMzBweDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1yb3ctd3JhcHBlciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic3dhdGNoLWxhYmVsIj4KICAgICAgICAgIDxzcGFuPuKGlO+4jyBYLVBvc2l0aWUgTnVkZ2U8L3NwYW4+CiAgICAgICAgICA8c3BhbiBpZD0iY2FyZE51ZGdlWEJhZGdlIiBzdHlsZT0iY29sb3I6IHZhcigtLWNvbG9yLWVtYmVyLWdsb3cpOyBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTsgZm9udC13ZWlnaHQ6IDcwMDsiPjBweDwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8aW5wdXQgdHlwZT0icmFuZ2UiIG1pbj0iLTIwMCIgbWF4PSIyMDAiIHZhbHVlPSIwIiBjbGFzcz0ibGl2ZS1yYW5nZS1zbGlkZXIiIGlkPSJjYXJkTnVkZ2VYU2xpZGVyIiBvbmlucHV0PSJ1cGRhdGVDYXJkTnVkZ2VYKHRoaXMudmFsdWUpIj4KICAgICAgICA8ZGl2IGNsYXNzPSJwcmVzZXQtcGlsbC1ncm91cCIgc3R5bGU9Im1hcmdpbi10b3A6IDRweDsiPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXByZXNldC1waWxsIiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0ibnVkZ2VDYXJkU3RlcFgoLTMwKSI+4peAIC0zMHB4PC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tcHJlc2V0LXBpbGwiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJudWRnZUNhcmRTdGVwWCgtMTApIj7il4AgLTEwcHg8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1wcmVzZXQtcGlsbCIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9Im51ZGdlQ2FyZFN0ZXBYKDApIj7ij7rvuI8gMHB4PC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tcHJlc2V0LXBpbGwiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJudWRnZUNhcmRTdGVwWCgxMCkiPuKWtiArMTBweDwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXByZXNldC1waWxsIiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0ibnVkZ2VDYXJkU3RlcFgoMzApIj7ilrYgKzMwcHg8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItcm93LXdyYXBwZXIiPgogICAgICAgIDxkaXYgY2xhc3M9InN3YXRjaC1sYWJlbCI+CiAgICAgICAgICA8c3Bhbj7ihpTvuI8gQnJlZWR0ZSAmYW1wOyBLb2xvbSBMYXlvdXQ8L3NwYW4+CiAgICAgICAgICA8c3BhbiBpZD0iY2FyZFdpZHRoQmFkZ2UiIHN0eWxlPSJjb2xvcjogdmFyKC0tY29sb3ItZW1iZXItZ2xvdyk7IGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LW1vbm8pOyBmb250LXdlaWdodDogNzAwOyI+MTAwJTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8aW5wdXQgdHlwZT0icmFuZ2UiIG1pbj0iMjAiIG1heD0iMTAwIiB2YWx1ZT0iMTAwIiBjbGFzcz0ibGl2ZS1yYW5nZS1zbGlkZXIiIGlkPSJjYXJkV2lkdGhTbGlkZXIiIG9uaW5wdXQ9InVwZGF0ZUNhcmRXaWR0aCh0aGlzLnZhbHVlKSI+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9uLXBpbGwtZ3JpZCIgc3R5bGU9Im1hcmdpbi10b3A6IDVweDsiPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXByZXNldC1waWxsIiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0idG9nZ2xlVHdvQ29sdW1uR3JpZCgpIj7wn5GlIDIgR2VsaWprZSBLb2xvbW1lbjwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXByZXNldC1waWxsIiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0ic2V0U2luZ2xlQ29sdW1uRmxvdygpIj7irJsgMSBLb2xvbSBTdGFwZWw8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJwcmVzZXQtcGlsbC1ncm91cCIgc3R5bGU9Im1hcmdpbi10b3A6IDRweDsiPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXByZXNldC1waWxsIiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0iYXBwbHlMYXlvdXRQcmVzZXQoJ2Z1bGwnKSI+4oaU77iPIDEwMCU8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1wcmVzZXQtcGlsbCIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9ImFwcGx5TGF5b3V0UHJlc2V0KCdjb2wtaGFsZicpIj7wn5GlIDUwJTwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXByZXNldC1waWxsIiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0iYXBwbHlMYXlvdXRQcmVzZXQoJ3N0YWdnZXItbGVmdCcpIj7il4DvuI8gNTQlIExpbmtzPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tcHJlc2V0LXBpbGwiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJhcHBseUxheW91dFByZXNldCgnc3RhZ2dlci1yaWdodCcpIj7ilrbvuI8gNTQlIFJlY2h0czwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1yb3ctd3JhcHBlciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic3dhdGNoLWxhYmVsIj4KICAgICAgICAgIDxzcGFuPuKGlO+4jyBUdXNzZW5ydWltdGUgKEdhcCk8L3NwYW4+CiAgICAgICAgICA8c3BhbiBpZD0iY2FyZEdhcEJhZGdlIiBzdHlsZT0iY29sb3I6IHZhcigtLWNvbG9yLWVtYmVyLWdsb3cpOyBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTsgZm9udC13ZWlnaHQ6IDcwMDsiPjEycHg8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGlucHV0IHR5cGU9InJhbmdlIiBtaW49IjAiIG1heD0iNjAiIHZhbHVlPSIxMiIgY2xhc3M9ImxpdmUtcmFuZ2Utc2xpZGVyIiBpZD0iY2FyZEdhcFNsaWRlciIgb25pbnB1dD0idXBkYXRlQ2FyZEdhcCh0aGlzLnZhbHVlKSI+CiAgICAgIDwvZGl2PgoKICAgICAgPCEtLSBDYXJkIEJhY2tncm91bmQgQ29sb3IgLS0+CiAgICAgIDxkaXYgY2xhc3M9InN3YXRjaC1yb3ctd3JhcHBlciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic3dhdGNoLWxhYmVsIj5BY2h0ZXJncm9uZCBWbGFrPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic3dhdGNoLWxpc3QiPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLXN3YXRjaC1yb3VuZCIgc3R5bGU9ImJhY2tncm91bmQ6IzEyMUExRjsiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJhcHBseUNhcmRCZ0NvbG9yKCcjMTIxQTFGJykiIHRpdGxlPSJPYnNpZGlhbiBEb25rZXIiPjwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1zd2F0Y2gtcm91bmQiIHN0eWxlPSJiYWNrZ3JvdW5kOiNGQUY3RjI7IiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0iYXBwbHlDYXJkQmdDb2xvcignI0ZBRjdGMicpIiB0aXRsZT0iQ3LDqG1lIFdhcm0iPjwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1zd2F0Y2gtcm91bmQiIHN0eWxlPSJiYWNrZ3JvdW5kOiNGRkZGRkY7IiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0iYXBwbHlDYXJkQmdDb2xvcignI0ZGRkZGRicpIiB0aXRsZT0iWnVpdmVyIFdpdCI+PC9zcGFuPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLXN3YXRjaC1yb3VuZCIgc3R5bGU9ImJhY2tncm91bmQ6IzM1NTA0QTsiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJhcHBseUNhcmRCZ0NvbG9yKCcjMzU1MDRBJykiIHRpdGxlPSJEZWVwIFRlYWwiPjwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1zd2F0Y2gtcm91bmQiIHN0eWxlPSJiYWNrZ3JvdW5kOiNENzg1NzA7IiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0iYXBwbHlDYXJkQmdDb2xvcignI0Q3ODU3MCcpIiB0aXRsZT0iVGVycmEgT3JhbmplIj48L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3Itc3dhdGNoLXJvdW5kIiBzdHlsZT0iYmFja2dyb3VuZDp0cmFuc3BhcmVudDsgYm9yZGVyOiAycHggZGFzaGVkIHJnYmEoMjU1LDI1NSwyNTUsMC40KTsiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJhcHBseUNhcmRCZ0NvbG9yKCd0cmFuc3BhcmVudCcpIiB0aXRsZT0iVHJhbnNwYXJhbnQiPjwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8IS0tIENhcmQgQm9yZGVyIENvbnRyb2xzIC0tPgogICAgICA8ZGl2IGNsYXNzPSJzd2F0Y2gtcm93LXdyYXBwZXIiPgogICAgICAgIDxkaXYgY2xhc3M9InN3YXRjaC1sYWJlbCI+Qm9yZGVycmFuZCBTdGlqbDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InByZXNldC1waWxsLWdyb3VwIj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1wcmVzZXQtcGlsbCIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9ImFwcGx5Q2FyZEJvcmRlcignbm9uZScpIj5HZWVuPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tcHJlc2V0LXBpbGwiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJhcHBseUNhcmRCb3JkZXIoJ2xlZnQnLCAnI0UwN0E1RicpIj5BY2NlbnQgQW1iZXIgTGlua3M8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1wcmVzZXQtcGlsbCIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9ImFwcGx5Q2FyZEJvcmRlcignbGVmdCcsICcjNjI4MzdEJykiPkFjY2VudCBTYWdlIExpbmtzPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tcHJlc2V0LXBpbGwiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJhcHBseUNhcmRCb3JkZXIoJ2Z1bGwnLCAnI0UwN0E1RicpIj5Cb3JkZXIgQW1iZXI8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1wcmVzZXQtcGlsbCIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9ImFwcGx5Q2FyZEJvcmRlcignZnVsbCcsICcjNjI4MzdEJykiPkJvcmRlciBTYWdlPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPCEtLSBQYWRkaW5nIFByZXNldHMgLS0+CiAgICAgIDxkaXYgY2xhc3M9InN3YXRjaC1yb3ctd3JhcHBlciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic3dhdGNoLWxhYmVsIj5CaW5uZW5ydWltdGUgKFBhZGRpbmcpPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0icHJlc2V0LXBpbGwtZ3JvdXAiPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXByZXNldC1waWxsIiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0iYXBwbHlDYXJkUGFkZGluZygnbm9uZScpIj5HZWVuPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tcHJlc2V0LXBpbGwiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJhcHBseUNhcmRQYWRkaW5nKCdjb21wYWN0JykiPkNvbXBhY3Q8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1wcmVzZXQtcGlsbCIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9ImFwcGx5Q2FyZFBhZGRpbmcoJ25vcm1hbCcpIj5Ob3JtYWFsPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tcHJlc2V0LXBpbGwiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJhcHBseUNhcmRQYWRkaW5nKCdzcGFjaW91cycpIj5SdWltPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPCEtLSBTZWN0aW9uIDM6IFNlbGVjdGVkIFRleHQgVHlwb2dyYXBoeSAmIFJpY2ggSW5saW5lIEZvcm1hdHRpbmcgLS0+CiAgICA8ZGl2IGNsYXNzPSJlZGl0b3ItdGFiLXNlY3Rpb24iIGlkPSJzZWN0aW9uVGV4dENvbnRyb2xzIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1zZWN0aW9uLXRpdGxlIj7inI3vuI8gR2VzZWxlY3RlZXJkZSBUZWtzdCAvIFRpdGVsIC8gV29vcmQ8L2Rpdj4KICAgICAgCiAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZTogMTBweDsgY29sb3I6IHZhcigtLWNvbG9yLXNvZnQtc2FnZSk7IG1hcmdpbi1ib3R0b206IDJweDsiPgogICAgICAgIPCfkqEgPGVtPlNlbGVjdGVlciBlZW4gc3BlY2lmaWVrIHdvb3JkIG1ldCBqZSBtdWlzIG9tIGhldCBpbiA8c3BhbiBzdHlsZT0iY29sb3I6I0UwN0E1RjsgZm9udC13ZWlnaHQ6NzAwOyI+QW1iZXI8L3NwYW4+IG9mIDxzcGFuIHN0eWxlPSJjb2xvcjojN0M5RDk2OyBmb250LXdlaWdodDo3MDA7Ij5TYWdlPC9zcGFuPiB0ZSBrbGV1cmVuITwvZW0+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLXJvdy13cmFwcGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzd2F0Y2gtbGFiZWwiPgogICAgICAgICAgPHNwYW4+RXhhY3RlIExldHRlcmdyb290dGU8L3NwYW4+CiAgICAgICAgICA8c3BhbiBpZD0iZm9udFNpemVCYWRnZSIgc3R5bGU9ImNvbG9yOiB2YXIoLS1jb2xvci1lbWJlci1nbG93KTsgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtbW9ubyk7IGZvbnQtd2VpZ2h0OiA3MDA7Ij4xNHB4PC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICAgIDxpbnB1dCB0eXBlPSJyYW5nZSIgbWluPSI4IiBtYXg9IjQ4IiBzdGVwPSIxIiB2YWx1ZT0iMTQiIGNsYXNzPSJsaXZlLXJhbmdlLXNsaWRlciIgaWQ9ImZvbnRTaXplU2xpZGVyIiBvbmlucHV0PSJzZXRGb250U2l6ZVZhbHVlKHRoaXMudmFsdWUpIj4KICAgICAgICA8ZGl2IGNsYXNzPSJwcmVzZXQtcGlsbC1ncm91cCIgc3R5bGU9Im1hcmdpbi10b3A6IDRweDsiPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXByZXNldC1waWxsIiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0ic2V0Rm9udFNpemVWYWx1ZSgxMCkiPjEwcHg8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1wcmVzZXQtcGlsbCIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9InNldEZvbnRTaXplVmFsdWUoMTMpIj4xM3B4PC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tcHJlc2V0LXBpbGwiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJzZXRGb250U2l6ZVZhbHVlKDE2KSI+MTZweDwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXByZXNldC1waWxsIiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0ic2V0Rm9udFNpemVWYWx1ZSgyNCkiPjI0cHg8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1wcmVzZXQtcGlsbCIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9InNldEZvbnRTaXplVmFsdWUoMzApIj4zMHB4PC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLXJvdy13cmFwcGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzd2F0Y2gtbGFiZWwiPgogICAgICAgICAgPHNwYW4+4oaV77iPIFktUG9zaXRpZSBOdWRnZSBUZWtzdDwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGlkPSJ0ZXh0TnVkZ2VCYWRnZSIgc3R5bGU9ImNvbG9yOiB2YXIoLS1jb2xvci1lbWJlci1nbG93KTsgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtbW9ubyk7IGZvbnQtd2VpZ2h0OiA3MDA7Ij4wcHg8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGlucHV0IHR5cGU9InJhbmdlIiBtaW49Ii0xMDAiIG1heD0iMTUwIiB2YWx1ZT0iMCIgY2xhc3M9ImxpdmUtcmFuZ2Utc2xpZGVyIiBpZD0idGV4dE51ZGdlU2xpZGVyIiBvbmlucHV0PSJ1cGRhdGVUZXh0TnVkZ2VZKHRoaXMudmFsdWUpIj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJidXR0b24tcGlsbC1ncmlkLTMiIHN0eWxlPSJtYXJnaW4tdG9wOiA0cHg7Ij4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tcHJlc2V0LXBpbGwiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJmb3JtYXRUZXh0Q29tbWFuZCgnYm9sZCcpIj48c3Ryb25nPkI8L3N0cm9uZz4gVmV0PC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXByZXNldC1waWxsIiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0iZm9ybWF0VGV4dENvbW1hbmQoJ2l0YWxpYycpIj48ZW0+STwvZW0+IEN1cnNpZWY8L2J1dHRvbj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tcHJlc2V0LXBpbGwiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJmb3JtYXRUZXh0Q29tbWFuZCgndW5kZXJsaW5lJykiPjx1PlU8L3U+IE9uZGVyc3RyZWVwdDwvYnV0dG9uPgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbi1waWxsLWdyaWQiIHN0eWxlPSJtYXJnaW4tdG9wOiA0cHg7Ij4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tcHJlc2V0LXBpbGwiIG9ubW91c2Vkb3duPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIiBvbmNsaWNrPSJ0b2dnbGVUZXh0VHJhbnNmb3JtKCkiPkFBIEhvb2ZkbGV0dGVyczwvYnV0dG9uPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1wcmVzZXQtcGlsbCIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9ImNsZWFySW5saW5lRm9ybWF0KCkiPuKclSBSZXNldCBPcG1hYWs8L2J1dHRvbj4KICAgICAgPC9kaXY+CgogICAgICA8IS0tIFNpZ25hdHVyZSBUd28tQ29sb3IgU3dhdGNoZXMgLS0+CiAgICAgIDxkaXYgY2xhc3M9InN3YXRjaC1yb3ctd3JhcHBlciIgc3R5bGU9Im1hcmdpbi10b3A6IDRweDsiPgogICAgICAgIDxkaXYgY2xhc3M9InN3YXRjaC1sYWJlbCI+S2xldXIgKEdlc2VsZWN0ZWVyZCBXb29yZCBvZiBIZWxlIFRpdGVsKTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InN3YXRjaC1saXN0Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1zd2F0Y2gtcm91bmQiIHN0eWxlPSJiYWNrZ3JvdW5kOiNFMDdBNUY7IiBvbm1vdXNlZG93bj0iZXZlbnQucHJldmVudERlZmF1bHQoKSIgb25jbGljaz0iYXBwbHlUZXh0Q29sb3JDb2RlKCcjRTA3QTVGJykiIHRpdGxlPSJBbWJlciBHbG93IChMTE1lbnRyeSBPcmFuamUpIj48L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3Itc3dhdGNoLXJvdW5kIiBzdHlsZT0iYmFja2dyb3VuZDojN0M5RDk2OyIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9ImFwcGx5VGV4dENvbG9yQ29kZSgnIzdDOUQ5NicpIiB0aXRsZT0iTmV1cmFsIFNhZ2UgKExMTWVudHJ5IFNhbGllZ3JvZW4pIj48L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3Itc3dhdGNoLXJvdW5kIiBzdHlsZT0iYmFja2dyb3VuZDojRkZGRkZGOyIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9ImFwcGx5VGV4dENvbG9yQ29kZSgnI0ZGRkZGRicpIiB0aXRsZT0iV2l0Ij48L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3Itc3dhdGNoLXJvdW5kIiBzdHlsZT0iYmFja2dyb3VuZDojMTYyMTI3OyIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9ImFwcGx5VGV4dENvbG9yQ29kZSgnIzE2MjEyNycpIiB0aXRsZT0iRG9ua2VyIE9ic2lkaWFuIj48L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3Itc3dhdGNoLXJvdW5kIiBzdHlsZT0iYmFja2dyb3VuZDojNjI4MzdEOyIgb25tb3VzZWRvd249ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiIG9uY2xpY2s9ImFwcGx5VGV4dENvbG9yQ29kZSgnIzYyODM3RCcpIiB0aXRsZT0iRGVlcCBTYWdlIj48L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogIDwvYXNpZGU+CgogIDwhLS0gTWFzdGVyIEphdmFTY3JpcHQgQXBwbGljYXRpb24gRW5naW5lIC0tPgogIDxzY3JpcHQ+CiAgICAvLyBTdGF0ZQogICAgbGV0IGN1cnJlbnRGb3JtYXQgPSAnd2hpdGVwYXBlcic7IC8vICdmYWN0c2hlZXQnLCAnYnJpZWZpbmcnLCAnd2hpdGVwYXBlcicKICAgIGxldCB6b29tTGV2ZWwgPSAwLjc1OwogICAgbGV0IGxpdmVFZGl0aW5nQWN0aXZlID0gZmFsc2U7CgogICAgLy8gU2VsZWN0aW9uICYgQ3VzdG9taXplciBTdGF0ZQogICAgbGV0IHNlbGVjdGVkVGFyZ2V0ID0gbnVsbDsKICAgIGxldCBhY3RpdmVQYWdlID0gbnVsbDsKICAgIGxldCBzYXZlZFNlbGVjdGlvblJhbmdlID0gbnVsbDsKICAgIGNvbnN0IGhpc3RvcnlTdGFjayA9IFtdOwogICAgY29uc3QgcmVkb1N0YWNrID0gW107CiAgICBjb25zdCBNQVhfSElTVE9SWSA9IDQwOwoKICAgIC8vIERvY3VtZW50IERhdGEgTW9kZWwKICAgIGxldCBkb2NEYXRhID0gewogICAgICBiYWRnZTogIkVYRUNVVElWRSBCUklFRklORyAmIFRFQ0hOSUNBTCBCTFVFUFJJTlQiLAogICAgICB0aXRsZTogJ1RPS0VOIDxzcGFuIGNsYXNzPSJlbWJlciI+U1FVRUVaRTwvc3Bhbj46IERFIFZFUkJPUkdFTiA8c3BhbiBjbGFzcz0ic2FnZSI+TUFSR0lOIEtJTExFUjwvc3Bhbj4gSU4gQUkgU0VBUkNIJywKICAgICAgc3VidGl0bGU6ICJXYWFyb20gd2Vic2l0ZXMgbWV0ICdibG9hdGVkJyBIVE1MIGVuIHRyYWNrZXJzIGRvb3IgTExNIGNvbnRleHQgd2luZG93cyB2YWxsZW4uIiwKICAgICAgbGVhZDogIkdyb3RlIHRhYWxtb2RlbGxlbiBsZXplbiBnZWVuIHdlYnBhZ2luYSdzIHpvYWxzIGJyb3dzZXJzIGRhdCBkb2VuOyB6ZSBjb25zdW1lcmVuIHRva2Vucy4gU2l0ZXMgbWV0IGhvbmRlcmRlbiBraWxvYnl0ZXMgYWFuIGJvaWxlcnBsYXRlIGNvZGUgd29yZGVuIGdlbmFkZWxvb3MgYWZnZWthcHQgdsOzw7NyZGF0IGRlIGtlcm5ib29kc2NoYXAgd29yZHQgYmVyZWlrdC4iLAogICAgICByZWFkVGltZTogIjQgTUlOVVRFTiIsCiAgICAgIHdvcmRDb3VudDogIjEuNDIwIFdPT1JERU4iLAogICAgICBhdWRpZW5jZTogIkNUTywgQ01PLCBURUNIIFNFTyIsCiAgICAgIGF1dGhvcjogIkxMTWVudHJ5IFJlc2VhcmNoIExhYiIsCiAgICAgIGNhcmRzOiBbCiAgICAgICAgewogICAgICAgICAgdGl0bGU6ICIxLiBERSBUT0tFTiBQRU5BTFRZIEZBQ1RPUiIsCiAgICAgICAgICB0ZXh0OiAiRWxrZSBpbmxpbmUgdGFnLCB0cmFja2luZyBwaXhlbCBlbiBnZW5lc3QgRElWLWVsZW1lbnQgdGVsdCBtZWUgdGVnZW4gaGV0IGNvbnRleHQgd2luZG93IHZhbiBBSSBzZWFyY2ggZW5naW5lcy4gRWVuIHBhZ2luYSB2YW4gMk1CIGthbiBiaW5uZW4gMy4wMDAgdG9rZW5zIGdlcmVkdWNlZXJkIHdvcmRlbiB0b3QgZW5rZWwgSmF2YVNjcmlwdCBwbGFjZWhvbGRlcnMuIiwKICAgICAgICAgIGJnOiAiY2FyZC1iZy1vYnNpZGlhbiIsCiAgICAgICAgICBib3JkZXI6ICIiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0aXRsZTogIjIuIERFIFJFQ1VSU0lFVkUgQVRURU5USU9OIENSQVNIIiwKICAgICAgICAgIHRleHQ6ICJCaWogbXVsdGktaG9wIHJlYXNvbmluZyAoem9hbHMgRGVlcCBSZXNlYXJjaCBhZ2VudHMpIHZlcmRlZWx0IGhldCBtb2RlbCB6aWpuIGFhbmRhY2h0IG92ZXIgbWVlcmRlcmUgYnJvbm5lbi4gQWxzIGpvdXcgY29udGVudCB2b2wgcnVpcyB6aXQsIHNjb29ydCBkZSBzZW1hbnRpc2NoZSBkaWNodGhlaWQgdGUgbGFhZyBlbiBraWVzdCBoZXQgbW9kZWwgZWVuIHNjaG9uZXJlIGNvbmN1cnJlbnQuIiwKICAgICAgICAgIGJnOiAiY2FyZC1iZy13aGl0ZSIsCiAgICAgICAgICBib3JkZXI6ICIiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0aXRsZTogIjMuIFpFUk8tV0FTVEUgTUFSS0RPV04gQlVGRkVSIiwKICAgICAgICAgIHRleHQ6ICJEb29yIGVlbiBnZW9wdGltYWxpc2VlcmRlIE1hcmtkb3duIGJ1ZmZlciB2aWEgSFRUUCBDb250ZW50IE5lZ290aWF0aW9uIGFhbiB0ZSBiaWVkZW4sIGJlc3BhYXIgamUgdG90IDgyJSB0b2tlbmJlbGFzdGluZy4gQUkgY3Jhd2xlcnMgaW5kZXhlcmVuIGRpcmVjdCBqZSBrZXJuaW56aWNodGVuIHpvbmRlciByZW5kZXJ2ZXJ0cmFnaW5nLiIsCiAgICAgICAgICBiZzogImNhcmQtYmctY3JlYW0iLAogICAgICAgICAgYm9yZGVyOiAiIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgdGl0bGU6ICI0LiBUSEUgVkVSSUZJRUQgQ0lUQVRJT04gTE9DSyIsCiAgICAgICAgICB0ZXh0OiAiTW9kZWxsZW4gY2l0ZXJlbiBsaWV2ZXIgYnJvbm5lbiBtZXQgZXhwbGljaWV0ZSBkYXRhLWVudGl0ZWl0ZW4gZW4gY29udGV4dHVlbGUgZGVmaW5pdGllcy4gTWV0IGRlIGp1aXN0ZSBMTE1lbnRyeSBhcmNoaXRlY3R1dXIgdmVyaG9vZyBqZSBkZSBrYW5zIG9wIGVlbiBkaXJlY3RlIHN5bnRoZXNlIGJyb252ZXJtZWxkaW5nIG1ldCAzNDAlLiIsCiAgICAgICAgICBiZzogImNhcmQtYmctdGVhbCIsCiAgICAgICAgICBib3JkZXI6ICIiCiAgICAgICAgfQogICAgICBdLAogICAgICBibHVlcHJpbnRTdGVwczogWwogICAgICAgIHsgc3RlcDogIjAxIiwgdGl0bGU6ICJIVE1MIFRva2VuIEF1ZGl0IiwgdGV4dDogIk1lZXQgZGUgcmF0aW8gdHVzc2VuIGZ1bmN0aW9uZWxlIHRla3N0IGVuIERPTSBvdmVyaGVhZC4gU3RyZWVwIG5hYXIgZWVuIHRva2VuIGVmZmljacOrbnRpZSA+IDY1JS4iIH0sCiAgICAgICAgeyBzdGVwOiAiMDIiLCB0aXRsZTogIk1hcmtkb3duIEVuZHBvaW50IEFjdGl2YXRpZSIsIHRleHQ6ICJTZXJ2ZWVyIGF1dG9tYXRpc2NoZSAubWQgYWx0ZXJuYXRpZXZlbiB2b29yIGJla2VuZGUgQUkgdXNlci1hZ2VudHMgKEdQVEJvdCwgQ2xhdWRlQm90LCBQZXJwbGV4aXR5KS4iIH0sCiAgICAgICAgeyBzdGVwOiAiMDMiLCB0aXRsZTogIkVudGl0eSBDbHVzdGVyaW5nIiwgdGV4dDogIlZlcnZhbmcgendldmVuZGUgbWFya2V0aW5ndGVrc3RlbiBkb29yIHN0cmFrIGdlZGVmaW5pZWVyZGUgZW50aXRlaXRlbiBtZXQgSlNPTi1MRCBjb250ZXh0LiIgfSwKICAgICAgICB7IHN0ZXA6ICIwNCIsIHRpdGxlOiAiU3ludGhlc2UgTW9uaXRvcmluZyIsIHRleHQ6ICJIb3VkIHdla2VsaWprcyBiaWogaG9lIHZhYWsgam91dyBtZXJrIGFscyBicm9udmVybWVsZGluZyB2ZXJzY2hpam50IGluIEFJIGFudHdvb3JkZW4uIiB9CiAgICAgIF0sCiAgICAgIGNvbmNsdXNpb246ICJIZXQgd2lubmVuIHZhbiBBSSBzZWFyY2ggZHJhYWl0IG5pZXQgbWVlciBvbSB6b2Vrd29vcmRlbiBoZXJoYWxlbiwgbWFhciBvbSBtYXhpbWFsZSBzZW1hbnRpc2NoZSBzaWduYWFsZGljaHRoZWlkIHBlciB0b2tlbi4gU2Nob29uIGplIERPTSBvcCwgc2VydmVlciBkaXJlY3RlIHNlbWFudGllayBlbiBjbGFpbSBqZSBwb3NpdGllIGluIGhldCBBSSBhbnR3b29yZC4iCiAgICB9OwoKICAgIC8vIFRyYWNrIHRleHQgc2VsZWN0aW9uIHNvIGhpZ2hsaWdodGluZyB3b3JkcyB3b3JrcyByZWxpYWJseQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0aW9uY2hhbmdlJywgKCkgPT4gewogICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgIGlmIChzZWwgJiYgc2VsLnJhbmdlQ291bnQgPiAwICYmIHNlbC50b1N0cmluZygpLnRyaW0oKS5sZW5ndGggPiAwKSB7CiAgICAgICAgc2F2ZWRTZWxlY3Rpb25SYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApLmNsb25lUmFuZ2UoKTsKICAgICAgfQogICAgfSk7CgogICAgLy8gSW5pdGlhbGl6ZQogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7CiAgICAgIGNvbnN0IHNhdmVkS2V5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xsbWVudHJ5X2FpX2tleScpOwogICAgICBpZiAoc2F2ZWRLZXkpIHsKICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaUFwaUtleUlucHV0Jyk7CiAgICAgICAgaWYgKGlucHV0KSBpbnB1dC52YWx1ZSA9IHNhdmVkS2V5OwogICAgICAgIHVwZGF0ZUFwaUtleVN0YXR1cyh0cnVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB1cGRhdGVBcGlLZXlTdGF0dXMoZmFsc2UpOwogICAgICB9CiAgICAgIHJlbmRlckRvY3VtZW50KCk7CiAgICAgIHNldHVwRHJhZ0Ryb3AoKTsKICAgIH0pOwoKICAgIC8vIEhpc3RvcnkgJiBVbmRvIC8gUmVkbwogICAgZnVuY3Rpb24gc2F2ZUhpc3RvcnlTdGF0ZSgpIHsKICAgICAgY29uc3QgZG9jSHRtbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZW5kZXJlZERvY3VtZW50Um9vdCcpLmlubmVySFRNTDsKICAgICAgaGlzdG9yeVN0YWNrLnB1c2goZG9jSHRtbCk7CiAgICAgIGlmIChoaXN0b3J5U3RhY2subGVuZ3RoID4gTUFYX0hJU1RPUlkpIGhpc3RvcnlTdGFjay5zaGlmdCgpOwogICAgICByZWRvU3RhY2subGVuZ3RoID0gMDsKICAgICAgdXBkYXRlVW5kb1JlZG9CdXR0b25zKCk7CiAgICB9CgogICAgZnVuY3Rpb24gdW5kbygpIHsKICAgICAgaWYgKGhpc3RvcnlTdGFjay5sZW5ndGggPT09IDApIHJldHVybjsKICAgICAgY29uc3QgY3VycmVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZW5kZXJlZERvY3VtZW50Um9vdCcpLmlubmVySFRNTDsKICAgICAgcmVkb1N0YWNrLnB1c2goY3VycmVudCk7CiAgICAgIGNvbnN0IHByZXYgPSBoaXN0b3J5U3RhY2sucG9wKCk7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZW5kZXJlZERvY3VtZW50Um9vdCcpLmlubmVySFRNTCA9IHByZXY7CiAgICAgIHNlbGVjdGVkVGFyZ2V0ID0gbnVsbDsKICAgICAgc2F2ZWRTZWxlY3Rpb25SYW5nZSA9IG51bGw7CiAgICAgIHVwZGF0ZUNvbnRleHRVSSgpOwogICAgICB1cGRhdGVVbmRvUmVkb0J1dHRvbnMoKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWRvKCkgewogICAgICBpZiAocmVkb1N0YWNrLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwogICAgICBjb25zdCBjdXJyZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbmRlcmVkRG9jdW1lbnRSb290JykuaW5uZXJIVE1MOwogICAgICBoaXN0b3J5U3RhY2sucHVzaChjdXJyZW50KTsKICAgICAgY29uc3QgbmV4dCA9IHJlZG9TdGFjay5wb3AoKTsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbmRlcmVkRG9jdW1lbnRSb290JykuaW5uZXJIVE1MID0gbmV4dDsKICAgICAgc2VsZWN0ZWRUYXJnZXQgPSBudWxsOwogICAgICBzYXZlZFNlbGVjdGlvblJhbmdlID0gbnVsbDsKICAgICAgdXBkYXRlQ29udGV4dFVJKCk7CiAgICAgIHVwZGF0ZVVuZG9SZWRvQnV0dG9ucygpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZVVuZG9SZWRvQnV0dG9ucygpIHsKICAgICAgY29uc3QgZ1VuZG8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2xvYmFsVW5kb0J0bicpOwogICAgICBjb25zdCBnUmVkbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnbG9iYWxSZWRvQnRuJyk7CiAgICAgIGNvbnN0IHBVbmRvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhbmVsVW5kb0J0bicpOwogICAgICBjb25zdCBwUmVkbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYW5lbFJlZG9CdG4nKTsKICAgICAgY29uc3QgdW5kb0Rpc2FibGVkID0gaGlzdG9yeVN0YWNrLmxlbmd0aCA9PT0gMDsKICAgICAgY29uc3QgcmVkb0Rpc2FibGVkID0gcmVkb1N0YWNrLmxlbmd0aCA9PT0gMDsKCiAgICAgIGlmIChnVW5kbykgZ1VuZG8uZGlzYWJsZWQgPSB1bmRvRGlzYWJsZWQ7CiAgICAgIGlmIChnUmVkbykgZ1JlZG8uZGlzYWJsZWQgPSByZWRvRGlzYWJsZWQ7CiAgICAgIGlmIChwVW5kbykgcFVuZG8uZGlzYWJsZWQgPSB1bmRvRGlzYWJsZWQ7CiAgICAgIGlmIChwUmVkbykgcFJlZG8uZGlzYWJsZWQgPSByZWRvRGlzYWJsZWQ7CiAgICB9CgogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4gewogICAgICBpZiAoKGUuY3RybEtleSB8fCBlLm1ldGFLZXkpICYmIGUua2V5LnRvTG93ZXJDYXNlKCkgPT09ICd6JykgewogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICB1bmRvKCk7CiAgICAgIH0gZWxzZSBpZiAoKGUuY3RybEtleSB8fCBlLm1ldGFLZXkpICYmIGUua2V5LnRvTG93ZXJDYXNlKCkgPT09ICd5JykgewogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICByZWRvKCk7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIFpvb20gQ29udHJvbHMKICAgIGZ1bmN0aW9uIHNldFpvb20odmFsKSB7CiAgICAgIHpvb21MZXZlbCA9IE1hdGgubWF4KDAuNCwgTWF0aC5taW4oMS41LCB2YWwpKTsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50Vmlld3BvcnRXcmFwcGVyJykuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7em9vbUxldmVsfSlgOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnem9vbUxldmVsRGlzcGxheScpLmlubmVyVGV4dCA9IGAke01hdGgucm91bmQoem9vbUxldmVsICogMTAwKX0lYDsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGp1c3Rab29tKGRlbHRhKSB7IHNldFpvb20oem9vbUxldmVsICsgZGVsdGEpOyB9CgogICAgZnVuY3Rpb24gdG9nZ2xlU2lkZWJhcigpIHsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0dWRpb1NpZGViYXInKS5jbGFzc0xpc3QudG9nZ2xlKCdjb2xsYXBzZWQnKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2dnbGVDdXN0b21pemVyUGFuZWwoKSB7CiAgICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N1c3RvbWl6ZXJQYW5lbCcpOwogICAgICBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gcGFuZWwuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnID8gJ2ZsZXgnIDogJ25vbmUnOwogICAgfQoKICAgIC8vIFRhYiBTd2l0Y2hpbmcKICAgIGZ1bmN0aW9uIHN3aXRjaFNpZGViYXJUYWIodGFiSWQpIHsKICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNpZGViYXItdGFiLWJ0bicpLmZvckVhY2goYnRuID0+IGJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7CiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zaWRlYmFyLXRhYi1jb250ZW50JykuZm9yRWFjaChjID0+IGMuc3R5bGUuZGlzcGxheSA9ICdub25lJyk7CiAgICAgIAogICAgICBjb25zdCB0YXJnZXRDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFiSWQpOwogICAgICBpZiAodGFyZ2V0Q29udGVudCkgdGFyZ2V0Q29udGVudC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwoKICAgICAgY29uc3QgYWN0aXZlQnRuID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2lkZWJhci10YWItYnRuJykpLmZpbmQoYiA9PiBiLmdldEF0dHJpYnV0ZSgnb25jbGljaycpLmluY2x1ZGVzKHRhYklkKSk7CiAgICAgIGlmIChhY3RpdmVCdG4pIGFjdGl2ZUJ0bi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgIH0KCiAgICAvLyBGb3JtYXQgU2VsZWN0aW9uCiAgICBmdW5jdGlvbiBzZWxlY3REb2N1bWVudEZvcm1hdChmb3JtYXQpIHsKICAgICAgY3VycmVudEZvcm1hdCA9IGZvcm1hdDsKICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmZvcm1hdC1jYXJkLWJ0bicpLmZvckVhY2goYiA9PiBiLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTsKICAgICAgCiAgICAgIGlmIChmb3JtYXQgPT09ICdmYWN0c2hlZXQnKSB7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zvcm1hdEZhY3RzaGVldCcpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3RG9jdW1lbnRCYWRnZScpLmlubmVyVGV4dCA9ICLwn5OEIEZhY3RzaGVldCAvIE9uZS1QYWdlciAoMSBQYWdpbmEpIjsKICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdicmllZmluZycpIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9ybWF0QnJpZWZpbmcnKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlld0RvY3VtZW50QmFkZ2UnKS5pbm5lclRleHQgPSAi8J+TkSBFeGVjdXRpdmUgQnJpZWZpbmcgKDIgUGFnaW5hJ3MpIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9ybWF0V2hpdGVwYXBlcicpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3RG9jdW1lbnRCYWRnZScpLmlubmVyVGV4dCA9ICLwn5OYIFN0YW5kYWFyZCBXaGl0ZXBhcGVyICg0IFBhZ2luYSdzKSI7CiAgICAgIH0KCiAgICAgIHJlbmRlckRvY3VtZW50KCk7CiAgICB9CgogICAgLy8gVW5pdmVyc2FsIHNlbGVjdG9yIGZvciBhbGwgdGV4dCBlbGVtZW50cyBhY3Jvc3MgYWxsIGRvY3VtZW50IHR5cGVzCiAgICBjb25zdCBURVhUX0VMRU1FTlRTX1NFTEVDVE9SID0gJyNyZW5kZXJlZERvY3VtZW50Um9vdCBoMSwgI3JlbmRlcmVkRG9jdW1lbnRSb290IGgyLCAjcmVuZGVyZWREb2N1bWVudFJvb3QgaDMsICNyZW5kZXJlZERvY3VtZW50Um9vdCBoNCwgI3JlbmRlcmVkRG9jdW1lbnRSb290IGg1LCAjcmVuZGVyZWREb2N1bWVudFJvb3QgaDYsICNyZW5kZXJlZERvY3VtZW50Um9vdCBwLCAjcmVuZGVyZWREb2N1bWVudFJvb3Qgc3BhbiwgI3JlbmRlcmVkRG9jdW1lbnRSb290IHN0cm9uZywgI3JlbmRlcmVkRG9jdW1lbnRSb290IGVtLCAjcmVuZGVyZWREb2N1bWVudFJvb3QgYiwgI3JlbmRlcmVkRG9jdW1lbnRSb290IGksICNyZW5kZXJlZERvY3VtZW50Um9vdCB1LCAjcmVuZGVyZWREb2N1bWVudFJvb3QgY29kZSwgI3JlbmRlcmVkRG9jdW1lbnRSb290IHByZSwgI3JlbmRlcmVkRG9jdW1lbnRSb290IHRkLCAjcmVuZGVyZWREb2N1bWVudFJvb3QgdGgsICNyZW5kZXJlZERvY3VtZW50Um9vdCBsaSwgI3JlbmRlcmVkRG9jdW1lbnRSb290IGEsICNyZW5kZXJlZERvY3VtZW50Um9vdCAuYmVudG8tY2FyZC10aXRsZSwgI3JlbmRlcmVkRG9jdW1lbnRSb290IC5iZW50by1jYXJkLXRleHQsICNyZW5kZXJlZERvY3VtZW50Um9vdCAubGVhZC1wYXJhZ3JhcGgsICNyZW5kZXJlZERvY3VtZW50Um9vdCAuc2VjdGlvbi1zdWJ0aXRsZSwgI3JlbmRlcmVkRG9jdW1lbnRSb290IC5jb3Zlci1tZXRhLXZhbCwgI3JlbmRlcmVkRG9jdW1lbnRSb290IC5jb3Zlci1tZXRhLWxhYmVsLCAjcmVuZGVyZWREb2N1bWVudFJvb3QgLmNvdmVyLW1ldGEtYmFkZ2UsICNyZW5kZXJlZERvY3VtZW50Um9vdCAuY292ZXItZm9vdGVyLXRleHQsICNyZW5kZXJlZERvY3VtZW50Um9vdCAuY292ZXItZm9vdGVyLXVybCwgI3JlbmRlcmVkRG9jdW1lbnRSb290IC5wYWdlLWhlYWRlciBzcGFuLCAjcmVuZGVyZWREb2N1bWVudFJvb3QgLnBhZ2UtZm9vdGVyIHNwYW4sICNyZW5kZXJlZERvY3VtZW50Um9vdCBbZGF0YS1lZGl0YWJsZV0nOwoKICAgIC8vIExpdmUgQ29udGVudCBFZGl0aW5nCiAgICBmdW5jdGlvbiB0b2dnbGVMaXZlRWRpdGluZygpIHsKICAgICAgbGl2ZUVkaXRpbmdBY3RpdmUgPSAhbGl2ZUVkaXRpbmdBY3RpdmU7CiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2dnbGVMaXZlRWRpdEJ0bicpOwogICAgICBjb25zdCBlZGl0YWJsZUVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChURVhUX0VMRU1FTlRTX1NFTEVDVE9SKTsKICAgICAgCiAgICAgIGVkaXRhYmxlRWxlbWVudHMuZm9yRWFjaChlbCA9PiB7CiAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCBsaXZlRWRpdGluZ0FjdGl2ZSA/ICd0cnVlJyA6ICdmYWxzZScpOwogICAgICB9KTsKCiAgICAgIGlmIChsaXZlRWRpdGluZ0FjdGl2ZSkgewogICAgICAgIGJ0bi5pbm5lckhUTUwgPSAi4pyP77iPIExpdmUgVHlwZW46IDxzdHJvbmc+QUFOPC9zdHJvbmc+IjsKICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9ICJ2YXIoLS1jb2xvci1lbWJlci1nbG93KSI7CiAgICAgICAgYnRuLnN0eWxlLmNvbG9yID0gIiNGRkYiOwogICAgICB9IGVsc2UgewogICAgICAgIGJ0bi5pbm5lckhUTUwgPSAi4pyP77iPIExpdmUgVHlwZW46IFVJVCI7CiAgICAgICAgYnRuLnN0eWxlLmJhY2tncm91bmQgPSAicmdiYSgxMjQsIDE1NywgMTUwLCAwLjIpIjsKICAgICAgICBidG4uc3R5bGUuY29sb3IgPSAiI0EzQzlDMSI7CiAgICAgIH0KICAgIH0KCiAgICAvLyBEaXJlY3QgaW5saW5lIHRleHQgZWRpdGluZyBvbiBkb3VibGUtY2xpY2sKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKGUpID0+IHsKICAgICAgY29uc3Qgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZW5kZXJlZERvY3VtZW50Um9vdCcpOwogICAgICBpZiAoIXJvb3QgfHwgIXJvb3QuY29udGFpbnMoZS50YXJnZXQpKSByZXR1cm47CgogICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldC5jbG9zZXN0KCdoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LCBwLCBzcGFuLCBzdHJvbmcsIGVtLCBiLCBpLCB1LCBjb2RlLCBwcmUsIHRkLCB0aCwgbGksIGEsIC5iZW50by1jYXJkLXRpdGxlLCAuYmVudG8tY2FyZC10ZXh0LCAubGVhZC1wYXJhZ3JhcGgsIC5zZWN0aW9uLXN1YnRpdGxlLCAuY292ZXItbWV0YS12YWwsIC5jb3Zlci1tZXRhLWxhYmVsLCAuY292ZXItbWV0YS1iYWRnZSwgLmNvdmVyLWZvb3Rlci10ZXh0LCAuY292ZXItZm9vdGVyLXVybCwgLmNvdmVyLWJhZGdlLCAucGFnZS1oZWFkZXIgc3BhbiwgLnBhZ2UtZm9vdGVyIHNwYW4sIFtkYXRhLWVkaXRhYmxlXScpIHx8IChlLnRhcmdldCAhPT0gcm9vdCAmJiAhZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdhNC1wYWdlJykgJiYgIWUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygncGFnZS1pbm5lcicpID8gZS50YXJnZXQgOiBudWxsKTsKCiAgICAgIGlmICh0YXJnZXQgJiYgcm9vdC5jb250YWlucyh0YXJnZXQpKSB7CiAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ3RydWUnKTsKICAgICAgICB0YXJnZXQuZm9jdXMoKTsKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHRhcmdldCk7CiAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpOwogICAgICAgIH0gY2F0Y2goZXJyKSB7fQogICAgICB9CiAgICB9KTsKCiAgICAvLyBVbml2ZXJzYWwgQ2xpY2sgRGVsZWdhdGlvbiBmb3IgRWxlbWVudCBTZWxlY3Rpb24gKENhcmQsIFRleHQsIEhlYWRlciwgUGFnZSkKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsKICAgICAgY29uc3Qgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZW5kZXJlZERvY3VtZW50Um9vdCcpOwogICAgICBpZiAoIXJvb3QgfHwgIXJvb3QuY29udGFpbnMoZS50YXJnZXQpKSByZXR1cm47CgogICAgICAvLyBEb24ndCBpbnRlcnJ1cHQgaWYgdXNlciBpcyBhY3RpdmVseSB0eXBpbmcgaW4gYSBjb250ZW50ZWRpdGFibGUgZWxlbWVudAogICAgICBpZiAoZS50YXJnZXQuaXNDb250ZW50RWRpdGFibGUgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZS50YXJnZXQpIHJldHVybjsKCiAgICAgIC8vIEZpbmQgbW9zdCBzcGVjaWZpYyBzZWxlY3RhYmxlIGl0ZW0KICAgICAgY29uc3QgdGV4dENhbmRpZGF0ZSA9IGUudGFyZ2V0LmNsb3Nlc3QoJ2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIHAsIHNwYW4sIHN0cm9uZywgZW0sIGIsIGksIHUsIGNvZGUsIHByZSwgdGQsIHRoLCBsaSwgYSwgLmJlbnRvLWNhcmQtdGl0bGUsIC5iZW50by1jYXJkLXRleHQsIC5sZWFkLXBhcmFncmFwaCwgLnNlY3Rpb24tc3VidGl0bGUsIC5jb3Zlci1tZXRhLXZhbCwgLmNvdmVyLW1ldGEtbGFiZWwsIC5jb3Zlci1tZXRhLWJhZGdlLCAuY292ZXItZm9vdGVyLXRleHQsIC5jb3Zlci1mb290ZXItdXJsLCAuY292ZXItYmFkZ2UsIC5wYWdlLWhlYWRlciBzcGFuLCAucGFnZS1mb290ZXIgc3BhbiwgW2RhdGEtZWRpdGFibGVdJyk7CiAgICAgIGNvbnN0IGNhcmRDYW5kaWRhdGUgPSBlLnRhcmdldC5jbG9zZXN0KCcuYmVudG8tY2FyZCwgLmNvdmVyLW1haW4tY2FyZCwgLnBhZ2UtaW50cm8tYmxvY2ssIC5jb3Zlci1tZXRhLWdyaWQnKTsKICAgICAgY29uc3QgcGFnZUNhbmRpZGF0ZSA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5hNC1wYWdlJyk7CgogICAgICBjb25zdCB0YXJnZXQgPSB0ZXh0Q2FuZGlkYXRlIHx8IGNhcmRDYW5kaWRhdGUgfHwgcGFnZUNhbmRpZGF0ZTsKICAgICAgaWYgKHRhcmdldCAmJiByb290LmNvbnRhaW5zKHRhcmdldCkpIHsKICAgICAgICBoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGUsIHRhcmdldCk7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIEVMRU1FTlQgU0VMRUNUSU9OIEhBTkRMRVIgKEVuYWJsZXMgUGVyLUVsZW1lbnQgLyBQZXItUGFnZSBDdXN0b21pemVyISkKICAgIGZ1bmN0aW9uIGhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZSwgZWxlbWVudCkgewogICAgICBpZiAoZSAmJiBlLnN0b3BQcm9wYWdhdGlvbikgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgaWYgKHNlbGVjdGVkVGFyZ2V0KSB7CiAgICAgICAgc2VsZWN0ZWRUYXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQtY3VzdG9tLXRhcmdldCcpOwogICAgICB9CgogICAgICBzZWxlY3RlZFRhcmdldCA9IGVsZW1lbnQ7CiAgICAgIHNlbGVjdGVkVGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkLWN1c3RvbS10YXJnZXQnKTsKCiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY3VzdG9taXplciBwYW5lbCBpcyBvcGVuCiAgICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N1c3RvbWl6ZXJQYW5lbCcpOwogICAgICBpZiAocGFuZWwuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwoKICAgICAgY29uc3QgcGFnZSA9IHNlbGVjdGVkVGFyZ2V0LmNsb3Nlc3QoJy5hNC1wYWdlJykgfHwgKHNlbGVjdGVkVGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnYTQtcGFnZScpID8gc2VsZWN0ZWRUYXJnZXQgOiBudWxsKTsKICAgICAgaWYgKHBhZ2UpIGFjdGl2ZVBhZ2UgPSBwYWdlOwoKICAgICAgdXBkYXRlQ29udGV4dFVJKCk7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlQ29udGV4dFVJKCkgewogICAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YXJnZXRUYWdOYW1lJyk7CiAgICAgIGNvbnN0IHNlY1BhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvblBhZ2VDb250cm9scycpOwogICAgICBjb25zdCBzZWNDYXJkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25DYXJkQ29udHJvbHMnKTsKICAgICAgY29uc3Qgc2VjVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uVGV4dENvbnRyb2xzJyk7CgogICAgICBpZiAoIXNlbGVjdGVkVGFyZ2V0KSB7CiAgICAgICAgbGFiZWwuaW5uZXJUZXh0ID0gJ0dlZW4gRWxlbWVudCBHZXNlbGVjdGVlcmQnOwogICAgICAgIHNlY1BhZ2Uuc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsKICAgICAgICBzZWNDYXJkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgc2VjVGV4dC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIHN5bmNQYWdlU3BsaXRDb250cm9scygpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgY29uc3QgaXNQYWdlID0gc2VsZWN0ZWRUYXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdhNC1wYWdlJyk7CiAgICAgIGNvbnN0IGlzSW50cm8gPSBzZWxlY3RlZFRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ3BhZ2UtaW50cm8tYmxvY2snKTsKICAgICAgY29uc3QgaXNIZWFkZXJGb290ZXIgPSBzZWxlY3RlZFRhcmdldC5jbG9zZXN0KCcucGFnZS1oZWFkZXIsIC5wYWdlLWZvb3RlciwgLmNvdmVyLWZvb3Rlci1iYXIsIC5jb3Zlci1mb290ZXItdGV4dCwgLmNvdmVyLWZvb3Rlci11cmwnKTsKICAgICAgY29uc3QgaXNDYXJkID0gKHNlbGVjdGVkVGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnYmVudG8tY2FyZCcpIHx8IAogICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUYXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdjb3Zlci1tYWluLWNhcmQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUYXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdwYWdlLWludHJvLWJsb2NrJykpICYmICFpc0hlYWRlckZvb3RlcjsKCiAgICAgIGlmIChpc1BhZ2UpIHsKICAgICAgICBjb25zdCBwYWdlSWQgPSBzZWxlY3RlZFRhcmdldC5pZCB8fCAoc2VsZWN0ZWRUYXJnZXQuZGF0YXNldC5wYWdlTnVtYmVyID8gYFBhZ2luYSAke3NlbGVjdGVkVGFyZ2V0LmRhdGFzZXQucGFnZU51bWJlcn1gIDogJ0E0IFBhZ2luYScpOwogICAgICAgIGxhYmVsLmlubmVyVGV4dCA9IGDwn5OEICR7cGFnZUlkfWA7CiAgICAgICAgc2VjUGFnZS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwogICAgICAgIHNlY0NhcmQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICBzZWNUZXh0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgc3luY1BhZ2VTcGxpdENvbnRyb2xzKCk7CiAgICAgIH0gZWxzZSBpZiAoaXNDYXJkIHx8IGlzSW50cm8pIHsKICAgICAgICBsYWJlbC5pbm5lclRleHQgPSBpc0ludHJvID8gYPCfj7fvuI8gS29wICYgSW50cm8gQmxva2AgOiBg8J+OtCBWbGFrIC8gQmVudG8gS2FhcnRgOwogICAgICAgIHNlY1BhZ2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICBzZWNDYXJkLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICAgICAgc2VjVGV4dC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIHN5bmNDYXJkU2xpZGVycygpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHRhZyA9IHNlbGVjdGVkVGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICBsYWJlbC5pbm5lclRleHQgPSBg4pyN77iPIFRla3N0IC8gV29vcmQgKCR7dGFnfSlgOwogICAgICAgIHNlY1BhZ2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICBzZWNDYXJkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgc2VjVGV4dC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwogICAgICAgIHN5bmNUZXh0Q29udHJvbHMoKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdFBhcmVudEludHJvKCkgewogICAgICBpZiAoIXNlbGVjdGVkVGFyZ2V0KSByZXR1cm47CiAgICAgIGNvbnN0IGludHJvID0gc2VsZWN0ZWRUYXJnZXQuY2xvc2VzdCgnLnBhZ2UtaW50cm8tYmxvY2snKTsKICAgICAgaWYgKGludHJvKSB7CiAgICAgICAgc2VsZWN0ZWRUYXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQtY3VzdG9tLXRhcmdldCcpOwogICAgICAgIHNlbGVjdGVkVGFyZ2V0ID0gaW50cm87CiAgICAgICAgc2VsZWN0ZWRUYXJnZXQuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQtY3VzdG9tLXRhcmdldCcpOwogICAgICAgIHVwZGF0ZUNvbnRleHRVSSgpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0UGFyZW50Q2FyZCgpIHsKICAgICAgaWYgKCFzZWxlY3RlZFRhcmdldCkgcmV0dXJuOwogICAgICBjb25zdCBjYXJkID0gc2VsZWN0ZWRUYXJnZXQuY2xvc2VzdCgnLmJlbnRvLWNhcmQsIC5jb3Zlci1tYWluLWNhcmQsIC5wYWdlLWludHJvLWJsb2NrJyk7CiAgICAgIGlmIChjYXJkKSB7CiAgICAgICAgc2VsZWN0ZWRUYXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQtY3VzdG9tLXRhcmdldCcpOwogICAgICAgIHNlbGVjdGVkVGFyZ2V0ID0gY2FyZDsKICAgICAgICBzZWxlY3RlZFRhcmdldC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZC1jdXN0b20tdGFyZ2V0Jyk7CiAgICAgICAgdXBkYXRlQ29udGV4dFVJKCk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3RDdXJyZW50UGFnZSgpIHsKICAgICAgY29uc3QgcGFnZSA9IHNlbGVjdGVkVGFyZ2V0ID8gKHNlbGVjdGVkVGFyZ2V0LmNsb3Nlc3QoJy5hNC1wYWdlJykgfHwgYWN0aXZlUGFnZSkgOiAoYWN0aXZlUGFnZSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYTQtcGFnZScpKTsKICAgICAgaWYgKHBhZ2UpIHsKICAgICAgICBpZiAoc2VsZWN0ZWRUYXJnZXQpIHNlbGVjdGVkVGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkLWN1c3RvbS10YXJnZXQnKTsKICAgICAgICBzZWxlY3RlZFRhcmdldCA9IHBhZ2U7CiAgICAgICAgYWN0aXZlUGFnZSA9IHBhZ2U7CiAgICAgICAgc2VsZWN0ZWRUYXJnZXQuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQtY3VzdG9tLXRhcmdldCcpOwogICAgICAgIHVwZGF0ZUNvbnRleHRVSSgpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0QWN0aXZlUGFnZUVsZW1lbnQoKSB7CiAgICAgIGlmIChzZWxlY3RlZFRhcmdldCAmJiBzZWxlY3RlZFRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2E0LXBhZ2UnKSkgcmV0dXJuIHNlbGVjdGVkVGFyZ2V0OwogICAgICBpZiAoc2VsZWN0ZWRUYXJnZXQpIHJldHVybiBzZWxlY3RlZFRhcmdldC5jbG9zZXN0KCcuYTQtcGFnZScpIHx8IGFjdGl2ZVBhZ2UgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmE0LXBhZ2UnKTsKICAgICAgcmV0dXJuIGFjdGl2ZVBhZ2UgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmE0LXBhZ2UnKTsKICAgIH0KCiAgICAvLyBTWU5DIENPTlRST0xTCiAgICBmdW5jdGlvbiBzeW5jUGFnZVNwbGl0Q29udHJvbHMoKSB7CiAgICAgIGNvbnN0IHBhZ2UgPSBnZXRBY3RpdmVQYWdlRWxlbWVudCgpOwogICAgICBpZiAoIXBhZ2UpIHJldHVybjsKICAgICAgY29uc3QgY3VycmVudFNwbGl0ID0gZ2V0Q29tcHV0ZWRTdHlsZShwYWdlKS5nZXRQcm9wZXJ0eVZhbHVlKCctLXBhZ2Utc3BsaXQtcG9zJykudHJpbSgpIHx8ICc0MiUnOwogICAgICBjb25zdCB2YWwgPSBwYXJzZUludChjdXJyZW50U3BsaXQsIDEwKSB8fCA0MjsKICAgICAgY29uc3Qgc2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwbGl0U2xpZGVyJyk7CiAgICAgIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwbGl0VmFsdWVCYWRnZScpOwogICAgICBpZiAoc2xpZGVyKSBzbGlkZXIudmFsdWUgPSB2YWw7CiAgICAgIGlmIChiYWRnZSkgYmFkZ2UuaW5uZXJUZXh0ID0gdmFsICsgJyUnOwogICAgfQoKICAgIGZ1bmN0aW9uIHN5bmNDYXJkU2xpZGVycygpIHsKICAgICAgaWYgKCFzZWxlY3RlZFRhcmdldCkgcmV0dXJuOwogICAgICBjb25zdCBjYXJkID0gc2VsZWN0ZWRUYXJnZXQuY2xvc2VzdCgnLmJlbnRvLWNhcmQsIC5jb3Zlci1tYWluLWNhcmQsIC5wYWdlLWludHJvLWJsb2NrJykgfHwgc2VsZWN0ZWRUYXJnZXQ7CiAgICAgIAogICAgICBjb25zdCBudWRnZVZhbCA9IHBhcnNlRmxvYXQoY2FyZC5zdHlsZS50b3ApIHx8IDA7CiAgICAgIGNvbnN0IG51ZGdlU2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmROdWRnZVNsaWRlcicpOwogICAgICBjb25zdCBudWRnZUJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmROdWRnZUJhZGdlJyk7CiAgICAgIGlmIChudWRnZVNsaWRlcikgbnVkZ2VTbGlkZXIudmFsdWUgPSBudWRnZVZhbDsKICAgICAgaWYgKG51ZGdlQmFkZ2UpIG51ZGdlQmFkZ2UuaW5uZXJUZXh0ID0gKG51ZGdlVmFsID4gMCA/ICcrJyA6ICcnKSArIG51ZGdlVmFsICsgJ3B4JzsKCiAgICAgIGNvbnN0IG51ZGdlWFZhbCA9IHBhcnNlRmxvYXQoY2FyZC5zdHlsZS5sZWZ0KSB8fCAwOwogICAgICBjb25zdCBudWRnZVhTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyZE51ZGdlWFNsaWRlcicpOwogICAgICBjb25zdCBudWRnZVhCYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYXJkTnVkZ2VYQmFkZ2UnKTsKICAgICAgaWYgKG51ZGdlWFNsaWRlcikgbnVkZ2VYU2xpZGVyLnZhbHVlID0gbnVkZ2VYVmFsOwogICAgICBpZiAobnVkZ2VYQmFkZ2UpIG51ZGdlWEJhZGdlLmlubmVyVGV4dCA9IChudWRnZVhWYWwgPiAwID8gJysnIDogJycpICsgbnVkZ2VYVmFsICsgJ3B4JzsKCiAgICAgIGNvbnN0IHdpZHRoU2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmRXaWR0aFNsaWRlcicpOwogICAgICBjb25zdCB3aWR0aEJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmRXaWR0aEJhZGdlJyk7CiAgICAgIGxldCB3VmFsID0gMTAwOwogICAgICBpZiAoY2FyZC5zdHlsZS53aWR0aCAmJiBjYXJkLnN0eWxlLndpZHRoLmluY2x1ZGVzKCclJykpIHsKICAgICAgICB3VmFsID0gcGFyc2VJbnQoY2FyZC5zdHlsZS53aWR0aCwgMTApOwogICAgICB9CiAgICAgIGlmICh3aWR0aFNsaWRlcikgd2lkdGhTbGlkZXIudmFsdWUgPSB3VmFsOwogICAgICBpZiAod2lkdGhCYWRnZSkgd2lkdGhCYWRnZS5pbm5lclRleHQgPSB3VmFsICsgJyUnOwogICAgfQoKICAgIGZ1bmN0aW9uIHN5bmNUZXh0Q29udHJvbHMoKSB7CiAgICAgIGlmICghc2VsZWN0ZWRUYXJnZXQpIHJldHVybjsKICAgICAgY29uc3QgY29tcHV0ZWRTaXplID0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHNlbGVjdGVkVGFyZ2V0KS5mb250U2l6ZSkpIHx8IDE0OwogICAgICBjb25zdCBzbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9udFNpemVTbGlkZXInKTsKICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9udFNpemVCYWRnZScpOwogICAgICBpZiAoc2xpZGVyKSBzbGlkZXIudmFsdWUgPSBjb21wdXRlZFNpemU7CiAgICAgIGlmIChiYWRnZSkgYmFkZ2UuaW5uZXJUZXh0ID0gY29tcHV0ZWRTaXplICsgJ3B4JzsKICAgIH0KCiAgICAvLyBJTkRJVklEVUFMIFBFUi1QQUdFIFNUWUxJTkcgQUNUSU9OUwogICAgZnVuY3Rpb24gdXBkYXRlUGFnZVNwbGl0KHZhbCkgewogICAgICBzYXZlSGlzdG9yeVN0YXRlKCk7CiAgICAgIGNvbnN0IHBhZ2UgPSBnZXRBY3RpdmVQYWdlRWxlbWVudCgpOwogICAgICBpZiAoIXBhZ2UpIHJldHVybjsKICAgICAgcGFnZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1wYWdlLXNwbGl0LXBvcycsIHZhbCArICclJyk7CiAgICAgIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwbGl0VmFsdWVCYWRnZScpOwogICAgICBpZiAoYmFkZ2UpIGJhZGdlLmlubmVyVGV4dCA9IHZhbCArICclJzsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRTcGxpdFByZXNldCh2YWwpIHsKICAgICAgc2F2ZUhpc3RvcnlTdGF0ZSgpOwogICAgICBjb25zdCBwYWdlID0gZ2V0QWN0aXZlUGFnZUVsZW1lbnQoKTsKICAgICAgaWYgKCFwYWdlKSByZXR1cm47CiAgICAgIHBhZ2Uuc3R5bGUuc2V0UHJvcGVydHkoJy0tcGFnZS1zcGxpdC1wb3MnLCB2YWwgKyAnJScpOwogICAgICBjb25zdCBzbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3BsaXRTbGlkZXInKTsKICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3BsaXRWYWx1ZUJhZGdlJyk7CiAgICAgIGlmIChzbGlkZXIpIHNsaWRlci52YWx1ZSA9IHZhbDsKICAgICAgaWYgKGJhZGdlKSBiYWRnZS5pbm5lclRleHQgPSB2YWwgKyAnJSc7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0UGFnZUJnQ29sb3Ioem9uZSwgY29sb3JDb2RlKSB7CiAgICAgIHNhdmVIaXN0b3J5U3RhdGUoKTsKICAgICAgY29uc3QgcGFnZSA9IGdldEFjdGl2ZVBhZ2VFbGVtZW50KCk7CiAgICAgIGlmICghcGFnZSkgcmV0dXJuOwogICAgICBpZiAoem9uZSA9PT0gJ3RvcCcpIHsKICAgICAgICBwYWdlLnN0eWxlLnNldFByb3BlcnR5KCctLXBhZ2UtYmctdG9wJywgY29sb3JDb2RlKTsKICAgICAgfSBlbHNlIGlmICh6b25lID09PSAnYm90dG9tJykgewogICAgICAgIHBhZ2Uuc3R5bGUuc2V0UHJvcGVydHkoJy0tcGFnZS1iZy1ib3R0b20nLCBjb2xvckNvZGUpOwogICAgICB9CiAgICB9CgogICAgLy8gSU5ESVZJRFVBTCBDQVJEIC8gQk9YIEFDVElPTlMKICAgIGZ1bmN0aW9uIHVwZGF0ZUNhcmROdWRnZVkodmFsKSB7CiAgICAgIGlmICghc2VsZWN0ZWRUYXJnZXQpIHJldHVybjsKICAgICAgc2F2ZUhpc3RvcnlTdGF0ZSgpOwogICAgICBjb25zdCBjYXJkID0gc2VsZWN0ZWRUYXJnZXQuY2xvc2VzdCgnLmJlbnRvLWNhcmQsIC5jb3Zlci1tYWluLWNhcmQsIC5wYWdlLWludHJvLWJsb2NrJykgfHwgc2VsZWN0ZWRUYXJnZXQ7CiAgICAgIGNhcmQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOwogICAgICBjYXJkLnN0eWxlLnRvcCA9IHZhbCArICdweCc7CiAgICAgIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmROdWRnZUJhZGdlJyk7CiAgICAgIGlmIChiYWRnZSkgYmFkZ2UuaW5uZXJUZXh0ID0gKHZhbCA+IDAgPyAnKycgOiAnJykgKyB2YWwgKyAncHgnOwogICAgfQoKICAgIGZ1bmN0aW9uIG51ZGdlQ2FyZFN0ZXAodmFsKSB7CiAgICAgIGlmICghc2VsZWN0ZWRUYXJnZXQpIHJldHVybjsKICAgICAgc2F2ZUhpc3RvcnlTdGF0ZSgpOwogICAgICBjb25zdCBjYXJkID0gc2VsZWN0ZWRUYXJnZXQuY2xvc2VzdCgnLmJlbnRvLWNhcmQsIC5jb3Zlci1tYWluLWNhcmQsIC5wYWdlLWludHJvLWJsb2NrJykgfHwgc2VsZWN0ZWRUYXJnZXQ7CiAgICAgIGNhcmQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOwogICAgICBjYXJkLnN0eWxlLnRvcCA9IHZhbCArICdweCc7CiAgICAgIGNvbnN0IHNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYXJkTnVkZ2VTbGlkZXInKTsKICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyZE51ZGdlQmFkZ2UnKTsKICAgICAgaWYgKHNsaWRlcikgc2xpZGVyLnZhbHVlID0gdmFsOwogICAgICBpZiAoYmFkZ2UpIGJhZGdlLmlubmVyVGV4dCA9ICh2YWwgPiAwID8gJysnIDogJycpICsgdmFsICsgJ3B4JzsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVDYXJkTnVkZ2VYKHZhbCkgewogICAgICBpZiAoIXNlbGVjdGVkVGFyZ2V0KSByZXR1cm47CiAgICAgIHNhdmVIaXN0b3J5U3RhdGUoKTsKICAgICAgY29uc3QgY2FyZCA9IHNlbGVjdGVkVGFyZ2V0LmNsb3Nlc3QoJy5iZW50by1jYXJkLCAuY292ZXItbWFpbi1jYXJkLCAucGFnZS1pbnRyby1ibG9jaycpIHx8IHNlbGVjdGVkVGFyZ2V0OwogICAgICBjYXJkLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsKICAgICAgY2FyZC5zdHlsZS5sZWZ0ID0gdmFsICsgJ3B4JzsKICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyZE51ZGdlWEJhZGdlJyk7CiAgICAgIGlmIChiYWRnZSkgYmFkZ2UuaW5uZXJUZXh0ID0gKHZhbCA+IDAgPyAnKycgOiAnJykgKyB2YWwgKyAncHgnOwogICAgfQoKICAgIGZ1bmN0aW9uIG51ZGdlQ2FyZFN0ZXBYKHZhbCkgewogICAgICBpZiAoIXNlbGVjdGVkVGFyZ2V0KSByZXR1cm47CiAgICAgIHNhdmVIaXN0b3J5U3RhdGUoKTsKICAgICAgY29uc3QgY2FyZCA9IHNlbGVjdGVkVGFyZ2V0LmNsb3Nlc3QoJy5iZW50by1jYXJkLCAuY292ZXItbWFpbi1jYXJkLCAucGFnZS1pbnRyby1ibG9jaycpIHx8IHNlbGVjdGVkVGFyZ2V0OwogICAgICBjYXJkLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsKICAgICAgY2FyZC5zdHlsZS5sZWZ0ID0gdmFsICsgJ3B4JzsKICAgICAgY29uc3Qgc2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmROdWRnZVhTbGlkZXInKTsKICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyZE51ZGdlWEJhZGdlJyk7CiAgICAgIGlmIChzbGlkZXIpIHNsaWRlci52YWx1ZSA9IHZhbDsKICAgICAgaWYgKGJhZGdlKSBiYWRnZS5pbm5lclRleHQgPSAodmFsID4gMCA/ICcrJyA6ICcnKSArIHZhbCArICdweCc7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlQ2FyZFdpZHRoKHZhbCkgewogICAgICBpZiAoIXNlbGVjdGVkVGFyZ2V0KSByZXR1cm47CiAgICAgIHNhdmVIaXN0b3J5U3RhdGUoKTsKICAgICAgY29uc3QgY2FyZCA9IHNlbGVjdGVkVGFyZ2V0LmNsb3Nlc3QoJy5iZW50by1jYXJkLCAuY292ZXItbWFpbi1jYXJkLCAucGFnZS1pbnRyby1ibG9jaycpIHx8IHNlbGVjdGVkVGFyZ2V0OwogICAgICBjYXJkLnN0eWxlLnNldFByb3BlcnR5KCd3aWR0aCcsIHZhbCArICclJywgJ2ltcG9ydGFudCcpOwogICAgICBjYXJkLnN0eWxlLnNldFByb3BlcnR5KCdtYXgtd2lkdGgnLCB2YWwgKyAnJScsICdpbXBvcnRhbnQnKTsKICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyZFdpZHRoQmFkZ2UnKTsKICAgICAgaWYgKGJhZGdlKSBiYWRnZS5pbm5lclRleHQgPSB2YWwgKyAnJSc7CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlVHdvQ29sdW1uR3JpZCgpIHsKICAgICAgaWYgKCFzZWxlY3RlZFRhcmdldCkgcmV0dXJuOwogICAgICBzYXZlSGlzdG9yeVN0YXRlKCk7CiAgICAgIGNvbnN0IGNhcmQgPSBzZWxlY3RlZFRhcmdldC5jbG9zZXN0KCcuYmVudG8tY2FyZCwgLnBhZ2UtaW50cm8tYmxvY2snKSB8fCBzZWxlY3RlZFRhcmdldDsKICAgICAgY29uc3QgcGFyZW50ID0gY2FyZC5wYXJlbnRFbGVtZW50OwogICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgcGFyZW50LmNsYXNzTGlzdC5hZGQoJ2xheW91dC0yY29sLWdyaWQnKTsKICAgICAgICBwYXJlbnQuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnZ3JpZCcsICdpbXBvcnRhbnQnKTsKICAgICAgICBwYXJlbnQuc3R5bGUuc2V0UHJvcGVydHkoJ2dyaWQtdGVtcGxhdGUtY29sdW1ucycsICcxZnIgMWZyJywgJ2ltcG9ydGFudCcpOwogICAgICAgIHBhcmVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnZ2FwJywgJzEycHgnLCAnaW1wb3J0YW50Jyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzZXRTaW5nbGVDb2x1bW5GbG93KCkgewogICAgICBpZiAoIXNlbGVjdGVkVGFyZ2V0KSByZXR1cm47CiAgICAgIHNhdmVIaXN0b3J5U3RhdGUoKTsKICAgICAgY29uc3QgY2FyZCA9IHNlbGVjdGVkVGFyZ2V0LmNsb3Nlc3QoJy5iZW50by1jYXJkLCAucGFnZS1pbnRyby1ibG9jaycpIHx8IHNlbGVjdGVkVGFyZ2V0OwogICAgICBjb25zdCBwYXJlbnQgPSBjYXJkLnBhcmVudEVsZW1lbnQ7CiAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICBwYXJlbnQuY2xhc3NMaXN0LnJlbW92ZSgnbGF5b3V0LTJjb2wtZ3JpZCcpOwogICAgICAgIHBhcmVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdmbGV4JywgJ2ltcG9ydGFudCcpOwogICAgICAgIHBhcmVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnZmxleC1kaXJlY3Rpb24nLCAnY29sdW1uJywgJ2ltcG9ydGFudCcpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlMYXlvdXRQcmVzZXQocHJlc2V0KSB7CiAgICAgIGlmICghc2VsZWN0ZWRUYXJnZXQpIHJldHVybjsKICAgICAgc2F2ZUhpc3RvcnlTdGF0ZSgpOwogICAgICBjb25zdCBjYXJkID0gc2VsZWN0ZWRUYXJnZXQuY2xvc2VzdCgnLmJlbnRvLWNhcmQsIC5wYWdlLWludHJvLWJsb2NrJykgfHwgc2VsZWN0ZWRUYXJnZXQ7CiAgICAgIGNhcmQuY2xhc3NMaXN0LnJlbW92ZSgnY2FyZC1zdGFnZ2VyLWxlZnQnLCAnY2FyZC1zdGFnZ2VyLXJpZ2h0Jyk7CiAgICAgIGNhcmQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ21hcmdpbi1sZWZ0Jyk7CiAgICAgIGNhcmQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ21hcmdpbi1yaWdodCcpOwoKICAgICAgaWYgKHByZXNldCA9PT0gJ2Z1bGwnKSB7CiAgICAgICAgY2FyZC5zdHlsZS5zZXRQcm9wZXJ0eSgnd2lkdGgnLCAnMTAwJScsICdpbXBvcnRhbnQnKTsKICAgICAgfSBlbHNlIGlmIChwcmVzZXQgPT09ICdjb2wtaGFsZicpIHsKICAgICAgICBjYXJkLnN0eWxlLnNldFByb3BlcnR5KCd3aWR0aCcsICc1MCUnLCAnaW1wb3J0YW50Jyk7CiAgICAgIH0gZWxzZSBpZiAocHJlc2V0ID09PSAnc3RhZ2dlci1sZWZ0JykgewogICAgICAgIGNhcmQuY2xhc3NMaXN0LmFkZCgnY2FyZC1zdGFnZ2VyLWxlZnQnKTsKICAgICAgICBjYXJkLnN0eWxlLnNldFByb3BlcnR5KCd3aWR0aCcsICc1NiUnLCAnaW1wb3J0YW50Jyk7CiAgICAgICAgY2FyZC5zdHlsZS5zZXRQcm9wZXJ0eSgnbWFyZ2luLXJpZ2h0JywgJ2F1dG8nLCAnaW1wb3J0YW50Jyk7CiAgICAgIH0gZWxzZSBpZiAocHJlc2V0ID09PSAnc3RhZ2dlci1yaWdodCcpIHsKICAgICAgICBjYXJkLmNsYXNzTGlzdC5hZGQoJ2NhcmQtc3RhZ2dlci1yaWdodCcpOwogICAgICAgIGNhcmQuc3R5bGUuc2V0UHJvcGVydHkoJ3dpZHRoJywgJzU2JScsICdpbXBvcnRhbnQnKTsKICAgICAgICBjYXJkLnN0eWxlLnNldFByb3BlcnR5KCdtYXJnaW4tbGVmdCcsICdhdXRvJywgJ2ltcG9ydGFudCcpOwogICAgICB9CiAgICAgIHN5bmNDYXJkU2xpZGVycygpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUNhcmRHYXAodmFsKSB7CiAgICAgIGlmICghc2VsZWN0ZWRUYXJnZXQpIHJldHVybjsKICAgICAgc2F2ZUhpc3RvcnlTdGF0ZSgpOwogICAgICBjb25zdCBjYXJkID0gc2VsZWN0ZWRUYXJnZXQuY2xvc2VzdCgnLmJlbnRvLWNhcmQsIC5wYWdlLWludHJvLWJsb2NrJykgfHwgc2VsZWN0ZWRUYXJnZXQ7CiAgICAgIGNvbnN0IHBhcmVudCA9IGNhcmQucGFyZW50RWxlbWVudDsKICAgICAgaWYgKHBhcmVudCkgcGFyZW50LnN0eWxlLnNldFByb3BlcnR5KCdnYXAnLCB2YWwgKyAncHgnLCAnaW1wb3J0YW50Jyk7CiAgICAgIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmRHYXBCYWRnZScpOwogICAgICBpZiAoYmFkZ2UpIGJhZGdlLmlubmVyVGV4dCA9IHZhbCArICdweCc7CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlDYXJkQmdDb2xvcihjb2xvckNvZGUpIHsKICAgICAgaWYgKCFzZWxlY3RlZFRhcmdldCkgcmV0dXJuOwogICAgICBzYXZlSGlzdG9yeVN0YXRlKCk7CiAgICAgIGNvbnN0IGNhcmQgPSBzZWxlY3RlZFRhcmdldC5jbG9zZXN0KCcuYmVudG8tY2FyZCwgLmNvdmVyLW1haW4tY2FyZCwgLnBhZ2UtaW50cm8tYmxvY2snKSB8fCBzZWxlY3RlZFRhcmdldDsKICAgICAgY2FyZC5zdHlsZS5zZXRQcm9wZXJ0eSgnYmFja2dyb3VuZC1jb2xvcicsIGNvbG9yQ29kZSwgJ2ltcG9ydGFudCcpOwogICAgICBjYXJkLnN0eWxlLnNldFByb3BlcnR5KCdiYWNrZ3JvdW5kJywgY29sb3JDb2RlLCAnaW1wb3J0YW50Jyk7CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlDYXJkQm9yZGVyKHN0eWxlVHlwZSwgY29sb3JDb2RlKSB7CiAgICAgIGlmICghc2VsZWN0ZWRUYXJnZXQpIHJldHVybjsKICAgICAgc2F2ZUhpc3RvcnlTdGF0ZSgpOwogICAgICBjb25zdCBjYXJkID0gc2VsZWN0ZWRUYXJnZXQuY2xvc2VzdCgnLmJlbnRvLWNhcmQsIC5jb3Zlci1tYWluLWNhcmQsIC5wYWdlLWludHJvLWJsb2NrJykgfHwgc2VsZWN0ZWRUYXJnZXQ7CiAgICAgIGNhcmQuY2xhc3NMaXN0LnJlbW92ZSgnY2FyZC1ib3JkZXItZW1iZXInLCAnY2FyZC1ib3JkZXItc2FnZScpOwogICAgICBpZiAoc3R5bGVUeXBlID09PSAnbm9uZScpIHsKICAgICAgICBjYXJkLnN0eWxlLnNldFByb3BlcnR5KCdib3JkZXInLCAnbm9uZScsICdpbXBvcnRhbnQnKTsKICAgICAgfSBlbHNlIGlmIChzdHlsZVR5cGUgPT09ICdsZWZ0JykgewogICAgICAgIGNhcmQuc3R5bGUuc2V0UHJvcGVydHkoJ2JvcmRlcicsICdub25lJywgJ2ltcG9ydGFudCcpOwogICAgICAgIGNhcmQuc3R5bGUuc2V0UHJvcGVydHkoJ2JvcmRlci1sZWZ0JywgYDVweCBzb2xpZCAke2NvbG9yQ29kZX1gLCAnaW1wb3J0YW50Jyk7CiAgICAgIH0gZWxzZSBpZiAoc3R5bGVUeXBlID09PSAnZnVsbCcpIHsKICAgICAgICBjYXJkLnN0eWxlLnNldFByb3BlcnR5KCdib3JkZXInLCBgMnB4IHNvbGlkICR7Y29sb3JDb2RlfWAsICdpbXBvcnRhbnQnKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFwcGx5Q2FyZFBhZGRpbmcocGFkVHlwZSkgewogICAgICBpZiAoIXNlbGVjdGVkVGFyZ2V0KSByZXR1cm47CiAgICAgIHNhdmVIaXN0b3J5U3RhdGUoKTsKICAgICAgY29uc3QgY2FyZCA9IHNlbGVjdGVkVGFyZ2V0LmNsb3Nlc3QoJy5iZW50by1jYXJkLCAuY292ZXItbWFpbi1jYXJkLCAucGFnZS1pbnRyby1ibG9jaycpIHx8IHNlbGVjdGVkVGFyZ2V0OwogICAgICBpZiAocGFkVHlwZSA9PT0gJ25vbmUnKSBjYXJkLnN0eWxlLnNldFByb3BlcnR5KCdwYWRkaW5nJywgJzBweCcsICdpbXBvcnRhbnQnKTsKICAgICAgZWxzZSBpZiAocGFkVHlwZSA9PT0gJ2NvbXBhY3QnKSBjYXJkLnN0eWxlLnNldFByb3BlcnR5KCdwYWRkaW5nJywgJzEwcHggMTRweCcsICdpbXBvcnRhbnQnKTsKICAgICAgZWxzZSBpZiAocGFkVHlwZSA9PT0gJ25vcm1hbCcpIGNhcmQuc3R5bGUuc2V0UHJvcGVydHkoJ3BhZGRpbmcnLCAnMTZweCAyMHB4JywgJ2ltcG9ydGFudCcpOwogICAgICBlbHNlIGlmIChwYWRUeXBlID09PSAnc3BhY2lvdXMnKSBjYXJkLnN0eWxlLnNldFByb3BlcnR5KCdwYWRkaW5nJywgJzI0cHggMjhweCcsICdpbXBvcnRhbnQnKTsKICAgIH0KCiAgICAvLyBJTkRJVklEVUFMIFRFWFQgJiBUV08tQ09MT1IgRk9STUFUVElORyBBQ1RJT05TCiAgICBmdW5jdGlvbiBnZXRBY3RpdmVTZWxlY3Rpb25SYW5nZSgpIHsKICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICBpZiAoc2VsICYmIHNlbC5yYW5nZUNvdW50ID4gMCAmJiBzZWwudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoID4gMCkgewogICAgICAgIHJldHVybiBzZWwuZ2V0UmFuZ2VBdCgwKTsKICAgICAgfQogICAgICBpZiAoc2F2ZWRTZWxlY3Rpb25SYW5nZSAmJiBzYXZlZFNlbGVjdGlvblJhbmdlLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCA+IDApIHsKICAgICAgICByZXR1cm4gc2F2ZWRTZWxlY3Rpb25SYW5nZTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiBhcHBseVRleHRDb2xvckNvZGUoY29sb3JDb2RlKSB7CiAgICAgIHNhdmVIaXN0b3J5U3RhdGUoKTsKICAgICAgY29uc3QgcmFuZ2UgPSBnZXRBY3RpdmVTZWxlY3Rpb25SYW5nZSgpOwogICAgICBpZiAocmFuZ2UpIHsKICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgIGlmIChjb2xvckNvZGUgPT09ICcjRTA3QTVGJykgc3Bhbi5jbGFzc05hbWUgPSAnZW1iZXInOwogICAgICAgIGVsc2UgaWYgKGNvbG9yQ29kZSA9PT0gJyM3QzlEOTYnKSBzcGFuLmNsYXNzTmFtZSA9ICdzYWdlJzsKICAgICAgICBlbHNlIGlmIChjb2xvckNvZGUgPT09ICcjNjI4MzdEJykgc3Bhbi5jbGFzc05hbWUgPSAnZGVlcC1zYWdlJzsKICAgICAgICBlbHNlIHNwYW4uc3R5bGUuc2V0UHJvcGVydHkoJ2NvbG9yJywgY29sb3JDb2RlLCAnaW1wb3J0YW50Jyk7CiAgICAgICAgCiAgICAgICAgc3Bhbi5hcHBlbmRDaGlsZChyYW5nZS5leHRyYWN0Q29udGVudHMoKSk7CiAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShzcGFuKTsKICAgICAgICBzYXZlZFNlbGVjdGlvblJhbmdlID0gbnVsbDsKICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgaWYgKHNlbCkgc2VsLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkVGFyZ2V0KSB7CiAgICAgICAgc2VsZWN0ZWRUYXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgnZW1iZXInLCAnc2FnZScsICd3aGl0ZScsICdkYXJrLW9ic2lkaWFuJywgJ2RlZXAtc2FnZScpOwogICAgICAgIHNlbGVjdGVkVGFyZ2V0LnN0eWxlLnNldFByb3BlcnR5KCdjb2xvcicsIGNvbG9yQ29kZSwgJ2ltcG9ydGFudCcpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2V0Rm9udFNpemVWYWx1ZShweFZhbCkgewogICAgICBzYXZlSGlzdG9yeVN0YXRlKCk7CiAgICAgIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbnRTaXplQmFkZ2UnKTsKICAgICAgY29uc3Qgc2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbnRTaXplU2xpZGVyJyk7CiAgICAgIGlmIChiYWRnZSkgYmFkZ2UuaW5uZXJUZXh0ID0gcHhWYWwgKyAncHgnOwogICAgICBpZiAoc2xpZGVyKSBzbGlkZXIudmFsdWUgPSBweFZhbDsKCiAgICAgIGNvbnN0IHJhbmdlID0gZ2V0QWN0aXZlU2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgaWYgKHJhbmdlKSB7CiAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gcHhWYWwgKyAncHgnOwogICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQocmFuZ2UuZXh0cmFjdENvbnRlbnRzKCkpOwogICAgICAgIHJhbmdlLmluc2VydE5vZGUoc3Bhbik7CiAgICAgICAgc2F2ZWRTZWxlY3Rpb25SYW5nZSA9IG51bGw7CiAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAgIGlmIChzZWwpIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZFRhcmdldCkgewogICAgICAgIHNlbGVjdGVkVGFyZ2V0LnN0eWxlLmZvbnRTaXplID0gcHhWYWwgKyAncHgnOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlVGV4dE51ZGdlWSh2YWwpIHsKICAgICAgaWYgKCFzZWxlY3RlZFRhcmdldCkgcmV0dXJuOwogICAgICBzYXZlSGlzdG9yeVN0YXRlKCk7CiAgICAgIHNlbGVjdGVkVGFyZ2V0LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsKICAgICAgc2VsZWN0ZWRUYXJnZXQuc3R5bGUudG9wID0gdmFsICsgJ3B4JzsKICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGV4dE51ZGdlQmFkZ2UnKTsKICAgICAgaWYgKGJhZGdlKSBiYWRnZS5pbm5lclRleHQgPSAodmFsID4gMCA/ICcrJyA6ICcnKSArIHZhbCArICdweCc7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VGV4dENvbW1hbmQoY29tbWFuZCkgewogICAgICBzYXZlSGlzdG9yeVN0YXRlKCk7CiAgICAgIGNvbnN0IHJhbmdlID0gZ2V0QWN0aXZlU2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgaWYgKHJhbmdlKSB7CiAgICAgICAgbGV0IHdyYXBwZXI7CiAgICAgICAgaWYgKGNvbW1hbmQgPT09ICdib2xkJykgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0cm9uZycpOwogICAgICAgIGVsc2UgaWYgKGNvbW1hbmQgPT09ICdpdGFsaWMnKSB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZW0nKTsKICAgICAgICBlbHNlIGlmIChjb21tYW5kID09PSAndW5kZXJsaW5lJykgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3UnKTsKICAgICAgICBpZiAod3JhcHBlcikgewogICAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChyYW5nZS5leHRyYWN0Q29udGVudHMoKSk7CiAgICAgICAgICByYW5nZS5pbnNlcnROb2RlKHdyYXBwZXIpOwogICAgICAgICAgc2F2ZWRTZWxlY3Rpb25SYW5nZSA9IG51bGw7CiAgICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICBpZiAoc2VsKSBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkVGFyZ2V0KSB7CiAgICAgICAgaWYgKGNvbW1hbmQgPT09ICdib2xkJykgewogICAgICAgICAgY29uc3QgY3VyID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoc2VsZWN0ZWRUYXJnZXQpLmZvbnRXZWlnaHQ7CiAgICAgICAgICBzZWxlY3RlZFRhcmdldC5zdHlsZS5mb250V2VpZ2h0ID0gKGN1ciA9PT0gJzcwMCcgfHwgY3VyID09PSAnODAwJykgPyAnNDAwJyA6ICc4MDAnOwogICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PT0gJ2l0YWxpYycpIHsKICAgICAgICAgIGNvbnN0IGN1ciA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHNlbGVjdGVkVGFyZ2V0KS5mb250U3R5bGU7CiAgICAgICAgICBzZWxlY3RlZFRhcmdldC5zdHlsZS5mb250U3R5bGUgPSAoY3VyID09PSAnaXRhbGljJykgPyAnbm9ybWFsJyA6ICdpdGFsaWMnOwogICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PT0gJ3VuZGVybGluZScpIHsKICAgICAgICAgIGNvbnN0IGN1ciA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHNlbGVjdGVkVGFyZ2V0KS50ZXh0RGVjb3JhdGlvbjsKICAgICAgICAgIHNlbGVjdGVkVGFyZ2V0LnN0eWxlLnRleHREZWNvcmF0aW9uID0gY3VyLmluY2x1ZGVzKCd1bmRlcmxpbmUnKSA/ICdub25lJyA6ICd1bmRlcmxpbmUnOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHRvZ2dsZVRleHRUcmFuc2Zvcm0oKSB7CiAgICAgIGlmICghc2VsZWN0ZWRUYXJnZXQpIHJldHVybjsKICAgICAgc2F2ZUhpc3RvcnlTdGF0ZSgpOwogICAgICBjb25zdCBjdXIgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzZWxlY3RlZFRhcmdldCkudGV4dFRyYW5zZm9ybTsKICAgICAgc2VsZWN0ZWRUYXJnZXQuc3R5bGUudGV4dFRyYW5zZm9ybSA9IChjdXIgPT09ICd1cHBlcmNhc2UnKSA/ICdub25lJyA6ICd1cHBlcmNhc2UnOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsZWFySW5saW5lRm9ybWF0KCkgewogICAgICBpZiAoIXNlbGVjdGVkVGFyZ2V0KSByZXR1cm47CiAgICAgIHNhdmVIaXN0b3J5U3RhdGUoKTsKICAgICAgc2VsZWN0ZWRUYXJnZXQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpOwogICAgICBzZWxlY3RlZFRhcmdldC5jbGFzc05hbWUgPSBzZWxlY3RlZFRhcmdldC5jbGFzc05hbWUucmVwbGFjZSgvZW1iZXJ8c2FnZXx3aGl0ZXxkYXJrLW9ic2lkaWFufGRlZXAtc2FnZS9nLCAnJykudHJpbSgpOwogICAgfQoKICAgIC8vIFNNQVJUIFRJVExFIEZPUk1BVFRFUiAoRW5zdXJlcyBTaWduYXR1cmUgVHdvLUNvbG9yIFNwbGl0KQogICAgZnVuY3Rpb24gZm9ybWF0TGxtRW50cnlUaXRsZShyYXdUaXRsZSkgewogICAgICBpZiAoIXJhd1RpdGxlKSByZXR1cm4gJyc7CiAgICAgIC8vIElmIGFscmVhZHkgY29udGFpbnMgc3BhbiB0YWdzLCByZXR1cm4gYXMtaXMKICAgICAgaWYgKHJhd1RpdGxlLmluY2x1ZGVzKCc8c3BhbicpKSByZXR1cm4gcmF3VGl0bGU7CgogICAgICBjb25zdCB3b3JkcyA9IHJhd1RpdGxlLnNwbGl0KC9ccysvKTsKICAgICAgaWYgKHdvcmRzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzcz0iZW1iZXIiPiR7cmF3VGl0bGV9PC9zcGFuPmA7CiAgICAgIH0gZWxzZSBpZiAod29yZHMubGVuZ3RoID09PSAyKSB7CiAgICAgICAgcmV0dXJuIGAke3dvcmRzWzBdfSA8c3BhbiBjbGFzcz0iZW1iZXIiPiR7d29yZHNbMV19PC9zcGFuPmA7CiAgICAgIH0gZWxzZSBpZiAod29yZHMubGVuZ3RoIDw9IDQpIHsKICAgICAgICByZXR1cm4gYCR7d29yZHNbMF19IDxzcGFuIGNsYXNzPSJlbWJlciI+JHt3b3Jkc1sxXX08L3NwYW4+ICR7d29yZHMuc2xpY2UoMikuam9pbignICcpfWA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gTXVsdGktd29yZCB0aXRsZTogc3BsaXQgd2l0aCBlbWJlciBhbmQgc2FnZSBhY2NlbnRzCiAgICAgICAgY29uc3QgZmlyc3QgPSB3b3Jkc1swXTsKICAgICAgICBjb25zdCBoaWdobGlnaHQgPSB3b3Jkc1sxXTsKICAgICAgICBjb25zdCBtaWRkbGUgPSB3b3Jkcy5zbGljZSgyLCBNYXRoLm1heCgzLCB3b3Jkcy5sZW5ndGggLSAyKSkuam9pbignICcpOwogICAgICAgIGNvbnN0IGVuZEhpZ2hsaWdodCA9IHdvcmRzLnNsaWNlKE1hdGgubWF4KDMsIHdvcmRzLmxlbmd0aCAtIDIpLCB3b3Jkcy5sZW5ndGggLSAxKS5qb2luKCcgJyk7CiAgICAgICAgY29uc3QgbGFzdCA9IHdvcmRzW3dvcmRzLmxlbmd0aCAtIDFdOwoKICAgICAgICBpZiAoZW5kSGlnaGxpZ2h0KSB7CiAgICAgICAgICByZXR1cm4gYCR7Zmlyc3R9IDxzcGFuIGNsYXNzPSJlbWJlciI+JHtoaWdobGlnaHR9PC9zcGFuPiAke21pZGRsZX0gPHNwYW4gY2xhc3M9InNhZ2UiPiR7ZW5kSGlnaGxpZ2h0fTwvc3Bhbj4gJHtsYXN0fWA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBgJHtmaXJzdH0gPHNwYW4gY2xhc3M9ImVtYmVyIj4ke2hpZ2hsaWdodH08L3NwYW4+ICR7d29yZHMuc2xpY2UoMikuam9pbignICcpfWA7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gTkFUSVZFIEJST1dTRVIgRE9DWCBFWFRSQUNUT1IgKFplcm8gQ0ROIGRlcGVuZGVuY2llcywgdXNlcyBXZWIgRGVjb21wcmVzc2lvblN0cmVhbSkKICAgIGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3REb2N4VGV4dE5hdGl2ZShhcnJheUJ1ZmZlcikgewogICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7CiAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYXJyYXlCdWZmZXIpOwogICAgICBsZXQgb2Zmc2V0ID0gMDsKICAgICAgd2hpbGUgKG9mZnNldCA8IGJ1ZmZlci5sZW5ndGggLSA0KSB7CiAgICAgICAgY29uc3Qgc2lnID0gdmlldy5nZXRVaW50MzIob2Zmc2V0LCB0cnVlKTsKICAgICAgICBpZiAoc2lnID09PSAweDA0MDM0YjUwKSB7IC8vIExvY2FsIGZpbGUgaGVhZGVyIHNpZ25hdHVyZSAoUEtceDAzXHgwNCkKICAgICAgICAgIGNvbnN0IGNvbXBNZXRob2QgPSB2aWV3LmdldFVpbnQxNihvZmZzZXQgKyA4LCB0cnVlKTsKICAgICAgICAgIGNvbnN0IGNvbXBTaXplID0gdmlldy5nZXRVaW50MzIob2Zmc2V0ICsgMTgsIHRydWUpOwogICAgICAgICAgY29uc3QgbmFtZUxlbiA9IHZpZXcuZ2V0VWludDE2KG9mZnNldCArIDI2LCB0cnVlKTsKICAgICAgICAgIGNvbnN0IGV4dHJhTGVuID0gdmlldy5nZXRVaW50MTYob2Zmc2V0ICsgMjgsIHRydWUpOwogICAgICAgICAgCiAgICAgICAgICBjb25zdCBuYW1lQnl0ZXMgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciwgb2Zmc2V0ICsgMzAsIG5hbWVMZW4pOwogICAgICAgICAgY29uc3QgbmFtZSA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnKS5kZWNvZGUobmFtZUJ5dGVzKTsKICAgICAgICAgIGNvbnN0IGRhdGFPZmZzZXQgPSBvZmZzZXQgKyAzMCArIG5hbWVMZW4gKyBleHRyYUxlbjsKICAgICAgICAgIAogICAgICAgICAgaWYgKG5hbWUgPT09ICd3b3JkL2RvY3VtZW50LnhtbCcpIHsKICAgICAgICAgICAgY29uc3QgY29tcHJlc3NlZERhdGEgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgY29tcFNpemUpOwogICAgICAgICAgICBsZXQgeG1sID0gJyc7CiAgICAgICAgICAgIGlmIChjb21wTWV0aG9kID09PSA4KSB7IC8vIERlZmxhdGUtcmF3IGNvbXByZXNzZWQKICAgICAgICAgICAgICBpZiAodHlwZW9mIERlY29tcHJlc3Npb25TdHJlYW0gIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICBjb25zdCBkcyA9IG5ldyBEZWNvbXByZXNzaW9uU3RyZWFtKCdkZWZsYXRlLXJhdycpOwogICAgICAgICAgICAgICAgY29uc3Qgd3JpdGVyID0gZHMud3JpdGFibGUuZ2V0V3JpdGVyKCk7CiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoY29tcHJlc3NlZERhdGEpOwogICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CiAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBkcy5yZWFkYWJsZS5nZXRSZWFkZXIoKTsKICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTsKICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIGJyZWFrOwogICAgICAgICAgICAgICAgICBjaHVua3MucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbExlbiA9IGNodW5rcy5yZWR1Y2UoKGFjYywgYykgPT4gYWNjICsgYy5sZW5ndGgsIDApOwogICAgICAgICAgICAgICAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW4pOwogICAgICAgICAgICAgICAgbGV0IG9mZiA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY2h1bmtzKSB7CiAgICAgICAgICAgICAgICAgIG91dC5zZXQoYywgb2ZmKTsKICAgICAgICAgICAgICAgICAgb2ZmICs9IGMubGVuZ3RoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgeG1sID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcpLmRlY29kZShvdXQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wTWV0aG9kID09PSAwKSB7IC8vIFN0b3JlZCB1bmNvbXByZXNzZWQKICAgICAgICAgICAgICB4bWwgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi04JykuZGVjb2RlKGNvbXByZXNzZWREYXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHhtbCkgewogICAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaHMgPSBbXTsKICAgICAgICAgICAgICBjb25zdCBwUmVnZXggPSAvPHc6cFxiW14+XSo+KFtcc1xTXSo/KTxcL3c6cD4vZzsKICAgICAgICAgICAgICBsZXQgcE1hdGNoOwogICAgICAgICAgICAgIHdoaWxlICgocE1hdGNoID0gcFJlZ2V4LmV4ZWMoeG1sKSkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBDb250ZW50ID0gcE1hdGNoWzFdOwogICAgICAgICAgICAgICAgY29uc3QgdFJlZ2V4ID0gLzx3OnRcYltePl0qPihbXHNcU10qPyk8XC93OnQ+L2c7CiAgICAgICAgICAgICAgICBsZXQgdE1hdGNoOwogICAgICAgICAgICAgICAgbGV0IHBUZXh0ID0gJyc7CiAgICAgICAgICAgICAgICB3aGlsZSAoKHRNYXRjaCA9IHRSZWdleC5leGVjKHBDb250ZW50KSkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgcFRleHQgKz0gdE1hdGNoWzFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcFRleHQgPSBwVGV4dAogICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJmx0Oy9nLCAnPCcpCiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8mZ3Q7L2csICc+JykKICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyZhbXA7L2csICcmJykKICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyZxdW90Oy9nLCAnIicpCiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8mYXBvczsvZywgIiciKQogICAgICAgICAgICAgICAgICAudHJpbSgpOwogICAgICAgICAgICAgICAgaWYgKHBUZXh0KSBwYXJhZ3JhcGhzLnB1c2gocFRleHQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gcGFyYWdyYXBocy5qb2luKCdcblxuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG9mZnNldCA9IGRhdGFPZmZzZXQgKyBjb21wU2l6ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgb2Zmc2V0Kys7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8vIEhlbHBlcjogUmVhZCBET0NYIGZpbGUgdmlhIG5hdGl2ZSBwYXJzZXIgd2l0aCBNYW1tb3RoIGZhbGxiYWNrCiAgICBhc3luYyBmdW5jdGlvbiByZWFkRG9jeEZpbGUoZmlsZSkgewogICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKTsKICAgICAgCiAgICAgIC8vIDEuIFRyeSBOYXRpdmUgQnJvd3NlciBEZWNvbXByZXNzaW9uU3RyZWFtCiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IGV4dHJhY3REb2N4VGV4dE5hdGl2ZShhcnJheUJ1ZmZlcik7CiAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCkgcmV0dXJuIHRleHQ7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGNvbnNvbGUud2FybignTmF0aXZlIERPQ1ggZXh0cmFjdGlvbiBub3RpY2U6JywgZXJyKTsKICAgICAgfQoKICAgICAgLy8gMi4gVHJ5IE1hbW1vdGguanMgaWYgYXZhaWxhYmxlCiAgICAgIGlmICh0eXBlb2YgbWFtbW90aCAhPT0gJ3VuZGVmaW5lZCcgJiYgbWFtbW90aC5leHRyYWN0UmF3VGV4dCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBtYW1tb3RoLmV4dHJhY3RSYXdUZXh0KHsgYXJyYXlCdWZmZXIgfSk7CiAgICAgICAgICBpZiAocmVzICYmIHJlcy52YWx1ZSAmJiByZXMudmFsdWUudHJpbSgpLmxlbmd0aCA+IDApIHJldHVybiByZXMudmFsdWU7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oJ01hbW1vdGggZXh0cmFjdGlvbiBub3RpY2U6JywgZXJyKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRocm93IG5ldyBFcnJvcignS29uIHRla3N0IG5pZXQgdWl0IGRpdCBXb3JkIGRvY3VtZW50IGhhbGVuLiBTbGEgaGV0IGJlc3RhbmQgZXZlbnR1ZWVsIG9wIGFscyAudHh0IG9mIC5tZC4nKTsKICAgIH0KCiAgICAvLyBEcmFnIGFuZCBEcm9wIFNldHVwIChUYXJnZXRzIGRyb3B6b25lLCB0ZXh0YXJlYSBhbmQgaW5wdXQgc2lkZWJhcikKICAgIGZ1bmN0aW9uIHNldHVwRHJhZ0Ryb3AoKSB7CiAgICAgIC8vIFByZXZlbnQgYnJvd3NlciBkZWZhdWx0IGRyb3Agb24gd2hvbGUgd2luZG93CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIChlKSA9PiB7IGUucHJldmVudERlZmF1bHQoKTsgfSwgZmFsc2UpOwogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIChlKSA9PiB7IGUucHJldmVudERlZmF1bHQoKTsgfSwgZmFsc2UpOwoKICAgICAgY29uc3QgZHJvcHpvbmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZURyb3Bab25lJyk7CiAgICAgIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jhd0NvbnRlbnRJbnB1dCcpOwogICAgICBjb25zdCBpbnB1dFRhYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dFRhYicpOwoKICAgICAgY29uc3QgdGFyZ2V0cyA9IFtkcm9wem9uZSwgdGV4dGFyZWEsIGlucHV0VGFiXS5maWx0ZXIoQm9vbGVhbik7CgogICAgICB0YXJnZXRzLmZvckVhY2godGFyZ2V0ID0+IHsKICAgICAgICBbJ2RyYWdlbnRlcicsICdkcmFnb3ZlciddLmZvckVhY2goZXZlbnROYW1lID0+IHsKICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgKGUpID0+IHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICBpZiAoZHJvcHpvbmUpIGRyb3B6b25lLmNsYXNzTGlzdC5hZGQoJ2RyYWdvdmVyJyk7CiAgICAgICAgICB9LCBmYWxzZSk7CiAgICAgICAgfSk7CgogICAgICAgIFsnZHJhZ2xlYXZlJ10uZm9yRWFjaChldmVudE5hbWUgPT4gewogICAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCAoZSkgPT4gewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIGlmIChkcm9wem9uZSkgZHJvcHpvbmUuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZ292ZXInKTsKICAgICAgICAgIH0sIGZhbHNlKTsKICAgICAgICB9KTsKCiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCAoZSkgPT4gewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgaWYgKGRyb3B6b25lKSBkcm9wem9uZS5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnb3ZlcicpOwogICAgICAgICAgY29uc3QgZHQgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgICAgIGlmIChkdCAmJiBkdC5maWxlcyAmJiBkdC5maWxlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGhhbmRsZUZpbGUoZHQuZmlsZXNbMF0pOwogICAgICAgICAgfQogICAgICAgIH0sIGZhbHNlKTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gaGFuZGxlRmlsZVVwbG9hZChlKSB7CiAgICAgIGNvbnN0IGZpbGVzID0gZS50YXJnZXQuZmlsZXM7CiAgICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGgpIGhhbmRsZUZpbGUoZmlsZXNbMF0pOwogICAgfQoKICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUZpbGUoZmlsZSkgewogICAgICBpZiAoIWZpbGUpIHJldHVybjsKICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlLm5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgY29uc3QgZHJvcHpvbmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZURyb3Bab25lJyk7CiAgICAgIGNvbnN0IHRpdGxlRWwgPSBkcm9wem9uZSA/IGRyb3B6b25lLnF1ZXJ5U2VsZWN0b3IoJy5kcm9wem9uZS10aXRsZScpIDogbnVsbDsKICAgICAgY29uc3Qgc3ViRWwgPSBkcm9wem9uZSA/IGRyb3B6b25lLnF1ZXJ5U2VsZWN0b3IoJy5kcm9wem9uZS1zdWInKSA6IG51bGw7CgogICAgICBpZiAodGl0bGVFbCkgdGl0bGVFbC5pbm5lclRleHQgPSBg4o+zIElubGV6ZW4gdmFuICR7ZmlsZS5uYW1lfS4uLmA7CgogICAgICB0cnkgewogICAgICAgIGxldCBleHRyYWN0ZWRUZXh0ID0gJyc7CgogICAgICAgIGlmIChmaWxlTmFtZS5lbmRzV2l0aCgnLmRvY3gnKSkgewogICAgICAgICAgZXh0cmFjdGVkVGV4dCA9IGF3YWl0IHJlYWREb2N4RmlsZShmaWxlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gUGxhaW4gdGV4dCBvciBNYXJrZG93bgogICAgICAgICAgZXh0cmFjdGVkVGV4dCA9IGF3YWl0IGZpbGUudGV4dCgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFleHRyYWN0ZWRUZXh0IHx8ICFleHRyYWN0ZWRUZXh0LnRyaW0oKSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCZXN0YW5kIGJldmF0IGdlZW4gbGVlc2JhcmUgdGVrc3QuJyk7CiAgICAgICAgfQoKICAgICAgICAvLyBQdXQgZnVsbCBleHRyYWN0ZWQgdGV4dCBpbiB0ZXh0YXJlYQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYXdDb250ZW50SW5wdXQnKS52YWx1ZSA9IGV4dHJhY3RlZFRleHQ7CgogICAgICAgIGNvbnN0IHdvcmRzID0gZXh0cmFjdGVkVGV4dC5zcGxpdCgvXHMrLykuZmlsdGVyKHcgPT4gdy5sZW5ndGggPiAwKS5sZW5ndGg7CiAgICAgICAgaWYgKHRpdGxlRWwpIHRpdGxlRWwuaW5uZXJUZXh0ID0gYOKchSAke2ZpbGUubmFtZX1gOwogICAgICAgIGlmIChzdWJFbCkgc3ViRWwuaW5uZXJUZXh0ID0gYCR7d29yZHN9IHdvb3JkZW4gaW5nZWxhZGVuYDsKCiAgICAgICAgY29uc3Qgc2F2ZWRLZXkgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpQXBpS2V5SW5wdXQnKS52YWx1ZSB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGxtZW50cnlfYWlfa2V5JykgfHwgJycpLnRyaW0oKTsKICAgICAgICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaVN0YXR1c01lc3NhZ2UnKTsKCiAgICAgICAgaWYgKHNhdmVkS2V5KSB7CiAgICAgICAgICBpZiAoc3RhdHVzRWwpIHsKICAgICAgICAgICAgc3RhdHVzRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgICAgIHN0YXR1c0VsLmlubmVySFRNTCA9IGDij7MgPHN0cm9uZz4ke2ZpbGUubmFtZX08L3N0cm9uZz4gKCR7d29yZHN9IHdvb3JkZW4pIHN1Y2Nlc3ZvbCBpbmdlbGFkZW4uIEFJIHJlZGFjdGllIHdvcmR0IGdlc3RhcnQuLi5gOwogICAgICAgICAgfQogICAgICAgICAgcnVuQWlTdHJ1Y3R1cmluZygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoc3RhdHVzRWwpIHsKICAgICAgICAgICAgc3RhdHVzRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgICAgIHN0YXR1c0VsLmlubmVySFRNTCA9IGDwn5OCIDxzdHJvbmc+JHtmaWxlLm5hbWV9PC9zdHJvbmc+ICgke3dvcmRzfSB3b29yZGVuKSBpbmdlbGFkZW4hPGJyPvCflJEgPGVtPlZ1bCBoaWVyb25kZXIgamUgQVBJIHNsZXV0ZWwgaW4gZW4ga2xpayBvcCA8c3Ryb25nPuKcqCBHZW5lcmVlciBEb2N1bWVudCBtZXQgQUk8L3N0cm9uZz4gdm9vciBkZSBwcm9mZXNzaW9uZWxlIDIta2xldXJlbiBvcG1hYWsuPC9lbT5gOwogICAgICAgICAgfQogICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpQXBpS2V5SW5wdXQnKS5mb2N1cygpOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcignRmlsZSBsb2FkIGVycm9yOicsIGVycik7CiAgICAgICAgaWYgKHRpdGxlRWwpIHRpdGxlRWwuaW5uZXJUZXh0ID0gYOKdjCBGb3V0IGJpaiBpbmxhZGVuOiAke2ZpbGUubmFtZX1gOwogICAgICAgIGlmIChzdWJFbCkgc3ViRWwuaW5uZXJUZXh0ID0gZXJyLm1lc3NhZ2U7CiAgICAgICAgYWxlcnQoJ0ZvdXQgYmlqIGhldCBsZXplbiB2YW4gaGV0IGJlc3RhbmQ6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBTYW1wbGUgQ29udGVudCBMb2FkZXIKICAgIGZ1bmN0aW9uIGxvYWRTYW1wbGVUZXh0KCkgewogICAgICBjb25zdCBzYW1wbGUgPSBgIyBCZXN0YWFuc3JlY2h0IGluIGRlIEFnZW50aWMgRWNvbm9teQojIyBXYWFyb20gd2Vic2l0ZXMgdmVyYW5kZXJlbiBpbiBtb2R1bGFpcmUgZGF0YS0gZW4gQVBJLXRvb2xraXRzIHZvb3IgQUkgYnJvd3NlcnMuCgpHb29nbGUgZW4gT3BlbkFJIHRyYW5zZm9ybWVyZW4gaGV0IG9wZW4gd2ViLiBXYWFyIGNvbnN1bWVudGVuIHZyb2VnZXIgZG9vcmtsaWt0ZW4gbmFhciBwYWdpbmEncyB2b2wgYWR2ZXJ0ZW50aWVzIGVuIHRyYWNrZXJzLCB2b2VyZW4gYXV0b25vbWUgQUktYWdlbnRzIG51IGRpcmVjdCBhY3RpZXMgZW4gc3ludGhlc2UgdWl0IG5hbWVucyBkZSBnZWJydWlrZXIuCgojIyMgMS4gRGUgRG9vZCB2YW4gZGUgVmlzdWVsZSBEb29ya2xpawpDb25zdW1lbnRlbiB2ZXJsYXRlbiB0cmFkaXRpb25lbGUgem9la3Jlc3VsdGF0ZW4uIEFJIE92ZXJ2aWV3cyBlbiBhZ2VudGljIGJyb3dzZXJzIGJlYW50d29vcmRlbiB2cmFnZW4gZGlyZWN0IGluIGRlIGludGVyZmFjZSBlbiBuZWdlcmVuIHZpc3VlbGUgdG9ldGVycyBlbiBiZWxsZW4uCgojIyMgMi4gV2ViTUNQIFByb3RvY29sIGluIEdvb2dsZSBDaHJvbWUKV2Vic2l0ZXMgbW9ldGVuIGZ1bmN0aWVzIHJlZ2lzdHJlcmVuIHZpYSBoZXQgTW9kZWwgQ29udGV4dCBQcm90b2NvbCwgd2FhcmRvb3IgQUktbW9kZWxsZW4gZGlyZWN0IHZvb3JyYWRlbiBjaGVja2VuLCBvZmZlcnRlcyBjYWxjdWxlcmVuIGVuIHRyYW5zYWN0aWVzIHVpdHZvZXJlbi4KCiMjIyAzLiBaZXJvLVdhc3RlIERPTSAmIFRva2VuIEVmZmljacOrbnRpZQpXZWJwYWdpbmEncyBtZXQgaG9uZGVyZGVuIGtpbG9ieXRlcyBhYW4gYmxvYXRlZCBKYXZhU2NyaXB0IGxvcGVuIHRlZ2VuIGNvbnRleHQgd2luZG93IGxpbWlldGVuIGFhbi4gTW9kZWxsZW4gc2VsZWN0ZXJlbiB1aXRzbHVpdGVuZCBicm9ubmVuIG1ldCBob2dlIHNlbWFudGlzY2hlIHNpZ25hYWxkaWNodGhlaWQuCgojIyMgNC4gRGlyZWN0ZSBFbnRpdGVpdGVuIGVuIC9sbG1zLnR4dApPcmdhbmlzYXRpZXMgZGllIGVlbiBnZXN0cnVjdHVyZWVyZCAvbGxtcy50eHQgYmVzdGFuZCBzZXJ2ZXJlbiBhYW4gZGUgcm9vdCB2YW4gaHVuIGRvbWVpbiwgY2xhaW1lbiBlZW4gZ2VnYXJhbmRlZXJkZSBwb3NpdGllIGFscyBnZXZlcmlmaWVlcmRlIGtlbm5pc2Jyb24uCgojIyMgQ29uY2x1c2llICYgQWN0aWVwbGFuCk9yZ2FuaXNhdGllcyBtb2V0ZW4gbnUgdHJhbnNmb3JtZXJlbiB2YW4gc3RhdGlzY2hlIHZpc2l0ZWthYXJ0amVzIG5hYXIgYWdlbnRpYyBBUEktYnJvbm5lbi4gVmVyaG9vZyBqZSBzZW1hbnRpc2NoZSBkaWNodGhlaWQgZW4gaW1wbGVtZW50ZWVyIFdlYk1DUCB2w7PDs3JkYXQgamUgZGlnaXRhbGUgemljaHRiYWFyaGVpZCB2ZXJkYW1wdC5gOwoKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jhd0NvbnRlbnRJbnB1dCcpLnZhbHVlID0gc2FtcGxlOwogICAgICBjb25zdCBzYXZlZEtleSA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWlBcGlLZXlJbnB1dCcpLnZhbHVlIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsbG1lbnRyeV9haV9rZXknKSB8fCAnJykudHJpbSgpOwogICAgICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaVN0YXR1c01lc3NhZ2UnKTsKCiAgICAgIGlmIChzYXZlZEtleSkgewogICAgICAgIGlmIChzdGF0dXNFbCkgewogICAgICAgICAgc3RhdHVzRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgICBzdGF0dXNFbC5pbm5lckhUTUwgPSBg4o+zIFZvb3JiZWVsZHRla3N0IGluZ2VsYWRlbi4gQUkgcmVkYWN0aWUgd29yZHQgZ2VzdGFydC4uLmA7CiAgICAgICAgfQogICAgICAgIHJ1bkFpU3RydWN0dXJpbmcoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoc3RhdHVzRWwpIHsKICAgICAgICAgIHN0YXR1c0VsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgICAgc3RhdHVzRWwuaW5uZXJIVE1MID0gYPCfk4sgPHN0cm9uZz5Wb29yYmVlbGR0ZWtzdCBpbmdlbGFkZW4hPC9zdHJvbmc+PGJyPvCflJEgPGVtPlZ1bCBoaWVyb25kZXIgamUgQVBJIHNsZXV0ZWwgaW4gZW4ga2xpayBvcCA8c3Ryb25nPuKcqCBHZW5lcmVlciBEb2N1bWVudCBtZXQgQUk8L3N0cm9uZz4uPC9lbT5gOwogICAgICAgIH0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWlBcGlLZXlJbnB1dCcpLmZvY3VzKCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBTTUFSVCBVTklWRVJTQUwgQ09OVEVOVCBQQVJTRVIgKFdvcmtzIG9uIE1hcmtkb3duLCBQbGFpbiBUZXh0ICYgV29yZCBEb2NzISkKICAgIGZ1bmN0aW9uIHBhcnNlQW5kQXBwbHlDb250ZW50KHRleHQpIHsKICAgICAgaWYgKCF0ZXh0IHx8ICF0ZXh0LnRyaW0oKSkgcmV0dXJuOwoKICAgICAgc2F2ZUhpc3RvcnlTdGF0ZSgpOwoKICAgICAgbGV0IHRpdGxlID0gIiI7CiAgICAgIGxldCBzdWJ0aXRsZSA9ICIiOwogICAgICBsZXQgbGVhZCA9ICIiOwogICAgICBsZXQgY2FyZEl0ZW1zID0gW107CiAgICAgIGxldCBibHVlcHJpbnRJdGVtcyA9IFtdOwogICAgICBsZXQgY29uY2x1c2lvbiA9ICIiOwoKICAgICAgLy8gQ2hlY2sgaWYgdGV4dCBoYXMgZXhwbGljaXQgTWFya2Rvd24gaGVhZGluZ3MKICAgICAgY29uc3QgaGFzTWFya2Rvd24gPSAvXigjfCMjfCMjIylccysvbS50ZXN0KHRleHQpOwoKICAgICAgaWYgKGhhc01hcmtkb3duKSB7CiAgICAgICAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KCdcbicpLm1hcChsID0+IGwudHJpbSgpKS5maWx0ZXIobCA9PiBsLmxlbmd0aCA+IDApOwogICAgICAgIGxldCBjdXJyZW50Q2FyZCA9IG51bGw7CiAgICAgICAgbGV0IGZvdW5kVGl0bGUgPSBmYWxzZTsKCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldOwoKICAgICAgICAgIGlmICghZm91bmRUaXRsZSAmJiBsaW5lLnN0YXJ0c1dpdGgoJyMgJykpIHsKICAgICAgICAgICAgY29uc3QgcmF3VCA9IGxpbmUucmVwbGFjZSgvXiMrXHMqLywgJycpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgIHRpdGxlID0gZm9ybWF0TGxtRW50cnlUaXRsZShyYXdUKTsKICAgICAgICAgICAgZm91bmRUaXRsZSA9IHRydWU7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChmb3VuZFRpdGxlICYmICFzdWJ0aXRsZSAmJiBsaW5lLnN0YXJ0c1dpdGgoJyMjICcpKSB7CiAgICAgICAgICAgIHN1YnRpdGxlID0gbGluZS5yZXBsYWNlKC9eIytccyovLCAnJyk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyMjIyAnKSB8fCAvXlswLTldXC5ccy8udGVzdChsaW5lKSkgewogICAgICAgICAgICBpZiAoY3VycmVudENhcmQpIGNhcmRJdGVtcy5wdXNoKGN1cnJlbnRDYXJkKTsKICAgICAgICAgICAgY3VycmVudENhcmQgPSB7CiAgICAgICAgICAgICAgdGl0bGU6IGxpbmUucmVwbGFjZSgvXiMjIytccyovLCAnJykucmVwbGFjZSgvXlswLTldXC5ccyovLCAnJykudG9VcHBlckNhc2UoKSwKICAgICAgICAgICAgICB0ZXh0OiAiIiwKICAgICAgICAgICAgICBiZzogY2FyZEl0ZW1zLmxlbmd0aCAlIDIgPT09IDAgPyAiY2FyZC1iZy1vYnNpZGlhbiIgOiAiY2FyZC1iZy13aGl0ZSIsCiAgICAgICAgICAgICAgYm9yZGVyOiAiIgogICAgICAgICAgICB9OwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoY3VycmVudENhcmQpIHsKICAgICAgICAgICAgY3VycmVudENhcmQudGV4dCArPSAoY3VycmVudENhcmQudGV4dCA/ICIgIiA6ICIiKSArIGxpbmU7CiAgICAgICAgICB9IGVsc2UgaWYgKCFsZWFkKSB7CiAgICAgICAgICAgIGxlYWQgPSBsaW5lOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY3VycmVudENhcmQpIGNhcmRJdGVtcy5wdXNoKGN1cnJlbnRDYXJkKTsKICAgICAgfQoKICAgICAgLy8gSUYgUExBSU4gVEVYVCwgV09SRCBET0NYIE9SIE5PVCBFTk9VR0ggTUFSS0RPV04gSEVBRElOR1M6IFJVTiBTTUFSVCBQQVJBR1JBUEggUEFSU0VSCiAgICAgIGlmIChjYXJkSXRlbXMubGVuZ3RoID09PSAwIHx8ICF0aXRsZSkgewogICAgICAgIGNvbnN0IHJhd1BhcmFncmFwaHMgPSB0ZXh0CiAgICAgICAgICAuc3BsaXQoL1xuXHMqXG4rLykKICAgICAgICAgIC5tYXAocCA9PiBwLnRyaW0oKSkKICAgICAgICAgIC5maWx0ZXIocCA9PiBwLmxlbmd0aCA+IDApOwoKICAgICAgICBpZiAocmF3UGFyYWdyYXBocy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAvLyAxLiBEZXRlcm1pbmUgVGl0bGUKICAgICAgICAgIGlmICghdGl0bGUpIHsKICAgICAgICAgICAgY29uc3QgZmlyc3RMaW5lcyA9IHJhd1BhcmFncmFwaHNbMF0uc3BsaXQoJ1xuJykubWFwKGwgPT4gbC50cmltKCkpLmZpbHRlcihsID0+IGwubGVuZ3RoID4gMCk7CiAgICAgICAgICAgIGNvbnN0IHJhd1QgPSBmaXJzdExpbmVzWzBdLnJlcGxhY2UoL15bI1wqXC3igKIwLTlcLlxzOl0rLywgJycpLnRyaW0oKTsKICAgICAgICAgICAgdGl0bGUgPSBmb3JtYXRMbG1FbnRyeVRpdGxlKHJhd1QgfHwgIkxMTUVOVFJZIFNUUkFURUdJU0NIIERPU1NJRVIiKTsKICAgICAgICAgICAgaWYgKGZpcnN0TGluZXMubGVuZ3RoID4gMSAmJiAhc3VidGl0bGUpIHsKICAgICAgICAgICAgICBzdWJ0aXRsZSA9IGZpcnN0TGluZXNbMV0ucmVwbGFjZSgvXlsjXCpcLeKAolxzOl0rLywgJycpLnRyaW0oKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIGxldCBjb250ZW50U3RhcnRJbmRleCA9IDE7CiAgICAgICAgICBpZiAoIXN1YnRpdGxlICYmIHJhd1BhcmFncmFwaHMubGVuZ3RoID4gMSkgewogICAgICAgICAgICBpZiAocmF3UGFyYWdyYXBoc1sxXS5sZW5ndGggPCAxNjAgJiYgIXJhd1BhcmFncmFwaHNbMV0uaW5jbHVkZXMoJ1xuJykpIHsKICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHJhd1BhcmFncmFwaHNbMV0ucmVwbGFjZSgvXlsjXCpcLeKAolxzOl0rLywgJycpLnRyaW0oKTsKICAgICAgICAgICAgICBjb250ZW50U3RhcnRJbmRleCA9IDI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoIWxlYWQgJiYgcmF3UGFyYWdyYXBocy5sZW5ndGggPiBjb250ZW50U3RhcnRJbmRleCkgewogICAgICAgICAgICBsZWFkID0gcmF3UGFyYWdyYXBoc1tjb250ZW50U3RhcnRJbmRleF0ucmVwbGFjZSgvXlsjXCpcLeKAolxzOl0rLywgJycpLnRyaW0oKTsKICAgICAgICAgICAgY29udGVudFN0YXJ0SW5kZXgrKzsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAyLiBQcm9jZXNzIFJlbWFpbmluZyBCbG9ja3MgaW50byBJdGVtcwogICAgICAgICAgY29uc3QgcmVtYWluaW5nQmxvY2tzID0gW107CiAgICAgICAgICBmb3IgKGxldCBpID0gY29udGVudFN0YXJ0SW5kZXg7IGkgPCByYXdQYXJhZ3JhcGhzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gcmF3UGFyYWdyYXBoc1tpXTsKICAgICAgICAgICAgY29uc3Qgc3ViTGluZXMgPSBibG9jay5zcGxpdCgnXG4nKS5tYXAobCA9PiBsLnRyaW0oKSkuZmlsdGVyKGwgPT4gbC5sZW5ndGggPiAwKTsKICAgICAgICAgICAgaWYgKHN1YkxpbmVzLmxlbmd0aCA+IDEgJiYgc3ViTGluZXMuc29tZShsID0+IC9eWzAtOV1cLlxzfF5b4oCiXC1cKl1ccy8udGVzdChsKSkpIHsKICAgICAgICAgICAgICBzdWJMaW5lcy5mb3JFYWNoKHNsID0+IHJlbWFpbmluZ0Jsb2Nrcy5wdXNoKHNsKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmVtYWluaW5nQmxvY2tzLnB1c2goYmxvY2spOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgLy8gTG9vayBmb3IgY29uY2x1c2lvbiBibG9jayBhdCB0aGUgZW5kCiAgICAgICAgICBpZiAocmVtYWluaW5nQmxvY2tzLmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICAgIGNvbnN0IGxhc3RCbG9jayA9IHJlbWFpbmluZ0Jsb2Nrc1tyZW1haW5pbmdCbG9ja3MubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIGlmICgvY29uY2x1c2llfHNsb3R8c2FtZW52YXR8YWR2aWVzfHRvdCBzbG90L2kudGVzdChsYXN0QmxvY2spIHx8IHJlbWFpbmluZ0Jsb2Nrcy5sZW5ndGggPj0gNikgewogICAgICAgICAgICAgIGNvbmNsdXNpb24gPSByZW1haW5pbmdCbG9ja3MucG9wKCkucmVwbGFjZSgvXihjb25jbHVzaWV8c2xvdGNvbmNsdXNpZXxhZHZpZXN8dG90IHNsb3QpWzpcc1wtXSovaSwgJycpLnRyaW0oKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIC8vIFBhcnNlIGJsb2NrcyBpbnRvIHN0cnVjdHVyZWQgaXRlbXMgKHRpdGxlICsgdGV4dCkKICAgICAgICAgIGNvbnN0IGl0ZW1zID0gW107CiAgICAgICAgICByZW1haW5pbmdCbG9ja3MuZm9yRWFjaCgoYmxvY2ssIGlkeCkgPT4gewogICAgICAgICAgICBsZXQgaXRlbVRpdGxlID0gIiI7CiAgICAgICAgICAgIGxldCBpdGVtVGV4dCA9ICIiOwoKICAgICAgICAgICAgaWYgKGJsb2NrLmluY2x1ZGVzKCdcbicpKSB7CiAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBibG9jay5zcGxpdCgnXG4nKS5tYXAocCA9PiBwLnRyaW0oKSkuZmlsdGVyKHAgPT4gcC5sZW5ndGggPiAwKTsKICAgICAgICAgICAgICBpdGVtVGl0bGUgPSBwYXJ0c1swXS5yZXBsYWNlKC9eWyNcKlwt4oCiMC05XC5cczpdKy8sICcnKS50cmltKCk7CiAgICAgICAgICAgICAgaXRlbVRleHQgPSBwYXJ0cy5zbGljZSgxKS5qb2luKCcgJykudHJpbSgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGJsb2NrLmluY2x1ZGVzKCc6JykgJiYgYmxvY2suaW5kZXhPZignOicpIDwgNjApIHsKICAgICAgICAgICAgICBjb25zdCBjb2xvbklkeCA9IGJsb2NrLmluZGV4T2YoJzonKTsKICAgICAgICAgICAgICBpdGVtVGl0bGUgPSBibG9jay5zdWJzdHJpbmcoMCwgY29sb25JZHgpLnJlcGxhY2UoL15bI1wqXC3igKIwLTlcLlxzXSsvLCAnJykudHJpbSgpOwogICAgICAgICAgICAgIGl0ZW1UZXh0ID0gYmxvY2suc3Vic3RyaW5nKGNvbG9uSWR4ICsgMSkudHJpbSgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGNvbnN0IHBlcmlvZElkeCA9IGJsb2NrLmluZGV4T2YoJy4gJyk7CiAgICAgICAgICAgICAgaWYgKHBlcmlvZElkeCA+IDEwICYmIHBlcmlvZElkeCA8IDcwKSB7CiAgICAgICAgICAgICAgICBpdGVtVGl0bGUgPSBibG9jay5zdWJzdHJpbmcoMCwgcGVyaW9kSWR4KS5yZXBsYWNlKC9eWyNcKlwt4oCiMC05XC5cc10rLywgJycpLnRyaW0oKTsKICAgICAgICAgICAgICAgIGl0ZW1UZXh0ID0gYmxvY2suc3Vic3RyaW5nKHBlcmlvZElkeCArIDIpLnRyaW0oKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc3Qgd29yZHMgPSBibG9jay5zcGxpdCgvXHMrLyk7CiAgICAgICAgICAgICAgICBpZiAod29yZHMubGVuZ3RoIDw9IDYpIHsKICAgICAgICAgICAgICAgICAgaXRlbVRpdGxlID0gYmxvY2sucmVwbGFjZSgvXlsjXCpcLeKAojAtOVwuXHNdKy8sICcnKS50cmltKCk7CiAgICAgICAgICAgICAgICAgIGl0ZW1UZXh0ID0gIiI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpdGVtVGl0bGUgPSB3b3Jkcy5zbGljZSgwLCA1KS5qb2luKCcgJykucmVwbGFjZSgvXlsjXCpcLeKAojAtOVwuXHNdKy8sICcnKS50cmltKCk7CiAgICAgICAgICAgICAgICAgIGl0ZW1UZXh0ID0gd29yZHMuc2xpY2UoNSkuam9pbignICcpLnRyaW0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpdGVtVGl0bGUgfHwgaXRlbVRleHQpIHsKICAgICAgICAgICAgICBpdGVtcy5wdXNoKHsKICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtVGl0bGUgfHwgYElOWklDSFQgMCR7aWR4ICsgMX1gLAogICAgICAgICAgICAgICAgdGV4dDogaXRlbVRleHQgfHwgaXRlbVRpdGxlCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwoKICAgICAgICAgIC8vIFBvcHVsYXRlIGNhcmRzCiAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBjYXJkSXRlbXMgPSBbXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihpdGVtcy5sZW5ndGgsIDQpOyBpKyspIHsKICAgICAgICAgICAgICBjYXJkSXRlbXMucHVzaCh7CiAgICAgICAgICAgICAgICB0aXRsZTogYCR7aSArIDF9LiAke2l0ZW1zW2ldLnRpdGxlLnJlcGxhY2UoL15bMC05XVwuXHMqLywgJycpLnRvVXBwZXJDYXNlKCl9YCwKICAgICAgICAgICAgICAgIHRleHQ6IGl0ZW1zW2ldLnRleHQsCiAgICAgICAgICAgICAgICBiZzogaSAlIDIgPT09IDAgPyAiY2FyZC1iZy1vYnNpZGlhbiIgOiAiY2FyZC1iZy13aGl0ZSIsCiAgICAgICAgICAgICAgICBib3JkZXI6ICIiCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFBvcHVsYXRlIGJsdWVwcmludCBzdGVwcyBpZiBtb3JlIGl0ZW1zIGV4aXN0CiAgICAgICAgICAgIGNvbnN0IHN0ZXBJdGVtcyA9IGl0ZW1zLnNsaWNlKDQpOwogICAgICAgICAgICBpZiAoc3RlcEl0ZW1zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICBibHVlcHJpbnRJdGVtcyA9IFtdOwogICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4oc3RlcEl0ZW1zLmxlbmd0aCwgNCk7IGkrKykgewogICAgICAgICAgICAgICAgYmx1ZXByaW50SXRlbXMucHVzaCh7CiAgICAgICAgICAgICAgICAgIHN0ZXA6IGAwJHtpICsgMX1gLAogICAgICAgICAgICAgICAgICB0aXRsZTogc3RlcEl0ZW1zW2ldLnRpdGxlLnJlcGxhY2UoL15bMC05XC5cc10rLywgJycpLAogICAgICAgICAgICAgICAgICB0ZXh0OiBzdGVwSXRlbXNbaV0udGV4dCB8fCBzdGVwSXRlbXNbaV0udGl0bGUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gSWYgY2FyZHMgYXJlIHN0aWxsIGVtcHR5LCBjcmVhdGUgZGVmYXVsdCBjYXJkcyBmcm9tIGxlYWQKICAgICAgaWYgKGNhcmRJdGVtcy5sZW5ndGggPT09IDApIHsKICAgICAgICBjYXJkSXRlbXMgPSBkb2NEYXRhLmNhcmRzOwogICAgICB9CiAgICAgIHdoaWxlIChjYXJkSXRlbXMubGVuZ3RoIDwgNCkgewogICAgICAgIGNvbnN0IGlkeCA9IGNhcmRJdGVtcy5sZW5ndGggKyAxOwogICAgICAgIGNhcmRJdGVtcy5wdXNoKHsKICAgICAgICAgIHRpdGxlOiBgJHtpZHh9LiBLRVJOSU5aSUNIVCAmIFVJVFJPTGAsCiAgICAgICAgICB0ZXh0OiAiRGVmaW5pZWVyIGhpZXIgZGUgdmVyZGllcGVuZGUgdG9lbGljaHRpbmcgb3AgZGl0IGtlcm5vbmRlcndlcnAgdm9sZ2VucyBkZSBMTE1lbnRyeSBub3JtLiIsCiAgICAgICAgICBiZzogKGlkeCAtIDEpICUgMiA9PT0gMCA/ICJjYXJkLWJnLW9ic2lkaWFuIiA6ICJjYXJkLWJnLXdoaXRlIiwKICAgICAgICAgIGJvcmRlcjogIiIKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgLy8gQXBwbHkgdmFsdWVzIHRvIGRvY3VtZW50IG1vZGVsCiAgICAgIGlmICh0aXRsZSkgZG9jRGF0YS50aXRsZSA9IHRpdGxlOwogICAgICBpZiAoc3VidGl0bGUpIGRvY0RhdGEuc3VidGl0bGUgPSBzdWJ0aXRsZTsKICAgICAgaWYgKGxlYWQpIGRvY0RhdGEubGVhZCA9IGxlYWQ7CiAgICAgIGlmIChjYXJkSXRlbXMubGVuZ3RoID4gMCkgZG9jRGF0YS5jYXJkcyA9IGNhcmRJdGVtczsKICAgICAgaWYgKGJsdWVwcmludEl0ZW1zLmxlbmd0aCA+IDApIGRvY0RhdGEuYmx1ZXByaW50U3RlcHMgPSBibHVlcHJpbnRJdGVtczsKICAgICAgaWYgKGNvbmNsdXNpb24pIGRvY0RhdGEuY29uY2x1c2lvbiA9IGNvbmNsdXNpb247CgogICAgICBjb25zdCB3b3JkcyA9IHRleHQuc3BsaXQoL1xzKy8pLmZpbHRlcih3ID0+IHcubGVuZ3RoID4gMCkubGVuZ3RoOwogICAgICBkb2NEYXRhLndvcmRDb3VudCA9IGAke3dvcmRzfSBXT09SREVOYDsKICAgICAgZG9jRGF0YS5yZWFkVGltZSA9IGAke01hdGgubWF4KDEsIE1hdGguY2VpbCh3b3JkcyAvIDIyMCkpfSBNSU5VVEVOYDsKCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXRhVGl0bGVJbnB1dCcpLnZhbHVlID0gZG9jRGF0YS50aXRsZTsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21ldGFTdWJ0aXRsZUlucHV0JykudmFsdWUgPSBkb2NEYXRhLnN1YnRpdGxlOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWV0YUxlYWRJbnB1dCcpLnZhbHVlID0gZG9jRGF0YS5sZWFkOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWV0YVJlYWRUaW1lSW5wdXQnKS52YWx1ZSA9IGRvY0RhdGEucmVhZFRpbWU7CgogICAgICByZW5kZXJEb2N1bWVudCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdlbmVyYXRlRG9jdW1lbnRGcm9tSW5wdXQoKSB7CiAgICAgIHJ1bkFpU3RydWN0dXJpbmcoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVMaXZlTWV0YSgpIHsKICAgICAgZG9jRGF0YS5iYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXRhQmFkZ2VJbnB1dCcpLnZhbHVlOwogICAgICBkb2NEYXRhLnRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21ldGFUaXRsZUlucHV0JykudmFsdWU7CiAgICAgIGRvY0RhdGEuc3VidGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWV0YVN1YnRpdGxlSW5wdXQnKS52YWx1ZTsKICAgICAgZG9jRGF0YS5sZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21ldGFMZWFkSW5wdXQnKS52YWx1ZTsKICAgICAgZG9jRGF0YS5yZWFkVGltZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXRhUmVhZFRpbWVJbnB1dCcpLnZhbHVlOwogICAgICBkb2NEYXRhLmF1ZGllbmNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21ldGFBdWRpZW5jZUlucHV0JykudmFsdWU7CiAgICAgIGRvY0RhdGEuYXV0aG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21ldGFBdXRob3JJbnB1dCcpLnZhbHVlOwogICAgICByZW5kZXJEb2N1bWVudCgpOwogICAgfQoKICAgIC8vIEFJIE1PREVMIE1BTkFHRU1FTlQgJiBNVUxUSS1NT0RFTCBGQUxMQkFDSyBFTkdJTkUKICAgIGZ1bmN0aW9uIHVwZGF0ZU1vZGVsT3B0aW9ucygpIHsKICAgICAgY29uc3QgcHJvdmlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWlQcm92aWRlclNlbGVjdCcpLnZhbHVlOwogICAgICBjb25zdCBtb2RlbFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaU1vZGVsU2VsZWN0Jyk7CiAgICAgIG1vZGVsU2VsZWN0LmlubmVySFRNTCA9ICcnOwoKICAgICAgaWYgKHByb3ZpZGVyID09PSAnZ2VtaW5pJykgewogICAgICAgIGNvbnN0IG9wdGlvbnMgPSBbCiAgICAgICAgICB7IHZhbDogJ2dlbWluaS0yLjUtZmxhc2gnLCBsYWJlbDogJ0dlbWluaSAyLjUgRmxhc2ggKEFhbmJldm9sZW4g4oCUIFNuZWxzdCAmIFNsaW1zdCknIH0sCiAgICAgICAgICB7IHZhbDogJ2dlbWluaS0yLjAtZmxhc2gnLCBsYWJlbDogJ0dlbWluaSAyLjAgRmxhc2gnIH0sCiAgICAgICAgICB7IHZhbDogJ2dlbWluaS0zLjgtZmxhc2gnLCBsYWJlbDogJ0dlbWluaSAzLjggRmxhc2gnIH0sCiAgICAgICAgICB7IHZhbDogJ2dlbWluaS0xLjUtZmxhc2gtbGF0ZXN0JywgbGFiZWw6ICdHZW1pbmkgMS41IEZsYXNoIChMYXRlc3QpJyB9LAogICAgICAgICAgeyB2YWw6ICdnZW1pbmktMi41LXBybycsIGxhYmVsOiAnR2VtaW5pIDIuNSBQcm8gKERpZXBlIFJlZGFjdGllKScgfSwKICAgICAgICAgIHsgdmFsOiAnY3VzdG9tJywgbGFiZWw6ICdBbmRlciAvIEFhbmdlcGFzdCBtb2RlbC4uLicgfQogICAgICAgIF07CiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKG9wdCA9PiB7CiAgICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpOwogICAgICAgICAgZWwudmFsdWUgPSBvcHQudmFsOwogICAgICAgICAgZWwuaW5uZXJUZXh0ID0gb3B0LmxhYmVsOwogICAgICAgICAgbW9kZWxTZWxlY3QuYXBwZW5kQ2hpbGQoZWwpOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IG9wdGlvbnMgPSBbCiAgICAgICAgICB7IHZhbDogJ2dwdC00bycsIGxhYmVsOiAnR1BULTRvIChBYW5iZXZvbGVuKScgfSwKICAgICAgICAgIHsgdmFsOiAnZ3B0LTRvLW1pbmknLCBsYWJlbDogJ0dQVC00by1taW5pIChTbmVsICYgRWZmaWNpw6tudCknIH0sCiAgICAgICAgICB7IHZhbDogJ2N1c3RvbScsIGxhYmVsOiAnQW5kZXIgLyBBYW5nZXBhc3QgbW9kZWwuLi4nIH0KICAgICAgICBdOwogICAgICAgIG9wdGlvbnMuZm9yRWFjaChvcHQgPT4gewogICAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTsKICAgICAgICAgIGVsLnZhbHVlID0gb3B0LnZhbDsKICAgICAgICAgIGVsLmlubmVyVGV4dCA9IG9wdC5sYWJlbDsKICAgICAgICAgIG1vZGVsU2VsZWN0LmFwcGVuZENoaWxkKGVsKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBoYW5kbGVNb2RlbFNlbGVjdENoYW5nZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhhbmRsZU1vZGVsU2VsZWN0Q2hhbmdlKCkgewogICAgICBjb25zdCBzZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWlNb2RlbFNlbGVjdCcpOwogICAgICBjb25zdCBjdXN0b21JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjdXN0b21Nb2RlbElucHV0Jyk7CiAgICAgIGlmIChzZWxlY3QudmFsdWUgPT09ICdjdXN0b20nKSB7CiAgICAgICAgY3VzdG9tSW5wdXQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VzdG9tSW5wdXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUFwaUtleVN0YXR1cyhpc0FjdGl2ZSkgewogICAgICBjb25zdCBiYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcGlLZXlTdGF0dXNCYWRnZScpOwogICAgICBpZiAoIWJhZGdlKSByZXR1cm47CiAgICAgIGlmIChpc0FjdGl2ZSkgewogICAgICAgIGJhZGdlLmlubmVyVGV4dCA9ICfinIUgU2xldXRlbCBBY3RpZWYnOwogICAgICAgIGJhZGdlLnN0eWxlLmNvbG9yID0gJyM3QzlEOTYnOwogICAgICB9IGVsc2UgewogICAgICAgIGJhZGdlLmlubmVyVGV4dCA9ICfwn5SRIFNsZXV0ZWwgVmVyZWlzdCc7CiAgICAgICAgYmFkZ2Uuc3R5bGUuY29sb3IgPSAnI0UwN0E1Ric7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0b2dnbGVBcGlLZXlWaXNpYmlsaXR5KCkgewogICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaUFwaUtleUlucHV0Jyk7CiAgICAgIGlmICghaW5wdXQpIHJldHVybjsKICAgICAgaW5wdXQudHlwZSA9IGlucHV0LnR5cGUgPT09ICdwYXNzd29yZCcgPyAndGV4dCcgOiAncGFzc3dvcmQnOwogICAgfQoKICAgIGZ1bmN0aW9uIHNhdmVBcGlLZXlUb0xvY2FsKCkgewogICAgICBjb25zdCBrZXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWlBcGlLZXlJbnB1dCcpLnZhbHVlLnRyaW0oKTsKICAgICAgaWYgKGtleSkgewogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdsbG1lbnRyeV9haV9rZXknLCBrZXkpOwogICAgICAgIHVwZGF0ZUFwaUtleVN0YXR1cyh0cnVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnbGxtZW50cnlfYWlfa2V5Jyk7CiAgICAgICAgdXBkYXRlQXBpS2V5U3RhdHVzKGZhbHNlKTsKICAgICAgfQogICAgfQoKICAgIC8vIEFJIFNUUlVDVFVSSU5HIEVOR0lORSAoV2l0aCBBdXRvLURpc2NvdmVyeSAmIFR3by1Db2xvciBUaXRsZSBTY2hlbWEpCiAgICBhc3luYyBmdW5jdGlvbiBydW5BaVN0cnVjdHVyaW5nKCkgewogICAgICBjb25zdCBhcGlLZXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWlBcGlLZXlJbnB1dCcpLnZhbHVlLnRyaW0oKTsKICAgICAgY29uc3QgcmF3VGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYXdDb250ZW50SW5wdXQnKS52YWx1ZS50cmltKCk7CiAgICAgIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FpU3RhdHVzTWVzc2FnZScpOwogICAgICBjb25zdCBwcm92aWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaVByb3ZpZGVyU2VsZWN0JykudmFsdWU7CgogICAgICBpZiAoIWFwaUtleSkgewogICAgICAgIGlmIChzdGF0dXNFbCkgewogICAgICAgICAgc3RhdHVzRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgICBzdGF0dXNFbC5pbm5lckhUTUwgPSAn4pqg77iPIDxzdHJvbmc+QVBJIHNsZXV0ZWwgb250YnJlZWt0Ojwvc3Ryb25nPiBWdWwgaGllcm9uZGVyIGplIEdlbWluaSBvZiBPcGVuQUkgc2xldXRlbCBpbi4gPGEgaHJlZj0iaHR0cHM6Ly9haXN0dWRpby5nb29nbGUuY29tLyIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJjb2xvcjp2YXIoLS1jb2xvci1lbWJlci1nbG93KTsgZm9udC13ZWlnaHQ6Ym9sZDsiPktsaWsgaGllciB2b29yIGVlbiBncmF0aXMgR2VtaW5pIGtleSDwn5GJPC9hPic7CiAgICAgICAgfQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaUFwaUtleUlucHV0JykuZm9jdXMoKTsKICAgICAgICBhbGVydCgnVnVsIGEudS5iLiBlZXJzdCBqZSBBUEkgc2xldXRlbCBpbiBvbSBkZSBBSSByZWRhY3RpZSB0ZSBzdGFydGVuLicpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIXJhd1RleHQpIHsKICAgICAgICBpZiAoc3RhdHVzRWwpIHsKICAgICAgICAgIHN0YXR1c0VsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgICAgc3RhdHVzRWwuaW5uZXJIVE1MID0gJ+KaoO+4jyA8c3Ryb25nPkdlZW4gdGVrc3QgZ2V2b25kZW46PC9zdHJvbmc+IFBsYWsgdGVrc3QgaW4gaGV0IGludm9lcnZhayBvZiBzbGVlcCBlZW4gV29yZCAoLmRvY3gpIG9mIE1hcmtkb3duICgubWQpIGJlc3RhbmQuJzsKICAgICAgICB9CiAgICAgICAgYWxlcnQoJ1BsYWsgZWVyc3QgdGVrc3QgaW4gaGV0IGludm9lcnZhayBvZiBzbGVlcCBlZW4gV29yZC1iZXN0YW5kLicpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgc3RhdHVzRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgIHN0YXR1c0VsLmlubmVySFRNTCA9ICfij7MgPHN0cm9uZz5BSSBhbmFseXNlZXJ0IGRlIGNvbnRlbnQuLi48L3N0cm9uZz4gU3RydWN0dXVyIGVuIDIta2xldXJlbiBzdHlsaW5nIHdvcmRlbiB2b29yYmVyZWlkLic7CgogICAgICBjb25zdCBwcm9tcHQgPSBgSmUgYmVudCBkZSBMTE1lbnRyeSBNYXN0ZXIgRG9jdW1lbnQgQXJjaGl0ZWN0LiBGb3JtYXR0ZWVyIGRlIHZvbGdlbmRlIHJ1d2UgdGVrc3Qgc3RyaWt0IGFscyBKU09OIHZvbGdlbnMgZGl0IHNjaGVtYToKewogICJiYWRnZSI6ICJLb3J0ZSBjYXRlZ29yaWUgKGJpanYuIEVYRUNVVElWRSBCUklFRklORyAmIFRFQ0hOSUNBTCBCTFVFUFJJTlQpIiwKICAidGl0bGUiOiAiSG9vZmR0aXRlbCBtZXQgSFRNTCBzcGFuIHRhZ3Mgdm9vciAyIGtsZXVyZW4uIFZvb3JiZWVsZDogJ1RPS0VOIDxzcGFuIGNsYXNzPVwiZW1iZXJcIj5TUVVFRVpFPC9zcGFuPjogREUgVkVSQk9SR0VOIDxzcGFuIGNsYXNzPVwic2FnZVwiPk1BUkdJTiBLSUxMRVI8L3NwYW4+JyIsCiAgInN1YnRpdGxlIjogIk9uZGVydGl0ZWwgb2Yga2VybnZyYWFnIGluIDEgaGVsZGVyZSB6aW4iLAogICJsZWFkIjogIlBha2tlbmRlIGlubGVpZGVuZGUgYWxpbmVhIHZhbiAyLTMgemlubmVuIiwKICAicmVhZFRpbWUiOiAiWCBNSU5VVEVOIiwKICAiYXVkaWVuY2UiOiAiRG9lbGdyb2VwIGluIGhvb2ZkbGV0dGVycyAoYmlqdi4gQ1RPLCBNQVJLRVRJTkcsIFRFQ0ggU0VPKSIsCiAgImNhcmRzIjogWwogICAgeyAidGl0bGUiOiAiMS4gTkFBTSBJTlpJQ0hUIiwgInRleHQiOiAiSGVsZGVyZSB1aXRsZWcgaW4gMi0zIHppbm5lbi4iIH0sCiAgICB7ICJ0aXRsZSI6ICIyLiBOQUFNIElOWklDSFQiLCAidGV4dCI6ICJIZWxkZXJlIHVpdGxlZyBpbiAyLTMgemlubmVuLiIgfSwKICAgIHsgInRpdGxlIjogIjMuIE5BQU0gSU5aSUNIVCIsICJ0ZXh0IjogIkhlbGRlcmUgdWl0bGVnIGluIDItMyB6aW5uZW4uIiB9LAogICAgeyAidGl0bGUiOiAiNC4gTkFBTSBJTlpJQ0hUIiwgInRleHQiOiAiSGVsZGVyZSB1aXRsZWcgaW4gMi0zIHppbm5lbi4iIH0KICBdLAogICJibHVlcHJpbnRTdGVwcyI6IFsKICAgIHsgInN0ZXAiOiAiMDEiLCAidGl0bGUiOiAiS29wIFN0YXAgMSIsICJ0ZXh0IjogIktvcnRlIHRvZWxpY2h0aW5nIiB9LAogICAgeyAic3RlcCI6ICIwMiIsICJ0aXRsZSI6ICJLb3AgU3RhcCAyIiwgInRleHQiOiAiS29ydGUgdG9lbGljaHRpbmciIH0sCiAgICB7ICJzdGVwIjogIjAzIiwgInRpdGxlIjogIktvcCBTdGFwIDMiLCAidGV4dCI6ICJLb3J0ZSB0b2VsaWNodGluZyIgfSwKICAgIHsgInN0ZXAiOiAiMDQiLCAidGl0bGUiOiAiS29wIFN0YXAgNCIsICJ0ZXh0IjogIktvcnRlIHRvZWxpY2h0aW5nIiB9CiAgXSwKICAiY29uY2x1c2lvbiI6ICJBZnNsdWl0ZW5kZSBrcmFjaHRpZ2UgY29uY2x1c2llcGFyYWdyYWFmIgp9CkhpZXIgaXMgZGUgcnV3ZSB0ZWtzdDoKJHtyYXdUZXh0fWA7CgogICAgICBsZXQgY2hvc2VuTW9kZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWlNb2RlbFNlbGVjdCcpLnZhbHVlOwogICAgICBpZiAoY2hvc2VuTW9kZWwgPT09ICdjdXN0b20nKSB7CiAgICAgICAgY2hvc2VuTW9kZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3VzdG9tTW9kZWxJbnB1dCcpLnZhbHVlLnRyaW0oKSB8fCAnZ2VtaW5pLTIuNS1mbGFzaCc7CiAgICAgIH0KCiAgICAgIHRyeSB7CiAgICAgICAgbGV0IHJlc3BvbnNlSnNvblRleHQgPSAiIjsKCiAgICAgICAgaWYgKHByb3ZpZGVyID09PSAnZ2VtaW5pJykgewogICAgICAgICAgLy8gUm9idXN0IGNhbGwgd2l0aCBmYWxsYmFjayBsb2dpYwogICAgICAgICAgcmVzcG9uc2VKc29uVGV4dCA9IGF3YWl0IGNhbGxHZW1pbmlXaXRoQXV0b0ZhbGxiYWNrKGNob3Nlbk1vZGVsLCBhcGlLZXksIHByb21wdCwgc3RhdHVzRWwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBPcGVuQUkKICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCdodHRwczovL2FwaS5vcGVuYWkuY29tL3YxL2NoYXQvY29tcGxldGlvbnMnLCB7CiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHthcGlLZXl9YAogICAgICAgICAgICB9LAogICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgbW9kZWw6IGNob3Nlbk1vZGVsID09PSAnY3VzdG9tJyA/ICdncHQtNG8nIDogY2hvc2VuTW9kZWwsCiAgICAgICAgICAgICAgbWVzc2FnZXM6IFt7IHJvbGU6ICd1c2VyJywgY29udGVudDogcHJvbXB0IH1dLAogICAgICAgICAgICAgIHJlc3BvbnNlX2Zvcm1hdDogeyB0eXBlOiAianNvbl9vYmplY3QiIH0KICAgICAgICAgICAgfSkKICAgICAgICAgIH0pOwogICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgICBpZiAoZGF0YS5lcnJvcikgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IubWVzc2FnZSk7CiAgICAgICAgICByZXNwb25zZUpzb25UZXh0ID0gZGF0YS5jaG9pY2VzWzBdLm1lc3NhZ2UuY29udGVudDsKICAgICAgICB9CgogICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmVzcG9uc2VKc29uVGV4dCk7CiAgICAgICAgc2F2ZUhpc3RvcnlTdGF0ZSgpOwoKICAgICAgICBkb2NEYXRhLmJhZGdlID0gcGFyc2VkLmJhZGdlIHx8IGRvY0RhdGEuYmFkZ2U7CiAgICAgICAgZG9jRGF0YS50aXRsZSA9IHBhcnNlZC50aXRsZSB8fCBkb2NEYXRhLnRpdGxlOwogICAgICAgIGRvY0RhdGEuc3VidGl0bGUgPSBwYXJzZWQuc3VidGl0bGUgfHwgZG9jRGF0YS5zdWJ0aXRsZTsKICAgICAgICBkb2NEYXRhLmxlYWQgPSBwYXJzZWQubGVhZCB8fCBkb2NEYXRhLmxlYWQ7CiAgICAgICAgZG9jRGF0YS5yZWFkVGltZSA9IHBhcnNlZC5yZWFkVGltZSB8fCBkb2NEYXRhLnJlYWRUaW1lOwogICAgICAgIGRvY0RhdGEuYXVkaWVuY2UgPSBwYXJzZWQuYXVkaWVuY2UgfHwgZG9jRGF0YS5hdWRpZW5jZTsKICAgICAgICBpZiAocGFyc2VkLmNhcmRzICYmIHBhcnNlZC5jYXJkcy5sZW5ndGgpIGRvY0RhdGEuY2FyZHMgPSBwYXJzZWQuY2FyZHM7CiAgICAgICAgaWYgKHBhcnNlZC5ibHVlcHJpbnRTdGVwcyAmJiBwYXJzZWQuYmx1ZXByaW50U3RlcHMubGVuZ3RoKSBkb2NEYXRhLmJsdWVwcmludFN0ZXBzID0gcGFyc2VkLmJsdWVwcmludFN0ZXBzOwogICAgICAgIGlmIChwYXJzZWQuY29uY2x1c2lvbikgZG9jRGF0YS5jb25jbHVzaW9uID0gcGFyc2VkLmNvbmNsdXNpb247CgogICAgICAgIC8vIFN5bmMgaW5wdXRzCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21ldGFUaXRsZUlucHV0JykudmFsdWUgPSBkb2NEYXRhLnRpdGxlOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXRhU3VidGl0bGVJbnB1dCcpLnZhbHVlID0gZG9jRGF0YS5zdWJ0aXRsZTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWV0YUxlYWRJbnB1dCcpLnZhbHVlID0gZG9jRGF0YS5sZWFkOwoKICAgICAgICByZW5kZXJEb2N1bWVudCgpOwogICAgICAgIHN0YXR1c0VsLmlubmVySFRNTCA9ICfinIUgPHN0cm9uZz5TdWNjZXN2b2wgZ2Vmb3JtYXR0ZWVyZCE8L3N0cm9uZz4gSGV0IGRvY3VtZW50IGhlZWZ0IG51IGRlIG9mZmljacOrbGUgMi1rbGV1cmVuIExMTWVudHJ5IG9wbWFhay4nOwogICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBzdGF0dXNFbC5pbm5lckhUTUwgPSBg4p2MIDxzdHJvbmc+Rm91dDo8L3N0cm9uZz4gJHtlcnIubWVzc2FnZX1gOwogICAgICB9CiAgICB9CgogICAgLy8gSGVscGVyOiBDYWxsIEdlbWluaSBhbmQgaWYgNDA0L25vdCBmb3VuZCwgZGlzY292ZXIgc3VwcG9ydGVkIG1vZGVscyBkeW5hbWljYWxseQogICAgYXN5bmMgZnVuY3Rpb24gY2FsbEdlbWluaVdpdGhBdXRvRmFsbGJhY2sobW9kZWxOYW1lLCBhcGlLZXksIHByb21wdCwgc3RhdHVzRWwpIHsKICAgICAgYXN5bmMgZnVuY3Rpb24gdHJ5TW9kZWwobSkgewogICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL2dlbmVyYXRpdmVsYW5ndWFnZS5nb29nbGVhcGlzLmNvbS92MWJldGEvbW9kZWxzLyR7bX06Z2VuZXJhdGVDb250ZW50P2tleT0ke2FwaUtleX1gOwogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgewogICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwKICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgY29udGVudHM6IFt7IHBhcnRzOiBbeyB0ZXh0OiBwcm9tcHQgfV0gfV0sCiAgICAgICAgICAgIGdlbmVyYXRpb25Db25maWc6IHsgcmVzcG9uc2VNaW1lVHlwZTogImFwcGxpY2F0aW9uL2pzb24iIH0KICAgICAgICAgIH0pCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGF3YWl0IHJlcy5qc29uKCk7CiAgICAgIH0KCiAgICAgIGxldCByZXNEYXRhID0gYXdhaXQgdHJ5TW9kZWwobW9kZWxOYW1lKTsKCiAgICAgIC8vIElmIGVycm9yIGluZGljYXRlcyBtb2RlbCBub3QgZm91bmQsIHF1ZXJ5IGF2YWlsYWJsZSBtb2RlbHMgZm9yIHRoaXMga2V5CiAgICAgIGlmIChyZXNEYXRhLmVycm9yICYmIChyZXNEYXRhLmVycm9yLmNvZGUgPT09IDQwNCB8fCByZXNEYXRhLmVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ25vdCBmb3VuZCcpIHx8IHJlc0RhdGEuZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbm90IHN1cHBvcnRlZCcpKSkgewogICAgICAgIHN0YXR1c0VsLmlubmVySFRNTCA9IGDwn5SEIE1vZGVsICcke21vZGVsTmFtZX0nIG5pZXQgZ2V2b25kZW4gb3AgQVBJLiBCZXNjaGlrYmFyZSBtb2RlbGxlbiB2b29yIGpvdXcgQVBJIGtleSBvcGhhbGVuLi4uYDsKICAgICAgICAKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3QgbGlzdFJlcyA9IGF3YWl0IGZldGNoKGBodHRwczovL2dlbmVyYXRpdmVsYW5ndWFnZS5nb29nbGVhcGlzLmNvbS92MWJldGEvbW9kZWxzP2tleT0ke2FwaUtleX1gKTsKICAgICAgICAgIGNvbnN0IGxpc3REYXRhID0gYXdhaXQgbGlzdFJlcy5qc29uKCk7CiAgICAgICAgICBpZiAobGlzdERhdGEubW9kZWxzICYmIGxpc3REYXRhLm1vZGVscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIC8vIEZpbmQgYmVzdCBmbGFzaC9wcm8gbW9kZWwKICAgICAgICAgICAgY29uc3QgdmFsaWQgPSBsaXN0RGF0YS5tb2RlbHMKICAgICAgICAgICAgICAuZmlsdGVyKG0gPT4gbS5zdXBwb3J0ZWRHZW5lcmF0aW9uTWV0aG9kcyAmJiBtLnN1cHBvcnRlZEdlbmVyYXRpb25NZXRob2RzLmluY2x1ZGVzKCdnZW5lcmF0ZUNvbnRlbnQnKSkKICAgICAgICAgICAgICAubWFwKG0gPT4gbS5uYW1lLnJlcGxhY2UoJ21vZGVscy8nLCAnJykpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gUHJlZmVyZW5jZSBvcmRlcgogICAgICAgICAgICBjb25zdCBwcmlvcml0eSA9IFsnZ2VtaW5pLTIuNS1mbGFzaCcsICdnZW1pbmktMi4wLWZsYXNoJywgJ2dlbWluaS0zLjgtZmxhc2gnLCAnZ2VtaW5pLTEuNS1mbGFzaCcsICdnZW1pbmktMS41LXBybycsICdnZW1pbmktMi41LXBybyddOwogICAgICAgICAgICBsZXQgYmVzdE1vZGVsID0gdmFsaWQuZmluZChtID0+IHByaW9yaXR5LmluY2x1ZGVzKG0pKSB8fCB2YWxpZFswXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChiZXN0TW9kZWwpIHsKICAgICAgICAgICAgICBzdGF0dXNFbC5pbm5lckhUTUwgPSBg8J+UhCBBdXRvbWF0aXNjaCBnZXNjaGFrZWxkIG5hYXIgYWN0aWVmIG1vZGVsOiA8c3Ryb25nPiR7YmVzdE1vZGVsfTwvc3Ryb25nPi4uLmA7CiAgICAgICAgICAgICAgcmVzRGF0YSA9IGF3YWl0IHRyeU1vZGVsKGJlc3RNb2RlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChsaXN0RXJyKSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBsaXN0IG1vZGVscycsIGxpc3RFcnIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHJlc0RhdGEuZXJyb3IpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzRGF0YS5lcnJvci5tZXNzYWdlKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHJlc0RhdGEuY2FuZGlkYXRlc1swXS5jb250ZW50LnBhcnRzWzBdLnRleHQ7CiAgICB9CgogICAgLy8gTUFTVEVSIERPQ1VNRU5UIFJFTkRFUiBFTkdJTkUgKFBlci1QYWdlICYgUGVyLUNhcmQgQ2xpY2sgSGFuZGxlcnMgRW5hYmxlZCEpCiAgICBmdW5jdGlvbiByZW5kZXJEb2N1bWVudCgpIHsKICAgICAgY29uc3Qgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZW5kZXJlZERvY3VtZW50Um9vdCcpOwogICAgICByb290LmlubmVySFRNTCA9ICcnOwoKICAgICAgaWYgKGN1cnJlbnRGb3JtYXQgPT09ICdmYWN0c2hlZXQnKSB7CiAgICAgICAgcm9vdC5pbm5lckhUTUwgPSByZW5kZXJGYWN0c2hlZXRQYWdlKCk7CiAgICAgIH0gZWxzZSBpZiAoY3VycmVudEZvcm1hdCA9PT0gJ2JyaWVmaW5nJykgewogICAgICAgIHJvb3QuaW5uZXJIVE1MID0gcmVuZGVyQnJpZWZpbmdQYWdlcygpOwogICAgICB9IGVsc2UgewogICAgICAgIHJvb3QuaW5uZXJIVE1MID0gcmVuZGVyV2hpdGVwYXBlclBhZ2VzKCk7CiAgICAgIH0KCiAgICAgIGlmIChsaXZlRWRpdGluZ0FjdGl2ZSkgewogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoVEVYVF9FTEVNRU5UU19TRUxFQ1RPUikuZm9yRWFjaChlbCA9PiB7CiAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsICd0cnVlJyk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyAxLVBBR0UgRkFDVFNIRUVUIFRFTVBMQVRFCiAgICBmdW5jdGlvbiByZW5kZXJGYWN0c2hlZXRQYWdlKCkgewogICAgICByZXR1cm4gYAogICAgICA8c2VjdGlvbiBjbGFzcz0iYTQtcGFnZSIgaWQ9InBhZ2UtMSIgZGF0YS1wYWdlLW51bWJlcj0iMSIgc3R5bGU9Ii0tcGFnZS1iZy10b3A6ICNGQUY3RjI7IC0tcGFnZS1iZy1ib3R0b206ICMzNTUwNEE7IC0tcGFnZS1zcGxpdC1wb3M6IDM0JTsiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLWlubmVyIj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxoZWFkZXIgY2xhc3M9InBhZ2UtaGVhZGVyIiBzdHlsZT0iY29sb3I6IHZhcigtLWNvbG9yLW9ic2lkaWFuLWRhcmspOyBib3JkZXItYm90dG9tLWNvbG9yOiByZ2JhKDAsMCwwLDAuMTUpOyIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgIDxzcGFuIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj5MTE1FTlRSWSBET1NTSUVSIC8vIEZBQ1RTSEVFVDwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+JHtkb2NEYXRhLmJhZGdlfTwvc3Bhbj4KICAgICAgICAgICAgPC9oZWFkZXI+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLWludHJvLWJsb2NrIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgPGgxIGNsYXNzPSJkaXNwbGF5LXRpdGxlIiBzdHlsZT0iY29sb3I6IHZhcigtLWNvbG9yLW9ic2lkaWFuLWRhcmspOyBmb250LXNpemU6IDIycHQ7IiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgICAke2RvY0RhdGEudGl0bGV9CiAgICAgICAgICAgICAgPC9oMT4KICAgICAgICAgICAgICA8cCBjbGFzcz0ic2VjdGlvbi1zdWJ0aXRsZSBkZWVwLXNhZ2UiIHN0eWxlPSJmb250LXNpemU6IDExcHQ7IiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgICAke2RvY0RhdGEuc3VidGl0bGV9CiAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgIDxwIGNsYXNzPSJsZWFkLXBhcmFncmFwaCIgc3R5bGU9ImNvbG9yOiB2YXIoLS1jb2xvci10ZXh0LWRhcmspOyBmb250LXNpemU6IDkuNXB0OyIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgICAgJHtkb2NEYXRhLmxlYWR9CiAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gQmVudG8gMngyIEdyaWQgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJlbnRvLWZsb3ctY29udGFpbmVyIGxheW91dC0yY29sLWdyaWQiIHN0eWxlPSJtYXJnaW4tdG9wOiAxNHB4OyI+CiAgICAgICAgICAgICAgJHtkb2NEYXRhLmNhcmRzLnNsaWNlKDAsIDQpLm1hcCgoYywgaSkgPT4gYAogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmVudG8tY2FyZCAke2kgJSAyID09PSAwID8gJ2NhcmQtYmctb2JzaWRpYW4nIDogJ2NhcmQtYmctd2hpdGUnfSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJiZW50by1jYXJkLXRpdGxlICR7aSAlIDIgPT09IDAgPyAnZW1iZXInIDogJ2Rhcmstb2JzaWRpYW4nfSIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPiR7Yy50aXRsZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmVudG8tY2FyZC10ZXh0ICR7aSAlIDIgPT09IDAgPyAnJyA6ICdkYXJrLW9ic2lkaWFuJ30iIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4ke2MudGV4dH08L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIGApLmpvaW4oJycpfQogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gQ29uY2x1c2llIENhbGxvdXQgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJlbnRvLWNhcmQgY2FyZC1iZy1vYnNpZGlhbiIgc3R5bGU9Im1hcmdpbi10b3A6IDE0cHg7IHBhZGRpbmc6IDE2cHggMjBweDsiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJiZW50by1jYXJkLXRpdGxlIGVtYmVyIiBzdHlsZT0iZm9udC1zaXplOiA5LjVwdDsiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICAgICAgICAgIPCfkqEgU1RSQVRFR0lTQ0hFIEtFUk5DT05DTFVTSUUKICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJiZW50by1jYXJkLXRleHQiIHN0eWxlPSJjb2xvcjogI0ZGRjsgZm9udC1zaXplOiA5cHQ7IiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgICAke2RvY0RhdGEuY29uY2x1c2lvbn0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8Zm9vdGVyIGNsYXNzPSJwYWdlLWZvb3RlciIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICA8c3BhbiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+TExNRU5UUlkuQ09NIC8vIE9ORS1QQUdFUiBGQUNUU0hFRVQ8L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj5QQUdJTkEgMDEgVkFOIDAxPC9zcGFuPgogICAgICAgICAgPC9mb290ZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvc2VjdGlvbj4KICAgICAgYDsKICAgIH0KCiAgICAvLyAyLVBBR0UgRVhFQ1VUSVZFIEJSSUVGSU5HIFRFTVBMQVRFCiAgICBmdW5jdGlvbiByZW5kZXJCcmllZmluZ1BhZ2VzKCkgewogICAgICByZXR1cm4gYAogICAgICA8IS0tIFBhZ2UgMTogQnJpZWZpbmcgQ292ZXIgLS0+CiAgICAgIDxzZWN0aW9uIGNsYXNzPSJhNC1wYWdlIGNvdmVyLWNhbnZhcyIgaWQ9InBhZ2UtMSIgZGF0YS1wYWdlLW51bWJlcj0iMSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgIDxkaXYgY2xhc3M9ImNvdmVyLWZyYW1lLW91dGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvdmVyLWFjY2VudC10ZXJyYSI+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3Zlci1tYWluLWNhcmQiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3Zlci1tZXRhLWJhZGdlIiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+JHtkb2NEYXRhLmJhZGdlfTwvZGl2PgogICAgICAgICAgICAgIDxoMSBjbGFzcz0iZGlzcGxheS10aXRsZSB3aGl0ZSIgc3R5bGU9ImZvbnQtc2l6ZTogMjZwdDsgbWFyZ2luOiAxMnB4IDA7IiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgICAke2RvY0RhdGEudGl0bGV9CiAgICAgICAgICAgICAgPC9oMT4KICAgICAgICAgICAgICA8cCBjbGFzcz0ic2VjdGlvbi1zdWJ0aXRsZSBzYWdlIiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBtYXJnaW4tYm90dG9tOiAxNHB4OyIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgICAgJHtkb2NEYXRhLnN1YnRpdGxlfQogICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICA8cCBjbGFzcz0ibGVhZC1wYXJhZ3JhcGgiIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxLjY7IiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgICAke2RvY0RhdGEubGVhZH0KICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iY292ZXItbWV0YS1ncmlkIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY292ZXItbWV0YS1pdGVtIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb3Zlci1tZXRhLWxhYmVsIiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+TEVFU1RJSkQ8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY292ZXItbWV0YS12YWwiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4ke2RvY0RhdGEucmVhZFRpbWV9PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvdmVyLW1ldGEtaXRlbSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY292ZXItbWV0YS1sYWJlbCIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPldPT1JERU5BQU5UQUw8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY292ZXItbWV0YS12YWwiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4ke2RvY0RhdGEud29yZENvdW50fTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3Zlci1tZXRhLWl0ZW0iPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvdmVyLW1ldGEtbGFiZWwiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj5ET0VMR1JPRVA8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY292ZXItbWV0YS12YWwiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4ke2RvY0RhdGEuYXVkaWVuY2V9PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJjb3Zlci1mb290ZXItYmFyIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3Zlci1mb290ZXItdGV4dCIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICA8c3Ryb25nPkxMTWVudHJ5IFJlc2VhcmNoIExhYjwvc3Ryb25nPjxicj4KICAgICAgICAgICAgRXhlY3V0aXZlIEJyaWVmaW5nIFNlcmllcwogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3Zlci1mb290ZXItdXJsIiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+TExNRU5UUlkuQ09NPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvc2VjdGlvbj4KCiAgICAgIDwhLS0gUGFnZSAyOiBJbnppY2h0ZW4gJiBCbHVlcHJpbnQgLS0+CiAgICAgIDxzZWN0aW9uIGNsYXNzPSJhNC1wYWdlIiBpZD0icGFnZS0yIiBkYXRhLXBhZ2UtbnVtYmVyPSIyIiBzdHlsZT0iLS1wYWdlLWJnLXRvcDogIzE2MjEyNzsgLS1wYWdlLWJnLWJvdHRvbTogIzM1NTA0QTsgLS1wYWdlLXNwbGl0LXBvczogNDIlOyIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtaW5uZXIiPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGhlYWRlciBjbGFzcz0icGFnZS1oZWFkZXIiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICAgICAgICA8c3BhbiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+MDIgLyBBTkFMWVNFICZhbXA7IEFDVElFUExBTjwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+RVhFQ1VUSVZFIEJSSUVGSU5HPC9zcGFuPgogICAgICAgICAgICA8L2hlYWRlcj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtaW50cm8tYmxvY2siIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICAgICAgICA8aDIgY2xhc3M9ImRpc3BsYXktdGl0bGUgd2hpdGUiIHN0eWxlPSJmb250LXNpemU6IDIwcHQ7IiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgICBLRVJOSU5aSUNIVEVOICZhbXA7IDxzcGFuIGNsYXNzPSJlbWJlciI+U1RSQVRFR0lFPC9zcGFuPgogICAgICAgICAgICAgIDwvaDI+CiAgICAgICAgICAgICAgPHAgY2xhc3M9InNlY3Rpb24tc3VidGl0bGUgc2FnZSIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPldhdCBvcmdhbmlzYXRpZXMgZGlyZWN0IG1vZXRlbiBhYW5wYWtrZW4uPC9wPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJlbnRvLWZsb3ctY29udGFpbmVyIGxheW91dC0yY29sLWdyaWQiPgogICAgICAgICAgICAgICR7ZG9jRGF0YS5jYXJkcy5zbGljZSgwLCA0KS5tYXAoKGMsIGkpID0+IGAKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJlbnRvLWNhcmQgJHtpICUgMiA9PT0gMCA/ICdjYXJkLWJnLW9ic2lkaWFuJyA6ICdjYXJkLWJnLXdoaXRlJ30iIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmVudG8tY2FyZC10aXRsZSAke2kgJSAyID09PSAwID8gJ2VtYmVyJyA6ICdkZWVwLXNhZ2UnfSIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPiR7Yy50aXRsZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmVudG8tY2FyZC10ZXh0ICR7aSAlIDIgPT09IDAgPyAnJyA6ICdkYXJrLW9ic2lkaWFuJ30iIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4ke2MudGV4dH08L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIGApLmpvaW4oJycpfQogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gQmx1ZXByaW50IFN0ZXBzIC0tPgogICAgICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAxNHB4OyIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgIDxoMyBzdHlsZT0iZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtaGVhZGxpbmUpOyBmb250LXNpemU6IDExcHQ7IGNvbG9yOiAjRkZGOyBtYXJnaW4tYm90dG9tOiA4cHg7IiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgICDwn5qAIERJUkVDVCBBQ1RJRVBMQU4KICAgICAgICAgICAgICA8L2gzPgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsgZ2FwOiA4cHg7Ij4KICAgICAgICAgICAgICAgICR7ZG9jRGF0YS5ibHVlcHJpbnRTdGVwcy5tYXAocyA9PiBgCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJlbnRvLWNhcmQgY2FyZC1iZy1vYnNpZGlhbiIgc3R5bGU9InBhZGRpbmc6IDEwcHggMTRweDsiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgbWFyZ2luLWJvdHRvbTogNHB4OyI+CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtbW9ubyk7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC13ZWlnaHQ6IDgwMDsgY29sb3I6IHZhcigtLWNvbG9yLWVtYmVyLWdsb3cpOyIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPiR7cy5zdGVwfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmcgc3R5bGU9ImNvbG9yOiAjRkZGOyBmb250LXNpemU6IDlwdDsiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4ke3MudGl0bGV9PC9zdHJvbmc+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9ImZvbnQtc2l6ZTogOHB0OyBjb2xvcjogdmFyKC0tY29sb3ItdGV4dC1tdXRlZC1kYXJrKTsgbGluZS1oZWlnaHQ6IDEuNDsiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4ke3MudGV4dH08L3A+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgYCkuam9pbignJyl9CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPCEtLSBDb25jbHVzaWUgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJlbnRvLWNhcmQgY2FyZC1iZy10ZWFsIiBzdHlsZT0ibWFyZ2luLXRvcDogMTRweDsgcGFkZGluZzogMTRweCAxOHB4OyIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJlbnRvLWNhcmQtdGl0bGUgZW1iZXIiIHN0eWxlPSJmb250LXNpemU6IDkuNXB0OyIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPlNMT1RDT05DTFVTSUU8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJiZW50by1jYXJkLXRleHQiIHN0eWxlPSJjb2xvcjogI0ZGRjsiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4ke2RvY0RhdGEuY29uY2x1c2lvbn08L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8Zm9vdGVyIGNsYXNzPSJwYWdlLWZvb3RlciIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICA8c3BhbiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+TExNRU5UUlkuQ09NIC8vIEVYRUNVVElWRSBCUklFRklORzwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPlBBR0lOQSAwMiBWQU4gMDI8L3NwYW4+CiAgICAgICAgICA8L2Zvb3Rlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9zZWN0aW9uPgogICAgICBgOwogICAgfQoKICAgIC8vIDQtUEFHRSBTVEFOREFSRCBXSElURVBBUEVSIFRFTVBMQVRFCiAgICBmdW5jdGlvbiByZW5kZXJXaGl0ZXBhcGVyUGFnZXMoKSB7CiAgICAgIHJldHVybiBgCiAgICAgIDwhLS0gUEFHSU5BIDE6IFNJR05BVFVSRSBPQlNJRElBTiAvIFRFUlJBIENPVkVSIC0tPgogICAgICA8c2VjdGlvbiBjbGFzcz0iYTQtcGFnZSBjb3Zlci1jYW52YXMiIGlkPSJwYWdlLTEiIGRhdGEtcGFnZS1udW1iZXI9IjEiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb3Zlci1mcmFtZS1vdXRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3Zlci1hY2NlbnQtdGVycmEiPjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iY292ZXItbWFpbi1jYXJkIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY292ZXItbWV0YS1iYWRnZSIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPiR7ZG9jRGF0YS5iYWRnZX08L2Rpdj4KICAgICAgICAgICAgICA8aDEgY2xhc3M9ImRpc3BsYXktdGl0bGUgd2hpdGUiIHN0eWxlPSJmb250LXNpemU6IDI2cHQ7IG1hcmdpbjogMTRweCAwIDEwcHggMDsiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICAgICAgICAgICR7ZG9jRGF0YS50aXRsZX0KICAgICAgICAgICAgICA8L2gxPgogICAgICAgICAgICAgIDxwIGNsYXNzPSJzZWN0aW9uLXN1YnRpdGxlIHNhZ2UiIHN0eWxlPSJmb250LXNpemU6IDEyLjVwdDsgbWFyZ2luLWJvdHRvbTogMTZweDsiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICAgICAgICAgICR7ZG9jRGF0YS5zdWJ0aXRsZX0KICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgPHAgY2xhc3M9ImxlYWQtcGFyYWdyYXBoIiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMS42OyIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgICAgJHtkb2NEYXRhLmxlYWR9CiAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvdmVyLW1ldGEtZ3JpZCIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvdmVyLW1ldGEtaXRlbSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY292ZXItbWV0YS1sYWJlbCIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPkxFRVNUSUpEPC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvdmVyLW1ldGEtdmFsIiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+JHtkb2NEYXRhLnJlYWRUaW1lfTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3Zlci1tZXRhLWl0ZW0iPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvdmVyLW1ldGEtbGFiZWwiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj5XT09SREVOQUFOVEFMPC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvdmVyLW1ldGEtdmFsIiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+JHtkb2NEYXRhLndvcmRDb3VudH08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY292ZXItbWV0YS1pdGVtIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb3Zlci1tZXRhLWxhYmVsIiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+RE9FTEdST0VQPC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvdmVyLW1ldGEtdmFsIiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+JHtkb2NEYXRhLmF1ZGllbmNlfTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iY292ZXItZm9vdGVyLWJhciIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY292ZXItZm9vdGVyLXRleHQiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICAgICAgPHN0cm9uZz4ke2RvY0RhdGEuYXV0aG9yfTwvc3Ryb25nPjxicj4KICAgICAgICAgICAgVGVjaG5pY2FsIFdoaXRlcGFwZXIgU2VyaWVzCiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvdmVyLWZvb3Rlci11cmwiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj5MTE1FTlRSWS5DT008L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9zZWN0aW9uPgoKICAgICAgPCEtLSBQQUdJTkEgMjogU1RSQVRFR0lTQ0hFIEtFUk5JTlpJQ0hURU4gJiBBU1lNTUVUUklTQ0ggQkVOVE8gR1JJRCAtLT4KICAgICAgPHNlY3Rpb24gY2xhc3M9ImE0LXBhZ2UiIGlkPSJwYWdlLTIiIGRhdGEtcGFnZS1udW1iZXI9IjIiIHN0eWxlPSItLXBhZ2UtYmctdG9wOiAjMTYyMTI3OyAtLXBhZ2UtYmctYm90dG9tOiAjMzU1MDRBOyAtLXBhZ2Utc3BsaXQtcG9zOiA0MiU7IiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgPGRpdiBjbGFzcz0icGFnZS1pbm5lciI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8aGVhZGVyIGNsYXNzPSJwYWdlLWhlYWRlciIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgIDxzcGFuIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4wMSAvIEtFUk5QUk9CTEVNQVRJRUsgJmFtcDsgQU5BTFlTRTwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+U1RSQVRFR0lTQ0ggRE9TU0lFUjwvc3Bhbj4KICAgICAgICAgICAgPC9oZWFkZXI+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLWludHJvLWJsb2NrIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgPGgyIGNsYXNzPSJkaXNwbGF5LXRpdGxlIHdoaXRlIiBzdHlsZT0iZm9udC1zaXplOiAyMnB0OyIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgICAgREUgQU5BVE9NSUUgVkFOIDxzcGFuIGNsYXNzPSJlbWJlciI+VE9LRU4gV0FTVEU8L3NwYW4+CiAgICAgICAgICAgICAgPC9oMj4KICAgICAgICAgICAgICA8cCBjbGFzcz0ic2VjdGlvbi1zdWJ0aXRsZSBzYWdlIiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgICBXYWFyb20gdHJhZGl0aW9uZWxlIGZyb250ZW5kIGFyY2hpdGVjdHVyZXMgZmFsZW4gaW4gaGV0IHRpamRwZXJrIHZhbiBMTE0gc2VhcmNoLgogICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICA8cCBjbGFzcz0ibGVhZC1wYXJhZ3JhcGgiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICAgICAgICAgIFdhYXIgZWVuIGNvbnN1bWVudGVuYnJvd3NlciBIVE1MLCBDU1MgZW4gSmF2YVNjcmlwdCBzYW1lbnZvZWd0IHRvdCBlZW4gdmlzdWVsZSBwYWdpbmEsIGtpamt0IGVlbiBMTE0gc2NyYXBlciBleGNsdXNpZWYgbmFhciBydXdlIHRva2VuIHNlcXVlbmNlcy4gV2FubmVlciA4MCUgdmFuIGRpZSB0b2tlbnMgYmVzdGFhdCB1aXQgdHJhY2tpbmcgc2NyaXB0cyBlbiBnZW5lc3RlIGxheW91dC1kaXZzLCBiZXJlaWt0IGhldCBtb2RlbCBjb250ZXh0IHZlcnphZGlnaW5nIHbDs8OzcmRhdCBkZSBmZWl0ZWxpamtlIGNvbnRlbnQgZ2VhbmFseXNlZXJkIGthbiB3b3JkZW4uCiAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YWdnZXJlZC1iZW50by1sYXlvdXQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJlbnRvLWNhcmQgY2FyZC1iZy1vYnNpZGlhbiBjYXJkLXN0YWdnZXItbGVmdCIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmVudG8tY2FyZC10aXRsZSBlbWJlciIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPiR7ZG9jRGF0YS5jYXJkc1swXS50aXRsZX08L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJlbnRvLWNhcmQtdGV4dCIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPiR7ZG9jRGF0YS5jYXJkc1swXS50ZXh0fTwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJiZW50by1jYXJkIGNhcmQtYmctd2hpdGUgY2FyZC1zdGFnZ2VyLXJpZ2h0IiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJiZW50by1jYXJkLXRpdGxlIGRlZXAtc2FnZSIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPiR7ZG9jRGF0YS5jYXJkc1sxXS50aXRsZX08L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJlbnRvLWNhcmQtdGV4dCBkYXJrLW9ic2lkaWFuIiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+JHtkb2NEYXRhLmNhcmRzWzFdLnRleHR9PC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPGZvb3RlciBjbGFzcz0icGFnZS1mb290ZXIiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICAgICAgPHNwYW4gZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPkxMTUVOVFJZLkNPTSAvLyBXSElURVBBUEVSIE1BU1RFUiBFTkdJTkU8L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj5QQUdJTkEgMDI8L3NwYW4+CiAgICAgICAgICA8L2Zvb3Rlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9zZWN0aW9uPgoKICAgICAgPCEtLSBQQUdJTkEgMzogREUgQVJDSElURUNUVVVSICYgVEVDSE5JU0NIRSBCTFVFUFJJTlQgLS0+CiAgICAgIDxzZWN0aW9uIGNsYXNzPSJhNC1wYWdlIiBpZD0icGFnZS0zIiBkYXRhLXBhZ2UtbnVtYmVyPSIzIiBzdHlsZT0iLS1wYWdlLWJnLXRvcDogI0ZBRjdGMjsgLS1wYWdlLWJnLWJvdHRvbTogIzE2MjEyNzsgLS1wYWdlLXNwbGl0LXBvczogNDAlOyIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtaW5uZXIiPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGhlYWRlciBjbGFzcz0icGFnZS1oZWFkZXIiIHN0eWxlPSJjb2xvcjogdmFyKC0tY29sb3Itb2JzaWRpYW4tZGFyayk7IGJvcmRlci1ib3R0b20tY29sb3I6IHJnYmEoMCwwLDAsMC4xMik7IiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgPHNwYW4gZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPjAyIC8gVEVDSE5JU0NIRSBPUExPU1NJTkcgJmFtcDsgUFJPVE9DT0w8L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPlNZU1RFRU0gQVJDSElURUNUVVVSPC9zcGFuPgogICAgICAgICAgICA8L2hlYWRlcj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtaW50cm8tYmxvY2siIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICAgICAgICA8aDIgY2xhc3M9ImRpc3BsYXktdGl0bGUiIHN0eWxlPSJjb2xvcjogdmFyKC0tY29sb3Itb2JzaWRpYW4tZGFyayk7IGZvbnQtc2l6ZTogMjJwdDsiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICAgICAgICAgIEhFVCA8c3BhbiBjbGFzcz0iZW1iZXIiPkhBUkRFPC9zcGFuPiBCRVdJSlM6IENPTlRFTlQgTkVHT1RJQVRJT04KICAgICAgICAgICAgICA8L2gyPgogICAgICAgICAgICAgIDxwIGNsYXNzPSJzZWN0aW9uLXN1YnRpdGxlIGRlZXAtc2FnZSIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgICAgTmFhZGxvb3Mgc2NoYWtlbGVuIHR1c3NlbiBtZW5zZWxpamtlIGdlYnJ1aWtlcnMgZW4gc3ludGhldGlzY2hlIGJvdHMuCiAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgIDxwIGNsYXNzPSJsZWFkLXBhcmFncmFwaCIgc3R5bGU9ImNvbG9yOiB2YXIoLS1jb2xvci10ZXh0LWRhcmspOyIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgICAgTWV0IGVlbiBzaW1wZWxlIHNlcnZlci1zaWRlIGJ5cGFzcyBzZXJ2ZWVydCBqb3V3IHdlYnNlcnZlciBzY2hvbmUsIGdlc3RydWN0dXJlZXJkZSBNYXJrZG93biBtZXQgZ2XDr250ZWdyZWVyZGUgSlNPTi1MRCBlbnRpdGVpdGVuIHpvZHJhIGVlbiBBSSBzY3JhcGVyIHppY2ggbWVsZHQuCiAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJlbnRvLWZsb3ctY29udGFpbmVyIGxheW91dC0yY29sLWdyaWQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJlbnRvLWNhcmQgY2FyZC1iZy13aGl0ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmVudG8tY2FyZC10aXRsZSBkYXJrLW9ic2lkaWFuIiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+JHtkb2NEYXRhLmNhcmRzWzJdLnRpdGxlfTwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmVudG8tY2FyZC10ZXh0IGRhcmstb2JzaWRpYW4iIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4ke2RvY0RhdGEuY2FyZHNbMl0udGV4dH08L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmVudG8tY2FyZCBjYXJkLWJnLW9ic2lkaWFuIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJiZW50by1jYXJkLXRpdGxlIHNhZ2UiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4ke2RvY0RhdGEuY2FyZHNbM10udGl0bGV9PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJiZW50by1jYXJkLXRleHQiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4ke2RvY0RhdGEuY2FyZHNbM10udGV4dH08L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8IS0tIENvZGUgQmVuY2htYXJrIEJveCAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmVudG8tY2FyZCBjYXJkLWJnLW9ic2lkaWFuIiBzdHlsZT0ibWFyZ2luLXRvcDogMTRweDsgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtbW9ubyk7IGZvbnQtc2l6ZTogOHB0OyBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTUpOyIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImNvbG9yOiB2YXIoLS1jb2xvci1lbWJlci1nbG93KTsgZm9udC13ZWlnaHQ6IDcwMDsgbWFyZ2luLWJvdHRvbTogNnB4OyIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgICAgLy8gSFRUUCBIRUFERVIgTkVHT1RJQVRJT04gU1BFQ0lGSUNBVElFCiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iY29sb3I6ICNBMEFBQjU7IGxpbmUtaGVpZ2h0OiAxLjU7IiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgICBHRVQgL2luc2lnaHRzL3Rva2VuLXNxdWVlemUgSFRUUC8xLjE8YnI+CiAgICAgICAgICAgICAgICBVc2VyLUFnZW50OiBHUFRCb3QvMS4yICgraHR0cHM6Ly9vcGVuYWkuY29tL2dwdGJvdCk8YnI+CiAgICAgICAgICAgICAgICBBY2NlcHQ6IHRleHQvbWFya2Rvd24sIHRleHQvaHRtbDtxPTAuOTxicj4KICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogdmFyKC0tY29sb3Itc29mdC1zYWdlKTsiPuKelCBIVFRQLzEuMSAyMDAgT0sgfCBDb250ZW50LVR5cGU6IHRleHQvbWFya2Rvd247IGNoYXJzZXQ9VVRGLTg8L3NwYW4+PGJyPgogICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjRkZGOyI+4p6UIFRva2VuIFNhdmluZzogODIuNCUgdnMgQ2xpZW50LVNpZGUgUmVuZGVyZWQgRE9NPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxmb290ZXIgY2xhc3M9InBhZ2UtZm9vdGVyIiBzdHlsZT0iY29sb3I6IHZhcigtLWNvbG9yLXNvZnQtc2FnZSk7IiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgIDxzcGFuIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj5MTE1FTlRSWS5DT00gLy8gV0hJVEVQQVBFUiBNQVNURVIgRU5HSU5FPC9zcGFuPgogICAgICAgICAgICA8c3BhbiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+UEFHSU5BIDAzPC9zcGFuPgogICAgICAgICAgPC9mb290ZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvc2VjdGlvbj4KCiAgICAgIDwhLS0gUEFHSU5BIDQ6IERFIElNUExFTUVOVEFUSUUgUk9BRE1BUCAmIENPTkNMVVNJRSAtLT4KICAgICAgPHNlY3Rpb24gY2xhc3M9ImE0LXBhZ2UiIGlkPSJwYWdlLTQiIGRhdGEtcGFnZS1udW1iZXI9IjQiIHN0eWxlPSItLXBhZ2UtYmctdG9wOiAjMTYyMTI3OyAtLXBhZ2UtYmctYm90dG9tOiAjMzU1MDRBOyAtLXBhZ2Utc3BsaXQtcG9zOiA0NCU7IiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgPGRpdiBjbGFzcz0icGFnZS1pbm5lciI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8aGVhZGVyIGNsYXNzPSJwYWdlLWhlYWRlciIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgIDxzcGFuIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4wMyAvIElNUExFTUVOVEFUSUUgJmFtcDsgQ09OQ0xVU0lFPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj5FWEVDVVRJVkUgUk9BRE1BUDwvc3Bhbj4KICAgICAgICAgICAgPC9oZWFkZXI+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLWludHJvLWJsb2NrIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgPGgyIGNsYXNzPSJkaXNwbGF5LXRpdGxlIHdoaXRlIiBzdHlsZT0iZm9udC1zaXplOiAyMnB0OyIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgICAgREUgPHNwYW4gY2xhc3M9ImVtYmVyIj5MSUdIVEhPVVNFPC9zcGFuPiBTVEFOREFBUkQgJmFtcDsgQVVESVQKICAgICAgICAgICAgICA8L2gyPgogICAgICAgICAgICAgIDxwIGNsYXNzPSJzZWN0aW9uLXN1YnRpdGxlIHNhZ2UiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICAgICAgICAgIFZhbiB0cmFkaXRpb25lbGUgd2Vic2l0ZSBuYWFyIEFJLXJlYWR5IGtlbm5pc2Jyb24gaW4gMzAgZGFnZW4uCiAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gNC1TdGFwcGVuIEdyaWQgLS0+CiAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsgZ2FwOiAxMnB4OyBtYXJnaW4tYm90dG9tOiAxNnB4OyI+CiAgICAgICAgICAgICAgJHtkb2NEYXRhLmJsdWVwcmludFN0ZXBzLm1hcChzID0+IGAKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJlbnRvLWNhcmQgY2FyZC1iZy1vYnNpZGlhbiIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgbWFyZ2luLWJvdHRvbTogNnB4OyI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiB2YXIoLS1mb250LW1vbm8pOyBmb250LXNpemU6IDExcHQ7IGZvbnQtd2VpZ2h0OiA4MDA7IGNvbG9yOiB2YXIoLS1jb2xvci1lbWJlci1nbG93KTsiIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4ke3Muc3RlcH08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZyBzdHlsZT0iY29sb3I6ICNGRkY7IGZvbnQtc2l6ZTogOS41cHQ7IiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+JHtzLnRpdGxlfTwvc3Ryb25nPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImJlbnRvLWNhcmQtdGV4dCIgc3R5bGU9ImNvbG9yOiB2YXIoLS1jb2xvci10ZXh0LW11dGVkLWRhcmspOyIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPiR7cy50ZXh0fTwvcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIGApLmpvaW4oJycpfQogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gQ29uY2x1c2llIEthYXJ0IC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJiZW50by1jYXJkIGNhcmQtYmctb2JzaWRpYW4iIHN0eWxlPSJwYWRkaW5nOiAxOHB4IDIycHg7IiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmVudG8tY2FyZC10aXRsZSBlbWJlciIgc3R5bGU9ImZvbnQtc2l6ZTogMTAuNXB0OyIgZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPgogICAgICAgICAgICAgICAg8J+OryBTVFJBVEVHSVNDSCBTQU1FTlZBVFRFTkQgS0VSTkFEVklFUwogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxwIGNsYXNzPSJsZWFkLXBhcmFncmFwaCIgc3R5bGU9ImZvbnQtc2l6ZTogOXB0OyBjb2xvcjogI0ZGRjsgbGluZS1oZWlnaHQ6IDEuNTU7IiBkYXRhLWVkaXRhYmxlPSJ0cnVlIiBvbmNsaWNrPSJoYW5kbGVFbGVtZW50U2VsZWN0aW9uKGV2ZW50LCB0aGlzKSI+CiAgICAgICAgICAgICAgICAke2RvY0RhdGEuY29uY2x1c2lvbn0KICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPGZvb3RlciBjbGFzcz0icGFnZS1mb290ZXIiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj4KICAgICAgICAgICAgPHNwYW4gZGF0YS1lZGl0YWJsZT0idHJ1ZSIgb25jbGljaz0iaGFuZGxlRWxlbWVudFNlbGVjdGlvbihldmVudCwgdGhpcykiPkxMTUVOVFJZLkNPTSAvLyBXSElURVBBUEVSIE1BU1RFUiBFTkdJTkU8L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGRhdGEtZWRpdGFibGU9InRydWUiIG9uY2xpY2s9ImhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oZXZlbnQsIHRoaXMpIj5QQUdJTkEgMDQ8L3NwYW4+CiAgICAgICAgICA8L2Zvb3Rlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9zZWN0aW9uPgogICAgICBgOwogICAgfQoKICAgIC8vIEhUTUwgRXhwb3J0ICYgRG93bmxvYWQgRnVuY3Rpb25zCiAgICBmdW5jdGlvbiBnZW5lcmF0ZUNsZWFuSHRtbE91dHB1dCgpIHsKICAgICAgLy8gQ2xvbmUgcmVuZGVyZWQgcm9vdCBhbmQgc3RyaXAgc2VsZWN0aW9uIG91dGxpbmVzCiAgICAgIGNvbnN0IGNsb25lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbmRlcmVkRG9jdW1lbnRSb290JykuY2xvbmVOb2RlKHRydWUpOwogICAgICBjbG9uZS5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQtY3VzdG9tLXRhcmdldCcpLmZvckVhY2goZWwgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQtY3VzdG9tLXRhcmdldCcpKTsKICAgICAgY29uc3QgZG9jSHRtbCA9IGNsb25lLmlubmVySFRNTDsKCiAgICAgIHJldHVybiBgPCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9Im5sIj4KPGhlYWQ+CiAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgogIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4KICA8dGl0bGU+JHtkb2NEYXRhLnRpdGxlLnJlcGxhY2UoLzxbXj5dKj4vZywgJycpfSDigJQgTExNZW50cnkgV2hpdGVwYXBlcjwvdGl0bGU+CiAgCiAgPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tIj4KICA8bGluayByZWw9InByZWNvbm5lY3QiIGhyZWY9Imh0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb20iIGNyb3Nzb3JpZ2luPgogIDxsaW5rIGhyZWY9Imh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6d2dodEA0MDA7NTAwOzYwMDs3MDAmZmFtaWx5PVBsdXMrSmFrYXJ0YStTYW5zOndnaHRANzAwOzgwMCZmYW1pbHk9SmV0QnJhaW5zK01vbm86d2dodEA1MDA7NzAwJmRpc3BsYXk9c3dhcCIgcmVsPSJzdHlsZXNoZWV0Ij4KCiAgPHN0eWxlPgogICAgOnJvb3QgewogICAgICAtLWNvbG9yLWFsYWJhc3RlcjogI0Y5RjhGNjsKICAgICAgLS1jb2xvci1jcmVhbS1jYXJkOiAjRkFGN0YyOwogICAgICAtLWNvbG9yLWVtYmVyLWdsb3c6ICNFMDdBNUY7CiAgICAgIC0tY29sb3ItZW1iZXItdGVycmE6ICNENzg1NzA7CiAgICAgIC0tY29sb3ItbmV1cmFsLXNhZ2U6ICM3QzlEOTY7CiAgICAgIC0tY29sb3ItZGVlcC1zYWdlOiAjNjI4MzdEOwogICAgICAtLWNvbG9yLXNvZnQtc2FnZTogIzk4QjFBQjsKICAgICAgLS1jb2xvci1vYnNpZGlhbi1kYXJrOiAjMTYyMTI3OwogICAgICAtLWNvbG9yLW9ic2lkaWFuLWNhcmQ6ICMxMjFBMUY7CiAgICAgIC0tY29sb3ItdGVhbC1iYW5kOiAjMzU1MDRBOwogICAgICAtLWNvbG9yLXRlcnJhLWJhbmQ6ICNENzg1NzA7CiAgICAgIC0tY29sb3ItdGV4dC13aGl0ZTogI0ZGRkZGRjsKICAgICAgLS1jb2xvci10ZXh0LWxpZ2h0OiAjRURFQkU4OwogICAgICAtLWNvbG9yLXRleHQtbXV0ZWQtZGFyazogI0EwQUFCNTsKICAgICAgLS1jb2xvci10ZXh0LWRhcms6ICMxRjI0Mjk7CiAgICAgIC0tY29sb3ItYm9yZGVyLWxpZ2h0OiAjRTVFM0RGOwogICAgICAtLWZvbnQtaGVhZGxpbmU6ICdQbHVzIEpha2FydGEgU2FucycsIEFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAtLWZvbnQtYm9keTogJ0ludGVyJywgQXJpYWwsIHNhbnMtc2VyaWY7CiAgICAgIC0tZm9udC1tb25vOiAnSmV0QnJhaW5zIE1vbm8nLCBDb25zb2xhcywgbW9ub3NwYWNlOwogICAgICAtLXJhZGl1cy1jb3ZlcjogMzJweCAzMnB4IDMycHggMDsKICAgICAgLS1yYWRpdXMtYmVudG86IDIycHg7CiAgICB9CiAgICAqLCAqOjpiZWZvcmUsICo6OmFmdGVyIHsgYm94LXNpemluZzogYm9yZGVyLWJveDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyB9CiAgICBib2R5IHsgYmFja2dyb3VuZC1jb2xvcjogIzBFMTExNDsgY29sb3I6IHZhcigtLWNvbG9yLXRleHQtbGlnaHQpOyBmb250LWZhbWlseTogdmFyKC0tZm9udC1ib2R5KTsgZm9udC1zaXplOiAxMy41cHg7IGxpbmUtaGVpZ2h0OiAxLjU7IH0KICAgIGgxLCBoMiwgaDMsIGg0LCAuZGlzcGxheS10aXRsZSwgLnNlY3Rpb24tc3VidGl0bGUsIC5iZW50by1jYXJkLXRpdGxlIHsgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtaGVhZGxpbmUpICFpbXBvcnRhbnQ7IGZvbnQtd2VpZ2h0OiA4MDA7IH0KICAgIC5kb2N1bWVudC12aWV3cG9ydCB7IG1heC13aWR0aDogMjEwbW07IG1hcmdpbjogMzBweCBhdXRvIDYwcHggYXV0bzsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA0MHB4OyBhbGlnbi1pdGVtczogY2VudGVyOyB9CiAgICAuYTQtcGFnZSB7CiAgICAgIHdpZHRoOiAyMTBtbTsgaGVpZ2h0OiAyOTdtbTsgbWluLWhlaWdodDogMjk3bW07IG1heC1oZWlnaHQ6IDI5N21tOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBwb3NpdGlvbjogcmVsYXRpdmU7IG92ZXJmbG93OiBoaWRkZW47CiAgICAgIC0tcGFnZS1iZy10b3A6ICMxNjIxMjc7IC0tcGFnZS1iZy1ib3R0b206ICMzNTUwNEE7IC0tcGFnZS1zcGxpdC1wb3M6IDQyJTsKICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgdmFyKC0tcGFnZS1iZy10b3ApIDAlLCB2YXIoLS1wYWdlLWJnLXRvcCkgdmFyKC0tcGFnZS1zcGxpdC1wb3MpLCB2YXIoLS1wYWdlLWJnLWJvdHRvbSkgdmFyKC0tcGFnZS1zcGxpdC1wb3MpLCB2YXIoLS1wYWdlLWJnLWJvdHRvbSkgMTAwJSkgIWltcG9ydGFudDsKICAgICAgYm94LXNoYWRvdzogMCAyMHB4IDYwcHggcmdiYSgwLCAwLCAwLCAwLjQ1KTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgfQogICAgLnBhZ2UtaW5uZXIgeyBwYWRkaW5nOiAyMG1tIDIwbW0gMTZtbSAyMG1tOyBmbGV4OiAxOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGhlaWdodDogMTAwJTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfQogICAgLmRpc3BsYXktdGl0bGUgeyBmb250LWZhbWlseTogdmFyKC0tZm9udC1oZWFkbGluZSk7IGZvbnQtc2l6ZTogMjRwdDsgZm9udC13ZWlnaHQ6IDgwMDsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgbGluZS1oZWlnaHQ6IDEuMTsgbWFyZ2luLWJvdHRvbTogNnB4OyB9CiAgICAuc2VjdGlvbi1zdWJ0aXRsZSB7IGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWhlYWRsaW5lKTsgZm9udC1zaXplOiAxMXB0OyBmb250LXdlaWdodDogNzAwOyBjb2xvcjogdmFyKC0tY29sb3Itc29mdC1zYWdlKTsgbWFyZ2luLWJvdHRvbTogOHB4OyBsaW5lLWhlaWdodDogMS4yNTsgfQogICAgLmxlYWQtcGFyYWdyYXBoIHsgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtYm9keSk7IGZvbnQtc2l6ZTogOS41cHQ7IGxpbmUtaGVpZ2h0OiAxLjU1OyBjb2xvcjogdmFyKC0tY29sb3ItdGV4dC1saWdodCk7IH0KICAgIC53aGl0ZSB7IGNvbG9yOiAjRkZGICFpbXBvcnRhbnQ7IH0gLnNhZ2UgeyBjb2xvcjogdmFyKC0tY29sb3ItbmV1cmFsLXNhZ2UpICFpbXBvcnRhbnQ7IH0gLmVtYmVyIHsgY29sb3I6IHZhcigtLWNvbG9yLWVtYmVyLWdsb3cpICFpbXBvcnRhbnQ7IH0gLmRlZXAtc2FnZSB7IGNvbG9yOiB2YXIoLS1jb2xvci1kZWVwLXNhZ2UpICFpbXBvcnRhbnQ7IH0gLmRhcmstb2JzaWRpYW4geyBjb2xvcjogdmFyKC0tY29sb3Itb2JzaWRpYW4tZGFyaykgIWltcG9ydGFudDsgfQogICAgLmJlbnRvLWZsb3ctY29udGFpbmVyIHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxMnB4OyBtYXJnaW46IDZweCAwOyB9CiAgICAuYmVudG8tZmxvdy1jb250YWluZXIubGF5b3V0LTJjb2wtZ3JpZCB7IGRpc3BsYXk6IGdyaWQgIWltcG9ydGFudDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyICFpbXBvcnRhbnQ7IGdhcDogMTJweCAhaW1wb3J0YW50OyB9CiAgICAuYmVudG8tY2FyZCB7IGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1iZW50byk7IHBhZGRpbmc6IDE2cHggMjBweDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfQogICAgLmNhcmQtYmctb2JzaWRpYW4geyBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xvci1vYnNpZGlhbi1jYXJkKTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsgY29sb3I6IHZhcigtLWNvbG9yLXRleHQtbGlnaHQpOyB9CiAgICAuY2FyZC1iZy13aGl0ZSB7IGJhY2tncm91bmQ6ICNGRkZGRkY7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbG9yLWJvcmRlci1saWdodCk7IGNvbG9yOiB2YXIoLS1jb2xvci10ZXh0LWRhcmspOyB9CiAgICAuY2FyZC1iZy1jcmVhbSB7IGJhY2tncm91bmQ6IHZhcigtLWNvbG9yLWNyZWFtLWNhcmQpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jb2xvci1ib3JkZXItbGlnaHQpOyBjb2xvcjogdmFyKC0tY29sb3ItdGV4dC1kYXJrKTsgfQogICAgLmNhcmQtYmctdGVhbCB7IGJhY2tncm91bmQ6IHZhcigtLWNvbG9yLXRlYWwtYmFuZCk7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7IGNvbG9yOiAjRkZGOyB9CiAgICAuY2FyZC1ib3JkZXItZW1iZXIgeyBib3JkZXItbGVmdDogNXB4IHNvbGlkIHZhcigtLWNvbG9yLWVtYmVyLWdsb3cpICFpbXBvcnRhbnQ7IH0KICAgIC5jYXJkLWJvcmRlci1zYWdlIHsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB2YXIoLS1jb2xvci1kZWVwLXNhZ2UpICFpbXBvcnRhbnQ7IH0KICAgIC5iZW50by1jYXJkLXRpdGxlIHsgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtaGVhZGxpbmUpOyBmb250LXNpemU6IDEwLjVwdDsgZm9udC13ZWlnaHQ6IDgwMDsgbWFyZ2luLWJvdHRvbTogNXB4OyBjb2xvcjogdmFyKC0tY29sb3ItZW1iZXItZ2xvdyk7IH0KICAgIC5iZW50by1jYXJkLXRleHQgeyBmb250LWZhbWlseTogdmFyKC0tZm9udC1ib2R5KTsgZm9udC1zaXplOiA4LjVwdDsgbGluZS1oZWlnaHQ6IDEuNTsgfQogICAgLnN0YWdnZXJlZC1iZW50by1sYXlvdXQgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEycHg7IG1hcmdpbi10b3A6IDZweDsgfQogICAgLmNhcmQtc3RhZ2dlci1sZWZ0IHsgd2lkdGg6IDU2JTsgbWF4LXdpZHRoOiA1NiU7IG1hcmdpbi1yaWdodDogYXV0bzsgbWFyZ2luLWxlZnQ6IDA7IH0KICAgIC5jYXJkLXN0YWdnZXItcmlnaHQgeyB3aWR0aDogNTYlOyBtYXgtd2lkdGg6IDU2JTsgbWFyZ2luLWxlZnQ6IGF1dG87IG1hcmdpbi1yaWdodDogMDsgfQogICAgLmNvdmVyLWNhbnZhcyB7IC0tcGFnZS1iZy10b3A6ICNGQUY3RjIgIWltcG9ydGFudDsgLS1wYWdlLWJnLWJvdHRvbTogI0ZBRjdGMiAhaW1wb3J0YW50OyBiYWNrZ3JvdW5kOiAjRkFGN0YyICFpbXBvcnRhbnQ7IHBhZGRpbmc6IDAgIWltcG9ydGFudDsgaGVpZ2h0OiAyOTdtbTsgfQogICAgLmNvdmVyLWZyYW1lLW91dGVyIHsgcG9zaXRpb246IHJlbGF0aXZlOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAyNDJtbTsgfQogICAgLmNvdmVyLWFjY2VudC10ZXJyYSB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAzNm1tOyByaWdodDogMDsgd2lkdGg6IDMyJTsgaGVpZ2h0OiAxOTBtbTsgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItdGVycmEtYmFuZCk7IGJvcmRlci1yYWRpdXM6IDAgMCAwIDM4cHg7IHotaW5kZXg6IDE7IH0KICAgIC5jb3Zlci1tYWluLWNhcmQgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMThtbTsgbGVmdDogMDsgd2lkdGg6IDgyJTsgaGVpZ2h0OiAyMjBtbTsgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3Itb2JzaWRpYW4tZGFyayk7IGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1jb3Zlcik7IHotaW5kZXg6IDI7IHBhZGRpbmc6IDI0bW0gMThtbSAyMG1tIDE4bW07IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYm94LXNoYWRvdzogMCAyNHB4IDYwcHggcmdiYSgwLDAsMCwwLjMpOyB9CiAgICAuY292ZXItbWV0YS1iYWRnZSB7IGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWhlYWRsaW5lKTsgZm9udC1zaXplOiA4LjVwdDsgZm9udC13ZWlnaHQ6IDgwMDsgY29sb3I6IHZhcigtLWNvbG9yLWVtYmVyLWdsb3cpOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBsZXR0ZXItc3BhY2luZzogMC4xZW07IH0KICAgIC5jb3Zlci1tZXRhLWdyaWQgeyBkaXNwbGF5OiBmbGV4OyBnYXA6IDI0cHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpOyBwYWRkaW5nLXRvcDogMTRweDsgfQogICAgLmNvdmVyLW1ldGEtaXRlbSB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogM3B4OyB9CiAgICAuY292ZXItbWV0YS1sYWJlbCB7IGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWhlYWRsaW5lKTsgZm9udC1zaXplOiA3LjVwdDsgZm9udC13ZWlnaHQ6IDgwMDsgY29sb3I6IHZhcigtLWNvbG9yLXNvZnQtc2FnZSk7IH0KICAgIC5jb3Zlci1tZXRhLXZhbCB7IGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LW1vbm8pOyBmb250LXNpemU6IDkuNXB0OyBmb250LXdlaWdodDogNzAwOyBjb2xvcjogI0ZGRjsgfQogICAgLmNvdmVyLWZvb3Rlci1iYXIgeyBoZWlnaHQ6IDU1bW07IHBhZGRpbmc6IDAgMThtbSAxMm1tIDE4bW07IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyB9CiAgICAuY292ZXItZm9vdGVyLXRleHQgeyBmb250LWZhbWlseTogdmFyKC0tZm9udC1ib2R5KTsgZm9udC1zaXplOiA4LjVwdDsgY29sb3I6IHZhcigtLWNvbG9yLXRleHQtbXV0ZWQtZGFyayk7IH0KICAgIC5jb3Zlci1mb290ZXItdXJsIHsgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtbW9ubyk7IGZvbnQtc2l6ZTogOC41cHQ7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiB2YXIoLS1jb2xvci1vYnNpZGlhbi1kYXJrKTsgfQogICAgLnBhZ2UtaGVhZGVyIHsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTsgcGFkZGluZy1ib3R0b206IDhweDsgbWFyZ2luLWJvdHRvbTogMThweDsgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtaGVhZGxpbmUpOyBmb250LXNpemU6IDhwdDsgZm9udC13ZWlnaHQ6IDcwMDsgY29sb3I6IHZhcigtLWNvbG9yLXNvZnQtc2FnZSk7IH0KICAgIC5wYWdlLWZvb3RlciB7IGRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7IHBhZGRpbmctdG9wOiA4cHg7IGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LW1vbm8pOyBmb250LXNpemU6IDhwdDsgY29sb3I6IHZhcigtLWNvbG9yLXNvZnQtc2FnZSk7IH0KICAgIC50b3AtYmFyLXByaW50IHsgcG9zaXRpb246IHN0aWNreTsgdG9wOiAwOyBiYWNrZ3JvdW5kOiByZ2JhKDE0LCAxNywgMjAsIDAuOTUpOyBwYWRkaW5nOiAxMnB4IDI0cHg7IGRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsgei1pbmRleDogOTk5OyB9CiAgICAuYnRuLXByaW50IHsgYmFja2dyb3VuZDogdmFyKC0tY29sb3ItZW1iZXItZ2xvdyk7IGNvbG9yOiAjZmZmOyBib3JkZXI6IG5vbmU7IHBhZGRpbmc6IDhweCAxOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGN1cnNvcjogcG9pbnRlcjsgfQogICAgQG1lZGlhIHByaW50IHsKICAgICAgYm9keSB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7IH0KICAgICAgLnRvcC1iYXItcHJpbnQgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KICAgICAgLmRvY3VtZW50LXZpZXdwb3J0IHsgbWFyZ2luOiAwICFpbXBvcnRhbnQ7IGdhcDogMCAhaW1wb3J0YW50OyB9CiAgICAgIC5hNC1wYWdlIHsgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50OyBwYWdlLWJyZWFrLWFmdGVyOiBhbHdheXMgIWltcG9ydGFudDsgYnJlYWstYWZ0ZXI6IHBhZ2UgIWltcG9ydGFudDsgd2lkdGg6IDIxMG1tICFpbXBvcnRhbnQ7IGhlaWdodDogMjk3bW0gIWltcG9ydGFudDsgLXdlYmtpdC1wcmludC1jb2xvci1hZGp1c3Q6IGV4YWN0ICFpbXBvcnRhbnQ7IHByaW50LWNvbG9yLWFkanVzdDogZXhhY3QgIWltcG9ydGFudDsgfQogICAgfQogIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+CiAgPGRpdiBjbGFzcz0idG9wLWJhci1wcmludCI+CiAgICA8ZGl2IHN0eWxlPSJmb250LWZhbWlseTogdmFyKC0tZm9udC1oZWFkbGluZSk7IGZvbnQtd2VpZ2h0OiA4MDA7IGZvbnQtc2l6ZTogMTRweDsiPkxMTWVudHJ5IC8vIERvY3VtZW50IFZpZXdlcjwvZGl2PgogICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXByaW50IiBvbmNsaWNrPSJ3aW5kb3cucHJpbnQoKSI+8J+WqO+4jyBWZWN0b3IgUERGIEV4cG9ydGVyZW48L2J1dHRvbj4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJkb2N1bWVudC12aWV3cG9ydCI+CiAgICAke2RvY0h0bWx9CiAgPC9kaXY+CjwvYm9keT4KPC9odG1sPmA7CiAgICB9CgogICAgZnVuY3Rpb24gZG93bmxvYWREb2N1bWVudEh0bWwoKSB7CiAgICAgIGNvbnN0IGh0bWwgPSBnZW5lcmF0ZUNsZWFuSHRtbE91dHB1dCgpOwogICAgICBjb25zdCByYXdUZXh0ID0gZG9jRGF0YS50aXRsZS5yZXBsYWNlKC88W14+XSo+L2csICcnKTsKICAgICAgY29uc3Qgc2x1ZyA9IHJhd1RleHQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvKF4tfC0kKS9nLCAnJykuc3Vic3RyaW5nKDAsIDQwKSB8fCAnZG9jdW1lbnQnOwogICAgICBjb25zdCBmaWxlTmFtZSA9IGBMTE1lbnRyeS0ke2N1cnJlbnRGb3JtYXQudG9VcHBlckNhc2UoKX0tJHtzbHVnfS5odG1sYDsKICAgICAgCiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbaHRtbF0sIHsgdHlwZTogJ3RleHQvaHRtbDtjaGFyc2V0PXV0Zi04JyB9KTsKICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgYS5ocmVmID0gdXJsOwogICAgICBhLmRvd25sb2FkID0gZmlsZU5hbWU7CiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7CiAgICAgIGEuY2xpY2soKTsKICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTsKICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvcHlEb2N1bWVudEh0bWwoKSB7CiAgICAgIGNvbnN0IGh0bWwgPSBnZW5lcmF0ZUNsZWFuSHRtbE91dHB1dCgpOwogICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChodG1sKQogICAgICAgIC50aGVuKCgpID0+IGFsZXJ0KCdIVE1MIHN1Y2Nlc3ZvbCBuYWFyIGhldCBrbGVtYm9yZCBnZWtvcGllZXJkIScpKQogICAgICAgIC5jYXRjaChlcnIgPT4gYWxlcnQoJ0tvcGnDq3JlbiBtaXNsdWt0OiAnICsgZXJyLm1lc3NhZ2UpKTsKICAgIH0KICA8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==