PD9waHAKaWYgKCFkZWZpbmVkKCdfUFNfVkVSU0lPTl8nKSkgewogICAgZXhpdDsKfQoKY2xhc3MgQ29yYWlsUGF0Y2hlciBleHRlbmRzIE1vZHVsZQp7CiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgICR0aGlzLT5uYW1lID0gJ2NvcmFpbHBhdGNoZXInOwogICAgICAgICR0aGlzLT50YWIgPSAnYWRtaW5pc3RyYXRpb24nOwogICAgICAgICR0aGlzLT52ZXJzaW9uID0gJzEuMS4yJzsKICAgICAgICAkdGhpcy0+YXV0aG9yID0gJ0NvcmFpbCBNYXJrZXQnOwogICAgICAgICR0aGlzLT5uZWVkX2luc3RhbmNlID0gMDsKICAgICAgICAkdGhpcy0+cHNfdmVyc2lvbnNfY29tcGxpYW5jeSA9IGFycmF5KCdtaW4nID0+ICcxLjcuMC4wJywgJ21heCcgPT4gX1BTX1ZFUlNJT05fKTsKICAgICAgICAkdGhpcy0+Ym9vdHN0cmFwID0gdHJ1ZTsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CiAgICAgICAgJHRoaXMtPmRpc3BsYXlOYW1lID0gJHRoaXMtPmwoJ0NvcmFpbCBNYXJrZXQgTGluayAmIE1lbnUgUGF0Y2hlcicpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKCkKICAgIHsKICAgICAgICByZXR1cm4gcGFyZW50OjppbnN0YWxsKCkgCiAgICAgICAgICAgICYmICR0aGlzLT5yZWdpc3Rlckhvb2soJ2Rpc3BsYXlIZWFkZXInKQogICAgICAgICAgICAmJiAkdGhpcy0+cmVnaXN0ZXJIb29rKCdkaXNwbGF5Rm9vdGVyJykKICAgICAgICAgICAgJiYgJHRoaXMtPmFwcGx5QWxsQ2hhbmdlcygpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZW50KCkKICAgIHsKICAgICAgICAkdGhpcy0+YXBwbHlBbGxDaGFuZ2VzKCk7CiAgICAgICAgJGxvZyA9IENvbmZpZ3VyYXRpb246OmdldCgnQ09SQUlMX1BBVENIRVJfTE9HJyk7CiAgICAgICAgcmV0dXJuICc8ZGl2IGNsYXNzPSJwYW5lbCI+PGgzPkNvcmFpbCBNYXJrZXQgQ2hhbmdlcyBBcHBsaWVkPC9oMz48cHJlIHN0eWxlPSJiYWNrZ3JvdW5kOiMxMTE7Y29sb3I6IzBmMDtwYWRkaW5nOjE1cHg7d2hpdGUtc3BhY2U6cHJlLXdyYXA7Ij4nIC4gaHRtbHNwZWNpYWxjaGFycygkbG9nKSAuICc8L3ByZT48L2Rpdj4nOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBob29rRGlzcGxheUhlYWRlcigkcGFyYW1zKQogICAgewogICAgICAgICR1cmkgPSBpc3NldCgkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkgPyAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA6ICcnOwogICAgICAgICRjb250cm9sbGVyID0gaXNzZXQoQ29udGV4dDo6Z2V0Q29udGV4dCgpLT5jb250cm9sbGVyLT5waHBfc2VsZikgPyBDb250ZXh0OjpnZXRDb250ZXh0KCktPmNvbnRyb2xsZXItPnBocF9zZWxmIDogJyc7CiAgICAgICAgCiAgICAgICAgJGlzTWFycXVlcyA9ICgkY29udHJvbGxlciA9PT0gJ21hbnVmYWN0dXJlcicgfHwgJGNvbnRyb2xsZXIgPT09ICdtYW51ZmFjdHVyZXJzJyB8fCBzdHJwb3MoJHVyaSwgJ21hcnF1ZXMnKSAhPT0gZmFsc2UpOwogICAgICAgICRpc1J0bCA9IChib29sKUNvbnRleHQ6OmdldENvbnRleHQoKS0+bGFuZ3VhZ2UtPmlzX3J0bDsKICAgICAgICAKICAgICAgICAkY2FydFdlaWdodENzcyA9ICcKICAgICAgICAvKiBDYXJ0ICYgQ2hlY2tvdXQgVG90YWwgV2VpZ2h0IFN0eWxpbmcgKi8KICAgICAgICAuY2FydC1zdW1tYXJ5LWxpbmUuY2FydC1zdWJ0b3RhbC13ZWlnaHQgewogICAgICAgICAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbiAhaW1wb3J0YW50OwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIHBhZGRpbmc6IDhweCAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweCAhaW1wb3J0YW50OwogICAgICAgICAgICBjb2xvcjogIzM3NDE1MSAhaW1wb3J0YW50OwogICAgICAgICAgICBib3JkZXItdG9wOiAxcHggZGFzaGVkICNlNWU3ZWIgIWltcG9ydGFudDsKICAgICAgICAgICAgbWFyZ2luLXRvcDogNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgfQogICAgICAgIC5jYXJ0LXN1bW1hcnktbGluZS5jYXJ0LXN1YnRvdGFsLXdlaWdodCBsYWJlbCwKICAgICAgICAuY2FydC1zdW1tYXJ5LWxpbmUuY2FydC1zdWJ0b3RhbC13ZWlnaHQgLmxhYmVsIHsKICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMCAhaW1wb3J0YW50OwogICAgICAgICAgICBmb250LXdlaWdodDogNzAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGNvbG9yOiAjMzc0MTUxICFpbXBvcnRhbnQ7CiAgICAgICAgfQogICAgICAgIC5jYXJ0LXN1bW1hcnktbGluZS5jYXJ0LXN1YnRvdGFsLXdlaWdodCAucHJpY2UsCiAgICAgICAgLmNhcnQtc3VtbWFyeS1saW5lLmNhcnQtc3VidG90YWwtd2VpZ2h0IC52YWx1ZSwKICAgICAgICAuY2FydC1zdW1tYXJ5LWxpbmUuY2FydC1zdWJ0b3RhbC13ZWlnaHQgLndlaWdodC12YWx1ZSB7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA4MDAgIWltcG9ydGFudDsKICAgICAgICAgICAgY29sb3I6ICMxMTE4MjcgIWltcG9ydGFudDsKICAgICAgICB9CiAgICAgICAgLmNhcnQtd2VpZ2h0LW5vdGljZSB7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTFweCAhaW1wb3J0YW50OwogICAgICAgICAgICBjb2xvcjogI2I0NTMwOSAhaW1wb3J0YW50OwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmYmViICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZWYzYzcgIWltcG9ydGFudDsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIHBhZGRpbmc6IDVweCA4cHggIWltcG9ydGFudDsKICAgICAgICAgICAgbWFyZ2luOiA2cHggMCAhaW1wb3J0YW50OwogICAgICAgICAgICBsaW5lLWhlaWdodDogMS40ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50OwogICAgICAgICAgICBnYXA6IDVweCAhaW1wb3J0YW50OwogICAgICAgIH0KICAgICAgICAuY2FydC13ZWlnaHQtbm90aWNlLmNhcnQtd2VpZ2h0LW5vdGljZS1kYW5nZXIgewogICAgICAgICAgICBjb2xvcjogIzk5MWIxYiAhaW1wb3J0YW50OwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmVmMmYyICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmODcxNzEgIWltcG9ydGFudDsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50OwogICAgICAgIH0KICAgICAgICAud2VpZ2h0LWxpbWl0LWJveCB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmZmY3ZWQgIWltcG9ydGFudDsKICAgICAgICAgICAgYm9yZGVyOiAycHggc29saWQgI2VhNTgwYyAhaW1wb3J0YW50OwogICAgICAgICAgICBjb2xvcjogIzlhMzQxMiAhaW1wb3J0YW50OwogICAgICAgICAgICBwYWRkaW5nOiAxNnB4IDIwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweCAhaW1wb3J0YW50OwogICAgICAgICAgICBtYXJnaW46IDE1cHggMCAhaW1wb3J0YW50OwogICAgICAgIH0KICAgICAgICAnOwoKICAgICAgICBpZiAoISRpc01hcnF1ZXMpIHsKICAgICAgICAgICAgcmV0dXJuICc8c3R5bGUgaWQ9ImNvcmFpbC1jYXJ0LXdlaWdodC1zdHlsZXMiPicgLiAkY2FydFdlaWdodENzcyAuICc8L3N0eWxlPic7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJwogICAgICAgIDxzdHlsZSBpZD0iY29yYWlsLWNhcnQtd2VpZ2h0LXN0eWxlcyI+JyAuICRjYXJ0V2VpZ2h0Q3NzIC4gJzwvc3R5bGU+CiAgICAgICAgPHN0eWxlIGlkPSJjb3JhaWwtbWFycXVlcy1zdHlsZXMiPgogICAgICAgIC8qID09PSBDT1JBSUwgTUFSS0VUIC0gUFJFTUlVTSBNQVJRVUVTIFNUWUxJTkcgPT09ICovCiAgICAgICAgI21hbnVmYWN0dXJlciAjY29udGVudC13cmFwcGVyLAogICAgICAgIC5wYWdlLW1hbnVmYWN0dXJlciAjY29udGVudC13cmFwcGVyIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgICAgICB9CgogICAgICAgIC8qIEhlcm8gSGVhZGVyICovCiAgICAgICAgLm1hcnF1ZXMtaGVyby1iYW5uZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMTMwOTAwIDAlLCAjMmIxMTAyIDUwJSwgI2UzMWUyNCAxMDAlKSAhaW1wb3J0YW50OwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIHBhZGRpbmc6IDI4cHggMjRweCAhaW1wb3J0YW50OwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyNXB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgOHB4IDI1cHggcmdiYSgwLDAsMCwwLjEpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OwogICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICAgICAgfQogICAgICAgIC5tYXJxdWVzLWhlcm8tYmFubmVyIGgxIHsKICAgICAgICAgICAgZm9udC1zaXplOiAyNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA5MDAgIWltcG9ydGFudDsKICAgICAgICAgICAgbWFyZ2luOiAwIDAgNnB4IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsKICAgICAgICB9CiAgICAgICAgLm1hcnF1ZXMtaGVyby1iYW5uZXIgcCB7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweCAhaW1wb3J0YW50OwogICAgICAgICAgICBjb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjg4KSAhaW1wb3J0YW50OwogICAgICAgICAgICBtYXJnaW46IDAgMCAxNnB4IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgbWF4LXdpZHRoOiA2MDBweCAhaW1wb3J0YW50OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvKiBTZWFyY2ggQm94ICovCiAgICAgICAgLm1hcnF1ZXMtc2VhcmNoLWJveCB7CiAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OwogICAgICAgICAgICBtYXgtd2lkdGg6IDQ0MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgfQogICAgICAgIC5tYXJxdWVzLXNlYXJjaC1ib3ggaW5wdXQgewogICAgICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICBwYWRkaW5nOiAxMHB4IDE2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgJyAuICgkaXNSdGwgPyAncGFkZGluZy1yaWdodDogNDJweCAhaW1wb3J0YW50OycgOiAncGFkZGluZy1sZWZ0OiA0MnB4ICFpbXBvcnRhbnQ7JykgLiAnCiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDMwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjMpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmYgIWltcG9ydGFudDsKICAgICAgICAgICAgY29sb3I6ICMyMjIyMjIgIWltcG9ydGFudDsKICAgICAgICAgICAgZm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCA0cHggMTVweCByZ2JhKDAsMCwwLDAuMTUpICFpbXBvcnRhbnQ7CiAgICAgICAgfQogICAgICAgIC5tYXJxdWVzLXNlYXJjaC1ib3ggaSB7CiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OwogICAgICAgICAgICB0b3A6IDUwJSAhaW1wb3J0YW50OwogICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSkgIWltcG9ydGFudDsKICAgICAgICAgICAgJyAuICgkaXNSdGwgPyAncmlnaHQ6IDE0cHggIWltcG9ydGFudDsnIDogJ2xlZnQ6IDE0cHggIWltcG9ydGFudDsnKSAuICcKICAgICAgICAgICAgY29sb3I6ICNlMzFlMjQgIWltcG9ydGFudDsKICAgICAgICAgICAgZm9udC1zaXplOiAyMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgfQogICAgICAgIC5tYXJxdWVzLWNvdW50ZXItYmFkZ2UgewogICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDsKICAgICAgICAgICAgbWFyZ2luLXRvcDogMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDsKICAgICAgICAgICAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC44NSkgIWltcG9ydGFudDsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50OwogICAgICAgIH0KCiAgICAgICAgLyogSGlkZSBkZWZhdWx0IHNpbXBsZSBoZWFkaW5nICovCiAgICAgICAgI21hbnVmYWN0dXJlciA+IGgxLnBhZ2UtaGVhZGluZywKICAgICAgICAjbWFpbiA+IGgxLnBhZ2UtaGVhZGluZyB7CiAgICAgICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICB9CgogICAgICAgIC8qIEJyYW5kIENhcmRzIEdyaWQgKi8KICAgICAgICAuYnJhbmQgewogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2UgIWltcG9ydGFudDsKICAgICAgICB9CiAgICAgICAgLmJyYW5kLmJyYW5kLWhpZGRlbiB7CiAgICAgICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICB9CiAgICAgICAgLmJyYW5kIC5icmFuZC1jb250YWluZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4wOCkgIWltcG9ydGFudDsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTZweCAhaW1wb3J0YW50OwogICAgICAgICAgICBwYWRkaW5nOiAyMHB4IDE2cHggMTZweCAhaW1wb3J0YW50OwogICAgICAgICAgICBib3gtc2hhZG93OiAwIDRweCAxNHB4IHJnYmEoMCwgMCwgMCwgMC4wMykgIWltcG9ydGFudDsKICAgICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgY3ViaWMtYmV6aWVyKDAuMTY1LCAwLjg0LCAwLjQ0LCAxKSAhaW1wb3J0YW50OwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4gIWltcG9ydGFudDsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50OwogICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDsKICAgICAgICAgICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgfQogICAgICAgIC5icmFuZCAuYnJhbmQtY29udGFpbmVyOmhvdmVyIHsKICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01cHgpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgMTZweCAzMnB4IHJnYmEoMjI3LCAzMCwgMzYsIDAuMTIpLCAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4wNCkgIWltcG9ydGFudDsKICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIyNywgMzAsIDM2LCAwLjM1KSAhaW1wb3J0YW50OwogICAgICAgIH0KCiAgICAgICAgLyogTG9nbyBCb3ggKi8KICAgICAgICAuYnJhbmQgLmJyYW5kLWltZyB7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGhlaWdodDogMTEwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50OwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmYWZiZmMgIWltcG9ydGFudDsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweCAhaW1wb3J0YW50OwogICAgICAgICAgICBwYWRkaW5nOiAxMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEycHggIWltcG9ydGFudDsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2YxZjNmNSAhaW1wb3J0YW50OwogICAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlICFpbXBvcnRhbnQ7CiAgICAgICAgfQogICAgICAgIC5icmFuZCAuYnJhbmQtY29udGFpbmVyOmhvdmVyIC5icmFuZC1pbWcgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgyMjcsIDMwLCAzNiwgMC4xOCkgIWltcG9ydGFudDsKICAgICAgICB9CiAgICAgICAgLmJyYW5kIC5icmFuZC1pbWcgaW1nIHsKICAgICAgICAgICAgbWF4LWhlaWdodDogODVweCAhaW1wb3J0YW50OwogICAgICAgICAgICBtYXgtd2lkdGg6IDkwJSAhaW1wb3J0YW50OwogICAgICAgICAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgb2JqZWN0LWZpdDogY29udGFpbiAhaW1wb3J0YW50OwogICAgICAgICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgICAgICAgICAgcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zNXMgZWFzZSAhaW1wb3J0YW50OwogICAgICAgIH0KICAgICAgICAuYnJhbmQgLmJyYW5kLWNvbnRhaW5lcjpob3ZlciAuYnJhbmQtaW1nIGltZyB7CiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wOCkgIWltcG9ydGFudDsKICAgICAgICB9CgogICAgICAgIC8qIEJyYW5kIE5hbWUgKi8KICAgICAgICAuYnJhbmQgaDUuYnJhbmQtbmFtZSB7CiAgICAgICAgICAgIG1hcmdpbjogMCAwIDEycHggMCAhaW1wb3J0YW50OwogICAgICAgICAgICBmb250LXNpemU6IDE2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDcwMCAhaW1wb3J0YW50OwogICAgICAgIH0KICAgICAgICAuYnJhbmQgaDUuYnJhbmQtbmFtZSBhIHsKICAgICAgICAgICAgY29sb3I6ICMxZTI5M2IgIWltcG9ydGFudDsKICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMnMgZWFzZSAhaW1wb3J0YW50OwogICAgICAgIH0KICAgICAgICAuYnJhbmQgLmJyYW5kLWNvbnRhaW5lcjpob3ZlciBoNS5icmFuZC1uYW1lIGEgewogICAgICAgICAgICBjb2xvcjogI2UzMWUyNCAhaW1wb3J0YW50OwogICAgICAgIH0KCiAgICAgICAgLyogQm90dG9tIEZvb3RlciBCYXIgKi8KICAgICAgICAuYnJhbmQgLmJyYW5kLWluZm9zIHsKICAgICAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgbWFyZ2luLXRvcDogYXV0byAhaW1wb3J0YW50OwogICAgICAgICAgICBwYWRkaW5nLXRvcDogMTRweCAhaW1wb3J0YW50OwogICAgICAgICAgICBib3JkZXItdG9wOiAxcHggZGFzaGVkICNlMmU4ZjAgIWltcG9ydGFudDsKICAgICAgICB9CiAgICAgICAgLmJyYW5kIC5icmFuZC1wcm9kdWN0cyB7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50OwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW4gIWltcG9ydGFudDsKICAgICAgICAgICAgZ2FwOiA4cHggIWltcG9ydGFudDsKICAgICAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICB9CgogICAgICAgIC8qIENvdW50IEJhZGdlICovCiAgICAgICAgLmJyYW5kIC5icmFuZC1wcm9kdWN0cyAubmItcHJvZHVjdHMgewogICAgICAgICAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDcwMCAhaW1wb3J0YW50OwogICAgICAgICAgICBwYWRkaW5nOiA0cHggMTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAyMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmMWY1ZjkgIWltcG9ydGFudDsKICAgICAgICAgICAgY29sb3I6ICM2NDc0OGIgIWltcG9ydGFudDsKICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXggIWltcG9ydGFudDsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50OwogICAgICAgIH0KICAgICAgICAuYnJhbmQgLmJyYW5kLXByb2R1Y3RzIC5uYi1wcm9kdWN0cyBpIHsKICAgICAgICAgICAgZm9udC1zdHlsZTogbm9ybWFsICFpbXBvcnRhbnQ7CiAgICAgICAgfQogICAgICAgIC5icmFuZCAuYnJhbmQtcHJvZHVjdHMgYS51cmwtdmlldyB7CiAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXIgIWltcG9ydGFudDsKICAgICAgICAgICAgZ2FwOiA2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDAgIWltcG9ydGFudDsKICAgICAgICAgICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsKICAgICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2UzMWUyNCwgI2I5MWMxYykgIWltcG9ydGFudDsKICAgICAgICAgICAgcGFkZGluZzogNXB4IDEycHggIWltcG9ydGFudDsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMjBweCAhaW1wb3J0YW50OwogICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMjI3LCAzMCwgMzYsIDAuMjUpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlICFpbXBvcnRhbnQ7CiAgICAgICAgfQogICAgICAgIC5icmFuZCAuYnJhbmQtcHJvZHVjdHMgYS51cmwtdmlldzpob3ZlciB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNiOTFjMWMsICM5OTFiMWIpICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDE0cHggcmdiYSgyMjcsIDMwLCAzNiwgMC4zNSkgIWltcG9ydGFudDsKICAgICAgICAgICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsKICAgICAgICB9CiAgICAgICAgLmJyYW5kIC5icmFuZC1wcm9kdWN0cyBhLnVybC12aWV3IGkgewogICAgICAgICAgICBmb250LXNpemU6IDE1cHggIWltcG9ydGFudDsKICAgICAgICB9CgogICAgICAgIC8qIE1vYmlsZSBPcHRpbWl6YXRpb24gKi8KICAgICAgICBAbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIHsKICAgICAgICAgICAgLmJyYW5kIHsKICAgICAgICAgICAgICAgIGZsZXg6IDAgMCA1MCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIG1heC13aWR0aDogNTAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgQG1lZGlhIChtYXgtd2lkdGg6IDU3NXB4KSB7CiAgICAgICAgICAgIC5tYXJxdWVzLWhlcm8tYmFubmVyIHsKICAgICAgICAgICAgICAgIHBhZGRpbmc6IDE4cHggMTRweCAhaW1wb3J0YW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC5tYXJxdWVzLWhlcm8tYmFubmVyIGgxIHsKICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjBweCAhaW1wb3J0YW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC5icmFuZCB7CiAgICAgICAgICAgICAgICBmbGV4OiAwIDAgNTAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICBtYXgtd2lkdGg6IDUwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiA1cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDVweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTJweCAhaW1wb3J0YW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC5icmFuZCAuYnJhbmQtY29udGFpbmVyIHsKICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEycHggOHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLmJyYW5kIC5icmFuZC1pbWcgewogICAgICAgICAgICAgICAgaGVpZ2h0OiA4MHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICBwYWRkaW5nOiA2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweCAhaW1wb3J0YW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC5icmFuZCBoNS5icmFuZC1uYW1lIHsKICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogNnB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLmJyYW5kIC5icmFuZC1wcm9kdWN0cyB7CiAgICAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICBnYXA6IDVweCAhaW1wb3J0YW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC5icmFuZCAuYnJhbmQtcHJvZHVjdHMgLm5iLXByb2R1Y3RzLAogICAgICAgICAgICAuYnJhbmQgLmJyYW5kLXByb2R1Y3RzIGEudXJsLXZpZXcgewogICAgICAgICAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICBmb250LXNpemU6IDExcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIHBhZGRpbmc6IDRweCA2cHggIWltcG9ydGFudDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICA8L3N0eWxlPic7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhvb2tEaXNwbGF5Rm9vdGVyKCRwYXJhbXMpCiAgICB7CiAgICAgICAgJHVyaSA9IGlzc2V0KCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSA/ICRfU0VSVkVSWydSRVFVRVNUX1VSSSddIDogJyc7CiAgICAgICAgJGNvbnRyb2xsZXIgPSBpc3NldChDb250ZXh0OjpnZXRDb250ZXh0KCktPmNvbnRyb2xsZXItPnBocF9zZWxmKSA/IENvbnRleHQ6OmdldENvbnRleHQoKS0+Y29udHJvbGxlci0+cGhwX3NlbGYgOiAnJzsKICAgICAgICAkaXNNYXJxdWVzID0gKCRjb250cm9sbGVyID09PSAnbWFudWZhY3R1cmVyJyB8fCAkY29udHJvbGxlciA9PT0gJ21hbnVmYWN0dXJlcnMnIHx8IHN0cnBvcygkdXJpLCAnbWFycXVlcycpICE9PSBmYWxzZSk7CiAgICAgICAgJGlzUnRsID0gKGJvb2wpQ29udGV4dDo6Z2V0Q29udGV4dCgpLT5sYW5ndWFnZS0+aXNfcnRsOwoKICAgICAgICAkanNPdXQgPSAnCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUNhcnRXZWlnaHREaXNwbGF5KCkgewogICAgICAgICAgICAgICAgZmV0Y2goIi9pbmRleC5waHA/ZmM9bW9kdWxlJm1vZHVsZT1jb3JhaWxwYXRjaGVyJmNvbnRyb2xsZXI9YWpheCZhY3Rpb249Z2V0X2NhcnRfd2VpZ2h0IikKICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihyKSB7IHJldHVybiByLmpzb24oKTsgfSkKICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YSB8fCBkYXRhLnN0YXR1cyAhPT0gInN1Y2Nlc3MiKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3ZWlnaHRTdHIgPSBkYXRhLmZvcm1hdHRlZF93ZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYWJlbFN0ciA9IGRhdGEubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleHRyYUtnID0gZGF0YS5leHRyYV9rZzsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4dHJhRmVlID0gZGF0YS5leHRyYV9zaGlwcGluZ19mZWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc1J0bCA9IGRvY3VtZW50LmRpciA9PT0gInJ0bCIgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRpciA9PT0gInJ0bCIgfHwgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoImxhbmctYXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub3RpY2VIdG1sID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmlzX292ZXJfbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYW5nZXJUZXh0ID0gZGF0YS5ub3RpY2VfdGV4dCB8fCAoaXNSdGwgPyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi2KrZhtio2YrZhzog2KrYrNin2YjYsiDYp9mE2YjYstmGINin2YTZg9mE2Yog2KfZhNit2K8g2KfZhNij2YLYtdmJINin2YTZhdiz2YXZiNitINio2Ycg2YTZhNi02K3ZhiAoMzUg2YPYuikuINmK2LHYrNmJINiq2YLZhNmK2YQg2KjYudi2INin2YTZhdmG2KrYrNin2Kog2KPZiCDYqtmC2LPZitmFINin2YTYt9mE2KjZitipINmE2LfZhNio2YrYqtmK2YYuIiA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVudGlvbiA6IExlIHBvaWRzIGTDqXBhc3NlIGxhIGxpbWl0ZSBtYXhpbWFsZSBkZSBsaXZyYWlzb24gKDM1IGtnKS4gVmV1aWxsZXogcsOpZHVpcmUgZGVzIGFydGljbGVzIG91IGRpdmlzZXIgdm90cmUgY29tbWFuZGUgZW4gZGV1eC4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGljZUh0bWwgPSBcJzxkaXYgY2xhc3M9ImNhcnQtd2VpZ2h0LW5vdGljZSBjYXJ0LXdlaWdodC1ub3RpY2UtZGFuZ2VyIj48aSBjbGFzcz0iZmEgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUiPjwvaT4gXCcgKyBkYW5nZXJUZXh0ICsgXCc8L2Rpdj5cJzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChleHRyYUtnID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vdGljZVRleHQgPSBkYXRhLm5vdGljZV90ZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub3RpY2VUZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZlZVN0ciA9IGRhdGEuZXh0cmFfc2hpcHBpbmdfZmVlX2Zvcm1hdHRlZCB8fCAoZXh0cmFGZWUgKyAiICIgKyAoZGF0YS5jdXJyZW5jeV9pc28gfHwgIkRaRCIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpY2VUZXh0ID0gaXNSdGwgPyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgItiz2LnYsSDYp9mE2KrZiNi12YrZhCDYp9mE2KPYs9in2LPZiiDZiti02YXZhCDYrdiq2YkgNSDZg9i6ICgrIiArIGZlZVN0ciArICIg2YTZgCAiICsgZXh0cmFLZyArICIg2YPYuiDYpdi22KfZgdmKKSIgOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRhcmlmIGRlIGJhc2UgcG91ciA1IGtnIGluY2x1cyAoKyIgKyBmZWVTdHIgKyAiIHBvdXIgIiArIGV4dHJhS2cgKyAiIGtnIHN1cC4pIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGljZUh0bWwgPSBcJzxkaXYgY2xhc3M9ImNhcnQtd2VpZ2h0LW5vdGljZSI+PGkgY2xhc3M9ImZhIGZhLWluZm8tY2lyY2xlIj48L2k+IFwnICsgbm90aWNlVGV4dCArIFwnPC9kaXY+XCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmlzX292ZXJfbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub0NhcnJpZXJBbGVydHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjY2hlY2tvdXQtZGVsaXZlcnktc3RlcCAuYWxlcnQtZGFuZ2VyLCAjanMtZGVsaXZlcnkgfiAuYWxlcnQtZGFuZ2VyLCAuZGVsaXZlcnktb3B0aW9ucy1saXN0IC5hbGVydC1kYW5nZXIsIC5kZWxpdmVyeS1vcHRpb25zIH4gLmFsZXJ0LWRhbmdlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub0NhcnJpZXJBbGVydHMuZm9yRWFjaChmdW5jdGlvbihhbGVydEVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsZXJ0RWwuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZXBsYWNlZC13ZWlnaHQtbGltaXQiKSkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0RWwuY2xhc3NMaXN0LmFkZCgicmVwbGFjZWQtd2VpZ2h0LWxpbWl0Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnRFbC5jbGFzc05hbWUgPSAiYWxlcnQgYWxlcnQtd2FybmluZyB3ZWlnaHQtbGltaXQtYm94IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydEVsLmlubmVySFRNTCA9IGlzUnRsID8gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwnPGg0IHN0eWxlPSJjb2xvcjojYzI0MTBjO2ZvbnQtd2VpZ2h0OjgwMDtmb250LXNpemU6MTZweDttYXJnaW46MCAwIDEwcHggMDsiPjxpIGNsYXNzPSJmYSBmYS1leGNsYW1hdGlvbi10cmlhbmdsZSI+PC9pPiDYqtmG2KjZitmHOiDYqtis2KfZiNiyINin2YTZiNiy2YYg2KfZhNmD2YTZiiDZhNmE2LfZhNio2YrYqSDYp9mE2K3YryDYp9mE2KPZgti12Ykg2KfZhNmF2LPZhdmI2K0g2KjZhyAoMzUg2YPYuik8L2g0PlwnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCc8cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTo4cHg7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS42OyI+2KfZhNmI2LLZhiDYp9mE2YPZhNmKINmE2LPZhNmR2KrZgyDYrdin2YTZitin2Ysg2YfZiCA8c3Ryb25nPlwnICsgd2VpZ2h0U3RyICsgXCc8L3N0cm9uZz7YjCDZiNmH2Ygg2KPYudmE2Ykg2YXZhiDYp9mE2K3YryDYp9mE2KPZgti12Ykg2KfZhNiw2Yog2KrZgtio2YTZhyDYtNix2YPYp9iqINin2YTYqtmI2LXZitmEINin2YTZhdiq2KfYrdipICgzNS4xINmD2LopLjwvcD5cJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwnPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206MTJweDtmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoxLjY7Ij48c3Ryb25nPtmD2YrZgSDYqtmD2YXZhCDYt9mE2KjZg9ifPC9zdHJvbmc+PGJyPuKAoiDZitix2KzZiSDYrdiw2YEg2KPZiCDYqtmC2YTZitmEINmD2YXZitipINio2LnYtiDYp9mE2YXZhtiq2KzYp9iqINmF2YYg2KfZhNiz2YTYqSDZhNmK2LXYqNitINin2YTZiNiy2YYg2KPZgtmEINmF2YYgMzUg2YPZitmE2YjYutix2KfZhdiMINmE2YrYqtmF2YPZhiDYp9mE2YbYp9mC2YQg2YXZhiDYtNit2YbZh9inINmB2YjYsdin2YsuPGJyPuKAoiDYo9mIINmK2YXZg9mG2YMg2KrZgtiz2YrZhSDYt9mE2KjZgyDYpdmE2Ykg2LfZhNio2YrYqtmK2YYg2YXZhtmB2LXZhNiq2YrZhi48L3A+XCcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcJzxhIGhyZWY9Ii9hci9jYXJ0P2FjdGlvbj1zaG93IiBjbGFzcz0iYnRuIGJ0bi13YXJuaW5nIiBzdHlsZT0iYmFja2dyb3VuZDojZWE1ODBjO2JvcmRlci1jb2xvcjojYzI0MTBjO2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6NzAwO3BhZGRpbmc6OHB4IDE4cHg7Ym9yZGVyLXJhZGl1czoyNXB4O2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7Ij48aSBjbGFzcz0iZmEgZmEtc2hvcHBpbmctY2FydCI+PC9pPiDYp9mE2LnZiNiv2Kkg2YTYqti52K/ZitmEINin2YTYs9mE2Kk8L2E+XCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcJzxoNCBzdHlsZT0iY29sb3I6I2MyNDEwYztmb250LXdlaWdodDo4MDA7Zm9udC1zaXplOjE2cHg7bWFyZ2luOjAgMCAxMHB4IDA7Ij48aSBjbGFzcz0iZmEgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUiPjwvaT4gQXR0ZW50aW9uIDogTGUgcG9pZHMgdG90YWwgZGUgbGEgY29tbWFuZGUgZMOpcGFzc2UgbGEgbGltaXRlIGF1dG9yaXPDqWUgKDM1IGtnKTwvaDQ+XCcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcJzxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOjhweDtmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoxLjY7Ij5MZSBwb2lkcyB0b3RhbCBkZSB2b3RyZSBwYW5pZXIgZXN0IGFjdHVlbGxlbWVudCBkZSA8c3Ryb25nPlwnICsgd2VpZ2h0U3RyICsgXCc8L3N0cm9uZz4sIGNlIHF1aSBkw6lwYXNzZSBsZSBwb2lkcyBtYXhpbWFsIGFjY2VwdMOpIHBhciBub3MgdHJhbnNwb3J0ZXVycyAoMzUsMSBrZykuPC9wPlwnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCc8cCBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMnB4O2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjEuNjsiPjxzdHJvbmc+UXVlIGRldmV6LXZvdXMgZmFpcmUgPzwvc3Ryb25nPjxicj7igKIgVmV1aWxsZXogcsOpZHVpcmUgbGEgcXVhbnRpdMOpIG91IHJldGlyZXIgY2VydGFpbnMgYXJ0aWNsZXMgZGUgdm90cmUgcGFuaWVyIGFmaW4gcXVlIGxlIHBvaWRzIHRvdGFsIHNvaXQgaW5mw6lyaWV1ciDDoCAzNSBrZyBwb3VyIHF1ZSBsZSB0cmFuc3BvcnRldXIgcHVpc3NlIGxlIHByZW5kcmUgZW4gY2hhcmdlLjxicj7igKIgT3Ugdm91cyBwb3V2ZXogZGl2aXNlciB2b3MgYWNoYXRzIGVuIGRldXggY29tbWFuZGVzIGRpc3RpbmN0ZXMuPC9wPlwnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCc8YSBocmVmPSIvY2FydD9hY3Rpb249c2hvdyIgY2xhc3M9ImJ0biBidG4td2FybmluZyIgc3R5bGU9ImJhY2tncm91bmQ6I2VhNTgwYztib3JkZXItY29sb3I6I2MyNDEwYztjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OjcwMDtwYWRkaW5nOjhweCAxOHB4O2JvcmRlci1yYWRpdXM6MjVweDtkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4OyI+PGkgY2xhc3M9ImZhIGZhLXNob3BwaW5nLWNhcnQiPjwvaT4gUmV0b3VybmVyIGF1IHBhbmllciBwb3VyIG1vZGlmaWVyPC9hPlwnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuY2FydC1zdW1tYXJ5LXN1YnRvdGFscywgLmNhcnQtZGV0YWlsZWQtc3VidG90YWxzLCAuY2FydC1zdW1tYXJ5LXN1YnRvdGFscy1jb250YWluZXIsICNjYXJ0LXN1YnRvdGFsLXByb2R1Y3RzIgogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVycy5mb3JFYWNoKGZ1bmN0aW9uKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnQgPSBjLmNsYXNzTGlzdC5jb250YWlucygiY2FydC1zdW1tYXJ5LWxpbmUiKSA/IGMucGFyZW50RWxlbWVudCA6IGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleGlzdGluZyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yKCIuY2FydC1zdWJ0b3RhbC13ZWlnaHQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxFbCA9IGV4aXN0aW5nLnF1ZXJ5U2VsZWN0b3IoIi53ZWlnaHQtdmFsdWUsIC52YWx1ZSwgLnByaWNlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbEVsKSB2YWxFbC5pbm5lclRleHQgPSB3ZWlnaHRTdHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxibEVsID0gZXhpc3RpbmcucXVlcnlTZWxlY3RvcigibGFiZWwsIC5sYWJlbCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYmxFbCkgbGJsRWwuaW5uZXJUZXh0ID0gbGFiZWxTdHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5jbGFzc05hbWUgPSAiY2FydC1zdW1tYXJ5LWxpbmUgY2FydC1zdWJ0b3RhbC13ZWlnaHQiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuaWQgPSAiY2FydC1zdWJ0b3RhbC13ZWlnaHQiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuaW5uZXJIVE1MID0gXCc8bGFiZWwgY2xhc3M9ImxhYmVsIj5cJyArIGxhYmVsU3RyICsgXCc8L2xhYmVsPjxzcGFuIGNsYXNzPSJ2YWx1ZSBwcmljZSB3ZWlnaHQtdmFsdWUiPlwnICsgd2VpZ2h0U3RyICsgXCc8L3NwYW4+XCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNoaXBwaW5nTGluZSA9IHBhcmVudC5xdWVyeVNlbGVjdG9yKCIuY2FydC1zdWJ0b3RhbC1zaGlwcGluZywgI2NhcnQtc3VidG90YWwtc2hpcHBpbmciKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hpcHBpbmdMaW5lICYmIHNoaXBwaW5nTGluZS5uZXh0U2libGluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGxpbmUsIHNoaXBwaW5nTGluZS5uZXh0U2libGluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGxpbmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdOb3RpY2UgPSBwYXJlbnQucXVlcnlTZWxlY3RvcigiLmNhcnQtd2VpZ2h0LW5vdGljZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nTm90aWNlKSBleGlzdGluZ05vdGljZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3RpY2VIdG1sKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdlaWdodExpbmUgPSBwYXJlbnQucXVlcnlTZWxlY3RvcigiLmNhcnQtc3VidG90YWwtd2VpZ2h0Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdlaWdodExpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0TGluZS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyZW5kIiwgbm90aWNlSHRtbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnIpIHt9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gYmluZENhcnRXZWlnaHRFdmVudHMoKSB7CiAgICAgICAgICAgICAgICBpZiAod2luZG93LnByZXN0YXNob3AgJiYgdHlwZW9mIHdpbmRvdy5wcmVzdGFzaG9wLm9uID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgcHJlc3Rhc2hvcC5vbigidXBkYXRlZENhcnQiLCB1cGRhdGVDYXJ0V2VpZ2h0RGlzcGxheSk7CiAgICAgICAgICAgICAgICAgICAgcHJlc3Rhc2hvcC5vbigidXBkYXRlQ2FydCIsIHVwZGF0ZUNhcnRXZWlnaHREaXNwbGF5KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChiaW5kQ2FydFdlaWdodEV2ZW50cywgMjUwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBiaW5kQ2FydFdlaWdodEV2ZW50cygpOwogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgdXBkYXRlQ2FydFdlaWdodERpc3BsYXkpOwogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCJbZGF0YS1zaWRlYmFyLWNhcnQtdHJpZ2dlcl0sIC5jYXJ0LXByZXZpZXcsIC5hZGQtdG8tY2FydCwgLnJlbW92ZS1mcm9tLWNhcnQsIC5qcy1pbmNyZWFzZS1wcm9kdWN0LXF1YW50aXR5LCAuanMtZGVjcmVhc2UtcHJvZHVjdC1xdWFudGl0eSIpKSB7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCh1cGRhdGVDYXJ0V2VpZ2h0RGlzcGxheSwgNjAwKTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHVwZGF0ZUNhcnRXZWlnaHREaXNwbGF5LCAxNTAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSkoKTsKICAgICAgICA8L3NjcmlwdD4KICAgICAgICAnOwoKICAgICAgICBpZiAoISRpc01hcnF1ZXMpIHsKICAgICAgICAgICAgcmV0dXJuICRqc091dDsKICAgICAgICB9CgogICAgICAgICR0aXRsZSA9ICRpc1J0bCA/ICfYp9mE2YXYp9ix2YPYp9iqINmI2KfZhNi52YTYp9mF2KfYqiDYp9mE2KrYrNin2LHZitipJyA6ICdOb3MgTWFycXVlcyBQYXJ0ZW5haXJlcyc7CiAgICAgICAgJHN1YiA9ICRpc1J0bCA/ICfYp9mD2KrYtNmBINis2YXZiti5INin2YTYudmE2KfZhdin2Kog2KfZhNiq2KzYp9ix2YrYqSDYp9mE2KPYtdmE2YrYqSDZiNin2YTZhdmI2KvZiNmC2Kkg2KfZhNmF2KrZiNmB2LHYqSDZhNiv2Ykg2YPZiNix2KfZitmEINmF2KfYsdmD2KonIDogJ0TDqWNvdXZyZXogdG91dGVzIGxlcyBtYXJxdWVzIGRlIGNvbmZpYW5jZSBkaXNwb25pYmxlcyBjaGV6IENvcmFpbCBNYXJrZXQnOwogICAgICAgICRwbGFjZWhvbGRlciA9ICRpc1J0bCA/ICfYp9io2K3YqyDYudmGINij2Yog2YXYp9ix2YPYqS4uLicgOiAnUmVjaGVyY2hlciB1bmUgbWFycXVlLi4uJzsKICAgICAgICAkdG90YWxMYWJlbCA9ICRpc1J0bCA/ICfZhdin2LHZg9ipJyA6ICdtYXJxdWVzJzsKCiAgICAgICAgcmV0dXJuICRqc091dCAuICIKICAgICAgICA8c2NyaXB0PgogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIG1haW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWFpbicpOwogICAgICAgICAgICBpZiAoIW1haW4pIHJldHVybjsKCiAgICAgICAgICAgIHZhciBicmFuZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYnJhbmQnKTsKICAgICAgICAgICAgdmFyIHRvdGFsQnJhbmRzID0gYnJhbmRzLmxlbmd0aDsKCiAgICAgICAgICAgIGJyYW5kcy5mb3JFYWNoKGZ1bmN0aW9uKGIpIHsKICAgICAgICAgICAgICAgIHZhciBuYlNwYW4gPSBiLnF1ZXJ5U2VsZWN0b3IoJy5uYi1wcm9kdWN0cyBpJyk7CiAgICAgICAgICAgICAgICBpZiAobmJTcGFuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSBuYlNwYW4uaW5uZXJUZXh0OwogICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IHRleHQubWF0Y2goL1xcZCsvKTsKICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggJiYgcGFyc2VJbnQobWF0Y2hbMF0pID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBuYlNwYW4ucGFyZW50RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmZWYyZjInOwogICAgICAgICAgICAgICAgICAgICAgICBuYlNwYW4ucGFyZW50RWxlbWVudC5zdHlsZS5jb2xvciA9ICcjZGMyNjI2JzsKICAgICAgICAgICAgICAgICAgICAgICAgbmJTcGFuLnBhcmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjZmVlMmUyJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWFycXVlcy1oZXJvLWJhbm5lcicpKSB7CiAgICAgICAgICAgICAgICB2YXIgaGVybyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgaGVyby5jbGFzc05hbWUgPSAnbWFycXVlcy1oZXJvLWJhbm5lcic7CiAgICAgICAgICAgICAgICBoZXJvLmlubmVySFRNTCA9ICc8aDE+eyR0aXRsZX08L2gxPjxwPnskc3VifTwvcD4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cIm1hcnF1ZXMtc2VhcmNoLWJveFwiPicgKwogICAgICAgICAgICAgICAgICAgICc8aSBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+c2VhcmNoPC9pPicgKwogICAgICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImJyYW5kU2VhcmNoSW5wdXRcIiBwbGFjZWhvbGRlcj1cInskcGxhY2Vob2xkZXJ9XCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz4nICsKICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJtYXJxdWVzLWNvdW50ZXItYmFkZ2VcIj48c3BhbiBpZD1cImJyYW5kQ291bnRcIj4nICsgdG90YWxCcmFuZHMgKyAnPC9zcGFuPiB7JHRvdGFsTGFiZWx9PC9kaXY+JzsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgbWFpbi5pbnNlcnRCZWZvcmUoaGVybywgbWFpbi5maXJzdENoaWxkKTsKCiAgICAgICAgICAgICAgICB2YXIgc2VhcmNoSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnJhbmRTZWFyY2hJbnB1dCcpOwogICAgICAgICAgICAgICAgdmFyIGNvdW50RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnJhbmRDb3VudCcpOwoKICAgICAgICAgICAgICAgIGlmIChzZWFyY2hJbnB1dCkgewogICAgICAgICAgICAgICAgICAgIHNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxID0gdGhpcy52YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpc2libGUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmFuZHMuZm9yRWFjaChmdW5jdGlvbihiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZUVsID0gYi5xdWVyeVNlbGVjdG9yKCcuYnJhbmQtbmFtZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBuYW1lRWwgPyBuYW1lRWwuaW5uZXJUZXh0LnRvTG93ZXJDYXNlKCkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcSB8fCBuYW1lLmluZGV4T2YocSkgIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5jbGFzc0xpc3QucmVtb3ZlKCdicmFuZC1oaWRkZW4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xhc3NMaXN0LmFkZCgnYnJhbmQtaGlkZGVuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRFbCkgY291bnRFbC5pbm5lclRleHQgPSB2aXNpYmxlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgPC9zY3JpcHQ+IjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYXBwbHlBbGxDaGFuZ2VzKCkKICAgIHsKICAgICAgICAkZGIgPSBEYjo6Z2V0SW5zdGFuY2UoKTsKICAgICAgICAkcHJlZml4ID0gX0RCX1BSRUZJWF87CiAgICAgICAgJGxvZyA9IFtdOwogICAgICAgICRsb2dbXSA9ICI9PT0gQXBwbHlpbmcgTWFycXVlcyAmIEhvb2tzOiAiIC4gZGF0ZSgnWS1tLWQgSDppOnMnKSAuICIgPT09IjsKCiAgICAgICAgLy8gUmVnaXN0ZXIgaG9va3MgZXhwbGljaXRseQogICAgICAgICR0aGlzLT5yZWdpc3Rlckhvb2soJ2Rpc3BsYXlIZWFkZXInKTsKICAgICAgICAkdGhpcy0+cmVnaXN0ZXJIb29rKCdkaXNwbGF5Rm9vdGVyJyk7CgogICAgICAgIC8vIFZlcmlmeSBNYXJxdWVzIGluIHptZW51CiAgICAgICAgJHRhYmxlTWVudSA9ICRwcmVmaXggLiAnem1lbnUnOwogICAgICAgICR0YWJsZU1lbnVMYW5nID0gJHByZWZpeCAuICd6bWVudV9sYW5nJzsKICAgICAgICAkZXhpc3RpbmcgPSAkZGItPmdldFZhbHVlKCJTRUxFQ1QgYGlkX3ptZW51YCBGUk9NIGB7JHRhYmxlTWVudUxhbmd9YCBXSEVSRSBgbGlua2AgTElLRSAnJS9tYXJxdWVzJScgT1IgYG5hbWVgID0gJ01hcnF1ZXMnIE9SIGBuYW1lYCA9ICfYp9mE2YXYp9ix2YPYp9iqJyIpOwogICAgICAgIGlmICgkZXhpc3RpbmcpIHsKICAgICAgICAgICAgJGlkX21lbnUgPSAoaW50KSRleGlzdGluZzsKICAgICAgICAgICAgJGRiLT5leGVjdXRlKCJVUERBVEUgYHskdGFibGVNZW51fWAgU0VUIGBhY3RpdmVgID0gMSwgYHBvc2l0aW9uYCA9IDQgV0hFUkUgYGlkX3ptZW51YCA9IHskaWRfbWVudX0iKTsKICAgICAgICAgICAgJGRiLT5leGVjdXRlKCJVUERBVEUgYHskdGFibGVNZW51TGFuZ31gIFNFVCBgbmFtZWAgPSAnTWFycXVlcycsIGBsaW5rYCA9ICdodHRwczovL2NvcmFpbG1hcmtldC5jb20vbWFycXVlcycgV0hFUkUgYGlkX3ptZW51YCA9IHskaWRfbWVudX0gQU5EIGBpZF9sYW5nYCA9IDEiKTsKICAgICAgICAgICAgJGRiLT5leGVjdXRlKCJVUERBVEUgYHskdGFibGVNZW51TGFuZ31gIFNFVCBgbmFtZWAgPSAn2KfZhNmF2KfYsdmD2KfYqicsIGBsaW5rYCA9ICdodHRwczovL2NvcmFpbG1hcmtldC5jb20vYXIvbWFycXVlcycgV0hFUkUgYGlkX3ptZW51YCA9IHskaWRfbWVudX0gQU5EIGBpZF9sYW5nYCA9IDIiKTsKICAgICAgICAgICAgJGxvZ1tdID0gIk1lbnUgaXRlbSB2ZXJpZmllZCAoSUQ6IHskaWRfbWVudX0pIjsKICAgICAgICB9CgogICAgICAgIC8vIENsZWFyIENhY2hlcwogICAgICAgIGlmIChjbGFzc19leGlzdHMoJ1Rvb2xzJykpIHsKICAgICAgICAgICAgVG9vbHM6OmNsZWFyU21hcnR5Q2FjaGUoKTsKICAgICAgICAgICAgVG9vbHM6OmNsZWFyWE1MQ2FjaGUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNsYXNzX2V4aXN0cygnTWVkaWEnKSkgewogICAgICAgICAgICBNZWRpYTo6Y2xlYXJDYWNoZSgpOwogICAgICAgIH0KCiAgICAgICAgJHNtYXJ0eURpcnMgPSBbCiAgICAgICAgICAgIF9QU19DQUNIRV9ESVJfIC4gJ3NtYXJ0eS9jb21waWxlJywKICAgICAgICAgICAgX1BTX0NBQ0hFX0RJUl8gLiAnc21hcnR5L2NhY2hlJywKICAgICAgICAgICAgX1BTX1JPT1RfRElSXyAuICcvdmFyL2NhY2hlL3Byb2Qvc21hcnR5L2NvbXBpbGUnLAogICAgICAgICAgICBfUFNfUk9PVF9ESVJfIC4gJy92YXIvY2FjaGUvZGV2L3NtYXJ0eS9jb21waWxlJywKICAgICAgICBdOwogICAgICAgIGZvcmVhY2ggKCRzbWFydHlEaXJzIGFzICRkaXIpIHsKICAgICAgICAgICAgaWYgKGlzX2RpcigkZGlyKSkgewogICAgICAgICAgICAgICAgJGZpbGVzID0gZ2xvYigkZGlyIC4gJy8qJyk7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkZmlsZXMgYXMgJGYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNfZmlsZSgkZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQHVubGluaygkZik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRsb2dbXSA9ICJGbHVzaGVkIGFsbCBjb21waWxlZCB0ZW1wbGF0ZXMgYW5kIGNhY2hlcy4iOwoKICAgICAgICAkZnVsbExvZyA9IGltcGxvZGUoIlxuIiwgJGxvZyk7CiAgICAgICAgQ29uZmlndXJhdGlvbjo6dXBkYXRlVmFsdWUoJ0NPUkFJTF9QQVRDSEVSX0xPRycsICRmdWxsTG9nKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KfQo=
feedback Signaler le commentaire
Donnez votre avis
Produits de la même catégorie