1 line
21 KiB
Python
1 line
21 KiB
Python
IyBDb3B5cmlnaHQgKEMpIDIwMjUgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBBY2Nlc3NFcnJvcgoKZnJvbSAuY29tbW9uX2pldHMgaW1wb3J0IFRlc3RUb3dlckpldHNDb21tb24KCgpjbGFzcyBUZXN0VG93ZXJKZXREZXBlbmRlbmN5QWNjZXNzKFRlc3RUb3dlckpldHNDb21tb24pOgogICAgIiIiCiAgICBUZXN0IGFjY2VzcyBydWxlcyBmb3IgSmV0IERlcGVuZGVuY3kgbW9kZWwKICAgICIiIgoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQogICAgIyBNYW5hZ2VyIFJlYWQgQWNjZXNzIFRlc3RzCiAgICAjID09PT09PT09PT09PT09PT09PT09PT0KCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3JlYWRfYWNjZXNzX2JvdGhfdXNlcl9pZHMoc2VsZik6CiAgICAgICAgIiIiVGVzdCBNYW5hZ2VyOiBSZWFkIHdoZW4gaW4gdXNlcl9pZHMgb2YgYm90aCBqZXRzIiIiCiAgICAgICAgXywgXywgZGVwZW5kZW5jeSA9IHNlbGYuX2NyZWF0ZV9qZXRfZGVwZW5kZW5jeSgKICAgICAgICAgICAgIkpldCAxIiwKICAgICAgICAgICAgImpldF8xIiwKICAgICAgICAgICAgIkpldCAyIiwKICAgICAgICAgICAgImpldF8yIiwKICAgICAgICAgICAgamV0X3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIGRlcGVuZHNfb25fdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgamV0X3NlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICBkZXBlbmRzX29uX3NlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICkKCiAgICAgICAgcmVjb3JkcyA9IHNlbGYuSmV0RGVwZW5kZW5jeS53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBkZXBlbmRlbmN5LmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHJlY29yZHMpLAogICAgICAgICAgICAxLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgcmVhZCB3aGVuIGluIHVzZXJfaWRzIG9mIGJvdGggamV0cyIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIGRlcGVuZGVuY3ksCiAgICAgICAgICAgIHJlY29yZHMsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBnZXQgZXhhY3RseSB0aGUgZGVwZW5kZW5jeSByZWNvcmQgd2Ugc2VhcmNoZWQgZm9yIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfbWFuYWdlcl9yZWFkX2FjY2Vzc19ib3RoX21hbmFnZXJfaWRzKHNlbGYpOgogICAgICAgICIiIlRlc3QgTWFuYWdlcjogUmVhZCB3aGVuIGluIG1hbmFnZXJfaWRzIG9mIGJvdGggamV0cyIiIgogICAgICAgIF8sIF8sIGRlcGVuZGVuY3kgPSBzZWxmLl9jcmVhdGVfamV0X2RlcGVuZGVuY3koCiAgICAgICAgICAgICJKZXQgTWFuYWdlciAxIiwKICAgICAgICAgICAgImpldF9tYW5hZ2VyXzEiLAogICAgICAgICAgICAiSmV0IE1hbmFnZXIgMiIsCiAgICAgICAgICAgICJqZXRfbWFuYWdlcl8yIiwKICAgICAgICAgICAgamV0X21hbmFnZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIGRlcGVuZHNfb25fbWFuYWdlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgamV0X3NlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICBkZXBlbmRzX29uX3NlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICkKCiAgICAgICAgcmVjb3JkcyA9IHNlbGYuSmV0RGVwZW5kZW5jeS53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBkZXBlbmRlbmN5LmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHJlY29yZHMpLAogICAgICAgICAgICAxLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgcmVhZCB3aGVuIGluIG1hbmFnZXJfaWRzIG9mIGJvdGggamV0cyIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIGRlcGVuZGVuY3ksCiAgICAgICAgICAgIHJlY29yZHMsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBnZXQgZXhhY3RseSB0aGUgZGVwZW5kZW5jeSByZWNvcmQgd2Ugc2VhcmNoZWQgZm9yIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfbWFuYWdlcl9yZWFkX2FjY2Vzc19qZXRfdXNlcl9kZXBlbmRzX21hbmFnZXIoc2VsZik6CiAgICAgICAgIiIiVGVzdCBNYW5hZ2VyOiBSZWFkIHdoZW4gaW4gdXNlcl9pZHMgb2YgamV0IGFuZCBtYW5hZ2VyX2lkcyBvZiBkZXBlbmRzIiIiCiAgICAgICAgXywgXywgZGVwZW5kZW5jeSA9IHNlbGYuX2NyZWF0ZV9qZXRfZGVwZW5kZW5jeSgKICAgICAgICAgICAgIkpldCBVc2VyIiwKICAgICAgICAgICAgImpldF91c2VyIiwKICAgICAgICAgICAgIkRlcGVuZHMgTWFuYWdlciIsCiAgICAgICAgICAgICJkZXBlbmRzX21hbmFnZXIiLAogICAgICAgICAgICBqZXRfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgZGVwZW5kc19vbl9tYW5hZ2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICBqZXRfc2VydmVyX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIGRlcGVuZHNfb25fc2VydmVyX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgKQoKICAgICAgICByZWNvcmRzID0gc2VsZi5KZXREZXBlbmRlbmN5LndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIGRlcGVuZGVuY3kuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjb3JkcyksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCByZWFkIHdoZW4gaW4gdXNlcl9pZHMgb2YgamV0IGFuZCBtYW5hZ2VyX2lkcyBvZiBkZXBlbmRzIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgZGVwZW5kZW5jeSwKICAgICAgICAgICAgcmVjb3JkcywKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIGdldCBleGFjdGx5IHRoZSBkZXBlbmRlbmN5IHJlY29yZCB3ZSBzZWFyY2hlZCBmb3IiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3JlYWRfYWNjZXNzX2pldF9tYW5hZ2VyX2RlcGVuZHNfdXNlcihzZWxmKToKICAgICAgICAiIiJUZXN0IE1hbmFnZXI6IFJlYWQgd2hlbiBpbiBtYW5hZ2VyX2lkcyBvZiBqZXQgYW5kIHVzZXJfaWRzIG9mIGRlcGVuZHMiIiIKICAgICAgICBfLCBfLCBkZXBlbmRlbmN5ID0gc2VsZi5fY3JlYXRlX2pldF9kZXBlbmRlbmN5KAogICAgICAgICAgICAiSmV0IE1hbmFnZXIiLAogICAgICAgICAgICAiamV0X21hbmFnZXIiLAogICAgICAgICAgICAiRGVwZW5kcyBVc2VyIiwKICAgICAgICAgICAgImRlcGVuZHNfdXNlciIsCiAgICAgICAgICAgIGpldF9tYW5hZ2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICBkZXBlbmRzX29uX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIGpldF9zZXJ2ZXJfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgZGVwZW5kc19vbl9zZXJ2ZXJfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICApCgogICAgICAgIHJlY29yZHMgPSBzZWxmLkpldERlcGVuZGVuY3kud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9IiwgZGVwZW5kZW5jeS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihyZWNvcmRzKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIHJlYWQgd2hlbiBpbiBtYW5hZ2VyX2lkcyBvZiBqZXQgYW5kIHVzZXJfaWRzIG9mIGRlcGVuZHMiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBkZXBlbmRlbmN5LAogICAgICAgICAgICByZWNvcmRzLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgZ2V0IGV4YWN0bHkgdGhlIGRlcGVuZGVuY3kgcmVjb3JkIHdlIHNlYXJjaGVkIGZvciIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfcmVhZF9ub19hY2Nlc3NfamV0X29ubHkoc2VsZik6CiAgICAgICAgIiIiVGVzdCBNYW5hZ2VyOiBObyByZWFkIHdoZW4gaW4gamV0IGJ1dCBOT1QgaW4gZGVwZW5kcyBvbiBqZXQiIiIKICAgICAgICBfLCBfLCBkZXBlbmRlbmN5ID0gc2VsZi5fY3JlYXRlX2pldF9kZXBlbmRlbmN5KAogICAgICAgICAgICAiSmV0IEhhcyBBY2Nlc3MiLAogICAgICAgICAgICAiamV0X2hhc19hY2Nlc3MiLAogICAgICAgICAgICAiRGVwZW5kcyBObyBBY2Nlc3MiLAogICAgICAgICAgICAiZGVwZW5kc19ub19hY2Nlc3MiLAogICAgICAgICAgICBqZXRfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgZGVwZW5kc19vbl91c2VyX2lkcz1bKDUsIDAsIDApXSwKICAgICAgICAgICAgZGVwZW5kc19vbl9tYW5hZ2VyX2lkcz1bKDUsIDAsIDApXSwKICAgICAgICAgICAgamV0X3NlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICBkZXBlbmRzX29uX3NlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICkKCiAgICAgICAgcmVjb3JkcyA9IHNlbGYuSmV0RGVwZW5kZW5jeS53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBkZXBlbmRlbmN5LmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHJlY29yZHMpLAogICAgICAgICAgICAwLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgbm90IHJlYWQgd2hlbiBub3QgaW4gZGVwZW5kc19vbiIKICAgICAgICAgICAgIiBqZXQgdXNlcl9pZHMgb3IgbWFuYWdlcl9pZHMiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3JlYWRfbm9fYWNjZXNzX2RlcGVuZHNfb25seShzZWxmKToKICAgICAgICAiIiJUZXN0IE1hbmFnZXI6IE5vIHJlYWQgd2hlbiBpbiBkZXBlbmRzIG9uIGpldCBidXQgTk9UIGluIGpldCIiIgogICAgICAgIF8sIF8sIGRlcGVuZGVuY3kgPSBzZWxmLl9jcmVhdGVfamV0X2RlcGVuZGVuY3koCiAgICAgICAgICAgICJKZXQgTm8gQWNjZXNzIiwKICAgICAgICAgICAgImpldF9ub19hY2Nlc3MiLAogICAgICAgICAgICAiRGVwZW5kcyBIYXMgQWNjZXNzIiwKICAgICAgICAgICAgImRlcGVuZHNfaGFzX2FjY2VzcyIsCiAgICAgICAgICAgIGpldF91c2VyX2lkcz1bKDUsIDAsIDApXSwKICAgICAgICAgICAgamV0X21hbmFnZXJfaWRzPVsoNSwgMCwgMCldLAogICAgICAgICAgICBkZXBlbmRzX29uX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIGpldF9zZXJ2ZXJfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgZGVwZW5kc19vbl9zZXJ2ZXJfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICApCgogICAgICAgIHJlY29yZHMgPSBzZWxmLkpldERlcGVuZGVuY3kud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9IiwgZGVwZW5kZW5jeS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihyZWNvcmRzKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIG5vdCByZWFkIHdoZW4gbm90IGluIGpldCB1c2VyX2lkcyBvciBtYW5hZ2VyX2lkcyIsCiAgICAgICAgKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQogICAgIyBNYW5hZ2VyIENSVUQgQWNjZXNzIFRlc3RzCiAgICAjID09PT09PT09PT09PT09PT09PT09PT0KCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3dyaXRlX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IE1hbmFnZXI6CiAgICAgICAgV3JpdGUgYWNjZXNzIHdoZW4gaW4gbWFuYWdlcl9pZHMgb2YgamV0IEFORCB1c2VyX2lkcwogICAgICAgIG9yIG1hbmFnZXJfaWRzIG9mIGRlcGVuZHMuCiAgICAgICAgIiIiCiAgICAgICAgIyBUZXN0IHdpdGggZGVwZW5kc19vbiB1c2VyX2lkcyAoc2FtZSBjb25kaXRpb25zIGFzIGNyZWF0ZSB0ZXN0LAogICAgICAgICMgYnV0IHRlc3RzIHdyaXRlIGFjY2VzcyBvbiBleGlzdGluZyByZWNvcmQpCiAgICAgICAgXywgXywgZGVwZW5kZW5jeTEgPSBzZWxmLl9jcmVhdGVfamV0X2RlcGVuZGVuY3koCiAgICAgICAgICAgICJXcml0ZSBKZXQgTWFuYWdlciIsCiAgICAgICAgICAgICJ3cml0ZV9qZXRfbWFuYWdlciIsCiAgICAgICAgICAgICJEZXBlbmRzIFVzZXIiLAogICAgICAgICAgICAiZGVwZW5kc191c2VyIiwKICAgICAgICAgICAgamV0X21hbmFnZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIGRlcGVuZHNfb25fdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgamV0X3NlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICBkZXBlbmRzX29uX3NlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICkKCiAgICAgICAgIyBWZXJpZnkgbWFuYWdlciBjYW4gYWNjZXNzIHRoZSBkZXBlbmRlbmN5ICh3cml0ZSBwZXJtaXNzaW9ucyBhbGxvdyByZWFkIGFjY2VzcykKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlcGVuZGVuY3kxLmludmFsaWRhdGVfcmVjb3Jkc2V0KCkKICAgICAgICAgICAgZGVwZW5kZW5jeTEud2l0aF91c2VyKHNlbGYubWFuYWdlcikucmVhZChbImpldF9pZCIsICJqZXRfZGVwZW5kc19vbl9pZCJdKQogICAgICAgICAgICAjIFBlcmZvcm0gYW4gYWN0dWFsIHdyaXRlOiBzd2l0Y2ggdG8gYW4gYWx0ZXJuYXRpdmUgdmFsaWQgZGVwZW5kc19vbiBqZXQKICAgICAgICAgICAgZGVwZW5kc19vbl9qZXRfYWx0ID0gc2VsZi5fY3JlYXRlX2pldCgKICAgICAgICAgICAgICAgICJEZXBlbmRzIFVzZXIgQWx0IiwKICAgICAgICAgICAgICAgICJkZXBlbmRzX3VzZXJfYWx0IiwKICAgICAgICAgICAgICAgIHRlbXBsYXRlPXNlbGYuamV0X3RlbXBsYXRlX3Rvd2VyX2NvcmUsCiAgICAgICAgICAgICAgICB1c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICAgICAgc2VydmVyX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgICkKICAgICAgICAgICAgZGVwZW5kZW5jeTEud2l0aF91c2VyKHNlbGYubWFuYWdlcikud3JpdGUoCiAgICAgICAgICAgICAgICB7ImpldF9kZXBlbmRzX29uX2lkIjogZGVwZW5kc19vbl9qZXRfYWx0LmlkfQogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoCiAgICAgICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byB3cml0ZSB3aGVuIGluIGpldCBtYW5hZ2VyX2lkcyAiCiAgICAgICAgICAgICAgICAiQU5EIGRlcGVuZHNfb24gdXNlcl9pZHMiCiAgICAgICAgICAgICkKCiAgICAgICAgIyBUZXN0IHdpdGggZGVwZW5kc19vbiBtYW5hZ2VyX2lkcyAtIHVzZSBkaWZmZXJlbnQgdGVtcGxhdGVzCiAgICAgICAgIyB0byBhdm9pZCBkdXBsaWNhdGUgdGVtcGxhdGUgZGVwZW5kZW5jeQogICAgICAgIF8sIF8sIGRlcGVuZGVuY3kyID0gc2VsZi5fY3JlYXRlX2pldF9kZXBlbmRlbmN5KAogICAgICAgICAgICAiV3JpdGUgSmV0IE1hbmFnZXIgMiIsCiAgICAgICAgICAgICJ3cml0ZV9qZXRfbWFuYWdlcl8yIiwKICAgICAgICAgICAgIkRlcGVuZHMgTWFuYWdlciIsCiAgICAgICAgICAgICJkZXBlbmRzX21hbmFnZXIiLAogICAgICAgICAgICBqZXRfbWFuYWdlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgZGVwZW5kc19vbl9tYW5hZ2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICBqZXRfc2VydmVyX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIGRlcGVuZHNfb25fc2VydmVyX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIGpldF90ZW1wbGF0ZT1zZWxmLmpldF90ZW1wbGF0ZV9uZ2lueCwKICAgICAgICAgICAgIyBVc2UgZGlmZmVyZW50IHRlbXBsYXRlIHRvIGF2b2lkIGR1cGxpY2F0ZQogICAgICAgICAgICBkZXBlbmRzX29uX3RlbXBsYXRlPXNlbGYuamV0X3RlbXBsYXRlX2RvY2tlciwKICAgICAgICApCgogICAgICAgIHRyeToKICAgICAgICAgICAgZGVwZW5kZW5jeTIuaW52YWxpZGF0ZV9yZWNvcmRzZXQoKQogICAgICAgICAgICBkZXBlbmRlbmN5Mi53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5yZWFkKFsiamV0X2lkIiwgImpldF9kZXBlbmRzX29uX2lkIl0pCiAgICAgICAgICAgICMgUGVyZm9ybSBhbiBhY3R1YWwgd3JpdGU6IHN3aXRjaCB0byBhbiBhbHRlcm5hdGl2ZSB2YWxpZCBkZXBlbmRzX29uIGpldAogICAgICAgICAgICBkZXBlbmRzX29uX2pldF9hbHQyID0gc2VsZi5fY3JlYXRlX2pldCgKICAgICAgICAgICAgICAgICJEZXBlbmRzIE1hbmFnZXIgQWx0IiwKICAgICAgICAgICAgICAgICJkZXBlbmRzX21hbmFnZXJfYWx0IiwKICAgICAgICAgICAgICAgIHRlbXBsYXRlPXNlbGYuamV0X3RlbXBsYXRlX2RvY2tlciwKICAgICAgICAgICAgICAgIG1hbmFnZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgICAgICBzZXJ2ZXJfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgKQogICAgICAgICAgICBkZXBlbmRlbmN5Mi53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS53cml0ZSgKICAgICAgICAgICAgICAgIHsiamV0X2RlcGVuZHNfb25faWQiOiBkZXBlbmRzX29uX2pldF9hbHQyLmlkfQogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoCiAgICAgICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byB3cml0ZSB3aGVuIGluIGpldCBtYW5hZ2VyX2lkcyIKICAgICAgICAgICAgICAgICIgQU5EIGRlcGVuZHNfb24gbWFuYWdlcl9pZHMiCiAgICAgICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX2NyZWF0ZV9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBNYW5hZ2VyOiBDcmVhdGUgd2hlbiBpbiBtYW5hZ2VyX2lkcyBvZiBqZXQgQU5EIHVzZXJfaWRzCiAgICAgICAgb3IgbWFuYWdlcl9pZHMgb2YgZGVwZW5kcy4KICAgICAgICAiIiIKICAgICAgICAjIFRyeSB0byBjcmVhdGUgZGVwZW5kZW5jeSBhcyBtYW5hZ2VyCiAgICAgICAgIyAoaGVscGVyIGVuc3VyZXMgcHJvcGVyIHRlbXBsYXRlIGRlcGVuZGVuY3kpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBfLCBfLCBkZXBlbmRlbmN5ID0gc2VsZi5fY3JlYXRlX2pldF9kZXBlbmRlbmN5KAogICAgICAgICAgICAgICAgIkNyZWF0ZSBKZXQiLAogICAgICAgICAgICAgICAgImNyZWF0ZV9qZXQiLAogICAgICAgICAgICAgICAgIkNyZWF0ZSBEZXBlbmRzIiwKICAgICAgICAgICAgICAgICJjcmVhdGVfZGVwZW5kcyIsCiAgICAgICAgICAgICAgICBqZXRfbWFuYWdlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgICAgIGRlcGVuZHNfb25fdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgICAgIGpldF9zZXJ2ZXJfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgICAgIGRlcGVuZHNfb25fc2VydmVyX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgICAgICB3aXRoX3VzZXI9c2VsZi5tYW5hZ2VyLAogICAgICAgICAgICAgICAgamV0X3RlbXBsYXRlPXNlbGYuamV0X3RlbXBsYXRlX3Rlc3QsCiAgICAgICAgICAgICAgICBkZXBlbmRzX29uX3RlbXBsYXRlPXNlbGYuamV0X3RlbXBsYXRlX3Rvd2VyX2NvcmUsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVjb3JkcyA9IHNlbGYuSmV0RGVwZW5kZW5jeS5zZWFyY2goWygiaWQiLCAiPSIsIGRlcGVuZGVuY3kuaWQpXSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgICAgIGRlcGVuZGVuY3ksCiAgICAgICAgICAgICAgICByZWNvcmRzLAogICAgICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gY3JlYXRlIGRlcGVuZGVuY3kiLAogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gY3JlYXRlIHdoZW4gaW4gamV0IG1hbmFnZXJfaWRzIikKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX2NyZWF0ZV9mb3JiaWRkZW5fbm90X2luX2pldF9tYW5hZ2VyX2lkcyhzZWxmKToKICAgICAgICAiIiJUZXN0IE1hbmFnZXI6IENhbm5vdCBjcmVhdGUgd2hlbiBub3QgaW4gamV0IG1hbmFnZXJfaWRzIiIiCiAgICAgICAgIyBTaG91bGQgbm90IGJlIGFibGUgdG8gY3JlYXRlIChtYW5hZ2VyIG5vdCBpbiBqZXQgbWFuYWdlcl9pZHMpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCiAgICAgICAgICAgIEFjY2Vzc0Vycm9yLAogICAgICAgICAgICBsYW1iZGE6IHNlbGYuX2NyZWF0ZV9qZXRfZGVwZW5kZW5jeSgKICAgICAgICAgICAgICAgICJObyBDcmVhdGUgSmV0IiwKICAgICAgICAgICAgICAgICJub19jcmVhdGVfamV0IiwKICAgICAgICAgICAgICAgICJObyBDcmVhdGUgRGVwZW5kcyIsCiAgICAgICAgICAgICAgICAibm9fY3JlYXRlX2RlcGVuZHMiLAogICAgICAgICAgICAgICAgamV0X3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgICAgICBkZXBlbmRzX29uX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgICAgICBqZXRfc2VydmVyX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgICAgICBkZXBlbmRzX29uX3NlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICAgICAgd2l0aF91c2VyPXNlbGYubWFuYWdlciwKICAgICAgICAgICAgICAgIGpldF90ZW1wbGF0ZT1zZWxmLmpldF90ZW1wbGF0ZV90ZXN0LAogICAgICAgICAgICAgICAgZGVwZW5kc19vbl90ZW1wbGF0ZT1zZWxmLmpldF90ZW1wbGF0ZV90b3dlcl9jb3JlLAogICAgICAgICAgICApLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX2NyZWF0ZV9mb3JiaWRkZW5fbm90X2luX2RlcGVuZHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBNYW5hZ2VyOiBDYW5ub3QgY3JlYXRlIHdoZW4gaW4gamV0IG1hbmFnZXJfaWRzIGJ1dCBOT1QgaW4gZGVwZW5kcy4KICAgICAgICAiIiIKICAgICAgICAjIFNob3VsZCBub3QgYmUgYWJsZSB0byBjcmVhdGUgKG1hbmFnZXIgaGFzIG5vIGFjY2VzcyB0byBkZXBlbmRzKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAogICAgICAgICAgICBBY2Nlc3NFcnJvciwKICAgICAgICAgICAgbGFtYmRhOiBzZWxmLl9jcmVhdGVfamV0X2RlcGVuZGVuY3koCiAgICAgICAgICAgICAgICAiQ3JlYXRlIEpldCIsCiAgICAgICAgICAgICAgICAiY3JlYXRlX2pldCIsCiAgICAgICAgICAgICAgICAiTm8gRGVwZW5kcyBBY2Nlc3MiLAogICAgICAgICAgICAgICAgIm5vX2RlcGVuZHNfYWNjZXNzIiwKICAgICAgICAgICAgICAgIGpldF9tYW5hZ2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICAgICAgZGVwZW5kc19vbl91c2VyX2lkcz1bKDUsIDAsIDApXSwKICAgICAgICAgICAgICAgIGRlcGVuZHNfb25fbWFuYWdlcl9pZHM9Wyg1LCAwLCAwKV0sCiAgICAgICAgICAgICAgICBqZXRfc2VydmVyX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgICAgICBkZXBlbmRzX29uX3NlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICAgICAgd2l0aF91c2VyPXNlbGYubWFuYWdlciwKICAgICAgICAgICAgICAgIGpldF90ZW1wbGF0ZT1zZWxmLmpldF90ZW1wbGF0ZV90ZXN0LAogICAgICAgICAgICAgICAgZGVwZW5kc19vbl90ZW1wbGF0ZT1zZWxmLmpldF90ZW1wbGF0ZV90b3dlcl9jb3JlLAogICAgICAgICAgICApLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3VubGlua19hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBNYW5hZ2VyOiBEZWxldGUgd2hlbiBpbiBtYW5hZ2VyX2lkcyBvZiBqZXQgQU5EIHVzZXJfaWRzCiAgICAgICAgb3IgbWFuYWdlcl9pZHMgb2YgZGVwZW5kcy4KICAgICAgICAiIiIKICAgICAgICBfLCBfLCBkZXBlbmRlbmN5ID0gc2VsZi5fY3JlYXRlX2pldF9kZXBlbmRlbmN5KAogICAgICAgICAgICAiRGVsZXRlIEpldCIsCiAgICAgICAgICAgICJkZWxldGVfamV0IiwKICAgICAgICAgICAgIkRlbGV0ZSBEZXBlbmRzIiwKICAgICAgICAgICAgImRlbGV0ZV9kZXBlbmRzIiwKICAgICAgICAgICAgamV0X21hbmFnZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIGRlcGVuZHNfb25fdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgamV0X3NlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICBkZXBlbmRzX29uX3NlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICB3aXRoX3VzZXI9c2VsZi5tYW5hZ2VyLAogICAgICAgICkKCiAgICAgICAgIyBSZWZyZXNoIGRlcGVuZGVuY3kgaW4gbWFuYWdlciBjb250ZXh0IHRvIGVuc3VyZSBhY2Nlc3MKICAgICAgICBkZXBlbmRlbmN5LmludmFsaWRhdGVfcmVjb3Jkc2V0KCkKICAgICAgICBkZXBlbmRlbmN5ID0gZGVwZW5kZW5jeS53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlcGVuZGVuY3kudW5saW5rKCkKICAgICAgICAgICAgcmVjb3JkcyA9IHNlbGYuSmV0RGVwZW5kZW5jeS5zZWFyY2goWygiaWQiLCAiPSIsIGRlcGVuZGVuY3kuaWQpXSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgIGxlbihyZWNvcmRzKSwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byBkZWxldGUgZGVwZW5kZW5jeSIsCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgQWNjZXNzRXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byBkZWxldGUgZGVwZW5kZW5jeSIpCgogICAgZGVmIHRlc3RfbWFuYWdlcl91bmxpbmtfZm9yYmlkZGVuX25vdF9pbl9qZXRfbWFuYWdlcl9pZHMoc2VsZik6CiAgICAgICAgIiIiVGVzdCBNYW5hZ2VyOiBDYW5ub3QgZGVsZXRlIHdoZW4gbm90IGluIGpldCBtYW5hZ2VyX2lkcyIiIgogICAgICAgIF8sIF8sIGRlcGVuZGVuY3kgPSBzZWxmLl9jcmVhdGVfamV0X2RlcGVuZGVuY3koCiAgICAgICAgICAgICJObyBEZWxldGUgSmV0IiwKICAgICAgICAgICAgIm5vX2RlbGV0ZV9qZXQiLAogICAgICAgICAgICAiTm8gRGVsZXRlIERlcGVuZHMiLAogICAgICAgICAgICAibm9fZGVsZXRlX2RlcGVuZHMiLAogICAgICAgICAgICBqZXRfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgZGVwZW5kc19vbl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICBqZXRfc2VydmVyX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIGRlcGVuZHNfb25fc2VydmVyX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgKQoKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvciwgZGVwZW5kZW5jeS53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS51bmxpbmspCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFJvb3QgQWNjZXNzIFRlc3RzCiAgICAjID09PT09PT09PT09PT09PT09PT09PT0KCiAgICBkZWYgdGVzdF9yb290X2Z1bGxfYWNjZXNzKHNlbGYpOgogICAgICAgICIiIlRlc3QgUm9vdDogRnVsbCBDUlVEIGFjY2VzcyByZWdhcmRsZXNzIG9mIGFjY2VzcyByZXN0cmljdGlvbnMiIiIKICAgICAgICAjIFJvb3QgY2FuIGNyZWF0ZSBkZXBlbmRlbmN5IHZpYSBoZWxwZXIgcmVnYXJkbGVzcyBvZiBhY2Nlc3MKICAgICAgICBfLCBfLCBkZXBlbmRlbmN5ID0gc2VsZi5fY3JlYXRlX2pldF9kZXBlbmRlbmN5KAogICAgICAgICAgICAiUm9vdCBKZXQiLAogICAgICAgICAgICAicm9vdF9qZXQiLAogICAgICAgICAgICAiUm9vdCBEZXBlbmRzIiwKICAgICAgICAgICAgInJvb3RfZGVwZW5kcyIsCiAgICAgICAgICAgIGpldF91c2VyX2lkcz1bKDUsIDAsIDApXSwKICAgICAgICAgICAgamV0X21hbmFnZXJfaWRzPVsoNSwgMCwgMCldLAogICAgICAgICAgICBkZXBlbmRzX29uX3VzZXJfaWRzPVsoNSwgMCwgMCldLAogICAgICAgICAgICBkZXBlbmRzX29uX21hbmFnZXJfaWRzPVsoNSwgMCwgMCldLAogICAgICAgICAgICB3aXRoX3VzZXI9c2VsZi5yb290LAogICAgICAgICAgICBqZXRfdGVtcGxhdGU9c2VsZi5qZXRfdGVtcGxhdGVfdGVzdCwKICAgICAgICAgICAgZGVwZW5kc19vbl90ZW1wbGF0ZT1zZWxmLmpldF90ZW1wbGF0ZV90b3dlcl9jb3JlLAogICAgICAgICkKCiAgICAgICAgIyBSb290IGNhbiByZWFkCiAgICAgICAgcmVjb3JkcyA9IHNlbGYuSmV0RGVwZW5kZW5jeS53aXRoX3VzZXIoc2VsZi5yb290KS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBkZXBlbmRlbmN5LmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbihkZXBlbmRlbmN5LCByZWNvcmRzLCAiUm9vdCBzaG91bGQgYmUgYWJsZSB0byByZWFkIikKCiAgICAgICAgIyBSb290IGNhbiB3cml0ZTogc3dpdGNoIGRlcGVuZHNfb24gdG8gYW5vdGhlciB2YWxpZCBqZXQKICAgICAgICBkZXBlbmRzX29uX2pldF9hbHQgPSBzZWxmLl9jcmVhdGVfamV0KAogICAgICAgICAgICAiUm9vdCBEZXBlbmRzIEFsdCIsCiAgICAgICAgICAgICJyb290X2RlcGVuZHNfYWx0IiwKICAgICAgICAgICAgdGVtcGxhdGU9c2VsZi5qZXRfdGVtcGxhdGVfdG93ZXJfY29yZSwKICAgICAgICApCiAgICAgICAgZGVwZW5kZW5jeS5pbnZhbGlkYXRlX3JlY29yZHNldCgpCiAgICAgICAgZGVwZW5kZW5jeS53aXRoX3VzZXIoc2VsZi5yb290KS53cml0ZSgKICAgICAgICAgICAgeyJqZXRfZGVwZW5kc19vbl9pZCI6IGRlcGVuZHNfb25famV0X2FsdC5pZH0KICAgICAgICApCgogICAgICAgICMgUm9vdCBjYW4gZGVsZXRlCiAgICAgICAgZGVwZW5kZW5jeS53aXRoX3VzZXIoc2VsZi5yb290KS51bmxpbmsoKQogICAgICAgIHJlY29yZHMgPSBzZWxmLkpldERlcGVuZGVuY3kud2l0aF91c2VyKHNlbGYucm9vdCkuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9IiwgZGVwZW5kZW5jeS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihyZWNvcmRzKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlJvb3Qgc2hvdWxkIGJlIGFibGUgdG8gZGVsZXRlIGRlcGVuZGVuY3kiLAogICAgICAgICkK |