SYSTEM LOCKED
Authentication Required
Authenticate
PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgogIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4KICA8dGl0bGU+QXNzZXQgTGFicyBIdWIgfCBNdWx0aS1OaWNoZSBDb21wbGlhbmNlIFRlcm1pbmFsIChFbnRlcnByaXNlIEVuaGFuY2VkKTwvdGl0bGU+CiAgPHN0eWxlPgogICAgOnJvb3QgewogICAgICAtLWJnLXByaW1hcnk6ICMwNjA5MTM7IAogICAgICAtLWJnLXNlY29uZGFyeTogIzBkMTExYzsgCiAgICAgIC0tYWNjZW50OiAjMDBmNTliOwogICAgICAtLXRleHQtbWFpbjogI2YzZjRmNjsgCiAgICAgIC0tdGV4dC1tdXRlZDogIzljYTNhZjsgCiAgICAgIC0tYm9yZGVyOiAjMWUyOTNiOwogICAgICAtLWRhbmdlcjogI2ZmMzM0NDsgCiAgICAgIC0td2FybmluZzogI2ZmYjgwMDsgCiAgICAgIC0tcGFuZWw6ICMxMTE3MjY7IAogICAgICAtLW11dGVkOiAjNDc1NTY5OwogICAgfQogICAgYm9keS5saWdodC1tb2RlIHsKICAgICAgLS1iZy1wcmltYXJ5OiAjZjBmNGY4OwogICAgICAtLWJnLXNlY29uZGFyeTogI2ZmZmZmZjsKICAgICAgLS1hY2NlbnQ6ICMwMGE4NmI7CiAgICAgIC0tdGV4dC1tYWluOiAjMGYxNzJhOwogICAgICAtLXRleHQtbXV0ZWQ6ICM0NzU1Njk7CiAgICAgIC0tYm9yZGVyOiAjY2JkNWUxOwogICAgICAtLWRhbmdlcjogI2RjMjYyNjsKICAgICAgLS13YXJuaW5nOiAjZDk3NzA2OwogICAgICAtLXBhbmVsOiAjZjhmYWZjOwogICAgICAtLW11dGVkOiAjOTRhM2I4OwogICAgfQogICAgYm9keSB7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLXByaW1hcnkpOyAKICAgICAgY29sb3I6IHZhcigtLXRleHQtbWFpbik7CiAgICAgIGZvbnQtZmFtaWx5OiB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgIkxpYmVyYXRpb24gTW9ubyIsICJDb3VyaWVyIE5ldyIsIG1vbm9zcGFjZTsKICAgICAgbWFyZ2luOiAwOyAKICAgICAgcGFkZGluZzogMTZweDsgCiAgICAgIGRpc3BsYXk6IGZsZXg7IAogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyAKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsgCiAgICAgIG1pbi1oZWlnaHQ6IDEwMHZoOyAKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsgCiAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgfQogICAgLndyYXBwZXIgeyAKICAgICAgd2lkdGg6IDEwMCU7IAogICAgICBtYXgtd2lkdGg6IDg1MHB4OyAKICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmctc2Vjb25kYXJ5KTsgCiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IAogICAgICBib3JkZXItcmFkaXVzOiA4cHg7IAogICAgICBib3gtc2hhZG93OiAwIDI1cHggNTBweCAtMTJweCByZ2JhKDAsMCwwLDAuNyk7IAogICAgICBvdmVyZmxvdzogaGlkZGVuOyAKICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsgCiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IAogICAgfQogICAgLmhlYWRlciB7IAogICAgICBwYWRkaW5nOiAyNHB4OyAKICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IAogICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IAogICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuMik7IAogICAgfQogICAgLmhlYWRlciBoMiB7IAogICAgICBtYXJnaW46IDA7IAogICAgICBmb250LXNpemU6IDEuM3JlbTsgCiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7IAogICAgICBsZXR0ZXItc3BhY2luZzogMnB4OyAKICAgICAgY29sb3I6ICNmZmY7IAogICAgfQogICAgLmhlYWRlciBwIHsgCiAgICAgIG1hcmdpbjogOHB4IDAgMCAwOyAKICAgICAgZm9udC1zaXplOiAwLjc1cmVtOyAKICAgICAgY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpOyAKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgCiAgICAgIGxldHRlci1zcGFjaW5nOiAxLjVweDsgCiAgICB9CiAgICAuY29udGVudCB7IHBhZGRpbmc6IDI0cHg7IH0KICAgIAogICAgLmtleS1yb3cgeyAKICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsgCiAgICAgIGRpc3BsYXk6IGdyaWQ7IAogICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsgCiAgICAgIGdhcDogMTRweDsgCiAgICB9CiAgICAuZm9ybS1yb3cgeyAKICAgICAgZGlzcGxheTogZ3JpZDsgCiAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMmZyIDFmciAxZnI7IAogICAgICBnYXA6IDE0cHg7IAogICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OyAKICAgIH0KICAgIEBtZWRpYSAobWF4LXdpZHRoOiA2NDBweCkgeyAuZm9ybS1yb3cgeyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsgfSB9CiAgICAKICAgIC5mb3JtLWdyb3VwIGxhYmVsIHsgCiAgICAgIGRpc3BsYXk6IGJsb2NrOyAKICAgICAgZm9udC1zaXplOiAwLjdyZW07IAogICAgICBmb250LXdlaWdodDogNzAwOyAKICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OyAKICAgICAgY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpOyAKICAgICAgbGV0dGVyLXNwYWNpbmc6IDFweDsgCiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IAogICAgfQogICAgLmlucHV0LWZpZWxkIHsgCiAgICAgIHdpZHRoOiAxMDAlOyAKICAgICAgcGFkZGluZzogMTJweDsgCiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWJnLXByaW1hcnkpOyAKICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgCiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsgCiAgICAgIGNvbG9yOiB2YXIoLS10ZXh0LW1haW4pOyAKICAgICAgZm9udC1zaXplOiAwLjg4cmVtOyAKICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7IAogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OyAKICAgICAgaGVpZ2h0OiA0NXB4OyAKICAgIH0KICAgIC5pbnB1dC1maWVsZDpmb2N1cyB7IAogICAgICBvdXRsaW5lOiBub25lOyAKICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOyAKICAgICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwyNDUsMTU1LDAuMTUpOyAKICAgIH0KICAgIAogICAgLmJ0bi1zdWJtaXQgeyAKICAgICAgd2lkdGg6IDEwMCU7IAogICAgICBwYWRkaW5nOiAxNHB4OyAKICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IAogICAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsgCiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWFjY2VudCk7IAogICAgICBib3JkZXItcmFkaXVzOiA0cHg7IAogICAgICBmb250LXNpemU6IDAuOXJlbTsgCiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7IAogICAgICBmb250LWZhbWlseTogaW5oZXJpdDsgCiAgICAgIGN1cnNvcjogcG9pbnRlcjsgCiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IAogICAgICBsZXR0ZXItc3BhY2luZzogMXB4OyAKICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsgCiAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7CiAgICB9CiAgICAuYnRuLXN1Ym1pdDpob3ZlciB7IAogICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMjQ1LDE1NSwwLjA4KTsgCiAgICAgIGJveC1zaGFkb3c6IDAgMCAxNXB4IHJnYmEoMCwyNDUsMTU1LDAuMTUpOyAKICAgIH0KICAgIC5idG4tc3VibWl0OmRpc2FibGVkIHsgCiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYm9yZGVyKTsgCiAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCk7IAogICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOyAKICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IAogICAgfQoKICAgIC5idG4tc2Vjb25kYXJ5LWFjdGlvbiB7CiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICBjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTsKICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgbGV0dGVyLXNwYWNpbmc6IDFweDsKICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgIH0KICAgIC5idG4tc2Vjb25kYXJ5LWFjdGlvbjpob3ZlciB7CiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tdGV4dC1tYWluKTsKICAgICAgY29sb3I6IHZhcigtLXRleHQtbWFpbik7CiAgICB9CiAgICAKICAgIC50YWItZGVjayB7IAogICAgICBkaXNwbGF5OiBncmlkOyAKICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgMWZyKTsgCiAgICAgIGdhcDogMTBweDsgCiAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7IAogICAgICB3aWR0aDogMTAwJTsgCiAgICAgIG1heC13aWR0aDogODUwcHg7IAogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OyAKICAgIH0KICAgIC50YWItYnRuIHsgCiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IAogICAgICBwYWRkaW5nOiAxMnB4OyAKICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmctc2Vjb25kYXJ5KTsgCiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsgCiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgCiAgICAgIGN1cnNvcjogcG9pbnRlcjsgCiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOyAKICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7IAogICAgfQogICAgLnRhYi1idG4uYWN0aXZlIHsgCiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsgCiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwyNDUsMTU1LDAuMDMpOyAKICAgIH0KICAgIC50YWItYnRuLmFjdGl2ZSAudGFiLXRpdGxlIHsgY29sb3I6ICNmZmY7IH0KICAgIC50YWItYnRuLmFjdGl2ZSAudGFiLXN0YXR1cyB7IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyB9CiAgICAudGFiLXRpdGxlIHsgZm9udC1zaXplOiAxMHB4OyBmb250LXdlaWdodDogNzAwOyBjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7IG1hcmdpbi10b3A6IDRweDsgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyB9CiAgICAudGFiLXN0YXR1cyB7IGZvbnQtc2l6ZTogOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXdlaWdodDogNzAwOyBsZXR0ZXItc3BhY2luZzogMC41cHg7IH0KICAgIEBtZWRpYSAobWF4LXdpZHRoOiA1NTBweCkgeyAudGFiLWRlY2sgeyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsgZ2FwOiA4cHg7IH0gfQogICAgCiAgICAucmVwb3J0LXBhbmVsIHsgCiAgICAgIG1hcmdpbi10b3A6IDI4cHg7IAogICAgICBwYWRkaW5nOiAyNHB4OyAKICAgICAgYmFja2dyb3VuZDogcmdiYSg2LDksMTksMC41KTsgCiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsgCiAgICAgIGJvcmRlcjogMXB4IGRhc2hlZCB2YXIoLS1ib3JkZXIpOyAKICAgICAgZGlzcGxheTogbm9uZTsgCiAgICB9CiAgICAucmVwb3J0LXRpdGxlIHsgCiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTsgCiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IAogICAgICBjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7IAogICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OyAKICAgICAgbGV0dGVyLXNwYWNpbmc6IDEuNXB4OyAKICAgICAgZm9udC13ZWlnaHQ6IDcwMDsgCiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyAKICAgICAgcGFkZGluZy1ib3R0b206IDhweDsgCiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIH0KICAgIC5tYXRyaXgtZ3JpZCB7IAogICAgICBkaXNwbGF5OiBncmlkOyAKICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyAKICAgICAgZ2FwOiAxNHB4OyAKICAgICAgbWFyZ2luLXRvcDogMTZweDsgCiAgICB9CiAgICBAbWVkaWEgKG1heC13aWR0aDogNDgwcHgpIHsgLm1hdHJpeC1ncmlkIHsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7IH0gfQogICAgLm1hdHJpeC1ib3ggeyAKICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFuZWwpOyAKICAgICAgcGFkZGluZzogMTZweDsgCiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IAogICAgICBib3JkZXItcmFkaXVzOiA0cHg7IAogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OyAKICAgIH0KICAgIC5tYXRyaXgtYm94LmZ1bGwtd2lkdGggeyBncmlkLWNvbHVtbjogc3BhbiAyOyB9CiAgICBAbWVkaWEgKG1heC13aWR0aDogNDgwcHgpIHsgLm1hdHJpeC1ib3guZnVsbC13aWR0aCB7IGdyaWQtY29sdW1uOiBzcGFuIDE7IH0gfQogICAgLmRhdGEtbGFiZWwgeyBmb250LXNpemU6IDEwcHg7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDZweDsgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OyB9CiAgICAuZGF0YS12YWx1ZSB7IGZvbnQtc2l6ZTogMTNweDsgZm9udC13ZWlnaHQ6IDcwMDsgY29sb3I6ICNmZmY7IGxpbmUtaGVpZ2h0OiAxLjQ7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7IH0KICAgIC5tYXRyaXgtdGl0bGUgeyBmb250LXNpemU6IDAuNzVyZW07IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTsgbWFyZ2luOiAyNHB4IDAgMTJweCAwOyBmb250LXdlaWdodDogNzAwOyBsZXR0ZXItc3BhY2luZzogMXB4OyB9CiAgICAKICAgIC5iYWRnZS1ncmlkIHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoNCwgMWZyKTsgZ2FwOiAxMHB4OyB9CiAgICBAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpIHsgLmJhZGdlLWdyaWQgeyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpOyB9IH0KICAgIEBtZWRpYSAobWF4LXdpZHRoOiA0MDBweCkgeyAuYmFkZ2UtZ3JpZCB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOyB9IH0KICAgIC5iYWRnZSB7IHBhZGRpbmc6IDEwcHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAwLjY4cmVtOyBmb250LXdlaWdodDogNzAwOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1wcmltYXJ5KTsgY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyB9CiAgICAuYmFkZ2UtdCB7IGJvcmRlci1jb2xvcjogdmFyKC0tZGFuZ2VyKSAhaW1wb3J0YW50OyBjb2xvcjogdmFyKC0tZGFuZ2VyKSAhaW1wb3J0YW50OyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSw1MSw2OCwwLjA0KSAhaW1wb3J0YW50OyB9CiAgICAuYmFkZ2UtZSB7IGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KSAhaW1wb3J0YW50OyBjb2xvcjogdmFyKC0tYWNjZW50KSAhaW1wb3J0YW50OyBiYWNrZ3JvdW5kOiByZ2JhKDAsMjQ1LDE1NSwwLjA0KSAhaW1wb3J0YW50OyB9CiAgICAuYmFkZ2UtcCB7IGJvcmRlci1jb2xvcjogdmFyKC0td2FybmluZykgIWltcG9ydGFudDsgY29sb3I6IHZhcigtLXdhcm5pbmcpICFpbXBvcnRhbnQ7IGJhY2tncm91bmQ6IHJnYmEoMjU1LDE4NCwwLDAuMDQpICFpbXBvcnRhbnQ7IH0KICAgIC5iYWRnZS1sIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1ib3JkZXIpICFpbXBvcnRhbnQ7IGNvbG9yOiB2YXIoLS1tdXRlZCkgIWltcG9ydGFudDsgb3BhY2l0eTogMC4zNTsgfQogICAgCiAgICAuc3RhdHVzLWJhZGdlIHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nOiA2cHggMTJweDsgYm9yZGVyLXJhZGl1czogM3B4OyBmb250LXNpemU6IDExcHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGxldHRlci1zcGFjaW5nOiAwLjVweDsgfQogICAgLnN0YXR1cy1mYWlsIHsgYmFja2dyb3VuZDogcmdiYSgyNTUsNTEsNjgsMC4xKTsgY29sb3I6IHZhcigtLWRhbmdlcik7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDUxLDY4LDAuMyk7IH0KICAgIC5zdGF0dXMtd2FybiB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LDE4NCwwLDAuMSk7IGNvbG9yOiB2YXIoLS13YXJuaW5nKTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsMTg0LDAsMC4zKTsgfQogICAgLnN0YXR1cy1wYXNzIHsgYmFja2dyb3VuZDogcmdiYSgwLDI0NSwxNTUsMC4xKTsgY29sb3I6IHZhcigtLWFjY2VudCk7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwyNDUsMTU1LDAuMyk7IH0KICAgIAogICAgLnByb3RvY29sLWJveCB7IG1hcmdpbi10b3A6IDE2cHg7IGJhY2tncm91bmQ6ICMwODBjMTg7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwyNDUsMTU1LDAuMik7IGJvcmRlci1yYWRpdXM6IDRweDsgcGFkZGluZzogMTZweDsgZm9udC1zaXplOiAxMnB4OyBsaW5lLWhlaWdodDogMS42OyB9CiAgICAucHJvdG9jb2wtaGVhZGVyIHsgY29sb3I6IHZhcigtLWFjY2VudCk7IGZvbnQtd2VpZ2h0OiA3MDA7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGxldHRlci1zcGFjaW5nOiAxcHg7IGZvbnQtc2l6ZTogMTFweDsgbWFyZ2luLWJvdHRvbTogOHB4OyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IH0KICAgIC5zdGF0dXMtY2FyZCB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4wNCk7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwyNDUsMTU1LDAuMTUpOyBib3JkZXItcmFkaXVzOiA2cHg7IHBhZGRpbmc6IDE2cHg7IG1hcmdpbi1ib3R0b206IDE4cHg7IGRpc3BsYXk6IG5vbmU7IH0KICAgIC5zdGF0dXMtY2FyZC10aXRsZSB7IGZvbnQtc2l6ZTogMC43NXJlbTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgbGV0dGVyLXNwYWNpbmc6IDFweDsgY29sb3I6IHZhcigtLWFjY2VudCk7IGZvbnQtd2VpZ2h0OiA3MDA7IG1hcmdpbi1ib3R0b206IDhweDsgfQogICAgLnN0YXR1cy1jYXJkLWJvZHkgeyBmb250LXNpemU6IDEycHg7IGNvbG9yOiB2YXIoLS10ZXh0LW1haW4pOyBsaW5lLWhlaWdodDogMS41OyBtYXJnaW4tYm90dG9tOiAxMHB4OyB9CiAgICAuc3RhdHVzLWNhcmQtbWV0YSB7IGRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgZ2FwOiAxMHB4OyBhbGlnbi1pdGVtczogY2VudGVyOyBmb250LXNpemU6IDEwcHg7IGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgfQogICAgLnN0YXR1cy1jYXJkLXBpbGwgeyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1hY2NlbnQpOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgcGFkZGluZzogNHB4IDhweDsgYm9yZGVyLXJhZGl1czogOTk5cHg7IGZvbnQtc2l6ZTogMTBweDsgZm9udC13ZWlnaHQ6IDcwMDsgfQogICAgI2R5bmFtaWNIZWFkZXJCYWRnZSB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgbWFyZ2luLXRvcDogMTBweDsgY29sb3I6IHZhcigtLWFjY2VudCk7IGxldHRlci1zcGFjaW5nOiAxcHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgYW5pbWF0aW9uOiBwdWxzZUJhZGdlIDIuNHMgZWFzZS1pbi1vdXQgaW5maW5pdGU7IH0KICAgIEBrZXlmcmFtZXMgcHVsc2VCYWRnZSB7CiAgICAgIDAlLCAxMDAlIHsgdHJhbnNmb3JtOiBzY2FsZSgxKTsgb3BhY2l0eTogMTsgdGV4dC1zaGFkb3c6IG5vbmU7IH0KICAgICAgNTAlIHsgdHJhbnNmb3JtOiBzY2FsZSgxLjAyKTsgb3BhY2l0eTogMC45MjsgdGV4dC1zaGFkb3c6IDAgMCAxMnB4IHJnYmEoMCwyNDUsMTU1LDAuMzUpOyB9CiAgICB9CiAgICAKICAgIC51cGdyYWRlLWJhbm5lciB7IG1hcmdpbi10b3A6IDI0cHg7IHBhZGRpbmc6IDE2cHg7IGJhY2tncm91bmQ6IHJnYmEoMjU1LDUxLDY4LDAuMDQpOyBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSw1MSw2OCwwLjIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMTJweDsgbGluZS1oZWlnaHQ6IDEuNTsgfQogICAgLnBsYXlib29rLXZpZXcgeyB3aWR0aDogMTAwJTsgbWF4LXdpZHRoOiA4NTBweDsgYmFja2dyb3VuZDogdmFyKC0tYmctc2Vjb25kYXJ5KTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogOHB4OyBwYWRkaW5nOiAyNHB4OyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogMjRweDsgfQogICAgCiAgICAuYWNjb3JkaW9uLWl0ZW0geyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1ib3R0b206IDEwcHg7IG92ZXJmbG93OiBoaWRkZW47IGJhY2tncm91bmQ6IHZhcigtLXBhbmVsKTsgfQogICAgLmFjY29yZGlvbi10cmlnZ2VyIHsgd2lkdGg6IDEwMCU7IHBhZGRpbmc6IDE0cHggMTZweDsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGJvcmRlcjogbm9uZTsgY29sb3I6IHZhcigtLXRleHQtbWFpbik7IGZvbnQtZmFtaWx5OiBpbmhlcml0OyBmb250LXNpemU6IDExcHg7IHRleHQtYWxpZ246IGxlZnQ7IGN1cnNvcjogcG9pbnRlcjsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9CiAgICAuYWNjb3JkaW9uLXRyaWdnZXI6aG92ZXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMDIpOyB9CiAgICAuYWNjb3JkaW9uLWNvbnRlbnQgeyBtYXgtaGVpZ2h0OiAwOyBvdmVyZmxvdzogaGlkZGVuOyB0cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuMjVzIGVhc2Utb3V0OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1zZWNvbmRhcnkpOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9CiAgICAuYWNjb3JkaW9uLWJvZHkgeyBwYWRkaW5nOiAyMHB4OyBmb250LXNpemU6IDEzcHg7IGxpbmUtaGVpZ2h0OiAxLjY7IGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICJTZWdvZSBVSSIsIFJvYm90bywgc2Fucy1zZXJpZjsgfQogICAgLmVycm9yLW1zZyB7IGNvbG9yOiB2YXIoLS1kYW5nZXIpOyBmb250LXNpemU6IDEwcHg7IG1hcmdpbi10b3A6IDRweDsgZGlzcGxheTogbm9uZTsgZm9udC13ZWlnaHQ6IDcwMDsgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OyB9CiAgICAuaW5wdXQtZmllbGQuaW5wdXQtZXJyb3IgeyBib3JkZXItY29sb3I6IHZhcigtLWRhbmdlcik7IGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDI1NSw1MSw2OCwwLjIpOyB9CiAgICAudGhlbWUtdG9nZ2xlIHsgcG9zaXRpb246IGZpeGVkOyB0b3A6IDE2cHg7IHJpZ2h0OiAxNnB4OyB6LWluZGV4OiA5OTk7IGJhY2tncm91bmQ6IHZhcigtLWJnLXNlY29uZGFyeSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTsgcGFkZGluZzogOHB4IDEycHg7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1mYW1pbHk6IGluaGVyaXQ7IGZvbnQtc2l6ZTogMTBweDsgZm9udC13ZWlnaHQ6IDcwMDsgY3Vyc29yOiBwb2ludGVyOyBsZXR0ZXItc3BhY2luZzogMXB4OyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyB9CiAgICAuY29tcGFyZS1vdmVybGF5IHsgZGlzcGxheTogbm9uZTsgcG9zaXRpb246IGZpeGVkOyBpbnNldDogMDsgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjg1KTsgei1pbmRleDogMTAwMDsgb3ZlcmZsb3cteTogYXV0bzsgcGFkZGluZzogMjRweDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfQogICAgLmNvbXBhcmUtb3ZlcmxheS5hY3RpdmUgeyBkaXNwbGF5OiBibG9jazsgfQogICAgLmNvbXBhcmUtYm94IHsgYmFja2dyb3VuZDogdmFyKC0tYmctc2Vjb25kYXJ5KTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogOHB4OyBtYXgtd2lkdGg6IDkwMHB4OyBtYXJnaW46IDAgYXV0bzsgcGFkZGluZzogMjRweDsgfQogICAgLmNvbXBhcmUtdGFibGUgeyB3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAxMXB4OyBtYXJnaW4tdG9wOiAxNnB4OyB9CiAgICAuY29tcGFyZS10YWJsZSB0aCB7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDhweCAxMHB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBsZXR0ZXItc3BhY2luZzogMC41cHg7IGZvbnQtc2l6ZTogMTBweDsgfQogICAgLmNvbXBhcmUtdGFibGUgdGQgeyBwYWRkaW5nOiA4cHggMTBweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS10ZXh0LW1haW4pOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB9CiAgICAuY29tcGFyZS10YWJsZSB0cjpsYXN0LWNoaWxkIHRkIHsgYm9yZGVyLWJvdHRvbTogbm9uZTsgfQogICAgLmhpc3RvcnktcGFuZWwgeyB3aWR0aDogMTAwJTsgbWF4LXdpZHRoOiA4NTBweDsgYmFja2dyb3VuZDogdmFyKC0tYmctc2Vjb25kYXJ5KTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogOHB4OyBwYWRkaW5nOiAyNHB4OyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBtYXJnaW4tYm90dG9tOiAyNHB4OyBkaXNwbGF5OiBub25lOyB9CiAgICAuaGlzdG9yeS1pdGVtIHsgcGFkZGluZzogMTBweCAxNHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1ib3R0b206IDhweDsgZm9udC1zaXplOiAxMXB4OyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tcGFuZWwpOyB9CiAgICAuaGlzdG9yeS1pdGVtOmxhc3QtY2hpbGQgeyBtYXJnaW4tYm90dG9tOiAwOyB9CiAgICAucHJvZ3Jlc3MtYmFyLXdyYXAgeyBoZWlnaHQ6IDRweDsgYmFja2dyb3VuZDogdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogMnB4OyBtYXJnaW4tdG9wOiA4cHg7IG92ZXJmbG93OiBoaWRkZW47IH0KICAgIC5wcm9ncmVzcy1iYXItZmlsbCB7IGhlaWdodDogMTAwJTsgYm9yZGVyLXJhZGl1czogMnB4OyB0cmFuc2l0aW9uOiB3aWR0aCAwLjRzIGVhc2UsIGJhY2tncm91bmQgMC40cyBlYXNlOyB3aWR0aDogMCU7IH0KICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5Pgo8YnV0dG9uIGNsYXNzPSJ0aGVtZS10b2dnbGUiIG9uY2xpY2s9InRvZ2dsZVRoZW1lKCkiIGlkPSJ0aGVtZUJ0biI+4piAIExpZ2h0IE1vZGU8L2J1dHRvbj4KCjwhLS0gTVVMVEktU1RBVEUgQ09NUEFSRSBPVkVSTEFZIC0tPgo8ZGl2IGNsYXNzPSJjb21wYXJlLW92ZXJsYXkiIGlkPSJjb21wYXJlT3ZlcmxheSI+CiAgPGRpdiBjbGFzcz0iY29tcGFyZS1ib3giPgogICAgPGRpdiBjbGFzcz0icmVwb3J0LXRpdGxlIj5NdWx0aS1TdGF0ZSBOZXh1cyBUaHJlc2hvbGQgQ29tcGFyaXNvbiA8YnV0dG9uIGNsYXNzPSJidG4tc2Vjb25kYXJ5LWFjdGlvbiIgc3R5bGU9InBhZGRpbmc6NHB4IDEwcHg7IGZvbnQtc2l6ZToxMHB4OyIgb25jbGljaz0iY2xvc2VDb21wYXJlKCkiPltYXSBDbG9zZTwvYnV0dG9uPjwvZGl2PgogICAgPHAgc3R5bGU9ImZvbnQtc2l6ZToxMXB4OyBjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTsgbWFyZ2luLWJvdHRvbToxMnB4OyI+U2VsZWN0IHN0YXRlcyB0byBjb21wYXJlLiBZb3VyIGN1cnJlbnQgcmV2ZW51ZS90cmFuc2FjdGlvbiBpbnB1dHMgYXJlIHVzZWQgZm9yIHV0aWxpemF0aW9uIGNhbGN1bGF0aW9ucy48L3A+CiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7IGdhcDo4cHg7IGZsZXgtd3JhcDp3cmFwOyBtYXJnaW4tYm90dG9tOjE2cHg7IiBpZD0iY29tcGFyZVN0YXRlQ2hlY2tib3hlcyI+PC9kaXY+CiAgICA8YnV0dG9uIGNsYXNzPSJidG4tc3VibWl0IiBzdHlsZT0ibWFyZ2luLWJvdHRvbTowOyIgb25jbGljaz0icmVuZGVyQ29tcGFyZVRhYmxlKCkiPls+XSBSdW4gQ29tcGFyaXNvbjwvYnV0dG9uPgogICAgPGRpdiBpZD0iY29tcGFyZVRhYmxlQ29udGFpbmVyIiBzdHlsZT0ibWFyZ2luLXRvcDoxNnB4OyBvdmVyZmxvdy14OmF1dG87Ij48L2Rpdj4KICA8L2Rpdj4KPC9kaXY+Cgo8IS0tIEFVRElUIEhJU1RPUlkgUEFORUwgLS0+CjxkaXYgY2xhc3M9Imhpc3RvcnktcGFuZWwiIGlkPSJoaXN0b3J5UGFuZWwiPgogIDxkaXYgY2xhc3M9InJlcG9ydC10aXRsZSI+U2Vzc2lvbiBBdWRpdCBIaXN0b3J5IDxidXR0b24gY2xhc3M9ImJ0bi1zZWNvbmRhcnktYWN0aW9uIiBzdHlsZT0icGFkZGluZzo0cHggMTBweDsgZm9udC1zaXplOjEwcHg7IiBvbmNsaWNrPSJleHBvcnRBdWRpdEhpc3RvcnlDU1YoKSI+W+KGk10gQ1NWPC9idXR0b24+IDxidXR0b24gY2xhc3M9ImJ0bi1zZWNvbmRhcnktYWN0aW9uIiBzdHlsZT0icGFkZGluZzo0cHggMTBweDsgZm9udC1zaXplOjEwcHg7IiBvbmNsaWNrPSJwcm9jZXNzUGVuZGluZ1Byb3Zpc2lvbnMoKSI+W+KGu10gUmV0cnkgUGVuZGluZzwvYnV0dG9uPiA8YnV0dG9uIGNsYXNzPSJidG4tc2Vjb25kYXJ5LWFjdGlvbiIgc3R5bGU9InBhZGRpbmc6NHB4IDEwcHg7IGZvbnQtc2l6ZToxMHB4OyIgb25jbGljaz0ic2hvd1BlbmRpbmdQcm92aXNpb25RdWV1ZSgpIj5bIV0gVmlldyBQZW5kaW5nPC9idXR0b24+IDxidXR0b24gY2xhc3M9ImJ0bi1zZWNvbmRhcnktYWN0aW9uIiBzdHlsZT0icGFkZGluZzo0cHggMTBweDsgZm9udC1zaXplOjEwcHg7IiBvbmNsaWNrPSJjb25maWd1cmVQYXJ0bmVyc1VJKCkiPlvimpldIENvbmZpZ3VyZSBQYXJ0bmVyczwvYnV0dG9uPiA8YnV0dG9uIGNsYXNzPSJidG4tc2Vjb25kYXJ5LWFjdGlvbiIgc3R5bGU9InBhZGRpbmc6NHB4IDEwcHg7IGZvbnQtc2l6ZToxMHB4OyIgb25jbGljaz0iY2xlYXJIaXN0b3J5KCkiPltYXSBDbGVhcjwvYnV0dG9uPjwvZGl2PgogIDxkaXYgaWQ9Imhpc3RvcnlMaXN0Ij48L2Rpdj4KPC9kaXY+Cgo8IS0tIE5JQ0hFIE1PRFVMRSBOQVZJR0FUSU9OIERFQ0sgLS0+CjxkaXYgY2xhc3M9InRhYi1kZWNrIj4KICA8ZGl2IGlkPSJ0YWJfbmV4dXMiIGNsYXNzPSJ0YWItYnRuIGFjdGl2ZSIgb25jbGljaz0ic3dpdGNoTmljaGVDb25zb2xlKCduZXh1cycpIj4KICAgIDxkaXYgY2xhc3M9InRhYi1zdGF0dXMiPlsgU1lTVEVNIE9OTElORSBdPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJ0YWItdGl0bGUiPk1vZHVsZSAwMSAvLyBDb21tZXJjZSAmIE5leHVzPC9kaXY+CiAgPC9kaXY+CiAgPGRpdiBpZD0idGFiX2xvZ2lzdGljcyIgY2xhc3M9InRhYi1idG4iIG9uY2xpY2s9InN3aXRjaE5pY2hlQ29uc29sZSgnbG9naXN0aWNzJykiPgogICAgPGRpdiBjbGFzcz0idGFiLXN0YXR1cyIgc3R5bGU9ImNvbG9yOiB2YXIoLS13YXJuaW5nKTsiPlsgTk9ERSBSRUFEWSBdPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJ0YWItdGl0bGUiPk1vZHVsZSAwMiAvLyBJbnZvaWNlLXRvLUJvTCBBdXRvbWF0ZWQgRURJIEF1ZGl0IE1hdHJpeDwvZGl2PgogIDwvZGl2PgogIDxkaXYgaWQ9InRhYl9oZWFsdGhjYXJlIiBjbGFzcz0idGFiLWJ0biIgb25jbGljaz0ic3dpdGNoTmljaGVDb25zb2xlKCdoZWFsdGhjYXJlJykiPgogICAgPGRpdiBjbGFzcz0idGFiLXN0YXR1cyIgc3R5bGU9ImNvbG9yOiB2YXIoLS1kYW5nZXIpOyI+WyBTRUNVUkUgTE9DS0VEIF08L2Rpdj4KICAgIDxkaXYgY2xhc3M9InRhYi10aXRsZSI+TW9kdWxlIDAzIC8vIFN0YXJrIExhdyAmIEZNVjwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KCjwhLS0gQ09OVEFJTkVSIEFQUExJQ0FUSU9OIE1PRFVMRSBXUkFQUEVSIC0tPgo8ZGl2IGNsYXNzPSJ3cmFwcGVyIj4KICA8ZGl2IGNsYXNzPSJoZWFkZXIiPgogICAgPGgyIGlkPSJkeW5hbWljTWFpbkhlYWRlciI+QVNTRVQgTEFCUyBIVUI8L2gyPgogICAgPHAgaWQ9ImR5bmFtaWNTdWJIZWFkZXIiPk1vZHVsZSAwMSAvLyBDb21tZXJjZSAmIE5leHVzIE1hcHBpbmcgTWF0cml4PC9wPgogICAgPGRpdiBpZD0iZHluYW1pY0hlYWRlckJhZGdlIiBzdHlsZT0ibWFyZ2luLXRvcDoxMHB4OyBjb2xvcjogdmFyKC0tYWNjZW50KTsgZm9udC1zaXplOiAwLjc1cmVtOyBsZXR0ZXItc3BhY2luZzogMXB4OyI+QUNUSVZFIE5PREU6IE5FWFVTPC9kaXY+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2JhKDAsIDI0NSwgMTU1LCAwLjAyKTsgYm9yZGVyOiAxcHggZGFzaGVkIHJnYmEoMCwgMjQ1LCAxNTUsIDAuMik7IGJvcmRlci1yYWRpdXM6IDRweDsgcGFkZGluZzogMTBweDsgZm9udC1mYW1pbHk6IGluaGVyaXQ7IGZvbnQtc2l6ZTogMTFweDsgY29sb3I6IHZhcigtLWFjY2VudCk7IG1hcmdpbi1ib3R0b206IDIwcHg7IGRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyI+CiAgICAgICAgPGRpdj7ilrYgQ09SRSBFTkdJTkUgTk9ERTogQUNUSVZFPC9kaXY+CiAgICAgICAgPGRpdiBpZD0ibGl2ZVRlbGVtZXRyeVRpY2tlciIgc3R5bGU9ImZvbnQtd2VpZ2h0OiA3MDA7IHRleHQtYWxpZ246IHJpZ2h0OyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiPuKXjyBJTklUSUFMSVpJTkcgUkVHVUxBVE9SWSBMRURHRVIuLi48L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9ImR5bmFtaWNTdGF0dXNDYXJkIiBjbGFzcz0ic3RhdHVzLWNhcmQiPgogICAgICA8ZGl2IGNsYXNzPSJzdGF0dXMtY2FyZC10aXRsZSI+TGl2ZSBNb2R1bGUgSW5zaWdodDwvZGl2PgogICAgICA8ZGl2IGlkPSJsaXZlTW9kdWxlU3RhdHVzVGV4dCIgY2xhc3M9InN0YXR1cy1jYXJkLWJvZHkiPlN0YW5kYnk6IGF3YWl0aW5nIGNhdGVnb3J5IHNlbGVjdGlvbiBmb3IgYWN0aXZlIGF1ZGl0IG5vZGUuPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImR5bmFtaWNTdGF0dXNEZXRhaWwiIGNsYXNzPSJzdGF0dXMtY2FyZC1ib2R5IiBzdHlsZT0iY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpOyI+VGhlIGFjdGl2ZSBtb2R1bGUgaXMgcmVhZHkgdG8gZXZhbHVhdGUga2V5IHJlZ3VsYXRvcnkgZXhjZXB0aW9uIGNhdGVnb3JpZXMgYW5kIHJlbWVkaWF0aW9uIHdvcmtmbG93cy48L2Rpdj4KICAgICAgPGRpdiBpZD0ibGl2ZVJpc2tNaW5pR2F1Z2UiIGNsYXNzPSJyaXNrLW1pbmktZ2F1Z2UiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJyaXNrLW1pbmktbGFiZWwiPkxpdmUgUmlzayBIZWF0IE1ldGVyPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0icmlzay1taW5pLXRyYWNrIj48ZGl2IGlkPSJsaXZlUmlza01pbmlGaWxsIiBjbGFzcz0icmlzay1taW5pLWZpbGwiPjwvZGl2PjwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImxpdmVSaXNrTWluaVRleHQiIGNsYXNzPSJyaXNrLW1pbmktdGV4dCI+QXdhaXRpbmcgbG9naXN0aWNzIGF1ZGl0IHJlc3VsdHMuLi48L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InN0YXR1cy1jYXJkLW1ldGEiPjxzcGFuIGlkPSJkeW5hbWljU3RhdHVzQmFkZ2UiIGNsYXNzPSJzdGF0dXMtY2FyZC1waWxsIj5BQ1RJVkUgTk9ERTwvc3Bhbj48c3BhbiBpZD0ibGl2ZU1vZHVsZVByaW9yaXR5IiBjbGFzcz0ic3RhdHVzLWNhcmQtcGlsbCBzdGF0dXMtY2FyZC1wcmlvcml0eSI+UFJJT1JJVFk6IE4vQTwvc3Bhbj48c3BhbiBpZD0ibGl2ZU1vZHVsZU1ldGEiPkxhc3QgcmVmcmVzaDogLS06LS06LS08L3NwYW4+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8IS0tIFNFQ1VSSVRZIFRPS0VOICYgSU5QVVQgRk9STSAtLT4KICAgIDxkaXYgY2xhc3M9ImtleS1yb3ciPgogICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICA8bGFiZWwgZm9yPSJrZXlJbnB1dCI+RW50ZXJwcmlzZSBTZWN1cml0eSBUb2tlbiAvIExpY2Vuc2UgS2V5PC9sYWJlbD4KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImtleUlucHV0IiBjbGFzcz0iaW5wdXQtZmllbGQiIHBsYWNlaG9sZGVyPSJFbnRlciBhdXRob3JpemVkIGVudGVycHJpc2UgbGljZW5zZSBrZXkuLi4iPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDwhLS0gUVVJQ0sgU0VBUkNIIEZJTFRFUiAtLT4KICAgIDxkaXYgY2xhc3M9ImtleS1yb3ciIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAxNHB4OyI+CiAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgIDxsYWJlbCBmb3I9InNlYXJjaElucHV0RmlsdGVyIj5RdWljayBSZWdpc3RyeSBTZWFyY2g8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ic2VhcmNoSW5wdXRGaWx0ZXIiIGNsYXNzPSJpbnB1dC1maWVsZCIgcGxhY2Vob2xkZXI9IlR5cGUgdG8gc2VhcmNoIHN0YXRlcywgcGxheWJvb2tzLCBwYXJ0bmVycy4uLiIgb25pbnB1dD0idW5pdmVyc2FsUXVpY2tTZWFyY2goKSI+CiAgICAgICAgPGRpdiBpZD0icXVpY2tTZWFyY2hSZXN1bHRzIiBzdHlsZT0ibWFyZ2luLXRvcDo4cHg7IGRpc3BsYXk6bm9uZTsgYm9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOnZhcigtLXBhbmVsKTsgcGFkZGluZzo4cHg7IGJvcmRlci1yYWRpdXM6NnB4OyBtYXgtaGVpZ2h0OjIwMHB4OyBvdmVyZmxvdzphdXRvOyI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iZm9ybS1yb3ciPgogICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICA8bGFiZWwgaWQ9ImlucHV0TGFiZWxBIiBmb3I9InN0YXRlU2VsZWN0Ij5KdXJpc2RpY3Rpb24gLyBTdGF0ZTwvbGFiZWw+CiAgICAgICAgPHNlbGVjdCBpZD0ic3RhdGVTZWxlY3QiIGNsYXNzPSJpbnB1dC1maWVsZCIgb25jaGFuZ2U9ImhhbmRsZVNlbGVjdENoYW5nZSgpIj48L3NlbGVjdD4KICAgICAgICA8ZGl2IGNsYXNzPSJlcnJvci1tc2ciIGlkPSJlcnJTdGF0ZSI+4pqgIFBsZWFzZSBzZWxlY3QgYSB0YXJnZXQgcGFyYW1ldGVyLjwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgPGxhYmVsIGlkPSJpbnB1dExhYmVsQiIgZm9yPSJyZXZJbnB1dCI+UGVyaW9kIFJldmVudWUgKCQpPC9sYWJlbD4KICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0icmV2SW5wdXQiIGNsYXNzPSJpbnB1dC1maWVsZCIgdmFsdWU9IjAiIHBsYWNlaG9sZGVyPSIwIiBvbmZvY3VzPSJpZih0aGlzLnZhbHVlPT0nMCcpdGhpcy52YWx1ZT0nJzsiIG9uYmx1cj0iaWYodGhpcy52YWx1ZT09JycpdGhpcy52YWx1ZT0nMCc7Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJlcnJvci1tc2ciIGlkPSJlcnJSZXYiPuKaoCBWYWx1ZSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLjwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgPGxhYmVsIGlkPSJpbnB1dExhYmVsQyIgZm9yPSJ0cmFuc0lucHV0Ij5UeCBDb3VudCAvIFNjYW4gRGVsdGE8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGlkPSJ0cmFuc0lucHV0IiBjbGFzcz0iaW5wdXQtZmllbGQiIHZhbHVlPSIwIiBwbGFjZWhvbGRlcj0iMCIgbWluPSIwIiBzdGVwPSIxIiBvbmZvY3VzPSJpZih0aGlzLnZhbHVlPT0nMCcpdGhpcy52YWx1ZT0nJzsiIG9uYmx1cj0iaWYodGhpcy52YWx1ZT09JycpdGhpcy52YWx1ZT0nMCc7Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJlcnJvci1tc2ciIGlkPSJlcnJUcmFucyI+4pqgIFZhbHVlIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIuPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPCEtLSBNT0RVTEUgMDMgU1RBUksgTEFXIEVYVEVOREVEIElOUFVUUyDigJQgc2hvd24gb25seSBvbiBoZWFsdGhjYXJlIHRhYiAtLT4KICAgIDxkaXYgaWQ9ImhlYWx0aGNhcmVFeHRyYUlucHV0cyIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgogICAgICA8ZGl2IGNsYXNzPSJmb3JtLXJvdyIgc3R5bGU9ImdyaWQtdGVtcGxhdGUtY29sdW1uczogMmZyIDFmciAxZnI7Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgIDxsYWJlbCBmb3I9ImFycmFuZ2VtZW50VHlwZVNlbGVjdCI+QXJyYW5nZW1lbnQgVHlwZSAoNDIgQ0ZSKTwvbGFiZWw+CiAgICAgICAgICA8c2VsZWN0IGlkPSJhcnJhbmdlbWVudFR5cGVTZWxlY3QiIGNsYXNzPSJpbnB1dC1maWVsZCIgb25jaGFuZ2U9InNhdmVJbnB1dE1lbW9yeSgpIj48L3NlbGVjdD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgIDxsYWJlbCBmb3I9InZvbHVtZURlcGVuZGVudFNlbGVjdCI+Vm9sdW1lIC8gVmFsdWUgRGVwZW5kZW50PzwvbGFiZWw+CiAgICAgICAgICA8c2VsZWN0IGlkPSJ2b2x1bWVEZXBlbmRlbnRTZWxlY3QiIGNsYXNzPSJpbnB1dC1maWVsZCIgb25jaGFuZ2U9InNhdmVJbnB1dE1lbW9yeSgpIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj4tLSBTZWxlY3QgLS08L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZmFsc2UiPk5vIOKAlCBJbmRlcGVuZGVudDwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ0cnVlIj5ZZXMg4oCUIFRpZWQgdG8gUmVmZXJyYWxzPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgIDxsYWJlbCBmb3I9IndyaXR0ZW5BZ3JlZW1lbnRTZWxlY3QiPldyaXR0ZW4gQWdyZWVtZW50IEV4ZWN1dGVkPzwvbGFiZWw+CiAgICAgICAgICA8c2VsZWN0IGlkPSJ3cml0dGVuQWdyZWVtZW50U2VsZWN0IiBjbGFzcz0iaW5wdXQtZmllbGQiIG9uY2hhbmdlPSJzYXZlSW5wdXRNZW1vcnkoKSI+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+LS0gU2VsZWN0IC0tPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InRydWUiPlllcyDigJQgT24gRmlsZTwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJmYWxzZSI+Tm8g4oCUIE1pc3Npbmc8L29wdGlvbj4KICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZm9ybS1yb3ciIHN0eWxlPSJncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnIgMWZyOyBtYXJnaW4tYm90dG9tOiAwOyI+CiAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICA8bGFiZWwgZm9yPSJmbXZBcHByYWlzYWxTZWxlY3QiPkluZGVwZW5kZW50IEZNViBBcHByYWlzYWw/PC9sYWJlbD4KICAgICAgICAgIDxzZWxlY3QgaWQ9ImZtdkFwcHJhaXNhbFNlbGVjdCIgY2xhc3M9ImlucHV0LWZpZWxkIiBvbmNoYW5nZT0ic2F2ZUlucHV0TWVtb3J5KCkiPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPi0tIFNlbGVjdCAtLTwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ0cnVlIj5ZZXMg4oCUIERvY3VtZW50ZWQ8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZmFsc2UiPk5vIOKAlCBOb3QgT2J0YWluZWQ8L29wdGlvbj4KICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgPGxhYmVsIGZvcj0iaG91cmx5UmF0ZUlucHV0Ij5Db250cmFjdGVkIEhvdXJseSBSYXRlICgkKTwvbGFiZWw+CiAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0iaG91cmx5UmF0ZUlucHV0IiBjbGFzcz0iaW5wdXQtZmllbGQiIHZhbHVlPSIwIiBwbGFjZWhvbGRlcj0iMCIgbWluPSIwIiBzdGVwPSIwLjAxIiBvbmNoYW5nZT0ic2F2ZUlucHV0TWVtb3J5KCkiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWU9PScwJyl0aGlzLnZhbHVlPScnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPScwJzsiPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgPGxhYmVsIGZvcj0ib3ZlcnBheW1lbnREYXRlSW5wdXQiPk92ZXJwYXltZW50IERhdGUgSWRlbnRpZmllZDwvbGFiZWw+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iZGF0ZSIgaWQ9Im92ZXJwYXltZW50RGF0ZUlucHV0IiBjbGFzcz0iaW5wdXQtZmllbGQiIG9uY2hhbmdlPSJzYXZlSW5wdXRNZW1vcnkoKSIgc3R5bGU9ImhlaWdodDo0NXB4OyIgbWF4PSIiPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgPGxhYmVsIGZvcj0idG9sbGVkU2VsZWN0Ij5TRFAvU1JEUCBUb2xsaW5nIEFjdGl2ZT88L2xhYmVsPgogICAgICAgICAgPHNlbGVjdCBpZD0idG9sbGVkU2VsZWN0IiBjbGFzcz0iaW5wdXQtZmllbGQiIG9uY2hhbmdlPSJzYXZlSW5wdXRNZW1vcnkoKSI+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+LS0gU2VsZWN0IC0tPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImZhbHNlIj5ObyDigJQgNjAtRGF5IENsb2NrIFJ1bm5pbmc8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idHJ1ZSI+WWVzIOKAlCBUb2xsZWQgKFNEUC9TUkRQIEZpbGVkKTwvb3B0aW9uPgogICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7IHRleHQtYWxpZ246cmlnaHQ7Ij4KICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1zZWNvbmRhcnktYWN0aW9uIiBzdHlsZT0icGFkZGluZzo0cHggMTJweDsgZm9udC1zaXplOjEwcHg7IiBvbmNsaWNrPSJjbGVhckhlYWx0aGNhcmVTZXNzaW9uKCkiPlvihrpdIE5ldyBTZXNzaW9uPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJsb2dpc3RpY3NJbnB1dEhlbHBlciIgY2xhc3M9InN0YXR1cy1jYXJkIiBzdHlsZT0iZGlzcGxheTpub25lOyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMDMpOyBib3JkZXItY29sb3I6IHJnYmEoMCwyNDUsMTU1LDAuMTIpOyBjb2xvcjogdmFyKC0tdGV4dC1tYWluKTsiPgogICAgICA8ZGl2IGNsYXNzPSJzdGF0dXMtY2FyZC10aXRsZSI+TG9naXN0aWNzIElucHV0IEd1aWRhbmNlPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImxvZ2lzdGljc0lucHV0SGVscGVyVGV4dCIgY2xhc3M9InN0YXR1cy1jYXJkLWJvZHkiPlNlbGVjdCBhbiBJbnZvaWNlLXRvLUJvTCBleGNlcHRpb24gY2F0ZWdvcnkgdG8gc2VlIHRhaWxvcmVkIGRhdGEgaW5wdXQgZ3VpZGFuY2UgYW5kIHNjb3JpbmcgZXhwZWN0YXRpb25zLjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzdGF0dXMtY2FyZC1tZXRhIj48c3BhbiBpZD0ibG9naXN0aWNzSW5wdXRIZWxwZXJNZXRhIj5JbnB1dCBjb250ZXh0IHdpbGwgYXBwZWFyIG9uY2UgYSBjYXRlZ29yeSBpcyBzZWxlY3RlZC48L3NwYW4+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8YnV0dG9uIGlkPSJleGVjQnRuIiBjbGFzcz0iYnRuLXN1Ym1pdCIgb25jbGljaz0icnVuQXVkaXQoKSI+RXhlY3V0ZSBNYXRyaXggQW5hbHlzaXMgPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTo5cHg7IG9wYWNpdHk6MC42OyI+KOKMmC9DdHJsK0VudGVyKTwvc3Bhbj48L2J1dHRvbj4KICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDsgZ2FwOjhweDsgbWFyZ2luLWJvdHRvbToxMnB4OyI+CiAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1zZWNvbmRhcnktYWN0aW9uIiBzdHlsZT0iZmxleDoxOyIgb25jbGljaz0icmVzZXRUZXJtaW5hbE1lbW9yeSgpIj5bWF0gUmVzZXQgVGVybWluYWwgTWVtb3J5ICYgQ2FjaGU8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXNlY29uZGFyeS1hY3Rpb24iIGlkPSJjb21wYXJlQnRuIiBzdHlsZT0iZmxleDoxOyBkaXNwbGF5Om5vbmU7IiBvbmNsaWNrPSJvcGVuQ29tcGFyZSgpIj5b4oqeXSBDb21wYXJlIFN0YXRlczwvYnV0dG9uPgogICAgPC9kaXY+CiAgICAKICAgIDxkaXYgaWQ9InJlcG9ydFBhbmVsIiBjbGFzcz0icmVwb3J0LXBhbmVsIj4KICAgICAgPGRpdiBjbGFzcz0icmVwb3J0LXRpdGxlIj4KICAgICAgICA8c3Bhbj5EaWFnbm9zdGljIENvbXBsaWFuY2UgQnJlYWtkb3duPC9zcGFuPgogICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDsgZ2FwOjZweDsiPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXNlY29uZGFyeS1hY3Rpb24iIHN0eWxlPSJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAxMHB4OyIgb25jbGljaz0iZXhwb3J0QXVkaXRSZXBvcnRKU09OKCkiPlvihpNdIEpTT048L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1zZWNvbmRhcnktYWN0aW9uIiBzdHlsZT0icGFkZGluZzogNHB4IDEwcHg7IGZvbnQtc2l6ZTogMTBweDsiIG9uY2xpY2s9ImV4cG9ydEF1ZGl0UmVwb3J0Q1NWKCkiPlvihpNdIENTVjwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ibWF0cml4LWJveCBmdWxsLXdpZHRoIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tYm90dG9tOiAxNnB4OyBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuMjUpOyI+CiAgICAgICAgPGRpdiBjbGFzcz0iZGF0YS1sYWJlbCI+RGlhZ25vc3RpYyBUaHJlYXQgTGV2ZWw8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJ1aVN0YXR1cyIgc3R5bGU9Im1hcmdpbi10b3A6IDZweDsiPjwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9Im1hdHJpeC1ncmlkIj4KICAgICAgICA8ZGl2IGNsYXNzPSJtYXRyaXgtYm94Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRhdGEtbGFiZWwiIGlkPSJncmlkTGFiZWxBIj5UYXJnZXQgSnVyaXNkaWN0aW9uPC9kaXY+CiAgICAgICAgICA8ZGl2IGlkPSJ1aVN0YXRlIiBjbGFzcz0iZGF0YS12YWx1ZSI+4oCUPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibWF0cml4LWJveCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhLWxhYmVsIiBpZD0iZ3JpZExhYmVsQiI+Q2FwYWNpdHkgVXRpbGl6YXRpb248L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9InVpUGN0IiBjbGFzcz0iZGF0YS12YWx1ZSI+4oCUPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ncmVzcy1iYXItd3JhcCI+PGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyLWZpbGwiIGlkPSJ1aVByb2dyZXNzRmlsbCI+PC9kaXY+PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibWF0cml4LWJveCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhLWxhYmVsIiBpZD0iZ3JpZExhYmVsQyI+U3RhdHV0b3J5IExpbWl0IFRocmVzaG9sZDwvZGl2PgogICAgICAgICAgPGRpdiBpZD0idWlSZXYiIGNsYXNzPSJkYXRhLXZhbHVlIj7igJQ8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtYXRyaXgtYm94Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRhdGEtbGFiZWwiIGlkPSJncmlkTGFiZWxEIj5OZXh1cyBFdmFsdWF0aW9uIFdpbmRvdzwvZGl2PgogICAgICAgICAgPGRpdiBpZD0idWlQZXJpb2QiIGNsYXNzPSJkYXRhLXZhbHVlIj7igJQ8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9InJpc2tJbnNpZ2h0UGFuZWwiIGNsYXNzPSJtYXRyaXgtYm94IGZ1bGwtd2lkdGgiIHN0eWxlPSJkaXNwbGF5Om5vbmU7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4wOCk7IGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4wNCk7Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhLWxhYmVsIj5Mb2dpc3RpY3MgUmlzayBJbnRlbGxpZ2VuY2U8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJyaXNrR2F1Z2VXcmFwcGVyIiBjbGFzcz0icmlzay1nYXVnZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJyaXNrLWdhdWdlLWxhYmVsIj5SaXNrIEhlYXQgTWV0ZXI8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InJpc2stZ2F1Z2UtdHJhY2siPjxkaXYgaWQ9InJpc2tHYXVnZUZpbGwiIGNsYXNzPSJyaXNrLWdhdWdlLWZpbGwiPjwvZGl2PjwvZGl2PgogICAgICAgICAgPGRpdiBpZD0icmlza0dhdWdlVGV4dCIgY2xhc3M9InJpc2stZ2F1Z2UtdGV4dCI+QXdhaXRpbmcgY2F0ZWdvcnkgbWV0cmljcy4uLjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9InJpc2tJbmRleFZhbHVlIiBjbGFzcz0iZGF0YS12YWx1ZSI+UmlzayBJbmRleDog4oCUPC9kaXY+CiAgICAgICAgPGRpdiBpZD0icmlza1ByaW9yaXR5VmFsdWUiIGNsYXNzPSJkYXRhLXZhbHVlIj5Qcmlvcml0eTog4oCUPC9kaXY+CiAgICAgICAgPGRpdiBpZD0icmlza1JlY29tbWVuZGF0aW9uVmFsdWUiIHN0eWxlPSJjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7IGZvbnQtc2l6ZTogMTFweDsgbWFyZ2luLXRvcDogNnB4OyBsaW5lLWhlaWdodDoxLjQ7Ij5Bd2FpdGluZyBleGNlcHRpb24gY2F0ZWdvcnkgaW5wdXQuPC9kaXY+CiAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDo4cHg7IGRpc3BsYXk6ZmxleDsgZ2FwOjhweDsgYWxpZ24taXRlbXM6Y2VudGVyOyI+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tc2Vjb25kYXJ5LWFjdGlvbiIgb25jbGljaz0ibGF1bmNoUGF0aDAxV29ya2Zsb3coKSI+W+KktF0gUGFydG5lciBSZW1lZGlhdGlvbjwvYnV0dG9uPgogICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOjExcHg7IGNvbG9yOnZhcigtLXRleHQtbXV0ZWQpOyI+Q29ubmVjdCB3aXRoIHBhcnRuZXIgcmVtZWRpYXRpb24gZm9yIGd1aWRlZCByZXNvbHV0aW9uLjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgCiAgICAgIDwhLS0gRFlOQU1JQyBSRVNPTFVUSU9OIFBST1RPQ09MIERJU1BMQVkgLS0+CiAgICAgIDxkaXYgaWQ9InByb3RvY29sU2VjdGlvbldyYXBwZXIiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICAgICAgPGRpdiBjbGFzcz0icHJvdG9jb2wtYm94Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9InByb3RvY29sLWhlYWRlciI+CiAgICAgICAgICAgIDxzcGFuIGlkPSJwcm90b2NvbFRpdGxlIj5SZXNvbHV0aW9uIFByb3RvY29sICYgUmVndWxhdG9yeSBBY3Rpb248L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGlkPSJwcm90b2NvbFNldmVyaXR5IiBjbGFzcz0ic3RhdHVzLWJhZGdlIiBzdHlsZT0icGFkZGluZzogMnB4IDZweDsgZm9udC1zaXplOiA5cHg7Ij7igJQ8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9InByb3RvY29sUmlza0NvbnNlcXVlbmNlIiBzdHlsZT0iY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiAxMHB4OyBmb250LXNpemU6IDExcHg7Ij48L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9InByb3RvY29sU3RlcHMiIHN0eWxlPSJjb2xvcjogI2ZmZjsgZm9udC13ZWlnaHQ6IDUwMDsiPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDwhLS0gRFlOQU1JQyBQUk9GSUxFIENBUkQgQkFER0VTIC0tPgogICAgICA8ZGl2IGlkPSJiYWRnZVNlY3Rpb25XcmFwcGVyIiBzdHlsZT0ibWFyZ2luLXRvcDogMTZweDsiPgogICAgICAgIDxkaXYgY2xhc3M9Im1hdHJpeC10aXRsZSIgaWQ9ImJhZGdlU2VjdGlvblRpdGxlIj5OaWNoZSBQcm9kdWN0IEV4ZW1wdGlvbiBTdGF0dXMgKFRhYiAzIEV4dGVuZGVkIE1hdHJpeCk8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJiYWRnZS1ncmlkIiBpZD0iZHluYW1pY0JhZGdlR3JpZCI+CiAgICAgICAgICA8ZGl2IGlkPSJiYWRnZTAxIiBjbGFzcz0iYmFkZ2UiPlNhYVM8L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9ImJhZGdlMDIiIGNsYXNzPSJiYWRnZSI+QXBwYXJlbDwvZGl2PgogICAgICAgICAgPGRpdiBpZD0iYmFkZ2UwMyIgY2xhc3M9ImJhZGdlIj5TdXBwczwvZGl2PgogICAgICAgICAgPGRpdiBpZD0iYmFkZ2UwNCIgY2xhc3M9ImJhZGdlIj5QcmVwLiBGb29kPC9kaXY+CiAgICAgICAgICA8ZGl2IGlkPSJiYWRnZTA1IiBjbGFzcz0iYmFkZ2UiPkFsY29ob2w8L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9ImJhZGdlMDYiIGNsYXNzPSJiYWRnZSI+TWFya2V0cGxhY2U8L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9ImJhZGdlMDciIGNsYXNzPSJiYWRnZSI+QjJCIFJlc2FsZTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9InVwZ3JhZGUtYmFubmVyIiBpZD0idHJpYWxBbGVydCIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjwvZGl2PgogICAgPC9kaXY+CiAgPC9kaXY+CjwvZGl2PgoKPCEtLSBNT0RVTEUgMiAmIDM6IElOVEVSQUNUSVZFIEFTU0VTU01FTlQgTEVBRC1DQVBUVVJFIElOVEVSQ0VQVCBEUkFXRVIgLS0+CjxkaXYgY2xhc3M9InBsYXlib29rLXZpZXciIGlkPSJpbnRlbENhcHR1cmVCbG9jayIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnLXNlY29uZGFyeSk7IGJvcmRlci1yYWRpdXM6IDhweDsiPgogICAgPCEtLSBGaWxsZWQgZHluYW1pY2FsbHkgYnkgSmF2YVNjcmlwdCAtLT4KPC9kaXY+Cgo8IS0tIERZTkFNSUMgUExBWUJPT0tTIFJFR0lTVFJZIENPTlRBSU5FUiAtLT4KPHNjcmlwdD5kb2N1bWVudC5ib2R5Lmluc2VydEJlZm9yZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlzdG9yeVBhbmVsJyksIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tYXRyaXgtYm94W3N0eWxlKj0ibWF4LXdpZHRoOiA4NTBweCJdJykgfHwgZG9jdW1lbnQuYm9keS5sYXN0RWxlbWVudENoaWxkKTs8L3NjcmlwdD4KPGRpdiBjbGFzcz0ibWF0cml4LWJveCIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXgtd2lkdGg6IDg1MHB4OyBwYWRkaW5nOiAyNHB4OyBtYXJnaW4tYm90dG9tOiA2MHB4OyBib3gtc2l6aW5nOiBib3JkZXItYm94OyI+CiAgICA8ZGl2IGNsYXNzPSJyZXBvcnQtdGl0bGUiPkF2YWlsYWJsZSBTeXN0ZW0gRGlhZ25vc3RpYyBMb2dzIFJlZ2lzdGVyPC9kaXY+CiAgICA8ZGl2IGlkPSJkeW5hbWljUGxheWJvb2tzQ29udGFpbmVyIj48L2Rpdj4KPC9kaXY+Cgo8c2NyaXB0PgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqCiAqIEVOSEFOQ0VEIFJPQlVTVCBBTlRJLVBJUkFDWSAmIFNDUkFQRVIgQ09VTlRFUi1NRUFTVVJFICAgICAgICAgICAgICoKICogTW9kZTogU3RyaWN0IEV4YWN0IE1hdGNoIChTdWJkb21haW4gJiBQcmVmaXggUHJvdGVjdGlvbikgICAgICAgICAgKgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICBjb25zdCBhdXRob3JpemVkSG9zdHMgPSBbCiAgICAiYXNzZXRsYWJzLnBhZ2VzLmRldiIsIAogICAgImxvY2FsaG9zdCIsIAogICAgIjEyNy4wLjAuMSIKICBdOwogIAogIGNvbnN0IGN1cnJlbnRIb3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lOwogIGNvbnN0IGN1cnJlbnRQcm90b2NvbCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbDsKICBjb25zdCBpc0xvY2FsRmlsZSA9IGN1cnJlbnRQcm90b2NvbCA9PT0gJ2ZpbGU6JzsKICBjb25zdCBpc0Rldkhvc3QgPSBjdXJyZW50SG9zdCA9PT0gJ2xvY2FsaG9zdCcgfHwgY3VycmVudEhvc3QgPT09ICcxMjcuMC4wLjEnOwogIGNvbnN0IGlzQXV0aG9yaXplZEhvc3QgPSBhdXRob3JpemVkSG9zdHMuaW5jbHVkZXMoY3VycmVudEhvc3QpIHx8IGlzTG9jYWxGaWxlIHx8IGlzRGV2SG9zdDsKICBjb25zdCBpc0F1dGhvcml6ZWRQcm90b2NvbCA9IGN1cnJlbnRQcm90b2NvbCA9PT0gJ2h0dHBzOicgfHwgY3VycmVudFByb3RvY29sID09PSAnaHR0cDonIHx8IGlzTG9jYWxGaWxlOwoKICBpZiAod2luZG93LnNlbGYgIT09IHdpbmRvdy50b3ApIHsKICAgIHRyeSB7CiAgICAgIHdpbmRvdy50b3AubG9jYXRpb24gPSB3aW5kb3cuc2VsZi5sb2NhdGlvbjsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBpZiAoIWlzQXV0aG9yaXplZEhvc3QgfHwgIWlzQXV0aG9yaXplZFByb3RvY29sKSB7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHsKICAgICAgZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSBgCiAgICAgICAgPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogIzA2MDkxMzsgY29sb3I6ICNmZjMzNDQ7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IHBhZGRpbmc6IDQwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgaGVpZ2h0OiAxMDB2aDsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7Ij4KICAgICAgICAgIDxoMiBzdHlsZT0ibGV0dGVyLXNwYWNpbmc6IDJweDsgbWFyZ2luLWJvdHRvbTogMTBweDsiPlshXSBDUklUSUNBTCBFUlJPUjogQU5USS1QSVJBQ1kgU0VDVVJJVFkgUE9MSUNZIFZJT0xBVElPTjwvaDI+CiAgICAgICAgICA8cCBzdHlsZT0iY29sb3I6ICM5Y2EzYWY7IGZvbnQtc2l6ZTogMTJweDsgbWF4LXdpZHRoOiA1MDBweDsgbGluZS1oZWlnaHQ6IDEuNTsiPgogICAgICAgICAgICBUaGlzIGNvbXBsaWFuY2UgdGVybWluYWwgaW5zdGFuY2UgaGFzIGRldGVjdGVkIGFuIHVuYXV0aG9yaXplZCBydW50aW1lIGVudmlyb25tZW50IG9yIHNjcmFwZXIgKDxjb2RlPiR7Y3VycmVudEhvc3QgfHwgJ2ZpbGU6Ly8nfTwvY29kZT4pLiBFeGVjdXRpb24gaGFzIGJlZW4gdGVybWluYXRlZCB0byBwcm90ZWN0IHByb3ByaWV0YXJ5IEFzc2V0IExhYnMgbWF0cml4IGxvZ2ljLgogICAgICAgICAgPC9wPgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgfSk7CiAgICAKICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICJodHRwczovL2dvb2dsZS5jb20iOwogICAgfSwgMTUwMCk7CiAgICAKICAgIHRocm93IG5ldyBFcnJvcigiQ3JpdGljYWwgQW50aS1TZWN1cml0eSBGYXVsdDogVW5hdXRob3JpemVkIEhvc3QgRW52aXJvbm1lbnQuIik7CiAgfQp9KSgpOwoKLy8gRFlOQU1JQyBURUxFTUVUUlkgTE9HUyBUSUNLRVIKY29uc3QgdGVsZW1ldHJ5TG9ncyA9IHsKICBuZXh1czogWwogICAgIj4gW1RBWF9ORVhVU10gRXZhbHVhdGluZyB0cmFuc2FjdGlvbiB2b2x1bWUgY2FwcyB1bmRlciBTb3V0aCBEYWtvdGEgdi4gV2F5ZmFpciBzdGF0dXRvcnkgbG9naWMuIiwKICAgICI+IFtUQVhfTkVYVVNdIFNjYW5uaW5nIHJlbW90ZSBzZWxsZXIgcmV2ZW51ZSBhbmQgdHJhbnNhY3Rpb24gdmVsb2NpdHkgYWdhaW5zdCA1MC1zdGF0ZSBlY29ub21pYyBuZXh1cyB0aHJlc2hvbGRzLiIsCiAgICAiPiBbVEFYX05FWFVTXSBBc3Nlc3NpbmcgbWFya2V0cGxhY2UgZmFjaWxpdGF0b3IgY2FydmUtb3V0IGFuZCBleGVtcHRpb24gc3RhdHVzIGZvciBhY3RpdmUgcHJvZHVjdCBsaW5lcy4iLAogICAgIj4gW1RBWF9ORVhVU10gVmFsaWRhdGluZyBTYWFTLCBhcHBhcmVsLCBzdXBwbGVtZW50cyBhbmQgYWxjb2hvbCBuZXh1cyBhcHBsaWNhYmlsaXR5IHdpdGggYWRhcHRpdmUgdGhyZXNob2xkIGxvZ2ljLiIKICBdLAogIGxvZ2lzdGljczogWwogICAgIj4gW0lOVk9JQ0UtVE8tQk9MXSBBdWRpdGluZyBFRElGQUNUIFZFUk1BUyBhbmQgWDEyIDMwNCB3ZWlnaHQgZGVjbGFyYXRpb25zIGFnYWluc3QgU09MQVMgVkdNIGN1dC1vZmYgcnVsZXMuIiwKICAgICI+IFtJTlZPSUNFLVRPLUJPTF0gVmVyaWZ5aW5nIElTRiAxMCsyIGFuZCBDQ0FNIE5vdGlmeSBQYXJ0eSBlbnRlcnByaXNlIGNvZGUgY29tcGxpYW5jZSBmb3IgZ2xvYmFsIG9jZWFuIHNoaXBtZW50cy4iLAogICAgIj4gW0lOVk9JQ0UtVE8tQk9MXSBGbGFnZ2luZyBtYW5pZmVzdCB2ZXNzZWwvdm95YWdlIG1pc21hdGNoLCBJTURHIGFtZW5kbWVudCBkcmlmdCwgYW5kIEFNUy9JQ1MyIEVESSB2YWxpZGF0aW9uIGlzc3Vlcy4iLAogICAgIj4gW0lOVk9JQ0UtVE8tQk9MXSBFdmFsdWF0aW5nIGludm9pY2UtdG8tQm9MIHJlY29uY2lsaWF0aW9uIGV4Y2VwdGlvbnMgd2l0aCBoYXJkLXN0b3AgYW5kIHNvZnQtaG9sZCByZW1lZGlhdGlvbiBhY3Rpb25zLiIKICBdLAogIGhlYWx0aGNhcmU6IFsKICAgICI+IFtTVEFSS19MQVddIENvbnRyYWN0IHRocmVzaG9sZCBkZWx0YSB2YWxpZGF0aW9uIGV4ZWN1dGluZyBmb3IgU3RhcmsgTGF3IGFubnVhbCBhZ2dyZWdhdGVzLiIsCiAgICAiPiBbU1RBUktfTEFXXSBTY2FubmluZyA0MiBDRlIgwqc0MTEuMzU3IGxpbWl0ZWQgcmVtdW5lcmF0aW9uIGFuZCBGTVYgY29tcGxpYW5jZSBiZW5jaG1hcmtzLiIsCiAgICAiPiBbU1RBUktfTEFXXSBFdmFsdWF0aW5nIHdyaXR0ZW4gYWdyZWVtZW50LCB2b2x1bWUgZGVwZW5kZW5jeSwgYW5kIHNhZmUgaGFyYm9yIGVsaWdpYmlsaXR5IGFnYWluc3QgQ01TIGd1aWRhbmNlLiIsCiAgICAiPiBbU1RBUktfTEFXXSBBc3Nlc3Npbmcgc2VsZi1kaXNjbG9zdXJlIHJlYWRpbmVzcyBmb3IgcG90ZW50aWFsIG92ZXJwYXltZW50IGV2ZW50cyB1bmRlciBDTVMgNjAtZGF5IHJ1bGUuIgogIF0KfTsKCmZ1bmN0aW9uIGdldFRlbGVtZXRyeUxvZygpIHsKICBjb25zdCBhY3RpdmVOaWNoZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdhY3RpdmVfbmljaGUnKSB8fCAnbmV4dXMnOwogIGNvbnN0IGxvZ3MgPSB0ZWxlbWV0cnlMb2dzW2FjdGl2ZU5pY2hlXSB8fCB0ZWxlbWV0cnlMb2dzLm5leHVzOwogIHJldHVybiBsb2dzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGxvZ3MubGVuZ3RoKV07Cn0KCmZ1bmN0aW9uIGdldE1vZHVsZVN0YXR1c0xhYmVsKG5pY2hlKSB7CiAgcmV0dXJuIHsKICAgIG5leHVzOiAnTkVYVVMgTk9ERScsCiAgICBsb2dpc3RpY3M6ICdFREkgQVVESVQgTk9ERScsCiAgICBoZWFsdGhjYXJlOiAnSEVBTFRIQ0FSRSBOT0RFJwogIH1bbmljaGVdIHx8ICdBQ1RJVkUgTk9ERSc7Cn0KCmNvbnN0IG1vZHVsZVN0YXR1c0hpbnRzID0gewogIG5leHVzOiAnVXNlIHJldmVudWUgYW5kIHRyYW5zYWN0aW9uIHZvbHVtZSBpbnB1dHMgdG8gZXZhbHVhdGUgZWNvbm9taWMgbmV4dXMgdGhyZXNob2xkcyBhbmQgZXhlbXB0aW9uIGV4cG9zdXJlIGZvciB0aGUgc2VsZWN0ZWQgc3RhdGUuJywKICBsb2dpc3RpY3M6ICdTZWxlY3QgYW4gSW52b2ljZS10by1Cb0wgZXhjZXB0aW9uIGNhdGVnb3J5IGFuZCBlbnRlciB0aGUgc2Nhbm5lZCB2cyBkZWNsYXJlZCBtZXRyaWNzIHRvIGNhbGN1bGF0ZSBFREkgcmlzayBhbmQgU0xBIGJyZWFjaCBndWlkYW5jZS4nLAogIGhlYWx0aGNhcmU6ICdTZWxlY3QgYSBzcGVjaWFsdHksIGNhcHR1cmUgY29tcGVuc2F0aW9uIGFuZCByZWZlcnJhbCB2b2x1bWUsIGFuZCBjb21wbGV0ZSB0aGUgU3RhcmsgTGF3IGFycmFuZ2VtZW50IGlucHV0cyB0byBhc3Nlc3MgRk1WIGFuZCBDTVMgb3ZlcnBheW1lbnQgcmlzay4nCn07CgpmdW5jdGlvbiBnZXRTZWxlY3RlZENhdGVnb3J5TWVzc2FnZShuaWNoZSwgc2VsZWN0VmFsKSB7CiAgaWYgKCFzZWxlY3RWYWwpIHJldHVybiAnU3RhbmRieTogYXdhaXRpbmcgY2F0ZWdvcnkgc2VsZWN0aW9uIGZvciBhY3RpdmUgYXVkaXQgbm9kZS4nOwogIGlmIChuaWNoZSA9PT0gJ25leHVzJykgcmV0dXJuIGBQcmVwYXJpbmcgJHtzZWxlY3RWYWx9IGZvciBzdGF0ZSB0YXggbmV4dXMgdGhyZXNob2xkIGFzc2Vzc21lbnQgYW5kIGV4ZW1wdGlvbiBzY29yaW5nLmA7CiAgaWYgKG5pY2hlID09PSAnbG9naXN0aWNzJykgewogICAgY29uc3QgaXRlbSA9IG1hcml0aW1lX2RiW3BhcnNlSW50KHNlbGVjdFZhbCldOwogICAgcmV0dXJuIGl0ZW0gPyBgUHJlcGFyaW5nICR7aXRlbS5jYXR9ICgke2l0ZW0uc2V2fSkgZm9yIEVESSByZWNvbmNpbGlhdGlvbiBhbmQgU0xBIGV4Y2VwdGlvbiBldmFsdWF0aW9uLmAgOiAnU3RhbmRieTogYXdhaXRpbmcgaW52b2ljZS10by1Cb0wgZXhjZXB0aW9uIHNlbGVjdGlvbi4nOwogIH0KICBpZiAobmljaGUgPT09ICdoZWFsdGhjYXJlJykgewogICAgY29uc3QgZGF0YSA9IGhlYWx0aGNhcmVfZGJbc2VsZWN0VmFsXTsKICAgIHJldHVybiBkYXRhID8gYFByZXBhcmluZyAke2RhdGEuc3BlY2lhbHR5fSBmb3IgU3RhcmsgTGF3IEZNViByZXZpZXcgYW5kIENNUyBvdmVycGF5bWVudCBjbG9jayBhc3Nlc3NtZW50LmAgOiAnU3RhbmRieTogYXdhaXRpbmcgc3BlY2lhbHR5IHNlbGVjdGlvbi4nOwogIH0KICByZXR1cm4gJ1N0YW5kYnk6IGF3YWl0aW5nIGFjdGl2ZSBhdWRpdCBjb250ZXh0Lic7Cn0KCmZ1bmN0aW9uIHVwZGF0ZUFjdGl2ZUhlYWRlckJhZGdlKG5pY2hlKSB7CiAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHluYW1pY0hlYWRlckJhZGdlJyk7CiAgaWYgKCFiYWRnZSkgcmV0dXJuOwogIGNvbnN0IGxhYmVscyA9IHsKICAgIG5leHVzOiAnTkVYVVMnLAogICAgbG9naXN0aWNzOiAnSU5WT0lDRS1UTy1CT0wgRURJIEFVRElUJywKICAgIGhlYWx0aGNhcmU6ICdTVEFSSyBMQVcgRk1WJwogIH07CiAgYmFkZ2UuaW5uZXJUZXh0ID0gYEFDVElWRSBOT0RFOiAke2xhYmVsc1tuaWNoZV0gfHwgJ0NPUkUgTk9ERSd9YDsKfQoKZnVuY3Rpb24gdXBkYXRlTGl2ZVN0YXR1c0NhcmQoKSB7CiAgY29uc3QgYWN0aXZlTmljaGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYWN0aXZlX25pY2hlJykgfHwgJ25leHVzJzsKICBjb25zdCBzZWxlY3RWYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdGVTZWxlY3QnKT8udmFsdWUgfHwgJyc7CiAgY29uc3Qgc3RhdHVzQ2FyZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkeW5hbWljU3RhdHVzQ2FyZCcpOwogIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R5bmFtaWNTdGF0dXNCYWRnZScpOwogIGNvbnN0IHN0YXR1c1RleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGl2ZU1vZHVsZVN0YXR1c1RleHQnKTsKICBjb25zdCBkZXRhaWxUZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R5bmFtaWNTdGF0dXNEZXRhaWwnKTsKICBjb25zdCBtZXRhVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaXZlTW9kdWxlTWV0YScpOwogIGNvbnN0IHByaW9yaXR5UGlsbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaXZlTW9kdWxlUHJpb3JpdHknKTsKICBpZiAoIXN0YXR1c0NhcmQgfHwgIWJhZGdlIHx8ICFzdGF0dXNUZXh0IHx8ICFkZXRhaWxUZXh0IHx8ICFtZXRhVGV4dCkgcmV0dXJuOwogIHN0YXR1c0NhcmQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgYmFkZ2UuaW5uZXJUZXh0ID0gZ2V0TW9kdWxlU3RhdHVzTGFiZWwoYWN0aXZlTmljaGUpOwogIGxldCBzdW1tYXJ5ID0gZ2V0U2VsZWN0ZWRDYXRlZ29yeU1lc3NhZ2UoYWN0aXZlTmljaGUsIHNlbGVjdFZhbCk7CiAgbGV0IGRldGFpbCA9IG1vZHVsZVN0YXR1c0hpbnRzW2FjdGl2ZU5pY2hlXSB8fCAnVXNlIHRoZSBhY3RpdmUgY29udHJvbHMgdG8gZXZhbHVhdGUgcmlzayBhbmQgcmVtZWRpYXRpb24gZm9yIHRoZSBzZWxlY3RlZCBtb2R1bGUuJzsKICBsZXQgcHJpb3JpdHkgPSAnTi9BJzsKCiAgaWYgKGFjdGl2ZU5pY2hlID09PSAnbG9naXN0aWNzJykgewogICAgY29uc3QgaXRlbSA9IG1hcml0aW1lX2RiW3BhcnNlSW50KHNlbGVjdFZhbCldOwogICAgY29uc3QgdmFsQiA9IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JldklucHV0JykudmFsdWUpIHx8IDA7CiAgICBjb25zdCB2YWxDID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJhbnNJbnB1dCcpLnZhbHVlKSB8fCAwOwogICAgaWYgKGl0ZW0pIHsKICAgICAgY29uc3QgZXhjZXB0aW9uUmVzdWx0ID0gZXZhbHVhdGVMb2dpc3RpY3NFeGNlcHRpb24oaXRlbSwgdmFsQiwgdmFsQyk7CiAgICAgIHN1bW1hcnkgPSBgJHtleGNlcHRpb25SZXN1bHQuc3RhdHVzTWVzc2FnZX0g4oCUIFJpc2sgSW5kZXggJHtleGNlcHRpb25SZXN1bHQucmlza0luZGV4IHx8ICdOL0EnfWA7CiAgICAgIGRldGFpbCA9IGV4Y2VwdGlvblJlc3VsdC5yZWNvbW1lbmRhdGlvbnMgfHwgZXhjZXB0aW9uUmVzdWx0LmRldGFpbFRleHQ7CiAgICAgIHByaW9yaXR5ID0gZXhjZXB0aW9uUmVzdWx0LnByaW9yaXR5IHx8ICdOL0EnOwogICAgICByZW5kZXJSaXNrSW5zaWdodChleGNlcHRpb25SZXN1bHQpOwogICAgICByZW5kZXJMaXZlUmlza01pbmlHYXVnZShleGNlcHRpb25SZXN1bHQpOwogICAgfSBlbHNlIHsKICAgICAgY2xlYXJSaXNrSW5zaWdodCgpOwogICAgICBoaWRlTGl2ZVJpc2tNaW5pR2F1Z2UoKTsKICAgIH0KICB9IGVsc2UgewogICAgY2xlYXJSaXNrSW5zaWdodCgpOwogICAgaGlkZUxpdmVSaXNrTWluaUdhdWdlKCk7CiAgfQoKICBzdGF0dXNUZXh0LmlubmVyVGV4dCA9IHN1bW1hcnk7CiAgZGV0YWlsVGV4dC5pbm5lclRleHQgPSBkZXRhaWw7CiAgaWYgKHByaW9yaXR5UGlsbCkgcHJpb3JpdHlQaWxsLmlubmVyVGV4dCA9IGBQUklPUklUWTogJHtwcmlvcml0eX1gOwogIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7CiAgbWV0YVRleHQuaW5uZXJUZXh0ID0gYExhc3QgcmVmcmVzaDogJHtub3cudG9Mb2NhbGVUaW1lU3RyaW5nKCdlbi1VUycsIHsgaG91cjEyOiBmYWxzZSB9KX1gOwp9CgpmdW5jdGlvbiByZW5kZXJSaXNrSW5zaWdodChyZXN1bHQpIHsKICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyaXNrSW5zaWdodFBhbmVsJyk7CiAgY29uc3QgaW5kZXhFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyaXNrSW5kZXhWYWx1ZScpOwogIGNvbnN0IHByaW9yaXR5RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmlza1ByaW9yaXR5VmFsdWUnKTsKICBjb25zdCByZWNvbW1lbmRhdGlvbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jpc2tSZWNvbW1lbmRhdGlvblZhbHVlJyk7CiAgaWYgKCFwYW5lbCB8fCAhaW5kZXhFbCB8fCAhcHJpb3JpdHlFbCB8fCAhcmVjb21tZW5kYXRpb25FbCkgcmV0dXJuOwogIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogIGluZGV4RWwuaW5uZXJUZXh0ID0gYFJpc2sgSW5kZXg6ICR7cmVzdWx0LnJpc2tJbmRleCB8fCAnTi9BJ30gLyAxMDBgOwogIHByaW9yaXR5RWwuaW5uZXJUZXh0ID0gYFByaW9yaXR5OiAke3Jlc3VsdC5wcmlvcml0eSB8fCAnTi9BJ31gOwogIHJlY29tbWVuZGF0aW9uRWwuaW5uZXJUZXh0ID0gcmVzdWx0LnJlY29tbWVuZGF0aW9ucyB8fCAnVXNlIGNhdGVnb3J5IHByb3RvY29sIGd1aWRhbmNlIGZvciB0aGUgbmV4dCByZW1lZGlhdGlvbiBzdGVwLic7CiAgcGFuZWwuc3R5bGUuYm9yZGVyQ29sb3IgPSByZXN1bHQuc3RhdHVzVHlwZSA9PT0gJ2JyZWFjaCcgPyAncmdiYSgyNTUsIDY2LCA2NiwgMC40KScgOiByZXN1bHQuc3RhdHVzVHlwZSA9PT0gJ3dhcm4nID8gJ3JnYmEoMjU1LCAxOTYsIDAsIDAuNCknIDogJ3JnYmEoMCwgMjQ1LCAxNTUsIDAuMiknOwp9CgpmdW5jdGlvbiByZW5kZXJMaXZlUmlza01pbmlHYXVnZShyZXN1bHQpIHsKICBjb25zdCBnYXVnZVdyYXBwZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGl2ZVJpc2tNaW5pR2F1Z2UnKTsKICBjb25zdCBnYXVnZUZpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGl2ZVJpc2tNaW5pRmlsbCcpOwogIGNvbnN0IGdhdWdlVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaXZlUmlza01pbmlUZXh0Jyk7CiAgaWYgKCFnYXVnZVdyYXBwZXIgfHwgIWdhdWdlRmlsbCB8fCAhZ2F1Z2VUZXh0KSByZXR1cm47CiAgZ2F1Z2VXcmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogIGNvbnN0IHNjb3JlID0gdHlwZW9mIHJlc3VsdC5yaXNrSW5kZXggPT09ICdudW1iZXInID8gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCByZXN1bHQucmlza0luZGV4KSkgOiAwOwogIGdhdWdlRmlsbC5zdHlsZS53aWR0aCA9IGAke3Njb3JlfSVgOwogIGdhdWdlRmlsbC5zdHlsZS5iYWNrZ3JvdW5kID0gc2NvcmUgPj0gODAgPyAncmdiYSgyNTUsNjYsNjYsMC45KScgOiBzY29yZSA+PSA2MCA/ICdyZ2JhKDI1NSwxOTYsMCwwLjkpJyA6ICdyZ2JhKDAsMjQ1LDE1NSwwLjkpJzsKICBnYXVnZVRleHQuaW5uZXJUZXh0ID0gc2NvcmUgPj0gODAKICAgID8gJ0hpZ2ggdXJnZW5jeSDigJQgb3BlbiBQQVRIXzAxIG9yIFBBVEhfMDIgbm93IGZvciBwYXJ0bmVyIHJlbWVkaWF0aW9uIGFuZCBjb21wbGlhbmNlIHJlc29sdXRpb24uJwogICAgOiBzY29yZSA+PSA2MAogICAgPyAnRWxldmF0ZWQgcmlzayDigJQgY29ubmVjdCB3aXRoIHBhcnRuZXIgcmVtZWRpYXRpb24gcmVzb3VyY2VzIHRvIHByZXZlbnQgZXNjYWxhdGlvbi4nCiAgICA6ICdMb3cgcmlzayDigJQgbW9uaXRvciB3aXRoIHBhcnRuZXIgc3VwcG9ydCBhdmFpbGFibGUgb24gZGVtYW5kIGZvciBwZWFjZSBvZiBtaW5kLic7Cn0KCmZ1bmN0aW9uIGhpZGVMaXZlUmlza01pbmlHYXVnZSgpIHsKICBjb25zdCBnYXVnZVdyYXBwZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGl2ZVJpc2tNaW5pR2F1Z2UnKTsKICBjb25zdCBnYXVnZUZpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGl2ZVJpc2tNaW5pRmlsbCcpOwogIGNvbnN0IGdhdWdlVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaXZlUmlza01pbmlUZXh0Jyk7CiAgaWYgKCFnYXVnZVdyYXBwZXIgfHwgIWdhdWdlRmlsbCB8fCAhZ2F1Z2VUZXh0KSByZXR1cm47CiAgZ2F1Z2VXcmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgZ2F1Z2VGaWxsLnN0eWxlLndpZHRoID0gJzAlJzsKICBnYXVnZVRleHQuaW5uZXJUZXh0ID0gJ0F3YWl0aW5nIGxvZ2lzdGljcyBhdWRpdCByZXN1bHRzLi4uJzsKfQoKZnVuY3Rpb24gY2xlYXJSaXNrSW5zaWdodCgpIHsKICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyaXNrSW5zaWdodFBhbmVsJyk7CiAgaWYgKCFwYW5lbCkgcmV0dXJuOwogIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Cn0KCnNldEludGVydmFsKCgpID0+IHsKICBjb25zdCB0aWNrZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGl2ZVRlbGVtZXRyeVRpY2tlcicpOwogIGlmICh0aWNrZXIpIHRpY2tlci5pbm5lclRleHQgPSBnZXRUZWxlbWV0cnlMb2coKTsKICB1cGRhdGVMaXZlU3RhdHVzQ2FyZCgpOwp9LCA0MDAwKTsKCi8vIE1PRFVMRSAwMTogRS1DT01NRVJDRSBUQVggTkVYVVMgREFUQUJBU0UKY29uc3QgbWF0cml4X2RhdGFiYXNlcyA9IHsKICAiQWxhYmFtYSI6IHsgcmV2OiAyNTAwMDAsIHRyYW5zOiBudWxsLCBsb2dpYzogIk4vQSIsIHBlcmlvZDogIlByZXZpb3VzIENhbGVuZGFyIFllYXIiLCBzYWFzOiAiVCIsIGFwcGFyZWw6ICJUIiwgc3VwcHM6ICJQIiwgZm9vZDogIlQiLCBhbGNvaG9sOiAiUFJPSElCSVRFRCIsIG1wZjogIlJFTUlUIC8gRVhDTFVERUQiLCByZXNhbGU6ICJTVFJJQ1QiIH0sCiAgIkFsYXNrYSI6IHsgcmV2OiAxMDAwMDAsIHRyYW5zOiBudWxsLCBsb2dpYzogIk4vQSIsIHBlcmlvZDogIkN1cnJlbnQgb3IgUHJldmlvdXMgQ2FsZW5kYXIgWWVhciIsIHNhYXM6ICJFIiwgYXBwYXJlbDogIkUiLCBzdXBwczogIkUiLCBmb29kOiAiRSIsIGFsY29ob2w6ICJBTExPV0VEIChFWFBBTkRFRCkiLCBtcGY6ICJOL0EiLCByZXNhbGU6ICJOL0EiIH0sCiAgIkFyaXpvbmEiOiB7IHJldjogMTAwMDAwLCB0cmFuczogbnVsbCwgbG9naWM6ICJOL0EiLCBwZXJpb2Q6ICJDdXJyZW50IG9yIFByZXZpb3VzIENhbGVuZGFyIFllYXIiLCBzYWFzOiAiVCIsIGFwcGFyZWw6ICJUIiwgc3VwcHM6ICJUIiwgZm9vZDogIlQiLCBhbGNvaG9sOiAiQUxMT1dFRCAoRVhQQU5ERUQpIiwgbXBmOiAiUkVNSVQgLyBFWENMVURFRCIsIHJlc2FsZTogIllFUyIgfSwKICAiQXJrYW5zYXMiOiB7IHJldjogMTAwMDAwLCB0cmFuczogMjAwLCBsb2dpYzogIk9SIiwgcGVyaW9kOiAiQ3VycmVudCBvciBQcmV2aW91cyBDYWxlbmRhciBZZWFyIiwgc2FhczogIkUiLCBhcHBhcmVsOiAiVCIsIHN1cHBzOiAiVCIsIGZvb2Q6ICJUIiwgYWxjb2hvbDogIkFMTE9XRUQgKFNURCkiLCBtcGY6ICJSRU1JVCAvIEVYQ0xVREVEIiwgcmVzYWxlOiAiWUVTIiB9LAogICJDYWxpZm9ybmlhIjogeyByZXY6IDUwMDAwMCwgdHJhbnM6IG51bGwsIGxvZ2ljOiAiTi9BIiwgcGVyaW9kOiAiQ3VycmVudCBvciBQcmV2aW91cyBDYWxlbmRhciBZZWFyIiwgc2FhczogIkUiLCBhcHBhcmVsOiAiVCIsIHN1cHBzOiAiVCIsIGZvb2Q6ICJUIiwgYWxjb2hvbDogIkFMTE9XRUQgKEVYUEFOREVEKSIsIG1wZjogIlJFTUlUIC8gQ09VTlRTIiwgcmVzYWxlOiAiU1RSSUNUIiB9LAogICJDb2xvcmFkbyI6IHsgcmV2OiAxMDAwMDAsIHRyYW5zOiBudWxsLCBsb2dpYzogIk4vQSIsIHBlcmlvZDogIkN1cnJlbnQgb3IgUHJldmlvdXMgQ2FsZW5kYXIgWWVhciIsIHNhYXM6ICJFIiwgYXBwYXJlbDogIlQiLCBzdXBwczogIlQiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiUkVNSVQgLyBFWENMVURFRCIsIHJlc2FsZTogIllFUyIgfSwKICAiQ29ubmVjdGljdXQiOiB7IHJldjogMTAwMDAwLCB0cmFuczogMjAwLCBsb2dpYzogIkFORCIsIHBlcmlvZDogIjEyLU1vLiBQZXJpb2QgRW5kaW5nIFNlcHQgMzAiLCBzYWFzOiAiUCIsIGFwcGFyZWw6ICJUIiwgc3VwcHM6ICJFIiwgZm9vZDogIlQiLCBhbGNvaG9sOiAiQUxMT1dFRCAoU1REKSIsIG1wZjogIlJFTUlUIC8gQ09VTlRTIiwgcmVzYWxlOiAiWUVTIiB9LAogICJEZWxhd2FyZSI6IHsgcmV2OiAiTm8gU2FsZXMgVGF4IiwgdHJhbnM6IG51bGwsIGxvZ2ljOiAiTi9BIiwgcGVyaW9kOiAiTm8gU2FsZXMgVGF4Iiwgc2FhczogIkUiLCBhcHBhcmVsOiAiRSIsIHN1cHBzOiAiRSIsIGZvb2Q6ICJFIiwgYWxjb2hvbDogIlJFU1RSSUNURUQiLCBtcGY6ICJOL0EiLCByZXNhbGU6ICJOL0EiIH0sCiAgIkZsb3JpZGEiOiB7IHJldjogMTAwMDAwLCB0cmFuczogbnVsbCwgbG9naWM6ICJOL0EiLCBwZXJpb2Q6ICJQcmV2aW91cyBDYWxlbmRhciBZZWFyIiwgc2FhczogIkUiLCBhcHBhcmVsOiAiVCIsIHN1cHBzOiAiRSIsIGZvb2Q6ICJUIiwgYWxjb2hvbDogIkFMTE9XRUQgKFNURCkiLCBtcGY6ICJSRU1JVCAvIEVYQ0xVREVEIiwgcmVzYWxlOiAiU1RSSUNUIiB9LAogICJHZW9yZ2lhIjogeyByZXY6IDEwMDAwMCwgdHJhbnM6IDIwMCwgbG9naWM6ICJPUiIsIHBlcmlvZDogIkN1cnJlbnQgb3IgUHJldmlvdXMgQ2FsZW5kYXIgWWVhciIsIHNhYXM6ICJFIiwgYXBwYXJlbDogIlQiLCBzdXBwczogIlQiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiUkVNSVQgLyBFWENMVURFRCIsIHJlc2FsZTogIllFUyIgfSwKICAiSGF3YWlpIjogeyByZXY6IDEwMDAwMCwgdHJhbnM6IDIwMCwgbG9naWM6ICJPUiIsIHBlcmlvZDogIkN1cnJlbnQgb3IgUHJldmlvdXMgQ2FsZW5kYXIgWWVhciIsIHNhYXM6ICJUIiwgYXBwYXJlbDogIlQiLCBzdXBwczogIlQiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChFWFBBTkRFRCkiLCBtcGY6ICJSRU1JVCAvIENPVU5UUyIsIHJlc2FsZTogIlNUUklDVCIgfSwKICAiSWRhaG8iOiB7IHJldjogMTAwMDAwLCB0cmFuczogbnVsbCwgbG9naWM6ICJOL0EiLCBwZXJpb2Q6ICJDdXJyZW50IG9yIFByZXZpb3VzIENhbGVuZGFyIFllYXIiLCBzYWFzOiAiRSIsIGFwcGFyZWw6ICJUIiwgc3VwcHM6ICJUIiwgZm9vZDogIlQiLCBhbGNvaG9sOiAiQUxMT1dFRCAoU1REKSIsIG1wZjogIlJFTUlUIC8gQ09VTlRTIiwgcmVzYWxlOiAiWUVTIiB9LAogICJJbGxpbm9pcyI6IHsgcmV2OiAxMDAwMDAsIHRyYW5zOiBudWxsLCBsb2dpYzogIk4vQSIsIHBlcmlvZDogIlByZWNlZGluZyAxMiBNb250aHMiLCBzYWFzOiAiRSIsIGFwcGFyZWw6ICJUIiwgc3VwcHM6ICJQIiwgZm9vZDogIlQiLCBhbGNvaG9sOiAiQUxMT1dFRCAoU1REKSIsIG1wZjogIlJFTUlUIC8gRVhDTFVERUQiLCByZXNhbGU6ICJTVFJJQ1QiIH0sCiAgIkluZGlhbmEiOiB7IHJldjogMTAwMDAwLCB0cmFuczogbnVsbCwgbG9naWM6ICJOL0EiLCBwZXJpb2Q6ICJDdXJyZW50IG9yIFByZXZpb3VzIENhbGVuZGFyIFllYXIiLCBzYWFzOiAiRSIsIGFwcGFyZWw6ICJUIiwgc3VwcHM6ICJUIiwgZm9vZDogIlQiLCBhbGNvaG9sOiAiQUxMT1dFRCAoU1REKSIsIG1wZjogIlJFTUlUIC8gRVhDTFVERUQiLCByZXNhbGU6ICJZRVMiIH0sCiAgIklvd2EiOiB7IHJldjogMTAwMDAwLCB0cmFuczogbnVsbCwgbG9naWM6ICJOL0EiLCBwZXJpb2Q6ICJDdXJyZW50IG9yIFByZXZpb3VzIENhbGVuZGFyIFllYXIiLCBzYWFzOiAiUCIsIGFwcGFyZWw6ICJUIiwgc3VwcHM6ICJUIiwgZm9vZDogIlQiLCBhbGNvaG9sOiAiQUxMT1dFRCAoU1REKSIsIG1wZjogIlJFTUlUIC8gQ09VTlRTIiwgcmVzYWxlOiAiWUVTIiB9LAogICJLYW5zYXMiOiB7IHJldjogMTAwMDAwLCB0cmFuczogbnVsbCwgbG9naWM6ICJOL0EiLCBwZXJpb2Q6ICJDdXJyZW50IG9yIFByZXZpb3VzIENhbGVuZGFyIFllYXIiLCBzYWFzOiAiRSIsIGFwcGFyZWw6ICJUIiwgc3VwcHM6ICJQIiwgZm9vZDogIlQiLCBhbGNvaG9sOiAiQUxMT1dFRCAoU1REKSIsIG1wZjogIlJFTUlUIC8gQ09VTlRTIiwgcmVzYWxlOiAiWUVTIiB9LAogICJLZW50dWNreSI6IHsgcmV2OiAxMDAwMDAsIHRyYW5zOiAyMDAsIGxvZ2ljOiAiT1IiLCBwZXJpb2Q6ICJDdXJyZW50IG9yIFByZXZpb3VzIENhbGVuZGFyIFllYXIiLCBzYWFzOiAiVCIsIGFwcGFyZWw6ICJUIiwgc3VwcHM6ICJUIiwgZm9vZDogIlQiLCBhbGNvaG9sOiAiQUxMT1dFRCAoRVhQQU5ERUQpIiwgbXBmOiAiUkVNSVQgLyBDT1VOVFMiLCByZXNhbGU6ICJZRVMiIH0sCiAgIkxvdWlzaWFuYSI6IHsgcmV2OiAxMDAwMDAsIHRyYW5zOiBudWxsLCBsb2dpYzogIk4vQSIsIHBlcmlvZDogIkN1cnJlbnQgb3IgUHJldmlvdXMgQ2FsZW5kYXIgWWVhciIsIHNhYXM6ICJUIiwgYXBwYXJlbDogIlQiLCBzdXBwczogIlQiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiUkVNSVQgLyBDT1VOVFMiLCByZXNhbGU6ICJTVFJJQ1QiIH0sCiAgIk1haW5lIjogeyByZXY6IDEwMDAwMCwgdHJhbnM6IG51bGwsIGxvZ2ljOiAiTi9BIiwgcGVyaW9kOiAiQ3VycmVudCBvciBQcmV2aW91cyBDYWxlbmRhciBZZWFyIiwgc2FhczogIkUiLCBhcHBhcmVsOiAiVCIsIHN1cHBzOiAiVCIsIGZvb2Q6ICJUIiwgYWxjb2hvbDogIkFMTE9XRUQgKFNURCkiLCBtcGY6ICJSRU1JVCAvIENPVU5UUyIsIHJlc2FsZTogIllFUyIgfSwKICAiTWFyeWxhbmQiOiB7IHJldjogMTAwMDAwLCB0cmFuczogbnVsbCwgbG9naWM6ICJOL0EiLCBwZXJpb2Q6ICJDdXJyZW50IG9yIFByZXZpb3VzIENhbGVuZGFyIFllYXIiLCBzYWFzOiAiUCIsIGFwcGFyZWw6ICJUIiwgc3VwcHM6ICJFIiwgZm9vZDogIlQiLCBhbGNvaG9sOiAiQUxMT1dFRCAoU1REKSIsIG1wZjogIlJFTUlUIC8gQ09VTlRTIiwgcmVzYWxlOiAiU1RSSUNUIiB9LAogICJNYXNzYWNodXNldHRzIjogeyByZXY6IDEwMDAwMCwgdHJhbnM6IG51bGwsIGxvZ2ljOiAiTi9BIiwgcGVyaW9kOiAiUHJldmlvdXMgQ2FsZW5kYXIgWWVhciIsIHNhYXM6ICJUIiwgYXBwYXJlbDogIlAiLCBzdXBwczogIlAiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiUkVNSVQgLyBDT1VOVFMiLCByZXNhbGU6ICJTVFJJQ1QiIH0sCiAgIk1pY2hpZ2FuIjogeyByZXY6IDEwMDAwMCwgdHJhbnM6IG51bGwsIGxvZ2ljOiAiTi9BIiwgcGVyaW9kOiAiQ3VycmVudCBvciBQcmV2aW91cyBDYWxlbmRhciBZZWFyIiwgc2FhczogIkUiLCBhcHBhcmVsOiAiVCIsIHN1cHBzOiAiRSIsIGZvb2Q6ICJUIiwgYWxjb2hvbDogIkFMTE9XRUQgKFNURCkiLCBtcGY6ICJSRU1JVCAvIENPVU5UUyIsIHJlc2FsZTogIllFUyIgfSwKICAiTWlubmVzb3RhIjogeyByZXY6IDEwMDAwMCwgdHJhbnM6IDIwMCwgbG9naWM6ICJPUiIsIHBlcmlvZDogIlByZXZpb3VzIDEyIE1vbnRocyIsIHNhYXM6ICJFIiwgYXBwYXJlbDogIkUiLCBzdXBwczogIlQiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiUkVNSVQgLyBDT1VOVFMiLCByZXNhbGU6ICJZRVMiIH0sCiAgIk1pc3Npc3NpcHBpIjogeyByZXY6IDI1MDAwMCwgdHJhbnM6IG51bGwsIGxvZ2ljOiAiTi9BIiwgcGVyaW9kOiAiUHJldmlvdXMgMTIgTW9udGhzIiwgc2FhczogIkUiLCBhcHBhcmVsOiAiVCIsIHN1cHBzOiAiVCIsIGZvb2Q6ICJUIiwgYWxjb2hvbDogIkFMTE9XRUQgKFNURCkiLCBtcGY6ICJSRU1JVCAvIENPVU5UUyIsIHJlc2FsZTogIllFUyIgfSwKICAiTWlzc291cmkiOiB7IHJldjogMTAwMDAwLCB0cmFuczogbnVsbCwgbG9naWM6ICJOL0EiLCBwZXJpb2Q6ICJDdXJyZW50IG9yIFByZXZpb3VzIDEyIE1vbnRocyIsIHNhYXM6ICJFIiwgYXBwYXJlbDogIlQiLCBzdXBwczogIlQiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiUkVNSVQgLyBDT1VOVFMiLCByZXNhbGU6ICJZRVMiIH0sCiAgIk1vbnRhbmEiOiB7IHJldjogIk5vIFNhbGVzIFRheCIsIHRyYW5zOiBudWxsLCBsb2dpYzogIk4vQSIsIHBlcmlvZDogIk5vIFNhbGVzIFRheCIsIHNhYXM6ICJFIiwgYXBwYXJlbDogIkUiLCBzdXBwczogIkUiLCBmb29kOiAiRSIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiTi9BIiwgcmVzYWxlOiAiTi9BIiB9LAogICJOZWJyYXNrYSI6IHsgcmV2OiAxMDAwMDAsIHRyYW5zOiAyMDAsIGxvZ2ljOiAiT1IiLCBwZXJpb2Q6ICJDdXJyZW50IG9yIFByZXZpb3VzIENhbGVuZGFyIFllYXIiLCBzYWFzOiAiVCIsIGFwcGFyZWw6ICJUIiwgc3VwcHM6ICJUIiwgZm9vZDogIlQiLCBhbGNvaG9sOiAiQUxMT1dFRCAoU1REKSIsIG1wZjogIlJFTUlUIC8gQ09VTlRTIiwgcmVzYWxlOiAiWUVTIiB9LAogICJOZXZhZGEiOiB7IHJldjogMTAwMDAwLCB0cmFuczogMjAwLCBsb2dpYzogIk9SIiwgcGVyaW9kOiAiQ3VycmVudCBvciBQcmV2aW91cyBDYWxlbmRhciBZZWFyIiwgc2FhczogIkUiLCBhcHBhcmVsOiAiVCIsIHN1cHBzOiAiVCIsIGZvb2Q6ICJUIiwgYWxjb2hvbDogIkFMTE9XRUQgKFNURCkiLCBtcGY6ICJSRU1JVCAvIENPVU5UUyIsIHJlc2FsZTogIllFUyIgfSwKICAiTmV3IEhhbXBzaGlyZSI6IHsgcmV2OiAiTm8gU2FsZXMgVGF4IiwgdHJhbnM6IG51bGwsIGxvZ2ljOiAiTi9BIiwgcGVyaW9kOiAiTm8gU2FsZXMgVGF4Iiwgc2FhczogIkUiLCBhcHBhcmVsOiAiRSIsIHN1cHBzOiAiRSIsIGZvb2Q6ICJFIiwgYWxjb2hvbDogIkFMTE9XRUQgKFNURCkiLCBtcGY6ICJOL0EiLCByZXNhbGU6ICJOL0EiIH0sCiAgIk5ldyBKZXJzZXkiOiB7IHJldjogMTAwMDAwLCB0cmFuczogMjAwLCBsb2dpYzogIk9SIiwgcGVyaW9kOiAiQ3VycmVudCBvciBQcmV2aW91cyBDYWxlbmRhciBZZWFyIiwgc2FhczogIkUiLCBhcHBhcmVsOiAiRSIsIHN1cHBzOiAiRSIsIGZvb2Q6ICJUIiwgYWxjb2hvbDogIkFMTE9XRUQgKFNURCkiLCBtcGY6ICJSRU1JVCAvIENPVU5UUyIsIHJlc2FsZTogIllFUyIgfSwKICAiTmV3IE1leGljbyI6IHsgcmV2OiAxMDAwMDAsIHRyYW5zOiBudWxsLCBsb2dpYzogIk4vQSIsIHBlcmlvZDogIlByZXZpb3VzIENhbGVuZGFyIFllYXIiLCBzYWFzOiAiVCIsIGFwcGFyZWw6ICJUIiwgc3VwcHM6ICJUIiwgZm9vZDogIlQiLCBhbGNvaG9sOiAiQUxMT1dFRCAoU1REKSIsIG1wZjogIlJFTUlUIC8gQ09VTlRTIiwgcmVzYWxlOiAiWUVTIiB9LAogICJOZXcgWW9yayI6IHsgcmV2OiA1MDAwMDAsIHRyYW5zOiAxMDAsIGxvZ2ljOiAiQU5EIiwgcGVyaW9kOiAiUHJlY2VkaW5nIDQgU2FsZXMgVGF4IFF1YXJ0ZXJzIiwgc2FhczogIlQiLCBhcHBhcmVsOiAiUCIsIHN1cHBzOiAiUCIsIGZvb2Q6ICJUIiwgYWxjb2hvbDogIkFMTE9XRUQgKEVYUEFOREVEKSIsIG1wZjogIlJFTUlUIC8gQ09VTlRTIiwgcmVzYWxlOiAiWUVTIiB9LAogICJOb3J0aCBDYXJvbGluYSI6IHsgcmV2OiAxMDAwMDAsIHRyYW5zOiBudWxsLCBsb2dpYzogIk4vQSIsIHBlcmlvZDogIkN1cnJlbnQgb3IgUHJldmlvdXMgQ2FsZW5kYXIgWWVhciIsIHNhYXM6ICJFIiwgYXBwYXJlbDogIlQiLCBzdXBwczogIlQiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiUkVNSVQgLyBDT1VOVFMiLCByZXNhbGU6ICJZRVMiIH0sCiAgIk5vcnRoIERha290YSI6IHsgcmV2OiAxMDAwMDAsIHRyYW5zOiBudWxsLCBsb2dpYzogIk4vQSIsIHBlcmlvZDogIkN1cnJlbnQgb3IgUHJldmlvdXMgQ2FsZW5kYXIgWWVhciIsIHNhYXM6ICJFIiwgYXBwYXJlbDogIlQiLCBzdXBwczogIlQiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiUkVNSVQgLyBDT1VOVFMiLCByZXNhbGU6ICJZRVMiIH0sCiAgIk9oaW8iOiB7IHJldjogMTAwMDAwLCB0cmFuczogMjAwLCBsb2dpYzogIk9SIiwgcGVyaW9kOiAiQ3VycmVudCBvciBQcmV2aW91cyBDYWxlbmRhciBZZWFyIiwgc2FhczogIlAiLCBhcHBhcmVsOiAiVCIsIHN1cHBzOiAiVCIsIGZvb2Q6ICJUIiwgYWxjb2hvbDogIkFMTE9XRUQgKFNURCkiLCBtcGY6ICJSRU1JVCAvIENPVU5UUyIsIHJlc2FsZTogIllFUyIgfSwKICAiT2tsYWhvbWEiOiB7IHJldjogMTAwMDAwLCB0cmFuczogbnVsbCwgbG9naWM6ICJOL0EiLCBwZXJpb2Q6ICJDdXJyZW50IG9yIFByZXZpb3VzIDEyIE1vbnRocyIsIHNhYXM6ICJFIiwgYXBwYXJlbDogIlQiLCBzdXBwczogIlAiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiUkVNSVQgLyBDT1VOVFMiLCByZXNhbGU6ICJZRVMiIH0sCiAgIk9yZWdvbiI6IHsgcmV2OiAiTm8gU2FsZXMgVGF4IiwgdHJhbnM6IG51bGwsIGxvZ2ljOiAiTi9BIiwgcGVyaW9kOiAiTm8gU2FsZXMgVGF4Iiwgc2FhczogIkUiLCBhcHBhcmVsOiAiRSIsIHN1cHBzOiAiRSIsIGZvb2Q6ICJFIiwgYWxjb2hvbDogIkFMTE9XRUQgKFNURCkiLCBtcGY6ICJOL0EiLCByZXNhbGU6ICJOL0EiIH0sCiAgIlBlbm5zeWx2YW5pYSI6IHsgcmV2OiAxMDAwMDAsIHRyYW5zOiBudWxsLCBsb2dpYzogIk4vQSIsIHBlcmlvZDogIlByZXZpb3VzIDEyIE1vbnRocyIsIHNhYXM6ICJUIiwgYXBwYXJlbDogIkUiLCBzdXBwczogIlQiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiUkVNSVQgLyBFWENMVURFRCIsIHJlc2FsZTogIllFUyIgfSwKICAiUmhvZGUgSXNsYW5kIjogeyByZXY6IDEwMDAwMCwgdHJhbnM6IDIwMCwgbG9naWM6ICJPUiIsIHBlcmlvZDogIkltbWVkaWF0ZWx5IFByZWNlZGluZyBDYWxlbmRhciBZZWFyIiwgc2FhczogIlQiLCBhcHBhcmVsOiAiUCIsIHN1cHBzOiAiVCIsIGZvb2Q6ICJUIiwgYWxjb2hvbDogIk9OLVNJVEUgT05MWSIsIG1wZjogIlJFTUlUIC8gQ09VTlRTIiwgcmVzYWxlOiAiWUVTIiB9LAogICJTb3V0aCBDYXJvbGluYSI6IHsgcmV2OiAxMDAwMDAsIHRyYW5zOiBudWxsLCBsb2dpYzogIk4vQSIsIHBlcmlvZDogIkN1cnJlbnQgb3IgUHJldmlvdXMgQ2FsZW5kYXIgWWVhciIsIHNhYXM6ICJUIiwgYXBwYXJlbDogIlQiLCBzdXBwczogIlQiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiUkVNSVQgLyBDT1VOVFMiLCByZXNhbGU6ICJZRVMiIH0sCiAgIlNvdXRoIERha290YSI6IHsgcmV2OiAxMDAwMDAsIHRyYW5zOiBudWxsLCBsb2dpYzogIk4vQSIsIHBlcmlvZDogIkN1cnJlbnQgb3IgUHJldmlvdXMgQ2FsZW5kYXIgWWVhciIsIHNhYXM6ICJUIiwgYXBwYXJlbDogIlQiLCBzdXBwczogIlQiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiUkVNSVQgLyBDT1VOVFMiLCByZXNhbGU6ICJZRVMiIH0sCiAgIlRlbm5lc3NlZSI6IHsgcmV2OiAxMDAwMDAsIHRyYW5zOiBudWxsLCBsb2dpYzogIk4vQSIsIHBlcmlvZDogIlByZXZpb3VzIDEyIE1vbnRocyIsIHNhYXM6ICJUIiwgYXBwYXJlbDogIlQiLCBzdXBwczogIlQiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiUkVNSVQgLyBDT1VOVFMiLCByZXNhbGU6ICJZRVMiIH0sCiAgIlRleGFzIjogeyByZXY6IDUwMDAwMCwgdHJhbnM6IG51bGwsIGxvZ2ljOiAiTi9BIiwgcGVyaW9kOiAiUHJlY2VkaW5nIDEyIENhbGVuZGFyIE1vbnRocyIsIHNhYXM6ICJQIiwgYXBwYXJlbDogIlQiLCBzdXBwczogIkUiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiUkVNSVQgLyBDT1VOVFMiLCByZXNhbGU6ICJZRVMiIH0sCiAgIlV0YWgiOiB7IHJldjogMTAwMDAwLCB0cmFuczogbnVsbCwgbG9naWM6ICJOL0EiLCBwZXJpb2Q6ICJDdXJyZW50IG9yIFByZXZpb3VzIENhbGVuZGFyIFllYXIiLCBzYWFzOiAiVCIsIGFwcGFyZWw6ICJUIiwgc3VwcHM6ICJQIiwgZm9vZDogIlQiLCBhbGNvaG9sOiAiUFJPSElCSVRFRCIsIG1wZjogIlJFTUlUIC8gQ09VTlRTIiwgcmVzYWxlOiAiWUVTIiB9LAogICJWZXJtb250IjogeyByZXY6IDEwMDAwMCwgdHJhbnM6IDIwMCwgbG9naWM6ICJPUiIsIHBlcmlvZDogIlByZXZpb3VzIDEyIE1vbnRocyIsIHNhYXM6ICJFIiwgYXBwYXJlbDogIkUiLCBzdXBwczogIkUiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiUkVNSVQgLyBDT1VOVFMiLCByZXNhbGU6ICJTVFJJQ1QiIH0sCiAgIlZpcmdpbmlhIjogeyByZXY6IDEwMDAwMCwgdHJhbnM6IDIwMCwgbG9naWM6ICJPUiIsIHBlcmlvZDogIkN1cnJlbnQgb3IgUHJldmlvdXMgQ2FsZW5kYXIgWWVhciIsIHNhYXM6ICJFIiwgYXBwYXJlbDogIlQiLCBzdXBwczogIlQiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiUkVNSVQgLyBDT1VOVFMiLCByZXNhbGU6ICJTVFJJQ1QiIH0sCiAgIldhc2hpbmd0b24iOiB7IHJldjogMTAwMDAwLCB0cmFuczogbnVsbCwgbG9naWM6ICJOL0EiLCBwZXJpb2Q6ICJDdXJyZW50IG9yIFByZXZpb3VzIENhbGVuZGFyIFllYXIiLCBzYWFzOiAiVCIsIGFwcGFyZWw6ICJUIiwgc3VwcHM6ICJUIiwgZm9vZDogIlQiLCBhbGNvaG9sOiAiQUxMT1dFRCAoRVhQQU5ERUQpIiwgbXBmOiAiUkVNSVQgLyBDT1VOVFMiLCByZXNhbGU6ICJTVFJJQ1QiIH0sCiAgIldlc3QgVmlyZ2luaWEiOiB7IHJldjogMTAwMDAwLCB0cmFuczogMjAwLCBsb2dpYzogIk9SIiwgcGVyaW9kOiAiQ3VycmVudCBvciBQcmV2aW91cyBDYWxlbmRhciBZZWFyIiwgc2FhczogIlQiLCBhcHBhcmVsOiAiVCIsIHN1cHBzOiAiRSIsIGZvb2Q6ICJUIiwgYWxjb2hvbDogIkFMTE9XRUQgKFNURCkiLCBtcGY6ICJSRU1JVCAvIENPVU5UUyIsIHJlc2FsZTogIllFUyIgfSwKICAiV2lzY29uc2luIjogeyByZXY6IDEwMDAwMCwgdHJhbnM6IG51bGwsIGxvZ2ljOiAiTi9BIiwgcGVyaW9kOiAiQ3VycmVudCBvciBQcmV2aW91cyBDYWxlbmRhciBZZWFyIiwgc2FhczogIkUiLCBhcHBhcmVsOiAiVCIsIHN1cHBzOiAiVCIsIGZvb2Q6ICJUIiwgYWxjb2hvbDogIkFMTE9XRUQgKFNURCkiLCBtcGY6ICJSRU1JVCAvIENPVU5UUyIsIHJlc2FsZTogIllFUyIgfSwKICAiV3lvbWluZyI6IHsgcmV2OiAxMDAwMDAsIHRyYW5zOiBudWxsLCBsb2dpYzogIk4vQSIsIHBlcmlvZDogIkN1cnJlbnQgb3IgUHJldmlvdXMgQ2FsZW5kYXIgWWVhciIsIHNhYXM6ICJFIiwgYXBwYXJlbDogIlQiLCBzdXBwczogIkUiLCBmb29kOiAiVCIsIGFsY29ob2w6ICJBTExPV0VEIChTVEQpIiwgbXBmOiAiUkVNSVQgLyBDT1VOVFMiLCByZXNhbGU6ICJZRVMiIH0KfTsKCi8vIE1PRFVMRSAwMjogSU5WT0lDRS1UTy1CT0wgQVVUT01BVEVEIEVESSBBVURJVCBNQVRSSVggREFUQVNFVApjb25zdCBtYXJpdGltZV9kYiA9IFsKICB7CiAgICBjYXQ6ICJXZWlnaHQvTWVhc3VyZW1lbnQgKEJvTCBWR00pIiwKICAgIGRlc2M6ICJEZWNsYXJlZCBWR00gb24gU0kvQm9MIGRldmlhdGVzIGZyb20gdGVybWluYWwgd2VpZ2hicmlkZ2UgcmVhZGluZyBiZXlvbmQgY2FycmllciB0b2xlcmFuY2Ugb3IgVkdNIGlzIG1pc3NpbmcgYXQgbG9hZCBjdXQtb2ZmLiIsCiAgICBlZGk6ICJFRElGQUNUIFZFUk1BUyAvIFgxMiAzMDQgTUVBIHdlaWdodC10b2xlcmFuY2UgZmFpbHVyZSIsCiAgICBqdXI6ICJTT0xBUyBDaC5WSSBSZWcuMiAoVkdNKSDigJQgSU1PIC8gQ2FycmllciB0YXJpZmYgZW5mb3JjZW1lbnQiLAogICAgcmlzazogIkNvbnRhaW5lciByZW1vdmVkIGZyb20gc3RvdyBwbGFuLCB0ZXJtaW5hbCByZS13ZWlnaC9hbWVuZG1lbnQgZmVlICQ3NeKAkyQzMDAsIG1pc3NlZCBzYWlsaW5nIGNhdXNlcyBkZW11cnJhZ2Uvcm9sbG92ZXIuIiwKICAgIHNsYTogIlZHTSBDdXQtb2ZmIChDWSBDdXQtb2ZmIG1pbnVzIDI04oCTNDggaHJzKSIsCiAgICBhbWR0OiAiVkVSTUFTIHJlc3VibWlzc2lvbiBjaXRpbmcgU09MQVMgVkkvMiBNZXRob2QgMSBvciAyIiwKICAgIHByb3RvOiAiMS4gUkUtV0VJR0ggdmlhIFNPTEFTIE1ldGhvZCAxIG9yIE1ldGhvZCAyLiAyLiBSRVNVQk1JVCBjb3JyZWN0ZWQgVkdNIHZpYSBjYXJyaWVyIEVESS9wb3J0YWwuIDMuIENPTkZJUk0gbG9hZCBhcHByb3ZhbCBiZWZvcmUgQ1kgY3V0LW9mZi4iLAogICAgbW9kZTogIkZDTCIsCiAgICByZXNwOiAiU2hpcHBlciIsCiAgICBzZXY6ICJIYXJkLVN0b3AiLAogICAgdm9sOiAiQ29tbWVyY2lhbC1WYXJpYWJsZSIKICB9LAogIHsKICAgIGNhdDogIkNvbnRhaW5lci9TZWFsIChHYXRlLUluIE1pc21hdGNoKSIsCiAgICBkZXNjOiAiU2VhbCBudW1iZXIgb24gQm9ML0VJUiBkb2VzIG5vdCBtYXRjaCB0aGUgcGh5c2ljYWwgc2VhbCBzY2FubmVkIGR1cmluZyB0ZXJtaW5hbCBnYXRlLWluLiIsCiAgICBlZGk6ICJFRElGQUNUIEVRRC9TRUwgLyBYMTIgMzA0IE43IHNlYWwtbnVtYmVyIG1pc21hdGNoIiwKICAgIGp1cjogIlRlcm1pbmFsIE9wZXJhdGluZyBTeXN0ZW0gZ2F0ZSBwcm90b2NvbCArIGNhcnJpZXIvY3VzdG9tcyBtYW5pZmVzdCBjcm9zcy1jaGVjayIsCiAgICByaXNrOiAiR2F0ZS1pbiByZWplY3RlZCwgZHJheWFnZSByZXR1cm4gb3IgY2hhc3NpcyBkZXRlbnRpb24gJDE1MOKAkyQ0NTAsIGFuZCByaXNrIG9mIG1pc3NlZCBDWSBjdXQtb2ZmLiIsCiAgICBzbGE6ICJHYXRlLWluIHByaW9yIHRvIENZIGN1dC1vZmYiLAogICAgYW1kdDogIlRlcm1pbmFsIFRPUyBzZWFsLWV4Y2VwdGlvbiB0aWNrZXQgcGx1cyByZWlzc3VlZCBFSVIiLAogICAgcHJvdG86ICIxLiBET0NVTUVOVCBtaXNtYXRjaGVkIHNlYWwgcGhvdG9ncmFwaGljYWxseS4gMi4gRklMRSBzZWFsLWV4Y2VwdGlvbiB0aWNrZXQgd2l0aCBUT1MuIDMuIE9CVEFJTiByZWlzc3VlZCBFSVIgYmVmb3JlIENZIGN1dC1vZmYuIiwKICAgIG1vZGU6ICJGQ0wiLAogICAgcmVzcDogIk5WT0NDLUZvcndhcmRlciIsCiAgICBzZXY6ICJIYXJkLVN0b3AiLAogICAgdm9sOiAiQ2Fycmllci1TeXN0ZW0tU3BlY2lmaWMiCiAgfSwKICB7CiAgICBjYXQ6ICJDb250YWluZXIvU2VhbCAoSVNPIDYzNDYgVmFsaWRhdGlvbikiLAogICAgZGVzYzogIkNvbnRhaW5lciBudW1iZXIgZmFpbHMgSVNPIDYzNDYgQW5uZXggQSBjaGVjay1kaWdpdCB2YWxpZGF0aW9uIGFnYWluc3QgdGhlIGRlY2xhcmVkIG93bmVyIGNvZGUgYW5kIHNlcmlhbCBudW1iZXIuIiwKICAgIGVkaTogIkVESUZBQ1QgRVFEIGVxdWlwbWVudCBJRCAvIFgxMiAzMDQgTjcgdmFsaWRhdGlvbiBmYWlsdXJlIiwKICAgIGp1cjogIklTTyA2MzQ2ICsgY2FycmllciBib29raW5nL2N1c3RvbXMgbWFuaWZlc3QgdmFsaWRhdGlvbiIsCiAgICByaXNrOiAiQm9va2luZyBvciBTSSByZWplY3RlZCwgbm8gdmFsaWQgQm9MIGlzc3VlZCwgcmVib29raW5nIGRlbGF5IHRvIG5leHQgYXZhaWxhYmxlIHZlc3NlbCBzdHJpbmcuIiwKICAgIHNsYTogIkJlZm9yZSBTaGlwcGluZyBJbnN0cnVjdGlvbnMgY3V0LW9mZiAoRVREIG1pbnVzIDPigJM1IGRheXMpIiwKICAgIGFtZHQ6ICJSZWNvbXB1dGUgY2hlY2sgZGlnaXQgcGVyIElTTyA2MzQ2IEFubmV4IEEgYW5kIHJlc3VibWl0IGNvcnJlY3RlZCBjb250YWluZXIgSUQiLAogICAgcHJvdG86ICIxLiBSRUNBTENVTEFURSBJU08gNjM0NiBjaGVjayBkaWdpdC4gMi4gQ09SUkVDVCBjb250YWluZXIgSUQgaW4gU0kuIDMuIFJFU1VCTUlUIGFtZW5kZWQgU0kgYmVmb3JlIGJvb2tpbmcgY3V0LW9mZi4iLAogICAgbW9kZTogIkZDTCIsCiAgICByZXNwOiAiTlZPQ0MtRm9yd2FyZGVyIiwKICAgIHNldjogIkhhcmQtU3RvcCIsCiAgICB2b2w6ICJSZWd1bGF0b3J5LUZpeGVkIgogIH0sCiAgewogICAgY2F0OiAiUGFydGllcyAoSVNGIE5hbWUvQWRkcmVzcykiLAogICAgZGVzYzogIlNoaXBwZXIgb3IgY29uc2lnbmVlIGxlZ2FsIG5hbWUvYWRkcmVzcyBvbiBCb0wvU0kgZG9lcyBub3QgbWF0Y2ggdGhlIGVudGl0eSBkYXRhIGZpbGVkIGluIENCUCBJU0YgMTArMi4iLAogICAgZWRpOiAiWDEyIDMwOS8zNTMgTjEgbG9vcCBtaXNtYXRjaCB2cyBJU0YgLyBFRElGQUNUIE5BRCBtaXNtYXRjaCIsCiAgICBqdXI6ICJVUyBDQlAgSVNGIDEwKzIg4oCUIDE5IENGUiBQYXJ0IDE0OSIsCiAgICByaXNrOiAiRG8tTm90LUxvYWQsIGxpcXVpZGF0ZWQgZGFtYWdlcyAkNSwwMDDigJMkMTAsMDAwIHBlciB2aW9sYXRpb24sIGFuZCBzdXJldHkgYm9uZCBjbGFpbSBleHBvc3VyZS4iLAogICAgc2xhOiAiVmVzc2VsIGxvYWRpbmcgbWludXMgMjQgaHJzIiwKICAgIGFtZHQ6ICJJU0YgYW1lbmRtZW50IHZpYSBBQkkvQUNFIGNpdGluZyBvcmlnaW5hbCBib29raW5nL0JvTCBudW1iZXIiLAogICAgcHJvdG86ICIxLiBWQUxJREFURSBzaGlwcGVyL2NvbnNpZ25lZSBkZXRhaWxzIGFnYWluc3QgSVNGLiAyLiBGSUxFIElTRiBhbWVuZG1lbnQgdmlhIEFCSS9BQ0UuIDMuIENPTkZJUk0gRE5MIGlzIGNsZWFyZWQgYmVmb3JlIGRlcGFydHVyZS4iLAogICAgbW9kZTogIkZDTCIsCiAgICByZXNwOiAiQ3VzdG9tcy1Ccm9rZXIiLAogICAgc2V2OiAiSGFyZC1TdG9wIiwKICAgIHZvbDogIlJlZ3VsYXRvcnktRml4ZWQiCiAgfSwKICB7CiAgICBjYXQ6ICJQYXJ0aWVzIChDaGluYSBDQ0FNIE5vdGlmeSBQYXJ0eSkiLAogICAgZGVzYzogIk5lZ290aWFibGUgQm9MIHdpdGggYmxhbmsvaW5jb21wbGV0ZSBOb3RpZnkgUGFydHkgb3IgbWlzc2luZyBtYW5kYXRvcnkgQ2hpbmVzZSBFbnRlcnByaXNlIENvZGUgKFVTQ0MvTEVJKSB1bmRlciBDQ0FNLiIsCiAgICBlZGk6ICJFRElGQUNUIE5BRCtOMSBtaXNzaW5nIEdBQ0MgRW50ZXJwcmlzZS1Db2RlIHJlZmVyZW5jZSIsCiAgICBqdXI6ICJDaGluYSBHQUNDIENDQU0gQW5ub3VuY2VtZW50IE5vLiAxMjcgKDIwMjQpIiwKICAgIHJpc2s6ICJNYW5pZmVzdCByZWplY3RlZCBwcmUtbG9hZCwgY2FycmllciBiYXJyZWQgZnJvbSBsb2FkaW5nIGF0IFNoYW5naGFpL05pbmdibywgYW5kIHZlc3NlbCBzdHJpbmcgbWlzc2VkLiIsCiAgICBzbGE6ICJWZXNzZWwgbG9hZGluZyBtaW51cyAyNCBocnMiLAogICAgYW1kdDogIlNJIHN1cHBsZW1lbnQgY2l0aW5nIE5vdGlmeSBQYXJ0eSBVU0NJL1VTQ0Mgb3IgTEVJIGFuZCByZXN1Ym1pdCBOQUQrTjEiLAogICAgcHJvdG86ICIxLiBPQlRBSU4gTm90aWZ5IFBhcnR5IGVudGVycHJpc2UgY29kZS4gMi4gQU1FTkQgU0kgTkFEK04xIHNlZ21lbnQuIDMuIFJFU1VCTUlUIGJlZm9yZSBDQ0FNIDI0LWhvdXIgd2luZG93IGNsb3Nlcy4iLAogICAgbW9kZTogIkZDTCIsCiAgICByZXNwOiAiTlZPQ0MtRm9yd2FyZGVyIiwKICAgIHNldjogIkhhcmQtU3RvcCIsCiAgICB2b2w6ICJSZWd1bGF0b3J5LUZpeGVkIgogIH0sCiAgewogICAgY2F0OiAiRG9jdW1lbnRhdGlvbi9DbGFzc2lmaWNhdGlvbiAoSFRTIE1pc21hdGNoKSIsCiAgICBkZXNjOiAiSFMvSFRTIGNvZGUgb24gaW52b2ljZSBkaWZmZXJzIGZyb20gdGhlIEhUUy02IGNvZGUgZGVjbGFyZWQgb24gdGhlIEJvTC9JU0YgY29tbW9kaXR5IGxpbmUuIiwKICAgIGVkaTogIlgxMiAzMDQvMzUzIEw1IG1pc21hdGNoIHZzIElTRiBIVFMtNiAvIEVESUZBQ1QgR0RTL0ZUWCBtaXNtYXRjaCIsCiAgICBqdXI6ICJVUyBDQlAgSVNGIEhUUy02IHJlcXVpcmVtZW50ICgxOSBDRlIgMTQ5KSArIHRhcmlmZiBtaXNjbGFzc2lmaWNhdGlvbiBleHBvc3VyZSAoMTkgVVNDIDE1OTIpIiwKICAgIHJpc2s6ICJDdXN0b21zIGV4YW0sIGV4YW0gZmVlcyAkODAw4oCTJDMsNTAwLCA14oCTMTUgZGF5IGRlbGF5LCBhbmQgcmVjbGFzc2lmaWNhdGlvbiBwZW5hbHRpZXMuIiwKICAgIHNsYTogIlByaW9yIHRvIGN1c3RvbXMgZW50cnkgcmVsZWFzZSBvciBJU0YgYW1lbmRtZW50IHdpbmRvdyIsCiAgICBhbWR0OiAiUG9zdC1TdW1tYXJ5IENvcnJlY3Rpb24gKFBTQykgb3IgSVNGIEhUUyBhbWVuZG1lbnQgdmlhIEFCSS9BQ0UiLAogICAgcHJvdG86ICIxLiBSRUNPTkNJTEUgSFRTIGFjcm9zcyBpbnZvaWNlLCBwYWNraW5nIGxpc3QsIEJvTCwgYW5kIElTRi4gMi4gRklMRSBQU0MgaWYgZW50cnkgYWxyZWFkeSBmaWxlZC4gMy4gQ0xPU0UgZXhhbSBob2xkIHdpdGggY3VzdG9tcyBicm9rZXIuIiwKICAgIG1vZGU6ICJMQ0wiLAogICAgcmVzcDogIkN1c3RvbXMtQnJva2VyIiwKICAgIHNldjogIlNvZnQtSG9sZCIsCiAgICB2b2w6ICJDb21tZXJjaWFsLVZhcmlhYmxlIgogIH0sCiAgewogICAgY2F0OiAiUmVndWxhdG9yeS1GaWxpbmcgKEFNUyAvIE9USSkiLAogICAgZGVzYzogIkFNUyBvciBob3VzZSBCb0wgZmlsaW5nIGNvbnRhaW5zIGludmFsaWQsIGV4cGlyZWQsIG9yIHVucmVnaXN0ZXJlZCBOVk9DQyBTQ0FDIGNvZGUgb3IgT1RJIGJvbmQgbnVtYmVyLiIsCiAgICBlZGk6ICJYMTIgMzUzLzMwOSBJU0EwNi9HUzAyIFNDQUMgbWlzbWF0Y2ggLyBNMTMgbWFuaWZlc3QvYm9uZCB2YWxpZGF0aW9uIGZhaWwiLAogICAganVyOiAiVVMgQ0JQIEFNUyAyNC1Ib3VyIFJ1bGUgKyBGTUMgT1RJIGJvbmQgcmVxdWlyZW1lbnQgKDQ2IENGUiBQYXJ0IDUxNSkiLAogICAgcmlzazogIkFNUyBtYW5pZmVzdCByZWplY3RlZCwgY2FyZ28gY2Fubm90IGVudGVyL2Rpc2NoYXJnZSwgYW5kIENCUCBtYXkgaW5pdGlhdGUgYm9uZCBzdWZmaWNpZW5jeSByZXZpZXcuIiwKICAgIHNsYTogIlZlc3NlbCBsb2FkaW5nIG1pbnVzIDI0IGhycyIsCiAgICBhbWR0OiAiQU1TIG1hbmlmZXN0IGFtZW5kbWVudCBjaXRpbmcgdmFsaWQgU0NBQyBhbmQgY3VycmVudCBPVEkgYm9uZCBudW1iZXIiLAogICAgcHJvdG86ICIxLiBWRVJJRlkgYWN0aXZlIE9USSBib25kIGFuZCBTQ0FDIHdpdGggQ0JQLiAyLiBDT1JSRUNUIEFNUyBmaWxpbmcgaGVhZGVyLiAzLiBSRVNVQk1JVCBiZWZvcmUgdGhlIDI0LWhvdXIgY3V0LW9mZi4iLAogICAgbW9kZTogIkxDTCIsCiAgICByZXNwOiAiTlZPQ0MtRm9yd2FyZGVyIiwKICAgIHNldjogIkhhcmQtU3RvcCIsCiAgICB2b2w6ICJSZWd1bGF0b3J5LUZpeGVkIgogIH0sCiAgewogICAgY2F0OiAiUmVndWxhdG9yeS1GaWxpbmcgKExhdGUgSVNGKSIsCiAgICBkZXNjOiAiSVNGIDEwKzIgZmlsZWQgbGF0ZSBvciB3aXRoIHBsYWNlaG9sZGVyL2VzdGltYXRlZCBkYXRhIGVsZW1lbnRzLiIsCiAgICBlZGk6ICJJU0YgcmVqZWN0aW9uIG9yIGFsZXJ0IGZyb20gQUJJL0FDRSB1cHN0cmVhbSBib29raW5nIHRyYW5zbWlzc2lvbiIsCiAgICBqdXI6ICJVUyBDQlAgSVNGIDEwKzIg4oCUIDE5IENGUiAxNDkuMiAvIDE0OS42IiwKICAgIHJpc2s6ICJETkwgb3JkZXIsIGxpcXVpZGF0ZWQgZGFtYWdlcyAkNSwwMDDigJMkMTAsMDAwLCBhbmQgYWdncmF2YXRlZCBwZW5hbHRpZXMgdXAgdG8gJDUwLDAwMCBmb3IgcmVwZWF0IGVycm9ycy4iLAogICAgc2xhOiAiVmVzc2VsIGxvYWRpbmcgbWludXMgMjQgaHJzIiwKICAgIGFtZHQ6ICJGaWxlIElTRi0xMCB2aWEgQUJJL0FDRSBjaXRpbmcgbGF0ZSBmaWxpbmcgdm9sdW50YXJ5IHNlbGYtZGlzY2xvc3VyZSIsCiAgICBwcm90bzogIjEuIEZJTEUgSVNGLTEwIGltbWVkaWF0ZWx5LiAyLiBOT1RJRlkgY2FycmllciBvZiBjb25maXJtYXRpb24gbnVtYmVyLiAzLiBNT05JVE9SIGZvciBETkwgY2xlYXJhbmNlIGJlZm9yZSBsb2FkaW5nLiIsCiAgICBtb2RlOiAiRkNMIiwKICAgIHJlc3A6ICJDdXN0b21zLUJyb2tlciIsCiAgICBzZXY6ICJIYXJkLVN0b3AiLAogICAgdm9sOiAiUmVndWxhdG9yeS1GaXhlZCIKICB9LAogIHsKICAgIGNhdDogIlJlZ3VsYXRvcnktRmlsaW5nIChFVSBJQ1MyIEVOUykiLAogICAgZGVzYzogIkhvdXNlIEJvTCBvciBIQkwgaXNzdWVyIEVPUkkgaXMgbWlzc2luZyBvciBub3QgbGlua2VkIHRvIHRoZSBNYXN0ZXIgQm9MIGluIHRoZSBFVSBJQ1MyIEVudHJ5IFN1bW1hcnkgRGVjbGFyYXRpb24uIiwKICAgIGVkaTogIklDUzIgRU5TIGRhdGFzZXQgbWlzc2luZyBIQkwvRU9SSSBjcm9zcy1yZWZlcmVuY2UgLyBFRElGQUNUIElGVE1JTiBSRkYrQk0gbWlzbWF0Y2giLAogICAganVyOiAiRVUgSUNTMiBSZWxlYXNlIDMg4oCUIG1hbmRhdG9yeSBob3VzZS1sZXZlbCBmaWxpbmcgc2luY2UgQXByIDIwMjUiLAogICAgcmlzazogIkN1c3RvbXMgaXNzdWVzIERvLU5vdC1Mb2FkLCBjYXJnbyBoZWxkIGF0IGZpcnN0IEVVIHBvcnQgcGVuZGluZyBjb21wbGV0ZSBFTlMuIiwKICAgIHNsYTogIkJlZm9yZSBsb2FkaW5nIGF0IGxhc3Qgbm9uLUVVIHBvcnQiLAogICAgYW1kdDogIlN1Ym1pdCBtaXNzaW5nIEhCTC9FT1JJIHZpYSBJQ1MyIFNoYXJlZCBUcmFkZXIgSW50ZXJmYWNlIiwKICAgIHByb3RvOiAiMS4gQ09MTEVDVCBtaXNzaW5nIEhCTCBudW1iZXIgYW5kIEVPUkkuIDIuIFNVQk1JVCBjb21wbGV0ZSBFTlMgZGF0YXNldC4gMy4gVkVSSUZZIHJpc2stYXNzZXNzbWVudCBjb21wbGV0ZSBzdGF0dXMuIiwKICAgIG1vZGU6ICJMQ0wiLAogICAgcmVzcDogIk5WT0NDLUZvcndhcmRlciIsCiAgICBzZXY6ICJIYXJkLVN0b3AiLAogICAgdm9sOiAiUmVndWxhdG9yeS1GaXhlZCIKICB9LAogIHsKICAgIGNhdDogIkRHL0hhem1hdCAoU3VwZXJzZWRlZCBVTiBDbGFzc2lmaWNhdGlvbikiLAogICAgZGVzYzogIkRHIFVOIG51bWJlciBvciBwcm9wZXIgc2hpcHBpbmcgbmFtZSByZWZlcmVuY2VzIHN1cGVyc2VkZWQgSU1ERyBjbGFzc2lmaWNhdGlvbiBpbnN0ZWFkIG9mIGN1cnJlbnQgQW1lbmRtZW50IDQyLTI0LiIsCiAgICBlZGk6ICJFRElGQUNUIERHUyAvIFgxMiAzMDQgaGF6bWF0IGRldGFpbCBtaXNtYXRjaCIsCiAgICBqdXI6ICJJTURHIENvZGUsIDIwMjQgRWRpdGlvbiAoQW1lbmRtZW50IDQyLTI0KSDigJQgbWFuZGF0b3J5IHNpbmNlIEphbiAyMDI2IiwKICAgIHJpc2s6ICJUZXJtaW5hbCBERyBkZXNrIHJlZnVzZXMgdGhlIGJvb2tpbmc7IGNhcmdvIGhlbGQgcGVuZGluZyByZWNsYXNzaWZpY2F0aW9uIGFuZCBkZWNsYXJhdGlvbiByZWlzc3VlLiIsCiAgICBzbGE6ICJERyBjdXQtb2ZmICh0eXBpY2FsbHkgNeKAkzEwIGRheXMgYmVmb3JlIHZlc3NlbCBkZXBhcnR1cmUpIiwKICAgIGFtZHQ6ICJSZWNsYXNzaWZ5IHBlciBJTURHIEFtZHQgNDItMjQgYW5kIHJlaXNzdWUgRGFuZ2Vyb3VzIEdvb2RzIERlY2xhcmF0aW9uIiwKICAgIHByb3RvOiAiMS4gUkVDTEFTU0lGWSBjb21tb2RpdHkgcGVyIGN1cnJlbnQgSU1ERyBVTiB0YWJsZS4gMi4gUkVJU1NVRSBEYW5nZXJvdXMgR29vZHMgRGVjbGFyYXRpb24uIDMuIFJFU1VCTUlUIGJlZm9yZSBERyBjdXQtb2ZmLiIsCiAgICBtb2RlOiAiRkNMLURHIiwKICAgIHJlc3A6ICJTaGlwcGVyIiwKICAgIHNldjogIkhhcmQtU3RvcCIsCiAgICB2b2w6ICJSZWd1bGF0b3J5LUZpeGVkIgogIH0sCiAgewogICAgY2F0OiAiREcvSGF6bWF0IChPdXRkYXRlZCBTRFMpIiwKICAgIGRlc2M6ICJEYW5nZXJvdXMgR29vZHMgRGVjbGFyYXRpb24gb3IgTVNEUy9TRFMgU2VjdGlvbiAxNCBzdGlsbCBjaXRlcyBvYnNvbGV0ZSBJTURHIEFtZW5kbWVudCA0MS0yMi4iLAogICAgZWRpOiAiRURJRkFDVCBER1MvRlRYIHN1cGVyc2VkZWQgY29kZSBlZGl0aW9uIHJlZmVyZW5jZSIsCiAgICBqdXI6ICJJTURHIENvZGUgQW1lbmRtZW50IDQyLTI0IOKAlCBJTU8gYW5kIGNhcnJpZXIgREcgYWNjZXB0YW5jZSBwb2xpY3kiLAogICAgcmlzazogIkRHIGRlc2sgcmVqZWN0cyBkb2N1bWVudGF0aW9uOyBERyBjdXQtb2ZmIG1pc3NlZCBsZWFkcyB0byBhdXRvbWF0aWMgc2FpbGluZyByb2xsb3Zlci4iLAogICAgc2xhOiAiREcgYm9va2luZyBjdXQtb2ZmIiwKICAgIGFtZHQ6ICJSZWlzc3VlIE1TRFMvU0RTIFNlY3Rpb24gMTQgY2l0aW5nIElNREcgMjAyNCBFZGl0aW9uIEFtZW5kbWVudCA0Mi0yNCIsCiAgICBwcm90bzogIjEuIFVQREFURSBNU0RTL1NEUyBTZWN0aW9uIDE0IHRvIEFtZHQgNDItMjQuIDIuIEFUVEFDSCB0byBERyBib29raW5nIHBhY2thZ2UuIDMuIFJFU1VCTUlUIGJlZm9yZSBERyBjdXQtb2ZmLiIsCiAgICBtb2RlOiAiTENMLURHIiwKICAgIHJlc3A6ICJTaGlwcGVyIiwKICAgIHNldjogIkhhcmQtU3RvcCIsCiAgICB2b2w6ICJSZWd1bGF0b3J5LUZpeGVkIgogIH0sCiAgewogICAgY2F0OiAiV2VpZ2h0L01lYXN1cmVtZW50IChMQ0wgQ0ZTIFJlY29uY2lsaWF0aW9uKSIsCiAgICBkZXNjOiAiQWdncmVnYXRlIHBpZWNlIHdlaWdodHMgZGVjbGFyZWQgZm9yIExDTCBjb25zb2xpZGF0aW9uIGRvIG5vdCByZWNvbmNpbGUgd2l0aCB0aGUgY29udGFpbmVyJ3Mgc3VibWl0dGVkIFZHTS4iLAogICAgZWRpOiAiRURJRkFDVCBJRlRNSU4gTUVBIG1pc21hdGNoIHZzIEVRRC9WRVJNQVMgVkdNIiwKICAgIGp1cjogIkNGUyB0YXJpZmYgYW5kIFNPTEFTIFZHTSByZWNvbmNpbGlhdGlvbiByZXF1aXJlbWVudCIsCiAgICByaXNrOiAiQ29uc29saWRhdGlvbiByZS1zdG93LCBjYXJnbyByb2xsZWQgdG8gbmV4dCBzYWlsaW5nLCBhbmQgQ0ZTIHJlLWhhbmRsaW5nIGZlZXMgJDUw4oCTJDIwMCBwZXIgY2JtLiIsCiAgICBzbGE6ICJDRlMgY3V0LW9mZiAodHlwaWNhbGx5IENZIGN1dC1vZmYgbWludXMgMuKAkzMgZGF5cykiLAogICAgYW1kdDogIklzc3VlIENGUyByZS13ZWlnaCB0aWNrZXQgYW5kIHJldmlzZWQgY2FyZ28gcmVjZWlwdCIsCiAgICBwcm90bzogIjEuIFJFLVdFSUdIIGluZGl2aWR1YWwgcGllY2VzIGF0IENGUy4gMi4gUkVDT05DSUxFIGFnYWluc3QgY29udGFpbmVyIFZHTS4gMy4gSVNTVUUgcmV2aXNlZCBjYXJnbyByZWNlaXB0LiIsCiAgICBtb2RlOiAiTENMIiwKICAgIHJlc3A6ICJOVk9DQy1Gb3J3YXJkZXIiLAogICAgc2V2OiAiU29mdC1Ib2xkIiwKICAgIHZvbDogIkNhcnJpZXItU3lzdGVtLVNwZWNpZmljIgogIH0sCiAgewogICAgY2F0OiAiRG9jdW1lbnRhdGlvbiAoR2VuZXJpYyBDb21tb2RpdHkgRGVzY3JpcHRpb24pIiwKICAgIGRlc2M6ICJDb21tb2RpdHkgZGVzY3JpcHRpb24gdXNlcyBnZW5lcmljIHRlcm1zICgnRkFLJywgJ0dlbmVyYWwgTWVyY2hhbmRpc2UnLCAnU2FpZCB0byBDb250YWluJykgd2l0aG91dCBIUy1zcGVjaWZpYyBsYW5ndWFnZS4iLAogICAgZWRpOiAiWDEyIDMwNCBMNSAvIEVESUZBQ1QgRlRYIGdlbmVyaWMgZGVzY3JpcHRpb24gZmxhZyIsCiAgICBqdXI6ICJEZXN0aW5hdGlvbiBjdXN0b21zIGNvbW1vZGl0eS1kZXNjcmlwdGlvbiBydWxlcyAoZS5nLiwgR0FDQywgQ0JQKSIsCiAgICByaXNrOiAiQ3VzdG9tcyBleGFtIGhvbGQsIG1pc2RlY2xhcmF0aW9uIHBlbmFsdHkgZXhwb3N1cmUsIGVzcGVjaWFsbHkgYXQgU2hhbmdoYWkvTmluZ2JvIGFuZCBTb3V0aCBBc2lhbiBwb3J0cy4iLAogICAgc2xhOiAiUHJpb3IgdG8gbWFuaWZlc3QgZmlsaW5nIGN1dC1vZmYiLAogICAgYW1kdDogIkFtZW5kIGNvbW1vZGl0eSBkZXNjcmlwdGlvbiBpbiBMNS9GVFggdG8gSFMtc3BlY2lmaWMgdGVybWlub2xvZ3kiLAogICAgcHJvdG86ICIxLiBSRVFVRVNUIHNwZWNpZmljIEhTIGNvbW1vZGl0eSBkZXNjcmlwdGlvbiBmcm9tIHNoaXBwZXIuIDIuIFJFUExBQ0UgZ2VuZXJpYyB0ZXJtcyBpbiBTSS4gMy4gUkVTVUJNSVQgYmVmb3JlIG1hbmlmZXN0IGN1dC1vZmYuIiwKICAgIG1vZGU6ICJGQ0wiLAogICAgcmVzcDogIk5WT0NDLUZvcndhcmRlciIsCiAgICBzZXY6ICJTb2Z0LUhvbGQiLAogICAgdm9sOiAiQ29tbWVyY2lhbC1WYXJpYWJsZSIKICB9LAogIHsKICAgIGNhdDogIkZpbmFuY2lhbC9CaWxsaW5nIChEZW11cnJhZ2UgSW52b2ljZSkiLAogICAgZGVzYzogIkZyZWlnaHQgcGF5bWVudCB0ZXJtIG9uIEJvTCBjb250cmFkaWN0cyBJbmNvdGVybSwgb3IgZGVtdXJyYWdlL2RldGVudGlvbiBpbnZvaWNlIG9taXRzIDQ2IENGUiA1NDEuNiByZXF1aXJlZCBlbGVtZW50cy4iLAogICAgZWRpOiAiWDEyIDMxMCBDMy9NT0EgbWlzbWF0Y2ggdnMgQm9MIGZyZWlnaHQgdGVybSIsCiAgICBqdXI6ICJVUyBGTUMgRGVtdXJyYWdlICYgRGV0ZW50aW9uIEJpbGxpbmcgUmVxdWlyZW1lbnRzICg0NiBDRlIgUGFydCA1NDEpIiwKICAgIHJpc2s6ICJDYXJnbyByZWxlYXNlIHdpdGhoZWxkLCBpbnZvaWNlIHZvaWRlZCBmb3Igbm9uLWNvbXBsaWFuY2UsIGFuZCBGTUMgZW5mb3JjZW1lbnQgZXhwb3N1cmUgZm9yIGNhcnJpZXIuIiwKICAgIHNsYTogIkJlZm9yZSBjYXJnbyByZWxlYXNlIGF0IGRlc3RpbmF0aW9uOyBpbnZvaWNlIG11c3QgaXNzdWUgd2l0aGluIDMwIGNhbGVuZGFyIGRheXMiLAogICAgYW1kdDogIlJlaXNzdWUgQm9MIGFuZCBGTUMtY29tcGxpYW50IGludm9pY2Ugd2l0aCBhIHNpbmdsZSBjb3JyZWN0IGJpbGxlZCBwYXJ0eSIsCiAgICBwcm90bzogIjEuIFZBTElEQVRFIGZyZWlnaHQgdGVybSB2cyBzYWxlcyBjb250cmFjdCBJbmNvdGVybS4gMi4gUkVJU1NVRSBjb21wbGlhbnQgQm9ML2ludm9pY2UuIDMuIFRSQU5TTUlUIHdpdGhpbiAzMC1kYXkgRk1DIHdpbmRvdy4iLAogICAgbW9kZTogIkZDTCIsCiAgICByZXNwOiAiQ2Fycmllci1WT0NDIiwKICAgIHNldjogIlNvZnQtSG9sZCIsCiAgICB2b2w6ICJSZWd1bGF0b3J5LUZpeGVkIgogIH0sCiAgewogICAgY2F0OiAiVmVzc2VsL1ZveWFnZSAoTWFuaWZlc3QgUmVjb25jaWxpYXRpb24pIiwKICAgIGRlc2M6ICJWZXNzZWwgbmFtZSBvciB2b3lhZ2UgbnVtYmVyIG9uIEJvTCBkb2VzIG5vdCBtYXRjaCB0aGUgdmVzc2VsL3ZveWFnZSB0cmFuc21pdHRlZCBvbiBpbmJvdW5kIGN1c3RvbXMgbWFuaWZlc3QuIiwKICAgIGVkaTogIkVESUZBQ1QgVERUIC8gWDEyIDMwNC8zMTAgVjEgbWlzbWF0Y2ggdnMgaW5ib3VuZCBtYW5pZmVzdCIsCiAgICBqdXI6ICJEZXN0aW5hdGlvbiBjdXN0b21zIGluYm91bmQgbWFuaWZlc3QgcmVjb25jaWxpYXRpb24iLAogICAgcmlzazogIk1hbmlmZXN0IERpc2NyZXBhbmN5IFJlcG9ydCwgY2FyZ28gaGVsZCBwZW5kaW5nIGNvcnJlY3Rpb24sIGFuZCBHZW5lcmFsIE9yZGVyIHJpc2sgaWYgdW5yZXNvbHZlZC4iLAogICAgc2xhOiAiUHJpb3IgdG8gdmVzc2VsIGFycml2YWwgb3IgZGlzY2hhcmdlIiwKICAgIGFtZHQ6ICJNYW5pZmVzdCBjb3JyZWN0aW9uL3N1cHBsZW1lbnRhbCBmaWxpbmcgY2l0aW5nIG9yaWdpbmFsIGJpbGwgbnVtYmVyIiwKICAgIHByb3RvOiAiMS4gVkVSSUZZIGFjdHVhbCB2ZXNzZWwvdm95YWdlIGZyb20gY2FycmllciBzY2hlZHVsZS4gMi4gRklMRSBtYW5pZmVzdCBjb3JyZWN0aW9uLiAzLiBDT05GSVJNIG1hdGNoIGJlZm9yZSB2ZXNzZWwgYXJyaXZhbC4iLAogICAgbW9kZTogIkZDTCIsCiAgICByZXNwOiAiQ2Fycmllci1WT0NDIiwKICAgIHNldjogIlNvZnQtSG9sZCIsCiAgICB2b2w6ICJDb21tZXJjaWFsLVZhcmlhYmxlIgogIH0KXTsKCi8vIE1PRFVMRSAwMzogSEVBTFRIQ0FSRSBTVEFSSyBMQVcgJiBGTVYgREFUQUJBU0UKY29uc3QgaGVhbHRoY2FyZV9kYiA9IHsKICAiQ0FSRElPIjogeyBzcGVjaWFsdHk6ICJDYXJkaW9sb2d5IC8gSW50ZXJ2ZW50aW9uYWwiLCBmbXZfY2FwOiA2MjAwMDAsIGV4Y2VwdGlvbnM6IFsiNDIgQ0ZSIMKnIDQxMS4zNTcobCkgRmFpciBNYXJrZXQgVmFsdWUiLCAiwqcgNDExLjM1NyhjKSBCb25hIEZpZGUgRW1wbG95bWVudCJdLCByaXNrX2xldmVsOiAiSGlnaCBESFMgUmVmZXJyYWwgVm9sIiB9LAogICJPUlRITyI6IHsgc3BlY2lhbHR5OiAiT3J0aG9wZWRpYyBTdXJnZXJ5IC8gU3BpbmUiLCBmbXZfY2FwOiA2ODAwMDAsIGV4Y2VwdGlvbnM6IFsiNDIgQ0ZSIMKnIDQxMS4zNTcocCkgSW5kaXJlY3QgQ29tcCIsICLCpyA0MTEuMzU3KGQpIFBlcnNvbmFsIFNlcnZpY2VzIl0sIHJpc2tfbGV2ZWw6ICJIaWdoIERldmljZSBFeHBvc3VyZSIgfSwKICAiT05DTyI6IHsgc3BlY2lhbHR5OiAiTWVkaWNhbCAmIFJhZGlhdGlvbiBPbmNvbG9neSIsIGZtdl9jYXA6IDUxMDAwMCwgZXhjZXB0aW9uczogWyI0MiBDRlIgwqcgNDExLjM1NyhiKSBTcGFjZS9FcXVpcCBMZWFzZSIsICLCpyA0MTEuMzU3KGwpIEZNViJdLCByaXNrX2xldmVsOiAiSGlnaCBJbmZ1c2lvbi9ESFMgVm9sIiB9LAogICJORVVSTyI6IHsgc3BlY2lhbHR5OiAiTmV1cm9sb2d5IC8gTmV1cm9zdXJnZXJ5IiwgZm12X2NhcDogNTkwMDAwLCBleGNlcHRpb25zOiBbIjQyIENGUiDCpyA0MTEuMzU3KGMpIEVtcGxveW1lbnQiLCAiwqcgNDExLjM1NyhhKSBSZW50YWwgT2ZmaWNlIl0sIHJpc2tfbGV2ZWw6ICJNb2RlcmF0ZSBESFMgVm9sIiB9LAogICJQUklNQVJZIjogeyBzcGVjaWFsdHk6ICJQcmltYXJ5IENhcmUgLyBJbnRlcm5hbCBNZWQiLCBmbXZfY2FwOiAzMjAwMDAsIGV4Y2VwdGlvbnM6IFsiNDIgQ0ZSIMKnIDQxMS4zNTUgSW4tT2ZmaWNlIEFuY2lsbGFyeSIsICLCpyA0MTEuMzU3KGMpIEVtcGxveW1lbnQiXSwgcmlza19sZXZlbDogIkhpZ2ggUGFuZWwgQW5jaWxsYXJ5IiB9LAogICJSQUQiOiB7IHNwZWNpYWx0eTogIkRpYWdub3N0aWMgUmFkaW9sb2d5IC8gSW1hZ2luZyIsIGZtdl9jYXA6IDQ4MDAwMCwgZXhjZXB0aW9uczogWyI0MiBDRlIgwqcgNDExLjM1NSBJbi1PZmZpY2UgQW5jaWxsYXJ5IiwgIsKnIDQxMS4zNTcobCkgRk1WIl0sIHJpc2tfbGV2ZWw6ICJIaWdoIERIUyBBbmNpbGxhcnkiIH0sCiAgIkdBU1RSTyI6IHsgc3BlY2lhbHR5OiAiR2FzdHJvZW50ZXJvbG9neSAvIEVuZG9zY29weSIsIGZtdl9jYXA6IDU0NTAwMCwgZXhjZXB0aW9uczogWyI0MiBDRlIgwqcgNDExLjM1NyhkKSBQZXJzb25hbCBTZXJ2aWNlcyIsICLCpyA0MTEuMzU1IEluLU9mZmljZSBBbmNpbGxhcnkiXSwgcmlza19sZXZlbDogIkhpZ2ggRW5kb3Njb3B5IERIUyBWb2wiIH0sCiAgIlVSTyI6IHsgc3BlY2lhbHR5OiAiVXJvbG9neSAvIFVyb2xvZ2ljIE9uY29sb2d5IiwgZm12X2NhcDogNTYwMDAwLCBleGNlcHRpb25zOiBbIjQyIENGUiDCpyA0MTEuMzU3KGMpIEJvbmEgRmlkZSBFbXBsb3ltZW50IiwgIsKnIDQxMS4zNTcobCkgRk1WIl0sIHJpc2tfbGV2ZWw6ICJIaWdoIFN1cmdpY2FsIERIUyBWb2wiIH0sCiAgIlBBVEgiOiB7IHNwZWNpYWx0eTogIlBhdGhvbG9neSAvIENsaW5pY2FsIExhYiIsIGZtdl9jYXA6IDQyMDAwMCwgZXhjZXB0aW9uczogWyI0MiBDRlIgwqcgNDExLjM1NShiKSBJbi1PZmZpY2UgQW5jaWxsYXJ5IiwgIsKnIDQxMS4zNTcoYikgRXF1aXBtZW50IExlYXNlIl0sIHJpc2tfbGV2ZWw6ICJIaWdoIExhYiBESFMgUmVmZXJyYWwiIH0KfTsKCi8vIERZTkFNSUMgUExBWUJPT0tTIFJFR0lTVFJZIERBVEFCQVNFCmNvbnN0IHBsYXlib29rc19kYiA9IHsKICBuZXh1czogWwogICAgewogICAgICBpZDogImFjY193YXlmYWlyIiwKICAgICAgdGl0bGU6ICLwn5OBIFNFQ19MT0dfMDEgLy8gVGhlICQxMDAsMDAwIEVjb25vbWljIE5leHVzIFRocmVzaG9sZCBNYW5kYXRlIiwKICAgICAgc3VidGl0bGU6ICJBY3RpdmUgTmljaGUgUGxheWJvb2sgLy8gU0VDX0xPR18wMSIsCiAgICAgIGhlYWRpbmc6ICJUaGUgJDEwMCwwMDAgRWNvbm9taWMgTmV4dXMgVGhyZXNob2xkOiBIb3cgV2F5ZmFpciBDcmVhdGVkIGEgNTAtU3RhdGUgVGF4IENvbXBsaWFuY2UgT2JsaWdhdGlvbiIsCiAgICAgIG1ldGE6ICJbUFVCTElTSEVEOiBNSUQtMjAyNl0gLy8gW0NMQVNTSUZJQ0FUSU9OOiBFTlRFUlBSSVNFIEFVRElUIFJJU0tdIiwKICAgICAgYm9keTogIkJlZm9yZSBKdW5lIDIwMTgsIHBoeXNpY2FsIHByZXNlbmNlIGdvdmVybmVkIFUuUy4gc2FsZXMgdGF4IGp1cmlzZGljdGlvbi4gVGhlIFN1cHJlbWUgQ291cnQncyBsYW5kbWFyayBydWxpbmcgaW4gPHN0cm9uZz5Tb3V0aCBEYWtvdGEgdi4gV2F5ZmFpcjwvc3Ryb25nPiBhYm9saXNoZWQgcGh5c2ljYWwgcHJlc2VuY2UsIGF1dGhvcml6aW5nIHN0YXRlcyB0byBlbmZvcmNlIGVjb25vbWljIG5leHVzIG9uY2UgYW4gb3V0LW9mLXN0YXRlIGJ1c2luZXNzIGNyb3NzZXMgc3RhdHV0b3J5IGdyb3NzIHJldmVudWUgb3IgZGlzY3JldGUgdHJhbnNhY3Rpb24gY291bnRzLiIKICAgIH0KICBdLAogIGxvZ2lzdGljczogWwogICAgewogICAgICBpZDogImFjY19lZGlfbWF0cml4IiwKICAgICAgdGl0bGU6ICLwn5OBIExPR19MT0dfMDEgLy8gSW52b2ljZS10by1Cb0wgQXV0b21hdGVkIEVESSBBdWRpdCBNYXRyaXgiLAogICAgICBzdWJ0aXRsZTogIkFjdGl2ZSBOaWNoZSBQbGF5Ym9vayAvLyBMT0dfTE9HXzAxIiwKICAgICAgaGVhZGluZzogIk1hcml0aW1lIEludm9pY2UtdG8tQm9MIEVESSBFeGNlcHRpb24gYW5kIFJlbWVkaWF0aW9uIEZyYW1ld29yayIsCiAgICAgIG1ldGE6ICJbUFVCTElTSEVEOiBNSUQtMjAyNl0gLy8gW0NMQVNTSUZJQ0FUSU9OOiBNQVJJVElNRSBFREkgQ09NUExJQU5DRV0iLAogICAgICBib2R5OiAiVGhpcyBtb2R1bGUgbWFwcyBpbnZvaWNlLCBTSSwgQm9MLCBERywgYW5kIGN1c3RvbXMgZmlsaW5nIGRpc2NyZXBhbmNpZXMgaW50byBhIHNpbmdsZSBhdXRvbWF0ZWQgRURJIGF1ZGl0IG1hdHJpeCB3aXRoIGV4cGxpY2l0IGhhcmQtc3RvcCBhbmQgc29mdC1ob2xkIGRlY2lzaW9uaW5nLiBJdCBzdXBwb3J0cyBvcGVyYXRpb25hbCByZW1lZGlhdGlvbiBhY3Jvc3MgU09MQVMgVkdNLCBJU0YgMTArMiwgQ0NBTSwgSU1TRC9JTURHLCBhbmQgQU1TL0lDUzIgd29ya2Zsb3dzLiIKICAgIH0KICBdLAogIGhlYWx0aGNhcmU6IFsKICAgIHsKICAgICAgaWQ6ICJhY2Nfc3RhcmtfbGF3IiwKICAgICAgdGl0bGU6ICLwn5OBIE1FRF9MT0dfMDEgLy8gU3RhcmsgTGF3IEZhaXIgTWFya2V0IFZhbHVlICYgQUtTIFNhZmUgSGFyYm9yIEd1aWRlbGluZXMiLAogICAgICBzdWJ0aXRsZTogIkFjdGl2ZSBOaWNoZSBQbGF5Ym9vayAvLyBNRURfTE9HXzAxIiwKICAgICAgaGVhZGluZzogIlN0YXJrIExhdyAoNDIgQ0ZSIMKnIDQxMS4zNTcpIEZhaXIgTWFya2V0IFZhbHVlIExpbWl0cyAmIFN0YXR1dG9yeSBFeGNlcHRpb25zIiwKICAgICAgbWV0YTogIltQVUJMSVNIRUQ6IE1JRC0yMDI2XSAvLyBbQ0xBU1NJRklDQVRJT046IEhFQUxUSENBUkUgTEVHQUwgUklTS10iLAogICAgICBib2R5OiAiVW5kZXIgNDIgVS5TLkMuIMKnIDEzOTVubiwgcGh5c2ljaWFucyBjYW5ub3QgcmVmZXIgRGVzaWduYXRlZCBIZWFsdGggU2VydmljZXMgKERIUykgdG8gZW50aXRpZXMgd2l0aCB3aGljaCB0aGV5IGhhdmUgYSBmaW5hbmNpYWwgcmVsYXRpb25zaGlwIHVubGVzcyBhIHN0YXR1dG9yeSBleGNlcHRpb24gKGUuZy4sIEJvbmEgRmlkZSBFbXBsb3ltZW50LCBQZXJzb25hbCBTZXJ2aWNlcywgSW4tT2ZmaWNlIEFuY2lsbGFyeSkgaXMgc3RyaWN0bHkgbWV0LiBFeGNlZWRpbmcgRk1WIGJlbmNobWFya3MgZXhwb3NlcyBoZWFsdGhjYXJlIGVudGl0aWVzIHRvIEZhbHNlIENsYWltcyBBY3QgdHJlYmxlIGRhbWFnZXMgYW5kIG1hbmRhdG9yeSBDTVMgZGlzY2xvc3VyZXMuIgogICAgfQogIF0KfTsKCi8vIFRIRU1FIFRPR0dMRQpmdW5jdGlvbiB0b2dnbGVUaGVtZSgpIHsKICBjb25zdCBpc0xpZ2h0ID0gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdsaWdodC1tb2RlJyk7CiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RoZW1lJywgaXNMaWdodCA/ICdsaWdodCcgOiAnZGFyaycpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZUJ0bicpLmlubmVyVGV4dCA9IGlzTGlnaHQgPyAn4pi9IERhcmsgTW9kZScgOiAn4piAIExpZ2h0IE1vZGUnOwp9CgovLyBNVUxUSS1TVEFURSBDT01QQVJFCmZ1bmN0aW9uIG9wZW5Db21wYXJlKCkgewogIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcGFyZU92ZXJsYXknKTsKICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcGFyZVN0YXRlQ2hlY2tib3hlcycpOwogIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJzsKICBPYmplY3Qua2V5cyhtYXRyaXhfZGF0YWJhc2VzKS5zb3J0KCkuZm9yRWFjaChzdCA9PiB7CiAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7CiAgICBsYWJlbC5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6ZmxleDsgYWxpZ24taXRlbXM6Y2VudGVyOyBnYXA6NHB4OyBmb250LXNpemU6MTFweDsgY29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7IGN1cnNvcjpwb2ludGVyOyBwYWRkaW5nOjRweCA4cHg7IGJvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czo0cHg7IGJhY2tncm91bmQ6dmFyKC0tcGFuZWwpOyc7CiAgICBsYWJlbC5pbm5lckhUTUwgPSBgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iJHtzdH0iIHN0eWxlPSJhY2NlbnQtY29sb3I6dmFyKC0tYWNjZW50KTsiPiAke3N0fWA7CiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobGFiZWwpOwogIH0pOwogIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7Cn0KZnVuY3Rpb24gY2xvc2VDb21wYXJlKCkgeyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcGFyZU92ZXJsYXknKS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsgfQpmdW5jdGlvbiByZW5kZXJDb21wYXJlVGFibGUoKSB7CiAgY29uc3QgY2hlY2tlZCA9IFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY29tcGFyZVN0YXRlQ2hlY2tib3hlcyBpbnB1dDpjaGVja2VkJyldLm1hcChjID0+IGMudmFsdWUpOwogIGlmICghY2hlY2tlZC5sZW5ndGgpIHsgYWxlcnQoJ1NlbGVjdCBhdCBsZWFzdCBvbmUgc3RhdGUuJyk7IHJldHVybjsgfQogIGNvbnN0IHJldiA9IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JldklucHV0JykudmFsdWUpIHx8IDA7CiAgY29uc3QgdHJhbnMgPSBwYXJzZUZsb2F0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0cmFuc0lucHV0JykudmFsdWUpIHx8IDA7CiAgbGV0IGh0bWwgPSAnPHRhYmxlIGNsYXNzPSJjb21wYXJlLXRhYmxlIj48dGhlYWQ+PHRyPjx0aD5TdGF0ZTwvdGg+PHRoPlJldiBUaHJlc2hvbGQ8L3RoPjx0aD5UeCBMaW1pdDwvdGg+PHRoPkxvZ2ljPC90aD48dGg+UGVyaW9kPC90aD48dGg+VXRpbGl6YXRpb248L3RoPjx0aD5TdGF0dXM8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+JzsKICBjaGVja2VkLmZvckVhY2goc3QgPT4gewogICAgY29uc3QgZCA9IG1hdHJpeF9kYXRhYmFzZXNbc3RdOwogICAgY29uc3QgcGN0ID0gdHlwZW9mIGQucmV2ID09PSAnbnVtYmVyJyA/ICgocmV2IC8gZC5yZXYpICogMTAwKS50b0ZpeGVkKDEpICsgJyUnIDogJ04vQSc7CiAgICBsZXQgYnJlYWNoZWQgPSBmYWxzZTsKICAgIGlmICh0eXBlb2YgZC5yZXYgPT09ICdudW1iZXInKSB7CiAgICAgIGlmIChkLnRyYW5zID09PSBudWxsKSBicmVhY2hlZCA9IHJldiA+PSBkLnJldjsKICAgICAgZWxzZSBpZiAoZC5sb2dpYyA9PT0gJ0FORCcpIGJyZWFjaGVkID0gcmV2ID49IGQucmV2ICYmIHRyYW5zID49IGQudHJhbnM7CiAgICAgIGVsc2UgaWYgKGQubG9naWMgPT09ICdPUicpIGJyZWFjaGVkID0gcmV2ID49IGQucmV2IHx8IHRyYW5zID49IGQudHJhbnM7CiAgICB9CiAgICBjb25zdCBzdGF0dXNDb2xvciA9IGQucmV2ID09PSAnTm8gU2FsZXMgVGF4JyA/ICd2YXIoLS1hY2NlbnQpJyA6IGJyZWFjaGVkID8gJ3ZhcigtLWRhbmdlciknIDogJ3ZhcigtLWFjY2VudCknOwogICAgY29uc3Qgc3RhdHVzVGV4dCA9IGQucmV2ID09PSAnTm8gU2FsZXMgVGF4JyA/ICdOTyBUQVgnIDogYnJlYWNoZWQgPyAnQlJFQUNIJyA6ICdDTEVBUic7CiAgICBodG1sICs9IGA8dHI+PHRkPiR7c3R9PC90ZD48dGQ+JHt0eXBlb2YgZC5yZXYgPT09ICdudW1iZXInID8gJyQnK2QucmV2LnRvTG9jYWxlU3RyaW5nKCkgOiBkLnJldn08L3RkPjx0ZD4ke2QudHJhbnMgfHwgJ+KAlCd9PC90ZD48dGQ+JHtkLmxvZ2ljfTwvdGQ+PHRkIHN0eWxlPSJmb250LXNpemU6MTBweDsiPiR7ZC5wZXJpb2R9PC90ZD48dGQ+JHtwY3R9PC90ZD48dGQgc3R5bGU9ImNvbG9yOiR7c3RhdHVzQ29sb3J9OyBmb250LXdlaWdodDo3MDA7Ij4ke3N0YXR1c1RleHR9PC90ZD48L3RyPmA7CiAgfSk7CiAgaHRtbCArPSAnPC90Ym9keT48L3RhYmxlPic7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBhcmVUYWJsZUNvbnRhaW5lcicpLmlubmVySFRNTCA9IGh0bWw7Cn0KCi8vIEFVRElUIEhJU1RPUlkKY29uc3QgYXVkaXRIaXN0b3J5ID0gW107CmZ1bmN0aW9uIGFkZFRvSGlzdG9yeShtb2R1bGUsIHRhcmdldCwgc3RhdHVzLCB1dGlsaXphdGlvbikgewogIGNvbnN0IHBhcnRuZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFzdF9wYXJ0bmVyX3Byb3Zpc2lvbmVkJykgfHwgbnVsbDsKICBhdWRpdEhpc3RvcnkudW5zaGlmdCh7IHRpbWU6IG5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCksIG1vZHVsZSwgdGFyZ2V0LCBzdGF0dXMsIHV0aWxpemF0aW9uLCBwYXJ0bmVyIH0pOwogIGlmIChhdWRpdEhpc3RvcnkubGVuZ3RoID4gMjApIGF1ZGl0SGlzdG9yeS5wb3AoKTsKICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaXN0b3J5UGFuZWwnKTsKICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpc3RvcnlMaXN0Jyk7CiAgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgbGlzdC5pbm5lckhUTUwgPSBhdWRpdEhpc3RvcnkubWFwKGggPT4gewogICAgY29uc3QgcGFydG5lckxhYmVsID0gaC5wYXJ0bmVyID8gYDxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBweDsgY29sb3I6dmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDo4cHg7Ij4oJHtoLnBhcnRuZXJ9KTwvc3Bhbj5gIDogJyc7CiAgICBjb25zdCBjb2xvciA9IGguc3RhdHVzLmluY2x1ZGVzKCdCUkVBQ0gnKSB8fCBoLnN0YXR1cy5pbmNsdWRlcygnSEFSRCcpID8gJ3ZhcigtLWRhbmdlciknIDogaC5zdGF0dXMuaW5jbHVkZXMoJ1dBUk4nKSB8fCBoLnN0YXR1cy5pbmNsdWRlcygnU09GVCcpID8gJ3ZhcigtLXdhcm5pbmcpJyA6ICd2YXIoLS1hY2NlbnQpJzsKICAgIHJldHVybiBgCiAgICA8ZGl2IGNsYXNzPSJoaXN0b3J5LWl0ZW0iPgogICAgICA8c3BhbiBzdHlsZT0iY29sb3I6dmFyKC0tbXV0ZWQpOyBmb250LXNpemU6MTBweDsiPiR7aC50aW1lfTwvc3Bhbj4KICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtbXV0ZWQpOyBmbGV4OjE7IHBhZGRpbmc6MCAxMHB4OyI+JHtoLm1vZHVsZX0gLy8gJHtoLnRhcmdldH0gJHtwYXJ0bmVyTGFiZWx9PC9zcGFuPgogICAgICA8c3BhbiBzdHlsZT0iZm9udC1zaXplOjEwcHg7Ij4ke2gudXRpbGl6YXRpb259PC9zcGFuPgogICAgICA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6NzAwOyBmb250LXNpemU6MTBweDsgY29sb3I6JHtjb2xvcn0iPiR7aC5zdGF0dXN9PC9zcGFuPgogICAgPC9kaXY+YDsKICB9KS5qb2luKCcnKTsKfQpmdW5jdGlvbiBjbGVhckhpc3RvcnkoKSB7CiAgYXVkaXRIaXN0b3J5Lmxlbmd0aCA9IDA7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpc3RvcnlQYW5lbCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpc3RvcnlMaXN0JykuaW5uZXJIVE1MID0gJyc7Cn0KCi8vIElOTElORSBWQUxJREFUSU9OCmZ1bmN0aW9uIGNsZWFyVmFsaWRhdGlvbkVycm9ycygpIHsKICBbJ3N0YXRlU2VsZWN0JywncmV2SW5wdXQnLCd0cmFuc0lucHV0J10uZm9yRWFjaChpZCA9PiB7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuY2xhc3NMaXN0LnJlbW92ZSgnaW5wdXQtZXJyb3InKTsKICB9KTsKICBbJ2VyclN0YXRlJywnZXJyUmV2JywnZXJyVHJhbnMnXS5mb3JFYWNoKGlkID0+IHsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIH0pOwp9CmZ1bmN0aW9uIHNob3dFcnJvcihmaWVsZElkLCBlcnJJZCkgewogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpZWxkSWQpLmNsYXNzTGlzdC5hZGQoJ2lucHV0LWVycm9yJyk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZXJySWQpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwp9CgovLyBQUk9HUkVTUyBCQVIgVVBEQVRFUgpmdW5jdGlvbiB1cGRhdGVQcm9ncmVzc0JhcihwY3QsIHN0YXR1cykgewogIGNvbnN0IGZpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndWlQcm9ncmVzc0ZpbGwnKTsKICBpZiAoIWZpbGwpIHJldHVybjsKICBjb25zdCBjbGFtcGVkID0gTWF0aC5taW4ocGN0ICogMTAwLCAxMDApOwogIGZpbGwuc3R5bGUud2lkdGggPSBjbGFtcGVkICsgJyUnOwogIGZpbGwuc3R5bGUuYmFja2dyb3VuZCA9IHN0YXR1cyA9PT0gJ2JyZWFjaCcgPyAndmFyKC0tZGFuZ2VyKScgOiBzdGF0dXMgPT09ICd3YXJuJyA/ICd2YXIoLS13YXJuaW5nKScgOiAndmFyKC0tYWNjZW50KSc7Cn0KCi8vIENTViBFWFBPUlQKZnVuY3Rpb24gZXhwb3J0QXVkaXRSZXBvcnRDU1YoKSB7CiAgY29uc3Qgcm93cyA9IFsKICAgIFsnRmllbGQnLCAnVmFsdWUnXSwKICAgIFsnTW9kdWxlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R5bmFtaWNTdWJIZWFkZXInKS5pbm5lclRleHRdLAogICAgWydNb2R1bGUgRGVzY3JpcHRpb24nLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHluYW1pY1N1YkhlYWRlcicpLmlubmVyVGV4dF0sCiAgICBbJ1RhcmdldCcsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1aVN0YXRlJykuaW5uZXJUZXh0XSwKICAgIFsnVXRpbGl6YXRpb24nLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndWlQY3QnKS5pbm5lclRleHRdLAogICAgWydUaHJlc2hvbGQnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndWlSZXYnKS5pbm5lclRleHRdLAogICAgWydQZXJpb2QnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndWlQZXJpb2QnKS5pbm5lclRleHRdLAogICAgWydQYXJ0bmVyIFByb3Zpc2lvbmVkJywgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhc3RfcGFydG5lcl9wcm92aXNpb25lZCcpIHx8ICdOb25lJ10sCiAgICBbJ1RpbWVzdGFtcCcsIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKV0KICBdOwogIGNvbnN0IGNzdiA9IHJvd3MubWFwKHIgPT4gci5tYXAodiA9PiBgIiR7dn0iYCkuam9pbignLCcpKS5qb2luKCdcbicpOwogIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbY3N2XSwgeyB0eXBlOiAndGV4dC9jc3YnIH0pOwogIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgYS5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKICBhLmRvd25sb2FkID0gYGNvbXBsaWFuY2VfcmVwb3J0XyR7RGF0ZS5ub3coKX0uY3N2YDsKICBhLmNsaWNrKCk7CiAgc2V0VGltZW91dCgoKSA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKGEuaHJlZiksIDEwMCk7Cn0KCi8vIEV4cG9ydCBzZXNzaW9uIGF1ZGl0IGhpc3RvcnkgKGluY2x1ZGVzIHBhcnRuZXIgY29udGV4dCkKZnVuY3Rpb24gZXhwb3J0QXVkaXRIaXN0b3J5Q1NWKCkgewogIGlmICghYXVkaXRIaXN0b3J5IHx8ICFhdWRpdEhpc3RvcnkubGVuZ3RoKSByZXR1cm4gYWxlcnQoJ05vIGhpc3RvcnkgdG8gZXhwb3J0Jyk7CiAgY29uc3QgaGVhZGVycyA9IFsnVGltZScsJ01vZHVsZScsJ1RhcmdldCcsJ1V0aWxpemF0aW9uJywnU3RhdHVzJywnUGFydG5lciddOwogIGNvbnN0IHJvd3MgPSBbaGVhZGVyc107CiAgYXVkaXRIaXN0b3J5LmZvckVhY2goaCA9PiByb3dzLnB1c2goW2gudGltZSB8fCAnJywgaC5tb2R1bGUgfHwgJycsIGgudGFyZ2V0IHx8ICcnLCBoLnV0aWxpemF0aW9uIHx8ICcnLCBoLnN0YXR1cyB8fCAnJywgaC5wYXJ0bmVyIHx8ICcnXSkpOwogIGNvbnN0IGNzdiA9IHJvd3MubWFwKHIgPT4gci5tYXAodiA9PiBgIiR7U3RyaW5nKHYpLnJlcGxhY2UoLyIvZywnIiInKX0iYCkuam9pbignLCcpKS5qb2luKCdcbicpOwogIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbY3N2XSwgeyB0eXBlOiAndGV4dC9jc3YnIH0pOwogIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgYS5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKICBhLmRvd25sb2FkID0gYGF1ZGl0X2hpc3RvcnlfJHtEYXRlLm5vdygpfS5jc3ZgOwogIGEuY2xpY2soKTsKICBzZXRUaW1lb3V0KCgpID0+IFVSTC5yZXZva2VPYmplY3RVUkwoYS5ocmVmKSwgMTAwKTsKfQoKLy8gU0hBUkVBQkxFIFVSTCBTVEFURQpmdW5jdGlvbiB1cGRhdGVTaGFyZWFibGVVUkwobmljaGUsIHN0YXRlLCByZXYsIHRyYW5zKSB7CiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IG5pY2hlLCBzdGF0ZSwgcmV2LCB0cmFucyB9KTsKICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sICcnLCBgPyR7cGFyYW1zfWApOwp9CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4gewogIC8vIFJlc3RvcmUgdGhlbWUKICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RoZW1lJykgPT09ICdsaWdodCcpIHsKICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnbGlnaHQtbW9kZScpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lQnRuJykuaW5uZXJUZXh0ID0gJ+KYvSBEYXJrIE1vZGUnOwogIH0KCiAgLy8gUmVzdG9yZSBmcm9tIFVSTCBwYXJhbXMKICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpOwogIGNvbnN0IHVybE5pY2hlID0gcGFyYW1zLmdldCgnbmljaGUnKTsKICBjb25zdCB1cmxTdGF0ZSA9IHBhcmFtcy5nZXQoJ3N0YXRlJyk7CiAgY29uc3QgdXJsUmV2ID0gcGFyYW1zLmdldCgncmV2Jyk7CiAgY29uc3QgdXJsVHJhbnMgPSBwYXJhbXMuZ2V0KCd0cmFucycpOwoKICBjb25zdCBzYXZlZE5pY2hlID0gdXJsTmljaGUgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2FjdGl2ZV9uaWNoZScpIHx8ICduZXh1cyc7CgogIC8vIEV4cG9zZSBhIHRpbnkgZGV2IHRlc3QgaGFybmVzcyBpbiB0aGUgVUkgZm9yIGxvY2FsIHZhbGlkYXRpb24gKG5vdCBmb3IgcHJvZHVjdGlvbikKICB3aW5kb3cucnVuVW5pdFRlc3RzID0gZnVuY3Rpb24gcnVuVW5pdFRlc3RzKCkgewogICAgY29uc3QgcmVzdWx0cyA9IFtdOwogICAgLy8gVGVzdCAxOiBwYXJ0bmVyc19yZWdpc3RyeSBrZXlzIGV4aXN0CiAgICByZXN1bHRzLnB1c2goWydwYXJ0bmVyc19yZWdpc3RyeV9jb3VudCcsIE9iamVjdC5rZXlzKHBhcnRuZXJzX3JlZ2lzdHJ5KS5sZW5ndGhdKTsKICAgIC8vIFRlc3QgMjogd2ViaG9vayBwZXJzaXN0ZW5jZSByb3VuZHRyaXAKICAgIHRyeSB7CiAgICAgIHNldFBhcnRuZXJXZWJob29rVXJsKCdURVNUX1RNUCcsICdodHRwczovL2V4YW1wbGUudGVzdC93ZWJob29rJyk7CiAgICAgIGNvbnN0IG9rID0gZ2V0UGFydG5lcldlYmhvb2tVcmwoJ1RFU1RfVE1QJykgPT09ICdodHRwczovL2V4YW1wbGUudGVzdC93ZWJob29rJzsKICAgICAgcmVzdWx0cy5wdXNoKFsnd2ViaG9va19wZXJzaXN0ZW5jZV9vaycsIG9rXSk7CiAgICAgIC8vIGNsZWFudXAKICAgICAgc2V0UGFydG5lcldlYmhvb2tVcmwoJ1RFU1RfVE1QJywgJycpOwogICAgfSBjYXRjaCAoZSkgeyByZXN1bHRzLnB1c2goWyd3ZWJob29rX3BlcnNpc3RlbmNlX29rJywgZmFsc2VdKTsgfQogICAgLy8gVGVzdCAzOiBDU1YgZ2VuZXJhdGlvbiAobm9uLWVtcHR5IHJlcG9ydCkKICAgIHRyeSB7IGV4cG9ydEF1ZGl0UmVwb3J0Q1NWKCk7IHJlc3VsdHMucHVzaChbJ2Nzdl9yZXBvcnRfZ2VuZXJhdGVkJywgdHJ1ZV0pOyB9IGNhdGNoIChlKSB7IHJlc3VsdHMucHVzaChbJ2Nzdl9yZXBvcnRfZ2VuZXJhdGVkJywgZmFsc2VdKTsgfQogICAgLy8gVGVzdCA0OiBoaXN0b3J5IGV4cG9ydCBmdW5jdGlvbiBleGlzdHMKICAgIHJlc3VsdHMucHVzaChbJ2hpc3RvcnlfZXhwb3J0X2ZuJywgdHlwZW9mIGV4cG9ydEF1ZGl0SGlzdG9yeUNTViA9PT0gJ2Z1bmN0aW9uJ10pOwogICAgYWxlcnQoJ1VuaXQgdGVzdHMgcnVuIOKAlCBjaGVjayBjb25zb2xlIGZvciBkZXRhaWxzLicpOwogICAgY29uc29sZS50YWJsZShyZXN1bHRzKTsKICAgIHJldHVybiByZXN1bHRzOwogIH07CiAgLy8gU3RhcnQgYXV0b21hdGljIGJhY2tncm91bmQgd29ya2VyIHRvIHByb2Nlc3MgcGVuZGluZyBwcm92aXNpb25zIHBlcmlvZGljYWxseQogIGlmICghd2luZG93Ll9fYXV0b1Byb3Zpc2lvbldvcmtlclN0YXJ0ZWQpIHsKICAgIHJ1bkF1dG9Qcm92aXNpb25Xb3JrZXIoKTsKICAgIHdpbmRvdy5fX2F1dG9Qcm92aXNpb25Xb3JrZXJTdGFydGVkID0gdHJ1ZTsKICB9CiAgc3dpdGNoTmljaGVDb25zb2xlKHNhdmVkTmljaGUpOwogIGNvbnN0IHRpY2tlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaXZlVGVsZW1ldHJ5VGlja2VyJyk7CiAgaWYgKHRpY2tlcikgdGlja2VyLmlubmVyVGV4dCA9IGdldFRlbGVtZXRyeUxvZygpOwoKICBpZiAodXJsU3RhdGUpIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0ZVNlbGVjdCcpLnZhbHVlID0gdXJsU3RhdGU7CiAgaWYgKHVybFJldikgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JldklucHV0JykudmFsdWUgPSB1cmxSZXY7CiAgaWYgKHVybFRyYW5zKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJhbnNJbnB1dCcpLnZhbHVlID0gdXJsVHJhbnM7CgogIC8vIEVuc3VyZSB0aGUgYWN0aXZlIG5pY2hlIFVJIGlzIHN5bmNocm9uaXplZCBhZnRlciBVUkwgb3IgY2FjaGVkIGlucHV0cyBhcmUgYXBwbGllZAogIGhhbmRsZVNlbGVjdENoYW5nZSgpOwogIHVwZGF0ZUxpdmVTdGF0dXNDYXJkKCk7CgogIFsna2V5SW5wdXQnLCAnc3RhdGVTZWxlY3QnLCAncmV2SW5wdXQnLCAndHJhbnNJbnB1dCcsCiAgICdhcnJhbmdlbWVudFR5cGVTZWxlY3QnLCAndm9sdW1lRGVwZW5kZW50U2VsZWN0JywgJ3dyaXR0ZW5BZ3JlZW1lbnRTZWxlY3QnLAogICAnZm12QXBwcmFpc2FsU2VsZWN0JywgJ292ZXJwYXltZW50RGF0ZUlucHV0JywgJ2hvdXJseVJhdGVJbnB1dCcsICd0b2xsZWRTZWxlY3QnXS5mb3JFYWNoKGlkID0+IHsKICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwogICAgaWYgKGVsKSB7CiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0Jywgc2F2ZUlucHV0TWVtb3J5KTsKICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgc2F2ZUlucHV0TWVtb3J5KTsKICAgIH0KICB9KTsKCiAgLy8gS2V5Ym9hcmQgc2hvcnRjdXQgQ21kL0N0cmwrRW50ZXIKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZSA9PiB7CiAgICBpZiAoKGUuY3RybEtleSB8fCBlLm1ldGFLZXkpICYmIGUua2V5ID09PSAnRW50ZXInKSBydW5BdWRpdCgpOwogIH0pOwp9KTsKCmZ1bmN0aW9uIHNhdmVJbnB1dE1lbW9yeSgpIHsKICBjb25zdCBhY3RpdmVOaWNoZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdhY3RpdmVfbmljaGUnKSB8fCAnbmV4dXMnOwogIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYWNoZV9rZXknLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2V5SW5wdXQnKS52YWx1ZSk7CiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oYGNhY2hlX3N0YXRlXyR7YWN0aXZlTmljaGV9YCwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRlU2VsZWN0JykudmFsdWUpOwogIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBjYWNoZV9yZXZfJHthY3RpdmVOaWNoZX1gLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2SW5wdXQnKS52YWx1ZSk7CiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oYGNhY2hlX3RyYW5zXyR7YWN0aXZlTmljaGV9YCwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RyYW5zSW5wdXQnKS52YWx1ZSk7CiAgaWYgKGFjdGl2ZU5pY2hlID09PSAnaGVhbHRoY2FyZScpIHsKICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYWNoZV9oY19hcnJhbmdlbWVudCcsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcnJhbmdlbWVudFR5cGVTZWxlY3QnKS52YWx1ZSk7CiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FjaGVfaGNfdm9sdW1lJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZvbHVtZURlcGVuZGVudFNlbGVjdCcpLnZhbHVlKTsKICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYWNoZV9oY193cml0dGVuJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dyaXR0ZW5BZ3JlZW1lbnRTZWxlY3QnKS52YWx1ZSk7CiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FjaGVfaGNfZm12JywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZtdkFwcHJhaXNhbFNlbGVjdCcpLnZhbHVlKTsKICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYWNoZV9oY19vcGRhdGUnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3ZlcnBheW1lbnREYXRlSW5wdXQnKS52YWx1ZSk7CiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FjaGVfaGNfaG91cmx5JywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hvdXJseVJhdGVJbnB1dCcpLnZhbHVlKTsKICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYWNoZV9oY190b2xsZWQnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9sbGVkU2VsZWN0JykudmFsdWUpOwogIH0KfQoKZnVuY3Rpb24gcmVzdG9yZUlucHV0TWVtb3J5KCkgewogIGNvbnN0IGFjdGl2ZU5pY2hlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2FjdGl2ZV9uaWNoZScpIHx8ICduZXh1cyc7CgogIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVfa2V5JykpIHsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrZXlJbnB1dCcpLnZhbHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhY2hlX2tleScpOwogIH0KCiAgY29uc3Qgc2F2ZWRTdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBjYWNoZV9zdGF0ZV8ke2FjdGl2ZU5pY2hlfWApOwogIGlmIChzYXZlZFN0YXRlKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdGVTZWxlY3QnKS52YWx1ZSA9IHNhdmVkU3RhdGU7CgogIGNvbnN0IHNhdmVkUmV2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYGNhY2hlX3Jldl8ke2FjdGl2ZU5pY2hlfWApOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZJbnB1dCcpLnZhbHVlID0gc2F2ZWRSZXYgfHwgJzAnOwoKICBjb25zdCBzYXZlZFRyYW5zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYGNhY2hlX3RyYW5zXyR7YWN0aXZlTmljaGV9YCk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RyYW5zSW5wdXQnKS52YWx1ZSA9IHNhdmVkVHJhbnMgfHwgJzAnOwoKICBpZiAoYWN0aXZlTmljaGUgPT09ICdoZWFsdGhjYXJlJykgewogICAgY29uc3QgYXJyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhY2hlX2hjX2FycmFuZ2VtZW50Jyk7CiAgICBjb25zdCB2b2wgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVfaGNfdm9sdW1lJyk7CiAgICBjb25zdCB3cnQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVfaGNfd3JpdHRlbicpOwogICAgY29uc3QgZm12ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhY2hlX2hjX2ZtdicpOwogICAgY29uc3Qgb3BkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhY2hlX2hjX29wZGF0ZScpOwogICAgaWYgKGFycikgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FycmFuZ2VtZW50VHlwZVNlbGVjdCcpLnZhbHVlID0gYXJyOwogICAgaWYgKHZvbCkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZvbHVtZURlcGVuZGVudFNlbGVjdCcpLnZhbHVlID0gdm9sOwogICAgaWYgKHdydCkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dyaXR0ZW5BZ3JlZW1lbnRTZWxlY3QnKS52YWx1ZSA9IHdydDsKICAgIGlmIChmbXYpIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmbXZBcHByYWlzYWxTZWxlY3QnKS52YWx1ZSA9IGZtdjsKICAgIGlmIChvcGQpIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvdmVycGF5bWVudERhdGVJbnB1dCcpLnZhbHVlID0gb3BkOwogICAgY29uc3QgaHJseSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYWNoZV9oY19ob3VybHknKTsKICAgIGlmIChocmx5KSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaG91cmx5UmF0ZUlucHV0JykudmFsdWUgPSBocmx5OwogICAgY29uc3QgdGxkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhY2hlX2hjX3RvbGxlZCcpOwogICAgaWYgKHRsZCkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvbGxlZFNlbGVjdCcpLnZhbHVlID0gdGxkOwogIH0KfQoKZnVuY3Rpb24gcmVzZXRUZXJtaW5hbE1lbW9yeSgpIHsKICBpZihjb25maXJtKCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2xlYXIgYWxsIGNhY2hlZCBrZXlzIGFuZCB0ZXJtaW5hbCBpbnB1dHM/IikpIHsKICAgIGxvY2FsU3RvcmFnZS5jbGVhcigpOwogICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgfQp9CgpmdW5jdGlvbiBjbGVhckhlYWx0aGNhcmVTZXNzaW9uKCkgewogIFsnY2FjaGVfaGNfYXJyYW5nZW1lbnQnLCdjYWNoZV9oY192b2x1bWUnLCdjYWNoZV9oY193cml0dGVuJywnY2FjaGVfaGNfZm12JywKICAgJ2NhY2hlX2hjX29wZGF0ZScsJ2NhY2hlX2hjX2hvdXJseScsJ2NhY2hlX2hjX3RvbGxlZCcsCiAgICdjYWNoZV9yZXZfaGVhbHRoY2FyZScsJ2NhY2hlX3RyYW5zX2hlYWx0aGNhcmUnLCdjYWNoZV9zdGF0ZV9oZWFsdGhjYXJlJ10uZm9yRWFjaChrID0+IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGspKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdGVTZWxlY3QnKS52YWx1ZSA9ICcnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZJbnB1dCcpLnZhbHVlID0gJzAnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0cmFuc0lucHV0JykudmFsdWUgPSAnMCc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FycmFuZ2VtZW50VHlwZVNlbGVjdCcpLnZhbHVlID0gJyc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZvbHVtZURlcGVuZGVudFNlbGVjdCcpLnZhbHVlID0gJyc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dyaXR0ZW5BZ3JlZW1lbnRTZWxlY3QnKS52YWx1ZSA9ICcnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmbXZBcHByYWlzYWxTZWxlY3QnKS52YWx1ZSA9ICcnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvdmVycGF5bWVudERhdGVJbnB1dCcpLnZhbHVlID0gJyc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hvdXJseVJhdGVJbnB1dCcpLnZhbHVlID0gJzAnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2xsZWRTZWxlY3QnKS52YWx1ZSA9ICcnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRlbENhcHR1cmVCbG9jaycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb3RvY29sU2VjdGlvbldyYXBwZXInKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXBvcnRQYW5lbCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgY2xlYXJWYWxpZGF0aW9uRXJyb3JzKCk7CiAgaGFuZGxlU2VsZWN0Q2hhbmdlKCk7Cn0KCmZ1bmN0aW9uIHJlc2V0TW9kdWxlVUlTdGF0ZSgpIHsKICBbJ3JlcG9ydFBhbmVsJywnaW50ZWxDYXB0dXJlQmxvY2snLCdwcm90b2NvbFNlY3Rpb25XcmFwcGVyJywncmlza0luc2lnaHRQYW5lbCcsJ2NvbXBhcmVCdG4nLCdsb2dpc3RpY3NJbnB1dEhlbHBlcicsJ2hlYWx0aGNhcmVFeHRyYUlucHV0cyddLmZvckVhY2goaWQgPT4gewogICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7CiAgICBpZiAoIWVsKSByZXR1cm47CiAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIH0pOwogIGNvbnN0IHF1aWNrU2VhcmNoUmVzdWx0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdWlja1NlYXJjaFJlc3VsdHMnKTsKICBpZiAocXVpY2tTZWFyY2hSZXN1bHRzKSB7CiAgICBxdWlja1NlYXJjaFJlc3VsdHMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIHF1aWNrU2VhcmNoUmVzdWx0cy5pbm5lckhUTUwgPSAnJzsKICB9CiAgY29uc3QgZXhlY0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGVjQnRuJyk7CiAgaWYgKGV4ZWNCdG4pIHsKICAgIGV4ZWNCdG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgIGV4ZWNCdG4uaW5uZXJUZXh0ID0gJ0V4ZWN1dGUgTWF0cml4IEFuYWx5c2lzJzsKICB9CiAgY2xlYXJWYWxpZGF0aW9uRXJyb3JzKCk7Cn0KCi8vIE1VTFRJLU5JQ0hFIFdPUktTUEFDRSBDT05TT0xFIE1VTFRJUExFWEVSICYgUExBWUJPT0sgUkVOREVSRVIKZnVuY3Rpb24gc3dpdGNoTmljaGVDb25zb2xlKHRhcmdldE5pY2hlKSB7CiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FjdGl2ZV9uaWNoZScsIHRhcmdldE5pY2hlKTsKCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYl9uZXh1cycpLmNsYXNzTmFtZSA9ICd0YWItYnRuJzsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiX2xvZ2lzdGljcycpLmNsYXNzTmFtZSA9ICd0YWItYnRuJzsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiX2hlYWx0aGNhcmUnKS5jbGFzc05hbWUgPSAndGFiLWJ0bic7CiAgCiAgcmVzZXRNb2R1bGVVSVN0YXRlKCk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaElucHV0RmlsdGVyJykudmFsdWUgPSAnJzsKCiAgY29uc3Qgc2VsZWN0QmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRlU2VsZWN0Jyk7CiAgY29uc3QgYmFkZ2VXcmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhZGdlU2VjdGlvbldyYXBwZXInKTsKICBjb25zdCBiYWRnZVRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhZGdlU2VjdGlvblRpdGxlJyk7CiAgY29uc3QgYmFkZ2VHcmlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R5bmFtaWNCYWRnZUdyaWQnKTsKCiAgLy8gQ2xlYXIgc3RhbGUgdmFsdWVzIHdoZW4gY2hhbmdpbmcgbW9kdWxlcyBzbyB0aGUgbmV3IG5pY2hlIHN0YXJ0cyB3aXRoIGZyZXNoIGNvbnRleHQKICBpZiAoc2VsZWN0QmFyKSBzZWxlY3RCYXIudmFsdWUgPSAnJzsKICBjb25zdCBmaWVsZHNUb1Jlc2V0ID0gWydyZXZJbnB1dCcsJ3RyYW5zSW5wdXQnLCdhcnJhbmdlbWVudFR5cGVTZWxlY3QnLCd2b2x1bWVEZXBlbmRlbnRTZWxlY3QnLCd3cml0dGVuQWdyZWVtZW50U2VsZWN0JywnZm12QXBwcmFpc2FsU2VsZWN0Jywnb3ZlcnBheW1lbnREYXRlSW5wdXQnLCdob3VybHlSYXRlSW5wdXQnLCd0b2xsZWRTZWxlY3QnXTsKICBmaWVsZHNUb1Jlc2V0LmZvckVhY2goaWQgPT4gewogICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7CiAgICBpZiAoIWVsKSByZXR1cm47CiAgICBpZiAoZWwudGFnTmFtZSA9PT0gJ0lOUFVUJykgewogICAgICBlbC52YWx1ZSA9IGVsLnR5cGUgPT09ICdudW1iZXInID8gJzAnIDogJyc7CiAgICB9IGVsc2UgaWYgKGVsLnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7CiAgICAgIGVsLnZhbHVlID0gJyc7CiAgICB9CiAgfSk7CgogIHJlbmRlclBsYXlib29rcyh0YXJnZXROaWNoZSk7CgogIGlmICh0YXJnZXROaWNoZSA9PT0gJ25leHVzJykgewogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYl9uZXh1cycpLmNsYXNzTmFtZSA9ICd0YWItYnRuIGFjdGl2ZSc7CiAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoe30sICcnLCAnLycpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBhcmVCdG4nKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHluYW1pY01haW5IZWFkZXInKS5pbm5lclRleHQgPSAnQVNTRVQgTEFCUyBIVUInOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R5bmFtaWNTdWJIZWFkZXInKS5pbm5lclRleHQgPSAnTW9kdWxlIDAxIC8vIENvbW1lcmNlICYgTmV4dXMgTWFwcGluZyBNYXRyaXgnOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0TGFiZWxBJykuaW5uZXJUZXh0ID0gJ0p1cmlzZGljdGlvbiAvIFN0YXRlJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dExhYmVsQicpLmlubmVyVGV4dCA9ICdQZXJpb2QgUmV2ZW51ZSAoJCknOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0TGFiZWxDJykuaW5uZXJUZXh0ID0gJ1R4IENvdW50JzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncmlkTGFiZWxBJykuaW5uZXJUZXh0ID0gJ1RhcmdldCBKdXJpc2RpY3Rpb24nOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dyaWRMYWJlbEInKS5pbm5lclRleHQgPSAnQ2FwYWNpdHkgVXRpbGl6YXRpb24nOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dyaWRMYWJlbEMnKS5pbm5lclRleHQgPSAnU3RhdHV0b3J5IExpbWl0IFRocmVzaG9sZCc7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ3JpZExhYmVsRCcpLmlubmVyVGV4dCA9ICdOZXh1cyBFdmFsdWF0aW9uIFdpbmRvdyc7CiAgICB1cGRhdGVBY3RpdmVIZWFkZXJCYWRnZSgnbmV4dXMnKTsgdXBkYXRlTGl2ZVN0YXR1c0NhcmQoKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyaXNrSW5zaWdodFBhbmVsJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIAogICAgYmFkZ2VXcmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgYmFkZ2VUaXRsZS5pbm5lclRleHQgPSAnTmljaGUgUHJvZHVjdCBFeGVtcHRpb24gU3RhdHVzIChUYWIgMyBFeHRlbmRlZCBNYXRyaXgpJzsKICAgIGJhZGdlR3JpZC5pbm5lckhUTUwgPSAnPGRpdiBpZD0iYmFkZ2UwMSIgY2xhc3M9ImJhZGdlIj5TYWFTPC9kaXY+PGRpdiBpZD0iYmFkZ2UwMiIgY2xhc3M9ImJhZGdlIj5BcHBhcmVsPC9kaXY+PGRpdiBpZD0iYmFkZ2UwMyIgY2xhc3M9ImJhZGdlIj5TdXBwczwvZGl2PjxkaXYgaWQ9ImJhZGdlMDQiIGNsYXNzPSJiYWRnZSI+UHJlcC4gRm9vZDwvZGl2PjxkaXYgaWQ9ImJhZGdlMDUiIGNsYXNzPSJiYWRnZSI+QWxjb2hvbDwvZGl2PjxkaXYgaWQ9ImJhZGdlMDYiIGNsYXNzPSJiYWRnZSI+TWFya2V0cGxhY2U8L2Rpdj48ZGl2IGlkPSJiYWRnZTA3IiBjbGFzcz0iYmFkZ2UiPkIyQiBSZXNhbGU8L2Rpdj4nOwoKICAgIHNlbGVjdEJhci5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0iIj4tLSBDaG9vc2UgU3RhdGUgLS08L29wdGlvbj4nOwogICAgT2JqZWN0LmtleXMobWF0cml4X2RhdGFiYXNlcykuc29ydCgpLmZvckVhY2goc3QgPT4gewogICAgICBsZXQgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7IG9wdC52YWx1ZSA9IHN0OyBvcHQuaW5uZXJUZXh0ID0gc3Q7IHNlbGVjdEJhci5hcHBlbmRDaGlsZChvcHQpOwogICAgfSk7CiAgfSAKICBlbHNlIGlmICh0YXJnZXROaWNoZSA9PT0gJ2xvZ2lzdGljcycpIHsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJfbG9naXN0aWNzJykuY2xhc3NOYW1lID0gJ3RhYi1idG4gYWN0aXZlJzsKICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSh7fSwgJycsICcvbW9kdWxlcy9zdXBwbHktY2hhaW4tYW5hbHl0aWNzJyk7CgogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R5bmFtaWNNYWluSGVhZGVyJykuaW5uZXJUZXh0ID0gJ0lOVk9JQ0UtVE8tQk9MIEVESSBBVURJVCBDT05TT0xFJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkeW5hbWljU3ViSGVhZGVyJykuaW5uZXJUZXh0ID0gJ01vZHVsZSAwMiAvLyBJbnZvaWNlLXRvLUJvTCBBdXRvbWF0ZWQgRURJIEF1ZGl0IE1hdHJpeCc7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXRMYWJlbEEnKS5pbm5lclRleHQgPSAnSW52b2ljZS10by1Cb0wgRXhjZXB0aW9uIENhdGVnb3J5JzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dExhYmVsQicpLmlubmVyVGV4dCA9ICdEZWNsYXJlZCBQYXJhbWV0ZXIgKCQgb3Iga2cpJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dExhYmVsQycpLmlubmVyVGV4dCA9ICdTY2FubmVkIC8gQWN0dWFsIFBhcmFtZXRlcic7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ3JpZExhYmVsQScpLmlubmVyVGV4dCA9ICdSZWd1bGF0b3J5IEp1cmlzZGljdGlvbic7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ3JpZExhYmVsQicpLmlubmVyVGV4dCA9ICdTaGlwbWVudCBNb2RlJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncmlkTGFiZWxDJykuaW5uZXJUZXh0ID0gJ0VESSBTZWdtZW50IEZhaWx1cmUnOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dyaWRMYWJlbEQnKS5pbm5lclRleHQgPSAnQ3JpdGljYWwgU0xBIEV4ZWN1dGlvbiBXaW5kb3cnOwogICAgdXBkYXRlQWN0aXZlSGVhZGVyQmFkZ2UoJ2xvZ2lzdGljcycpOyB1cGRhdGVMaXZlU3RhdHVzQ2FyZCgpOwogICAgCiAgICBiYWRnZVdyYXBwZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICBiYWRnZVRpdGxlLmlubmVyVGV4dCA9ICdTdXBwbHkgQ2hhaW4gUmlzayBGYWN0b3IgVmFsaWRhdGlvbiBCYWRnZXMnOwogICAgYmFkZ2VHcmlkLmlubmVySFRNTCA9ICc8ZGl2IGlkPSJiYWRnZTAxIiBjbGFzcz0iYmFkZ2UiPlNPTEFTPC9kaXY+PGRpdiBpZD0iYmFkZ2UwMiIgY2xhc3M9ImJhZGdlIj5VUyBDQlA8L2Rpdj48ZGl2IGlkPSJiYWRnZTAzIiBjbGFzcz0iYmFkZ2UiPkdBQ0M8L2Rpdj48ZGl2IGlkPSJiYWRnZTA0IiBjbGFzcz0iYmFkZ2UiPkVVIElDUzI8L2Rpdj48ZGl2IGlkPSJiYWRnZTA1IiBjbGFzcz0iYmFkZ2UiPkZNQyBPVEk8L2Rpdj48ZGl2IGlkPSJiYWRnZTA2IiBjbGFzcz0iYmFkZ2UiPkVESSBTRUc8L2Rpdj48ZGl2IGlkPSJiYWRnZTA3IiBjbGFzcz0iYmFkZ2UiPlNMQSBXSU48L2Rpdj4nOwoKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyaXNrSW5zaWdodFBhbmVsJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIHNlbGVjdEJhci5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0iIj4tLSBTZWxlY3QgSW52b2ljZS10by1Cb0wgRXhjZXB0aW9uIENhdGVnb3J5IC0tPC9vcHRpb24+JzsKICAgIG1hcml0aW1lX2RiLmZvckVhY2goKGl0ZW0sIGlkeCkgPT4gewogICAgICBsZXQgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7IAogICAgICBvcHQudmFsdWUgPSBpZHg7IAogICAgICBvcHQuaW5uZXJUZXh0ID0gYFske2l0ZW0uc2V2fV0gJHtpdGVtLmNhdH1gOyAKICAgICAgc2VsZWN0QmFyLmFwcGVuZENoaWxkKG9wdCk7CiAgICB9KTsKICB9IAogIGVsc2UgaWYgKHRhcmdldE5pY2hlID09PSAnaGVhbHRoY2FyZScpIHsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dpc3RpY3NJbnB1dEhlbHBlcicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiX2hlYWx0aGNhcmUnKS5jbGFzc05hbWUgPSAndGFiLWJ0biBhY3RpdmUnOwogICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHt9LCAnJywgJy9tb2R1bGVzL3N0YXJrLWxhdy1jb21wbGlhbmNlJyk7CgogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R5bmFtaWNNYWluSGVhZGVyJykuaW5uZXJUZXh0ID0gJ0hFQUxUSENBUkUgUkVHSVNUUlkgTk9ERSc7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHluYW1pY1N1YkhlYWRlcicpLmlubmVyVGV4dCA9ICdNb2R1bGUgMDMgLy8gU3RhcmsgTGF3IEFnZ3JlZ2F0ZSBGTVYgQ29tcGVuc2F0aW9uIE1hdHJpeCc7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXRMYWJlbEEnKS5pbm5lclRleHQgPSAnUGh5c2ljaWFuIFNwZWNpYWx0eSBHcm91cCc7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXRMYWJlbEInKS5pbm5lclRleHQgPSAnQWdncmVnYXRlIEFubnVhbCBDb21wZW5zYXRpb24gKCQpJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dExhYmVsQycpLmlubmVyVGV4dCA9ICdBbm51YWwgREhTIFJlZmVycmFsIEVuY291bnRlcnMgKENvdW50KSc7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ3JpZExhYmVsQScpLmlubmVyVGV4dCA9ICdTcGVjaWFsdHkgQXVkaXQgR3JvdXAnOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dyaWRMYWJlbEInKS5pbm5lclRleHQgPSAnRk1WIENhcCBTYXR1cmF0aW9uJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncmlkTGFiZWxDJykuaW5uZXJUZXh0ID0gJ1N0YXR1dG9yeSBCZW5jaG1hcmsgQ2FwJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncmlkTGFiZWxEJykuaW5uZXJUZXh0ID0gJ1JlZ3VsYXRvcnkgQ3ljbGUgLyBDRlIgUmVmJzsKICAgIHVwZGF0ZUFjdGl2ZUhlYWRlckJhZGdlKCdoZWFsdGhjYXJlJyk7IHVwZGF0ZUxpdmVTdGF0dXNDYXJkKCk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmlza0luc2lnaHRQYW5lbCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CgogICAgYmFkZ2VXcmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgYmFkZ2VUaXRsZS5pbm5lclRleHQgPSAnTWVkLUxlZ2FsIFJpc2sgRmFjdG9yIFZhbGlkYXRpb24gRmxhZ3MnOwogICAgYmFkZ2VHcmlkLmlubmVySFRNTCA9ICc8ZGl2IGlkPSJiYWRnZTAxIiBjbGFzcz0iYmFkZ2UiPlN0YXJrIEZNVjwvZGl2PjxkaXYgaWQ9ImJhZGdlMDIiIGNsYXNzPSJiYWRnZSI+QUtTIFNhZmVIYXJib3I8L2Rpdj48ZGl2IGlkPSJiYWRnZTAzIiBjbGFzcz0iYmFkZ2UiPkdQTyBTdHJ1Y3R1cmU8L2Rpdj48ZGl2IGlkPSJiYWRnZTA0IiBjbGFzcz0iYmFkZ2UiPkJvbmFGaWRlIEVtcDwvZGl2PjxkaXYgaWQ9ImJhZGdlMDUiIGNsYXNzPSJiYWRnZSI+SW5kaXJlY3QgUmVmPC9kaXY+PGRpdiBpZD0iYmFkZ2UwNiIgY2xhc3M9ImJhZGdlIj5DTVMgRGlzY2xvc3VyZTwvZGl2PjxkaXYgaWQ9ImJhZGdlMDciIGNsYXNzPSJiYWRnZSI+RkNBIExpYWJpbGl0eTwvZGl2Pic7CgogICAgc2VsZWN0QmFyLmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSIiPi0tIFNlbGVjdCBTcGVjaWFsdHkgUHJhY3RpY2UgR3JvdXAgLS08L29wdGlvbj4nOwogICAgT2JqZWN0LmtleXMoaGVhbHRoY2FyZV9kYikuZm9yRWFjaChrZXkgPT4gewogICAgICBsZXQgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7CiAgICAgIG9wdC52YWx1ZSA9IGtleTsKICAgICAgb3B0LmlubmVyVGV4dCA9IGhlYWx0aGNhcmVfZGJba2V5XS5zcGVjaWFsdHk7CiAgICAgIHNlbGVjdEJhci5hcHBlbmRDaGlsZChvcHQpOwogICAgfSk7CgogICAgLy8gUG9wdWxhdGUgYXJyYW5nZW1lbnQgdHlwZSBkcm9wZG93biBmcm9tIHN0YXJrX3J1bGVzX2RiCiAgICBjb25zdCBhcnJTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXJyYW5nZW1lbnRUeXBlU2VsZWN0Jyk7CiAgICBhcnJTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9IiI+LS0gU2VsZWN0IEFycmFuZ2VtZW50IFR5cGUgLS08L29wdGlvbj4nOwogICAgT2JqZWN0LmtleXMoc3RhcmtfcnVsZXNfZGIpLmZvckVhY2goa2V5ID0+IHsKICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7CiAgICAgIG9wdC52YWx1ZSA9IGtleTsKICAgICAgb3B0LmlubmVyVGV4dCA9IGtleSArICcgKCcgKyBzdGFya19ydWxlc19kYltrZXldLnN0YXR1dGVDaXRlICsgJyknOwogICAgICBhcnJTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTsKICAgIH0pOwoKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGhjYXJlRXh0cmFJbnB1dHMnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgIC8vIENvbnN0cmFpbiBvdmVycGF5bWVudCBkYXRlIHRvIHRvZGF5IG9yIGVhcmxpZXIg4oCUIGZ1dHVyZSBkYXRlcyBhcmUgaW52YWxpZAogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ292ZXJwYXltZW50RGF0ZUlucHV0JykubWF4ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF07CiAgfQoKICByZXN0b3JlSW5wdXRNZW1vcnkoKTsKICBoYW5kbGVTZWxlY3RDaGFuZ2UoKTsKfQoKZnVuY3Rpb24gdW5pdmVyc2FsUXVpY2tTZWFyY2goKSB7CiAgY29uc3QgcSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWFyY2hJbnB1dEZpbHRlcicpLnZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogIGNvbnN0IHJlc3VsdHNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdWlja1NlYXJjaFJlc3VsdHMnKTsKICBpZiAoIXJlc3VsdHNFbCkgcmV0dXJuOwogIGlmICghcSkgeyByZXN1bHRzRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJzsgcmVzdWx0c0VsLmlubmVySFRNTCA9ICcnOyByZXR1cm47IH0KICBjb25zdCBpdGVtcyA9IFtdOwogIC8vIHNlYXJjaCBzdGF0ZXMgLyBzZWxlY3Qgb3B0aW9ucwogIGNvbnN0IHNlbGVjdEJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0ZVNlbGVjdCcpOwogIGlmIChzZWxlY3RCYXIpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0QmFyLm9wdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3Qgb3B0ID0gc2VsZWN0QmFyLm9wdGlvbnNbaV07CiAgICAgIGlmICghb3B0LnZhbHVlKSBjb250aW51ZTsKICAgICAgaWYgKG9wdC50ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgfHwgb3B0LnZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpIGl0ZW1zLnB1c2goeyB0eXBlOiAnc3RhdGUnLCBpZDogb3B0LnZhbHVlLCBsYWJlbDogb3B0LnRleHQgfSk7CiAgICB9CiAgfQogIC8vIHNlYXJjaCBwbGF5Ym9va3MKICB0cnkgewogICAgT2JqZWN0LmtleXMocGxheWJvb2tzX2RiIHx8IHt9KS5mb3JFYWNoKGsgPT4gewogICAgICBjb25zdCBsaXN0ID0gKHBsYXlib29rc19kYltrXSB8fCBbXSk7CiAgICAgIGxpc3QuZm9yRWFjaChwID0+IHsgaWYgKChwLnRpdGxlfHwnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fCAocC5oZWFkaW5nfHwnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgaXRlbXMucHVzaCh7IHR5cGU6ICdwbGF5Ym9vaycsIGlkOiBwLmlkLCBsYWJlbDogcC50aXRsZSwgbmljaGU6IGsgfSk7IH0pOwogICAgfSk7CiAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfQogIC8vIHNlYXJjaCBwYXJ0bmVycwogIE9iamVjdC52YWx1ZXMocGFydG5lcnNfcmVnaXN0cnkgfHwge30pLmZvckVhY2gocCA9PiB7CiAgICBpZiAoKHAuZGlzcGxheU5hbWV8fCcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpIHx8IChwLmlkfHwnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgaXRlbXMucHVzaCh7IHR5cGU6ICdwYXJ0bmVyJywgaWQ6IHAuaWQsIGxhYmVsOiBwLmRpc3BsYXlOYW1lLCBzY29wZTogcC5zY29wZSB9KTsKICB9KTsKICAvLyByZW5kZXIKICBpZiAoIWl0ZW1zLmxlbmd0aCkgeyByZXN1bHRzRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7IHJlc3VsdHNFbC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT0iY29sb3I6dmFyKC0tbXV0ZWQpOyBmb250LXNpemU6MTJweDsiPk5vIHF1aWNrIHJlc3VsdHMuPC9kaXY+JzsgcmV0dXJuOyB9CiAgcmVzdWx0c0VsLmlubmVySFRNTCA9IGl0ZW1zLnNsaWNlKDAsNTApLm1hcChpdCA9PiB7CiAgICBpZiAoaXQudHlwZSA9PT0gJ3N0YXRlJykgcmV0dXJuIGA8ZGl2IGNsYXNzPSJxdWljay1yZXN1bHQiIHN0eWxlPSJwYWRkaW5nOjZweDsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjAzKTsgY3Vyc29yOnBvaW50ZXI7IiBvbmNsaWNrPSIoZnVuY3Rpb24odil7IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0ZVNlbGVjdCcpLnZhbHVlPXY7IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWFyY2hJbnB1dEZpbHRlcicpLnZhbHVlPScnOyB1bml2ZXJzYWxRdWlja1NlYXJjaCgpOyBoYW5kbGVTZWxlY3RDaGFuZ2UoKTsgfSkoXCcke2l0LmlkLnJlcGxhY2UoLycvZywiXFwnIil9XCcpIj5bU3RhdGVdICR7aXQubGFiZWx9PC9kaXY+YDsKICAgIGlmIChpdC50eXBlID09PSAncGxheWJvb2snKSByZXR1cm4gYDxkaXYgY2xhc3M9InF1aWNrLXJlc3VsdCIgc3R5bGU9InBhZGRpbmc6NnB4OyBib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMDMpOyBjdXJzb3I6cG9pbnRlcjsiIG9uY2xpY2s9IihmdW5jdGlvbihpZCxuKXsgdG9nZ2xlQWNjb3JkaW9uQ29udGFpbmVyKGlkKTsgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaElucHV0RmlsdGVyJykudmFsdWU9Jyc7IHVuaXZlcnNhbFF1aWNrU2VhcmNoKCk7IH0pKFwnJHtpdC5pZC5yZXBsYWNlKC8nL2csIlxcJyIpfVwnLFwnJHtpdC5uaWNoZX1cJykiPltQbGF5Ym9va10gJHtpdC5sYWJlbH08L2Rpdj5gOwogICAgaWYgKGl0LnR5cGUgPT09ICdwYXJ0bmVyJykgcmV0dXJuIGA8ZGl2IGNsYXNzPSJxdWljay1yZXN1bHQiIHN0eWxlPSJwYWRkaW5nOjZweDsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjAzKTsgY3Vyc29yOnBvaW50ZXI7IiBvbmNsaWNrPSIoZnVuY3Rpb24ocGlkKXsgbGF1bmNoUGF0aDAxV29ya2Zsb3cocGlkKTsgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaElucHV0RmlsdGVyJykudmFsdWU9Jyc7IHVuaXZlcnNhbFF1aWNrU2VhcmNoKCk7IH0pKFwnJHtpdC5pZC5yZXBsYWNlKC8nL2csIlxcJyIpfVwnKSI+W1BhcnRuZXJdICR7aXQubGFiZWx9IDxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpOyBmb250LXNpemU6MTFweDtcIj4oJHtpdC5zY29wZX0pPC9zcGFuPjwvZGl2PmA7CiAgICByZXR1cm4gJyc7CiAgfSkuam9pbignJyk7CiAgcmVzdWx0c0VsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwp9CgoKZnVuY3Rpb24gcmVuZGVyUGxheWJvb2tzKG5pY2hlKSB7CiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R5bmFtaWNQbGF5Ym9va3NDb250YWluZXInKTsKICBpZighY29udGFpbmVyKSByZXR1cm47CiAgCiAgY29uc3QgaXRlbXMgPSBwbGF5Ym9va3NfZGJbbmljaGVdIHx8IFtdOwogIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJzsKCiAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHsKICAgIGNvbnRhaW5lci5pbm5lckhUTUwgKz0gYAogICAgICA8ZGl2IGNsYXNzPSJhY2NvcmRpb24taXRlbSI+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhY2NvcmRpb24tdHJpZ2dlciIgb25jbGljaz0idG9nZ2xlQWNjb3JkaW9uQ29udGFpbmVyKCcke2l0ZW0uaWR9JykiPgogICAgICAgICAgICAgIDxzcGFuPiR7aXRlbS50aXRsZX08L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gaWQ9ImFycm93XyR7aXRlbS5pZH0iPuKWtjwvc3Bhbj4KICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPGRpdiBpZD0iJHtpdGVtLmlkfSIgY2xhc3M9ImFjY29yZGlvbi1jb250ZW50Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhY2NvcmRpb24tYm9keSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJlcG9ydC10aXRsZSI+JHtpdGVtLnN1YnRpdGxlfTwvZGl2PgogICAgICAgICAgICAgICAgICA8aDMgc3R5bGU9ImZvbnQtc2l6ZToxLjFyZW07IGNvbG9yOiNmZmY7IG1hcmdpbi10b3A6MDsiPiR7aXRlbS5oZWFkaW5nfTwvaDM+CiAgICAgICAgICAgICAgICAgIDxwIHN0eWxlPSJmb250LXNpemU6MC44cmVtOyBjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTsgZm9udC1mYW1pbHk6bW9ub3NwYWNlOyBtYXJnaW4tYm90dG9tOiAyMHB4OyI+JHtpdGVtLm1ldGF9PC9wPgogICAgICAgICAgICAgICAgICA8cCBzdHlsZT0iZm9udC1zaXplOjAuODhyZW07IGxpbmUtaGVpZ2h0OjEuNjsgY29sb3I6dmFyKC0tdGV4dC1tYWluKTsiPiR7aXRlbS5ib2R5fTwvcD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgfSk7Cn0KCmZ1bmN0aW9uIGhhbmRsZVNlbGVjdENoYW5nZSgpIHsKICBzYXZlSW5wdXRNZW1vcnkoKTsKICBjb25zdCBjdXJyZW50VGFiID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRhYi1idG4uYWN0aXZlJykuaWQucmVwbGFjZSgndGFiXycsICcnKTsKICBjb25zdCBzZWxlY3RWYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdGVTZWxlY3QnKS52YWx1ZTsKICBjb25zdCBoZWFsdGhjYXJlSW5wdXRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aGNhcmVFeHRyYUlucHV0cycpOwogIGNvbnN0IGxvZ2lzdGljc0hlbHBlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dpc3RpY3NJbnB1dEhlbHBlcicpOwoKICBpZiAoY3VycmVudFRhYiA9PT0gJ2xvZ2lzdGljcycpIHsKICAgIGlmIChoZWFsdGhjYXJlSW5wdXRzKSBoZWFsdGhjYXJlSW5wdXRzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICBjb25zdCBpdGVtID0gbWFyaXRpbWVfZGJbcGFyc2VJbnQoc2VsZWN0VmFsKV07CiAgICBpZiAoaXRlbSkgewogICAgICB1cGRhdGVMb2dpc3RpY3NJbnB1dENvbnRleHQoaXRlbSk7CiAgICB9IGVsc2UgaWYgKGxvZ2lzdGljc0hlbHBlcikgewogICAgICBsb2dpc3RpY3NIZWxwZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIH0KICB9IGVsc2UgaWYgKGN1cnJlbnRUYWIgPT09ICdoZWFsdGhjYXJlJykgewogICAgaWYgKGhlYWx0aGNhcmVJbnB1dHMpIGhlYWx0aGNhcmVJbnB1dHMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICBpZiAobG9naXN0aWNzSGVscGVyKSBsb2dpc3RpY3NIZWxwZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dExhYmVsQicpLmlubmVyVGV4dCA9ICdBZ2dyZWdhdGUgQW5udWFsIENvbXBlbnNhdGlvbiAoJCknOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0TGFiZWxDJykuaW5uZXJUZXh0ID0gJ0FubnVhbCBESFMgUmVmZXJyYWwgRW5jb3VudGVycyAoQ291bnQpJzsKICB9IGVsc2UgewogICAgaWYgKGxvZ2lzdGljc0hlbHBlcikgbG9naXN0aWNzSGVscGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICBpZiAoaGVhbHRoY2FyZUlucHV0cykgaGVhbHRoY2FyZUlucHV0cy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIH0KCiAgdXBkYXRlTGl2ZVN0YXR1c0NhcmQoKTsKfQoKZnVuY3Rpb24gdXBkYXRlTG9naXN0aWNzSW5wdXRDb250ZXh0KGl0ZW0pIHsKICBjb25zdCBjb25maWcgPSBnZXRMb2dpc3RpY3NJbnB1dENvbmZpZyhpdGVtKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXRMYWJlbEInKS5pbm5lclRleHQgPSBjb25maWcubGFiZWxCOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dExhYmVsQycpLmlubmVyVGV4dCA9IGNvbmZpZy5sYWJlbEM7CiAgY29uc3QgcmV2SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2SW5wdXQnKTsKICBjb25zdCB0cmFuc0lucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RyYW5zSW5wdXQnKTsKICByZXZJbnB1dC5wbGFjZWhvbGRlciA9IGNvbmZpZy5wbGFjZWhvbGRlckI7CiAgdHJhbnNJbnB1dC5wbGFjZWhvbGRlciA9IGNvbmZpZy5wbGFjZWhvbGRlckM7CiAgcmV2SW5wdXQubWluID0gY29uZmlnLm1pbkIgfHwgMDsKICB0cmFuc0lucHV0Lm1pbiA9IGNvbmZpZy5taW5DIHx8IDA7CiAgcmV2SW5wdXQuc3RlcCA9IGNvbmZpZy5zdGVwQiB8fCAnYW55JzsKICB0cmFuc0lucHV0LnN0ZXAgPSBjb25maWcuc3RlcEMgfHwgJ2FueSc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ2lzdGljc0lucHV0SGVscGVyVGV4dCcpLmlubmVyVGV4dCA9IGNvbmZpZy5oZWxwZXI7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ2lzdGljc0lucHV0SGVscGVyTWV0YScpLmlubmVyVGV4dCA9IGNvbmZpZy5tZXRhIHx8ICdFbnRlciB0aGUgdHdvIG1ldHJpYyBmaWVsZHMgY2FyZWZ1bGx5IGZvciB0aGlzIGV4Y2VwdGlvbiBjYXRlZ29yeS4nOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dpc3RpY3NJbnB1dEhlbHBlcicpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwp9CgpmdW5jdGlvbiBnZXRMb2dpc3RpY3NJbnB1dENvbmZpZyhpdGVtKSB7CiAgY29uc3QgY2F0ID0gaXRlbS5jYXQ7CiAgY29uc3QgY29tbW9uID0gewogICAgbGFiZWxCOiAnRGVjbGFyZWQgUGFyYW1ldGVyIFZhbHVlJywKICAgIGxhYmVsQzogJ0F1ZGl0ZWQgU2NhbiBWYWx1ZSAvIENvdW50JywKICAgIHBsYWNlaG9sZGVyQjogJ0VudGVyIHByaW1hcnkgYXVkaXQgbWV0cmljJywKICAgIHBsYWNlaG9sZGVyQzogJ0VudGVyIHNlY29uZGFyeSBhdWRpdCBtZXRyaWMnLAogICAgaGVscGVyOiAnVXNlIHRoZSBjYXRlZ29yeS1zcGVjaWZpYyBtZXRyaWNzIGFib3ZlIHRvIGNhcHR1cmUgdGhlIG9wZXJhdGlvbmFsIGV4Y2VwdGlvbiBhY2N1cmF0ZWx5LicsCiAgICBtZXRhOiAnVGhpcyBndWlkYW5jZSB1cGRhdGVzIGFmdGVyIHNlbGVjdGluZyBhbiBpbnZvaWNlLXRvLUJvTCBleGNlcHRpb24gY2F0ZWdvcnkuJywKICAgIG1pbkI6IDAsCiAgICBtaW5DOiAwLAogICAgc3RlcEI6ICdhbnknLAogICAgc3RlcEM6ICcxJwogIH07CiAgaWYgKGNhdC5pbmNsdWRlcygnV2VpZ2h0L01lYXN1cmVtZW50JykgJiYgIWNhdC5pbmNsdWRlcygnTENMJykpIHsKICAgIHJldHVybiB7CiAgICAgIC4uLmNvbW1vbiwKICAgICAgbGFiZWxCOiAnRGVjbGFyZWQgV2VpZ2h0IChrZyknLAogICAgICBsYWJlbEM6ICdTY2FubmVkIC8gQnJpZGdlIFdlaWdodCAoa2cpJywKICAgICAgcGxhY2Vob2xkZXJCOiAnZS5nLiAxNTIwMCcsCiAgICAgIHBsYWNlaG9sZGVyQzogJ2UuZy4gMTQ5MDAnLAogICAgICBoZWxwZXI6ICdFbnRlciB0aGUgQm9MIGRlY2xhcmVkIGdyb3NzIHdlaWdodCBhbmQgdGhlIHRlcm1pbmFsIHdlaWdoYnJpZGdlIHdlaWdodC4gVmFyaWFuY2UgYWJvdmUgNSUgZXNjYWxhdGVzIHRvIGEgU09MQVMgVkdNIGhhcmQtc3RvcC4nLAogICAgICBtZXRhOiAnV2VpZ2h0IHZhcmlhbmNlIGlzIHRoZSBwcmltYXJ5IGNvbXBsaWFuY2UgdHJpZ2dlciBmb3IgVkdNIGV4Y2VwdGlvbnMuJywKICAgICAgc3RlcEI6ICcwLjEnLAogICAgICBzdGVwQzogJzAuMScKICAgIH07CiAgfQogIGlmIChjYXQuaW5jbHVkZXMoJ0xDTCBDRlMgUmVjb25jaWxpYXRpb24nKSkgewogICAgcmV0dXJuIHsKICAgICAgLi4uY29tbW9uLAogICAgICBsYWJlbEI6ICdEZWNsYXJlZCBDRlMgV2VpZ2h0IChrZyknLAogICAgICBsYWJlbEM6ICdDb25zb2xpZGF0ZWQgVkdNIChrZyknLAogICAgICBwbGFjZWhvbGRlckI6ICdlLmcuIDM2MDAnLAogICAgICBwbGFjZWhvbGRlckM6ICdlLmcuIDM1ODAnLAogICAgICBoZWxwZXI6ICdFbnRlciB0aGUgYWdncmVnYXRlIGRlY2xhcmVkIENGUyB3ZWlnaHQgYW5kIHRoZSBjb25zb2xpZGF0ZWQgY29udGFpbmVyIFZHTS4gUmVjb25jaWxpYXRpb24gbWlzbWF0Y2hlcyBtYXkgdHJpZ2dlciBzb2Z0LWhvbGQgcmV2aWV3LicsCiAgICAgIG1ldGE6ICdMQ0wgcmVjb25jaWxpYXRpb24gY29tcGFyZXMgc3VibWl0dGVkIGNvbnNvbGlkYXRpb24gd2VpZ2h0IGFnYWluc3QgY29udGFpbmVyIFZHTS4nLAogICAgICBzdGVwQjogJzAuMScsCiAgICAgIHN0ZXBDOiAnMC4xJwogICAgfTsKICB9CiAgaWYgKGNhdC5pbmNsdWRlcygnR2F0ZS1JbiBNaXNtYXRjaCcpKSB7CiAgICByZXR1cm4gewogICAgICAuLi5jb21tb24sCiAgICAgIGxhYmVsQjogJ0V4cGVjdGVkIFNlYWwgQ291bnQnLAogICAgICBsYWJlbEM6ICdTZWFsIE1pc21hdGNoIENvdW50JywKICAgICAgcGxhY2Vob2xkZXJCOiAnZS5nLiAxJywKICAgICAgcGxhY2Vob2xkZXJDOiAnZS5nLiAwJywKICAgICAgaGVscGVyOiAnUmVwb3J0IGhvdyBtYW55IHNlYWxzIHdlcmUgZXhwZWN0ZWQgYXQgZ2F0ZS1pbiB2ZXJzdXMgaG93IG1hbnkgYWN0dWFsIG1pc21hdGNoZXMgd2VyZSByZWNvcmRlZC4nLAogICAgICBtZXRhOiAnQW55IHNlYWwgbWlzbWF0Y2ggb24gZ2F0ZS1pbiBtYXkgdHJpZ2dlciBhIGhhcmQtc3RvcCBhbmQgdGVybWluYWwgcmV3b3JrLicsCiAgICAgIHN0ZXBCOiAnMScsCiAgICAgIHN0ZXBDOiAnMScKICAgIH07CiAgfQogIGlmIChjYXQuaW5jbHVkZXMoJ0lTTyA2MzQ2IFZhbGlkYXRpb24nKSkgewogICAgcmV0dXJuIHsKICAgICAgLi4uY29tbW9uLAogICAgICBsYWJlbEI6ICdJU08tVmFsaWQgQ29udGFpbmVyIENvdW50JywKICAgICAgbGFiZWxDOiAnSW52YWxpZCBDb250YWluZXIgQ291bnQnLAogICAgICBwbGFjZWhvbGRlckI6ICdlLmcuIDEwJywKICAgICAgcGxhY2Vob2xkZXJDOiAnZS5nLiAwJywKICAgICAgaGVscGVyOiAnRW50ZXIgdGhlIG51bWJlciBvZiBjb250YWluZXIgSURzIHBhc3NpbmcgSVNPIDYzNDYgdmFsaWRhdGlvbiBhbmQgdGhlIG51bWJlciBmYWlsaW5nIHRoZSBjaGVjay1kaWdpdCB0ZXN0LicsCiAgICAgIG1ldGE6ICdJbnZhbGlkIGNvbnRhaW5lciBJRHMgcHJldmVudCBib29raW5nIGFjY2VwdGFuY2UgYW5kIGNhbiBjYXVzZSByZWJvb2tpbmcgZGVsYXlzLicsCiAgICAgIHN0ZXBCOiAnMScsCiAgICAgIHN0ZXBDOiAnMScKICAgIH07CiAgfQogIGlmIChjYXQuaW5jbHVkZXMoJ0lTRiBOYW1lL0FkZHJlc3MnKSkgewogICAgcmV0dXJuIHsKICAgICAgLi4uY29tbW9uLAogICAgICBsYWJlbEI6ICdFbnRpdHkgTWF0Y2ggU2NvcmUgKCUpJywKICAgICAgbGFiZWxDOiAnRGlzY3JlcGFuY3kgQ291bnQnLAogICAgICBwbGFjZWhvbGRlckI6ICdlLmcuIDk1JywKICAgICAgcGxhY2Vob2xkZXJDOiAnZS5nLiAxJywKICAgICAgaGVscGVyOiAnRW50ZXIgdGhlIHBlcmNlbnRhZ2UgbWF0Y2ggc2NvcmUgZm9yIElTRiBuYW1lL2FkZHJlc3MgZGF0YSBhZ2FpbnN0IEJvTC9TSSwgYW5kIHRoZSBjb3VudCBvZiBtaXNtYXRjaGVkIHJlY29yZHMuJywKICAgICAgbWV0YTogJ05hbWUvYWRkcmVzcyBtaXNtYXRjaGVzIGFyZSBhIGhhcmQtc3RvcCByaXNrIHVuZGVyIElTRiAxMCsyLicsCiAgICAgIHN0ZXBCOiAnMC4xJwogICAgfTsKICB9CiAgaWYgKGNhdC5pbmNsdWRlcygnQ2hpbmEgQ0NBTScpKSB7CiAgICByZXR1cm4gewogICAgICAuLi5jb21tb24sCiAgICAgIGxhYmVsQjogJ05vdGlmeSBQYXJ0eSBDb2RlIENvbXBsZXRlbmVzcyAoJSknLAogICAgICBsYWJlbEM6ICdNaXNzaW5nIEVsZW1lbnQgQ291bnQnLAogICAgICBwbGFjZWhvbGRlckI6ICdlLmcuIDEwMCcsCiAgICAgIHBsYWNlaG9sZGVyQzogJ2UuZy4gMCcsCiAgICAgIGhlbHBlcjogJ0VudGVyIHRoZSBjb21wbGV0ZW5lc3Mgc2NvcmUgZm9yIG1hbmRhdG9yeSBDQ0FNIE5vdGlmeSBQYXJ0eSBjb2RlcyBhbmQgaG93IG1hbnkgcmVxdWlyZWQgZWxlbWVudHMgYXJlIG1pc3NpbmcuJywKICAgICAgbWV0YTogJ0NDQU0gbWlzc2luZyBlbnRlcnByaXNlIGNvZGUgZWxlbWVudHMgd2lsbCByZWplY3QgdGhlIG1hbmlmZXN0IGJlZm9yZSBsb2FkLicsCiAgICAgIHN0ZXBCOiAnMC4xJwogICAgfTsKICB9CiAgaWYgKGNhdC5pbmNsdWRlcygnSFRTIE1pc21hdGNoJykpIHsKICAgIHJldHVybiB7CiAgICAgIC4uLmNvbW1vbiwKICAgICAgbGFiZWxCOiAnSFRTIFJlY29uY2lsaWF0aW9uIFNjb3JlICglKScsCiAgICAgIGxhYmVsQzogJ01pc21hdGNoZWQgTGluZSBJdGVtcycsCiAgICAgIHBsYWNlaG9sZGVyQjogJ2UuZy4gOTgnLAogICAgICBwbGFjZWhvbGRlckM6ICdlLmcuIDInLAogICAgICBoZWxwZXI6ICdFbnRlciB0aGUgcGVyY2VudCBIVFMgcmVjb25jaWxpYXRpb24gc2NvcmUgYWNyb3NzIGludm9pY2UsIEJvTCwgYW5kIElTRiwgcGx1cyB0aGUgbnVtYmVyIG9mIG1pc21hdGNoZWQgbGluZSBpdGVtcy4nLAogICAgICBtZXRhOiAnSFRTIG1pc21hdGNoIGNhbiB0cmlnZ2VyIGN1c3RvbXMgZXhhbSBhbmQgdGFyaWZmIHBlbmFsdGllcy4nLAogICAgICBzdGVwQjogJzAuMScKICAgIH07CiAgfQogIGlmIChjYXQuaW5jbHVkZXMoJ0FNUyAvIE9USScpKSB7CiAgICByZXR1cm4gewogICAgICAuLi5jb21tb24sCiAgICAgIGxhYmVsQjogJ01hbmlmZXN0IEZpbGluZyBTY29yZSAoJSknLAogICAgICBsYWJlbEM6ICdSZWplY3RlZCBGaWxpbmdzJywKICAgICAgcGxhY2Vob2xkZXJCOiAnZS5nLiAxMDAnLAogICAgICBwbGFjZWhvbGRlckM6ICdlLmcuIDAnLAogICAgICBoZWxwZXI6ICdDYXB0dXJlIHRoZSBvdmVyYWxsIEFNUy9PVEkgZmlsaW5nIGludGVncml0eSBzY29yZSBhbmQgcmVqZWN0ZWQgZmlsaW5nIGNvdW50LicsCiAgICAgIG1ldGE6ICdJbnZhbGlkIFNDQUMgb3IgYm9uZCBmaWxpbmdzIGNyZWF0ZSBjYXJyaWVyIGVudHJ5IGFuZCBkaXNjaGFyZ2UgaG9sZHMuJywKICAgICAgc3RlcEI6ICcwLjEnCiAgICB9OwogIH0KICBpZiAoY2F0LmluY2x1ZGVzKCdMYXRlIElTRicpKSB7CiAgICByZXR1cm4gewogICAgICAuLi5jb21tb24sCiAgICAgIGxhYmVsQjogJ0hvdXJzIEJlZm9yZSBDdXQtb2ZmJywKICAgICAgbGFiZWxDOiAnSG91cnMgTGF0ZScsCiAgICAgIHBsYWNlaG9sZGVyQjogJ2UuZy4gMTInLAogICAgICBwbGFjZWhvbGRlckM6ICdlLmcuIDAnLAogICAgICBoZWxwZXI6ICdFbnRlciBob3cgbWFueSBob3VycyBiZWZvcmUgbG9hZGluZyB0aGUgSVNGIHdhcyBmaWxlZCwgYW5kIGlmIGFueSBob3VycyBsYXRlIHdlcmUgcmVjb3JkZWQuJywKICAgICAgbWV0YTogJ0xhdGUgSVNGIGZpbGluZ3MgYXJlIGEgaGFyZC1zdG9wIHRyaWdnZXIgYW5kIG1heSBpbmN1ciBzaWduaWZpY2FudCBwZW5hbHRpZXMuJywKICAgICAgc3RlcEI6ICcxJywKICAgICAgc3RlcEM6ICcxJwogICAgfTsKICB9CiAgaWYgKGNhdC5pbmNsdWRlcygnRVUgSUNTMiBFTlMnKSkgewogICAgcmV0dXJuIHsKICAgICAgLi4uY29tbW9uLAogICAgICBsYWJlbEI6ICdFTlMgQ3Jvc3MtUmVmZXJlbmNlIFNjb3JlICglKScsCiAgICAgIGxhYmVsQzogJ01pc3NpbmcgSEJML0VPUkkgSXRlbXMnLAogICAgICBwbGFjZWhvbGRlckI6ICdlLmcuIDEwMCcsCiAgICAgIHBsYWNlaG9sZGVyQzogJ2UuZy4gMCcsCiAgICAgIGhlbHBlcjogJ0VudGVyIHRoZSBFTlMgY3Jvc3MtcmVmZXJlbmNlIGNvbXBsZXRlbmVzcyBzY29yZSBhbmQgdGhlIGNvdW50IG9mIG1pc3NpbmcgSEJMIG9yIEVPUkkgaXRlbXMuJywKICAgICAgbWV0YTogJ0luY29tcGxldGUgRU5TIGRhdGEgd2lsbCBkZWxheSBFVSBjdXN0b21zIHJlbGVhc2UuJywKICAgICAgc3RlcEI6ICcwLjEnCiAgICB9OwogIH0KICBpZiAoY2F0LmluY2x1ZGVzKCdTdXBlcnNlZGVkIFVOIENsYXNzaWZpY2F0aW9uJykpIHsKICAgIHJldHVybiB7CiAgICAgIC4uLmNvbW1vbiwKICAgICAgbGFiZWxCOiAnSU1ERyBFZGl0aW9uIENvbXBsaWFuY2UgKCUpJywKICAgICAgbGFiZWxDOiAnTm9uLUNvbmZvcm1pbmcgSXRlbXMnLAogICAgICBwbGFjZWhvbGRlckI6ICdlLmcuIDEwMCcsCiAgICAgIHBsYWNlaG9sZGVyQzogJ2UuZy4gMCcsCiAgICAgIGhlbHBlcjogJ0VudGVyIGhvdyBtYW55IGhhem1hdCBpdGVtcyBjb21wbHkgd2l0aCB0aGUgbGF0ZXN0IElNREcgYW1lbmRtZW50IGFuZCBjb3VudCBub24tY29uZm9ybWluZyBpdGVtcy4nLAogICAgICBtZXRhOiAnU3VwZXJzZWRlZCBVTiBjbGFzc2lmaWNhdGlvbnMgY2FuIHN0b3AgREcgYm9va2luZ3MgZW50aXJlbHkuJywKICAgICAgc3RlcEI6ICcwLjEnCiAgICB9OwogIH0KICBpZiAoY2F0LmluY2x1ZGVzKCdPdXRkYXRlZCBTRFMnKSkgewogICAgcmV0dXJuIHsKICAgICAgLi4uY29tbW9uLAogICAgICBsYWJlbEI6ICdTRFMgRWRpdGlvbiBDb21wbGlhbmNlICglKScsCiAgICAgIGxhYmVsQzogJ091dGRhdGVkIFNlY3Rpb25zIENvdW50JywKICAgICAgcGxhY2Vob2xkZXJCOiAnZS5nLiAxMDAnLAogICAgICBwbGFjZWhvbGRlckM6ICdlLmcuIDAnLAogICAgICBoZWxwZXI6ICdFbnRlciB0aGUgU0RTIGNvbXBsaWFuY2Ugc2NvcmUgZm9yIHRoZSBjdXJyZW50IElNREcgYW1lbmRtZW50IGFuZCB0aGUgbnVtYmVyIG9mIG91dGRhdGVkIHNlY3Rpb25zLicsCiAgICAgIG1ldGE6ICdPdXRkYXRlZCBERyBkb2N1bWVudGF0aW9uIG1heSB0cmlnZ2VyIGNhcnJpZXIgcmVqZWN0aW9uIGFuZCByb2xsb3ZlcnMuJywKICAgICAgc3RlcEI6ICcwLjEnCiAgICB9OwogIH0KICBpZiAoY2F0LmluY2x1ZGVzKCdHZW5lcmljIENvbW1vZGl0eSBEZXNjcmlwdGlvbicpKSB7CiAgICByZXR1cm4gewogICAgICAuLi5jb21tb24sCiAgICAgIGxhYmVsQjogJ0Rlc2NyaXB0aW9uIFNwZWNpZmljaXR5IFNjb3JlICglKScsCiAgICAgIGxhYmVsQzogJ0dlbmVyaWMgTGluZSBDb3VudCcsCiAgICAgIHBsYWNlaG9sZGVyQjogJ2UuZy4gOTAnLAogICAgICBwbGFjZWhvbGRlckM6ICdlLmcuIDMnLAogICAgICBoZWxwZXI6ICdFbnRlciB0aGUgcGVyY2VudGFnZSBvZiBIUy1zcGVjaWZpYyBjb21tb2RpdHkgZGVzY3JpcHRpb25zIGFuZCBob3cgbWFueSBnZW5lcmljIGNvbW1vZGl0eSBsaW5lcyByZW1haW4uJywKICAgICAgbWV0YTogJ0dlbmVyaWMgZGVzY3JpcHRpb25zIGFyZSBhIHNvZnQtaG9sZCByaXNrIGZvciBjdXN0b21zIGV4YW1zLicsCiAgICAgIHN0ZXBCOiAnMC4xJwogICAgfTsKICB9CiAgaWYgKGNhdC5pbmNsdWRlcygnRGVtdXJyYWdlIEludm9pY2UnKSkgewogICAgcmV0dXJuIHsKICAgICAgLi4uY29tbW9uLAogICAgICBsYWJlbEI6ICdJbnZvaWNlIENvbXBsaWFuY2UgU2NvcmUgKCUpJywKICAgICAgbGFiZWxDOiAnRGlzY3JlcGFuY3kgTGluZSBDb3VudCcsCiAgICAgIHBsYWNlaG9sZGVyQjogJ2UuZy4gMTAwJywKICAgICAgcGxhY2Vob2xkZXJDOiAnZS5nLiAwJywKICAgICAgaGVscGVyOiAnRW50ZXIgdGhlIGRlbXVycmFnZSBpbnZvaWNlIGNvbXBsaWFuY2Ugc2NvcmUgYW5kIHRoZSBjb3VudCBvZiBiaWxsaW5nIGRpc2NyZXBhbmNpZXMuJywKICAgICAgbWV0YTogJ0RlbXVycmFnZSBpbnZvaWNlcyBtdXN0IG1lZXQgRk1DIGJpbGxpbmcgcmVxdWlyZW1lbnRzIG9yIGNhcmdvIHJlbGVhc2UgbWF5IGJlIGRlbmllZC4nLAogICAgICBzdGVwQjogJzAuMScKICAgIH07CiAgfQogIGlmIChjYXQuaW5jbHVkZXMoJ01hbmlmZXN0IFJlY29uY2lsaWF0aW9uJykpIHsKICAgIHJldHVybiB7CiAgICAgIC4uLmNvbW1vbiwKICAgICAgbGFiZWxCOiAnTWFuaWZlc3QgTWF0Y2ggU2NvcmUgKCUpJywKICAgICAgbGFiZWxDOiAnTWlzbWF0Y2ggQ291bnQnLAogICAgICBwbGFjZWhvbGRlckI6ICdlLmcuIDEwMCcsCiAgICAgIHBsYWNlaG9sZGVyQzogJ2UuZy4gMCcsCiAgICAgIGhlbHBlcjogJ0VudGVyIHRoZSBtYW5pZmVzdCByZWNvbmNpbGlhdGlvbiBzY29yZSBhbmQgdGhlIG51bWJlciBvZiB2ZXNzZWwvdm95YWdlIG1pc21hdGNoZXMuJywKICAgICAgbWV0YTogJ01hbmlmZXN0IG1pc21hdGNoZXMgaW5jcmVhc2UgcmlzayBvZiBjYXJnbyBob2xkIGFuZCBHZW5lcmFsIE9yZGVyIGV4cG9zdXJlLicsCiAgICAgIHN0ZXBCOiAnMC4xJwogICAgfTsKICB9CiAgcmV0dXJuIGNvbW1vbjsKfQoKZnVuY3Rpb24gZXZhbHVhdGVMb2dpc3RpY3NFeGNlcHRpb24oaXRlbSwgZGVjbGFyZWRWYWx1ZSwgYXVkaXRWYWx1ZSkgewogIGNvbnN0IGNhdGVnb3J5ID0gaXRlbS5jYXQ7CiAgY29uc3QgcmVzdWx0ID0gewogICAgc3RhdHVzVHlwZTogJ3dhcm4nLAogICAgc3RhdHVzTWVzc2FnZTogJ+KaoO+4jyBTT0ZULUhPTEQ6IEVESSBSRVZJRVcgQUNUSVZFJywKICAgIG1ldHJpY0Rpc3BsYXk6ICdBd2FpdGluZyBpbnB1dHMnLAogICAgZGV0YWlsVGV4dDogaXRlbS5kZXNjLAogICAgYmFkZ2VTdW1tYXJ5OiAnU09GVC1IT0xEJywKICAgIGhpc3RvcnlMYWJlbDogJ1NPRlQtSE9MRCcsCiAgICBwcmlvcml0eTogJ01lZGl1bScsCiAgICByaXNrSW5kZXg6IDU1LAogICAgcmVjb21tZW5kYXRpb25zOiAnUHJvdmlkZSBib3RoIGNhdGVnb3J5IG1ldHJpY3MgdG8gY29tcHV0ZSBhIHRhcmdldGVkIHJlbWVkaWF0aW9uIHByaW9yaXR5LicKICB9OwoKICBjb25zdCBzYWZlRGVjbGFyZWQgPSBOdW1iZXIuaXNGaW5pdGUoZGVjbGFyZWRWYWx1ZSkgPyBkZWNsYXJlZFZhbHVlIDogMDsKICBjb25zdCBzYWZlQXVkaXQgPSBOdW1iZXIuaXNGaW5pdGUoYXVkaXRWYWx1ZSkgPyBhdWRpdFZhbHVlIDogMDsKICBjb25zdCBhYnNEaWZmID0gTWF0aC5hYnMoc2FmZURlY2xhcmVkIC0gc2FmZUF1ZGl0KTsKICBjb25zdCB2YXJpYW5jZSA9IHNhZmVEZWNsYXJlZCA+IDAgPyBhYnNEaWZmIC8gc2FmZURlY2xhcmVkIDogMDsKICBjb25zdCByYXRpbyA9IHNhZmVEZWNsYXJlZCA+IDAgPyBzYWZlQXVkaXQgLyBzYWZlRGVjbGFyZWQgOiAwOwogIGNvbnN0IHBjdCA9IHNhZmVEZWNsYXJlZCA+IDAgPyByYXRpbyAqIDEwMCA6IDA7CiAgY29uc3Qgbm9JbnB1dHMgPSBzYWZlRGVjbGFyZWQgPT09IDAgJiYgc2FmZUF1ZGl0ID09PSAwOwoKICBpZiAobm9JbnB1dHMpIHsKICAgIHJlc3VsdC5tZXRyaWNEaXNwbGF5ID0gJ0F3YWl0aW5nIGlucHV0cyc7CiAgICByZXN1bHQucmVjb21tZW5kYXRpb25zID0gJ0NvbXBsZXRlIHRoZSBzZWxlY3RlZCBjYXRlZ29yeSBtZXRyaWNzIHRvIGdlbmVyYXRlIGEgdmFsaWQgYXVkaXQgc3RhdHVzLic7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgZnVuY3Rpb24gc2V0UmVzdWx0KG9wdGlvbnMpIHsKICAgIGlmIChvcHRpb25zLnN0YXR1c1R5cGUpIHJlc3VsdC5zdGF0dXNUeXBlID0gb3B0aW9ucy5zdGF0dXNUeXBlOwogICAgaWYgKG9wdGlvbnMuc3RhdHVzTWVzc2FnZSkgcmVzdWx0LnN0YXR1c01lc3NhZ2UgPSBvcHRpb25zLnN0YXR1c01lc3NhZ2U7CiAgICBpZiAob3B0aW9ucy5tZXRyaWNEaXNwbGF5KSByZXN1bHQubWV0cmljRGlzcGxheSA9IG9wdGlvbnMubWV0cmljRGlzcGxheTsKICAgIGlmIChvcHRpb25zLmRldGFpbFRleHQpIHJlc3VsdC5kZXRhaWxUZXh0ID0gb3B0aW9ucy5kZXRhaWxUZXh0OwogICAgaWYgKG9wdGlvbnMuYmFkZ2VTdW1tYXJ5KSByZXN1bHQuYmFkZ2VTdW1tYXJ5ID0gb3B0aW9ucy5iYWRnZVN1bW1hcnk7CiAgICBpZiAob3B0aW9ucy5oaXN0b3J5TGFiZWwpIHJlc3VsdC5oaXN0b3J5TGFiZWwgPSBvcHRpb25zLmhpc3RvcnlMYWJlbDsKICAgIGlmIChvcHRpb25zLnByaW9yaXR5KSByZXN1bHQucHJpb3JpdHkgPSBvcHRpb25zLnByaW9yaXR5OwogICAgaWYgKG9wdGlvbnMucmlza0luZGV4ICE9PSB1bmRlZmluZWQpIHJlc3VsdC5yaXNrSW5kZXggPSBvcHRpb25zLnJpc2tJbmRleDsKICAgIGlmIChvcHRpb25zLnJlY29tbWVuZGF0aW9ucykgcmVzdWx0LnJlY29tbWVuZGF0aW9ucyA9IG9wdGlvbnMucmVjb21tZW5kYXRpb25zOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGlmIChjYXRlZ29yeS5pbmNsdWRlcygnTENMIENGUyBSZWNvbmNpbGlhdGlvbicpKSB7CiAgICByZXN1bHQubWV0cmljRGlzcGxheSA9IGAkeyh2YXJpYW5jZSAqIDEwMCkudG9GaXhlZCgxKX0lIENGUyB2YXJpYW5jZWA7CiAgICByZXN1bHQuZGV0YWlsVGV4dCA9IGBEZWNsYXJlZCBDRlM6ICR7c2FmZURlY2xhcmVkLnRvTG9jYWxlU3RyaW5nKCl9IGtnOyBjb250YWluZXIgVkdNOiAke3NhZmVBdWRpdC50b0xvY2FsZVN0cmluZygpfSBrZy5gOwogICAgaWYgKHNhZmVEZWNsYXJlZCA+IDAgJiYgc2FmZUF1ZGl0ID4gMCkgewogICAgICBpZiAodmFyaWFuY2UgPiAwLjA0KSB7CiAgICAgICAgcmV0dXJuIHNldFJlc3VsdCh7CiAgICAgICAgICBzdGF0dXNUeXBlOiAnYnJlYWNoJywKICAgICAgICAgIHN0YXR1c01lc3NhZ2U6ICfwn5qoIEhBUkQtU1RPUDogTENMIENGUyBSRUNPTkNJTElBVElPTiBGQUlMVVJFJywKICAgICAgICAgIGJhZGdlU3VtbWFyeTogJ0hBUkQtU1RPUCcsCiAgICAgICAgICBoaXN0b3J5TGFiZWw6ICdIQVJELVNUT1AnLAogICAgICAgICAgcHJpb3JpdHk6ICdJbW1lZGlhdGUnLAogICAgICAgICAgcmlza0luZGV4OiA5NCwKICAgICAgICAgIHJlY29tbWVuZGF0aW9uczogJ1BhdXNlIHRoZSBjb25zb2xpZGF0aW9uIGFuZCByZWNvbmNpbGUgYWxsIENGUyBwaWVjZSB3ZWlnaHRzIGFnYWluc3QgdGhlIGNvbnRhaW5lciBWR00gaW1tZWRpYXRlbHkuJwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGlmICh2YXJpYW5jZSA+IDAuMDIpIHsKICAgICAgICByZXR1cm4gc2V0UmVzdWx0KHsKICAgICAgICAgIHN0YXR1c1R5cGU6ICd3YXJuJywKICAgICAgICAgIHN0YXR1c01lc3NhZ2U6ICfimqDvuI8gSElHSC1SSVNLOiBMQ0wgUkVDT05DSUxJQVRJT04gVkFSSUFOQ0UnLAogICAgICAgICAgYmFkZ2VTdW1tYXJ5OiAnU09GVC1IT0xEJywKICAgICAgICAgIGhpc3RvcnlMYWJlbDogJ1NPRlQtSE9MRCcsCiAgICAgICAgICBwcmlvcml0eTogJ0hpZ2gnLAogICAgICAgICAgcmlza0luZGV4OiA3MiwKICAgICAgICAgIHJlY29tbWVuZGF0aW9uczogJ1JlY29uY2lsZSB0aGUgQ0ZTIG1hbmlmZXN0IGFuZCB2YWxpZGF0ZSBjb250YWluZXIgd2VpZ2h0IGJlZm9yZSBsb2FkIGRlcGFydHVyZS4nCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHNldFJlc3VsdCh7CiAgICAgICAgc3RhdHVzVHlwZTogJ3Bhc3MnLAogICAgICAgIHN0YXR1c01lc3NhZ2U6ICfinJMgUEFTUzogTENMIFJFQ09OQ0lMSUFUSU9OIEFDQ0VQVEFCTEUnLAogICAgICAgIGJhZGdlU3VtbWFyeTogJ0NMRUFSJywKICAgICAgICBoaXN0b3J5TGFiZWw6ICdDTEVBUicsCiAgICAgICAgcHJpb3JpdHk6ICdMb3cnLAogICAgICAgIHJpc2tJbmRleDogMTgsCiAgICAgICAgcmVjb21tZW5kYXRpb25zOiAnUmV0YWluIENGUyB2YWxpZGF0aW9uIHJlY29yZHMgYW5kIGNvbnRpbnVlIG1vbml0b3JpbmcgY29uc29saWRhdGlvbiBhY2N1cmFjeS4nCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHNldFJlc3VsdCh7CiAgICAgIHJlY29tbWVuZGF0aW9uczogJ0JvdGggZGVjbGFyZWQgQ0ZTIHdlaWdodCBhbmQgY29udGFpbmVyIFZHTSBhcmUgcmVxdWlyZWQgdG8gY2FsY3VsYXRlIHJlY29uY2lsaWF0aW9uIHJpc2suJwogICAgfSk7CiAgfQoKICBpZiAoY2F0ZWdvcnkuaW5jbHVkZXMoJ1dlaWdodC9NZWFzdXJlbWVudCcpKSB7CiAgICByZXN1bHQubWV0cmljRGlzcGxheSA9IGAkeyh2YXJpYW5jZSAqIDEwMCkudG9GaXhlZCgxKX0lIHZhcmlhbmNlYDsKICAgIHJlc3VsdC5kZXRhaWxUZXh0ID0gYERlY2xhcmVkIFZHTTogJHtzYWZlRGVjbGFyZWQudG9Mb2NhbGVTdHJpbmcoKX0ga2c7IHRlcm1pbmFsIHdlaWdodDogJHtzYWZlQXVkaXQudG9Mb2NhbGVTdHJpbmcoKX0ga2c7IHRvbGVyYW5jZSB0aHJlc2hvbGQgNSUuYDsKICAgIGlmIChzYWZlRGVjbGFyZWQgPiAwICYmIHNhZmVBdWRpdCA+IDApIHsKICAgICAgaWYgKHZhcmlhbmNlID4gMC4wNSkgewogICAgICAgIHJldHVybiBzZXRSZXN1bHQoewogICAgICAgICAgc3RhdHVzVHlwZTogJ2JyZWFjaCcsCiAgICAgICAgICBzdGF0dXNNZXNzYWdlOiAn8J+aqCBIQVJELVNUT1A6IFZHTSBWQVJJQU5DRSBFWENFRURFRCcsCiAgICAgICAgICBiYWRnZVN1bW1hcnk6ICdIQVJELVNUT1AnLAogICAgICAgICAgaGlzdG9yeUxhYmVsOiAnSEFSRC1TVE9QJywKICAgICAgICAgIHByaW9yaXR5OiAnSW1tZWRpYXRlJywKICAgICAgICAgIHJpc2tJbmRleDogOTYsCiAgICAgICAgICByZWNvbW1lbmRhdGlvbnM6ICdIT0xEIGxvYWRpbmcgYW5kIHJld2VpZ2ggdGhlIGNvbnRhaW5lciB1c2luZyBTT0xBUyBNZXRob2QgMSBvciAyIGJlZm9yZSByZXN1Ym1pc3Npb24uJwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGlmICh2YXJpYW5jZSA+IDAuMDMpIHsKICAgICAgICByZXR1cm4gc2V0UmVzdWx0KHsKICAgICAgICAgIHN0YXR1c1R5cGU6ICd3YXJuJywKICAgICAgICAgIHN0YXR1c01lc3NhZ2U6ICfimqDvuI8gSElHSC1SSVNLOiBWR00gVkFSSUFOQ0UgTkVBUiBUT0xFUkFOQ0UnLAogICAgICAgICAgYmFkZ2VTdW1tYXJ5OiAnU09GVC1IT0xEJywKICAgICAgICAgIGhpc3RvcnlMYWJlbDogJ1NPRlQtSE9MRCcsCiAgICAgICAgICBwcmlvcml0eTogJ0hpZ2gnLAogICAgICAgICAgcmlza0luZGV4OiA3MCwKICAgICAgICAgIHJlY29tbWVuZGF0aW9uczogJ0NvbmZpcm0gd2VpZ2h0IHJlY29uY2lsaWF0aW9uIGFuZCBwcmVwYXJlIGNvcnJlY3Rpb24gYmVmb3JlIGN1dC1vZmYuJwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBzZXRSZXN1bHQoewogICAgICAgIHN0YXR1c1R5cGU6ICdwYXNzJywKICAgICAgICBzdGF0dXNNZXNzYWdlOiAn4pyTIFBBU1M6IFZHTSBXSVRISU4gVE9MRVJBTkNFJywKICAgICAgICBiYWRnZVN1bW1hcnk6ICdDTEVBUicsCiAgICAgICAgaGlzdG9yeUxhYmVsOiAnQ0xFQVInLAogICAgICAgIHByaW9yaXR5OiAnTG93JywKICAgICAgICByaXNrSW5kZXg6IDIwLAogICAgICAgIHJlY29tbWVuZGF0aW9uczogJ01haW50YWluIGN1cnJlbnQgVkdNIGFuZCBkb2N1bWVudGF0aW9uOyBtb25pdG9yIGZvciBmaW5hbCBzaGlwbWVudCBhY2NlcHRhbmNlLicKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gc2V0UmVzdWx0KHsKICAgICAgcmVjb21tZW5kYXRpb25zOiAnRW50ZXIgYm90aCBCb0wgZGVjbGFyZWQgd2VpZ2h0IGFuZCB0ZXJtaW5hbCBzY2FuIHdlaWdodCBmb3IgYSBxdWFudGl0YXRpdmUgVkdNIGFzc2Vzc21lbnQuJwogICAgfSk7CiAgfQoKICBpZiAoY2F0ZWdvcnkuaW5jbHVkZXMoJ0dhdGUtSW4gTWlzbWF0Y2gnKSkgewogICAgcmVzdWx0Lm1ldHJpY0Rpc3BsYXkgPSBgJHtzYWZlQXVkaXR9IG1pc21hdGNoJHtzYWZlQXVkaXQgPT09IDEgPyAnJyA6ICdlcyd9YDsKICAgIHJlc3VsdC5kZXRhaWxUZXh0ID0gYEV4cGVjdGVkICR7c2FmZURlY2xhcmVkfSBzZWFsKHMpOyAke3NhZmVBdWRpdH0gbWlzbWF0Y2goZXMpIHJlY29yZGVkIGF0IGdhdGUtaW4uYDsKICAgIGlmIChzYWZlQXVkaXQgPiAwKSB7CiAgICAgIHJldHVybiBzZXRSZXN1bHQoewogICAgICAgIHN0YXR1c1R5cGU6ICdicmVhY2gnLAogICAgICAgIHN0YXR1c01lc3NhZ2U6ICfwn5qoIEhBUkQtU1RPUDogU0VBTCBNSVNNQVRDSCBERVRFQ1RFRCcsCiAgICAgICAgYmFkZ2VTdW1tYXJ5OiAnSEFSRC1TVE9QJywKICAgICAgICBoaXN0b3J5TGFiZWw6ICdIQVJELVNUT1AnLAogICAgICAgIHByaW9yaXR5OiAnSW1tZWRpYXRlJywKICAgICAgICByaXNrSW5kZXg6IDk4LAogICAgICAgIHJlY29tbWVuZGF0aW9uczogJ1N0b3AgdGhlIGNvbnRhaW5lciBtb3ZlIGFuZCByZXNvbHZlIHRoZSBzZWFsIGRpc2NyZXBhbmN5IHdpdGggdGVybWluYWwgb3BlcmF0aW9ucy4nCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHNldFJlc3VsdCh7CiAgICAgIHN0YXR1c1R5cGU6ICdwYXNzJywKICAgICAgc3RhdHVzTWVzc2FnZTogJ+KckyBQQVNTOiBTRUFMIE1BVENIIFZFUklGSUVEJywKICAgICAgYmFkZ2VTdW1tYXJ5OiAnQ0xFQVInLAogICAgICBoaXN0b3J5TGFiZWw6ICdDTEVBUicsCiAgICAgIHByaW9yaXR5OiAnTG93JywKICAgICAgcmlza0luZGV4OiAxMiwKICAgICAgcmVjb21tZW5kYXRpb25zOiAnRG9jdW1lbnQgdGhlIHNlYWwgY2hlY2sgYW5kIGNvbnRpbnVlIHdpdGggdGhlIHBsYW5uZWQgZ2F0ZS1pbiBwcm9jZXNzLicKICAgIH0pOwogIH0KCiAgaWYgKGNhdGVnb3J5LmluY2x1ZGVzKCdJU08gNjM0NiBWYWxpZGF0aW9uJykpIHsKICAgIHJlc3VsdC5tZXRyaWNEaXNwbGF5ID0gYCR7c2FmZUF1ZGl0fSBpbnZhbGlkIC8gJHtzYWZlRGVjbGFyZWR9IHRvdGFsYDsKICAgIHJlc3VsdC5kZXRhaWxUZXh0ID0gYElTTyA2MzQ2IHZhbGlkYXRpb24gZmFpbGVkIGZvciAke3NhZmVBdWRpdH0gY29udGFpbmVyKHMpLmA7CiAgICBpZiAoc2FmZUF1ZGl0ID4gMCkgewogICAgICByZXR1cm4gc2V0UmVzdWx0KHsKICAgICAgICBzdGF0dXNUeXBlOiAnYnJlYWNoJywKICAgICAgICBzdGF0dXNNZXNzYWdlOiAn8J+aqCBIQVJELVNUT1A6IElTTyA2MzQ2IFZBTElEQVRJT04gRkFJTEVEJywKICAgICAgICBiYWRnZVN1bW1hcnk6ICdIQVJELVNUT1AnLAogICAgICAgIGhpc3RvcnlMYWJlbDogJ0hBUkQtU1RPUCcsCiAgICAgICAgcHJpb3JpdHk6ICdJbW1lZGlhdGUnLAogICAgICAgIHJpc2tJbmRleDogOTYsCiAgICAgICAgcmVjb21tZW5kYXRpb25zOiAnQ29ycmVjdCBpbnZhbGlkIGNvbnRhaW5lciBJRHMgYW5kIHJldmFsaWRhdGUgSVNPIDYzNDYgY2hlY2sgZGlnaXRzIGJlZm9yZSByZXN1Ym1pc3Npb24uJwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBzZXRSZXN1bHQoewogICAgICBzdGF0dXNUeXBlOiAncGFzcycsCiAgICAgIHN0YXR1c01lc3NhZ2U6ICfinJMgUEFTUzogQUxMIENPTlRBSU5FUiBJRHMgVkFMSUQnLAogICAgICBiYWRnZVN1bW1hcnk6ICdDTEVBUicsCiAgICAgIGhpc3RvcnlMYWJlbDogJ0NMRUFSJywKICAgICAgcHJpb3JpdHk6ICdMb3cnLAogICAgICByaXNrSW5kZXg6IDEwLAogICAgICByZWNvbW1lbmRhdGlvbnM6ICdLZWVwIElTTyB2YWxpZGF0aW9uIHJlY29yZHMgYXZhaWxhYmxlIGZvciBjYXJyaWVyIGFuZCBjdXN0b21zIHJldmlldy4nCiAgICB9KTsKICB9CgogIGlmIChjYXRlZ29yeS5pbmNsdWRlcygnTGF0ZSBJU0YnKSkgewogICAgcmVzdWx0Lm1ldHJpY0Rpc3BsYXkgPSBgJHtzYWZlRGVjbGFyZWR9IGhycyBiZWZvcmUgY3V0LW9mZiAvICR7c2FmZUF1ZGl0fSBocnMgbGF0ZWA7CiAgICBpZiAoc2FmZUF1ZGl0ID4gMCkgewogICAgICByZXR1cm4gc2V0UmVzdWx0KHsKICAgICAgICBzdGF0dXNUeXBlOiAnYnJlYWNoJywKICAgICAgICBzdGF0dXNNZXNzYWdlOiAn8J+aqCBIQVJELVNUT1A6IExBVEUgSVNGIEZJTElORycsCiAgICAgICAgYmFkZ2VTdW1tYXJ5OiAnSEFSRC1TVE9QJywKICAgICAgICBoaXN0b3J5TGFiZWw6ICdIQVJELVNUT1AnLAogICAgICAgIHByaW9yaXR5OiAnSW1tZWRpYXRlJywKICAgICAgICByaXNrSW5kZXg6IDk4LAogICAgICAgIHJlY29tbWVuZGF0aW9uczogJ0ZpbGUgdGhlIElTRiBpbW1lZGlhdGVseSBhbmQgbm90aWZ5IHRoZSBjYXJyaWVyIHRvIGF2b2lkIEROTCBhbmQgcGVuYWx0eSBleHBvc3VyZS4nCiAgICAgIH0pOwogICAgfQogICAgaWYgKHNhZmVEZWNsYXJlZCA8PSAyKSB7CiAgICAgIHJldHVybiBzZXRSZXN1bHQoewogICAgICAgIHN0YXR1c1R5cGU6ICd3YXJuJywKICAgICAgICBzdGF0dXNNZXNzYWdlOiAn4pqg77iPIEhJR0gtUklTSzogTkVBUiBDVVQtT0ZGIElTRiBGSUxJTkcnLAogICAgICAgIGJhZGdlU3VtbWFyeTogJ1NPRlQtSE9MRCcsCiAgICAgICAgaGlzdG9yeUxhYmVsOiAnU09GVC1IT0xEJywKICAgICAgICBwcmlvcml0eTogJ0hpZ2gnLAogICAgICAgIHJpc2tJbmRleDogNzYsCiAgICAgICAgcmVjb21tZW5kYXRpb25zOiAnVmVyaWZ5IGZpbGluZyBjb21wbGV0ZW5lc3MgYW5kIGNvbmZpcm0gbm8gZnVydGhlciBkZWxheXMgYXJlIGludHJvZHVjZWQuJwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBzZXRSZXN1bHQoewogICAgICBzdGF0dXNUeXBlOiAncGFzcycsCiAgICAgIHN0YXR1c01lc3NhZ2U6ICfinJMgUEFTUzogSVNGIFRJTUVEIENPUlJFQ1RMWScsCiAgICAgIGJhZGdlU3VtbWFyeTogJ0NMRUFSJywKICAgICAgaGlzdG9yeUxhYmVsOiAnQ0xFQVInLAogICAgICBwcmlvcml0eTogJ0xvdycsCiAgICAgIHJpc2tJbmRleDogMjAsCiAgICAgIHJlY29tbWVuZGF0aW9uczogJ01haW50YWluIHRoZSB0aW1lbHkgSVNGIGFuZCBtb25pdG9yIGRvd25zdHJlYW0gY2FycmllciBhY2NlcHRhbmNlLicKICAgIH0pOwogIH0KCiAgaWYgKGNhdGVnb3J5LmluY2x1ZGVzKCdBTVMgLyBPVEknKSkgewogICAgcmVzdWx0Lm1ldHJpY0Rpc3BsYXkgPSBgJHtzYWZlRGVjbGFyZWR9JSBjb21wbGlhbmNlIC8gJHtzYWZlQXVkaXR9IHJlamVjdHNgOwogICAgaWYgKHNhZmVBdWRpdCA+IDAgfHwgc2FmZURlY2xhcmVkIDwgOTkpIHsKICAgICAgcmV0dXJuIHNldFJlc3VsdCh7CiAgICAgICAgc3RhdHVzVHlwZTogJ3dhcm4nLAogICAgICAgIHN0YXR1c01lc3NhZ2U6ICfimqDvuI8gSElHSC1SSVNLOiBGSUxFRCBNQU5JRkVTVCBERUZJQ0lFTkNZJywKICAgICAgICBiYWRnZVN1bW1hcnk6ICdTT0ZULUhPTEQnLAogICAgICAgIGhpc3RvcnlMYWJlbDogJ1NPRlQtSE9MRCcsCiAgICAgICAgcHJpb3JpdHk6ICdIaWdoJywKICAgICAgICByaXNrSW5kZXg6IDc4LAogICAgICAgIHJlY29tbWVuZGF0aW9uczogJ0NvcnJlY3QgQU1TL09USSBoZWFkZXIgZGF0YSBhbmQgcmVzdWJtaXQgdG8gYXZvaWQgbWFuaWZlc3QgcmVqZWN0aW9uLicKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gc2V0UmVzdWx0KHsKICAgICAgc3RhdHVzVHlwZTogJ3Bhc3MnLAogICAgICBzdGF0dXNNZXNzYWdlOiAn4pyTIFBBU1M6IEFNUy9PVEkgRklMSU5HIENPTVBMSUFOVCcsCiAgICAgIGJhZGdlU3VtbWFyeTogJ0NMRUFSJywKICAgICAgaGlzdG9yeUxhYmVsOiAnQ0xFQVInLAogICAgICBwcmlvcml0eTogJ0xvdycsCiAgICAgIHJpc2tJbmRleDogMjAsCiAgICAgIHJlY29tbWVuZGF0aW9uczogJ0NvbnRpbnVlIG1vbml0b3JpbmcgQU1TIGFjY2VwdGFuY2UgYW5kIG1haW50YWluIGNsZWFuIGZpbGluZyBkYXRhLicKICAgIH0pOwogIH0KCiAgaWYgKGNhdGVnb3J5LmluY2x1ZGVzKCdJU0YgTmFtZS9BZGRyZXNzJykgfHwgY2F0ZWdvcnkuaW5jbHVkZXMoJ0NoaW5hIENDQU0nKSkgewogICAgcmVzdWx0Lm1ldHJpY0Rpc3BsYXkgPSBgJHtzYWZlRGVjbGFyZWR9JSAvICR7c2FmZUF1ZGl0fSBpc3N1ZShzKWA7CiAgICBpZiAoc2FmZUF1ZGl0ID4gMCB8fCBzYWZlRGVjbGFyZWQgPCAxMDApIHsKICAgICAgcmV0dXJuIHNldFJlc3VsdCh7CiAgICAgICAgc3RhdHVzVHlwZTogJ3dhcm4nLAogICAgICAgIHN0YXR1c01lc3NhZ2U6ICfimqDvuI8gSElHSC1SSVNLOiBQQVJUWSBEQVRBIE1JU01BVENIJywKICAgICAgICBiYWRnZVN1bW1hcnk6ICdTT0ZULUhPTEQnLAogICAgICAgIGhpc3RvcnlMYWJlbDogJ1NPRlQtSE9MRCcsCiAgICAgICAgcHJpb3JpdHk6ICdIaWdoJywKICAgICAgICByaXNrSW5kZXg6IDgyLAogICAgICAgIHJlY29tbWVuZGF0aW9uczogJ1JlY29uY2lsZSBwYXJ0eSBuYW1lcy9hZGRyZXNzZXMgb3Igbm90aWZ5LXBhcnR5IGNvZGVzIGJlZm9yZSBmaW5hbCBzdWJtaXNzaW9uLicKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gc2V0UmVzdWx0KHsKICAgICAgc3RhdHVzVHlwZTogJ3Bhc3MnLAogICAgICBzdGF0dXNNZXNzYWdlOiAn4pyTIFBBU1M6IFBBUlRZIERFVEFJTFMgTUFUQ0gnLAogICAgICBiYWRnZVN1bW1hcnk6ICdDTEVBUicsCiAgICAgIGhpc3RvcnlMYWJlbDogJ0NMRUFSJywKICAgICAgcHJpb3JpdHk6ICdMb3cnLAogICAgICByaXNrSW5kZXg6IDE4LAogICAgICByZWNvbW1lbmRhdGlvbnM6ICdTYXZlIG1hdGNoaW5nIHBhcnR5IHZlcmlmaWNhdGlvbiBhbmQgY29udGludWUgd2l0aCB0aGUgZmlsaW5nIHByb2Nlc3MuJwogICAgfSk7CiAgfQoKICBpZiAoY2F0ZWdvcnkuaW5jbHVkZXMoJ0hUUyBNaXNtYXRjaCcpKSB7CiAgICByZXN1bHQubWV0cmljRGlzcGxheSA9IGAke3NhZmVEZWNsYXJlZH0lIC8gJHtzYWZlQXVkaXR9IG1pc21hdGNoKGVzKWA7CiAgICBpZiAoc2FmZUF1ZGl0ID4gMCB8fCBzYWZlRGVjbGFyZWQgPCA5NSkgewogICAgICByZXR1cm4gc2V0UmVzdWx0KHsKICAgICAgICBzdGF0dXNUeXBlOiAnd2FybicsCiAgICAgICAgc3RhdHVzTWVzc2FnZTogJ+KaoO+4jyBISUdILVJJU0s6IEhUUyBNSVNNQVRDSCBERVRFQ1RFRCcsCiAgICAgICAgYmFkZ2VTdW1tYXJ5OiAnU09GVC1IT0xEJywKICAgICAgICBoaXN0b3J5TGFiZWw6ICdTT0ZULUhPTEQnLAogICAgICAgIHByaW9yaXR5OiAnSGlnaCcsCiAgICAgICAgcmlza0luZGV4OiA4NSwKICAgICAgICByZWNvbW1lbmRhdGlvbnM6ICdSZWNvbmNpbGUgSFRTIGNvZGVzIGFjcm9zcyBpbnZvaWNlLCBCb0wsIGFuZCBJU0YgYmVmb3JlIGN1c3RvbXMgZW50cnkuJwogICAgICB9KTsKICAgIH0KICAgIGlmIChzYWZlRGVjbGFyZWQgPCA5OSkgewogICAgICByZXR1cm4gc2V0UmVzdWx0KHsKICAgICAgICBzdGF0dXNUeXBlOiAnd2FybicsCiAgICAgICAgc3RhdHVzTWVzc2FnZTogJ+KaoO+4jyBNT0RFUkFURS1SSVNLOiBIVFMgUkVDT05DSUxJQVRJT04gQkVMT1cgRVhDRUxMRU5UJywKICAgICAgICBiYWRnZVN1bW1hcnk6ICdTT0ZULUhPTEQnLAogICAgICAgIGhpc3RvcnlMYWJlbDogJ1NPRlQtSE9MRCcsCiAgICAgICAgcHJpb3JpdHk6ICdNZWRpdW0nLAogICAgICAgIHJpc2tJbmRleDogNjAsCiAgICAgICAgcmVjb21tZW5kYXRpb25zOiAnUmVmaW5lIEhUUyByZWNvbmNpbGlhdGlvbiBhbmQgcmVkdWNlIG1pc21hdGNoZXMgYmVmb3JlIGZpbmFsIG1hbmlmZXN0LicKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gc2V0UmVzdWx0KHsKICAgICAgc3RhdHVzVHlwZTogJ3Bhc3MnLAogICAgICBzdGF0dXNNZXNzYWdlOiAn4pyTIFBBU1M6IEhUUyBNQVRDSCBWRVJJRklFRCcsCiAgICAgIGJhZGdlU3VtbWFyeTogJ0NMRUFSJywKICAgICAgaGlzdG9yeUxhYmVsOiAnQ0xFQVInLAogICAgICBwcmlvcml0eTogJ0xvdycsCiAgICAgIHJpc2tJbmRleDogMjAsCiAgICAgIHJlY29tbWVuZGF0aW9uczogJ0RvY3VtZW50IHRoZSByZWNvbmNpbGlhdGlvbiBhbmQgbWFpbnRhaW4gdGFyaWZmIGFjY3VyYWN5IHRocm91Z2ggZmlsaW5nLicKICAgIH0pOwogIH0KCiAgaWYgKGNhdGVnb3J5LmluY2x1ZGVzKCdFVSBJQ1MyIEVOUycpKSB7CiAgICByZXN1bHQubWV0cmljRGlzcGxheSA9IGAke3NhZmVEZWNsYXJlZH0lIC8gJHtzYWZlQXVkaXR9IG1pc3NpbmdgOwogICAgaWYgKHNhZmVBdWRpdCA+IDAgfHwgc2FmZURlY2xhcmVkIDwgMTAwKSB7CiAgICAgIHJldHVybiBzZXRSZXN1bHQoewogICAgICAgIHN0YXR1c1R5cGU6ICd3YXJuJywKICAgICAgICBzdGF0dXNNZXNzYWdlOiAn4pqg77iPIEhJR0gtUklTSzogRU5TIENST1NTLVJFRkVSRU5DRSBERUZJQ0lFTkNZJywKICAgICAgICBiYWRnZVN1bW1hcnk6ICdTT0ZULUhPTEQnLAogICAgICAgIGhpc3RvcnlMYWJlbDogJ1NPRlQtSE9MRCcsCiAgICAgICAgcHJpb3JpdHk6ICdIaWdoJywKICAgICAgICByaXNrSW5kZXg6IDgwLAogICAgICAgIHJlY29tbWVuZGF0aW9uczogJ0NvbXBsZXRlIGFsbCBIQkwvRU9SSSBjcm9zcy1yZWZlcmVuY2VzIHRvIHByZXZlbnQgRVUgY3VzdG9tcyBob2xkLicKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gc2V0UmVzdWx0KHsKICAgICAgc3RhdHVzVHlwZTogJ3Bhc3MnLAogICAgICBzdGF0dXNNZXNzYWdlOiAn4pyTIFBBU1M6IEVOUyBMSU5LQUdFIENPTVBMRVRFJywKICAgICAgYmFkZ2VTdW1tYXJ5OiAnQ0xFQVInLAogICAgICBoaXN0b3J5TGFiZWw6ICdDTEVBUicsCiAgICAgIHByaW9yaXR5OiAnTG93JywKICAgICAgcmlza0luZGV4OiAyMiwKICAgICAgcmVjb21tZW5kYXRpb25zOiAnUmV0YWluIEVOUyBjcm9zcy1yZWZlcmVuY2UgdmFsaWRhdGlvbiBldmlkZW5jZSBhbmQgbW9uaXRvciBFVSByZWxlYXNlLicKICAgIH0pOwogIH0KCiAgaWYgKGNhdGVnb3J5LmluY2x1ZGVzKCdTdXBlcnNlZGVkIFVOIENsYXNzaWZpY2F0aW9uJykgfHwgY2F0ZWdvcnkuaW5jbHVkZXMoJ091dGRhdGVkIFNEUycpKSB7CiAgICByZXN1bHQubWV0cmljRGlzcGxheSA9IGAke3NhZmVEZWNsYXJlZH0lIC8gJHtzYWZlQXVkaXR9IG5vbi1jb25mb3JtaXR5YDsKICAgIGlmIChzYWZlQXVkaXQgPiAwIHx8IHNhZmVEZWNsYXJlZCA8IDEwMCkgewogICAgICByZXR1cm4gc2V0UmVzdWx0KHsKICAgICAgICBzdGF0dXNUeXBlOiAnYnJlYWNoJywKICAgICAgICBzdGF0dXNNZXNzYWdlOiAn8J+aqCBIQVJELVNUT1A6IERHIENMQVNTSUZJQ0FUSU9OIC8gU0RTIE5PTi1DT05GT1JNSVRZJywKICAgICAgICBiYWRnZVN1bW1hcnk6ICdIQVJELVNUT1AnLAogICAgICAgIGhpc3RvcnlMYWJlbDogJ0hBUkQtU1RPUCcsCiAgICAgICAgcHJpb3JpdHk6ICdJbW1lZGlhdGUnLAogICAgICAgIHJpc2tJbmRleDogOTUsCiAgICAgICAgcmVjb21tZW5kYXRpb25zOiAnVXBkYXRlIERHIGNsYXNzaWZpY2F0aW9uIGFuZCBTRFMgcmVmZXJlbmNlcyBiZWZvcmUgYW55IGNhcnJpZXIgREcgYWNjZXB0YW5jZS4nCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHNldFJlc3VsdCh7CiAgICAgIHN0YXR1c1R5cGU6ICdwYXNzJywKICAgICAgc3RhdHVzTWVzc2FnZTogJ+KckyBQQVNTOiBERyBET0NVTUVOVEFUSU9OIENVUlJFTlQnLAogICAgICBiYWRnZVN1bW1hcnk6ICdDTEVBUicsCiAgICAgIGhpc3RvcnlMYWJlbDogJ0NMRUFSJywKICAgICAgcHJpb3JpdHk6ICdMb3cnLAogICAgICByaXNrSW5kZXg6IDE4LAogICAgICByZWNvbW1lbmRhdGlvbnM6ICdLZWVwIGN1cnJlbnQgREcgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgZm9yIHRlcm1pbmFsIGFuZCBjdXN0b21zIHJldmlldy4nCiAgICB9KTsKICB9CgogIGlmIChjYXRlZ29yeS5pbmNsdWRlcygnR2VuZXJpYyBDb21tb2RpdHkgRGVzY3JpcHRpb24nKSkgewogICAgcmVzdWx0Lm1ldHJpY0Rpc3BsYXkgPSBgJHtzYWZlRGVjbGFyZWR9JSAvICR7c2FmZUF1ZGl0fSBnZW5lcmljIGxpbmUocylgOwogICAgaWYgKHNhZmVBdWRpdCA+IDAgfHwgc2FmZURlY2xhcmVkIDwgOTUpIHsKICAgICAgcmV0dXJuIHNldFJlc3VsdCh7CiAgICAgICAgc3RhdHVzVHlwZTogJ3dhcm4nLAogICAgICAgIHN0YXR1c01lc3NhZ2U6ICfimqDvuI8gTU9ERVJBVEUtUklTSzogR0VORVJJQyBDT01NT0RJVFkgREVTQ1JJUFRJT04nLAogICAgICAgIGJhZGdlU3VtbWFyeTogJ1NPRlQtSE9MRCcsCiAgICAgICAgaGlzdG9yeUxhYmVsOiAnU09GVC1IT0xEJywKICAgICAgICBwcmlvcml0eTogJ01lZGl1bScsCiAgICAgICAgcmlza0luZGV4OiA1OCwKICAgICAgICByZWNvbW1lbmRhdGlvbnM6ICdSZXBsYWNlIGdlbmVyaWMgY2FyZ28gZGVzY3JpcHRpb25zIHdpdGggSFMtc3BlY2lmaWMgbGFuZ3VhZ2UgdG8gcmVkdWNlIGN1c3RvbXMgZXhhbSByaXNrLicKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gc2V0UmVzdWx0KHsKICAgICAgc3RhdHVzVHlwZTogJ3Bhc3MnLAogICAgICBzdGF0dXNNZXNzYWdlOiAn4pyTIFBBU1M6IERFU0NSSVBUSU9OIFNVRkZJQ0lFTlRMWSBTUEVDSUZJQycsCiAgICAgIGJhZGdlU3VtbWFyeTogJ0NMRUFSJywKICAgICAgaGlzdG9yeUxhYmVsOiAnQ0xFQVInLAogICAgICBwcmlvcml0eTogJ0xvdycsCiAgICAgIHJpc2tJbmRleDogMTgsCiAgICAgIHJlY29tbWVuZGF0aW9uczogJ0FyY2hpdmUgdGhlIHZhbGlkYXRlZCBjb21tb2RpdHkgZGVzY3JpcHRpb25zIGZvciBhdWRpdCBhbmQgcmVsZWFzZSBjb250cm9sLicKICAgIH0pOwogIH0KCiAgaWYgKGNhdGVnb3J5LmluY2x1ZGVzKCdEZW11cnJhZ2UgSW52b2ljZScpKSB7CiAgICByZXN1bHQubWV0cmljRGlzcGxheSA9IGAke3NhZmVEZWNsYXJlZH0lIC8gJHtzYWZlQXVkaXR9IGRpc2NyZXBhbmN5KHMpYDsKICAgIGlmIChzYWZlQXVkaXQgPiAwIHx8IHNhZmVEZWNsYXJlZCA8IDEwMCkgewogICAgICByZXR1cm4gc2V0UmVzdWx0KHsKICAgICAgICBzdGF0dXNUeXBlOiAnd2FybicsCiAgICAgICAgc3RhdHVzTWVzc2FnZTogJ+KaoO+4jyBISUdILVJJU0s6IERFTVVSUkFHRSBJTlZPSUNFIE5PTi1DT01QTElBTkNFJywKICAgICAgICBiYWRnZVN1bW1hcnk6ICdTT0ZULUhPTEQnLAogICAgICAgIGhpc3RvcnlMYWJlbDogJ1NPRlQtSE9MRCcsCiAgICAgICAgcHJpb3JpdHk6ICdIaWdoJywKICAgICAgICByaXNrSW5kZXg6IDcyLAogICAgICAgIHJlY29tbWVuZGF0aW9uczogJ0NvcnJlY3QgdGhlIGludm9pY2UgdG8gRk1DIGJpbGxpbmcgcmVxdWlyZW1lbnRzIGFuZCByZWlzc3VlIGJlZm9yZSBjYXJnbyByZWxlYXNlLicKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gc2V0UmVzdWx0KHsKICAgICAgc3RhdHVzVHlwZTogJ3Bhc3MnLAogICAgICBzdGF0dXNNZXNzYWdlOiAn4pyTIFBBU1M6IElOVk9JQ0UgTUVFVFMgRk1DIFJFUVVJUkVNRU5UUycsCiAgICAgIGJhZGdlU3VtbWFyeTogJ0NMRUFSJywKICAgICAgaGlzdG9yeUxhYmVsOiAnQ0xFQVInLAogICAgICBwcmlvcml0eTogJ0xvdycsCiAgICAgIHJpc2tJbmRleDogMjAsCiAgICAgIHJlY29tbWVuZGF0aW9uczogJ0tlZXAgdGhlIGNvbXBsaWFudCBpbnZvaWNlIG9uIGZpbGUgYW5kIHZlcmlmeSBwYXltZW50IHRlcm1zIGFsaWduIHdpdGggSW5jb3Rlcm1zLicKICAgIH0pOwogIH0KCiAgaWYgKGNhdGVnb3J5LmluY2x1ZGVzKCdNYW5pZmVzdCBSZWNvbmNpbGlhdGlvbicpKSB7CiAgICByZXN1bHQubWV0cmljRGlzcGxheSA9IGAke3NhZmVEZWNsYXJlZH0lIC8gJHtzYWZlQXVkaXR9IG1pc21hdGNoKGVzKWA7CiAgICBpZiAoc2FmZUF1ZGl0ID4gMCB8fCBzYWZlRGVjbGFyZWQgPCAxMDApIHsKICAgICAgcmV0dXJuIHNldFJlc3VsdCh7CiAgICAgICAgc3RhdHVzVHlwZTogJ3dhcm4nLAogICAgICAgIHN0YXR1c01lc3NhZ2U6ICfimqDvuI8gSElHSC1SSVNLOiBNQU5JRkVTVCBNSVNNQVRDSCBERVRFQ1RFRCcsCiAgICAgICAgYmFkZ2VTdW1tYXJ5OiAnU09GVC1IT0xEJywKICAgICAgICBoaXN0b3J5TGFiZWw6ICdTT0ZULUhPTEQnLAogICAgICAgIHByaW9yaXR5OiAnSGlnaCcsCiAgICAgICAgcmlza0luZGV4OiA2OCwKICAgICAgICByZWNvbW1lbmRhdGlvbnM6ICdDb3JyZWN0IHZlc3NlbC92b3lhZ2UgZGV0YWlscyBhbmQgcmVzdWJtaXQgdGhlIG1hbmlmZXN0IGJlZm9yZSBhcnJpdmFsLicKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gc2V0UmVzdWx0KHsKICAgICAgc3RhdHVzVHlwZTogJ3Bhc3MnLAogICAgICBzdGF0dXNNZXNzYWdlOiAn4pyTIFBBU1M6IE1BTklGRVNUIE1BVENIIFZFUklGSUVEJywKICAgICAgYmFkZ2VTdW1tYXJ5OiAnQ0xFQVInLAogICAgICBoaXN0b3J5TGFiZWw6ICdDTEVBUicsCiAgICAgIHByaW9yaXR5OiAnTG93JywKICAgICAgcmlza0luZGV4OiAyMCwKICAgICAgcmVjb21tZW5kYXRpb25zOiAnQXJjaGl2ZSBtYW5pZmVzdCByZWNvbmNpbGlhdGlvbiBldmlkZW5jZSBhbmQgY29uZmlybSBhcnJpdmFsIHN0YXR1cy4nCiAgICB9KTsKICB9CgogIHJldHVybiBzZXRSZXN1bHQoewogICAgbWV0cmljRGlzcGxheTogYCR7c2FmZURlY2xhcmVkfSAvICR7c2FmZUF1ZGl0fWAsCiAgICBkZXRhaWxUZXh0OiBpdGVtLmRlc2MsCiAgICBiYWRnZVN1bW1hcnk6IGl0ZW0uc2V2ID09PSAnSGFyZC1TdG9wJyA/ICdIQVJELVNUT1AnIDogJ1NPRlQtSE9MRCcsCiAgICBoaXN0b3J5TGFiZWw6IGl0ZW0uc2V2ID09PSAnSGFyZC1TdG9wJyA/ICdIQVJELVNUT1AnIDogJ1NPRlQtSE9MRCcsCiAgICBwcmlvcml0eTogaXRlbS5zZXYgPT09ICdIYXJkLVN0b3AnID8gJ0hpZ2gnIDogJ01lZGl1bScsCiAgICByaXNrSW5kZXg6IGl0ZW0uc2V2ID09PSAnSGFyZC1TdG9wJyA/IDkwIDogNjUsCiAgICByZWNvbW1lbmRhdGlvbnM6ICdVc2UgdGhlIGV4Y2VwdGlvbiBwcm90b2NvbCBhbmQgY2F0ZWdvcnkgZGF0YSB0byBtYWtlIHRoZSBuZXh0IGNvcnJlY3RpdmUgc3RlcC4nCiAgfSk7Cn0KCi8vIENFTlRSQUwgQVJJVEhNRVRJQyBWQUxVQVRJT04gUElQRUxJTkUgRU5HSU5FUwpmdW5jdGlvbiBydW5BdWRpdCgpIHsKICBjbGVhclZhbGlkYXRpb25FcnJvcnMoKTsKICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhlY0J0bicpOwogIGJ0bi5pbm5lclRleHQgPSAiQW5hbHl6aW5nIFJpc2sgVmVjdG9ycy4uLiI7CiAgYnRuLmRpc2FibGVkID0gdHJ1ZTsKCiAgY29uc3QgY3VycmVudFRhYiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50YWItYnRuLmFjdGl2ZScpLmlkLnJlcGxhY2UoJ3RhYl8nLCAnJyk7CiAgY29uc3Qgc2VsZWN0VmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRlU2VsZWN0JykudmFsdWU7CiAgY29uc3QgdmFsQiA9IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JldklucHV0JykudmFsdWUpIHx8IDA7CiAgY29uc3QgdmFsQyA9IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RyYW5zSW5wdXQnKS52YWx1ZSkgfHwgMDsKICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXBvcnRQYW5lbCcpOwogIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VpU3RhdHVzJyk7CiAgY29uc3QgcGN0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndWlQY3QnKTsKICBjb25zdCBhbGVydEJhbm5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0cmlhbEFsZXJ0Jyk7CiAgY29uc3QgaW50ZWxCbG9jayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRlbENhcHR1cmVCbG9jaycpOwogIGNvbnN0IHByb3RvY29sV3JhcHBlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm90b2NvbFNlY3Rpb25XcmFwcGVyJyk7CgogIC8vIElubGluZSB2YWxpZGF0aW9uCiAgbGV0IGhhc0Vycm9yID0gZmFsc2U7CiAgaWYgKHNlbGVjdFZhbCA9PT0gIiIpIHsgc2hvd0Vycm9yKCdzdGF0ZVNlbGVjdCcsICdlcnJTdGF0ZScpOyBoYXNFcnJvciA9IHRydWU7IH0KICBpZiAodmFsQiA8IDApIHsgc2hvd0Vycm9yKCdyZXZJbnB1dCcsICdlcnJSZXYnKTsgaGFzRXJyb3IgPSB0cnVlOyB9CiAgaWYgKGN1cnJlbnRUYWIgPT09ICdoZWFsdGhjYXJlJyAmJiB2YWxCIDw9IDApIHsgc2hvd0Vycm9yKCdyZXZJbnB1dCcsICdlcnJSZXYnKTsgaGFzRXJyb3IgPSB0cnVlOyB9CiAgaWYgKHZhbEMgPCAwKSB7IHNob3dFcnJvcigndHJhbnNJbnB1dCcsICdlcnJUcmFucycpOyBoYXNFcnJvciA9IHRydWU7IH0KICBpZiAoaGFzRXJyb3IpIHsgYnRuLmlubmVyVGV4dCA9ICJFeGVjdXRlIE1hdHJpeCBBbmFseXNpcyI7IGJ0bi5kaXNhYmxlZCA9IGZhbHNlOyByZXR1cm47IH0KCiAgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgcHJvdG9jb2xXcmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CgogIGNvbnN0IGtleSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrZXlJbnB1dCcpLnZhbHVlLnRyaW0oKTsKICBjb25zdCBoYXNLZXkgPSBbJ0NPUlAtRU5HLTIwMjYnLCAnQUwtUFJPLTIwMjYtTkVYVVMnLCAnQUwtRU5URVJQUklTRS03NzlYJ10uaW5kZXhPZihrZXkpID4gLTE7CgogIC8vIFVwZGF0ZSBzaGFyZWFibGUgVVJMCiAgdXBkYXRlU2hhcmVhYmxlVVJMKGN1cnJlbnRUYWIsIHNlbGVjdFZhbCwgdmFsQiwgdmFsQyk7CgogIGlmIChjdXJyZW50VGFiID09PSAnbmV4dXMnKSB7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndWlTdGF0ZScpLmlubmVySFRNTCA9IHNlbGVjdFZhbDsKICAgIGNvbnN0IGRhdGEgPSBtYXRyaXhfZGF0YWJhc2VzW3NlbGVjdFZhbF07CiAgICBjb25zdCB0aHJlc2hvbGQgPSBkYXRhLnJldjsKICAgIGNvbnN0IHRyYW5zTGltaXQgPSBkYXRhLnRyYW5zOwoKICAgIGxldCBwY3QgPSAwOwogICAgaWYgKHR5cGVvZiB0aHJlc2hvbGQgPT09ICdudW1iZXInKSB7CiAgICAgIHBjdCA9IHZhbEIgLyB0aHJlc2hvbGQ7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1aVBjdCcpLmlubmVySFRNTCA9IChwY3QgKiAxMDApLnRvRml4ZWQoMSkgKyAiJSI7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1aVJldicpLmlubmVySFRNTCA9ICckJyArIHRocmVzaG9sZC50b0xvY2FsZVN0cmluZygpOwogICAgfSBlbHNlIHsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VpUGN0JykuaW5uZXJIVE1MID0gIk4vQSI7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1aVJldicpLmlubmVySFRNTCA9IHRocmVzaG9sZDsKICAgIH0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1aVBlcmlvZCcpLmlubmVySFRNTCA9IGRhdGEucGVyaW9kOwoKICAgIGxldCBpc0JyZWFjaGVkID0gZmFsc2U7CiAgICBpZiAodGhyZXNob2xkID09PSAiTm8gU2FsZXMgVGF4IikgeyBpc0JyZWFjaGVkID0gZmFsc2U7IH0KICAgIGVsc2UgaWYgKHRyYW5zTGltaXQgPT09IG51bGwpIHsgaWYgKHZhbEIgPj0gdGhyZXNob2xkKSBpc0JyZWFjaGVkID0gdHJ1ZTsgfQogICAgZWxzZSBpZiAoZGF0YS5sb2dpYyA9PT0gIkFORCIpIHsgaWYgKHZhbEIgPj0gdGhyZXNob2xkICYmIHZhbEMgPj0gdHJhbnNMaW1pdCkgaXNCcmVhY2hlZCA9IHRydWU7IH0KICAgIGVsc2UgaWYgKGRhdGEubG9naWMgPT09ICJPUiIpIHsgaWYgKHZhbEIgPj0gdGhyZXNob2xkIHx8IHZhbEMgPj0gdHJhbnNMaW1pdCkgaXNCcmVhY2hlZCA9IHRydWU7IH0KCiAgICBpZiAoaXNCcmVhY2hlZCkgewogICAgICBzdGF0dXNFbC5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9InN0YXR1cy1iYWRnZSBzdGF0dXMtZmFpbCI+4pqg77iPIENSSVRJQ0FMIEJSRUFDSCBERVRFQ1RFRDwvc3Bhbj4nOwogICAgICBwY3RFbC5zdHlsZS5jb2xvciA9ICJ2YXIoLS1kYW5nZXIpIjsKICAgICAgdXBkYXRlUHJvZ3Jlc3NCYXIocGN0LCAnYnJlYWNoJyk7CiAgICAgIGFkZFRvSGlzdG9yeSgnTkVYVVMnLCBzZWxlY3RWYWwsICdCUkVBQ0gnLCAocGN0KjEwMCkudG9GaXhlZCgxKSsnJScpOwogICAgICAKICAgICAgcHJvdG9jb2xXcmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvdG9jb2xUaXRsZScpLmlubmVyVGV4dCA9IGBSZXNvbHV0aW9uIFByb3RvY29sIC8vIEVjb25vbWljIE5leHVzIE1hbmRhdGUgKCR7c2VsZWN0VmFsfSlgOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvdG9jb2xTZXZlcml0eScpLmlubmVyVGV4dCA9ICJDUklUSUNBTCBCUkVBQ0giOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvdG9jb2xTZXZlcml0eScpLmNsYXNzTmFtZSA9ICJzdGF0dXMtYmFkZ2Ugc3RhdHVzLWZhaWwiOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvdG9jb2xSaXNrQ29uc2VxdWVuY2UnKS5pbm5lckhUTUwgPSBgPHN0cm9uZz5TdGF0dXRvcnkgRXhwb3N1cmU6PC9zdHJvbmc+IE91dC1vZi1zdGF0ZSBzYWxlcyB0YXggY29sbGVjdGlvbiBsaWFiaWxpdHkgcmV0cm9hY3RpdmUgdG8gdGhyZXNob2xkIGJyZWFjaCBkYXRlOyB1bnJlbWl0dGVkIHRheCBwZW5hbHRpZXMgYW5kIHN0YXR1dG9yeSBpbnRlcmVzdC5gOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvdG9jb2xTdGVwcycpLmlubmVySFRNTCA9IGA8c3Ryb25nPkFjdGlvbiBTdGVwczo8L3N0cm9uZz48YnI+MS4gUmVnaXN0ZXIgZm9yIGEgc2FsZXMgdGF4IHBlcm1pdCB3aXRoIHRoZSAke3NlbGVjdFZhbH0gRGVwYXJ0bWVudCBvZiBSZXZlbnVlLjxicj4yLiBDb25maWd1cmUgRVJQL2NhcnQgZW5naW5lIHRvIGNvbGxlY3Qgc2FsZXMgdGF4IG9uIGFwcGxpY2FibGUgdHJhbnNhY3Rpb25zLjxicj4zLiBFdmFsdWF0ZSBWb2x1bnRhcnkgRGlzY2xvc3VyZSBBZ3JlZW1lbnQgKFZEQSkgdG8gbWl0aWdhdGUgaGlzdG9yaWNhbCBwZW5hbHRpZXMuYDsKCiAgICAgIGluamVjdFVwZ3JhZGVCYW5uZXIoc2VsZWN0VmFsLCBhbGVydEJhbm5lcik7CiAgICAgIGluamVjdEludGVsRm9ybSgpOwogICAgfSBlbHNlIGlmICh0aHJlc2hvbGQgPT09ICJObyBTYWxlcyBUYXgiKSB7CiAgICAgIHN0YXR1c0VsLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz0ic3RhdHVzLWJhZGdlIHN0YXR1cy1wYXNzIj7inJMgTk8gSlVSSVNESUNUSU9OIFNBTEVTIFRBWDwvc3Bhbj4nOwogICAgICBwY3RFbC5zdHlsZS5jb2xvciA9ICJ2YXIoLS1hY2NlbnQpIjsgYWxlcnRCYW5uZXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsgaW50ZWxCbG9jay5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICB1cGRhdGVQcm9ncmVzc0JhcigwLCAncGFzcycpOwogICAgICBhZGRUb0hpc3RvcnkoJ05FWFVTJywgc2VsZWN0VmFsLCAnTk8gVEFYJywgJ04vQScpOwogICAgfSBlbHNlIGlmIChwY3QgPj0gMC44MCkgewogICAgICBzdGF0dXNFbC5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9InN0YXR1cy1iYWRnZSBzdGF0dXMtd2FybiI+4pqg77iPIEVMRVZBVEVEIFJJU0sgRkxBR0dFRDwvc3Bhbj4nOwogICAgICBwY3RFbC5zdHlsZS5jb2xvciA9ICJ2YXIoLS13YXJuaW5nKSI7CiAgICAgIHVwZGF0ZVByb2dyZXNzQmFyKHBjdCwgJ3dhcm4nKTsKICAgICAgYWRkVG9IaXN0b3J5KCdORVhVUycsIHNlbGVjdFZhbCwgJ0VMRVZBVEVEIFJJU0snLCAocGN0KjEwMCkudG9GaXhlZCgxKSsnJScpOwogICAgICAKICAgICAgcHJvdG9jb2xXcmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvdG9jb2xUaXRsZScpLmlubmVyVGV4dCA9IGBSZXNvbHV0aW9uIFByb3RvY29sIC8vIEFwcHJvYWNoaW5nIFRocmVzaG9sZCAoJHtzZWxlY3RWYWx9KWA7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm90b2NvbFNldmVyaXR5JykuaW5uZXJUZXh0ID0gIkVMRVZBVEVEIFJJU0siOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvdG9jb2xTZXZlcml0eScpLmNsYXNzTmFtZSA9ICJzdGF0dXMtYmFkZ2Ugc3RhdHVzLXdhcm4iOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvdG9jb2xSaXNrQ29uc2VxdWVuY2UnKS5pbm5lckhUTUwgPSBgPHN0cm9uZz5SaXNrIFdhcm5pbmc6PC9zdHJvbmc+IEN1cnJlbnQgcmV2ZW51ZS90cmFuc2FjdGlvbiB2ZWxvY2l0eSBpcyB3aXRoaW4gMjAlIG9mIHN0YXR1dG9yeSBlY29ub21pYyBuZXh1cyBsaW1pdHMuYDsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb3RvY29sU3RlcHMnKS5pbm5lckhUTUwgPSBgPHN0cm9uZz5BY3Rpb24gU3RlcHM6PC9zdHJvbmc+PGJyPjEuIE1vbml0b3IgbW9udGhseSBjYWRlbmNlIGFnYWluc3QgJHt0eXBlb2YgdGhyZXNob2xkID09PSAnbnVtYmVyJyA/ICckJyt0aHJlc2hvbGQudG9Mb2NhbGVTdHJpbmcoKSA6IHRocmVzaG9sZH0uPGJyPjIuIFByZXBhcmUgdGF4IGNvbGxlY3Rpb24gc29mdHdhcmUgaW50ZWdyYXRpb24gcHJvYWN0aXZlbHkuPGJyPjMuIFJldmlldyBtYXJrZXRwbGFjZSBmYWNpbGl0YXRvciBjb2xsZWN0aW9uIHBlcmNlbnRhZ2VzLmA7CgogICAgICBpbmplY3RVcGdyYWRlQmFubmVyKHNlbGVjdFZhbCwgYWxlcnRCYW5uZXIpOwogICAgICBpbmplY3RJbnRlbEZvcm0oKTsKICAgIH0gZWxzZSB7CiAgICAgIHN0YXR1c0VsLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz0ic3RhdHVzLWJhZGdlIHN0YXR1cy1wYXNzIj7inJMgTU9OSVRPUklORyBTRUNVUkU8L3NwYW4+JzsKICAgICAgcGN0RWwuc3R5bGUuY29sb3IgPSAidmFyKC0tYWNjZW50KSI7IGFsZXJ0QmFubmVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7IGludGVsQmxvY2suc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgdXBkYXRlUHJvZ3Jlc3NCYXIocGN0LCAncGFzcycpOwogICAgICBhZGRUb0hpc3RvcnkoJ05FWFVTJywgc2VsZWN0VmFsLCAnQ0xFQVInLCAocGN0KjEwMCkudG9GaXhlZCgxKSsnJScpOwogICAgfQogICAgCiAgICByZW5kZXJCYWRnZSgxLCBoYXNLZXkgPyBkYXRhLnNhYXMgOiAiTE9DS0VEIik7CiAgICByZW5kZXJCYWRnZSgyLCBoYXNLZXkgPyBkYXRhLmFwcGFyZWwgOiAiTE9DS0VEIik7CiAgICByZW5kZXJCYWRnZSgzLCBoYXNLZXkgPyBkYXRhLnN1cHBzIDogIkxPQ0tFRCIpOwogICAgcmVuZGVyQmFkZ2UoNCwgaGFzS2V5ID8gZGF0YS5mb29kIDogIkxPQ0tFRCIpOwogICAgcmVuZGVyQmFkZ2UoNSwgaGFzS2V5ID8gZGF0YS5hbGNvaG9sIDogIkxPQ0tFRCIpOwogICAgcmVuZGVyQmFkZ2UoNiwgaGFzS2V5ID8gZGF0YS5tcGYgOiAiTE9DS0VEIik7CiAgICByZW5kZXJCYWRnZSg3LCBoYXNLZXkgPyBkYXRhLnJlc2FsZSA6ICJMT0NLRUQiKTsKICB9IAogIGVsc2UgaWYgKGN1cnJlbnRUYWIgPT09ICdsb2dpc3RpY3MnKSB7CiAgICBjb25zdCBkYXRhID0gbWFyaXRpbWVfZGJbcGFyc2VJbnQoc2VsZWN0VmFsKV07CiAgICBpZiAoIWRhdGEpIHsgYnRuLmlubmVyVGV4dCA9ICJFeGVjdXRlIE1hdHJpeCBBbmFseXNpcyI7IGJ0bi5kaXNhYmxlZCA9IGZhbHNlOyByZXR1cm47IH0KCiAgICBjb25zdCBleGNlcHRpb25SZXN1bHQgPSBldmFsdWF0ZUxvZ2lzdGljc0V4Y2VwdGlvbihkYXRhLCB2YWxCLCB2YWxDKTsKCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndWlTdGF0ZScpLmlubmVySFRNTCA9IGRhdGEuanVyOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VpUmV2JykuaW5uZXJIVE1MID0gZGF0YS5lZGk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndWlQZXJpb2QnKS5pbm5lckhUTUwgPSBkYXRhLnNsYTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1aVBjdCcpLmlubmVySFRNTCA9IGV4Y2VwdGlvblJlc3VsdC5tZXRyaWNEaXNwbGF5OwogICAgcmVuZGVyUmlza0luc2lnaHQoZXhjZXB0aW9uUmVzdWx0KTsKICAgIHJlbmRlckxpdmVSaXNrTWluaUdhdWdlKGV4Y2VwdGlvblJlc3VsdCk7CgogICAgaWYgKGV4Y2VwdGlvblJlc3VsdC5zdGF0dXNUeXBlID09PSAnYnJlYWNoJykgewogICAgICBzdGF0dXNFbC5pbm5lckhUTUwgPSBgPHNwYW4gY2xhc3M9InN0YXR1cy1iYWRnZSBzdGF0dXMtZmFpbCI+JHtleGNlcHRpb25SZXN1bHQuc3RhdHVzTWVzc2FnZX08L3NwYW4+YDsKICAgICAgcGN0RWwuc3R5bGUuY29sb3IgPSAidmFyKC0tZGFuZ2VyKSI7CiAgICAgIHVwZGF0ZVByb2dyZXNzQmFyKDEsICdicmVhY2gnKTsKICAgICAgYWRkVG9IaXN0b3J5KCdNQVJJVElNRScsIGRhdGEuY2F0LCBleGNlcHRpb25SZXN1bHQuaGlzdG9yeUxhYmVsLCBkYXRhLm1vZGUpOwogICAgfSBlbHNlIGlmIChleGNlcHRpb25SZXN1bHQuc3RhdHVzVHlwZSA9PT0gJ3Bhc3MnKSB7CiAgICAgIHN0YXR1c0VsLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz0ic3RhdHVzLWJhZGdlIHN0YXR1cy1wYXNzIj4ke2V4Y2VwdGlvblJlc3VsdC5zdGF0dXNNZXNzYWdlfTwvc3Bhbj5gOwogICAgICBwY3RFbC5zdHlsZS5jb2xvciA9ICJ2YXIoLS1hY2NlbnQpIjsKICAgICAgdXBkYXRlUHJvZ3Jlc3NCYXIoMC45LCAncGFzcycpOwogICAgICBhZGRUb0hpc3RvcnkoJ01BUklUSU1FJywgZGF0YS5jYXQsIGV4Y2VwdGlvblJlc3VsdC5oaXN0b3J5TGFiZWwsIGRhdGEubW9kZSk7CiAgICB9IGVsc2UgewogICAgICBzdGF0dXNFbC5pbm5lckhUTUwgPSBgPHNwYW4gY2xhc3M9InN0YXR1cy1iYWRnZSBzdGF0dXMtd2FybiI+JHtleGNlcHRpb25SZXN1bHQuc3RhdHVzTWVzc2FnZX08L3NwYW4+YDsKICAgICAgcGN0RWwuc3R5bGUuY29sb3IgPSAidmFyKC0td2FybmluZykiOwogICAgICB1cGRhdGVQcm9ncmVzc0JhcigwLjYsICd3YXJuJyk7CiAgICAgIGFkZFRvSGlzdG9yeSgnTUFSSVRJTUUnLCBkYXRhLmNhdCwgZXhjZXB0aW9uUmVzdWx0Lmhpc3RvcnlMYWJlbCwgZGF0YS5tb2RlKTsKICAgIH0KCiAgICBwcm90b2NvbFdyYXBwZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvdG9jb2xUaXRsZScpLmlubmVyVGV4dCA9IGBSZXNvbHV0aW9uIFByb3RvY29sIC8vICR7ZGF0YS5jYXR9YDsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm90b2NvbFNldmVyaXR5JykuaW5uZXJUZXh0ID0gZXhjZXB0aW9uUmVzdWx0LmJhZGdlU3VtbWFyeTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm90b2NvbFNldmVyaXR5JykuY2xhc3NOYW1lID0gYHN0YXR1cy1iYWRnZSAke2V4Y2VwdGlvblJlc3VsdC5zdGF0dXNUeXBlID09PSAnYnJlYWNoJyA/ICdzdGF0dXMtZmFpbCcgOiBleGNlcHRpb25SZXN1bHQuc3RhdHVzVHlwZSA9PT0gJ3Bhc3MnID8gJ3N0YXR1cy1wYXNzJyA6ICdzdGF0dXMtd2Fybid9YDsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm90b2NvbFJpc2tDb25zZXF1ZW5jZScpLmlubmVySFRNTCA9IGA8c3Ryb25nPkZpbmFuY2lhbCAmIE9wZXJhdGlvbmFsIFJpc2s6PC9zdHJvbmc+ICR7ZGF0YS5yaXNrfTxicj48c3Ryb25nPlJlc3BvbnNpYmxlIFBhcnR5Ojwvc3Ryb25nPiAke2RhdGEucmVzcH08YnI+PHN0cm9uZz5TaGlwbWVudCBNb2RlOjwvc3Ryb25nPiAke2RhdGEubW9kZX08YnI+PHN0cm9uZz5EYXRhIFZvbGF0aWxpdHk6PC9zdHJvbmc+ICR7ZGF0YS52b2x9PGJyPjxzdHJvbmc+UmlzayBJbmRleDo8L3N0cm9uZz4gJHtleGNlcHRpb25SZXN1bHQucmlza0luZGV4IHx8ICdOL0EnfTxicj48c3Ryb25nPkRhdGEgSW5zaWdodDo8L3N0cm9uZz4gJHtleGNlcHRpb25SZXN1bHQuZGV0YWlsVGV4dH1gOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb3RvY29sU3RlcHMnKS5pbm5lckhUTUwgPSBgPHN0cm9uZz5BY3Rpb24gU3RlcHM6PC9zdHJvbmc+PGJyPiR7ZGF0YS5wcm90b308YnI+PGJyPjxzdHJvbmc+UHJpb3JpdHkgUmVjb21tZW5kYXRpb246PC9zdHJvbmc+ICR7ZXhjZXB0aW9uUmVzdWx0LnJlY29tbWVuZGF0aW9ucyB8fCAnUmV2aWV3IGNhdGVnb3J5IGd1aWRhbmNlIGFuZCBhZGp1c3QgaW5wdXRzLid9PGJyPjxicj48c3Ryb25nPkFtZW5kbWVudCBDb2RlIFN0cmluZzo8L3N0cm9uZz4gPGNvZGU+JHtkYXRhLmFtZHR9PC9jb2RlPmA7CgogICAgaW5qZWN0VXBncmFkZUJhbm5lcihkYXRhLmNhdCwgYWxlcnRCYW5uZXIpOwogICAgaW5qZWN0SW50ZWxGb3JtKCk7CgogICAgcmVuZGVyQmFkZ2UoMSwgaGFzS2V5ID8gKGRhdGEuanVyLmluY2x1ZGVzKCdTT0xBUycpID8gJ1QnIDogJ0UnKSA6ICdMT0NLRUQnKTsKICAgIHJlbmRlckJhZGdlKDIsIGhhc0tleSA/IChkYXRhLmp1ci5pbmNsdWRlcygnQ0JQJykgPyAnVCcgOiAnRScpIDogJ0xPQ0tFRCcpOwogICAgcmVuZGVyQmFkZ2UoMywgaGFzS2V5ID8gKGRhdGEuanVyLmluY2x1ZGVzKCdHQUNDJykgPyAnVCcgOiAnRScpIDogJ0xPQ0tFRCcpOwogICAgcmVuZGVyQmFkZ2UoNCwgaGFzS2V5ID8gKGRhdGEuanVyLmluY2x1ZGVzKCdJQ1MyJykgPyAnVCcgOiAnRScpIDogJ0xPQ0tFRCcpOwogICAgcmVuZGVyQmFkZ2UoNSwgaGFzS2V5ID8gKGRhdGEuanVyLmluY2x1ZGVzKCdGTUMnKSA/ICdUJyA6ICdFJykgOiAnTE9DS0VEJyk7CiAgICByZW5kZXJCYWRnZSg2LCBoYXNLZXkgPyAnUCcgOiAnTE9DS0VEJyk7CiAgICByZW5kZXJCYWRnZSg3LCBoYXNLZXkgPyAnUCcgOiAnTE9DS0VEJyk7CiAgfSAKICBlbHNlIGlmIChjdXJyZW50VGFiID09PSAnaGVhbHRoY2FyZScpIHsKICAgIGNvbnN0IGRhdGEgPSBoZWFsdGhjYXJlX2RiW3NlbGVjdFZhbF07CiAgICBpZiAoIWRhdGEpIHsgYnRuLmlubmVyVGV4dCA9ICJFeGVjdXRlIE1hdHJpeCBBbmFseXNpcyI7IGJ0bi5kaXNhYmxlZCA9IGZhbHNlOyByZXR1cm47IH0KCiAgICBjb25zdCBjYXAgPSBkYXRhLmZtdl9jYXA7CiAgICBjb25zdCBmbXZDYXBQY3QgPSBjYXAgPiAwID8gdmFsQiAvIGNhcCA6IDA7CiAgICBjb25zdCByZWZlcnJhbEVuY291bnRlcnMgPSBNYXRoLnJvdW5kKHZhbEMpOwogICAgY29uc3QgaG91cmx5UmF0ZSA9IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hvdXJseVJhdGVJbnB1dCcpLnZhbHVlKSB8fCAwOwogICAgY29uc3QgaW1wbGllZEFubnVhbEhvdXJzID0gKGhvdXJseVJhdGUgPiAwICYmIHZhbEIgPiAwKSA/IE1hdGgucm91bmQodmFsQiAvIGhvdXJseVJhdGUpIDogbnVsbDsKICAgIGNvbnN0IHBlckVuY291bnRlckNvbXAgPSAocmVmZXJyYWxFbmNvdW50ZXJzID4gMCAmJiB2YWxCID4gMCkgPyBNYXRoLnJvdW5kKHZhbEIgLyByZWZlcnJhbEVuY291bnRlcnMpIDogbnVsbDsKCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndWlTdGF0ZScpLmlubmVySFRNTCA9IGRhdGEuc3BlY2lhbHR5OwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VpUGN0JykuaW5uZXJIVE1MID0gKGZtdkNhcFBjdCAqIDEwMCkudG9GaXhlZCgxKSArICIlIjsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1aVJldicpLmlubmVySFRNTCA9ICckJyArIGNhcC50b0xvY2FsZVN0cmluZygpOwogICAgLy8gU2hvdyBhcnJhbmdlbWVudC1zcGVjaWZpYyBDRlIgY2l0ZSBvbmNlIHNlbGVjdGVkLCBmYWxsYmFjayB0byBtb2R1bGUgcmVmCiAgICAvLyBSZWFkIHJlYWwgdXNlciBpbnB1dHMgZnJvbSB0aGUgZXh0ZW5kZWQgU3RhcmsgTGF3IGZvcm0KICAgIGNvbnN0IGFycmFuZ2VtZW50VHlwZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcnJhbmdlbWVudFR5cGVTZWxlY3QnKS52YWx1ZSB8fCBfaW5mZXJBcnJhbmdlbWVudFR5cGUoZGF0YS5leGNlcHRpb25zWzBdIHx8ICcnKTsKICAgIC8vIFJlc29sdmUgYXJyYW5nZW1lbnQgcnVsZSBlYXJseSDigJQgdXNlZCB0aHJvdWdob3V0IGFsbCBwcm90b2NvbCBibG9ja3MgYW5kIGRhc2hib2FyZAogICAgY29uc3QgYXJyUnVsZSA9IHN0YXJrX3J1bGVzX2RiW2FycmFuZ2VtZW50VHlwZV0gfHwgbnVsbDsKCiAgICBjb25zdCBhcnJDaXRlID0gYXJyUnVsZSA/IGFycmFuZ2VtZW50VHlwZSArICcgLy8gJyArIGFyclJ1bGUuc3RhdHV0ZUNpdGUgOiAnNDIgQ0ZSIMKnIDQxMS4zNTcgQW5udWFsIEN5Y2xlJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1aVBlcmlvZCcpLmlubmVySFRNTCA9IGFyckNpdGU7CiAgICBjb25zdCBpc1ZvbHVtZURlcGVuZGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2b2x1bWVEZXBlbmRlbnRTZWxlY3QnKS52YWx1ZSA9PT0gJ3RydWUnID8gdHJ1ZQogICAgICA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2b2x1bWVEZXBlbmRlbnRTZWxlY3QnKS52YWx1ZSA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogdW5kZWZpbmVkOwogICAgY29uc3QgaGFzV3JpdHRlbkFncmVlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3cml0dGVuQWdyZWVtZW50U2VsZWN0JykudmFsdWUgPT09ICd0cnVlJyA/IHRydWUKICAgICAgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd3JpdHRlbkFncmVlbWVudFNlbGVjdCcpLnZhbHVlID09PSAnZmFsc2UnID8gZmFsc2UgOiB1bmRlZmluZWQ7CiAgICBjb25zdCBoYXNGbXZBcHByYWlzYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm12QXBwcmFpc2FsU2VsZWN0JykudmFsdWUgPT09ICd0cnVlJyA/IHRydWUKICAgICAgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm12QXBwcmFpc2FsU2VsZWN0JykudmFsdWUgPT09ICdmYWxzZScgPyBmYWxzZSA6IHVuZGVmaW5lZDsKICAgIGNvbnN0IG92ZXJwYXltZW50RGF0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvdmVycGF5bWVudERhdGVJbnB1dCcpLnZhbHVlOwoKICAgIGNvbnN0IHN5bnRoZXRpY0FycmFuZ2VtZW50ID0gewogICAgICBwaHlzaWNpYW5OYW1lOiBkYXRhLnNwZWNpYWx0eSwKICAgICAgbnBpOiAnMDAwMDAwMDAwMCcsCiAgICAgIGFycmFuZ2VtZW50VHlwZSwKICAgICAgYW5udWFsQ29tcGVuc2F0aW9uOiB2YWxCLAogICAgICBpc1ZvbHVtZURlcGVuZGVudCwKICAgICAgaGFzV3JpdHRlbkFncmVlbWVudCwKICAgICAgaGFzRm12QXBwcmFpc2FsCiAgICB9OwogICAgY29uc3Qgc2FmZUFyciA9IHZhbGlkYXRlQXJyYW5nZW1lbnRzKFtzeW50aGV0aWNBcnJhbmdlbWVudF0pOwogICAgY29uc3QgbGVkZ2VyID0gYnVpbGROcGlMZWRnZXIoc2FmZUFycik7CiAgICBjb25zdCBhZHZhbmNlZFJpc2sgPSBzYWZlQXJyLmxlbmd0aCA/IGFzc2Vzc0FkdmFuY2VkU3RhcmtSaXNrKHNhZmVBcnJbMF0sIHN0YXJrX3J1bGVzX2RiLCBsZWRnZXIpIDogUklTS19TVEFUVVMuSU5DT01QTEVURTsKCiAgICAvLyBCdWlsZCBvdmVycGF5bWVudCBpbmNpZGVudCDigJQgdXNlIGFjdHVhbCBjb21wZW5zYXRpb24gYXMgYW1vdW50IG93ZWQsIGZpcmUgb24gZGF0ZSBhbG9uZQogICAgY29uc3Qgc3ludGhldGljT3ZlcnBheW1lbnRzID0gb3ZlcnBheW1lbnREYXRlID8gW3sKICAgICAgaW5jaWRlbnRJZDogJ09WUC0nICsgc2VsZWN0VmFsICsgJy0nICsgb3ZlcnBheW1lbnREYXRlLAogICAgICBkYXRlSWRlbnRpZmllZDogb3ZlcnBheW1lbnREYXRlLAogICAgICBhbW91bnRPd2VkOiB2YWxCID4gMCA/IHZhbEIgOiAwLAogICAgICBpc1RvbGxlZDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvbGxlZFNlbGVjdCcpPy52YWx1ZSA9PT0gJ3RydWUnCiAgICB9XSA6IFtdOwoKICAgIC8vIEdlbmVyYXRlIGV4ZWN1dGl2ZSBkYXNoYm9hcmQKICAgIHdpbmRvdy5fbGFzdFN0YXJrRGFzaGJvYXJkID0gZ2VuZXJhdGVFeGVjdXRpdmVEYXNoYm9hcmQoCiAgICAgIHNhZmVBcnIubGVuZ3RoID8gc2FmZUFyciA6IFtzeW50aGV0aWNBcnJhbmdlbWVudF0sCiAgICAgIHN5bnRoZXRpY092ZXJwYXltZW50cwogICAgKTsKICAgIC8vIEF0dGFjaCBjb250ZXh0IGZpZWxkcyBmb3IgZGFzaGJvYXJkIHJlbmRlcmluZwogICAgd2luZG93Ll9sYXN0U3RhcmtEYXNoYm9hcmQuX3NwZWNpYWx0eVJpc2tMZXZlbCA9IGRhdGEucmlza19sZXZlbDsKICAgIHdpbmRvdy5fbGFzdFN0YXJrRGFzaGJvYXJkLl92YWx1YXRpb25TdGFuZGFyZCA9IGFyclJ1bGUgPyBhcnJSdWxlLnZhbHVhdGlvblN0YW5kYXJkIDogJ+KAlCc7CiAgICB3aW5kb3cuX2xhc3RTdGFya0Rhc2hib2FyZC5fZm12Q2FwUGN0ID0gZm12Q2FwUGN0OwogICAgd2luZG93Ll9sYXN0U3RhcmtEYXNoYm9hcmQuX2ZtdkNhcCA9IGNhcDsKICAgIHdpbmRvdy5fbGFzdFN0YXJrRGFzaGJvYXJkLl9hbm51YWxDb21wID0gdmFsQjsKICAgIHdpbmRvdy5fbGFzdFN0YXJrRGFzaGJvYXJkLl9ob3VybHlSYXRlID0gaG91cmx5UmF0ZTsKICAgIHdpbmRvdy5fbGFzdFN0YXJrRGFzaGJvYXJkLl9pbXBsaWVkQW5udWFsSG91cnMgPSBpbXBsaWVkQW5udWFsSG91cnM7CiAgICB3aW5kb3cuX2xhc3RTdGFya0Rhc2hib2FyZC5fcmVmZXJyYWxFbmNvdW50ZXJzID0gcmVmZXJyYWxFbmNvdW50ZXJzOwogICAgd2luZG93Ll9sYXN0U3RhcmtEYXNoYm9hcmQuX3BlckVuY291bnRlckNvbXAgPSBwZXJFbmNvdW50ZXJDb21wOwoKICAgIC8vIElOQ09NUExFVEUgPSBtaXNzaW5nIHJlcXVpcmVkIGRyb3Bkb3ducyDigJQgc2hvdyBndWlkYW5jZSwgbm90IGEgZmFsc2UgYnJlYWNoCiAgICBpZiAoYWR2YW5jZWRSaXNrLnN0YXJ0c1dpdGgoJ0lOQ09NUExFVEUnKSkgewogICAgICBzdGF0dXNFbC5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9InN0YXR1cy1iYWRnZSIgc3R5bGU9ImJhY2tncm91bmQ6cmdiYSgyNTUsMTg0LDAsMC4xNSk7Y29sb3I6dmFyKC0td2FybmluZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS13YXJuaW5nKTsiPuKamSBJTkNPTVBMRVRFIOKAlCBTRUxFQ1QgQVJSQU5HRU1FTlQgVFlQRSwgVk9MVU1FIERFUEVOREVOQ1kgJiBXUklUVEVOIEFHUkVFTUVOVDwvc3Bhbj4nOwogICAgICBwY3RFbC5zdHlsZS5jb2xvciA9ICJ2YXIoLS10ZXh0LW11dGVkKSI7CiAgICAgIHVwZGF0ZVByb2dyZXNzQmFyKGZtdkNhcFBjdCwgJ3dhcm4nKTsKICAgICAgcHJvdG9jb2xXcmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIGFsZXJ0QmFubmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIGludGVsQmxvY2suc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgYnRuLmlubmVyVGV4dCA9ICJFeGVjdXRlIE1hdHJpeCBBbmFseXNpcyI7IGJ0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgICByZXR1cm47CiAgICB9CgogICAgY29uc3QgYnJlYWNoID0gYWR2YW5jZWRSaXNrLnN0YXJ0c1dpdGgoJ0hJR0ggQUxFUlQnKTsKICAgIGNvbnN0IG1vZGVyYXRlID0gYWR2YW5jZWRSaXNrLnN0YXJ0c1dpdGgoJ01PREVSQVRFJyk7CgogICAgaWYgKGJyZWFjaCkgewogICAgICBzdGF0dXNFbC5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9InN0YXR1cy1iYWRnZSBzdGF0dXMtZmFpbCI+8J+aqCBDUklUSUNBTCBTVEFSSyBMQVcgLyBGTVYgQlJFQUNIIEZMQUdHRUQ8L3NwYW4+JzsKICAgICAgcGN0RWwuc3R5bGUuY29sb3IgPSAidmFyKC0tZGFuZ2VyKSI7CiAgICAgIHVwZGF0ZVByb2dyZXNzQmFyKGZtdkNhcFBjdCwgJ2JyZWFjaCcpOwogICAgICBhZGRUb0hpc3RvcnkoJ0hFQUxUSENBUkUnLCBkYXRhLnNwZWNpYWx0eSwgJ0ZNViBCUkVBQ0gnLCAoZm12Q2FwUGN0KjEwMCkudG9GaXhlZCgxKSsnJScpOwoKICAgICAgcHJvdG9jb2xXcmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvdG9jb2xUaXRsZScpLmlubmVyVGV4dCA9IGBTdGFyayBMYXcgQXVkaXQgJiBNaXRpZ2F0aW9uIFByb3RvY29sIC8vICR7ZGF0YS5zcGVjaWFsdHl9YDsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb3RvY29sU2V2ZXJpdHknKS5pbm5lclRleHQgPSAiSElHSCBBVURJVCBSSVNLIjsKICAgICAgICAgIHRyeSB7IG5vdGlmeUFkbWluRm9yRmFpbHVyZShyLml0ZW0pOyB9IGNhdGNoKGUpe2NvbnNvbGUud2Fybignbm90aWZ5QWRtaW5Gb3JGYWlsdXJlIGZhaWxlZCcsZSk7fSAKICAgICAgICAgIC8vIGRvIG5vdCByZXF1ZXVlCiAgICAgIGNvbnN0IGJyZWFjaFJlcVRleHQgPSBhcnJSdWxlID8gYDxicj48YnI+PHN0cm9uZz5SZXF1aXJlbWVudHMgKCR7YXJyYW5nZW1lbnRUeXBlfSk6PC9zdHJvbmc+PGJyPiR7YXJyUnVsZS5yZXF1aXJlbWVudHN9YCA6ICcnOwogICAgICBjb25zdCBicmVhY2hQcm9oaWJUZXh0ID0gYXJyUnVsZSAmJiBhcnJSdWxlLnByb2hpYml0ZWRFbGVtZW50cy5sZW5ndGggPyBgPGJyPjxicj48c3Ryb25nPlByb2hpYml0ZWQgRWxlbWVudHM6PC9zdHJvbmc+PGJyPiR7YXJyUnVsZS5wcm9oaWJpdGVkRWxlbWVudHMuam9pbignPGJyPicpfWAgOiAnJzsKICAgICAgY29uc3QgYnJlYWNoQ1JUZXh0ID0gYXJyUnVsZSA/IGA8YnI+PGJyPjxzdHJvbmc+Q29tbWVyY2lhbCBSZWFzb25hYmxlbmVzcyBTdGFuZGFyZDo8L3N0cm9uZz48YnI+JHthcnJSdWxlLmNvbW1lcmNpYWxSZWFzb25hYmxlbmVzc31gIDogJyc7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm90b2NvbFJpc2tDb25zZXF1ZW5jZScpLmlubmVySFRNTCA9IGA8c3Ryb25nPkVuZ2luZSBSZXN1bHQ6PC9zdHJvbmc+ICR7YWR2YW5jZWRSaXNrfTxicj48c3Ryb25nPlN0YXR1dG9yeSBFeHBvc3VyZTo8L3N0cm9uZz4gRkNBIHRyZWJsZSBkYW1hZ2VzICsgQ01QIHVwIHRvICQke3N0YXJrX2NvbnN0YW50cy5iYXNlQ21wUmF0ZS50b0xvY2FsZVN0cmluZygpfSBwZXIgcHJvaGliaXRlZCBzZXJ2aWNlIHwgQ2lyY3VtdmVudGlvbiBzY2hlbWU6ICQke3N0YXJrX2NvbnN0YW50cy5jaXJjdW12ZW50aW9uU2NoZW1lUmF0ZS50b0xvY2FsZVN0cmluZygpfSR7YnJlYWNoUmVxVGV4dH0ke2JyZWFjaFByb2hpYlRleHR9JHticmVhY2hDUlRleHR9YDsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb3RvY29sU3RlcHMnKS5pbm5lckhUTUwgPSBgPHN0cm9uZz5SZXF1aXJlZCBTdGF0dXRvcnkgRXhjZXB0aW9uczo8L3N0cm9uZz48YnI+JHtkYXRhLmV4Y2VwdGlvbnMuam9pbignPGJyPicpfTxicj48YnI+PHN0cm9uZz5TcGVjaWFsdHkgUmlzayBQcm9maWxlOjwvc3Ryb25nPiAke2RhdGEucmlza19sZXZlbH08YnI+PGJyPjxzdHJvbmc+UmVzb2x1dGlvbiBTdGVwczo8L3N0cm9uZz48YnI+MS4gU3VzcGVuZCBub24tY29tcGxpYW50IGNvbXBlbnNhdGlvbiBkaXNidXJzZW1lbnRzIGltbWVkaWF0ZWx5Ljxicj4yLiBQZXJmb3JtIGluZGVwZW5kZW50IEZNViBhcHByYWlzYWwgKHZhbHVhdGlvbiBzdGFuZGFyZDogJHthcnJSdWxlID8gYXJyUnVsZS52YWx1YXRpb25TdGFuZGFyZCA6ICdGTVYnfSkuPGJyPjMuIEV2YWx1YXRlIENNUyBTUkRQIHNlbGYtZGlzY2xvc3VyZS48YnI+NC4gUmVzdHJ1Y3R1cmUgYXJyYW5nZW1lbnQgdG8gbWVldCBleGNlcHRpb24gcmVxdWlyZW1lbnRzIGFib3ZlLmA7CgogICAgICBpbmplY3RVcGdyYWRlQmFubmVyKGRhdGEuc3BlY2lhbHR5LCBhbGVydEJhbm5lcik7CiAgICAgIHJlbmRlclN0YXJrRGFzaGJvYXJkKHdpbmRvdy5fbGFzdFN0YXJrRGFzaGJvYXJkKTsKICAgIH0gZWxzZSBpZiAobW9kZXJhdGUpIHsKICAgICAgc3RhdHVzRWwuaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPSJzdGF0dXMtYmFkZ2Ugc3RhdHVzLXdhcm4iPuKaoO+4jyBNT0RFUkFURSBSSVNLIOKAlCBMRUdBTCBSRVZJRVcgUkVRVUlSRUQ8L3NwYW4+JzsKICAgICAgcGN0RWwuc3R5bGUuY29sb3IgPSAidmFyKC0td2FybmluZykiOwogICAgICB1cGRhdGVQcm9ncmVzc0JhcihmbXZDYXBQY3QsICd3YXJuJyk7CiAgICAgIGFkZFRvSGlzdG9yeSgnSEVBTFRIQ0FSRScsIGRhdGEuc3BlY2lhbHR5LCAnTU9ERVJBVEUgUklTSycsIChmbXZDYXBQY3QqMTAwKS50b0ZpeGVkKDEpKyclJyk7CgogICAgICBwcm90b2NvbFdyYXBwZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm90b2NvbFRpdGxlJykuaW5uZXJUZXh0ID0gYE1vZGVyYXRlIFJpc2sgUHJvdG9jb2wgLy8gJHtkYXRhLnNwZWNpYWx0eX1gOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvdG9jb2xTZXZlcml0eScpLmlubmVyVGV4dCA9ICJNT0RFUkFURSBSSVNLIjsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb3RvY29sU2V2ZXJpdHknKS5jbGFzc05hbWUgPSAic3RhdHVzLWJhZGdlIHN0YXR1cy13YXJuIjsKICAgICAgY29uc3QgcmVxVGV4dCA9IGFyclJ1bGUgPyBgPGJyPjxicj48c3Ryb25nPlJlcXVpcmVtZW50cyAoJHthcnJhbmdlbWVudFR5cGV9KTo8L3N0cm9uZz48YnI+JHthcnJSdWxlLnJlcXVpcmVtZW50c31gIDogJyc7CiAgICAgIGNvbnN0IHByb2hpYlRleHQgPSBhcnJSdWxlICYmIGFyclJ1bGUucHJvaGliaXRlZEVsZW1lbnRzLmxlbmd0aCA/IGA8YnI+PGJyPjxzdHJvbmc+UHJvaGliaXRlZCBFbGVtZW50czo8L3N0cm9uZz48YnI+JHthcnJSdWxlLnByb2hpYml0ZWRFbGVtZW50cy5qb2luKCc8YnI+Jyl9YCA6ICcnOwogICAgICBjb25zdCBjclRleHQgPSBhcnJSdWxlID8gYDxicj48YnI+PHN0cm9uZz5Db21tZXJjaWFsIFJlYXNvbmFibGVuZXNzIFN0YW5kYXJkOjwvc3Ryb25nPjxicj4ke2FyclJ1bGUuY29tbWVyY2lhbFJlYXNvbmFibGVuZXNzfWAgOiAnJzsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb3RvY29sUmlza0NvbnNlcXVlbmNlJykuaW5uZXJIVE1MID0gYDxzdHJvbmc+RW5naW5lIFJlc3VsdDo8L3N0cm9uZz4gJHthZHZhbmNlZFJpc2t9PGJyPjxzdHJvbmc+U3BlY2lhbHR5IFJpc2sgUHJvZmlsZTo8L3N0cm9uZz4gJHtkYXRhLnJpc2tfbGV2ZWx9JHtyZXFUZXh0fSR7cHJvaGliVGV4dH0ke2NyVGV4dH1gOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvdG9jb2xTdGVwcycpLmlubmVySFRNTCA9IGA8c3Ryb25nPkFjdGlvbiBTdGVwczo8L3N0cm9uZz48YnI+MS4gT2J0YWluIGluZGVwZW5kZW50IEZNViBhcHByYWlzYWwgKHZhbHVhdGlvbiBzdGFuZGFyZDogJHthcnJSdWxlID8gYXJyUnVsZS52YWx1YXRpb25TdGFuZGFyZCA6ICdGTVYnfSkuPGJyPjIuIENvbmZpcm0gd3JpdHRlbiBhZ3JlZW1lbnQgaXMgZXhlY3V0ZWQuPGJyPjMuIERvY3VtZW50IGNvbW1lcmNpYWwgcmVhc29uYWJsZW5lc3MgcGVyIHN0YW5kYXJkIGFib3ZlLjxicj40LiBSZXZpZXcgcHJvaGliaXRlZCBlbGVtZW50cyBsaXN0IGFuZCByZW1lZGlhdGUgYW55IG1hdGNoZXMuYDsKCiAgICAgIGluamVjdFVwZ3JhZGVCYW5uZXIoZGF0YS5zcGVjaWFsdHksIGFsZXJ0QmFubmVyKTsKICAgICAgcmVuZGVyU3RhcmtEYXNoYm9hcmQod2luZG93Ll9sYXN0U3RhcmtEYXNoYm9hcmQpOwogICAgfSBlbHNlIHsKICAgICAgc3RhdHVzRWwuaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPSJzdGF0dXMtYmFkZ2Ugc3RhdHVzLXBhc3MiPuKckyBDT01QRU5TQVRJT04gV0lUSElOIEZNViBCRU5DSE1BUks8L3NwYW4+JzsKICAgICAgcGN0RWwuc3R5bGUuY29sb3IgPSAidmFyKC0tYWNjZW50KSI7CiAgICAgIGFsZXJ0QmFubmVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgIGludGVsQmxvY2suc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgIHVwZGF0ZVByb2dyZXNzQmFyKGZtdkNhcFBjdCwgJ3Bhc3MnKTsKICAgICAgYWRkVG9IaXN0b3J5KCdIRUFMVEhDQVJFJywgZGF0YS5zcGVjaWFsdHksICdDTEVBUicsIChmbXZDYXBQY3QqMTAwKS50b0ZpeGVkKDEpKyclJyk7CiAgICAgIHJlbmRlclN0YXJrRGFzaGJvYXJkKHdpbmRvdy5fbGFzdFN0YXJrRGFzaGJvYXJkKTsKICAgIH0KCiAgICAvLyBCYWRnZSAxIOKAlCBTdGFyayBGTVY6IGJyZWFjaD1ULCBtb2RlcmF0ZT1QLCBjb21wbGlhbnQ9RQogICAgcmVuZGVyQmFkZ2UoMSwgaGFzS2V5ID8gKGJyZWFjaCA/ICJUIiA6IG1vZGVyYXRlID8gIlAiIDogIkUiKSA6ICJMT0NLRUQiKTsKICAgIC8vIEJhZGdlIDIg4oCUIEFLUyBTYWZlSGFyYm9yOiBGTVYgYXBwcmFpc2FsIGRvY3VtZW50ZWQ9RSwgbWlzc2luZz1ULCB1bmtub3duPVAKICAgIHJlbmRlckJhZGdlKDIsIGhhc0tleSA/IChoYXNGbXZBcHByYWlzYWwgPT09IHRydWUgPyAiRSIgOiBoYXNGbXZBcHByYWlzYWwgPT09IGZhbHNlID8gIlQiIDogIlAiKSA6ICJMT0NLRUQiKTsKICAgIC8vIEJhZGdlIDMg4oCUIEdQTyBTdHJ1Y3R1cmU6IHdyaXR0ZW4gbWFuZGF0ZSByZXF1aXJlZCBhbmQgbWV0PUUsIHJlcXVpcmVkIGFuZCBtaXNzaW5nPVQsIG5vdCByZXF1aXJlZD1FCiAgICByZW5kZXJCYWRnZSgzLCBoYXNLZXkgPyAoYXJyUnVsZSAmJiBhcnJSdWxlLndyaXR0ZW5NYW5kYXRlID8gKGhhc1dyaXR0ZW5BZ3JlZW1lbnQgPyAiRSIgOiAiVCIpIDogIkUiKSA6ICJMT0NLRUQiKTsKICAgIC8vIEJhZGdlIDQg4oCUIEJvbmFGaWRlIEVtcDogZW1wbG95bWVudCBleGNlcHRpb24gYWN0aXZlPUUsIGVtcGxveW1lbnQrYnJlYWNoPVQsIG90aGVyPUUKICAgIHJlbmRlckJhZGdlKDQsIGhhc0tleSA/IChhcnJhbmdlbWVudFR5cGUgPT09ICJCb25hIEZpZGUgRW1wbG95bWVudCIgPyAoYnJlYWNoID8gIlQiIDogIkUiKSA6ICJFIikgOiAiTE9DS0VEIik7CiAgICAvLyBCYWRnZSA1IOKAlCBJbmRpcmVjdCBSZWY6IHJlZmVycmFsIHZvbHVtZSB0aWVycwogICAgcmVuZGVyQmFkZ2UoNSwgaGFzS2V5ID8gKHJlZmVycmFsRW5jb3VudGVycyA+IDAgPyAocmVmZXJyYWxFbmNvdW50ZXJzID4gNTAwID8gIlQiIDogIlAiKSA6ICJFIikgOiAiTE9DS0VEIik7CiAgICAvLyBCYWRnZSA2IOKAlCBDTVMgRGlzY2xvc3VyZTogb3ZlcnBheW1lbnQgZGF0ZSBlbnRlcmVkID0gNjAtZGF5IGNsb2NrIGFjdGl2ZQogICAgcmVuZGVyQmFkZ2UoNiwgaGFzS2V5ID8gKG92ZXJwYXltZW50RGF0ZSA/ICJUIiA6ICJFIikgOiAiTE9DS0VEIik7CiAgICAvLyBCYWRnZSA3IOKAlCBGQ0EgTGlhYmlsaXR5OiBicmVhY2g9VCwgbW9kZXJhdGU9UCwgY29tcGxpYW50PUUKICAgIHJlbmRlckJhZGdlKDcsIGhhc0tleSA/IChicmVhY2ggPyAiVCIgOiBtb2RlcmF0ZSA/ICJQIiA6ICJFIikgOiAiTE9DS0VEIik7CiAgfQoKICBidG4uaW5uZXJUZXh0ID0gIkV4ZWN1dGUgTWF0cml4IEFuYWx5c2lzIjsgYnRuLmRpc2FibGVkID0gZmFsc2U7Cn0KCi8vIEVOSEFOQ0VEIE5PTi1EVVBMSUNBVElORyBCQURHRSBSRU5ERVJFUiBNQVAgV0lUSCBNVUxUSS1TVFJJTkcgU1VQUE9SVApjb25zdCBiYWRnZUJhc2VOYW1lcyA9IHsKICBuZXh1czogWydTYWFTJywgJ0FwcGFyZWwnLCAnU3VwcHMnLCAnUHJlcC4gRm9vZCcsICdBbGNvaG9sJywgJ01hcmtldHBsYWNlJywgJ0IyQiBSZXNhbGUnXSwKICBsb2dpc3RpY3M6IFsnU09MQVMnLCAnVVMgQ0JQJywgJ0dBQ0MnLCAnRVUgSUNTMicsICdGTUMgT1RJJywgJ0VESSBTRUcnLCAnU0xBIFdJTiddLAogIGhlYWx0aGNhcmU6IFsnU3RhcmsgRk1WJywgJ0FLUyBTYWZlSGFyYm9yJywgJ0dQTyBTdHJ1Y3R1cmUnLCAnQm9uYUZpZGUgRW1wJywgJ0luZGlyZWN0IFJlZicsICdDTVMgRGlzY2xvc3VyZScsICdGQ0EgTGlhYmlsaXR5J10KfTsKCmZ1bmN0aW9uIHJlbmRlckJhZGdlKGluZGV4LCBzdGF0dXMpIHsKICBjb25zdCBjdXJyZW50VGFiID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRhYi1idG4uYWN0aXZlJykuaWQucmVwbGFjZSgndGFiXycsICcnKTsKICBjb25zdCBiYXNlTmFtZXMgPSBiYWRnZUJhc2VOYW1lc1tjdXJyZW50VGFiXSB8fCBbJ05vZGUgMScsICdOb2RlIDInLCAnTm9kZSAzJywgJ05vZGUgNCcsICdOb2RlIDUnLCAnTm9kZSA2JywgJ05vZGUgNyddOwogIGNvbnN0IGVsSWQgPSBgYmFkZ2UwJHtpbmRleH1gOwogIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxJZCk7CiAgaWYgKCFlbCkgcmV0dXJuOwogIAogIGxldCBsYWJlbCA9IGJhc2VOYW1lc1tpbmRleCAtIDFdOwogIGVsLmNsYXNzTmFtZSA9ICdiYWRnZSc7CiAgCiAgaWYgKHN0YXR1cyA9PT0gJ0xPQ0tFRCcpIHsKICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2JhZGdlLWwnKTsKICAgIGVsLmlubmVyVGV4dCA9IGAke2xhYmVsfSBbTE9DS0VEXWA7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBpc0hDID0gY3VycmVudFRhYiA9PT0gJ2hlYWx0aGNhcmUnOwogIGlmIChzdGF0dXMgPT09ICdUJykgeyAKICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2JhZGdlLXQnKTsgCiAgICBlbC5pbm5lclRleHQgPSBgJHtsYWJlbH0gWyR7aXNIQyA/ICdGTEFHR0VEJyA6ICdUQVgnfV1gOyAKICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ0UnKSB7IAogICAgZWwuY2xhc3NMaXN0LmFkZCgnYmFkZ2UtZScpOyAKICAgIGVsLmlubmVyVGV4dCA9IGAke2xhYmVsfSBbJHtpc0hDID8gJ0NMRUFSJyA6ICdFWEVNUFQnfV1gOyAKICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ1AnKSB7IAogICAgZWwuY2xhc3NMaXN0LmFkZCgnYmFkZ2UtcCcpOyAKICAgIGVsLmlubmVyVGV4dCA9IGAke2xhYmVsfSBbJHtpc0hDID8gJ1JFVklFVycgOiAnUEFSVElBTCd9XWA7IAogIH0gZWxzZSBpZiAoc3RhdHVzLmluY2x1ZGVzKCdQUk9ISUJJVEVEJykgfHwgc3RhdHVzLmluY2x1ZGVzKCdTVFJJQ1QnKSB8fCBzdGF0dXMuaW5jbHVkZXMoJ1JFU1RSSUNURUQnKSkgewogICAgZWwuY2xhc3NMaXN0LmFkZCgnYmFkZ2UtdCcpOwogICAgZWwuaW5uZXJUZXh0ID0gYCR7bGFiZWx9IFske3N0YXR1c31dYDsKICB9IGVsc2UgaWYgKHN0YXR1cy5pbmNsdWRlcygnQUxMT1dFRCcpIHx8IHN0YXR1cy5pbmNsdWRlcygnWUVTJykgfHwgc3RhdHVzLmluY2x1ZGVzKCdDT1VOVFMnKSkgewogICAgZWwuY2xhc3NMaXN0LmFkZCgnYmFkZ2UtZScpOwogICAgZWwuaW5uZXJUZXh0ID0gYCR7bGFiZWx9IFske3N0YXR1c31dYDsKICB9IGVsc2UgaWYgKHN0YXR1cy5pbmNsdWRlcygnUkVNSVQnKSB8fCBzdGF0dXMuaW5jbHVkZXMoJ09OLVNJVEUnKSkgewogICAgZWwuY2xhc3NMaXN0LmFkZCgnYmFkZ2UtcCcpOwogICAgZWwuaW5uZXJUZXh0ID0gYCR7bGFiZWx9IFske3N0YXR1c31dYDsKICB9IGVsc2UgewogICAgZWwuY2xhc3NMaXN0LmFkZCgnYmFkZ2UtZScpOwogICAgZWwuaW5uZXJUZXh0ID0gYCR7bGFiZWx9IFske3N0YXR1c31dYDsKICB9Cn0KCi8vIFJPQlVTVCBKU09OIFJFUE9SVCBFWFBPUlRFUgpmdW5jdGlvbiBleHBvcnRBdWRpdFJlcG9ydEpTT04oKSB7CiAgY29uc3QgY3VycmVudFRhYiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50YWItYnRuLmFjdGl2ZScpLmlubmVyVGV4dDsKICBjb25zdCBhY3RpdmVOaWNoZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50YWItYnRuLmFjdGl2ZScpLmlkLnJlcGxhY2UoJ3RhYl8nLCAnJyk7CiAgY29uc3QgdGFyZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VpU3RhdGUnKS5pbm5lclRleHQ7CiAgY29uc3QgdXRpbGl6YXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndWlQY3QnKS5pbm5lclRleHQ7CiAgY29uc3QgdGhyZXNob2xkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VpUmV2JykuaW5uZXJUZXh0OwogIGNvbnN0IHdpbmRvd1BlcmlvZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1aVBlcmlvZCcpLmlubmVyVGV4dDsKCiAgY29uc3QgcmVwb3J0RGF0YSA9IHsKICAgIGVuZ2luZTogIkFzc2V0IExhYnMgSHViIHwgRW50ZXJwcmlzZSBFbmhhbmNlZCIsCiAgICBtb2R1bGU6IGN1cnJlbnRUYWIsCiAgICBtb2R1bGVfZGVzY3JpcHRpb246IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkeW5hbWljU3ViSGVhZGVyJykuaW5uZXJUZXh0LAogICAgdGFyZ2V0X2p1cmlzZGljdGlvbl9vcl9jYXRlZ29yeTogdGFyZ2V0LAogICAgY2FwYWNpdHlfdXRpbGl6YXRpb25fb3JfbWV0cmljOiB1dGlsaXphdGlvbiwKICAgIHN0YXR1dG9yeV9saW1pdF90aHJlc2hvbGQ6IHRocmVzaG9sZCwKICAgIGV2YWx1YXRpb25fd2luZG93OiB3aW5kb3dQZXJpb2QsCiAgICBleHBvcnRfdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkKICB9OwoKICAvLyBBdHRhY2ggbG9naXN0aWNzLXNwZWNpZmljIHJpc2sgaW50ZWxsaWdlbmNlIHdoZW4gYXZhaWxhYmxlCiAgaWYgKGFjdGl2ZU5pY2hlID09PSAnbG9naXN0aWNzJykgewogICAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VpU3RhdHVzJyk/LmlubmVyVGV4dCB8fCAnJzsKICAgIHJlcG9ydERhdGEuYXVkaXRfc3RhdHVzID0gc3RhdHVzOwogICAgcmVwb3J0RGF0YS5hdWRpdF9yaXNrX2luZGV4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jpc2tJbmRleFZhbHVlJyk/LmlubmVyVGV4dC5yZXBsYWNlKCdSaXNrIEluZGV4OiAnLCAnJykgfHwgbnVsbDsKICAgIHJlcG9ydERhdGEuYXVkaXRfcHJpb3JpdHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmlza1ByaW9yaXR5VmFsdWUnKT8uaW5uZXJUZXh0LnJlcGxhY2UoJ1ByaW9yaXR5OiAnLCAnJykgfHwgbnVsbDsKICAgIHJlcG9ydERhdGEuYXVkaXRfcmVjb21tZW5kYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmlza1JlY29tbWVuZGF0aW9uVmFsdWUnKT8uaW5uZXJUZXh0IHx8IG51bGw7CiAgfQoKICAvLyBJbmNsdWRlIHBhcnRuZXIgcHJvdmlzaW9uaW5nIGNvbnRleHQgaWYgYW55CiAgcmVwb3J0RGF0YS5wYXJ0bmVyX3Byb3Zpc2lvbmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhc3RfcGFydG5lcl9wcm92aXNpb25lZCcpIHx8IG51bGw7CgogIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkocmVwb3J0RGF0YSwgbnVsbCwgMildLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTsKICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogIGNvbnN0IGRvd25sb2FkQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogIGRvd25sb2FkQW5jaG9yLmhyZWYgPSB1cmw7CiAgZG93bmxvYWRBbmNob3IuZG93bmxvYWQgPSBgY29tcGxpYW5jZV9zbmFwc2hvdF8ke0RhdGUubm93KCl9Lmpzb25gOwogIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG93bmxvYWRBbmNob3IpOwogIGRvd25sb2FkQW5jaG9yLmNsaWNrKCk7CiAgc2V0VGltZW91dCgoKSA9PiB7CiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGRvd25sb2FkQW5jaG9yKTsKICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsKICB9LCAxMDApOwp9CgpmdW5jdGlvbiB0b2dnbGVBY2NvcmRpb25Db250YWluZXIoY29udGFpbmVySWQpIHsKICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVySWQpOwogIGNvbnN0IGFycm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Fycm93XycgKyBjb250YWluZXJJZCk7CiAgaWYgKCFjb250ZW50KSByZXR1cm47CgogIGlmIChjb250ZW50LnN0eWxlLm1heEhlaWdodCkgewogICAgY29udGVudC5zdHlsZS5tYXhIZWlnaHQgPSBudWxsOwogICAgaWYgKGFycm93KSBhcnJvdy5pbm5lclRleHQgPSAn4pa2JzsKICB9IGVsc2UgewogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFjY29yZGlvbi1jb250ZW50JykuZm9yRWFjaChlbCA9PiBlbC5zdHlsZS5tYXhIZWlnaHQgPSBudWxsKTsKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hY2NvcmRpb24tdHJpZ2dlciBzcGFuOmxhc3QtY2hpbGQnKS5mb3JFYWNoKGVsID0+IGVsLmlubmVyVGV4dCA9ICfilrYnKTsKICAgIGNvbnRlbnQuc3R5bGUubWF4SGVpZ2h0ID0gY29udGVudC5zY3JvbGxIZWlnaHQgKyAicHgiOwogICAgaWYgKGFycm93KSBhcnJvdy5pbm5lclRleHQgPSAn4pa8JzsKICB9Cn0KCmZ1bmN0aW9uIGluamVjdFVwZ3JhZGVCYW5uZXIobmFtZSwgZWxlbWVudCkgewogIGVsZW1lbnQuaW5uZXJIVE1MID0gJ+KaoO+4jyBDT01QTElBTkNFIEFDQ0VTUyBUSFJFQVQgRkxBR0dFRCBGT1I6ICcgKyBuYW1lLnRvVXBwZXJDYXNlKCkgKyAnLjxicj48cCBzdHlsZT0ibWFyZ2luOiA4cHggMDsgZm9udC1zaXplOiAxMXB4OyBjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGxpbmUtaGVpZ2h0OiAxLjQ7Ij5bIV0gUkVHVUxBVE9SWSBIQU5EU0hBS0UgRVhQSVJFRCAvLyBBQ0NFU1MgQ1JFREVOVElBTFMgUkVKRUNURUQuPGJyPlN0YXR1dG9yeSBjb21wbGlhbmNlIGxpbWl0cyBoYXZlIGJlZW4gYnJlYWNoZWQuIFRvIHVubWFzayBhbWVuZG1lbnQgY29kZSBzdHJpbmdzIGFuZCByZXNvbHV0aW9uIHNjcmlwdHMsIGNob29zZSBhbiBhdXRob3JpemVkIGV4ZWN1dGlvbiBwYXRoIGJlbG93LjwvcD48ZGl2IHN0eWxlPSJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogMTBweDsgbWFyZ2luLXRvcDogMTJweDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPjxhIGhyZWY9IiMiIG9uY2xpY2s9ImxhdW5jaFBhdGgwMVdvcmtmbG93KCk7IHJldHVybiBmYWxzZTsiIHN0eWxlPSJkaXNwbGF5OiBibG9jazsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYWNjZW50KTsgYmFja2dyb3VuZDogcmdiYSgwLDI0NSwxNTUsMC4wNSk7IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyBwYWRkaW5nOiAxMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAxMXB4OyI+Wz5dIFBBVEhfMDE6IFJFU09MVVRJT04gR0FURVdBWTwvYT48YSBocmVmPSIjIiBvbmNsaWNrPSJsYXVuY2hQYXRoMDJXb3JrZmxvdygpOyByZXR1cm4gZmFsc2U7IiBzdHlsZT0iZGlzcGxheTogYmxvY2s7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRhbmdlcik7IGJhY2tncm91bmQ6IHJnYmEoMjU1LDUxLDY4LDAuMDMpOyBjb2xvcjogdmFyKC0tZGFuZ2VyKTsgcGFkZGluZzogMTBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtd2VpZ2h0OiBib2xkOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMTFweDsiPls+XSBQQVRIXzAyOiAzMC1QQUdFIERPU1NJRVIgW1BERl08L2E+PC9kaXY+JzsKICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwp9CgovLyBQYXJ0bmVycyByZWdpc3RyeSAoY29uZmlndXJhYmxlKTogbWFwcyBwYXJ0bmVyIElEcyB0byBtZXRhZGF0YSBhbmQgcmVxdWlyZWQgZmllbGRzIHBlciBtb2R1bGUKY29uc3QgcGFydG5lcnNfcmVnaXN0cnkgPSB7CiAgQVZBTEFSQV9UQVhKQVI6IHsKICAgIGlkOiAnQVZBTEFSQV9UQVhKQVInLCBkaXNwbGF5TmFtZTogJ0F2YWxhcmEgQXZhVGF4IC8gVGF4SmFyJywgc2NvcGU6ICduZXh1cycsIGludGVncmF0aW9uVHlwZTogJ21pZGRsZXdhcmUnLCByZXF1aXJlZEZpZWxkczogWydwYXRoMDFFbWFpbCcsJ3BhdGgwMU1vZGUnXSwgd2ViaG9va1VybDogJycKICB9LAogIERFU0NBUlRFU19FREk6IHsKICAgIGlkOiAnREVTQ0FSVEVTX0VESScsIGRpc3BsYXlOYW1lOiAnRGVzY2FydGVzIC8gQ2FyZ29TbWFydCBFREkgQnJva2VyJywgc2NvcGU6ICdsb2dpc3RpY3MnLCBpbnRlZ3JhdGlvblR5cGU6ICdlZGlfYnJva2VyJywgcmVxdWlyZWRGaWVsZHM6IFsncGF0aDAxRW1haWwnLCdwYXRoMDFNb2RlJ10sIHdlYmhvb2tVcmw6ICcnCiAgfSwKICBTVEFSS19GTVZfU1VJVEU6IHsKICAgIGlkOiAnU1RBUktfRk1WX1NVSVRFJywgZGlzcGxheU5hbWU6ICdTdGFya0xhdyBQcm8gRk1WIFN1aXRlJywgc2NvcGU6ICdoZWFsdGhjYXJlJywgaW50ZWdyYXRpb25UeXBlOiAndmFsdWF0aW9uJywgcmVxdWlyZWRGaWVsZHM6IFsncGF0aDAxRW1haWwnLCdwYXRoMDFNb2RlJ10sIHdlYmhvb2tVcmw6ICcnCiAgfQp9OwoKLy8gTG9hZCBwZXJzaXN0ZWQgcGFydG5lciB3ZWJob29rIFVSTHMgKGFkbWluLWNvbmZpZ3VyYWJsZSkKdHJ5IHsKICBjb25zdCBwZXJzaXN0ZWQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwYXJ0bmVyc193ZWJob29rcycpIHx8ICd7fScpOwogIE9iamVjdC5rZXlzKHBlcnNpc3RlZCkuZm9yRWFjaChrID0+IHsKICAgIGlmIChwYXJ0bmVyc19yZWdpc3RyeVtrXSkgcGFydG5lcnNfcmVnaXN0cnlba10ud2ViaG9va1VybCA9IHBlcnNpc3RlZFtrXTsKICB9KTsKfSBjYXRjaCAoZSkgeyBjb25zb2xlLndhcm4oJ3BhcnRuZXJzX3dlYmhvb2tzOiBpbnZhbGlkIHBlcnNpc3RlZCBKU09OJywgZSk7IH0KCmZ1bmN0aW9uIHNldFBhcnRuZXJXZWJob29rVXJsKHBhcnRuZXJJZCwgdXJsKSB7CiAgaWYgKCFwYXJ0bmVyc19yZWdpc3RyeVtwYXJ0bmVySWRdKSByZXR1cm4gZmFsc2U7CiAgcGFydG5lcnNfcmVnaXN0cnlbcGFydG5lcklkXS53ZWJob29rVXJsID0gdXJsIHx8ICcnOwogIHRyeSB7CiAgICBjb25zdCBwZXJzaXN0ZWQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwYXJ0bmVyc193ZWJob29rcycpIHx8ICd7fScpOwogICAgcGVyc2lzdGVkW3BhcnRuZXJJZF0gPSB1cmwgfHwgJyc7CiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGFydG5lcnNfd2ViaG9va3MnLCBKU09OLnN0cmluZ2lmeShwZXJzaXN0ZWQpKTsKICAgIHJldHVybiB0cnVlOwogIH0gY2F0Y2ggKGUpIHsgY29uc29sZS5lcnJvcignZmFpbGVkIHBlcnNpc3Rpbmcgd2ViaG9vaycsIGUpOyByZXR1cm4gZmFsc2U7IH0KfQoKZnVuY3Rpb24gZ2V0UGFydG5lcldlYmhvb2tVcmwocGFydG5lcklkKSB7IHJldHVybiBwYXJ0bmVyc19yZWdpc3RyeVtwYXJ0bmVySWRdID8gcGFydG5lcnNfcmVnaXN0cnlbcGFydG5lcklkXS53ZWJob29rVXJsIDogJyc7IH0KCi8vIE5vdGlmaWNhdGlvbiBjb25maWc6IHBlcnNpc3RlZCBhZG1pbiBub3RpZmljYXRpb24gd2ViaG9vay9lbWFpbApmdW5jdGlvbiBzZXROb3RpZmljYXRpb25Db25maWcoY2ZnKSB7CiAgdHJ5IHsKICAgIGNvbnN0IGN1ciA9IE9iamVjdC5hc3NpZ24oe30sIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2FkbWluX25vdGlmaWNhdGlvbnMnKSB8fCAne30nKSwgY2ZnIHx8IHt9KTsKICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhZG1pbl9ub3RpZmljYXRpb25zJywgSlNPTi5zdHJpbmdpZnkoY3VyKSk7CiAgICByZXR1cm4gdHJ1ZTsKICB9IGNhdGNoIChlKSB7IGNvbnNvbGUuZXJyb3IoJ3NldE5vdGlmaWNhdGlvbkNvbmZpZyBmYWlsZWQnLCBlKTsgcmV0dXJuIGZhbHNlOyB9Cn0KCmZ1bmN0aW9uIGdldE5vdGlmaWNhdGlvbkNvbmZpZygpIHsKICB0cnkgeyByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYWRtaW5fbm90aWZpY2F0aW9ucycpIHx8ICd7fScpOyB9IGNhdGNoIChlKSB7IHJldHVybiB7fTsgfQp9CgovLyBSZXRyeSBxdWV1ZSBmb3IgZmFpbGVkIHByb3Zpc2lvbmluZyBhdHRlbXB0cyAocGVyc2lzdGVkKQpmdW5jdGlvbiBxdWV1ZVBlbmRpbmdQcm92aXNpb24ocmVxdWVzdCkgewogIHRyeSB7CiAgICBjb25zdCBxID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGVuZGluZ19wYXJ0bmVyX3Byb3Zpc2lvbnMnKSB8fCAnW10nKTsKICAgIC8vIGF0dGFjaCByZXRyeSBtZXRhZGF0YSBhbmQgc2NoZWR1bGluZy9sb2dnaW5nCiAgICByZXF1ZXN0LnJldHJ5Q291bnQgPSByZXF1ZXN0LnJldHJ5Q291bnQgfHwgMDsKICAgIHJlcXVlc3QubGFzdEF0dGVtcHQgPSByZXF1ZXN0Lmxhc3RBdHRlbXB0IHx8IG51bGw7CiAgICByZXF1ZXN0Lm5leHRBdHRlbXB0ID0gcmVxdWVzdC5uZXh0QXR0ZW1wdCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CiAgICByZXF1ZXN0LmxvZ3MgPSByZXF1ZXN0LmxvZ3MgfHwgW107CiAgICByZXF1ZXN0LmlkID0gcmVxdWVzdC5pZCB8fCAoJ3JlcV8nICsgRGF0ZS5ub3coKSArICdfJyArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSo5OTk5KSk7CiAgICBxLnB1c2gocmVxdWVzdCk7CiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGVuZGluZ19wYXJ0bmVyX3Byb3Zpc2lvbnMnLCBKU09OLnN0cmluZ2lmeShxKSk7CiAgfSBjYXRjaCAoZSkgeyBjb25zb2xlLmVycm9yKCdxdWV1ZVBlbmRpbmdQcm92aXNpb24gZmFpbGVkJywgZSk7IH0KfQoKLy8gREVESUNBVEVEIERBVEEtUklDSCBXT1JLRkxPVzogUEFUSCAwMSAoUkVTT0xVVElPTiBHQVRFV0FZICYgUEFSVE5FUiBTT0ZUV0FSRSkKZnVuY3Rpb24gbGF1bmNoUGF0aDAxV29ya2Zsb3cocHJlc2VsZWN0UGFydG5lcklkLCBwcmVmaWxsID0ge30pIHsKICBjb25zdCBibG9jayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRlbENhcHR1cmVCbG9jaycpOwogIGNvbnN0IGN1cnJlbnRUYWIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGFiLWJ0bi5hY3RpdmUnKS5pZC5yZXBsYWNlKCd0YWJfJywgJycpOwogIC8vIEJ1aWxkIHBhcnRuZXIgb3B0aW9ucyBmaWx0ZXJlZCBieSBtb2R1bGUgc2NvcGUKICBjb25zdCBvcHRpb25zID0gT2JqZWN0LmtleXMocGFydG5lcnNfcmVnaXN0cnkpLmZpbHRlcihrID0+IHBhcnRuZXJzX3JlZ2lzdHJ5W2tdLnNjb3BlID09PSBjdXJyZW50VGFiKS5tYXAoayA9PiB7CiAgICBjb25zdCBwID0gcGFydG5lcnNfcmVnaXN0cnlba107CiAgICByZXR1cm4gYDxvcHRpb24gdmFsdWU9IiR7cC5pZH0iPiR7cC5kaXNwbGF5TmFtZX08L29wdGlvbj5gOwogIH0pOwogIGNvbnN0IG9wdGlvbnNIdG1sID0gb3B0aW9ucy5sZW5ndGggPyBvcHRpb25zLmpvaW4oJycpIDogJzxvcHRpb24gdmFsdWU9IiI+LS0gTm8gcGFydG5lcnMgY29uZmlndXJlZCBmb3IgdGhpcyBtb2R1bGUgLS08L29wdGlvbj4nOwoKICBibG9jay5pbm5lckhUTUwgPSBgCiAgICA8ZGl2IHN0eWxlPSJwYWRkaW5nOjEwcHg7IGZvbnQtZmFtaWx5Om1vbm9zcGFjZTsiPgogICAgICA8ZGl2IGNsYXNzPSJyZXBvcnQtdGl0bGUiIHN0eWxlPSJjb2xvcjp2YXIoLS1hY2NlbnQpOyBib3JkZXItY29sb3I6cmdiYSgwLDI0NSwxNTUsMC4yKTsiPls+XSBQQVRIXzAxOiBSRVNPTFVUSU9OIEdBVEVXQVkgJiBQQVJUTkVSIFNPRlRXQVJFIFBST1ZJU0lPTklORzwvZGl2PgogICAgICA8cCBzdHlsZT0iZm9udC1zaXplOjExcHg7IGNvbG9yOnZhcigtLXRleHQtbXV0ZWQpOyBtYXJnaW4tYm90dG9tOjEycHg7IGxpbmUtaGVpZ2h0OjEuNDsiPlNlbGVjdCBhIHBhcnRuZXIgaW50ZWdyYXRpb24gZm9yIHRoZSBhY3RpdmUgbW9kdWxlLiBTdWJtaXR0aW5nIHdpbGwgcmVxdWVzdCBhIHByb3Zpc2lvbmluZyB0b2tlbiBhbmQgb3B0aW9uYWxseSBkaXNwYXRjaCBhbiBpbnRlZ3JhdGlvbiB3ZWJob29rIHRvIHlvdXIgc2VsZWN0ZWQgcGFydG5lci48L3A+CiAgICAgIDxmb3JtIGlkPSJwYXRoMDFGb3JtIiBvbnN1Ym1pdD0ic3VibWl0UGF0aDAxV29ya2Zsb3coZXZlbnQpIiBzdHlsZT0iZGlzcGxheTpncmlkOyBncmlkLWdhcDoxMnB4OyBjb2xvcjp2YXIoLS10ZXh0LW1haW4pOyI+CiAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4OyBmbGV4LWRpcmVjdGlvbjpjb2x1bW47Ij4KICAgICAgICAgIDxsYWJlbCBzdHlsZT0iZm9udC1zaXplOjEwcHg7IGNvbG9yOnZhcigtLW11dGVkKTsgZm9udC13ZWlnaHQ6NzAwOyBtYXJnaW4tYm90dG9tOjZweDsgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOyI+MDEgLy8gU2VsZWN0IFBhcnRuZXIgU29mdHdhcmUgSW50ZWdyYXRpb24gRW5naW5lPC9sYWJlbD4KICAgICAgICAgIDxzZWxlY3QgaWQ9InBhdGgwMVNvZnR3YXJlIiBjbGFzcz0iaW5wdXQtZmllbGQiIHJlcXVpcmVkIHN0eWxlPSJib3JkZXItcmFkaXVzOjRweDsiPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPi0tIENob29zZSBJbnRlZ3JhdGlvbiBNaWRkbGV3YXJlIC0tPC9vcHRpb24+CiAgICAgICAgICAgICR7b3B0aW9uc0h0bWx9CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7IGZsZXgtZGlyZWN0aW9uOmNvbHVtbjsiPgogICAgICAgICAgPGxhYmVsIHN0eWxlPSJmb250LXNpemU6MTBweDsgY29sb3I6dmFyKC0tbXV0ZWQpOyBmb250LXdlaWdodDo3MDA7IG1hcmdpbi1ib3R0b206NnB4OyB0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Ij4wMiAvLyBBdXRvbWF0ZWQgQVBJIFBhdGNoIERpc3BhdGNoIE1vZGU8L2xhYmVsPgogICAgICAgICAgPHNlbGVjdCBpZD0icGF0aDAxTW9kZSIgY2xhc3M9ImlucHV0LWZpZWxkIiByZXF1aXJlZCBzdHlsZT0iYm9yZGVyLXJhZGl1czo0cHg7Ij4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iSU1NRURJQVRFX1NZTkMiPkltbWVkaWF0ZSBSZWFsLVRpbWUgTGVkZ2VyIFN5bmNocm9uaXphdGlvbiAmIEF1dG8tUmVtaXR0YW5jZTwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJTVEFHRURfUkVWSUVXIj5TdGFnZWQgQ29tcGxpYW5jZSBRdWFyYW50aW5lICYgTWFudWFsIEF1ZGl0b3IgUmV2aWV3PC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7IGdhcDo4cHg7IG1hcmdpbi10b3A6OHB4OyI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iZW1haWwiIGlkPSJwYXRoMDFFbWFpbCIgY2xhc3M9ImlucHV0LWZpZWxkIiByZXF1aXJlZCBwbGFjZWhvbGRlcj0iRW50ZXIgYWRtaW5pc3RyYXRvciBlbWFpbCBmb3IgZ2F0ZXdheSBzeW5jLi4uIiBzdHlsZT0iZmxleDoxOyBib3JkZXItcmFkaXVzOjRweDsiPgogICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIHN0eWxlPSJwYWRkaW5nOjAgMjBweDsgYmFja2dyb3VuZDpyZ2JhKDAsMjQ1LDE1NSwwLjA1KTsgYm9yZGVyOjFweCBzb2xpZCB2YXIoLS1hY2NlbnQpOyBjb2xvcjp2YXIoLS1hY2NlbnQpOyBib3JkZXItcmFkaXVzOjRweDsgZm9udC1mYW1pbHk6bW9ub3NwYWNlOyBmb250LXNpemU6MTFweDsgZm9udC13ZWlnaHQ6Ym9sZDsgY3Vyc29yOnBvaW50ZXI7IGhlaWdodDo0NXB4OyB0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Ij5bPl0gRGVwbG95IEdhdGV3YXkgUGF0Y2g8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8bGFiZWwgc3R5bGU9ImZvbnQtc2l6ZToxMXB4OyBjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTsgbWFyZ2luLXRvcDo2cHg7Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJwYXRoMDFDb25zZW50IiByZXF1aXJlZCBzdHlsZT0ibWFyZ2luLXJpZ2h0OjhweDsiPkkgY29uc2VudCB0byBzaGFyZSB0aGVzZSBkZXRhaWxzIHdpdGggdGhlIHNlbGVjdGVkIHBhcnRuZXIgYW5kIHVuZGVyc3RhbmQgcGFydG5lciBwcm92aXNpb25pbmcgbWF5IGluaXRpYXRlIGZvbGxvdy11cCBjb21tdW5pY2F0aW9ucy48L2xhYmVsPgogICAgICA8L2Zvcm0+CiAgICA8L2Rpdj4KICBgOwogIGJsb2NrLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogIGJsb2NrLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnIH0pOwogIC8vIGFwcGx5IG9wdGlvbmFsIHByZWZpbGwgdmFsdWVzIGFmdGVyIERPTSBpbnNlcnRpb24KICBzZXRUaW1lb3V0KCgpID0+IHsKICAgIHRyeSB7CiAgICAgIGlmIChwcmVzZWxlY3RQYXJ0bmVySWQpIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXRoMDFTb2Z0d2FyZScpLnZhbHVlID0gcHJlc2VsZWN0UGFydG5lcklkOwogICAgICBpZiAocHJlZmlsbC5tb2RlKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGF0aDAxTW9kZScpLnZhbHVlID0gcHJlZmlsbC5tb2RlOwogICAgICBpZiAocHJlZmlsbC5lbWFpbCkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhdGgwMUVtYWlsJykudmFsdWUgPSBwcmVmaWxsLmVtYWlsOwogICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgaWYgZWxlbWVudHMgbWlzc2luZyAqLyB9CiAgfSwgNjApOwp9CgovLyBBZG1pbiBVSTogY29uZmlndXJlIHBhcnRuZXIgd2ViaG9vayBVUkxzCmZ1bmN0aW9uIGNvbmZpZ3VyZVBhcnRuZXJzVUkoKSB7CiAgY29uc3QgYmxvY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW50ZWxDYXB0dXJlQmxvY2snKTsKICBjb25zdCByb3dzID0gT2JqZWN0LmtleXMocGFydG5lcnNfcmVnaXN0cnkpLm1hcChrID0+IHsKICAgIGNvbnN0IHAgPSBwYXJ0bmVyc19yZWdpc3RyeVtrXTsKICAgIGNvbnN0IHVybCA9IHAud2ViaG9va1VybCB8fCAnJzsKICAgIHJldHVybiBgCiAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDsgZ2FwOjhweDsgYWxpZ24taXRlbXM6Y2VudGVyOyBtYXJnaW4tYm90dG9tOjhweDsiPgogICAgICAgIDxkaXYgc3R5bGU9ImZsZXg6MTsgZm9udC1zaXplOjEycHg7IGNvbG9yOnZhcigtLXRleHQtbWFpbik7Ij4ke3AuZGlzcGxheU5hbWV9IDxzcGFuIHN0eWxlPSJjb2xvcjp2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZToxMXB4OyI+KCR7cC5zY29wZX0pPC9zcGFuPjwvZGl2PgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBkYXRhLXBhcnRuZXItaWQ9IiR7cC5pZH0iIGNsYXNzPSJwYXJ0bmVyLXdlYmhvb2staW5wdXQgaW5wdXQtZmllbGQiIHBsYWNlaG9sZGVyPSJodHRwczovL3BhcnRuZXIuZXhhbXBsZS93ZWJob29rIiB2YWx1ZT0iJHt1cmx9IiBzdHlsZT0iZmxleDoyOyI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXNlY29uZGFyeS1hY3Rpb24iIG9uY2xpY2s9IihmdW5jdGlvbihlbCl7IGNvbnN0IGlkPWVsLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuZ2V0QXR0cmlidXRlKCdkYXRhLXBhcnRuZXItaWQnKTsgc2V0UGFydG5lcldlYmhvb2tVcmwoaWQsIGVsLnByZXZpb3VzRWxlbWVudFNpYmxpbmcudmFsdWUpOyBhbGVydCgnU2F2ZWQgZm9yICcraWQpOyB9KSh0aGlzKSI+U2F2ZTwvYnV0dG9uPgogICAgICA8L2Rpdj5gOwogIH0pLmpvaW4oJycpOwoKICBibG9jay5pbm5lckhUTUwgPSBgCiAgICA8ZGl2IHN0eWxlPSJwYWRkaW5nOjEycHg7IGZvbnQtZmFtaWx5Om1vbm9zcGFjZTsiPgogICAgICA8ZGl2IGNsYXNzPSJyZXBvcnQtdGl0bGUiIHN0eWxlPSJjb2xvcjp2YXIoLS1hY2NlbnQpOyI+W+KamV0gUGFydG5lciBDb25maWd1cmF0aW9uPC9kaXY+CiAgICAgIDxwIHN0eWxlPSJmb250LXNpemU6MTFweDsgY29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7IG1hcmdpbi1ib3R0b206MTJweDsiPlNldCBwYXJ0bmVyIHdlYmhvb2sgZW5kcG9pbnRzIHVzZWQgZm9yIHJlYWwgcHJvdmlzaW9uaW5nLiBWYWx1ZXMgYXJlIHN0b3JlZCBsb2NhbGx5IGluIHlvdXIgYnJvd3NlciAobG9jYWxTdG9yYWdlKS48L3A+CiAgICAgICR7cm93c30KICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDoxMnB4OyBmb250LXNpemU6MTFweDsgY29sb3I6dmFyKC0tdGV4dC1tdXRlZCkiPlRpcDogbGVhdmUgYmxhbmsgdG8gdXNlIHRoZSBzZWN1cmUgc2ltdWxhdGVkIHByb3Zpc2lvbmluZyBmYWxsYmFjay48L2Rpdj4KICAgICAgPGhyIHN0eWxlPSJtYXJnaW46MTJweCAwOyBib3JkZXItY29sb3I6dmFyKC0tYm9yZGVyKSI+CiAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMnB4OyBtYXJnaW4tdG9wOjhweDsiPgogICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtd2VpZ2h0OjcwMDsgbWFyZ2luLWJvdHRvbTo2cHg7Ij5Ob3RpZmljYXRpb24gU2V0dGluZ3M8L2Rpdj4KICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7IGdhcDo4cHg7IGFsaWduLWl0ZW1zOmNlbnRlcjsgbWFyZ2luLWJvdHRvbTo4cHg7Ij48aW5wdXQgaWQ9ImFkbWluTm90aWZ5V2ViaG9vayIgcGxhY2Vob2xkZXI9Imh0dHBzOi8vaG9va3MuZXhhbXBsZS9ub3RpZnkiIGNsYXNzPSJpbnB1dC1maWVsZCIgc3R5bGU9ImZsZXg6MjsiIHZhbHVlPSIkeyhnZXROb3RpZmljYXRpb25Db25maWcoKS53ZWJob29rVXJsfHwnJyl9Ij48aW5wdXQgaWQ9ImFkbWluTm90aWZ5RW1haWwiIHBsYWNlaG9sZGVyPSJhZG1pbkBjb21wYW55LmNvbSIgY2xhc3M9ImlucHV0LWZpZWxkIiBzdHlsZT0iZmxleDoxOyIgdmFsdWU9IiR7KGdldE5vdGlmaWNhdGlvbkNvbmZpZygpLmVtYWlsfHwnJyl9Ij48YnV0dG9uIGNsYXNzPSJidG4tc2Vjb25kYXJ5LWFjdGlvbiIgb25jbGljaz0iKGZ1bmN0aW9uKCl7IHNldE5vdGlmaWNhdGlvbkNvbmZpZyh7IHdlYmhvb2tVcmw6ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbWluTm90aWZ5V2ViaG9vaycpLnZhbHVlLnRyaW0oKSwgZW1haWw6ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbWluTm90aWZ5RW1haWwnKS52YWx1ZS50cmltKCkgfSk7IGFsZXJ0KCdOb3RpZmljYXRpb24gc2V0dGluZ3Mgc2F2ZWQnKTsgfSkoKSI+U2F2ZTwvYnV0dG9uPjwvZGl2PgogICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMXB4OyBjb2xvcjp2YXIoLS10ZXh0LW11dGVkKSI+Tm90aWZpY2F0aW9ucyB3aWxsIGJlIGF0dGVtcHRlZCB3aGVuIGEgcGFydG5lciBwcm92aXNpb25pbmcgcmVxdWVzdCBwZXJtYW5lbnRseSBmYWlscyBhZnRlciByZXRyaWVzLjwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PmA7CiAgYmxvY2suc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgYmxvY2suc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcgfSk7Cn0KCi8vIEF1dG8tc2VsZWN0IGJlc3QgcGFydG5lciBmb3IgdGhlIGN1cnJlbnQgbW9kdWxlIGFuZCBvcGVuIFBBVEhfMDEgd2l0aCBwcmVmaWxsZWQgdmFsdWVzCmZ1bmN0aW9uIG9wZW5CZXN0UGFydG5lckNUQSgpIHsKICBjb25zdCBjdXJyZW50TW9kdWxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRhYi1idG4uYWN0aXZlJykuaWQucmVwbGFjZSgndGFiXycsJycpOwogIGNvbnN0IHJpc2tUZXh0ID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyaXNrSW5kZXhWYWx1ZScpPy5pbm5lclRleHQgfHwgJ1Jpc2sgSW5kZXg6IDAnKTsKICBjb25zdCBtYXRjaCA9IHJpc2tUZXh0Lm1hdGNoKC8oWzAtOV0rKD86XC5bMC05XSspPykvKTsKICBjb25zdCByaXNrSW5kZXggPSBtYXRjaCA/IHBhcnNlRmxvYXQobWF0Y2hbMV0pIDogMDsKICBjb25zdCBjYW5kaWRhdGVzID0gT2JqZWN0LnZhbHVlcyhwYXJ0bmVyc19yZWdpc3RyeSkuZmlsdGVyKHAgPT4gcC5zY29wZSA9PT0gY3VycmVudE1vZHVsZSk7CiAgaWYgKCFjYW5kaWRhdGVzLmxlbmd0aCkgcmV0dXJuIGFsZXJ0KCdObyBwYXJ0bmVycyBjb25maWd1cmVkIGZvciB0aGlzIG1vZHVsZS4gT3BlbiBQYXJ0bmVyIENvbmZpZ3VyYXRpb24gdG8gYWRkIG9uZS4nKTsKICAvLyBCYXNpYyBzZWxlY3Rpb24gaGV1cmlzdGljOiBwaWNrIGZpcnN0IGNhbmRpZGF0ZTsgaWYgbXVsdGlwbGUsIGNob29zZSBieSBpbnRlZ3JhdGlvblR5cGUgd2VpZ2h0aW5nIGZvciBsb2dpc3RpY3MKICBsZXQgc2VsZWN0ZWQgPSBjYW5kaWRhdGVzWzBdOwogIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA+IDEgJiYgY3VycmVudE1vZHVsZSA9PT0gJ2xvZ2lzdGljcycpIHsKICAgIC8vIHByZWZlciBlZGlfYnJva2VyIGZvciBoaWdoIHJpc2sKICAgIGlmIChyaXNrSW5kZXggPiA2MCkgewogICAgICBjb25zdCBlZGkgPSBjYW5kaWRhdGVzLmZpbmQoYyA9PiBjLmludGVncmF0aW9uVHlwZSA9PT0gJ2VkaV9icm9rZXInKTsKICAgICAgaWYgKGVkaSkgc2VsZWN0ZWQgPSBlZGk7CiAgICB9CiAgfQogIGNvbnN0IHN1Z2dlc3RlZE1vZGUgPSByaXNrSW5kZXggPiA3MCA/ICdJTU1FRElBVEVfU1lOQycgOiAocmlza0luZGV4ID4gMzAgPyAnU1RBR0VEX1JFVklFVycgOiAnU1RBR0VEX1JFVklFVycpOwogIGNvbnN0IGxhc3RFbWFpbCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwYXRoMDFFbWFpbCcpIHx8ICcnOwogIGxhdW5jaFBhdGgwMVdvcmtmbG93KHNlbGVjdGVkLmlkLCB7IG1vZGU6IHN1Z2dlc3RlZE1vZGUsIGVtYWlsOiBsYXN0RW1haWwgfSk7Cn0KCi8vIFByb2Nlc3MgcXVldWVkIHBlbmRpbmcgcGFydG5lciBwcm92aXNpb25pbmcgcmVxdWVzdHMKZnVuY3Rpb24gcHJvY2Vzc1BlbmRpbmdQcm92aXNpb25zKCkgewogIHRyeSB7CiAgICBjb25zdCBxID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGVuZGluZ19wYXJ0bmVyX3Byb3Zpc2lvbnMnKSB8fCAnW10nKTsKICAgIGlmICghcS5sZW5ndGgpIHJldHVybiBhbGVydCgnTm8gcGVuZGluZyBwYXJ0bmVyIHByb3Zpc2lvbmluZyByZXF1ZXN0cy4nKTsKICAgIGNvbnN0IHN1bW1hcnkgPSB7IGF0dGVtcHRlZDogMCwgc3VjY2VzczogMCwgZmFpbGVkOiAwIH07CiAgICBjb25zdCBtYXhSZXRyaWVzID0gNjsKICAgIGNvbnN0IG5vd1RzID0gRGF0ZS5ub3coKTsKICAgIGNvbnN0IHRvQXR0ZW1wdCA9IHEuZmlsdGVyKGl0ZW0gPT4gewogICAgICB0cnkgeyByZXR1cm4gbmV3IERhdGUoaXRlbS5uZXh0QXR0ZW1wdCkuZ2V0VGltZSgpIDw9IG5vd1RzOyB9IGNhdGNoIChlKSB7IHJldHVybiB0cnVlOyB9CiAgICB9KTsKICAgIGlmICghdG9BdHRlbXB0Lmxlbmd0aCkgcmV0dXJuIGFsZXJ0KCdObyBwZW5kaW5nIGl0ZW1zIGFyZSBzY2hlZHVsZWQgZm9yIHJldHJ5IGF0IHRoaXMgdGltZS4nKTsKICAgIGNvbnN0IHByb21pc2VzID0gdG9BdHRlbXB0Lm1hcChpdGVtID0+IHsKICAgICAgc3VtbWFyeS5hdHRlbXB0ZWQrKzsKICAgICAgY29uc3QgcGFydG5lciA9IHBhcnRuZXJzX3JlZ2lzdHJ5W2l0ZW0ucGFydG5lcklkXTsKICAgICAgY29uc3Qgd2ViaG9vayA9IChwYXJ0bmVyICYmIChwYXJ0bmVyLndlYmhvb2tVcmwgfHwgZ2V0UGFydG5lcldlYmhvb2tVcmwocGFydG5lci5pZCkpKSB8fCAnJzsKICAgICAgaXRlbS5sYXN0QXR0ZW1wdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsKICAgICAgaXRlbS5sb2dzID0gaXRlbS5sb2dzIHx8IFtdOwogICAgICBpZiAoIXdlYmhvb2spIHsKICAgICAgICBpdGVtLnJldHJ5Q291bnQgPSAoaXRlbS5yZXRyeUNvdW50IHx8IDApICsgMTsKICAgICAgICBpdGVtLmxvZ3MucHVzaCh7IHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksIG9rOiBmYWxzZSwgcmVhc29uOiAnbm9fd2ViaG9va19jb25maWd1cmVkJyB9KTsKICAgICAgICAvLyBzY2hlZHVsZSBuZXh0IGF0dGVtcHQgd2l0aCBiYWNrb2ZmCiAgICAgICAgaXRlbS5uZXh0QXR0ZW1wdCA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBnZXRCYWNrb2ZmRGVsYXkoaXRlbS5yZXRyeUNvdW50KSkudG9JU09TdHJpbmcoKTsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgb2s6IGZhbHNlLCBpdGVtIH0pOwogICAgICB9CiAgICAgIHJldHVybiBmZXRjaCh3ZWJob29rLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoaXRlbS5wYXlsb2FkKSB9KQogICAgICAgIC50aGVuKHJlcyA9PiAoeyBvazogISFyZXMgJiYgcmVzLm9rLCBpdGVtLCBzdGF0dXM6IHJlcyAmJiByZXMuc3RhdHVzIH0pKQogICAgICAgIC5jYXRjaChlcnIgPT4gKHsgb2s6IGZhbHNlLCBpdGVtLCBlcnIgfSkpOwogICAgfSk7CiAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihyZXN1bHRzID0+IHsKICAgICAgY29uc3QgcmVtYWluaW5nID0gW107CiAgICAgIHEuZm9yRWFjaChvcmlnID0+IHsgLyoga2VlcCBvcmlnaW5hbCBvcmRlciBieSBkZWZhdWx0ICovIH0pOwogICAgICByZXN1bHRzLmZvckVhY2gociA9PiB7CiAgICAgICAgaWYgKHIub2spIHsKICAgICAgICAgIHN1bW1hcnkuc3VjY2VzcysrOwogICAgICAgICAgci5pdGVtLmxvZ3MucHVzaCh7IHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksIG9rOiB0cnVlLCBub3RlOiAncHJvdmlzaW9uX3N1Y2Nlc3MnIH0pOwogICAgICAgICAgYWRkVG9IaXN0b3J5KChyLml0ZW0ucGF5bG9hZCAmJiByLml0ZW0ucGF5bG9hZC5tb2R1bGUpIHx8ICd1bmtub3duJywgYFByb3Zpc2lvbjoke3IuaXRlbS5wYXJ0bmVySWR9YCwgJ1BST1ZJU0lPTkVEJywgJ24vYScpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByLml0ZW0ucmV0cnlDb3VudCA9IChyLml0ZW0ucmV0cnlDb3VudCB8fCAwKSArIDE7CiAgICAgICAgICByLml0ZW0ubG9ncy5wdXNoKHsgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgb2s6IGZhbHNlLCByZWFzb246IChyLmVyciAmJiByLmVyci5tZXNzYWdlKSB8fCAoci5zdGF0dXMgPyAnc3RhdHVzXycrci5zdGF0dXMgOiAndW5rbm93bl9lcnJvcicpIH0pOwogICAgICAgICAgaWYgKHIuaXRlbS5yZXRyeUNvdW50ID49IG1heFJldHJpZXMpIHsKICAgICAgICAgICAgc3VtbWFyeS5mYWlsZWQrKzsKICAgICAgICAgICAgICBhZGRUb0hpc3RvcnkoKHIuaXRlbS5wYXlsb2FkICYmIHIuaXRlbS5wYXlsb2FkLm1vZHVsZSkgfHwgJ3Vua25vd24nLCBgUHJvdmlzaW9uOiR7ci5pdGVtLnBhcnRuZXJJZH1gLCAnUFJPVklTSU9OX0ZBSUxFRCcsICduL2EnKTsKICAgICAgICAgICAgICB0cnkgeyBub3RpZnlBZG1pbkZvckZhaWx1cmUoci5pdGVtKTsgfSBjYXRjaChlKXtjb25zb2xlLndhcm4oJ25vdGlmeUFkbWluRm9yRmFpbHVyZSBmYWlsZWQnLGUpO30gCiAgICAgICAgICAgIC8vIGRvIG5vdCByZXF1ZXVlCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBzY2hlZHVsZSBuZXh0IGF0dGVtcHQgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmCiAgICAgICAgICAgIHIuaXRlbS5uZXh0QXR0ZW1wdCA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBnZXRCYWNrb2ZmRGVsYXkoci5pdGVtLnJldHJ5Q291bnQpKS50b0lTT1N0cmluZygpOwogICAgICAgICAgICByZW1haW5pbmcucHVzaChyLml0ZW0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIC8vIGFsc28ga2VlcCBhbnkgaXRlbXMgdGhhdCB3ZXJlIG5vdCBhdHRlbXB0ZWQgdGhpcyBydW4KICAgICAgY29uc3QgYXR0ZW1wdGVkSWRzID0gbmV3IFNldChyZXN1bHRzLm1hcChyID0+IHIuaXRlbSAmJiByLml0ZW0uaWQpKTsKICAgICAgcS5mb3JFYWNoKG9yaWcgPT4geyBpZiAoIWF0dGVtcHRlZElkcy5oYXMob3JpZy5pZCkpIHJlbWFpbmluZy5wdXNoKG9yaWcpOyB9KTsKICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3BlbmRpbmdfcGFydG5lcl9wcm92aXNpb25zJywgSlNPTi5zdHJpbmdpZnkocmVtYWluaW5nKSk7CiAgICAgIGFsZXJ0KGBQZW5kaW5nIHByb3Zpc2lvbmluZyBwcm9jZXNzZWQg4oCUIHN1Y2Nlc3M6ICR7c3VtbWFyeS5zdWNjZXNzfSwgZmFpbGVkOiAke3N1bW1hcnkuZmFpbGVkfSwgcmVtYWluaW5nOiAke3JlbWFpbmluZy5sZW5ndGh9YCk7CiAgICB9KTsKICB9IGNhdGNoIChlKSB7IGNvbnNvbGUuZXJyb3IoJ3Byb2Nlc3NQZW5kaW5nUHJvdmlzaW9ucyBlcnJvcicsIGUpOyBhbGVydCgnRmFpbGVkIHByb2Nlc3NpbmcgcGVuZGluZyBwcm92aXNpb25zLiBTZWUgY29uc29sZS4nKTsgfQp9CgovLyBFeHBvbmVudGlhbCBiYWNrb2ZmIGRlbGF5IChtcykKZnVuY3Rpb24gZ2V0QmFja29mZkRlbGF5KHJldHJ5Q291bnQpIHsKICBjb25zdCBiYXNlID0gNjAgKiAxMDAwOyAvLyAxIG1pbnV0ZSBiYXNlCiAgY29uc3QgbWF4ID0gNjAgKiA2MCAqIDEwMDA7IC8vIDEgaG91ciBtYXgKICBjb25zdCBkZWxheSA9IE1hdGgubWluKGJhc2UgKiBNYXRoLnBvdygyLCBNYXRoLm1heCgwLCByZXRyeUNvdW50IC0gMSkpLCBtYXgpOwogIC8vIGFkZCBzbWFsbCBqaXR0ZXIKICBjb25zdCBqaXR0ZXIgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxNTAwMCk7CiAgcmV0dXJuIGRlbGF5ICsgaml0dGVyOwp9CgovLyBCYWNrZ3JvdW5kIHdvcmtlciB0aGF0IGNoZWNrcyBmb3IgcGVuZGluZyBpdGVtcyBhbmQgdHJpZ2dlcnMgcHJvY2Vzc2luZyB3aGVuIGR1ZQpmdW5jdGlvbiBydW5BdXRvUHJvdmlzaW9uV29ya2VyKGludGVydmFsTXMgPSA2MCAqIDEwMDApIHsKICB0cnkgewogICAgLy8gcnVuIG9uY2UgaW1tZWRpYXRlbHkKICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICB0cnkgeyBwcm9jZXNzUGVuZGluZ1Byb3Zpc2lvbnNTaWxlbnQoKTsgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfQogICAgfSwgNTAwKTsKICAgIC8vIHRoZW4gc2NoZWR1bGUgcGVyaW9kaWMgY2hlY2tzCiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgIHRyeSB7IHByb2Nlc3NQZW5kaW5nUHJvdmlzaW9uc1NpbGVudCgpOyB9IGNhdGNoIChlKSB7IGNvbnNvbGUuZXJyb3IoJ0F1dG9Qcm92aXNpb25Xb3JrZXIgZXJyb3InLCBlKTsgfQogICAgfSwgaW50ZXJ2YWxNcyk7CiAgfSBjYXRjaCAoZSkgeyBjb25zb2xlLmVycm9yKCdydW5BdXRvUHJvdmlzaW9uV29ya2VyIGZhaWxlZCcsIGUpOyB9Cn0KCi8vIFNpbGVudCB2ZXJzaW9uIG9mIHByb2Nlc3NQZW5kaW5nUHJvdmlzaW9ucyB0aGF0IGRvZXMgbm90IHNob3cgYWxlcnRzICh1c2VkIGJ5IHdvcmtlcikKZnVuY3Rpb24gcHJvY2Vzc1BlbmRpbmdQcm92aXNpb25zU2lsZW50KCkgewogIHRyeSB7CiAgICBjb25zdCBxID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGVuZGluZ19wYXJ0bmVyX3Byb3Zpc2lvbnMnKSB8fCAnW10nKTsKICAgIGNvbnN0IG5vd1RzID0gRGF0ZS5ub3coKTsKICAgIGNvbnN0IHRvQXR0ZW1wdCA9IHEuZmlsdGVyKGl0ZW0gPT4gewogICAgICB0cnkgeyByZXR1cm4gbmV3IERhdGUoaXRlbS5uZXh0QXR0ZW1wdCkuZ2V0VGltZSgpIDw9IG5vd1RzOyB9IGNhdGNoIChlKSB7IHJldHVybiB0cnVlOyB9CiAgICB9KTsKICAgIGlmICghdG9BdHRlbXB0Lmxlbmd0aCkgcmV0dXJuOwogICAgY29uc3QgcHJvbWlzZXMgPSB0b0F0dGVtcHQubWFwKGl0ZW0gPT4gewogICAgICBjb25zdCBwYXJ0bmVyID0gcGFydG5lcnNfcmVnaXN0cnlbaXRlbS5wYXJ0bmVySWRdOwogICAgICBjb25zdCB3ZWJob29rID0gKHBhcnRuZXIgJiYgKHBhcnRuZXIud2ViaG9va1VybCB8fCBnZXRQYXJ0bmVyV2ViaG9va1VybChwYXJ0bmVyLmlkKSkpIHx8ICcnOwogICAgICBpdGVtLmxhc3RBdHRlbXB0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOwogICAgICBpdGVtLmxvZ3MgPSBpdGVtLmxvZ3MgfHwgW107CiAgICAgIGlmICghd2ViaG9vaykgewogICAgICAgIGl0ZW0ucmV0cnlDb3VudCA9IChpdGVtLnJldHJ5Q291bnQgfHwgMCkgKyAxOwogICAgICAgIGl0ZW0ubG9ncy5wdXNoKHsgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgb2s6IGZhbHNlLCByZWFzb246ICdub193ZWJob29rX2NvbmZpZ3VyZWQnIH0pOwogICAgICAgIGl0ZW0ubmV4dEF0dGVtcHQgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgZ2V0QmFja29mZkRlbGF5KGl0ZW0ucmV0cnlDb3VudCkpLnRvSVNPU3RyaW5nKCk7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IG9rOiBmYWxzZSwgaXRlbSB9KTsKICAgICAgfQogICAgICByZXR1cm4gZmV0Y2god2ViaG9vaywgeyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGl0ZW0ucGF5bG9hZCkgfSkKICAgICAgICAudGhlbihyZXMgPT4gKHsgb2s6ICEhcmVzICYmIHJlcy5vaywgaXRlbSwgc3RhdHVzOiByZXMgJiYgcmVzLnN0YXR1cyB9KSkKICAgICAgICAuY2F0Y2goZXJyID0+ICh7IG9rOiBmYWxzZSwgaXRlbSwgZXJyIH0pKTsKICAgIH0pOwogICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4ocmVzdWx0cyA9PiB7CiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IFtdOwogICAgICBjb25zdCBtYXhSZXRyaWVzID0gNjsKICAgICAgcmVzdWx0cy5mb3JFYWNoKHIgPT4gewogICAgICAgIGlmIChyLm9rKSB7CiAgICAgICAgICByLml0ZW0ubG9ncy5wdXNoKHsgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgb2s6IHRydWUsIG5vdGU6ICdwcm92aXNpb25fc3VjY2VzcycgfSk7CiAgICAgICAgICBhZGRUb0hpc3RvcnkoKHIuaXRlbS5wYXlsb2FkICYmIHIuaXRlbS5wYXlsb2FkLm1vZHVsZSkgfHwgJ3Vua25vd24nLCBgUHJvdmlzaW9uOiR7ci5pdGVtLnBhcnRuZXJJZH1gLCAnUFJPVklTSU9ORUQnLCAnbi9hJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHIuaXRlbS5yZXRyeUNvdW50ID0gKHIuaXRlbS5yZXRyeUNvdW50IHx8IDApICsgMTsKICAgICAgICAgIHIuaXRlbS5sb2dzLnB1c2goeyB0czogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLCBvazogZmFsc2UsIHJlYXNvbjogKHIuZXJyICYmIHIuZXJyLm1lc3NhZ2UpIHx8IChyLnN0YXR1cyA/ICdzdGF0dXNfJytyLnN0YXR1cyA6ICd1bmtub3duX2Vycm9yJykgfSk7CiAgICAgICAgICBpZiAoci5pdGVtLnJldHJ5Q291bnQgPj0gbWF4UmV0cmllcykgewogICAgICAgICAgICBhZGRUb0hpc3RvcnkoKHIuaXRlbS5wYXlsb2FkICYmIHIuaXRlbS5wYXlsb2FkLm1vZHVsZSkgfHwgJ3Vua25vd24nLCBgUHJvdmlzaW9uOiR7ci5pdGVtLnBhcnRuZXJJZH1gLCAnUFJPVklTSU9OX0ZBSUxFRCcsICduL2EnKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHIuaXRlbS5uZXh0QXR0ZW1wdCA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBnZXRCYWNrb2ZmRGVsYXkoci5pdGVtLnJldHJ5Q291bnQpKS50b0lTT1N0cmluZygpOwogICAgICAgICAgICByZW1haW5pbmcucHVzaChyLml0ZW0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIC8vIGtlZXAgbm9uLWF0dGVtcHRlZCBpdGVtcwogICAgICBjb25zdCBhdHRlbXB0ZWRJZHMgPSBuZXcgU2V0KHJlc3VsdHMubWFwKHIgPT4gci5pdGVtICYmIHIuaXRlbS5pZCkpOwogICAgICBxLmZvckVhY2gob3JpZyA9PiB7IGlmICghYXR0ZW1wdGVkSWRzLmhhcyhvcmlnLmlkKSkgcmVtYWluaW5nLnB1c2gob3JpZyk7IH0pOwogICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGVuZGluZ19wYXJ0bmVyX3Byb3Zpc2lvbnMnLCBKU09OLnN0cmluZ2lmeShyZW1haW5pbmcpKTsKICAgIH0pLmNhdGNoKGUgPT4gY29uc29sZS5lcnJvcigncHJvY2Vzc1BlbmRpbmdQcm92aXNpb25zU2lsZW50IHJlc3VsdHMgZXJyb3InLCBlKSk7CiAgfSBjYXRjaCAoZSkgeyBjb25zb2xlLmVycm9yKCdwcm9jZXNzUGVuZGluZ1Byb3Zpc2lvbnNTaWxlbnQgZXJyb3InLCBlKTsgfQp9CgovLyBOb3RpZnkgYWRtaW4gd2hlbiBhIHByb3Zpc2lvbiByZXF1ZXN0IHBlcm1hbmVudGx5IGZhaWxzCmZ1bmN0aW9uIG5vdGlmeUFkbWluRm9yRmFpbHVyZShpdGVtKSB7CiAgdHJ5IHsKICAgIGNvbnN0IGNmZyA9IGdldE5vdGlmaWNhdGlvbkNvbmZpZygpOwogICAgY29uc3QgbWVzc2FnZSA9IGBBTEVSVDogUHJvdmlzaW9uIHBlcm1hbmVudGx5IGZhaWxlZCBmb3IgJHtpdGVtLnBhcnRuZXJJZH0gKG1vZHVsZTogJHsoaXRlbS5wYXlsb2FkICYmIGl0ZW0ucGF5bG9hZC5tb2R1bGUpIHx8ICduL2EnfSkuIEF0dGVtcHRzOiAke2l0ZW0ucmV0cnlDb3VudCB8fCAwfWA7CiAgICAvLyBJbi1hcHAgYmFubmVyCiAgICBjb25zdCBleGlzdGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1pbk5vdGlmeUJhbm5lcicpOwogICAgaWYgKGV4aXN0aW5nKSBleGlzdGluZy5yZW1vdmUoKTsKICAgIGNvbnN0IGJhbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgYmFubmVyLmlkID0gJ2FkbWluTm90aWZ5QmFubmVyJzsKICAgIGJhbm5lci5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7CiAgICBiYW5uZXIuc3R5bGUudG9wID0gJzEycHgnOwogICAgYmFubmVyLnN0eWxlLnJpZ2h0ID0gJzEycHgnOwogICAgYmFubmVyLnN0eWxlLmJhY2tncm91bmQgPSAnbGluZWFyLWdyYWRpZW50KDkwZGVnLCNmZjU0NjAsI2ZmOGE4MCknOwogICAgYmFubmVyLnN0eWxlLmNvbG9yID0gJyNmZmYnOwogICAgYmFubmVyLnN0eWxlLnBhZGRpbmcgPSAnMTJweCAxNnB4JzsKICAgIGJhbm5lci5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnNnB4JzsKICAgIGJhbm5lci5zdHlsZS5ib3hTaGFkb3cgPSAnMCA2cHggMThweCByZ2JhKDAsMCwwLDAuMzUpJzsKICAgIGJhbm5lci5zdHlsZS56SW5kZXggPSA5OTk5OTsKICAgIGJhbm5lci5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT0iZm9udC13ZWlnaHQ6NzAwOyBtYXJnaW4tYm90dG9tOjZweDsiPlByb3Zpc2lvbiBGYWlsdXJlIE5vdGljZTwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMnB4OyI+JHttZXNzYWdlfTwvZGl2PjxkaXYgc3R5bGU9Im1hcmdpbi10b3A6OHB4OyBkaXNwbGF5OmZsZXg7IGdhcDo4cHg7Ij48YnV0dG9uIG9uY2xpY2s9IihmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1pbk5vdGlmeUJhbm5lcicpPy5yZW1vdmUoKX0pIiBjbGFzcz0iYnRuLXNlY29uZGFyeS1hY3Rpb24iPkRpc21pc3M8L2J1dHRvbj48L2Rpdj5gOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiYW5uZXIpOwoKICAgIC8vIEF0dGVtcHQgd2ViaG9vayBub3RpZmljYXRpb24gaWYgY29uZmlndXJlZAogICAgaWYgKGNmZyAmJiBjZmcud2ViaG9va1VybCkgewogICAgICBmZXRjaChjZmcud2ViaG9va1VybCwgeyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ1BST1ZJU0lPTl9GQUlMRUQnLCBpdGVtIH0pIH0pCiAgICAgICAgLnRoZW4ociA9PiB7IGlmICghci5vaykgY29uc29sZS53YXJuKCdub3RpZnkgd2ViaG9vayByZXNwb25kZWQgbm9uLW9rJywgci5zdGF0dXMpOyB9KQogICAgICAgIC5jYXRjaChlID0+IGNvbnNvbGUud2Fybignbm90aWZ5IHdlYmhvb2sgZXJyb3InLCBlKSk7CiAgICB9CgogICAgLy8gT3B0aW9uYWxseSByZWNvcmQgZW1haWwgYWRkcmVzcyAoY2Fubm90IHNlbmQgZW1haWwgY2xpZW50LXNpZGUgcmVsaWFibHkpCiAgICBpZiAoY2ZnICYmIGNmZy5lbWFpbCkgewogICAgICBjb25zb2xlLmxvZygnTm90aWZpY2F0aW9uIGVtYWlsIGNvbmZpZ3VyZWQgZm9yJywgY2ZnLmVtYWlsLCAnIOKAlCBjb25zaWRlciBzZXJ2ZXItc2lkZSByZWxheSB0byBzZW5kIGVtYWlsLicpOwogICAgfQogIH0gY2F0Y2ggKGUpIHsgY29uc29sZS5lcnJvcignbm90aWZ5QWRtaW5Gb3JGYWlsdXJlIGVycm9yJywgZSk7IH0KfQoKLy8gU2hvdyBhZG1pbiBxdWV1ZSB2aWV3ZXIgZm9yIHBlbmRpbmcgcHJvdmlzaW9uaW5nIHJlcXVlc3RzIHdpdGggcGVyLWl0ZW0gcmV0cnkvZGVsZXRlCmZ1bmN0aW9uIHNob3dQZW5kaW5nUHJvdmlzaW9uUXVldWUoKSB7CiAgY29uc3QgYmxvY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW50ZWxDYXB0dXJlQmxvY2snKTsKICBjb25zdCBxID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGVuZGluZ19wYXJ0bmVyX3Byb3Zpc2lvbnMnKSB8fCAnW10nKTsKICBpZiAoIXEubGVuZ3RoKSB7CiAgICBibG9jay5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT0icGFkZGluZzoxMnB4OyBmb250LWZhbWlseTptb25vc3BhY2U7Ij48ZGl2IGNsYXNzPSJyZXBvcnQtdGl0bGUiPlBlbmRpbmcgUGFydG5lciBQcm92aXNpb25zPC9kaXY+PHAgc3R5bGU9ImZvbnQtc2l6ZToxMXB4OyBjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTsiPk5vIHBlbmRpbmcgaXRlbXMuPC9wPjwvZGl2PmA7CiAgICBibG9jay5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgcm93cyA9IHEubWFwKChpdGVtLCBpZHgpID0+IHsKICAgIGNvbnN0IHBhcnRuZXIgPSBwYXJ0bmVyc19yZWdpc3RyeVtpdGVtLnBhcnRuZXJJZF0gPyBwYXJ0bmVyc19yZWdpc3RyeVtpdGVtLnBhcnRuZXJJZF0uZGlzcGxheU5hbWUgOiBpdGVtLnBhcnRuZXJJZDsKICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHRBdHRlbXB0ID8gbmV3IERhdGUoaXRlbS5uZXh0QXR0ZW1wdCkudG9Mb2NhbGVTdHJpbmcoKSA6ICdBU0FQJzsKICAgIGNvbnN0IGxvZ3NIdG1sID0gKGl0ZW0ubG9ncyB8fCBbXSkuc2xpY2UoKS5yZXZlcnNlKCkubWFwKGwgPT4gYDxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMXB4OyBjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTsiPlske2wudHN9XSAke2wub2sgPyAnT0snIDogJ0ZBSUwnfSAke2wucmVhc29uID8gJy0gJytsLnJlYXNvbiA6ICcnfSAke2wubm90ZSA/ICctICcrbC5ub3RlIDogJyd9PC9kaXY+YCkuam9pbignJyk7CiAgICByZXR1cm4gYAogICAgICA8ZGl2IHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IHBhZGRpbmc6MTBweDsgbWFyZ2luLWJvdHRvbTo4cHg7IGJvcmRlci1yYWRpdXM6NnB4OyI+CiAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4OyBnYXA6OHB4OyBhbGlnbi1pdGVtczpjZW50ZXI7Ij4KICAgICAgICAgIDxkaXYgc3R5bGU9ImZsZXg6MTsgZm9udC1mYW1pbHk6bW9ub3NwYWNlOyBmb250LXNpemU6MTJweDsiPjxkaXY+PHN0cm9uZz4ke3BhcnRuZXJ9PC9zdHJvbmc+IDxzcGFuIHN0eWxlPSJjb2xvcjp2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZToxMXB4OyI+KCR7aXRlbS5pZH0pPC9zcGFuPjwvZGl2PjxkaXYgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtbXV0ZWQpOyBmb250LXNpemU6MTFweDsiPk1vZHVsZTogJHsoaXRlbS5wYXlsb2FkICYmIGl0ZW0ucGF5bG9hZC5tb2R1bGUpIHx8ICduL2EnfSDigKIgQXR0ZW1wdHM6ICR7aXRlbS5yZXRyeUNvdW50IHx8IDB9IOKAoiBOZXh0OiAke25leHR9PC9kaXY+PC9kaXY+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7IGdhcDo4cHg7Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLXNlY29uZGFyeS1hY3Rpb24iIG9uY2xpY2s9InJldHJ5UGVuZGluZ0F0KCR7aWR4fSkiPlJldHJ5PC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1zZWNvbmRhcnktYWN0aW9uIiBvbmNsaWNrPSJkZWxldGVQZW5kaW5nQXQoJHtpZHh9KSI+RGVsZXRlPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1zZWNvbmRhcnktYWN0aW9uIiBvbmNsaWNrPSIoZnVuY3Rpb24oZWwpeyBjb25zdCBwPWVsLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7IGlmKHAuc3R5bGUuZGlzcGxheT09PSdub25lJyl7cC5zdHlsZS5kaXNwbGF5PSdibG9jayc7IGVsLmlubmVyVGV4dD0nSGlkZSBMb2dzJzsgfSBlbHNlIHsgcC5zdHlsZS5kaXNwbGF5PSdub25lJzsgZWwuaW5uZXJUZXh0PSdTaG93IExvZ3MnOyB9IH0pKHRoaXMpIj5TaG93IExvZ3M8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6bm9uZTsgbWFyZ2luLXRvcDo4cHg7Ij4ke2xvZ3NIdG1sIHx8ICc8ZGl2IHN0eWxlPSJjb2xvcjp2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZToxMXB4OyI+Tm8gbG9ncyB5ZXQuPC9kaXY+J308L2Rpdj4KICAgICAgPC9kaXY+YDsKICB9KS5qb2luKCcnKTsKICBibG9jay5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT0icGFkZGluZzoxMnB4OyBmb250LWZhbWlseTptb25vc3BhY2U7Ij48ZGl2IGNsYXNzPSJyZXBvcnQtdGl0bGUiPlBlbmRpbmcgUGFydG5lciBQcm92aXNpb25zPC9kaXY+PGRpdiBzdHlsZT0ibWFyZ2luLXRvcDo4cHg7Ij4ke3Jvd3N9PC9kaXY+PGRpdiBzdHlsZT0ibWFyZ2luLXRvcDo4cHg7IGZvbnQtc2l6ZToxMXB4OyBjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTsiPlVzZSBSZXRyeSB0byBhdHRlbXB0IGEgc2luZ2xlIHJlcHJvdmlzaW9uaW5nLiBEZWxldGUgcmVtb3ZlcyB0aGUgcmVxdWVzdC48L2Rpdj48L2Rpdj5gOwogIC8vIGFkZCBleHBvcnQgYnV0dG9uCiAgY29uc3QgZXhwb3J0QnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgZXhwb3J0QnRuLmNsYXNzTmFtZSA9ICdidG4tc2Vjb25kYXJ5LWFjdGlvbic7CiAgZXhwb3J0QnRuLnN0eWxlLm1hcmdpbiA9ICcxMnB4JzsKICBleHBvcnRCdG4uaW5uZXJUZXh0ID0gJ1vihpNdIEV4cG9ydCBMb2dzJzsKICBleHBvcnRCdG4ub25jbGljayA9IGV4cG9ydFBlbmRpbmdMb2dzQ1NWOwogIGNvbnN0IHRpdGxlRWwgPSBibG9jay5xdWVyeVNlbGVjdG9yKCcucmVwb3J0LXRpdGxlJyk7CiAgaWYgKHRpdGxlRWwpIHRpdGxlRWwucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoZXhwb3J0QnRuLCB0aXRsZUVsLm5leHRTaWJsaW5nKTsKICBibG9jay5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICBibG9jay5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTsKfQoKZnVuY3Rpb24gcmV0cnlQZW5kaW5nQXQoaW5kZXgpIHsKICB0cnkgewogICAgY29uc3QgcSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3BlbmRpbmdfcGFydG5lcl9wcm92aXNpb25zJykgfHwgJ1tdJyk7CiAgICBjb25zdCBpdGVtID0gcVtpbmRleF07CiAgICBpZiAoIWl0ZW0pIHJldHVybiBhbGVydCgnSXRlbSBub3QgZm91bmQnKTsKICAgIGNvbnN0IHBhcnRuZXIgPSBwYXJ0bmVyc19yZWdpc3RyeVtpdGVtLnBhcnRuZXJJZF07CiAgICBjb25zdCB3ZWJob29rID0gKHBhcnRuZXIgJiYgKHBhcnRuZXIud2ViaG9va1VybCB8fCBnZXRQYXJ0bmVyV2ViaG9va1VybChwYXJ0bmVyLmlkKSkpIHx8ICcnOwogICAgaWYgKCF3ZWJob29rKSByZXR1cm4gYWxlcnQoJ05vIHdlYmhvb2sgY29uZmlndXJlZCBmb3IgdGhpcyBwYXJ0bmVyLiBDb25maWd1cmUgcGFydG5lciBmaXJzdC4nKTsKICAgIGZldGNoKHdlYmhvb2ssIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShpdGVtLnBheWxvYWQpIH0pCiAgICAgIC50aGVuKHJlcyA9PiB7CiAgICAgICAgaWYgKCFyZXMgfHwgIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKCdQcm92aXNpb24gZmFpbGVkJyk7CiAgICAgICAgLy8gcmVtb3ZlIGl0ZW0gZnJvbSBxdWV1ZQogICAgICAgIHEuc3BsaWNlKGluZGV4LDEpOwogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwZW5kaW5nX3BhcnRuZXJfcHJvdmlzaW9ucycsIEpTT04uc3RyaW5naWZ5KHEpKTsKICAgICAgICBhZGRUb0hpc3RvcnkoKGl0ZW0ucGF5bG9hZCAmJiBpdGVtLnBheWxvYWQubW9kdWxlKSB8fCAndW5rbm93bicsIGBQcm92aXNpb246JHtpdGVtLnBhcnRuZXJJZH1gLCAnUFJPVklTSU9ORUQnLCAnbi9hJyk7CiAgICAgICAgYWxlcnQoJ1Byb3Zpc2lvbiBzdWNjZWVkZWQuIEl0ZW0gcmVtb3ZlZCBmcm9tIHF1ZXVlLicpOwogICAgICAgIHNob3dQZW5kaW5nUHJvdmlzaW9uUXVldWUoKTsKICAgICAgfSkKICAgICAgLmNhdGNoKGVyciA9PiB7CiAgICAgICAgaXRlbS5yZXRyeUNvdW50ID0gKGl0ZW0ucmV0cnlDb3VudCB8fCAwKSArIDE7CiAgICAgICAgaXRlbS5sYXN0QXR0ZW1wdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGVuZGluZ19wYXJ0bmVyX3Byb3Zpc2lvbnMnLCBKU09OLnN0cmluZ2lmeShxKSk7CiAgICAgICAgYWxlcnQoJ1Byb3Zpc2lvbiBhdHRlbXB0IGZhaWxlZC4gUmV0cnkgY291bnQgaW5jcmVtZW50ZWQuJyk7CiAgICAgICAgc2hvd1BlbmRpbmdQcm92aXNpb25RdWV1ZSgpOwogICAgICB9KTsKICB9IGNhdGNoIChlKSB7IGNvbnNvbGUuZXJyb3IoJ3JldHJ5UGVuZGluZ0F0JywgZSk7IGFsZXJ0KCdSZXRyeSBmYWlsZWQg4oCUIHNlZSBjb25zb2xlLicpOyB9Cn0KCmZ1bmN0aW9uIGRlbGV0ZVBlbmRpbmdBdChpbmRleCkgewogIHRyeSB7CiAgICBjb25zdCBxID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGVuZGluZ19wYXJ0bmVyX3Byb3Zpc2lvbnMnKSB8fCAnW10nKTsKICAgIGNvbnN0IGl0ZW0gPSBxW2luZGV4XTsKICAgIGlmICghaXRlbSkgcmV0dXJuIGFsZXJ0KCdJdGVtIG5vdCBmb3VuZCcpOwogICAgaWYgKCFjb25maXJtKCdEZWxldGUgcGVuZGluZyBwcm92aXNpb25pbmcgcmVxdWVzdD8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLicpKSByZXR1cm47CiAgICBxLnNwbGljZShpbmRleCwxKTsKICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwZW5kaW5nX3BhcnRuZXJfcHJvdmlzaW9ucycsIEpTT04uc3RyaW5naWZ5KHEpKTsKICAgIGFkZFRvSGlzdG9yeSgoaXRlbS5wYXlsb2FkICYmIGl0ZW0ucGF5bG9hZC5tb2R1bGUpIHx8ICd1bmtub3duJywgYFByb3Zpc2lvbjoke2l0ZW0ucGFydG5lcklkfWAsICdQUk9WSVNJT05fREVMRVRFRCcsICduL2EnKTsKICAgIHNob3dQZW5kaW5nUHJvdmlzaW9uUXVldWUoKTsKICB9IGNhdGNoIChlKSB7IGNvbnNvbGUuZXJyb3IoJ2RlbGV0ZVBlbmRpbmdBdCcsIGUpOyBhbGVydCgnRGVsZXRlIGZhaWxlZCDigJQgc2VlIGNvbnNvbGUuJyk7IH0KfQoKLy8gRXhwb3J0IHBlbmRpbmcgcHJvdmlzaW9uIGxvZ3MgYXMgQ1NWCmZ1bmN0aW9uIGV4cG9ydFBlbmRpbmdMb2dzQ1NWKCkgewogIHRyeSB7CiAgICBjb25zdCBxID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGVuZGluZ19wYXJ0bmVyX3Byb3Zpc2lvbnMnKSB8fCAnW10nKTsKICAgIGlmICghcS5sZW5ndGgpIHJldHVybiBhbGVydCgnTm8gcGVuZGluZyBsb2dzIHRvIGV4cG9ydC4nKTsKICAgIGNvbnN0IHJvd3MgPSBbWydpZCcsJ3BhcnRuZXJJZCcsJ21vZHVsZScsJ3JldHJ5Q291bnQnLCdsYXN0QXR0ZW1wdCcsJ25leHRBdHRlbXB0JywnbG9ncyddXTsKICAgIHEuZm9yRWFjaChpdGVtID0+IHsKICAgICAgY29uc3QgbG9ncyA9IChpdGVtLmxvZ3MgfHwgW10pLm1hcChsID0+IGBbJHtsLnRzfV0gJHtsLm9rID8gJ09LJyA6ICdGQUlMJ30gJHtsLnJlYXNvbnx8Jyd9ICR7bC5ub3RlfHwnJ31gKS5qb2luKCcgfCAnKTsKICAgICAgcm93cy5wdXNoKFtpdGVtLmlkIHx8ICcnLCBpdGVtLnBhcnRuZXJJZCB8fCAnJywgKGl0ZW0ucGF5bG9hZCAmJiBpdGVtLnBheWxvYWQubW9kdWxlKSB8fCAnJywgaXRlbS5yZXRyeUNvdW50IHx8IDAsIGl0ZW0ubGFzdEF0dGVtcHQgfHwgJycsIGl0ZW0ubmV4dEF0dGVtcHQgfHwgJycsIGxvZ3NdKTsKICAgIH0pOwogICAgY29uc3QgY3N2ID0gcm93cy5tYXAociA9PiByLm1hcCh2ID0+IGAiJHtTdHJpbmcodikucmVwbGFjZSgvIi9nLCciIicpfSJgKS5qb2luKCcsJykpLmpvaW4oJ1xuJyk7CiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2Nzdl0sIHsgdHlwZTogJ3RleHQvY3N2JyB9KTsKICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICBhLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgYS5kb3dubG9hZCA9IGBwZW5kaW5nX3Byb3Zpc2lvbnNfJHtEYXRlLm5vdygpfS5jc3ZgOwogICAgYS5jbGljaygpOwogICAgc2V0VGltZW91dCgoKSA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKGEuaHJlZiksIDEwMCk7CiAgfSBjYXRjaCAoZSkgeyBjb25zb2xlLmVycm9yKCdleHBvcnRQZW5kaW5nTG9nc0NTVicsIGUpOyBhbGVydCgnRXhwb3J0IGZhaWxlZC4gU2VlIGNvbnNvbGUuJyk7IH0KfQoKZnVuY3Rpb24gc3VibWl0UGF0aDAxV29ya2Zsb3coZXZlbnQpIHsKICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogIGNvbnN0IHBhcnRuZXJJZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXRoMDFTb2Z0d2FyZScpPy52YWx1ZTsKICBjb25zdCBtb2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhdGgwMU1vZGUnKT8udmFsdWU7CiAgY29uc3QgZW1haWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGF0aDAxRW1haWwnKT8udmFsdWUudHJpbSgpOwogIGNvbnN0IGNvbnNlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGF0aDAxQ29uc2VudCcpPy5jaGVja2VkOwogIGlmICghcGFydG5lcklkIHx8ICFwYXJ0bmVyc19yZWdpc3RyeVtwYXJ0bmVySWRdKSByZXR1cm4gYWxlcnQoJ1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBwYXJ0bmVyLicpOwogIGlmICghZW1haWwgfHwgIW1vZGUpIHJldHVybiBhbGVydCgnUGxlYXNlIGNvbXBsZXRlIHJlcXVpcmVkIGZpZWxkcy4nKTsKICBpZiAoIWNvbnNlbnQpIHJldHVybiBhbGVydCgnQ29uc2VudCBpcyByZXF1aXJlZCB0byBwcm9jZWVkLicpOwoKICBjb25zdCBwYXJ0bmVyID0gcGFydG5lcnNfcmVnaXN0cnlbcGFydG5lcklkXTsKICBjb25zdCBwYXlsb2FkID0geyBwYXJ0bmVySWQ6IHBhcnRuZXIuaWQsIHBhcnRuZXJOYW1lOiBwYXJ0bmVyLmRpc3BsYXlOYW1lLCBhZG1pbkVtYWlsOiBlbWFpbCwgbW9kZTogbW9kZSwgbW9kdWxlOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGFiLWJ0bi5hY3RpdmUnKS5pZC5yZXBsYWNlKCd0YWJfJywnJyksIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH07CgogIGZ1bmN0aW9uIGZpbmFsaXplUHJvdmlzaW9uKHN1Y2Nlc3MsIHNpbXVsYXRlZCkgewogICAgY29uc3QgdG9rZW4gPSAnQ09SUC1FTkctMjAyNic7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2V5SW5wdXQnKS52YWx1ZSA9IHRva2VuOwogICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2xhc3RfcGFydG5lcl9wcm92aXNpb25lZCcsIHBhcnRuZXIuaWQpOwogICAgc2F2ZUlucHV0TWVtb3J5KCk7CiAgICBhZGRUb0hpc3RvcnkocGF5bG9hZC5tb2R1bGUsIGBQcm92aXNpb246JHtwYXJ0bmVyLmlkfWAsIHN1Y2Nlc3MgPyAoc2ltdWxhdGVkID8gJ1BST1ZJU0lPTkVEIChTSU0pJyA6ICdQUk9WSVNJT05FRCcpIDogJ1BST1ZJU0lPTl9QRU5ESU5HJywgJ24vYScpOwogICAgcnVuQXVkaXQoKTsKICAgIGlmIChzdWNjZXNzKSBhbGVydChg4pyTICR7cGFydG5lci5kaXNwbGF5TmFtZX0ke3NpbXVsYXRlZCA/ICcgKHNpbXVsYXRlZCknIDogJyd9IHByb3Zpc2lvbmVkIOKAlCBsaWNlbnNlIHRva2VuIGdyYW50ZWQuYCk7CiAgICBlbHNlIGFsZXJ0KCdQYXJ0bmVyIHByb3Zpc2lvbmluZyBmYWlsZWQg4oCUIHJlcXVlc3QgcXVldWVkIGZvciByZXRyeS4nKTsKICB9CgogIC8vIGhlbHBlcjogZmV0Y2ggd2l0aCB0aW1lb3V0IHVzaW5nIEFib3J0Q29udHJvbGxlcgogIGZ1bmN0aW9uIGZldGNoV2l0aFRpbWVvdXQodXJsLCBvcHRzID0ge30sIHRpbWVvdXQgPSA4MDAwKSB7CiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwogICAgY29uc3QgaWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGltZW91dCk7CiAgICByZXR1cm4gZmV0Y2godXJsLCBPYmplY3QuYXNzaWduKHt9LCBvcHRzLCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSkpLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KGlkKSk7CiAgfQoKICBjb25zdCB3ZWJob29rID0gZ2V0UGFydG5lcldlYmhvb2tVcmwocGFydG5lcklkKSB8fCBwYXJ0bmVyLndlYmhvb2tVcmwgfHwgJyc7CiAgaWYgKHdlYmhvb2spIHsKICAgIGZldGNoV2l0aFRpbWVvdXQod2ViaG9vaywgeyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpIH0sIDEwMDAwKQogICAgICAudGhlbihyZXMgPT4gewogICAgICAgIGlmICghcmVzIHx8ICFyZXMub2spIHRocm93IG5ldyBFcnJvcignTm9uLU9LIHJlc3BvbnNlJyk7CiAgICAgICAgcmV0dXJuIHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7CiAgICAgIH0pCiAgICAgIC50aGVuKCgpID0+IGZpbmFsaXplUHJvdmlzaW9uKHRydWUsIGZhbHNlKSkKICAgICAgLmNhdGNoKGVyciA9PiB7CiAgICAgICAgY29uc29sZS5lcnJvcigncGFydG5lciBwcm92aXNpb25pbmcgZXJyb3InLCBlcnIpOwogICAgICAgIC8vIHBlcnNpc3QgYSBwZW5kaW5nIHJlcXVlc3QgZm9yIGFkbWluIHJldHJ5CiAgICAgICAgcXVldWVQZW5kaW5nUHJvdmlzaW9uKHsgcGFydG5lcklkOiBwYXJ0bmVyLmlkLCBwYXlsb2FkLCBhdHRlbXB0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0pOwogICAgICAgIGZpbmFsaXplUHJvdmlzaW9uKGZhbHNlLCBmYWxzZSk7CiAgICAgIH0pOwogIH0gZWxzZSB7CiAgICAvLyBEZXYgZmFsbGJhY2sg4oCUIHNpbXVsYXRlIGEgc3VjY2Vzc2Z1bCBwcm92aXNpb25pbmcgd2l0aCBhIHNtYWxsIGRlbGF5CiAgICBjb25zb2xlLmxvZygncGFydG5lcnNfcmVnaXN0cnk6IG5vIHdlYmhvb2sgY29uZmlndXJlZCBmb3InLCBwYXJ0bmVyLmlkLCAnIOKAlCB1c2luZyBkZXYgZmFsbGJhY2snKTsKICAgIHNldFRpbWVvdXQoKCkgPT4gZmluYWxpemVQcm92aXNpb24odHJ1ZSwgdHJ1ZSksIDcwMCk7CiAgfQp9CgovLyBERURJQ0FURUQgREFUQS1SSUNIIFdPUktGTE9XOiBQQVRIIDAyICgzMC1QQUdFIENPTVBMSUFOQ0UgRE9TU0lFUiAmIEFGRklMSUFURSBQREYpCmZ1bmN0aW9uIGxhdW5jaFBhdGgwMldvcmtmbG93KCkgewogIGNvbnN0IGJsb2NrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ludGVsQ2FwdHVyZUJsb2NrJyk7CiAgYmxvY2suaW5uZXJIVE1MID0gYAogICAgPGRpdiBzdHlsZT0icGFkZGluZzoxMHB4OyBmb250LWZhbWlseTptb25vc3BhY2U7Ij4KICAgICAgPGRpdiBjbGFzcz0icmVwb3J0LXRpdGxlIiBzdHlsZT0iY29sb3I6dmFyKC0tZGFuZ2VyKTsgYm9yZGVyLWNvbG9yOnJnYmEoMjU1LDUxLDY4LDAuMik7Ij5bPl0gUEFUSF8wMjogMzAtUEFHRSBDT01QTElBTkNFIERPU1NJRVIgJiBBRkZJTElBVEUgUERGIEVOR0lORTwvZGl2PgogICAgICA8cCBzdHlsZT0iZm9udC1zaXplOjExcHg7IGNvbG9yOnZhcigtLXRleHQtbXV0ZWQpOyBtYXJnaW4tYm90dG9tOjE2cHg7IGxpbmUtaGVpZ2h0OjEuNDsiPk9wdGltaXplIGFuZCBnZW5lcmF0ZSB0aGUgY29tcHJlaGVuc2l2ZSAzMC1QYWdlIE1vbnRobHkgUERGIEFmZmlsaWF0ZSBEb3NzaWVyIHdpdGggZGVlcCBsZWdhbCBhbmFseXNlcywgc3RhdHV0b3J5IHJpc2sgdGFibGVzLCBhbmQgZXhlY3V0aXZlIHN1bW1hcmllcy48L3A+CiAgICAgIDxmb3JtIG9uc3VibWl0PSJzdWJtaXRQYXRoMDJXb3JrZmxvdyhldmVudCkiIHN0eWxlPSJkaXNwbGF5OmdyaWQ7IGdyaWQtZ2FwOjE0cHg7IGNvbG9yOnZhcigtLXRleHQtbWFpbik7Ij4KICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7IGZsZXgtZGlyZWN0aW9uOmNvbHVtbjsiPgogICAgICAgICAgPGxhYmVsIHN0eWxlPSJmb250LXNpemU6MTBweDsgY29sb3I6dmFyKC0tbXV0ZWQpOyBmb250LXdlaWdodDo3MDA7IG1hcmdpbi1ib3R0b206NnB4OyB0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Ij4wMSAvLyBEb3NzaWVyIFNjb3BlICYgQXBwZW5kaWNlcyBGb2N1czwvbGFiZWw+CiAgICAgICAgICA8c2VsZWN0IGlkPSJwYXRoMDJTY29wZSIgY2xhc3M9ImlucHV0LWZpZWxkIiByZXF1aXJlZCBzdHlsZT0iYm9yZGVyLXJhZGl1czo0cHg7Ij4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj4tLSBTZWxlY3QgRG9zc2llciBFZGl0aW9uIC0tPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkZVTExfNTBfU1RBVEVfTkVYVVMiPkNvbXBsZXRlIDUwLVN0YXRlIEVjb25vbWljIE5leHVzICYgRXhlbXB0aW9uIE1hc3RlciBEb3NzaWVyPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ik1BUklUSU1FX0VESV9TT0xBUyI+TWFyaXRpbWUgRURJIEhhcmQtU3RvcCAmIFNPTEFTL0lNREcgQW1kdCA0Mi0yNCBEb3NzaWVyPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkhFQUxUSENBUkVfU1RBUktfRk1WIj5IZWFsdGhjYXJlIFN0YXJrIExhdyBGTVYgJiBBS1MgU2FmZSBIYXJib3IgMzAtUGFnZSBEb3NzaWVyPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7IGZsZXgtZGlyZWN0aW9uOmNvbHVtbjsiPgogICAgICAgICAgPGxhYmVsIHN0eWxlPSJmb250LXNpemU6MTBweDsgY29sb3I6dmFyKC0tbXV0ZWQpOyBmb250LXdlaWdodDo3MDA7IG1hcmdpbi1ib3R0b206NnB4OyB0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Ij4wMiAvLyBBZmZpbGlhdGUgU3Vic2NyaXB0aW9uIFRpZXI8L2xhYmVsPgogICAgICAgICAgPHNlbGVjdCBpZD0icGF0aDAyVGllciIgY2xhc3M9ImlucHV0LWZpZWxkIiByZXF1aXJlZCBzdHlsZT0iYm9yZGVyLXJhZGl1czo0cHg7Ij4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iTU9OVEhMWV9BRkZJTElBVEUiPk1vbnRobHkgRW50ZXJwcmlzZSBBZmZpbGlhdGUgUERGIERvc3NpZXIgKEF1dG8tVXBkYXRlcyk8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iUVVBUlRFUkxZX0FVRElUIj5RdWFydGVybHkgSW5zdGl0dXRpb25hbCBSZXNlYXJjaCBFZGl0aW9uPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7IGdhcDo4cHg7IG1hcmdpbi10b3A6OHB4OyI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iZW1haWwiIGlkPSJwYXRoMDJFbWFpbCIgY2xhc3M9ImlucHV0LWZpZWxkIiByZXF1aXJlZCBwbGFjZWhvbGRlcj0iRW50ZXIgY29ycG9yYXRlIGVtYWlsIGZvciBzZWN1cmUgUERGICYgbGljZW5zZSBkZWxpdmVyeS4uLiIgc3R5bGU9ImZsZXg6MTsgYm9yZGVyLXJhZGl1czo0cHg7Ij4KICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBzdHlsZT0icGFkZGluZzowIDIwcHg7IGJhY2tncm91bmQ6cmdiYSgyNTUsNTEsNjgsMC4wNSk7IGJvcmRlcjoxcHggc29saWQgdmFyKC0tZGFuZ2VyKTsgY29sb3I6dmFyKC0tZGFuZ2VyKTsgYm9yZGVyLXJhZGl1czo0cHg7IGZvbnQtZmFtaWx5Om1vbm9zcGFjZTsgZm9udC1zaXplOjExcHg7IGZvbnQtd2VpZ2h0OmJvbGQ7IGN1cnNvcjpwb2ludGVyOyBoZWlnaHQ6NDVweDsgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOyI+Wz5dIFJlcXVlc3QgUERGIERvc3NpZXI8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9mb3JtPgogICAgPC9kaXY+CiAgYDsKICBibG9jay5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICBibG9jay5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTsKfQoKZnVuY3Rpb24gc3VibWl0UGF0aDAyV29ya2Zsb3coZXZlbnQpIHsKICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogIGNvbnN0IHNjb3BlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhdGgwMlNjb3BlJykudmFsdWU7CiAgYWxlcnQoYOKckyBQQVRIXzAyIERPU1NJRVIgRElTUEFUQ0hFRDogVGhlIDMwLVBhZ2UgJHtzY29wZX0gUERGIGFuZCBhZmZpbGlhdGUgbGljZW5zZSB0b2tlbiBoYXZlIGJlZW4gc2VjdXJlbHkgcm91dGVkIHRvIHlvdXIgZW1haWwgaW5ib3guYCk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2tleUlucHV0JykudmFsdWUgPSAnQ09SUC1FTkctMjAyNic7CiAgc2F2ZUlucHV0TWVtb3J5KCk7CiAgcnVuQXVkaXQoKTsKfQoKZnVuY3Rpb24gaW5qZWN0SW50ZWxGb3JtKCkgewogIGNvbnN0IGJsb2NrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ludGVsQ2FwdHVyZUJsb2NrJyk7CiAgYmxvY2suaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9InBhZGRpbmc6MTBweDsgZm9udC1mYW1pbHk6bW9ub3NwYWNlOyI+PGRpdiBjbGFzcz0icmVwb3J0LXRpdGxlIiBzdHlsZT0iY29sb3I6dmFyKC0td2FybmluZyk7IGJvcmRlci1jb2xvcjpyZ2JhKDI1NSwxODQsMCwwLjIpOyI+Wz5dIElOSVRJQUxJWkUgUkVHSVNUUlkgTk9ERSBHQVRFV0FZIFBST1RPQ09MPC9kaXY+PHAgc3R5bGU9ImZvbnQtc2l6ZToxMXB4OyBjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTsgbWFyZ2luLWJvdHRvbToyMHB4OyBsaW5lLWhlaWdodDoxLjQ7Ij5bIV0gRVhQT1JUIEVOR0lORVMgTE9DS0VEOiBDb21wbGV0ZSB0aGUgcGFyYW1ldGVycyBiZWxvdyB0byBhdXRob3JpemUgdGVtcG9yYXJ5IGxpY2Vuc2UgdG9rZW5zIGFuZCByZXZlYWwgaGlkZGVuIHJlc29sdXRpb24gc2NyaXB0czo8L3A+PGZvcm0gaWQ9ImludGVsRm9ybSIgb25zdWJtaXQ9InN1Ym1pdExlYWRUb2tlblJlcXVlc3QoZXZlbnQpIiBzdHlsZT0iZGlzcGxheTpncmlkOyBncmlkLWdhcDoxNnB4OyBjb2xvcjp2YXIoLS10ZXh0LW1haW4pOyI+PGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4OyBmbGV4LWRpcmVjdGlvbjpjb2x1bW47Ij48bGFiZWwgc3R5bGU9ImZvbnQtc2l6ZToxMHB4OyBjb2xvcjp2YXIoLS1tdXRlZCk7IGZvbnQtd2VpZ2h0OjcwMDsgbWFyZ2luLWJvdHRvbTo2cHg7IHRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsiPjAxIC8vIFRvdGFsIE9yZ2FuaXphdGlvbmFsIFN0YWZmaW5nIEhlYWRjb3VudDwvbGFiZWw+PHNlbGVjdCBpZD0iaW50ZWxTY2FsZSIgY2xhc3M9ImlucHV0LWZpZWxkIiByZXF1aXJlZCBzdHlsZT0iYm9yZGVyLXJhZGl1czo0cHg7Ij48b3B0aW9uIHZhbHVlPSIiPi0tIFNlbGVjdCBPcmdhbml6YXRpb25hbCBTY2FsZSAtLTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjEtNTAiPjEgLSA1MCBQZXJzb25uZWwgKEVtZXJnaW5nIE5vZGUpPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iNTEtMjUwIj41MSAtIDI1MCBQZXJzb25uZWwgKE1pZC1NYXJrZXQgRW50ZXJwcmlzZSk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSIyNTEtMTAwMCI+MjUxIC0gMSwwMDAgUGVyc29ubmVsIChMYXJnZSBBc3NldCBOZXR3b3JrKTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjEwMDArIj4xLDAwMCsgUGVyc29ubmVsIChHbG9iYWwgSW5zdGl0dXRpb25hbCBDYXJyaWVyKTwvb3B0aW9uPjwvc2VsZWN0PjwvZGl2PjxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDsgZmxleC1kaXJlY3Rpb246Y29sdW1uOyI+PGxhYmVsIHN0eWxlPSJmb250LXNpemU6MTBweDsgY29sb3I6dmFyKC0tbXV0ZWQpOyBmb250LXdlaWdodDo3MDA7IG1hcmdpbi1ib3R0b206NnB4OyB0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Ij4wMiAvLyBDdXJyZW50IENvbXBsaWFuY2UgT3ZlcnNpZ2h0IEFyY2hpdGVjdHVyZTwvbGFiZWw+PHNlbGVjdCBpZD0iaW50ZWxQcm9jZXNzIiBjbGFzcz0iaW5wdXQtZmllbGQiIHJlcXVpcmVkIHN0eWxlPSJib3JkZXItcmFkaXVzOjRweDsiPjxvcHRpb24gdmFsdWU9IiI+LS0gU2VsZWN0IFByb2Nlc3NpbmcgRnJhbWV3b3JrIC0tPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iRVhDRUwiPk1hbnVhbCBBZG1pbmlzdHJhdGl2ZSBBY2NvdW50aW5nIExlZGdlciBTaGVldHMgKEV4Y2VsKTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IkVYVEVSTkFMIj5FeHRlcm5hbCBUaGlyZC1QYXJ0eSBUcmFkaXRpb25hbCBBdWRpdCBDb250cmFjdG9yczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Ik5PTkUiPlVuY2hlY2tlZCBTeXN0ZW1pYyBPdmVyc2lnaHQgT3BlcmF0aW9ucyAvIE5vIEFjdGl2ZSBUcmFja2VyPC9vcHRpb24+PC9zZWxlY3Q+PC9kaXY+PGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4OyBmbGV4LWRpcmVjdGlvbjpjb2x1bW47Ij48bGFiZWwgc3R5bGU9ImZvbnQtc2l6ZToxMHB4OyBjb2xvcjp2YXIoLS1tdXRlZCk7IGZvbnQtd2VpZ2h0OjcwMDsgbWFyZ2luLWJvdHRvbTo2cHg7IHRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsiPjAzIC8vIFJpc2sgRXhwb3N1cmUgTWl0aWdhdGlvbiBUaW1lbGluZTwvbGFiZWw+PHNlbGVjdCBpZD0iaW50ZWxUaW1lbGluZSIgY2xhc3M9ImlucHV0LWZpZWxkIiByZXF1aXJlZCBzdHlsZT0iYm9yZGVyLXJhZGl1czo0cHg7Ij48b3B0aW9uIHZhbHVlPSIiPi0tIFNlbGVjdCBEZXBsb3ltZW50IFVyZ2VuY3kgLS08L29wdGlvbj48b3B0aW9uIHZhbHVlPSJJTU1FRElBVEUiPkltbWVkaWF0ZSBNaXRpZ2F0aW9uIFByaW9yaXR5IChBY3RpdmUgQnJlYWNoIElkZW50aWZpZWQpPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iUVVBUlRFUkxZIj5Sb3V0aW5lIFF1YXJ0ZXJseSBSaXNrIEFzc2V0IEFzc2Vzc21lbnQgQ3ljbGU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJFWFBMT1JBVE9SWSI+R2VuZXJhbCBUZWNobm9sb2dpY2FsIFN0cnVjdHVyYWwgRXZhbHVhdGlvbiBBdWRpdDwvb3B0aW9uPjwvc2VsZWN0PjwvZGl2PjxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDsgZmxleC1kaXJlY3Rpb246Y29sdW1uOyBtYXJnaW4tdG9wOjhweDsiPjxsYWJlbCBzdHlsZT0iZm9udC1zaXplOjEwcHg7IGNvbG9yOnZhcigtLWFjY2VudCk7IGZvbnQtd2VpZ2h0OjcwMDsgbWFyZ2luLWJvdHRvbTo2cHg7IHRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsiPjA0IC8vIEF1dGhvcml6ZWQgQ29ycG9yYXRlIENvbW11bmljYXRpb24gRW5kcG9pbnQ8L2xhYmVsPjxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDsgZ2FwOjhweDsiPjxpbnB1dCB0eXBlPSJlbWFpbCIgaWQ9ImxlYWRFbWFpbElucHV0IiBjbGFzcz0iaW5wdXQtZmllbGQiIHJlcXVpcmVkIHBsYWNlaG9sZGVyPSJFbnRlciBjb3Jwb3JhdGUgZW1haWwuLi4iIHN0eWxlPSJmbGV4OjE7IGJvcmRlci1yYWRpdXM6NHB4OyI+PGJ1dHRvbiB0eXBlPSJzdWJtaXQiIHN0eWxlPSJwYWRkaW5nOjAgMjBweDsgYmFja2dyb3VuZDpyZ2JhKDAsMjQ1LDE1NSwwLjA1KTsgYm9yZGVyOjFweCBzb2xpZCB2YXIoLS1hY2NlbnQpOyBjb2xvcjp2YXIoLS1hY2NlbnQpOyBib3JkZXItcmFkaXVzOjRweDsgZm9udC1mYW1pbHk6bW9ub3NwYWNlOyBmb250LXNpemU6MTFweDsgZm9udC13ZWlnaHQ6Ym9sZDsgY3Vyc29yOnBvaW50ZXI7IGhlaWdodDo0NXB4OyB0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Ij5bPl0gUmVxdWVzdCBMaWNlbnNlIEtleTwvYnV0dG9uPjwvZGl2PjwvZGl2PjwvZm9ybT48L2Rpdj4nOwogIGJsb2NrLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwp9CgpmdW5jdGlvbiBzdWJtaXRMZWFkVG9rZW5SZXF1ZXN0KGV2ZW50KSB7CiAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICBjb25zdCBlbWFpbFZhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsZWFkRW1haWxJbnB1dCcpLnZhbHVlLnRyaW0oKTsKICBjb25zdCBzY2FsZVZhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRlbFNjYWxlJykudmFsdWU7CiAgY29uc3QgcHJvY1ZhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRlbFByb2Nlc3MnKS52YWx1ZTsKICBjb25zdCB0aW1lVmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ludGVsVGltZWxpbmUnKS52YWx1ZTsKICBjb25zdCBjdXJyZW50VGFiID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRhYi1idG4uYWN0aXZlJykuaWQucmVwbGFjZSgndGFiXycsICcnKTsKCiAgY29uc3QgbGVhZFBheWxvYWQgPSB7CiAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgIGxlYWRfZW1haWw6IGVtYWlsVmFsLAogICAgZmlybV9zY2FsZTogc2NhbGVWYWwsCiAgICBjdXJyZW50X3Byb2Nlc3M6IHByb2NWYWwsCiAgICBkZXBsb3ltZW50X3RpbWVsaW5lOiB0aW1lVmFsLAogICAgcmVxdWVzdGVkX21vZHVsZTogY3VycmVudFRhYi50b1VwcGVyQ2FzZSgpCiAgfTsKCiAgZmV0Y2goImh0dHBzOi8vZm9ybXNwcmVlLmlvL2YvbWdvZ2t2eXEiLCB7CiAgICBtZXRob2Q6ICJQT1NUIiwgaGVhZGVyczogeyAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGxlYWRQYXlsb2FkKQogIH0pCiAgLnRoZW4oKCkgPT4gewogICAgYWxlcnQoIuKckyBTWVNURU0gRElBR05PU1RJQyBDT01QTEVURUQ6IFNlY3VyaXR5IGxpY2Vuc2Uga2V5IGF1dG8tZmlsbGVkIGluIHRva2VuIGZpZWxkLiIpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2tleUlucHV0JykudmFsdWUgPSAnQ09SUC1FTkctMjAyNic7CiAgICBzYXZlSW5wdXRNZW1vcnkoKTsKICAgIHJ1bkF1ZGl0KCk7CiAgfSkKICAuY2F0Y2goKCkgPT4gewogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2tleUlucHV0JykudmFsdWUgPSAnQ09SUC1FTkctMjAyNic7CiAgICBzYXZlSW5wdXRNZW1vcnkoKTsKICAgIHJ1bkF1ZGl0KCk7CiAgfSk7Cn0KCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBNT0RVTEUgMDMg4oCUIFNUQVJLIExBVyBDT01QTElBTkNFIEVOR0lORSAoREFUQSBOT0RFIE0wMykKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgpjb25zdCBzdGFya19jb25zdGFudHMgPSB7CiAgeWVhcjogMjAyNiwKICBiYXNlQ21wUmF0ZTogMzE2NzAsCiAgYmFzZUZjYVJhdGVNaW46IDE0MzA4LAogIGJhc2VGY2FSYXRlTWF4OiAyODYxOSwKICBjaXJjdW12ZW50aW9uU2NoZW1lUmF0ZTogMjExMTQ2LAogIHVuaWZvcm1QZW5hbHR5VGV4dDogIiQzMSw2NzAgcGVyIHByb2hpYml0ZWQgc2VydmljZSwgJDIxMSwxNDYgcGVyIGNpcmN1bXZlbnRpb24gc2NoZW1lLCBtYW5kYXRvcnkgcmVmdW5kIG9mIGFsbCB0YWludGVkIGNsYWltcywgRkNBIHRyZWJsZSBkYW1hZ2VzICsgcGVyLWNsYWltIHBlbmFsdGllcy4iCn07Cgpjb25zdCBzdGFya19ydWxlc19kYiA9IHsKICAiU3BhY2UgTGVhc2VzIjogewogICAgc3RhdHV0ZUNpdGU6ICI0MiBDRlIgwqc0MTEuMzU3KGEpIiwgZmluYW5jaWFsQ2FwOiBudWxsLCB2YWx1YXRpb25TdGFuZGFyZDogIkdlbmVyYWwgTWFya2V0IFZhbHVlIChHTVYpIC0gU3BhY2UiLAogICAgd3JpdHRlbk1hbmRhdGU6IHRydWUsCiAgICByZXF1aXJlbWVudHM6ICJSZW50YWwgY2hhcmdlcyBmaXhlZCBpbiBhZHZhbmNlIGZvciB0aGUgZnVsbCB0ZXJtOyBlcXVhbCB0byBHTVYgZm9yIGNvbXBhcmFibGUgc3BhY2UgaW4gYW4gYXJtJ3MtbGVuZ3RoIGRlYWw7IHRlcm0gPj0gMSB5ZWFyLiIsCiAgICBjb21tZXJjaWFsUmVhc29uYWJsZW5lc3M6ICJNdXN0IHNlcnZlIGEgbGVnaXRpbWF0ZSBidXNpbmVzcyBwdXJwb3NlIHN0YW5kaW5nIGFsb25lLiIsCiAgICBwcm9oaWJpdGVkRWxlbWVudHM6IFsiUGVyLWNsaWNrIG9yIHBlcmNlbnRhZ2Utb2YtcmV2ZW51ZSByZW50IHRpZWQgdG8gcmVmZXJyYWxzIiwgIkNoYXJnZXMgZmxvYXRpbmcgd2l0aCBESFMgdm9sdW1lIiwgIk5vbi1leGNsdXNpdmUgcHJlbWlzZXMiXQogIH0sCiAgIkVxdWlwbWVudCBMZWFzZXMiOiB7CiAgICBzdGF0dXRlQ2l0ZTogIjQyIENGUiDCpzQxMS4zNTcoYikiLCBmaW5hbmNpYWxDYXA6IG51bGwsIHZhbHVhdGlvblN0YW5kYXJkOiAiR2VuZXJhbCBNYXJrZXQgVmFsdWUgKEdNVikgLSBFcXVpcG1lbnQiLAogICAgd3JpdHRlbk1hbmRhdGU6IHRydWUsCiAgICByZXF1aXJlbWVudHM6ICJTYW1lIEdNViBzdGFuZGFyZCwgYmVuY2htYXJrZWQgdG8gY29tcGFyYWJsZSBlcXVpcG1lbnQtcmVudGFsIHRyYW5zYWN0aW9uczsgdGVybSA+PSAxIHllYXIuIiwKICAgIGNvbW1lcmNpYWxSZWFzb25hYmxlbmVzczogIkxlZ2l0aW1hdGUgcHVycG9zZSBhYnNlbnQgcmVmZXJyYWxzLiIsCiAgICBwcm9oaWJpdGVkRWxlbWVudHM6IFsiUGVyLWNsaWNrL3BlcmNlbnRhZ2UgZmVlcyBmcm9tIHJlZmVycmluZyBsZXNzb3IiLCAiTGVhc2UgdXNlZCB0byBkaXNndWlzZSByZWZlcnJhbCBwYXkiXQogIH0sCiAgIlBlcnNvbmFsIFNlcnZpY2UgQXJyYW5nZW1lbnRzIjogewogICAgc3RhdHV0ZUNpdGU6ICI0MiBDRlIgwqc0MTEuMzU3KGQpIiwgZmluYW5jaWFsQ2FwOiBudWxsLCB2YWx1YXRpb25TdGFuZGFyZDogIkZpeGVkIGluIEFkdmFuY2UgLyBSZWZlcnJhbC1JbmRlcGVuZGVudCIsCiAgICB3cml0dGVuTWFuZGF0ZTogdHJ1ZSwKICAgIHJlcXVpcmVtZW50czogIkFnZ3JlZ2F0ZSBjb21wZW5zYXRpb24gZml4ZWQgaW4gYWR2YW5jZSBmb3IgZnVsbCB0ZXJtOyBtYXkgYWRqdXN0IG9ubHkgdmlhIHByZS1zZXQsIHJlZmVycmFsLWluZGVwZW5kZW50IG1ldGhvZDsgdGVybSA+PSAxIHllYXIuIiwKICAgIGNvbW1lcmNpYWxSZWFzb25hYmxlbmVzczogIkVhY2ggc2VydmljZSBtdXN0IGluZGVwZW5kZW50bHkgc2VydmUgYSBsZWdpdGltYXRlIG5lZWQuIiwKICAgIHByb2hpYml0ZWRFbGVtZW50czogWyJPcGVuLWVuZGVkICdhcyBuZWVkZWQnIHNjb3BlcyIsICJDb21wIGNvcnJlbGF0ZWQgdG8gcmVmZXJyYWwgdm9sdW1lIiwgIlVuYWxsb2NhdGVkIGJsZW5kaW5nIG9mIHdvcmsiXQogIH0sCiAgIkJvbmEgRmlkZSBFbXBsb3ltZW50IjogewogICAgc3RhdHV0ZUNpdGU6ICI0MiBDRlIgwqc0MTEuMzU3KGMpIiwgZmluYW5jaWFsQ2FwOiBudWxsLCB2YWx1YXRpb25TdGFuZGFyZDogIklkZW50aWZpYWJsZSBQZXJzb25hbCBTZXJ2aWNlcyBGTVYiLAogICAgd3JpdHRlbk1hbmRhdGU6IGZhbHNlLAogICAgcmVxdWlyZW1lbnRzOiAiQ29tcGVuc2F0aW9uIGZvciBpZGVudGlmaWFibGUgc2VydmljZXMgbXVzdCBlcXVhbCBGTVY7IHByb2R1Y3Rpdml0eSBib251c2VzIHBlcm1pdHRlZCBPTkxZIGZvciBzZXJ2aWNlcyBwZXJzb25hbGx5IHBlcmZvcm1lZC4iLAogICAgY29tbWVyY2lhbFJlYXNvbmFibGVuZXNzOiAiQ29tbWVyY2lhbGx5IHJlYXNvbmFibGUgZXZlbiBhYnNlbnQgcmVmZXJyYWxzLiIsCiAgICBwcm9oaWJpdGVkRWxlbWVudHM6IFsiQm9udXMgZm9ybXVsYXMga2V5ZWQgdG8gZW1wbG95ZWUncyByZWZlcnJhbHMgZm9yIERIUyBwYXlhYmxlIGJ5IGVtcGxveWVyIl0KICB9LAogICJOb24tTW9uZXRhcnkgQ29tcGVuc2F0aW9uIjogewogICAgc3RhdHV0ZUNpdGU6ICI0MiBDRlIgwqc0MTEuMzU3KGspIiwgZmluYW5jaWFsQ2FwOiA1MzUsIHZhbHVhdGlvblN0YW5kYXJkOiAiU3RyaWN0IENhbGVuZGFyIFllYXIgTGltaXQiLAogICAgd3JpdHRlbk1hbmRhdGU6IGZhbHNlLAogICAgcmVxdWlyZW1lbnRzOiAiQWdncmVnYXRlIDw9ICQ1MzUvcGh5c2ljaWFuL0NZMjAyNi4gVHJhY2sgYWdncmVnYXRlIGNlbnRyYWxseS4gT25lLXRpbWUgY29ycmVjdGlvbiBhdmFpbGFibGUgPD0gMTgwIGRheXMuIiwKICAgIGNvbW1lcmNpYWxSZWFzb25hYmxlbmVzczogIk11c3Qgc2VydmUgbGVnaXRpbWF0ZSBwdXJwb3NlOyBjYW5ub3QgYmUgYSBkaXNndWlzZWQgaW5kdWNlbWVudC4iLAogICAgcHJvaGliaXRlZEVsZW1lbnRzOiBbIlZhbHVlIHRpZWQgdG8gcmVmZXJyYWwgdm9sdW1lIiwgIlBoeXNpY2lhbi1zb2xpY2l0ZWQgaXRlbXMiLCAiVW5jb3JyZWN0ZWQgZXhjZXNzIG92ZXIgY2FwIl0KICB9LAogICJJbi1PZmZpY2UgQW5jaWxsYXJ5IFNlcnZpY2VzIjogewogICAgc3RhdHV0ZUNpdGU6ICI0MiBDRlIgwqc0MTEuMzU1KGIpIiwgZmluYW5jaWFsQ2FwOiBudWxsLCB2YWx1YXRpb25TdGFuZGFyZDogIlN0cnVjdHVyYWwgLyBMb2NhdGlvbi1CYXNlZCIsCiAgICB3cml0dGVuTWFuZGF0ZTogZmFsc2UsCiAgICByZXF1aXJlbWVudHM6ICJGb3JtYWwgU3RhcmsgZ3JvdXAgcHJhY3RpY2Ugc3RhdHVzICjCpzQxMS4zNTIpLiBBbnkgY29tcCB0by9mcm9tIHBoeXNpY2lhbiBtdXN0IGNsZWFyIHNlcGFyYXRlIGV4Y2VwdGlvbi4iLAogICAgY29tbWVyY2lhbFJlYXNvbmFibGVuZXNzOiAiU2FtZSBidWlsZGluZy9jZW50cmFsaXplZCBidWlsZGluZyBhbmQgc2FtZS1zcGVjaWFsdHkgc3VwZXJ2aXNpb24gbXVzdCByZWZsZWN0IGdlbnVpbmUgY2xpbmljYWwgaW50ZWdyYXRpb24uIiwKICAgIHByb2hpYml0ZWRFbGVtZW50czogWyJGYWlsaW5nIGxvY2F0aW9uL3N1cGVydmlzaW9uIHRlc3RzIiwgIkJpbGxpbmcgdW5kZXIgd3JvbmcgTlBJL1RJTiIsICJNaXNzaW5nIGFsdGVybmF0aXZlLXN1cHBsaWVycyBub3RpY2UgZm9yIGFkdmFuY2VkIGltYWdpbmciXQogIH0sCiAgIkxpbWl0ZWQgUmVtdW5lcmF0aW9uIjogewogICAgc3RhdHV0ZUNpdGU6ICI0MiBDRlIgwqc0MTEuMzU3KHopIiwgZmluYW5jaWFsQ2FwOiA2MjM3LCB2YWx1YXRpb25TdGFuZGFyZDogIlN0cmljdCBDYWxlbmRhciBZZWFyIExpbWl0ICsgRk1WIiwKICAgIHdyaXR0ZW5NYW5kYXRlOiBmYWxzZSwKICAgIHJlcXVpcmVtZW50czogIkFnZ3JlZ2F0ZSA8PSAkNiwyMzcvcGh5c2ljaWFuL0NZMjAyNi4gTXVzdCBpbmRlcGVuZGVudGx5IHJlZmxlY3QgRk1WLiBUcmFjayBjdW11bGF0aXZlIGFjcm9zcyBkZXBhcnRtZW50cy4iLAogICAgY29tbWVyY2lhbFJlYXNvbmFibGVuZXNzOiAiRXhjaGFuZ2UgbXVzdCByZWZsZWN0IGdlbnVpbmUgdmFsdWUuIiwKICAgIHByb2hpYml0ZWRFbGVtZW50czogWyJQZXJjZW50YWdlIGNvbXAgdGllZCB0byByZWZlcnJhbHMiLCAiUmVwZWF0ZWQgdXNlIGFzIHdvcmthcm91bmQgZm9yIGRvY3VtZW50ZWQgUFNBL0VtcGxveW1lbnQiXQogIH0sCiAgIk1lZGljYWwgU3RhZmYgSW5jaWRlbnRhbHMiOiB7CiAgICBzdGF0dXRlQ2l0ZTogIjQyIENGUiDCpzQxMS4zNTcobSkiLCBmaW5hbmNpYWxDYXA6IDQ2LCB2YWx1YXRpb25TdGFuZGFyZDogIlBlci1PY2N1cnJlbmNlIENhcCIsCiAgICB3cml0dGVuTWFuZGF0ZTogZmFsc2UsCiAgICByZXF1aXJlbWVudHM6ICJQZXItb2NjdXJyZW5jZSBjYXAgPCQ0Ni9DWTIwMjYsIG9uLWNhbXB1cyB1c2Ugb25seS4iLAogICAgY29tbWVyY2lhbFJlYXNvbmFibGVuZXNzOiAiQXZhaWxhYmxlIGVxdWl0YWJseSB0byBmdWxsIG1lZGljYWwgc3RhZmYuIiwKICAgIHByb2hpYml0ZWRFbGVtZW50czogWyJTZWxlY3RpdmUvcmVmZXJyYWwtbGlua2VkIGRpc3RyaWJ1dGlvbiIsICJPZmYtY2FtcHVzIHJlZGVtcHRpb24iLCAiU3RhY2tpbmcgb2NjdXJyZW5jZXMgdG8gZXhjZWVkIGNhcCJdCiAgfSwKICAiSW5kaXJlY3QgQ29tcGVuc2F0aW9uIEFycmFuZ2VtZW50cyI6IHsKICAgIHN0YXR1dGVDaXRlOiAiNDIgQ0ZSIMKnNDExLjM1NyhwKSIsIGZpbmFuY2lhbENhcDogbnVsbCwgdmFsdWF0aW9uU3RhbmRhcmQ6ICJJbnRlcm1lZGlhcnkgVm9sdW1lIEluZGVwZW5kZW5jZSBUZXN0IiwKICAgIHdyaXR0ZW5NYW5kYXRlOiB0cnVlLAogICAgcmVxdWlyZW1lbnRzOiAiUGh5c2ljaWFuIGNvbXBlbnNhdGlvbiBmcm9tIGludGVybWVkaWF0ZSBlbnRpdHkgbXVzdCByZWZsZWN0IHB1cmUgRk1WIGZvciBwZXJzb25hbCBzZXJ2aWNlczsgbXVzdCBub3QgYmUgY2FsY3VsYXRlZCBiYXNlZCBvbiB2b2x1bWUvdmFsdWUgb2YgcmVmZXJyYWxzLiIsCiAgICBjb21tZXJjaWFsUmVhc29uYWJsZW5lc3M6ICJUaGUgdW5kZXJseWluZyBleGNoYW5nZSBtdXN0IHNlcnZlIGEgbGVnaXRpbWF0ZSBidXNpbmVzcyBwdXJwb3NlIGluZGVwZW5kZW50bHkgb2YgdGhlIGluZGlyZWN0IHJlZmVycmFsIGNoYWluLiIsCiAgICBwcm9oaWJpdGVkRWxlbWVudHM6IFsiQ29tcGVuc2F0aW9uIGZsb2F0aW5nIHdpdGggcmVmZXJyYWwgZGVuc2l0eSB0byB0aGUgcGFyZW50IGZhY2lsaXR5IiwgIkxhY2sgb2YgYSBkb2N1bWVudGVkIGNoYWluIG9mIGFncmVlbWVudHMiXQogIH0sCiAgIlBoeXNpY2lhbiBSZWNydWl0bWVudCBJbmNlbnRpdmVzIjogewogICAgc3RhdHV0ZUNpdGU6ICI0MiBDRlIgwqc0MTEuMzU3KGUpIiwgZmluYW5jaWFsQ2FwOiBudWxsLCB2YWx1YXRpb25TdGFuZGFyZDogIkdlb2dyYXBoaWMgUmVsb2NhdGlvbiBUaHJlc2hvbGQiLAogICAgd3JpdHRlbk1hbmRhdGU6IHRydWUsCiAgICByZXF1aXJlbWVudHM6ICJJbmNlbnRpdmVzIHBhaWQgdG8gaW5kdWNlIGEgcGh5c2ljaWFuIHRvIHJlbG9jYXRlIHRvIHRoZSBob3NwaXRhbCdzIGdlb2dyYXBoaWMgc2VydmljZSBhcmVhLiBNdXN0IGJlIGRvY3VtZW50ZWQgYW5kIHNpZ25lZCBieSBhbGwgcGFydGllcy4iLAogICAgY29tbWVyY2lhbFJlYXNvbmFibGVuZXNzOiAiRGVtb25zdHJhYmxlIGNvbW11bml0eSBuZWVkIGZvciB0aGUgcGh5c2ljaWFuJ3Mgc3BlY2lhbHR5IGluIHRoZSBnZW9ncmFwaGljIGFyZWEuIiwKICAgIHByb2hpYml0ZWRFbGVtZW50czogWyJJbmNlbnRpdmVzIHRpZWQgdG8gZXhwZWN0ZWQgcmVmZXJyYWwgdm9sdW1lIiwgIkZhaWxpbmcgdG8gZXN0YWJsaXNoIGEgbmV3IHByYWN0aWNlIG9yIHJlbG9jYXRlIGF0IGxlYXN0IDI1IG1pbGVzIiwgIlJlc3RyaWN0aW5nIHRoZSBwaHlzaWNpYW4gZnJvbSBlc3RhYmxpc2hpbmcgc3RhZmYgcHJpdmlsZWdlcyBlbHNld2hlcmUiXQogIH0KfTsKCi8vIENNUyAyMDI2IEN1bXVsYXRpdmUgQ2FwIENvbnN0YW50cwpjb25zdCBDTVNfQ0FQU18yMDI2ID0gewogIE5PTl9NT05FVEFSWTogNTM1LAogIExJTUlURURfUkVNVU5FUkFUSU9OOiA2MjM3LAogIElOQ0lERU5UQUxTOiA0Ngp9OwoKY29uc3QgUklTS19TVEFUVVMgPSB7CiAgSU5DT01QTEVURTogIklOQ09NUExFVEUgLSBFTlRFUiBBTEwgUklTSyBJTlBVVFMiLAogIEhJR0hfQUxFUlQ6ICJISUdIIEFMRVJUIC0gUE9URU5USUFMIFNUQVJLIExBVyBWSU9MQVRJT04iLAogIE1PREVSQVRFOiAgICJNT0RFUkFURSBSSVNLIC0gTEVHQUwgUkVWSUVXIFJFUVVJUkVEIiwKICBDT01QTElBTlQ6ICAiQ09NUExJQU5UIFBST1RPQ09MIgp9OwoKY29uc3QgRU5GT1JDRU1FTlRfU1RBVFVTID0gewogIE1PTklUT1JJTkc6ICJNT05JVE9SSU5HIiwKICBUT0xMRUQ6ICAgICAiTU9OSVRPUklORyAtIFRPTExFRCAoU0RQL1NSRFAgQUNUSVZFKSIsCiAgVVJHRU5UOiAgICAgIlVSR0VOVCAtIDwxNSBEQVlTIiwKICBDUklUSUNBTDogICAiQ1JJVElDQUwgLSBFWENMVVNJT04gUklTSyIKfTsKCi8vIFBIQVNFIDE6IERhdGEgVmFsaWRhdGlvbgpmdW5jdGlvbiB2YWxpZGF0ZUFycmFuZ2VtZW50cyhyYXdBcnJheSkgewogIGNvbnN0IHZhbGlkRGF0YSA9IFtdOwogIHJhd0FycmF5LmZvckVhY2goKHJvdywgaW5kZXgpID0+IHsKICAgIGNvbnN0IG5waVZhbGlkID0gcm93Lm5waSAmJiAvXlxkezEwfSQvLnRlc3Qocm93Lm5waS50b1N0cmluZygpKTsKICAgIGNvbnN0IGNvbXBWYWxpZCA9IHR5cGVvZiByb3cuYW5udWFsQ29tcGVuc2F0aW9uID09PSAnbnVtYmVyJyAmJiByb3cuYW5udWFsQ29tcGVuc2F0aW9uID49IDA7CiAgICBpZiAoIW5waVZhbGlkIHx8ICFjb21wVmFsaWQpIHsKICAgICAgY29uc29sZS53YXJuKGBSb3cgJHtpbmRleCArIDF9IHNraXBwZWQ6IEludmFsaWQgTlBJIG9yIENvbXBlbnNhdGlvbiAoJHtyb3cucGh5c2ljaWFuTmFtZX0pYCk7CiAgICB9IGVsc2UgewogICAgICB2YWxpZERhdGEucHVzaChyb3cpOwogICAgfQogIH0pOwogIHJldHVybiB2YWxpZERhdGE7Cn0KCi8vIFBIQVNFIDI6IE5QSSBDdW11bGF0aXZlIExlZGdlcgpmdW5jdGlvbiBidWlsZE5waUxlZGdlcih2YWxpZEFycmFuZ2VtZW50cykgewogIGNvbnN0IGxlZGdlciA9IHt9OwogIHZhbGlkQXJyYW5nZW1lbnRzLmZvckVhY2goYXJyID0+IHsKICAgIGNvbnN0IHsgbnBpLCBhcnJhbmdlbWVudFR5cGUsIGFubnVhbENvbXBlbnNhdGlvbiB9ID0gYXJyOwogICAgaWYgKCFsZWRnZXJbbnBpXSkgbGVkZ2VyW25waV0gPSB7IHBoeXNpY2lhbk5hbWU6IGFyci5waHlzaWNpYW5OYW1lLCB0b3RhbE5vbk1vbmV0YXJ5OiAwLCB0b3RhbExpbWl0ZWRSZW11bjogMCB9OwogICAgaWYgKGFycmFuZ2VtZW50VHlwZSA9PT0gIk5vbi1Nb25ldGFyeSBDb21wZW5zYXRpb24iKSBsZWRnZXJbbnBpXS50b3RhbE5vbk1vbmV0YXJ5ICs9IGFubnVhbENvbXBlbnNhdGlvbjsKICAgIGVsc2UgaWYgKGFycmFuZ2VtZW50VHlwZSA9PT0gIkxpbWl0ZWQgUmVtdW5lcmF0aW9uIikgbGVkZ2VyW25waV0udG90YWxMaW1pdGVkUmVtdW4gKz0gYW5udWFsQ29tcGVuc2F0aW9uOwogIH0pOwogIHJldHVybiBsZWRnZXI7Cn0KCi8vIFBIQVNFIDM6IEFkdmFuY2VkIFJpc2sgQXNzZXNzb3IgKHN0cnVjdHVyYWwgKyBjdW11bGF0aXZlIGNhcHMpCmZ1bmN0aW9uIGFzc2Vzc0FkdmFuY2VkU3RhcmtSaXNrKGFycmFuZ2VtZW50LCBydWxlc0RiLCBucGlMZWRnZXIpIHsKICBjb25zdCB7IG5waSwgYXJyYW5nZW1lbnRUeXBlLCBhbm51YWxDb21wZW5zYXRpb24sIGlzVm9sdW1lRGVwZW5kZW50LCBoYXNXcml0dGVuQWdyZWVtZW50LCBoYXNGbXZBcHByYWlzYWwgfSA9IGFycmFuZ2VtZW50OwogIGlmIChpc1ZvbHVtZURlcGVuZGVudCA9PT0gdW5kZWZpbmVkIHx8IGhhc1dyaXR0ZW5BZ3JlZW1lbnQgPT09IHVuZGVmaW5lZCB8fCBoYXNGbXZBcHByYWlzYWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFJJU0tfU1RBVFVTLklOQ09NUExFVEU7CiAgaWYgKGlzVm9sdW1lRGVwZW5kZW50KSByZXR1cm4gUklTS19TVEFUVVMuSElHSF9BTEVSVDsKICBjb25zdCBydWxlID0gcnVsZXNEYlthcnJhbmdlbWVudFR5cGVdOwogIGNvbnN0IHJlcXVpcmVzV3JpdGluZyA9IHJ1bGU/LndyaXR0ZW5NYW5kYXRlID8/IHRydWU7CiAgaWYgKCFoYXNXcml0dGVuQWdyZWVtZW50ICYmIHJlcXVpcmVzV3JpdGluZykgcmV0dXJuIFJJU0tfU1RBVFVTLkhJR0hfQUxFUlQ7CiAgLy8gUGVyLWFycmFuZ2VtZW50IGZpbmFuY2lhbCBjYXAgY2hlY2sgKE5vbi1Nb25ldGFyeSwgTGltaXRlZCBSZW11bmVyYXRpb24sIE1lZGljYWwgU3RhZmYgSW5jaWRlbnRhbHMpCiAgaWYgKHJ1bGU/LmZpbmFuY2lhbENhcCAhPT0gbnVsbCAmJiBydWxlPy5maW5hbmNpYWxDYXAgIT09IHVuZGVmaW5lZCAmJiBhbm51YWxDb21wZW5zYXRpb24gPiBydWxlLmZpbmFuY2lhbENhcCkKICAgIHJldHVybiBgSElHSCBBTEVSVCAtIEFSUkFOR0VNRU5UIENBUCBCUkVBQ0ggKCQke2FubnVhbENvbXBlbnNhdGlvbi50b0xvY2FsZVN0cmluZygpfSBleGNlZWRzICQke3J1bGUuZmluYW5jaWFsQ2FwLnRvTG9jYWxlU3RyaW5nKCl9ICR7cnVsZS5zdGF0dXRlQ2l0ZX0gY2FwKWA7CiAgY29uc3QgcGh5c2ljaWFuTGVkZ2VyID0gbnBpTGVkZ2VyW25waV07CiAgaWYgKHBoeXNpY2lhbkxlZGdlcikgewogICAgaWYgKGFycmFuZ2VtZW50VHlwZSA9PT0gIk5vbi1Nb25ldGFyeSBDb21wZW5zYXRpb24iICYmIHBoeXNpY2lhbkxlZGdlci50b3RhbE5vbk1vbmV0YXJ5ID4gQ01TX0NBUFNfMjAyNi5OT05fTU9ORVRBUlkpCiAgICAgIHJldHVybiBgSElHSCBBTEVSVCAtIENVTVVMQVRJVkUgQ0FQIEJSRUFDSCAoJCR7cGh5c2ljaWFuTGVkZ2VyLnRvdGFsTm9uTW9uZXRhcnkudG9Mb2NhbGVTdHJpbmcoKX0gLyAkJHtDTVNfQ0FQU18yMDI2Lk5PTl9NT05FVEFSWX0gQ1kyMDI2IGxpbWl0KWA7CiAgICBpZiAoYXJyYW5nZW1lbnRUeXBlID09PSAiTGltaXRlZCBSZW11bmVyYXRpb24iICYmIHBoeXNpY2lhbkxlZGdlci50b3RhbExpbWl0ZWRSZW11biA+IENNU19DQVBTXzIwMjYuTElNSVRFRF9SRU1VTkVSQVRJT04pCiAgICAgIHJldHVybiBgSElHSCBBTEVSVCAtIENVTVVMQVRJVkUgQ0FQIEJSRUFDSCAoJCR7cGh5c2ljaWFuTGVkZ2VyLnRvdGFsTGltaXRlZFJlbXVuLnRvTG9jYWxlU3RyaW5nKCl9IC8gJCR7Q01TX0NBUFNfMjAyNi5MSU1JVEVEX1JFTVVORVJBVElPTn0gQ1kyMDI2IGxpbWl0KWA7CiAgfQogIGlmICghaGFzV3JpdHRlbkFncmVlbWVudCB8fCAhaGFzRm12QXBwcmFpc2FsKSByZXR1cm4gUklTS19TVEFUVVMuTU9ERVJBVEU7CiAgcmV0dXJuIFJJU0tfU1RBVFVTLkNPTVBMSUFOVDsKfQoKLy8gQ01TIDYwLURheSBPdmVycGF5bWVudCBDbG9jawpmdW5jdGlvbiBhc3Nlc3NPdmVycGF5bWVudFJpc2soaW5jaWRlbnQpIHsKICBjb25zdCB7IGRhdGVJZGVudGlmaWVkLCBpc1RvbGxlZCB9ID0gaW5jaWRlbnQ7CiAgaWYgKCFkYXRlSWRlbnRpZmllZCkgcmV0dXJuIG51bGw7CiAgaWYgKGlzVG9sbGVkKSByZXR1cm4geyBkZWFkbGluZTogIlRPTExFRCAtIFBFTkRJTkcgU0RQL1NSRFAiLCBkYXlzUmVtYWluaW5nOiAiVE9MTEVEIiwgc3RhdHVzOiBFTkZPUkNFTUVOVF9TVEFUVVMuVE9MTEVEIH07CiAgY29uc3QgaWREYXRlID0gbmV3IERhdGUoZGF0ZUlkZW50aWZpZWQpOwogIGNvbnN0IGRlYWRsaW5lRGF0ZSA9IG5ldyBEYXRlKGlkRGF0ZSk7CiAgZGVhZGxpbmVEYXRlLnNldERhdGUoZGVhZGxpbmVEYXRlLmdldERhdGUoKSArIDYwKTsKICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7CiAgdG9kYXkuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgZGVhZGxpbmVEYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIGNvbnN0IGRheXNSZW1haW5pbmcgPSBNYXRoLmNlaWwoKGRlYWRsaW5lRGF0ZSAtIHRvZGF5KSAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7CiAgbGV0IHN0YXR1cyA9IEVORk9SQ0VNRU5UX1NUQVRVUy5NT05JVE9SSU5HOwogIGlmIChkYXlzUmVtYWluaW5nIDwgMCkgc3RhdHVzID0gRU5GT1JDRU1FTlRfU1RBVFVTLkNSSVRJQ0FMOwogIGVsc2UgaWYgKGRheXNSZW1haW5pbmcgPD0gMTUpIHN0YXR1cyA9IEVORk9SQ0VNRU5UX1NUQVRVUy5VUkdFTlQ7CiAgcmV0dXJuIHsgZGVhZGxpbmU6IGRlYWRsaW5lRGF0ZS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF0sIGRheXNSZW1haW5pbmcsIHN0YXR1cyB9Owp9CgovLyBFeGVjdXRpdmUgRGFzaGJvYXJkIEFnZ3JlZ2F0b3IKZnVuY3Rpb24gZ2VuZXJhdGVFeGVjdXRpdmVEYXNoYm9hcmQoYXJyYW5nZW1lbnRzQXJyYXksIG92ZXJwYXltZW50c0FycmF5KSB7CiAgLy8gQnVpbGQgbGVkZ2VyIG9uY2Ugb3V0c2lkZSBtYXAg4oCUIG5vdCBwZXItaXRlcmF0aW9uCiAgY29uc3Qgc2hhcmVkTGVkZ2VyID0gYnVpbGROcGlMZWRnZXIoYXJyYW5nZW1lbnRzQXJyYXkpOwogIGNvbnN0IGFuYWx5emVkQXJyYW5nZW1lbnRzID0gYXJyYW5nZW1lbnRzQXJyYXkubWFwKGFyciA9PiAoewogICAgLi4uYXJyLAogICAgcmlzazogYXNzZXNzQWR2YW5jZWRTdGFya1Jpc2soYXJyLCBzdGFya19ydWxlc19kYiwgc2hhcmVkTGVkZ2VyKQogIH0pKTsKICBjb25zdCBhbmFseXplZE92ZXJwYXltZW50cyA9IG92ZXJwYXltZW50c0FycmF5Lm1hcChvcCA9PiAoeyAuLi5vcCwgbWV0cmljczogYXNzZXNzT3ZlcnBheW1lbnRSaXNrKG9wKSB9KSk7CiAgcmV0dXJuIHsKICAgIHN0YXJrTWV0cmljczogewogICAgICB0b3RhbEFjdGl2ZTogYW5hbHl6ZWRBcnJhbmdlbWVudHMubGVuZ3RoLAogICAgICBoaWdoQWxlcnRDb3VudDogYW5hbHl6ZWRBcnJhbmdlbWVudHMuZmlsdGVyKGEgPT4gYS5yaXNrICYmIGEucmlzay5zdGFydHNXaXRoKCdISUdIIEFMRVJUJykpLmxlbmd0aCwKICAgICAgbW9kZXJhdGVSaXNrQ291bnQ6IGFuYWx5emVkQXJyYW5nZW1lbnRzLmZpbHRlcihhID0+IGEucmlzayA9PT0gUklTS19TVEFUVVMuTU9ERVJBVEUpLmxlbmd0aCwKICAgICAgY29tcGxpYW50Q291bnQ6IGFuYWx5emVkQXJyYW5nZW1lbnRzLmZpbHRlcihhID0+IGEucmlzayA9PT0gUklTS19TVEFUVVMuQ09NUExJQU5UKS5sZW5ndGgKICAgIH0sCiAgICBvdmVycGF5bWVudE1ldHJpY3M6IHsKICAgICAgdG90YWxJbmNpZGVudHM6IGFuYWx5emVkT3ZlcnBheW1lbnRzLmxlbmd0aCwKICAgICAgZnVuZHNBdFJpc2tVcmdlbnQ6IGFuYWx5emVkT3ZlcnBheW1lbnRzLmZpbHRlcihvcCA9PiBvcC5tZXRyaWNzPy5zdGF0dXMgPT09IEVORk9SQ0VNRU5UX1NUQVRVUy5VUkdFTlQpLnJlZHVjZSgocywgb3ApID0+IHMgKyAob3AuYW1vdW50T3dlZCB8fCAwKSwgMCksCiAgICAgIGZ1bmRzUGFzdER1ZUNyaXRpY2FsOiBhbmFseXplZE92ZXJwYXltZW50cy5maWx0ZXIob3AgPT4gb3AubWV0cmljcz8uc3RhdHVzID09PSBFTkZPUkNFTUVOVF9TVEFUVVMuQ1JJVElDQUwpLnJlZHVjZSgocywgb3ApID0+IHMgKyAob3AuYW1vdW50T3dlZCB8fCAwKSwgMCksCiAgICAgIGZ1bmRzQ3VycmVudGx5VG9sbGVkOiBhbmFseXplZE92ZXJwYXltZW50cy5maWx0ZXIob3AgPT4gb3AuaXNUb2xsZWQpLnJlZHVjZSgocywgb3ApID0+IHMgKyAob3AuYW1vdW50T3dlZCB8fCAwKSwgMCkKICAgIH0sCiAgICBleGNlcHRpb25MaXN0czogewogICAgICBpbW1lZGlhdGVMZWdhbFJldmlldzogYW5hbHl6ZWRBcnJhbmdlbWVudHMuZmlsdGVyKGEgPT4gYS5yaXNrICYmIGEucmlzay5zdGFydHNXaXRoKCdISUdIIEFMRVJUJykpLAogICAgICB1cmdlbnRSZWZ1bmRzOiBhbmFseXplZE92ZXJwYXltZW50cy5maWx0ZXIob3AgPT4gb3AubWV0cmljcz8uc3RhdHVzID09PSBFTkZPUkNFTUVOVF9TVEFUVVMuVVJHRU5UKSwKICAgICAgcGFzdER1ZVJlZnVuZHM6IGFuYWx5emVkT3ZlcnBheW1lbnRzLmZpbHRlcihvcCA9PiBvcC5tZXRyaWNzPy5zdGF0dXMgPT09IEVORk9SQ0VNRU5UX1NUQVRVUy5DUklUSUNBTCkKICAgIH0KICB9Owp9CgovLyBFeHBvcnQgVXRpbGl0aWVzCmZ1bmN0aW9uIGV4cG9ydERhc2hib2FyZFRvSnNvbihkYXNoYm9hcmRPYmplY3QpIHsKICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGFzaGJvYXJkT2JqZWN0LCBudWxsLCAyKTsKfQoKZnVuY3Rpb24gYXJyYXlUb0NzdihkYXRhQXJyYXkpIHsKICBpZiAoIWRhdGFBcnJheSB8fCBkYXRhQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gIk5vIGV4Y2VwdGlvbnMgZm91bmQuIjsKICBjb25zdCBoZWFkZXJzID0gT2JqZWN0LmtleXMoZGF0YUFycmF5WzBdKTsKICBjb25zdCBjc3ZSb3dzID0gW2hlYWRlcnMuam9pbigiLCIpXTsKICBmb3IgKGNvbnN0IHJvdyBvZiBkYXRhQXJyYXkpIHsKICAgIGNvbnN0IHZhbHVlcyA9IGhlYWRlcnMubWFwKGhlYWRlciA9PiB7CiAgICAgIGxldCB2YWwgPSByb3dbaGVhZGVyXTsKICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCkgdmFsID0gSlNPTi5zdHJpbmdpZnkodmFsKTsKICAgICAgY29uc3Qgc3RyVmFsID0gU3RyaW5nKHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gbnVsbCA/IHZhbCA6ICcnKTsKICAgICAgaWYgKHN0clZhbC5pbmNsdWRlcygnLCcpIHx8IHN0clZhbC5pbmNsdWRlcygnIicpIHx8IHN0clZhbC5pbmNsdWRlcygnXG4nKSkKICAgICAgICByZXR1cm4gYCIke3N0clZhbC5yZXBsYWNlKC8iL2csICciIicpfSJgOwogICAgICByZXR1cm4gc3RyVmFsOwogICAgfSk7CiAgICBjc3ZSb3dzLnB1c2godmFsdWVzLmpvaW4oIiwiKSk7CiAgfQogIHJldHVybiBjc3ZSb3dzLmpvaW4oIlxuIik7Cn0KCmZ1bmN0aW9uIGdlbmVyYXRlQ29tcGxpYW5jZVJlcG9ydHMoZGFzaGJvYXJkRGF0YSkgewogIGNvbnN0IHN0YXJrRXhjZXB0aW9ucyA9IGRhc2hib2FyZERhdGEuZXhjZXB0aW9uTGlzdHMuaW1tZWRpYXRlTGVnYWxSZXZpZXcubWFwKGFyciA9PiAoewogICAgIlBoeXNpY2lhbiBOYW1lIjogYXJyLnBoeXNpY2lhbk5hbWUsCiAgICAiTlBJIjogYXJyLm5waSwKICAgICJBcnJhbmdlbWVudCBUeXBlIjogYXJyLmFycmFuZ2VtZW50VHlwZSwKICAgICJBbm51YWwgQ29tcGVuc2F0aW9uIjogYCQkeyhhcnIuYW5udWFsQ29tcGVuc2F0aW9uIHx8IDApLnRvTG9jYWxlU3RyaW5nKCl9YCwKICAgICJWaW9sYXRpb24gUmVhc29uIjogYXJyLnJpc2sKICB9KSk7CiAgY29uc3QgYWxsT3BFeGNlcHRpb25zID0gWy4uLihkYXNoYm9hcmREYXRhLmV4Y2VwdGlvbkxpc3RzLnVyZ2VudFJlZnVuZHMgfHwgW10pLCAuLi5kYXNoYm9hcmREYXRhLmV4Y2VwdGlvbkxpc3RzLnBhc3REdWVSZWZ1bmRzXTsKICBjb25zdCBvdmVycGF5bWVudEV4Y2VwdGlvbnMgPSBhbGxPcEV4Y2VwdGlvbnMubWFwKG9wID0+ICh7CiAgICAiSW5jaWRlbnQgSUQiOiBvcC5pbmNpZGVudElkLAogICAgIkRhdGUgSWRlbnRpZmllZCI6IG9wLmRhdGVJZGVudGlmaWVkLAogICAgIkRheXMgUGFzdCBEdWUiOiBNYXRoLmFicyhvcC5tZXRyaWNzLmRheXNSZW1haW5pbmcpLAogICAgIkFtb3VudCBPd2VkIjogYCQkeyhvcC5hbW91bnRPd2VkIHx8IDApLnRvTG9jYWxlU3RyaW5nKCl9YCwKICAgICJFbmZvcmNlbWVudCBTdGF0dXMiOiBvcC5tZXRyaWNzLnN0YXR1cwogIH0pKTsKICByZXR1cm4geyBzdGFya0NzdjogYXJyYXlUb0NzdihzdGFya0V4Y2VwdGlvbnMpLCBvdmVycGF5bWVudHNDc3Y6IGFycmF5VG9Dc3Yob3ZlcnBheW1lbnRFeGNlcHRpb25zKSB9Owp9CgpmdW5jdGlvbiBkb3dubG9hZEZpbGUoY29udGVudCwgZmlsZW5hbWUsIG1pbWVUeXBlKSB7CiAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjb250ZW50XSwgeyB0eXBlOiBtaW1lVHlwZSB9KTsKICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgbGluay5ocmVmID0gdXJsOyBsaW5rLmRvd25sb2FkID0gZmlsZW5hbWU7CiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTsgbGluay5jbGljaygpOwogIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7IFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsKfQoKZnVuY3Rpb24gaGFuZGxlRXhwb3J0Q2xpY2soZmluYWxEYXNoYm9hcmQpIHsKICBkb3dubG9hZEZpbGUoZXhwb3J0RGFzaGJvYXJkVG9Kc29uKGZpbmFsRGFzaGJvYXJkKSwgYGNvbXBsaWFuY2Vfc25hcHNob3RfJHtEYXRlLm5vdygpfS5qc29uYCwgJ2FwcGxpY2F0aW9uL2pzb24nKTsKICBjb25zdCByZXBvcnRzID0gZ2VuZXJhdGVDb21wbGlhbmNlUmVwb3J0cyhmaW5hbERhc2hib2FyZCk7CiAgaWYgKHJlcG9ydHMuc3RhcmtDc3YgIT09ICJObyBleGNlcHRpb25zIGZvdW5kLiIpIGRvd25sb2FkRmlsZShyZXBvcnRzLnN0YXJrQ3N2LCAnc3RhcmtfaGlnaF9hbGVydF9saXN0LmNzdicsICd0ZXh0L2NzdicpOwogIGlmIChyZXBvcnRzLm92ZXJwYXltZW50c0NzdiAhPT0gIk5vIGV4Y2VwdGlvbnMgZm91bmQuIikgZG93bmxvYWRGaWxlKHJlcG9ydHMub3ZlcnBheW1lbnRzQ3N2LCAnb3ZlcnBheW1lbnRzX3Bhc3RfZHVlLmNzdicsICd0ZXh0L2NzdicpOwp9CgovLyBIZWxwZXI6IGluZmVyIGFycmFuZ2VtZW50IHR5cGUgZnJvbSBleGNlcHRpb24gY2l0YXRpb24gc3RyaW5nCmZ1bmN0aW9uIF9pbmZlckFycmFuZ2VtZW50VHlwZShleGNlcHRpb25TdHIpIHsKICBpZiAoZXhjZXB0aW9uU3RyLmluY2x1ZGVzKCc0MTEuMzU3KGMpJykgfHwgZXhjZXB0aW9uU3RyLmluY2x1ZGVzKCdFbXBsb3ltZW50JykpIHJldHVybiAnQm9uYSBGaWRlIEVtcGxveW1lbnQnOwogIGlmIChleGNlcHRpb25TdHIuaW5jbHVkZXMoJzQxMS4zNTcoZCknKSB8fCBleGNlcHRpb25TdHIuaW5jbHVkZXMoJ1BlcnNvbmFsIFNlcnZpY2VzJykpIHJldHVybiAnUGVyc29uYWwgU2VydmljZSBBcnJhbmdlbWVudHMnOwogIGlmIChleGNlcHRpb25TdHIuaW5jbHVkZXMoJzQxMS4zNTcoYSknKSB8fCBleGNlcHRpb25TdHIuaW5jbHVkZXMoJ1JlbnRhbCcpKSByZXR1cm4gJ1NwYWNlIExlYXNlcyc7CiAgaWYgKGV4Y2VwdGlvblN0ci5pbmNsdWRlcygnNDExLjM1NyhiKScpIHx8IGV4Y2VwdGlvblN0ci5pbmNsdWRlcygnRXF1aXAnKSkgcmV0dXJuICdFcXVpcG1lbnQgTGVhc2VzJzsKICBpZiAoZXhjZXB0aW9uU3RyLmluY2x1ZGVzKCc0MTEuMzU3KHApJykgfHwgZXhjZXB0aW9uU3RyLmluY2x1ZGVzKCdJbmRpcmVjdCcpKSByZXR1cm4gJ0luZGlyZWN0IENvbXBlbnNhdGlvbiBBcnJhbmdlbWVudHMnOwogIGlmIChleGNlcHRpb25TdHIuaW5jbHVkZXMoJzQxMS4zNTUnKSkgcmV0dXJuICdJbi1PZmZpY2UgQW5jaWxsYXJ5IFNlcnZpY2VzJzsKICByZXR1cm4gJ0JvbmEgRmlkZSBFbXBsb3ltZW50JzsKfQoKLy8gRXhlY3V0aXZlIERhc2hib2FyZCBVSSBSZW5kZXJlciDigJQgaW5qZWN0cyBpbnRvIGludGVsQ2FwdHVyZUJsb2NrCmZ1bmN0aW9uIHJlbmRlclN0YXJrRGFzaGJvYXJkKGRhc2hib2FyZCkgewogIGNvbnN0IGJsb2NrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ludGVsQ2FwdHVyZUJsb2NrJyk7CiAgaWYgKCFibG9jayB8fCAhZGFzaGJvYXJkKSByZXR1cm47CiAgY29uc3Qgc20gPSBkYXNoYm9hcmQuc3RhcmtNZXRyaWNzOwogIGNvbnN0IG9tID0gZGFzaGJvYXJkLm92ZXJwYXltZW50TWV0cmljczsKICBjb25zdCBoaWdoQWxlcnRzID0gZGFzaGJvYXJkLmV4Y2VwdGlvbkxpc3RzLmltbWVkaWF0ZUxlZ2FsUmV2aWV3OwogIGNvbnN0IHVyZ2VudE9wcyA9IGRhc2hib2FyZC5leGNlcHRpb25MaXN0cy51cmdlbnRSZWZ1bmRzIHx8IFtdOwogIGNvbnN0IHBhc3REdWUgPSBkYXNoYm9hcmQuZXhjZXB0aW9uTGlzdHMucGFzdER1ZVJlZnVuZHM7CiAgY29uc3QgZCA9IHdpbmRvdy5fbGFzdFN0YXJrRGFzaGJvYXJkOwoKICAvLyBGTVYgc2F0dXJhdGlvbiBiYXIgY29sb3IKICBjb25zdCBwY3QgPSBkLl9mbXZDYXBQY3QgfHwgMDsKICBjb25zdCBwY3REaXNwbGF5ID0gKHBjdCAqIDEwMCkudG9GaXhlZCgxKTsKICBjb25zdCBwY3RDb2xvciA9IHBjdCA+PSAxID8gJ3ZhcigtLWRhbmdlciknIDogcGN0ID49IDAuODUgPyAndmFyKC0td2FybmluZyknIDogJ3ZhcigtLWFjY2VudCknOwogIGNvbnN0IGJhcldpZHRoID0gTWF0aC5taW4ocGN0ICogMTAwLCAxMDApLnRvRml4ZWQoMSk7CgogIGNvbnN0IGFsZXJ0Um93cyA9IGhpZ2hBbGVydHMubGVuZ3RoCiAgICA/IGhpZ2hBbGVydHMubWFwKGEgPT4gYDx0cj48dGQ+JHthLnBoeXNpY2lhbk5hbWV9PC90ZD48dGQ+JHthLmFycmFuZ2VtZW50VHlwZX08L3RkPjx0ZD4kJHsoYS5hbm51YWxDb21wZW5zYXRpb258fDApLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48dGQgc3R5bGU9ImNvbG9yOnZhcigtLWRhbmdlcik7Zm9udC13ZWlnaHQ6NzAwOyI+JHthLnJpc2t9PC90ZD48L3RyPmApLmpvaW4oJycpCiAgICA6IGA8dHI+PHRkIGNvbHNwYW49IjQiIHN0eWxlPSJjb2xvcjp2YXIoLS1hY2NlbnQpOyI+Tm8gaGlnaC1hbGVydCBleGNlcHRpb25zLjwvdGQ+PC90cj5gOwoKICAvLyBDb21iaW5lIHVyZ2VudCArIHBhc3QtZHVlIGludG8gb25lIG92ZXJwYXltZW50IHRhYmxlCiAgY29uc3QgYWxsT3BzID0gWy4uLnVyZ2VudE9wcywgLi4ucGFzdER1ZV07CiAgY29uc3Qgb3BSb3dzID0gYWxsT3BzLmxlbmd0aAogICAgPyBhbGxPcHMubWFwKG9wID0+IHsKICAgICAgICBjb25zdCBpc1VyZ2VudCA9IG9wLm1ldHJpY3M/LnN0YXR1cyA9PT0gJ1VSR0VOVCAtIDwxNSBEQVlTJzsKICAgICAgICBjb25zdCBpc0NyaXRpY2FsID0gb3AubWV0cmljcz8uc3RhdHVzID09PSAnQ1JJVElDQUwgLSBFWENMVVNJT04gUklTSyc7CiAgICAgICAgY29uc3Qgcm93Q29sb3IgPSBpc0NyaXRpY2FsID8gJ3ZhcigtLWRhbmdlciknIDogaXNVcmdlbnQgPyAndmFyKC0td2FybmluZyknIDogJ3ZhcigtLXRleHQtbXV0ZWQpJzsKICAgICAgICByZXR1cm4gYDx0cj4KICAgICAgICAgIDx0ZD4ke29wLmluY2lkZW50SWR9PC90ZD4KICAgICAgICAgIDx0ZD4ke29wLmRhdGVJZGVudGlmaWVkfTwvdGQ+CiAgICAgICAgICA8dGQ+JHtvcC5tZXRyaWNzLmRlYWRsaW5lfTwvdGQ+CiAgICAgICAgICA8dGQgc3R5bGU9ImNvbG9yOiR7cm93Q29sb3J9O2ZvbnQtd2VpZ2h0OjcwMDsiPiR7b3AubWV0cmljcy5kYXlzUmVtYWluaW5nfTwvdGQ+CiAgICAgICAgICA8dGQgc3R5bGU9ImNvbG9yOiR7cm93Q29sb3J9O2ZvbnQtd2VpZ2h0OjcwMDsiPiQkeyhvcC5hbW91bnRPd2VkfHwwKS50b0xvY2FsZVN0cmluZygpfTwvdGQ+CiAgICAgICAgICA8dGQgc3R5bGU9ImNvbG9yOiR7cm93Q29sb3J9O2ZvbnQtd2VpZ2h0OjcwMDsiPiR7b3AubWV0cmljcy5zdGF0dXN9PC90ZD4KICAgICAgICA8L3RyPmA7CiAgICAgIH0pLmpvaW4oJycpCiAgICA6IGA8dHI+PHRkIGNvbHNwYW49IjYiIHN0eWxlPSJjb2xvcjp2YXIoLS1hY2NlbnQpOyI+Tm8gYWN0aXZlIG92ZXJwYXltZW50IGluY2lkZW50cy48L3RkPjwvdHI+YDsKCiAgYmxvY2suaW5uZXJIVE1MID0gYAogICAgPGRpdiBzdHlsZT0icGFkZGluZzoxMHB4OyBmb250LWZhbWlseTptb25vc3BhY2U7Ij4KICAgICAgPGRpdiBjbGFzcz0icmVwb3J0LXRpdGxlIiBzdHlsZT0iY29sb3I6dmFyKC0tYWNjZW50KTsgYm9yZGVyLWNvbG9yOnJnYmEoMCwyNDUsMTU1LDAuMik7Ij5bIE0wMyBdIFNUQVJLIExBVyBFWEVDVVRJVkUgQ09NUExJQU5DRSBEQVNIQk9BUkQKICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4tc2Vjb25kYXJ5LWFjdGlvbiIgc3R5bGU9InBhZGRpbmc6NHB4IDEycHg7IGZvbnQtc2l6ZToxMHB4OyIgb25jbGljaz0iaGFuZGxlRXhwb3J0Q2xpY2sod2luZG93Ll9sYXN0U3RhcmtEYXNoYm9hcmQpIj5bXHUyMTkzXSBFWFBPUlQgQUxMIFJFUE9SVFM8L2J1dHRvbj4KICAgICAgPC9kaXY+CgogICAgICA8IS0tIFJPVyAxOiBSaXNrIHN0YXR1cyBjb3VudHMgLS0+CiAgICAgIDxkaXYgY2xhc3M9Im1hdHJpeC1ncmlkIiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMnB4OyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibWF0cml4LWJveCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhLWxhYmVsIj5BY3RpdmUgQXJyYW5nZW1lbnRzPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhLXZhbHVlIj4ke3NtLnRvdGFsQWN0aXZlfTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im1hdHJpeC1ib3giPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YS1sYWJlbCI+SGlnaCBBbGVydDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YS12YWx1ZSIgc3R5bGU9ImNvbG9yOiR7c20uaGlnaEFsZXJ0Q291bnQgPiAwID8gJ3ZhcigtLWRhbmdlciknIDogJ3ZhcigtLWFjY2VudCknfSI+JHtzbS5oaWdoQWxlcnRDb3VudH08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtYXRyaXgtYm94Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRhdGEtbGFiZWwiPk1vZGVyYXRlIFJpc2s8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRhdGEtdmFsdWUiIHN0eWxlPSJjb2xvcjoke3NtLm1vZGVyYXRlUmlza0NvdW50ID4gMCA/ICd2YXIoLS13YXJuaW5nKScgOiAndmFyKC0tYWNjZW50KSd9Ij4ke3NtLm1vZGVyYXRlUmlza0NvdW50fTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im1hdHJpeC1ib3giPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YS1sYWJlbCI+Q29tcGxpYW50PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhLXZhbHVlIiBzdHlsZT0iY29sb3I6dmFyKC0tYWNjZW50KSI+JHtzbS5jb21wbGlhbnRDb3VudH08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8IS0tIFJPVyAyOiBGTVYgc2F0dXJhdGlvbiArIGNvbXBlbnNhdGlvbiBtZXRyaWNzIC0tPgogICAgICA8ZGl2IGNsYXNzPSJtYXRyaXgtZ3JpZCIgc3R5bGU9ImdyaWQtdGVtcGxhdGUtY29sdW1uczoyZnIgMWZyIDFmciAxZnI7IG1hcmdpbi1ib3R0b206MTJweDsiPgogICAgICAgIDxkaXYgY2xhc3M9Im1hdHJpeC1ib3giPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YS1sYWJlbCI+Rk1WIENhcCBTYXR1cmF0aW9uIOKAlCAkJHsoZC5fYW5udWFsQ29tcHx8MCkudG9Mb2NhbGVTdHJpbmcoKX0gLyAkJHsoZC5fZm12Q2FwfHwwKS50b0xvY2FsZVN0cmluZygpfTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YS12YWx1ZSIgc3R5bGU9ImNvbG9yOiR7cGN0Q29sb3J9Ij4ke3BjdERpc3BsYXl9JTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyLXdyYXAiPjxkaXYgY2xhc3M9InByb2dyZXNzLWJhci1maWxsIiBzdHlsZT0id2lkdGg6JHtiYXJXaWR0aH0lOyBiYWNrZ3JvdW5kOiR7cGN0Q29sb3J9OyI+PC9kaXY+PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibWF0cml4LWJveCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhLWxhYmVsIj5Db250cmFjdGVkIEhvdXJseSBSYXRlPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhLXZhbHVlIiBzdHlsZT0iZm9udC1zaXplOjE0cHg7Ij4ke2QuX2hvdXJseVJhdGUgPiAwID8gJyQnICsgZC5faG91cmx5UmF0ZS50b0xvY2FsZVN0cmluZygpIDogJ1x1MjAxNCd9PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibWF0cml4LWJveCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhLWxhYmVsIj5JbXBsaWVkIEFubnVhbCBIb3VyczwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YS12YWx1ZSIgc3R5bGU9ImZvbnQtc2l6ZToxNHB4OyI+JHtkLl9pbXBsaWVkQW5udWFsSG91cnMgIT09IG51bGwgPyBkLl9pbXBsaWVkQW5udWFsSG91cnMudG9Mb2NhbGVTdHJpbmcoKSArICcgaHJzJyA6ICdcdTIwMTQnfTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im1hdHJpeC1ib3giPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YS1sYWJlbCI+UGVyLUVuY291bnRlciBDb21wPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhLXZhbHVlIiBzdHlsZT0iZm9udC1zaXplOjE0cHg7Ij4ke2QuX3BlckVuY291bnRlckNvbXAgIT09IG51bGwgPyAnJCcgKyBkLl9wZXJFbmNvdW50ZXJDb21wLnRvTG9jYWxlU3RyaW5nKCkgOiAnXHUyMDE0J308L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8IS0tIFJPVyAzOiBTcGVjaWFsdHkgY29udGV4dCAtLT4KICAgICAgPGRpdiBjbGFzcz0ibWF0cml4LWdyaWQiIHN0eWxlPSJncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmciAxZnI7IG1hcmdpbi1ib3R0b206MTJweDsiPgogICAgICAgIDxkaXYgY2xhc3M9Im1hdHJpeC1ib3giPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YS1sYWJlbCI+U3BlY2lhbHR5IFJpc2sgUHJvZmlsZTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YS12YWx1ZSIgc3R5bGU9ImZvbnQtc2l6ZToxM3B4OyI+JHtkLl9zcGVjaWFsdHlSaXNrTGV2ZWwgfHwgJ1x1MjAxNCd9PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibWF0cml4LWJveCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhLWxhYmVsIj5WYWx1YXRpb24gU3RhbmRhcmQ8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRhdGEtdmFsdWUiIHN0eWxlPSJmb250LXNpemU6MTNweDsiPiR7ZC5fdmFsdWF0aW9uU3RhbmRhcmQgfHwgJ1x1MjAxNCd9PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibWF0cml4LWJveCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhLWxhYmVsIj5ESFMgUmVmZXJyYWwgRW5jb3VudGVyczwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YS12YWx1ZSIgc3R5bGU9ImZvbnQtc2l6ZToxNHB4OyBjb2xvcjokeyhkLl9yZWZlcnJhbEVuY291bnRlcnN8fDApID4gNTAwID8gJ3ZhcigtLXdhcm5pbmcpJyA6ICd2YXIoLS1hY2NlbnQpJ30iPiR7KGQuX3JlZmVycmFsRW5jb3VudGVyc3x8MCkgPiAwID8gKGQuX3JlZmVycmFsRW5jb3VudGVycykudG9Mb2NhbGVTdHJpbmcoKSA6ICdcdTIwMTQnfTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDwhLS0gUk9XIDQ6IE92ZXJwYXltZW50IG1ldHJpY3MgLS0+CiAgICAgIDxkaXYgY2xhc3M9Im1hdHJpeC1ncmlkIiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMnB4OyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibWF0cml4LWJveCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhLWxhYmVsIj5PdmVycGF5bWVudCBJbmNpZGVudHM8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRhdGEtdmFsdWUiPiR7b20udG90YWxJbmNpZGVudHN9PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibWF0cml4LWJveCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhLWxhYmVsIj5GdW5kcyBVcmdlbnQgKCZsdDsxNSBEYXlzKTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YS12YWx1ZSIgc3R5bGU9ImNvbG9yOiR7b20uZnVuZHNBdFJpc2tVcmdlbnQgPiAwID8gJ3ZhcigtLXdhcm5pbmcpJyA6ICd2YXIoLS1hY2NlbnQpJ30iPiQke29tLmZ1bmRzQXRSaXNrVXJnZW50LnRvTG9jYWxlU3RyaW5nKCl9PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibWF0cml4LWJveCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhLWxhYmVsIj5GdW5kcyBQYXN0IER1ZSAoQ3JpdGljYWwpPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhLXZhbHVlIiBzdHlsZT0iY29sb3I6JHtvbS5mdW5kc1Bhc3REdWVDcml0aWNhbCA+IDAgPyAndmFyKC0tZGFuZ2VyKScgOiAndmFyKC0tYWNjZW50KSd9Ij4kJHtvbS5mdW5kc1Bhc3REdWVDcml0aWNhbC50b0xvY2FsZVN0cmluZygpfTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im1hdHJpeC1ib3giPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YS1sYWJlbCI+RnVuZHMgVG9sbGVkIChTRFAvU1JEUCk8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRhdGEtdmFsdWUiIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LW11dGVkKSI+JCR7b20uZnVuZHNDdXJyZW50bHlUb2xsZWQudG9Mb2NhbGVTdHJpbmcoKX08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8IS0tIEhpZ2gtYWxlcnQgZXhjZXB0aW9uIHRhYmxlIC0tPgogICAgICA8ZGl2IGNsYXNzPSJtYXRyaXgtdGl0bGUiPlx1MjZhMCBIaWdoLUFsZXJ0IEV4Y2VwdGlvbiBMaXN0IFx1MjAxNCBJbW1lZGlhdGUgTGVnYWwgUmV2aWV3IFJlcXVpcmVkPC9kaXY+CiAgICAgIDxkaXYgc3R5bGU9Im92ZXJmbG93LXg6YXV0bzsgbWFyZ2luLWJvdHRvbToxNnB4OyI+CiAgICAgICAgPHRhYmxlIGNsYXNzPSJjb21wYXJlLXRhYmxlIj4KICAgICAgICAgIDx0aGVhZD48dHI+PHRoPlBoeXNpY2lhbiAvIEdyb3VwPC90aD48dGg+QXJyYW5nZW1lbnQgVHlwZTwvdGg+PHRoPkNvbXBlbnNhdGlvbjwvdGg+PHRoPlZpb2xhdGlvbjwvdGg+PC90cj48L3RoZWFkPgogICAgICAgICAgPHRib2R5PiR7YWxlcnRSb3dzfTwvdGJvZHk+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9kaXY+CgogICAgICA8IS0tIFVuaWZpZWQgb3ZlcnBheW1lbnQgdGFibGUgKHVyZ2VudCArIHBhc3QtZHVlKSAtLT4KICAgICAgPGRpdiBjbGFzcz0ibWF0cml4LXRpdGxlIj5cdWQ4M2RcdWRkNTAgQ01TIDYwLURheSBPdmVycGF5bWVudCBDbG9jayBcdTIwMTQgVXJnZW50ICZhbXA7IFBhc3QtRHVlPC9kaXY+CiAgICAgIDxkaXYgc3R5bGU9Im92ZXJmbG93LXg6YXV0bzsgbWFyZ2luLWJvdHRvbToxNnB4OyI+CiAgICAgICAgPHRhYmxlIGNsYXNzPSJjb21wYXJlLXRhYmxlIj4KICAgICAgICAgIDx0aGVhZD48dHI+PHRoPkluY2lkZW50IElEPC90aD48dGg+RGF0ZSBJZGVudGlmaWVkPC90aD48dGg+RGVhZGxpbmU8L3RoPjx0aD5EYXlzIFJlbWFpbmluZzwvdGg+PHRoPkFtb3VudCBPd2VkPC90aD48dGg+U3RhdHVzPC90aD48L3RyPjwvdGhlYWQ+CiAgICAgICAgICA8dGJvZHk+JHtvcFJvd3N9PC90Ym9keT4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Rpdj4KCiAgICAgIDwhLS0gU3RhdHV0b3J5IHJlZmVyZW5jZSBmb290ZXIgLS0+CiAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMHB4OyBjb2xvcjp2YXIoLS1tdXRlZCk7IGxpbmUtaGVpZ2h0OjEuODsgYm9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgcGFkZGluZy10b3A6MTBweDsiPgogICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTsgZm9udC13ZWlnaHQ6NzAwOyI+Q1kke3N0YXJrX2NvbnN0YW50cy55ZWFyfSBTVEFUVVRPUlkgUkVGRVJFTkNFPC9zcGFuPjxicj4KICAgICAgICBDTVA6ICQke3N0YXJrX2NvbnN0YW50cy5iYXNlQ21wUmF0ZS50b0xvY2FsZVN0cmluZygpfS9wcm9oaWJpdGVkIHNlcnZpY2UgJm5ic3A7fCZuYnNwOwogICAgICAgIEZDQTogJCR7c3RhcmtfY29uc3RhbnRzLmJhc2VGY2FSYXRlTWluLnRvTG9jYWxlU3RyaW5nKCl9XHUyMDEzJCR7c3RhcmtfY29uc3RhbnRzLmJhc2VGY2FSYXRlTWF4LnRvTG9jYWxlU3RyaW5nKCl9L2NsYWltICsgdHJlYmxlIGRhbWFnZXMgJm5ic3A7fCZuYnNwOwogICAgICAgIENpcmN1bXZlbnRpb246ICQke3N0YXJrX2NvbnN0YW50cy5jaXJjdW12ZW50aW9uU2NoZW1lUmF0ZS50b0xvY2FsZVN0cmluZygpfSAmbmJzcDt8Jm5ic3A7CiAgICAgICAgTm9uLU1vbmV0YXJ5IENhcDogJCR7Q01TX0NBUFNfMjAyNi5OT05fTU9ORVRBUll9ICZuYnNwO3wmbmJzcDsKICAgICAgICBMaW1pdGVkIFJlbXVuZXJhdGlvbiBDYXA6ICQke0NNU19DQVBTXzIwMjYuTElNSVRFRF9SRU1VTkVSQVRJT059ICZuYnNwO3wmbmJzcDsKICAgICAgICBNZWRpY2FsIFN0YWZmIEluY2lkZW50YWxzOiAkJHtDTVNfQ0FQU18yMDI2LklOQ0lERU5UQUxTfS9vY2N1cnJlbmNlCiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgYDsKICBibG9jay5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICBibG9jay5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTsKfQo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==