1 line
11 KiB
Python
1 line
11 KiB
Python
IyBDb3B5cmlnaHQgKEMpIDIwMjUgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmZyb20gb2RvbyBpbXBvcnQgZmllbGRzCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBBY2Nlc3NFcnJvcgoKZnJvbSAuY29tbW9uIGltcG9ydCBUZXN0VG93ZXJDb21tb24KCgpjbGFzcyBUZXN0VG93ZXJQbGFuTG9nKFRlc3RUb3dlckNvbW1vbik6CiAgICAiIiJUZXN0IHRoZSBjeC50b3dlci5wbGFuLmxvZyBtb2RlbCBhY2Nlc3MgcmlnaHRzLiIiIgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKICAgICAgICBzdXBlcigpLnNldFVwQ2xhc3MoKQoKICAgICAgICAjIENyZWF0ZSBwbGFucyB3aXRoIGRpZmZlcmVudCBhY2Nlc3MgbGV2ZWxzCiAgICAgICAgY2xzLnBsYW5fbGV2ZWxfMSA9IGNscy5QbGFuLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBQbGFuIEwxIiwKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMSIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIGNscy5wbGFuX2xldmVsXzIgPSBjbHMuUGxhbi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgUGxhbiBMMiIsCiAgICAgICAgICAgICAgICAiYWNjZXNzX2xldmVsIjogIjIiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBjbHMucGxhbl9sZXZlbF8zID0gY2xzLlBsYW4uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFBsYW4gTDMiLAogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIzIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgdGVzdCBwbGFuIGxvZ3Mgd2l0aCBzcGVjaWZpYyB1c2VycwogICAgICAgIGNscy5wbGFuX2xvZ18xID0gKAogICAgICAgICAgICBjbHMuUGxhbkxvZy53aXRoX3VzZXIoY2xzLnVzZXIpCiAgICAgICAgICAgIC5zdWRvKCkKICAgICAgICAgICAgLmNyZWF0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogY2xzLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAgICAgInBsYW5faWQiOiBjbHMucGxhbl9sZXZlbF8xLmlkLAogICAgICAgICAgICAgICAgICAgICJzdGFydF9kYXRlIjogZmllbGRzLkRhdGV0aW1lLm5vdygpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgKQoKICAgICAgICBjbHMucGxhbl9sb2dfMiA9ICgKICAgICAgICAgICAgY2xzLlBsYW5Mb2cud2l0aF91c2VyKGNscy5tYW5hZ2VyKQogICAgICAgICAgICAuc3VkbygpCiAgICAgICAgICAgIC5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IGNscy5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgICAgICJwbGFuX2lkIjogY2xzLnBsYW5fbGV2ZWxfMS5pZCwKICAgICAgICAgICAgICAgICAgICAic3RhcnRfZGF0ZSI6IGZpZWxkcy5EYXRldGltZS5ub3coKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgYWRkaXRpb25hbCBzZXJ2ZXIgZm9yIHRlc3RpbmcKICAgICAgICBjbHMuc2VydmVyXzIgPSBjbHMuU2VydmVyLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBTZXJ2ZXIgMiIsCiAgICAgICAgICAgICAgICAiaXBfdjRfYWRkcmVzcyI6ICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgInNzaF91c2VybmFtZSI6ICJ0ZXN0MiIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInRlc3QyIiwKICAgICAgICAgICAgICAgICJzc2hfcG9ydCI6IDIyLAogICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg2LCAwLCBbXSldLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg2LCAwLCBbXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3VzZXJfcmVhZF9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiVGVzdCB1c2VyIHJlYWQgYWNjZXNzIHRvIHBsYW4gbG9ncyIiIgogICAgICAgICMgQWRkIHVzZXIgdG8gc2VydmVyJ3MgdXNlcl9pZHMgdG8gaXNvbGF0ZSBjcmVhdG9yIGNoZWNrCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXNlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLnVzZXIuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ2FzZSAxOiBVc2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgd2hlbjoKICAgICAgICAjIC0gYWNjZXNzX2xldmVsID09ICIxIgogICAgICAgICMgLSBjcmVhdGVkIGJ5IHVzZXIKICAgICAgICAjIC0gdXNlciBpcyBpbiBzZXJ2ZXIncyB1c2VyX2lkcwogICAgICAgIHJlY3MgPSBzZWxmLlBsYW5Mb2cud2l0aF91c2VyKHNlbGYudXNlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICJpbiIsIFtzZWxmLnBsYW5fbG9nXzEuaWQsIHNlbGYucGxhbl9sb2dfMi5pZF0pXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjcyksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJVc2VyIHNob3VsZCBvbmx5IGJlIGFibGUgdG8gcmVhZCB0aGVpciBvd24gbG9ncyIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYucGxhbl9sb2dfMSwKICAgICAgICAgICAgcmVjcywKICAgICAgICAgICAgIlVzZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCBvd24gbG9ncyB3aGVuIGNvbmRpdGlvbnMgYXJlIG1ldCIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oCiAgICAgICAgICAgIHNlbGYucGxhbl9sb2dfMiwKICAgICAgICAgICAgcmVjcywKICAgICAgICAgICAgIlVzZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJlYWQgbG9ncyBjcmVhdGVkIGJ5IG90aGVycyIsCiAgICAgICAgKQoKICAgICAgICAjIENhc2UgMjogVXNlciBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVhZCB3aGVuIG5vdCBpbiBzZXJ2ZXIncyB1c2VyX2lkcwogICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS53cml0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg1LCAwLCAwKV0sICAjIFJlbW92ZSBhbGwgdXNlcnMKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICByZWNzID0gc2VsZi5QbGFuTG9nLndpdGhfdXNlcihzZWxmLnVzZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIHNlbGYucGxhbl9sb2dfMS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oCiAgICAgICAgICAgIHNlbGYucGxhbl9sb2dfMSwKICAgICAgICAgICAgcmVjcywKICAgICAgICAgICAgIlVzZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJlYWQgd2hlbiBub3QgaW4gc2VydmVyJ3MgdXNlcl9pZHMiLAogICAgICAgICkKCiAgICAgICAgIyBDYXNlIDM6IFVzZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJlYWQgd2hlbiBhY2Nlc3NfbGV2ZWwgPiAiMSIKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEud3JpdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ1c2VyX2lkcyI6IFsoNiwgMCwgW3NlbGYudXNlci5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBoaWdoX2FjY2Vzc19sb2cgPSAoCiAgICAgICAgICAgIHNlbGYuUGxhbkxvZy53aXRoX3VzZXIoc2VsZi51c2VyKQogICAgICAgICAgICAuc3VkbygpCiAgICAgICAgICAgIC5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICAgICAicGxhbl9pZCI6IHNlbGYucGxhbl9sZXZlbF8yLmlkLAogICAgICAgICAgICAgICAgICAgICJzdGFydF9kYXRlIjogZmllbGRzLkRhdGV0aW1lLm5vdygpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIHJlY3MgPSBzZWxmLlBsYW5Mb2cud2l0aF91c2VyKHNlbGYudXNlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9IiwgaGlnaF9hY2Nlc3NfbG9nLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnROb3RJbigKICAgICAgICAgICAgaGlnaF9hY2Nlc3NfbG9nLAogICAgICAgICAgICByZWNzLAogICAgICAgICAgICAiVXNlciBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVhZCBsb2dzIHdpdGggYWNjZXNzX2xldmVsID4gJzEnIgogICAgICAgICAgICAiIGV2ZW4gaWYgY3JlYXRlZCBieSB0aGVtIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfbWFuYWdlcl9yZWFkX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiJUZXN0IG1hbmFnZXIgcmVhZCBhY2Nlc3MgdG8gcGxhbiBsb2dzIiIiCiAgICAgICAgIyBDYXNlIDE6IE1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB3aGVuOgogICAgICAgICMgLSBhY2Nlc3NfbGV2ZWwgPD0gIjIiCiAgICAgICAgIyAtIG1hbmFnZXIgaXMgaW4gc2VydmVyJ3MgbWFuYWdlcl9pZHMKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEud3JpdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNiwgMCwgW3NlbGYubWFuYWdlci5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICByZWNzID0gc2VsZi5QbGFuTG9nLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiaW4iLCBbc2VsZi5wbGFuX2xvZ18xLmlkLCBzZWxmLnBsYW5fbG9nXzIuaWRdKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHJlY3MpLAogICAgICAgICAgICAyLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIGFsbCBsb2dzIHdoZW4gaW4gc2VydmVyJ3MgbWFuYWdlcl9pZHMiLAogICAgICAgICkKCiAgICAgICAgIyBDYXNlIDI6IE1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB3aGVuIGluIHNlcnZlcidzIHVzZXJfaWRzCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDUsIDAsIDApXSwgICMgUmVtb3ZlIGFsbCBtYW5hZ2VycwogICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHJlY3MgPSBzZWxmLlBsYW5Mb2cud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICJpbiIsIFtzZWxmLnBsYW5fbG9nXzEuaWQsIHNlbGYucGxhbl9sb2dfMi5pZF0pXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjcyksCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgYWxsIGxvZ3Mgd2hlbiBpbiBzZXJ2ZXIncyB1c2VyX2lkcyIsCiAgICAgICAgKQoKICAgICAgICAjIENhc2UgMzogTWFuYWdlciBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVhZCB3aGVuIGFjY2Vzc19sZXZlbCA+ICIyIgogICAgICAgIGhpZ2hfYWNjZXNzX2xvZyA9ICgKICAgICAgICAgICAgc2VsZi5QbGFuTG9nLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpCiAgICAgICAgICAgIC5zdWRvKCkKICAgICAgICAgICAgLmNyZWF0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgICAgICJwbGFuX2lkIjogc2VsZi5wbGFuX2xldmVsXzMuaWQsCiAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2RhdGUiOiBmaWVsZHMuRGF0ZXRpbWUubm93KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKICAgICAgICApCiAgICAgICAgcmVjcyA9IHNlbGYuUGxhbkxvZy53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBoaWdoX2FjY2Vzc19sb2cuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydE5vdEluKAogICAgICAgICAgICBoaWdoX2FjY2Vzc19sb2csCiAgICAgICAgICAgIHJlY3MsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byByZWFkIGxvZ3Mgd2l0aCBhY2Nlc3NfbGV2ZWwgPiAnMiciLAogICAgICAgICkKCiAgICAgICAgIyBDYXNlIDQ6IE1hbmFnZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJlYWQgd2hlbiBoZSBpcyBub3QKICAgICAgICAjICBpbiB1c2Vyc19pZHMgb3IgbWFuYWdlcl9pZHMKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEud3JpdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ1c2VyX2lkcyI6IFsoNSwgMCwgMCldLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg1LCAwLCAwKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgcmVjcyA9IHNlbGYuUGxhbkxvZy53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgImluIiwgW3NlbGYucGxhbl9sb2dfMS5pZCwgc2VsZi5wbGFuX2xvZ18yLmlkXSldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oCiAgICAgICAgICAgIHNlbGYucGxhbl9sb2dfMSwKICAgICAgICAgICAgcmVjcywKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJlYWQgbG9ncyB3aGVuIGhlIGlzIG5vdCIKICAgICAgICAgICAgIiBpbiB1c2Vyc19pZHMgb3IgbWFuYWdlcl9pZHMiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9yb290X3JlYWRfb25seV9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiUm9vdCBjYW4gcmVhZCBhbGwgcGxhbiBsb2dzLCBidXQgY2Fubm90IGNyZWF0ZS9tb2RpZnkvZGVsZXRlIiIiCiAgICAgICAgIyBDcmVhdGUgdGVzdCBsb2dzIHdpdGggc3VkbygpCiAgICAgICAgdGVzdF9sb2dzID0gc2VsZi5QbGFuTG9nLnN1ZG8oKS5jcmVhdGUoCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfMi5pZCwKICAgICAgICAgICAgICAgICAgICAicGxhbl9pZCI6IHBsYW4uaWQsCiAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2RhdGUiOiBmaWVsZHMuRGF0ZXRpbWUubm93KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgcGxhbiBpbiBbc2VsZi5wbGFuX2xldmVsXzEsIHNlbGYucGxhbl9sZXZlbF8yLCBzZWxmLnBsYW5fbGV2ZWxfM10KICAgICAgICAgICAgXQogICAgICAgICkKCiAgICAgICAgIyBSb290IHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgYWxsIGxvZ3MgcmVnYXJkbGVzcyBvZjoKICAgICAgICAjIC0gYWNjZXNzX2xldmVsCiAgICAgICAgIyAtIHNlcnZlciByZWxhdGlvbnNoaXBzCiAgICAgICAgIyAtIHdobyBjcmVhdGVkIHRoZW0KICAgICAgICByZWNzID0gc2VsZi5QbGFuTG9nLndpdGhfdXNlcihzZWxmLnJvb3QpLnNlYXJjaChbKCJpZCIsICJpbiIsIHRlc3RfbG9ncy5pZHMpXSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjcyksCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgICJSb290IHNob3VsZCBoYXZlIHVucmVzdHJpY3RlZCByZWFkIGFjY2VzcyB0byBhbGwgbG9ncyIsCiAgICAgICAgKQoKICAgICAgICAjIFJvb3QgY2FuJ3QgY3JlYXRlIGxvZ3MKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgc2VsZi5QbGFuTG9nLndpdGhfdXNlcihzZWxmLnJvb3QpLmNyZWF0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfMi5pZCwKICAgICAgICAgICAgICAgICAgICAicGxhbl9pZCI6IHNlbGYucGxhbl9sZXZlbF8xLmlkLAogICAgICAgICAgICAgICAgICAgICJzdGFydF9kYXRlIjogZmllbGRzLkRhdGV0aW1lLm5vdygpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCgogICAgICAgICMgUm9vdCBjYW5ub3QgbW9kaWZ5IGxvZ3MKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgdGVzdF9sb2dzLndpdGhfdXNlcihzZWxmLnJvb3QpLndyaXRlKHsic3RhcnRfZGF0ZSI6IGZpZWxkcy5EYXRldGltZS5ub3coKX0pCgogICAgICAgICMgUm9vdCBjYW5ub3QgZGVsZXRlIGxvZ3MKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgdGVzdF9sb2dzLndpdGhfdXNlcihzZWxmLnJvb3QpLnVubGluaygpCgogICAgICAgICMgVGVzdCByZWFkIG9uIGFsbCByZWNvcmRzCiAgICAgICAgYWxsX3JlY3MgPSBzZWxmLlBsYW5Mb2cud2l0aF91c2VyKHNlbGYucm9vdCkuc2VhcmNoKFtdKQogICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcigKICAgICAgICAgICAgbGVuKGFsbF9yZWNzKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlJvb3Qgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCBhbGwgcGxhbiBsb2dzIiwKICAgICAgICApCg== |