data:text/html;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgICA8dGl0bGU+UFNDIFBhZ2UgVmFsaWRhdG9yPC90aXRsZT4KICAgIDxzdHlsZT4KICAgICAgICAqIHsKICAgICAgICAgICAgbWFyZ2luOiAwOwogICAgICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIH0KCiAgICAgICAgYm9keSB7CiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgQXJpYWwsIHNhbnMtc2VyaWY7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgICAgcGFkZGluZzogMTVweDsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKICAgICAgICB9CgogICAgICAgIC5oZWFkZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjNjY3ZWVhIDAlLCAjNzY0YmEyIDEwMCUpOwogICAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgICAgIHBhZGRpbmc6IDE1cHg7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweCA4cHggMCAwOwogICAgICAgICAgICBtYXJnaW46IC0xNXB4IC0xNXB4IDE1cHggLTE1cHg7CiAgICAgICAgfQoKICAgICAgICAuaGVhZGVyIGgxIHsKICAgICAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgICAgfQoKICAgICAgICAuaGVhZGVyIHAgewogICAgICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgICAgIG9wYWNpdHk6IDAuOTsKICAgICAgICB9CgogICAgICAgIC5zdGF0dXMgewogICAgICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQoKICAgICAgICAuc3RhdHVzLmxvYWRpbmcgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZTNmMmZkOwogICAgICAgICAgICBjb2xvcjogIzE5NzZkMjsKICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjMTk3NmQyOwogICAgICAgIH0KCiAgICAgICAgLnN0YXR1cy5zdWNjZXNzIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2U4ZjVlOTsKICAgICAgICAgICAgY29sb3I6ICMyZTdkMzI7CiAgICAgICAgICAgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgIzRjYWY1MDsKICAgICAgICB9CgogICAgICAgIC5zdGF0dXMud2FybmluZyB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmZmYzZTA7CiAgICAgICAgICAgIGNvbG9yOiAjZTY1MTAwOwogICAgICAgICAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkICNmZjk4MDA7CiAgICAgICAgfQoKICAgICAgICAuc3RhdHVzLmVycm9yIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZmZWJlZTsKICAgICAgICAgICAgY29sb3I6ICNjNjI4Mjg7CiAgICAgICAgICAgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgI2Y0NDMzNjsKICAgICAgICB9CgogICAgICAgIC5zdW1tYXJ5IHsKICAgICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgMWZyKTsKICAgICAgICAgICAgZ2FwOiAxMHB4OwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICAgIH0KCiAgICAgICAgLnN1bW1hcnktY2FyZCB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgYm9yZGVyOiAycHggc29saWQgI2UwZTBlMDsKICAgICAgICB9CgogICAgICAgIC5zdW1tYXJ5LWNhcmQuZXJyb3JzIHsKICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjZjQ0MzM2OwogICAgICAgIH0KCiAgICAgICAgLnN1bW1hcnktY2FyZC53YXJuaW5ncyB7CiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2ZmOTgwMDsKICAgICAgICB9CgogICAgICAgIC5zdW1tYXJ5LWNhcmQucGFzc2VkIHsKICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjNGNhZjUwOwogICAgICAgIH0KCiAgICAgICAgLnN1bW1hcnktY2FyZCAuY291bnQgewogICAgICAgICAgICBmb250LXNpemU6IDI0cHg7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICAgICAgfQoKICAgICAgICAuc3VtbWFyeS1jYXJkLmVycm9ycyAuY291bnQgewogICAgICAgICAgICBjb2xvcjogI2Y0NDMzNjsKICAgICAgICB9CgogICAgICAgIC5zdW1tYXJ5LWNhcmQud2FybmluZ3MgLmNvdW50IHsKICAgICAgICAgICAgY29sb3I6ICNmZjk4MDA7CiAgICAgICAgfQoKICAgICAgICAuc3VtbWFyeS1jYXJkLnBhc3NlZCAuY291bnQgewogICAgICAgICAgICBjb2xvcjogIzRjYWY1MDsKICAgICAgICB9CgogICAgICAgIC5zdW1tYXJ5LWNhcmQgLmxhYmVsIHsKICAgICAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OwogICAgICAgIH0KCiAgICAgICAgLnNlY3Rpb24gewogICAgICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIH0KCiAgICAgICAgLnNlY3Rpb24taGVhZGVyIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2Y4ZjlmYTsKICAgICAgICAgICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTBlMGUwOwogICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICB9CgogICAgICAgIC5zZWN0aW9uLWhlYWRlcjpob3ZlciB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNlOWVjZWY7CiAgICAgICAgfQoKICAgICAgICAuc2VjdGlvbi1oZWFkZXIgLmljb24gewogICAgICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogOHB4OwogICAgICAgIH0KCiAgICAgICAgLnNlY3Rpb24taGVhZGVyIC5iYWRnZSB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNkYzM1NDU7CiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICAgICAgcGFkZGluZzogMnB4IDZweDsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIH0KCiAgICAgICAgLnNlY3Rpb24taGVhZGVyIC5iYWRnZS53YXJuaW5nIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZmYzEwNzsKICAgICAgICAgICAgY29sb3I6ICMwMDA7CiAgICAgICAgfQoKICAgICAgICAuc2VjdGlvbi1jb250ZW50IHsKICAgICAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CgogICAgICAgIC5zZWN0aW9uLmV4cGFuZGVkIC5zZWN0aW9uLWNvbnRlbnQgewogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB9CgogICAgICAgIC5pc3N1ZS1pdGVtIHsKICAgICAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQ7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgICB9CgogICAgICAgIC5pc3N1ZS1pdGVtLmVycm9yIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZmZWJlZTsKICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjZjQ0MzM2OwogICAgICAgIH0KCiAgICAgICAgLmlzc3VlLWl0ZW0ud2FybmluZyB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmZmYzZTA7CiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2ZmOTgwMDsKICAgICAgICB9CgogICAgICAgIC5pc3N1ZS1pdGVtIC5zZXZlcml0eSB7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICAgICAgfQoKICAgICAgICAuaXNzdWUtaXRlbS5lcnJvciAuc2V2ZXJpdHkgewogICAgICAgICAgICBjb2xvcjogI2M2MjgyODsKICAgICAgICB9CgogICAgICAgIC5pc3N1ZS1pdGVtLndhcm5pbmcgLnNldmVyaXR5IHsKICAgICAgICAgICAgY29sb3I6ICNlNjUxMDA7CiAgICAgICAgfQoKICAgICAgICAuY2hlY2staXRlbSB7CiAgICAgICAgICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2YwZjBmMDsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICB9CgogICAgICAgIC5jaGVjay1pdGVtOmxhc3QtY2hpbGQgewogICAgICAgICAgICBib3JkZXItYm90dG9tOiBub25lOwogICAgICAgIH0KCiAgICAgICAgLmNoZWNrLWl0ZW0gLmljb24gewogICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICB9CgogICAgICAgIC5jaGVjay1pdGVtLnBhc3MgLmljb24gewogICAgICAgICAgICBjb2xvcjogIzRjYWY1MDsKICAgICAgICB9CgogICAgICAgIC5jaGVjay1pdGVtIC50ZXh0IHsKICAgICAgICAgICAgZmxleDogMTsKICAgICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIH0KCiAgICAgICAgYnV0dG9uIHsKICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICM2NjdlZWEgMCUsICM3NjRiYTIgMTAwJSk7CiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4xczsKICAgICAgICB9CgogICAgICAgIGJ1dHRvbjpob3ZlciB7CiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDEwMiwgMTI2LCAyMzQsIDAuNCk7CiAgICAgICAgfQoKICAgICAgICBidXR0b246YWN0aXZlIHsKICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICAgIH0KCiAgICAgICAgYnV0dG9uOmRpc2FibGVkIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2NjYzsKICAgICAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgICAgIH0KCiAgICAgICAgLmVtcHR5LXN0YXRlIHsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICBwYWRkaW5nOiA0MHB4IDIwcHg7CiAgICAgICAgICAgIGNvbG9yOiAjNjY2OwogICAgICAgIH0KCiAgICAgICAgLmVtcHR5LXN0YXRlIC5pY29uIHsKICAgICAgICAgICAgZm9udC1zaXplOiA0OHB4OwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgfQogICAgPC9zdHlsZT4KPC9oZWFkPgo8Ym9keT4KICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgPGgxPvCflI0gUGFnZSBWYWxpZGF0b3I8L2gxPgogICAgICAgIDxwPlJlYWwtdGltZSBjb250ZW50IHZhbGlkYXRpb248L3A+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJzdGF0dXMiIGNsYXNzPSJzdGF0dXMgbG9hZGluZyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KICAgICAgICBJbml0aWFsaXppbmcuLi4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9InN1bW1hcnkiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICAgICAgPGRpdiBjbGFzcz0ic3VtbWFyeSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1bW1hcnktY2FyZCBlcnJvcnMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY291bnQiIGlkPSJlcnJvci1jb3VudCI+MDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPkVycm9yczwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3VtbWFyeS1jYXJkIHdhcm5pbmdzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvdW50IiBpZD0id2FybmluZy1jb3VudCI+MDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPldhcm5pbmdzPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdW1tYXJ5LWNhcmQgcGFzc2VkIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvdW50IiBpZD0icGFzcy1jb3VudCI+MDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPlBhc3NlZDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9InJlc3VsdHMiPjwvZGl2PgoKICAgIDxkaXYgaWQ9ImVtcHR5LXN0YXRlIiBjbGFzcz0iZW1wdHktc3RhdGUiPgogICAgICAgIDxkaXYgY2xhc3M9Imljb24iPvCfk4s8L2Rpdj4KICAgICAgICA8cD5DbGljayAiVmFsaWRhdGUgQ3VycmVudCBQYWdlIiB0byBjaGVjayBmb3IgaXNzdWVzPC9wPgogICAgPC9kaXY+CgogICAgPGJ1dHRvbiBpZD0idmFsaWRhdGUtYnRuIj5WYWxpZGF0ZSBDdXJyZW50IFBhZ2U8L2J1dHRvbj4KCiAgICA8c2NyaXB0PgogICAgICAgIC8vIE9VIENhbXB1cyBBUEkgaW50ZWdyYXRpb24KICAgICAgICBjb25zdCBBUEkgPSB3aW5kb3cuZ2FkZ2V0ID8gd2luZG93LmdhZGdldC5nZXRBUEkoKSA6IG51bGw7CgogICAgICAgIGNvbnN0IFRJVExFX1NVRkZJWCA9ICIgfCBQcmFpcmllIFN0YXRlIENvbGxlZ2UgfCBDaGljYWdvIEhlaWdodHMsIElMIjsKICAgICAgICBjb25zdCBNQVhfVElUTEVfTEVOR1RIID0gNjA7CiAgICAgICAgY29uc3QgTUFYX01FVEFfREVTQ19MRU5HVEggPSAxNjA7CgogICAgICAgIC8vIFZhbGlkYXRpb24gbG9naWMKICAgICAgICBjbGFzcyBQYWdlVmFsaWRhdG9yIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoY29udGVudCkgewogICAgICAgICAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDsKICAgICAgICAgICAgICAgIHRoaXMuaXNzdWVzID0gW107CiAgICAgICAgICAgICAgICB0aGlzLnBhc3NlZCA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YWxpZGF0ZSgpIHsKICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVDb250ZW50UXVhbGl0eSgpOwogICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZUxpbmtzQW5kTWVkaWEoKTsKICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVBY2Nlc3NpYmlsaXR5KCk7CiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlU0VPKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIGlzc3VlczogdGhpcy5pc3N1ZXMsCiAgICAgICAgICAgICAgICAgICAgcGFzc2VkOiB0aGlzLnBhc3NlZAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYWRkSXNzdWUoc2V2ZXJpdHksIGNhdGVnb3J5LCBtZXNzYWdlKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlzc3Vlcy5wdXNoKHsgc2V2ZXJpdHksIGNhdGVnb3J5LCBtZXNzYWdlIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBhZGRQYXNzKG1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgIHRoaXMucGFzc2VkLnB1c2gobWVzc2FnZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhbGlkYXRlQ29udGVudFF1YWxpdHkoKSB7CiAgICAgICAgICAgICAgICAvLyBDaGVjayB0aXRsZQogICAgICAgICAgICAgICAgY29uc3QgdGl0bGVNYXRjaCA9IHRoaXMuY29udGVudC5tYXRjaCgvPHRpdGxlPihbXjxdKyk8XC90aXRsZT4vaSk7CiAgICAgICAgICAgICAgICBpZiAoIXRpdGxlTWF0Y2gpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZElzc3VlKCdlcnJvcicsICdDb250ZW50IFF1YWxpdHknLCAnUGFnZSBpcyBtaXNzaW5nIGEgPHRpdGxlPiB0YWcnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSB0aXRsZU1hdGNoWzFdLnRyaW0oKTsKICAgICAgICAgICAgICAgIGlmICghdGl0bGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZElzc3VlKCdlcnJvcicsICdDb250ZW50IFF1YWxpdHknLCAnVGl0bGUgdGFnIGlzIGVtcHR5Jyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbExlbmd0aCA9IHRpdGxlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRpdGxlLmluY2x1ZGVzKCdQcmFpcmllIFN0YXRlIENvbGxlZ2UnKSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaW5hbExlbmd0aCArPSBUSVRMRV9TVUZGSVgubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsTGVuZ3RoID4gTUFYX1RJVExFX0xFTkdUSCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZElzc3VlKCd3YXJuaW5nJywgJ0NvbnRlbnQgUXVhbGl0eScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGl0bGUgaXMgJHtmaW5hbExlbmd0aH0gY2hhcmFjdGVycyAobWF4ICR7TUFYX1RJVExFX0xFTkdUSH0pLiBXaWxsIGJlIHRydW5jYXRlZCBpbiBzZWFyY2ggcmVzdWx0cy5gKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFBhc3MoJ1RpdGxlIGxlbmd0aCBpcyBnb29kJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIENoZWNrIG1ldGEgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NNYXRjaCA9IHRoaXMuY29udGVudC5tYXRjaCgvPG1ldGEgbmFtZT0iRGVzY3JpcHRpb24iIGNvbnRlbnQ9IihbXiJdKikiL2kpOwogICAgICAgICAgICAgICAgaWYgKCFkZXNjTWF0Y2gpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZElzc3VlKCd3YXJuaW5nJywgJ0NvbnRlbnQgUXVhbGl0eScsICdNaXNzaW5nIG1ldGEgZGVzY3JpcHRpb24nKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzYyA9IGRlc2NNYXRjaFsxXS50cmltKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXNjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSXNzdWUoJ3dhcm5pbmcnLCAnQ29udGVudCBRdWFsaXR5JywgJ01ldGEgZGVzY3JpcHRpb24gaXMgZW1wdHknKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2MubGVuZ3RoID4gTUFYX01FVEFfREVTQ19MRU5HVEgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRJc3N1ZSgnd2FybmluZycsICdDb250ZW50IFF1YWxpdHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYE1ldGEgZGVzY3JpcHRpb24gaXMgJHtkZXNjLmxlbmd0aH0gY2hhcmFjdGVycyAobWF4ICR7TUFYX01FVEFfREVTQ19MRU5HVEh9KS4gV2lsbCBiZSB0cnVuY2F0ZWQuYCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRQYXNzKCdNZXRhIGRlc2NyaXB0aW9uIGxlbmd0aCBpcyBnb29kJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YWxpZGF0ZUxpbmtzQW5kTWVkaWEoKSB7CiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgaW1hZ2VzIHdpdGhvdXQgYWx0IHRleHQKICAgICAgICAgICAgICAgIGNvbnN0IGltZ1RhZ3MgPSB0aGlzLmNvbnRlbnQubWF0Y2goLzxpbWdbXj5dKj4vZ2kpIHx8IFtdOwogICAgICAgICAgICAgICAgbGV0IGltYWdlc1dpdGhvdXRBbHQgPSAwOwogICAgICAgICAgICAgICAgbGV0IGltYWdlc1dpdGhFbXB0eUFsdCA9IDA7CgogICAgICAgICAgICAgICAgaW1nVGFncy5mb3JFYWNoKHRhZyA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWcubWF0Y2goL2FsdD0vaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzV2l0aG91dEFsdCsrOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsdE1hdGNoID0gdGFnLm1hdGNoKC9hbHQ9IihbXiJdKikiL2kpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWx0TWF0Y2ggJiYgIWFsdE1hdGNoWzFdLnRyaW0oKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzV2l0aEVtcHR5QWx0Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBpZiAoaW1hZ2VzV2l0aG91dEFsdCA+IDApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZElzc3VlKCdlcnJvcicsICdBY2Nlc3NpYmlsaXR5JywKICAgICAgICAgICAgICAgICAgICAgICAgYCR7aW1hZ2VzV2l0aG91dEFsdH0gaW1hZ2UocykgbWlzc2luZyBhbHQgYXR0cmlidXRlYCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGltYWdlc1dpdGhFbXB0eUFsdCA+IDApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZElzc3VlKCd3YXJuaW5nJywgJ0FjY2Vzc2liaWxpdHknLAogICAgICAgICAgICAgICAgICAgICAgICBgJHtpbWFnZXNXaXRoRW1wdHlBbHR9IGltYWdlKHMpIGhhdmUgZW1wdHkgYWx0IHRleHRgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaW1hZ2VzV2l0aG91dEFsdCA9PT0gMCAmJiBpbWdUYWdzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFBhc3MoJ0FsbCBpbWFnZXMgaGF2ZSBhbHQgYXR0cmlidXRlcycpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBicm9rZW4gbGlua3MKICAgICAgICAgICAgICAgIGNvbnN0IGJyb2tlbkxpbmtzID0gKHRoaXMuY29udGVudC5tYXRjaCgvaHJlZj0iIyIvZ2kpIHx8IFtdKS5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoYnJva2VuTGlua3MgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRJc3N1ZSgnZXJyb3InLCAnTGlua3MgJiBNZWRpYScsCiAgICAgICAgICAgICAgICAgICAgICAgIGAke2Jyb2tlbkxpbmtzfSBicm9rZW4gbGluayhzKSB3aXRoIGhyZWY9IiMiYCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGVudC5pbmNsdWRlcygnPGEgJykpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFBhc3MoJ05vIGJyb2tlbiBwbGFjZWhvbGRlciBsaW5rcyBmb3VuZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YWxpZGF0ZUFjY2Vzc2liaWxpdHkoKSB7CiAgICAgICAgICAgICAgICAvLyBDaGVjayBIMSB0YWdzCiAgICAgICAgICAgICAgICBjb25zdCBoMU1hdGNoZXMgPSB0aGlzLmNvbnRlbnQubWF0Y2goLzxoMVtePl0qPi4qPzxcL2gxPi9naSkgfHwgW107CiAgICAgICAgICAgICAgICBpZiAoaDFNYXRjaGVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSXNzdWUoJ3dhcm5pbmcnLCAnQWNjZXNzaWJpbGl0eScsICdQYWdlIGlzIG1pc3NpbmcgYW4gSDEgaGVhZGluZycpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoMU1hdGNoZXMubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSXNzdWUoJ3dhcm5pbmcnLCAnU0VPJywKICAgICAgICAgICAgICAgICAgICAgICAgYFBhZ2UgaGFzICR7aDFNYXRjaGVzLmxlbmd0aH0gSDEgaGVhZGluZ3MgKHNob3VsZCBvbmx5IGhhdmUgMSlgKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRQYXNzKCdQYWdlIGhhcyBleGFjdGx5IG9uZSBIMSBoZWFkaW5nJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGVtcHR5IGhlYWRpbmdzCiAgICAgICAgICAgICAgICBsZXQgZW1wdHlIZWFkaW5ncyA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSA2OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYDxoJHtpfVtePl0qPlxccyooJm5ic3A7fFxccykqXFxzKjxcXC9oJHtpfT5gLCAnZ2knKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5jb250ZW50Lm1hdGNoKHJlZ2V4KSB8fCBbXTsKICAgICAgICAgICAgICAgICAgICBlbXB0eUhlYWRpbmdzICs9IG1hdGNoZXMubGVuZ3RoOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChlbXB0eUhlYWRpbmdzID4gMCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSXNzdWUoJ3dhcm5pbmcnLCAnQWNjZXNzaWJpbGl0eScsCiAgICAgICAgICAgICAgICAgICAgICAgIGAke2VtcHR5SGVhZGluZ3N9IGVtcHR5IGhlYWRpbmcocykgZm91bmRgKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRQYXNzKCdObyBlbXB0eSBoZWFkaW5ncycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YWxpZGF0ZVNFTygpIHsKICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBub24tSFRUUFMgbGlua3MKICAgICAgICAgICAgICAgIGNvbnN0IG5vbkh0dHBzTGlua3MgPSAodGhpcy5jb250ZW50Lm1hdGNoKC9ocmVmPSJodHRwOlwvXC8vZ2kpIHx8IFtdKS5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAobm9uSHR0cHNMaW5rcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZElzc3VlKCdpbmZvJywgJ1NFTycsCiAgICAgICAgICAgICAgICAgICAgICAgIGAke25vbkh0dHBzTGlua3N9IG5vbi1IVFRQUyBsaW5rKHMpIGZvdW5kLiBDb25zaWRlciB1cGRhdGluZyB0byBIVFRQUy5gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVUkgZnVuY3Rpb25zCiAgICAgICAgZnVuY3Rpb24gc2hvd1N0YXR1cyhtZXNzYWdlLCB0eXBlKSB7CiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0dXMnKTsKICAgICAgICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gbWVzc2FnZTsKICAgICAgICAgICAgc3RhdHVzLmNsYXNzTmFtZSA9IGBzdGF0dXMgJHt0eXBlfWA7CiAgICAgICAgICAgIHN0YXR1cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGhpZGVTdGF0dXMoKSB7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0dXMnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZGlzcGxheVJlc3VsdHMocmVzdWx0cykgewogICAgICAgICAgICBjb25zdCB7IGlzc3VlcywgcGFzc2VkIH0gPSByZXN1bHRzOwogICAgICAgICAgICBjb25zdCBlcnJvckNvdW50ID0gaXNzdWVzLmZpbHRlcihpID0+IGkuc2V2ZXJpdHkgPT09ICdlcnJvcicpLmxlbmd0aDsKICAgICAgICAgICAgY29uc3Qgd2FybmluZ0NvdW50ID0gaXNzdWVzLmZpbHRlcihpID0+IGkuc2V2ZXJpdHkgPT09ICd3YXJuaW5nJykubGVuZ3RoOwoKICAgICAgICAgICAgLy8gVXBkYXRlIHN1bW1hcnkKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWNvdW50JykudGV4dENvbnRlbnQgPSBlcnJvckNvdW50OwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2FybmluZy1jb3VudCcpLnRleHRDb250ZW50ID0gd2FybmluZ0NvdW50OwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFzcy1jb3VudCcpLnRleHRDb250ZW50ID0gcGFzc2VkLmxlbmd0aDsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bW1hcnknKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKCiAgICAgICAgICAgIC8vIFNob3cgYXBwcm9wcmlhdGUgc3RhdHVzCiAgICAgICAgICAgIGlmIChlcnJvckNvdW50ID4gMCkgewogICAgICAgICAgICAgICAgc2hvd1N0YXR1cyhgRm91bmQgJHtlcnJvckNvdW50fSBlcnJvcihzKSBhbmQgJHt3YXJuaW5nQ291bnR9IHdhcm5pbmcocylgLCAnZXJyb3InKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh3YXJuaW5nQ291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICBzaG93U3RhdHVzKGBGb3VuZCAke3dhcm5pbmdDb3VudH0gd2FybmluZyhzKS4gTm8gY3JpdGljYWwgZXJyb3JzIWAsICd3YXJuaW5nJyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzaG93U3RhdHVzKCdBbGwgY2hlY2tzIHBhc3NlZCEg8J+OiScsICdzdWNjZXNzJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEdyb3VwIGlzc3VlcyBieSBjYXRlZ29yeQogICAgICAgICAgICBjb25zdCBncm91cGVkID0ge307CiAgICAgICAgICAgIGlzc3Vlcy5mb3JFYWNoKGlzc3VlID0+IHsKICAgICAgICAgICAgICAgIGlmICghZ3JvdXBlZFtpc3N1ZS5jYXRlZ29yeV0pIHsKICAgICAgICAgICAgICAgICAgICBncm91cGVkW2lzc3VlLmNhdGVnb3J5XSA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ3JvdXBlZFtpc3N1ZS5jYXRlZ29yeV0ucHVzaChpc3N1ZSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gQnVpbGQgcmVzdWx0cyBIVE1MCiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHNEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0cycpOwogICAgICAgICAgICByZXN1bHRzRGl2LmlubmVySFRNTCA9ICcnOwoKICAgICAgICAgICAgLy8gU2hvdyBpc3N1ZXMKICAgICAgICAgICAgT2JqZWN0LmtleXMoZ3JvdXBlZCkuZm9yRWFjaChjYXRlZ29yeSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBjYXRlZ29yeUlzc3VlcyA9IGdyb3VwZWRbY2F0ZWdvcnldOwogICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb3VudCA9IGNhdGVnb3J5SXNzdWVzLmZpbHRlcihpID0+IGkuc2V2ZXJpdHkgPT09ICdlcnJvcicpLmxlbmd0aDsKICAgICAgICAgICAgICAgIGNvbnN0IHdhcm5pbmdDb3VudCA9IGNhdGVnb3J5SXNzdWVzLmZpbHRlcihpID0+IGkuc2V2ZXJpdHkgPT09ICd3YXJuaW5nJykubGVuZ3RoOwoKICAgICAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgIHNlY3Rpb24uY2xhc3NOYW1lID0gJ3NlY3Rpb24nOwoKICAgICAgICAgICAgICAgIGNvbnN0IGJhZGdlQ2xhc3MgPSBlcnJvckNvdW50ID4gMCA/ICcnIDogJ3dhcm5pbmcnOwogICAgICAgICAgICAgICAgY29uc3QgYmFkZ2VUZXh0ID0gZXJyb3JDb3VudCA+IDAgPyBlcnJvckNvdW50IDogd2FybmluZ0NvdW50OwoKICAgICAgICAgICAgICAgIHNlY3Rpb24uaW5uZXJIVE1MID0gYAogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24taGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PHNwYW4gY2xhc3M9Imljb24iPuKaoO+4jzwvc3Bhbj4ke2NhdGVnb3J5fTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJhZGdlICR7YmFkZ2VDbGFzc30iPiR7YmFkZ2VUZXh0fTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAke2NhdGVnb3J5SXNzdWVzLm1hcChpc3N1ZSA9PiBgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpc3N1ZS1pdGVtICR7aXNzdWUuc2V2ZXJpdHl9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZXZlcml0eSI+JHtpc3N1ZS5zZXZlcml0eX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PiR7aXNzdWUubWVzc2FnZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICBgKS5qb2luKCcnKX0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIGA7CgogICAgICAgICAgICAgICAgc2VjdGlvbi5xdWVyeVNlbGVjdG9yKCcuc2VjdGlvbi1oZWFkZXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLmNsYXNzTGlzdC50b2dnbGUoJ2V4cGFuZGVkJyk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICByZXN1bHRzRGl2LmFwcGVuZENoaWxkKHNlY3Rpb24pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIFNob3cgcGFzc2VkIGNoZWNrcwogICAgICAgICAgICBpZiAocGFzc2VkLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgIHNlY3Rpb24uY2xhc3NOYW1lID0gJ3NlY3Rpb24nOwogICAgICAgICAgICAgICAgc2VjdGlvbi5pbm5lckhUTUwgPSBgCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48c3BhbiBjbGFzcz0iaWNvbiI+4pyFPC9zcGFuPlBhc3NlZCBDaGVja3M8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJiYWRnZSIgc3R5bGU9ImJhY2tncm91bmQ6ICM0Y2FmNTA7Ij4ke3Bhc3NlZC5sZW5ndGh9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tY29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICR7cGFzc2VkLm1hcChjaGVjayA9PiBgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjaGVjay1pdGVtIHBhc3MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uIj7inJM8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPiR7Y2hlY2t9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIGApLmpvaW4oJycpfQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgYDsKCiAgICAgICAgICAgICAgICBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3IoJy5zZWN0aW9uLWhlYWRlcicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uY2xhc3NMaXN0LnRvZ2dsZSgnZXhwYW5kZWQnKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHJlc3VsdHNEaXYuYXBwZW5kQ2hpbGQoc2VjdGlvbik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbXB0eS1zdGF0ZScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgfQoKICAgICAgICAvLyBNYWluIHZhbGlkYXRpb24gZnVuY3Rpb24KICAgICAgICBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZVBhZ2UoKSB7CiAgICAgICAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2YWxpZGF0ZS1idG4nKTsKICAgICAgICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1ZhbGlkYXRpbmcuLi4nOwoKICAgICAgICAgICAgc2hvd1N0YXR1cygnQW5hbHl6aW5nIHBhZ2UgY29udGVudC4uLicsICdsb2FkaW5nJyk7CgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQ7CgogICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGdldCBjb250ZW50IGZyb20gT1UgQ2FtcHVzIEFQSQogICAgICAgICAgICAgICAgaWYgKEFQSSAmJiBBUEkuVXRpbCAmJiBBUEkuVXRpbC5nZXRQYWdlQ29udGVudCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBhd2FpdCBBUEkuVXRpbC5nZXRQYWdlQ29udGVudCgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayBmb3IgdGVzdGluZyBvdXRzaWRlIE9VIENhbXB1cwogICAgICAgICAgICAgICAgICAgIHNob3dTdGF0dXMoJ0RlbW8gbW9kZSAtIHVzaW5nIHNhbXBsZSBjb250ZW50JywgJ3dhcm5pbmcnKTsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gYDx0aXRsZT5TYW1wbGUgUGFnZTwvdGl0bGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhIG5hbWU9IkRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIGlzIGEgc2FtcGxlIHBhZ2UgZm9yIHRlc3RpbmcgdGhlIHZhbGlkYXRvciBnYWRnZXQgZnVuY3Rpb25hbGl0eS4iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMT5NYWluIEhlYWRpbmc8L2gxPgogICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0idGVzdC5qcGciIGFsdD0iVGVzdCBpbWFnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPkJyb2tlbiBsaW5rPC9hPmA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gUnVuIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IG5ldyBQYWdlVmFsaWRhdG9yKGNvbnRlbnQpOwogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHZhbGlkYXRvci52YWxpZGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIERpc3BsYXkgcmVzdWx0cwogICAgICAgICAgICAgICAgZGlzcGxheVJlc3VsdHMocmVzdWx0cyk7CgogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgc2hvd1N0YXR1cygnRXJyb3I6ICcgKyBlcnJvci5tZXNzYWdlLCAnZXJyb3InKTsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1ZhbGlkYXRpb24gZXJyb3I6JywgZXJyb3IpOwogICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnVmFsaWRhdGUgQ3VycmVudCBQYWdlJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gRXZlbnQgbGlzdGVuZXJzCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZhbGlkYXRlLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdmFsaWRhdGVQYWdlKTsKCiAgICAgICAgLy8gQXV0by12YWxpZGF0ZSBvbiBsb2FkIGlmIGluIE9VIENhbXB1cwogICAgICAgIGlmIChBUEkpIHsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICB2YWxpZGF0ZVBhZ2UoKTsKICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICB9CiAgICA8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==