IyEvdXNyL2Jpbi9lbnYgcHl0aG9uDQojIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotDQoNCmZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0DQppbXBvcnQgbWFyc2hhbA0KaW1wb3J0IHN5cw0KaW1wb3J0IHVuaXR0ZXN0DQppbXBvcnQgb3MNCg0KY2xhc3MgSW50VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOg0KICAgIGRlZiB0ZXN0X2ludHMoc2VsZik6DQogICAgICAgICMgVGVzdCB0aGUgZnVsbCByYW5nZSBvZiBQeXRob24gaW50cy4NCiAgICAgICAgbiA9IHN5cy5tYXhpbnQNCiAgICAgICAgd2hpbGUgbjoNCiAgICAgICAgICAgIGZvciBleHBlY3RlZCBpbiAoLW4sIG4pOg0KICAgICAgICAgICAgICAgIHMgPSBtYXJzaGFsLmR1bXBzKGV4cGVjdGVkKQ0KICAgICAgICAgICAgICAgIGdvdCA9IG1hcnNoYWwubG9hZHMocykNCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpDQogICAgICAgICAgICAgICAgbWFyc2hhbC5kdW1wKGV4cGVjdGVkLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQ0KICAgICAgICAgICAgICAgIGdvdCA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQ0KICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkNCiAgICAgICAgICAgIG4gPSBuID4+IDENCiAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pDQoNCiAgICBkZWYgdGVzdF9pbnQ2NChzZWxmKToNCiAgICAgICAgIyBTaW11bGF0ZSBpbnQgbWFyc2hhbGluZyBvbiBhIDY0LWJpdCBib3guICBUaGlzIGlzIG1vc3QgaW50ZXJlc3RpbmcgaWYNCiAgICAgICAgIyB3ZSdyZSBydW5uaW5nIHRoZSB0ZXN0IG9uIGEgMzItYml0IGJveCwgb2YgY291cnNlLg0KDQogICAgICAgIGRlZiB0b19saXR0bGVfZW5kaWFuX3N0cmluZyh2YWx1ZSwgbmJ5dGVzKToNCiAgICAgICAgICAgIGJ5dGVzID0gW10NCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG5ieXRlcyk6DQogICAgICAgICAgICAgICAgYnl0ZXMuYXBwZW5kKGNocih2YWx1ZSAmIDB4ZmYpKQ0KICAgICAgICAgICAgICAgIHZhbHVlID4+PSA4DQogICAgICAgICAgICByZXR1cm4gJycuam9pbihieXRlcykNCg0KICAgICAgICBtYXhpbnQ2NCA9ICgxTCA8PCA2MykgLSAxDQogICAgICAgIG1pbmludDY0ID0gLW1heGludDY0LTENCg0KICAgICAgICBmb3IgYmFzZSBpbiBtYXhpbnQ2NCwgbWluaW50NjQsIC1tYXhpbnQ2NCwgLShtaW5pbnQ2NCA+PiAxKToNCiAgICAgICAgICAgIHdoaWxlIGJhc2U6DQogICAgICAgICAgICAgICAgcyA9ICdJJyArIHRvX2xpdHRsZV9lbmRpYW5fc3RyaW5nKGJhc2UsIDgpDQogICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkcyhzKQ0KICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZSwgZ290KQ0KICAgICAgICAgICAgICAgIGlmIGJhc2UgPT0gLTE6ICAjIGEgZml4ZWQtcG9pbnQgZm9yIHNoaWZ0aW5nIHJpZ2h0IDENCiAgICAgICAgICAgICAgICAgICAgYmFzZSA9IDANCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBiYXNlID4+PSAxDQoNCiAgICBkZWYgdGVzdF9ib29sKHNlbGYpOg0KICAgICAgICBmb3IgYiBpbiAoVHJ1ZSwgRmFsc2UpOg0KICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKGIpKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBuZXcpDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYiksIHR5cGUobmV3KSkNCiAgICAgICAgICAgIG1hcnNoYWwuZHVtcChiLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQ0KICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIG5ldykNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShiKSwgdHlwZShuZXcpKQ0KDQpjbGFzcyBGbG9hdFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToNCiAgICBkZWYgdGVzdF9mbG9hdHMoc2VsZik6DQogICAgICAgICMgVGVzdCBhIGZldyBmbG9hdHMNCiAgICAgICAgc21hbGwgPSAxZS0yNQ0KICAgICAgICBuID0gc3lzLm1heGludCAqIDMuN2UyNTANCiAgICAgICAgd2hpbGUgbiA+IHNtYWxsOg0KICAgICAgICAgICAgZm9yIGV4cGVjdGVkIGluICgtbiwgbik6DQogICAgICAgICAgICAgICAgZiA9IGZsb2F0KGV4cGVjdGVkKQ0KICAgICAgICAgICAgICAgIHMgPSBtYXJzaGFsLmR1bXBzKGYpDQogICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkcyhzKQ0KICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgZ290KQ0KICAgICAgICAgICAgICAgIG1hcnNoYWwuZHVtcChmLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQ0KICAgICAgICAgICAgICAgIGdvdCA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQ0KICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgZ290KQ0KICAgICAgICAgICAgbiAvPSAxMjMuNDU2Nw0KDQogICAgICAgIGYgPSAwLjANCiAgICAgICAgcyA9IG1hcnNoYWwuZHVtcHMoZiwgMikNCiAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkcyhzKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYsIGdvdCkNCiAgICAgICAgIyBhbmQgd2l0aCB2ZXJzaW9uIDw9IDEgKGZsb2F0cyBtYXJzaGFsbGVkIGRpZmZlcmVudGx5IHRoZW4pDQogICAgICAgIHMgPSBtYXJzaGFsLmR1bXBzKGYsIDEpDQogICAgICAgIGdvdCA9IG1hcnNoYWwubG9hZHMocykNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBnb3QpDQoNCiAgICAgICAgbiA9IHN5cy5tYXhpbnQgKiAzLjdlLTI1MA0KICAgICAgICB3aGlsZSBuIDwgc21hbGw6DQogICAgICAgICAgICBmb3IgZXhwZWN0ZWQgaW4gKC1uLCBuKToNCiAgICAgICAgICAgICAgICBmID0gZmxvYXQoZXhwZWN0ZWQpDQoNCiAgICAgICAgICAgICAgICBzID0gbWFyc2hhbC5kdW1wcyhmKQ0KICAgICAgICAgICAgICAgIGdvdCA9IG1hcnNoYWwubG9hZHMocykNCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYsIGdvdCkNCg0KICAgICAgICAgICAgICAgIHMgPSBtYXJzaGFsLmR1bXBzKGYsIDEpDQogICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkcyhzKQ0KICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgZ290KQ0KDQogICAgICAgICAgICAgICAgbWFyc2hhbC5kdW1wKGYsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpDQogICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpDQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBnb3QpDQoNCiAgICAgICAgICAgICAgICBtYXJzaGFsLmR1bXAoZiwgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSwgMSkNCiAgICAgICAgICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkNCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYsIGdvdCkNCiAgICAgICAgICAgIG4gKj0gMTIzLjQ1NjcNCiAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pDQoNCmNsYXNzIFN0cmluZ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToNCiAgICBkZWYgdGVzdF91bmljb2RlKHNlbGYpOg0KICAgICAgICBmb3IgcyBpbiBbdSIiLCB1IkFuZHLoIFByZXZpbiIsIHUiYWJjIiwgdSIgIioxMDAwMF06DQogICAgICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWRzKG1hcnNoYWwuZHVtcHMocykpDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIG5ldykNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzKSwgdHlwZShuZXcpKQ0KICAgICAgICAgICAgbWFyc2hhbC5kdW1wKHMsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpDQogICAgICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgbmV3KQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHMpLCB0eXBlKG5ldykpDQogICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQ0KDQogICAgZGVmIHRlc3Rfc3RyaW5nKHNlbGYpOg0KICAgICAgICBmb3IgcyBpbiBbIiIsICJBbmRy6CBQcmV2aW4iLCAiYWJjIiwgIiAiKjEwMDAwXToNCiAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhzKSkNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgbmV3KQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHMpLCB0eXBlKG5ldykpDQogICAgICAgICAgICBtYXJzaGFsLmR1bXAocywgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkNCiAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBuZXcpDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocyksIHR5cGUobmV3KSkNCiAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pDQoNCiAgICBkZWYgdGVzdF9idWZmZXIoc2VsZik6DQogICAgICAgIGZvciBzIGluIFsiIiwgIkFuZHLoIFByZXZpbiIsICJhYmMiLCAiICIqMTAwMDBdOg0KICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygoImJ1ZmZlci4uIG5vdCBzdXBwb3J0ZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToNCiAgICAgICAgICAgICAgICBiID0gYnVmZmVyKHMpDQogICAgICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWRzKG1hcnNoYWwuZHVtcHMoYikpDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIG5ldykNCiAgICAgICAgICAgIG1hcnNoYWwuZHVtcChiLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQ0KICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIG5ldykNCiAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pDQoNCmNsYXNzIEV4Y2VwdGlvblRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToNCiAgICBkZWYgdGVzdF9leGNlcHRpb25zKHNlbGYpOg0KICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWRzKG1hcnNoYWwuZHVtcHMoU3RvcEl0ZXJhdGlvbikpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoU3RvcEl0ZXJhdGlvbiwgbmV3KQ0KDQpjbGFzcyBDb2RlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOg0KICAgIGRlZiB0ZXN0X2NvZGUoc2VsZik6DQogICAgICAgIGNvID0gRXhjZXB0aW9uVGVzdENhc2UudGVzdF9leGNlcHRpb25zLmZ1bmNfY29kZQ0KICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWRzKG1hcnNoYWwuZHVtcHMoY28pKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvLCBuZXcpDQoNCmNsYXNzIENvbnRhaW5lclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToNCiAgICBkID0geydhc3RyaW5nJzogJ2Zvb0BiYXIuYmF6LnNwYW0nLA0KICAgICAgICAgJ2FmbG9hdCc6IDcyODMuNDMsDQogICAgICAgICAnYW5pbnQnOiAyKioyMCwNCiAgICAgICAgICdhc2hvcnRsb25nJzogMkwsDQogICAgICAgICAnYWxpc3QnOiBbJy56eXguNDEnXSwNCiAgICAgICAgICdhdHVwbGUnOiAoJy56eXguNDEnLCkqMTAsDQogICAgICAgICAnYWJvb2xlYW4nOiBGYWxzZSwNCiAgICAgICAgICdhdW5pY29kZSc6IHUiQW5kcuggUHJldmluIg0KICAgICAgICAgfQ0KICAgIGRlZiB0ZXN0X2RpY3Qoc2VsZik6DQogICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhzZWxmLmQpKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZCwgbmV3KQ0KICAgICAgICBtYXJzaGFsLmR1bXAoc2VsZi5kLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQ0KICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQsIG5ldykNCiAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pDQoNCiAgICBkZWYgdGVzdF9saXN0KHNlbGYpOg0KICAgICAgICBsc3QgPSBzZWxmLmQuaXRlbXMoKQ0KICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWRzKG1hcnNoYWwuZHVtcHMobHN0KSkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIG5ldykNCiAgICAgICAgbWFyc2hhbC5kdW1wKGxzdCwgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkNCiAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0LCBuZXcpDQogICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQ0KDQogICAgZGVmIHRlc3RfdHVwbGUoc2VsZik6DQogICAgICAgIHQgPSB0dXBsZShzZWxmLmQua2V5cygpKQ0KICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWRzKG1hcnNoYWwuZHVtcHModCkpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgbmV3KQ0KICAgICAgICBtYXJzaGFsLmR1bXAodCwgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkNCiAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgbmV3KQ0KICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikNCg0KICAgIGRlZiB0ZXN0X3NldHMoc2VsZik6DQogICAgICAgIGZvciBjb25zdHJ1Y3RvciBpbiAoc2V0LCBmcm96ZW5zZXQpOg0KICAgICAgICAgICAgdCA9IGNvbnN0cnVjdG9yKHNlbGYuZC5rZXlzKCkpDQogICAgICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWRzKG1hcnNoYWwuZHVtcHModCkpDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIG5ldykNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG5ldywgY29uc3RydWN0b3IpKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZCh0KSwgaWQobmV3KSkNCiAgICAgICAgICAgIG1hcnNoYWwuZHVtcCh0LCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQ0KICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIG5ldykNCiAgICAgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQ0KDQpjbGFzcyBCdWdzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOg0KICAgIGRlZiB0ZXN0X2J1Z181ODg4NDUyKHNlbGYpOg0KICAgICAgICAjIFNpbXBsZS1taW5kZWQgY2hlY2sgZm9yIFNGIDU4ODQ1MjogRGVidWcgYnVpbGQgY3Jhc2hlcw0KICAgICAgICBtYXJzaGFsLmR1bXBzKFsxMjhdICogMTAwMCkNCg0KICAgIGRlZiB0ZXN0X3BhdGNoXzg3MzIyNChzZWxmKToNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uLCBtYXJzaGFsLmxvYWRzLCAnMCcpDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgbWFyc2hhbC5sb2FkcywgJ2YnKQ0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sIG1hcnNoYWwubG9hZHMsIG1hcnNoYWwuZHVtcHMoNUwpWzotMV0pDQoNCiAgICBkZWYgdGVzdF92ZXJzaW9uX2FyZ3VtZW50KHNlbGYpOg0KICAgICAgICAjIFB5dGhvbiAyLjQuMCBjcmFzaGVzIGZvciBhbnkgY2FsbCB0byBtYXJzaGFsLmR1bXBzKHgsIHkpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKDUsIDApKSwgNSkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXJzaGFsLmxvYWRzKG1hcnNoYWwuZHVtcHMoNSwgMSkpLCA1KQ0KDQogICAgZGVmIHRlc3RfZnV6eihzZWxmKToNCiAgICAgICAgIyBzaW1wbGUgdGVzdCB0aGF0IGl0J3MgYXQgbGVhc3Qgbm90ICp0b3RhbGx5KiB0cml2aWFsIHRvDQogICAgICAgICMgY3Jhc2ggZnJvbSBiYWQgbWFyc2hhbCBkYXRhDQogICAgICAgIGZvciBjIGluIFtjaHIoaSkgZm9yIGkgaW4gcmFuZ2UoMjU2KV06DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgbWFyc2hhbC5sb2FkcyhjKQ0KICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICBwYXNzDQoNCiAgICBkZWYgdGVzdF9sb2Fkc19yZWN1cnNpb24oc2VsZik6DQogICAgICAgIHMgPSAnYycgKyAoJ1gnICogNCo0KSArICd7JyAqIDIqKjIwDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hcnNoYWwubG9hZHMsIHMpDQoNCiAgICBkZWYgdGVzdF9yZWN1cnNpb25fbGltaXQoc2VsZik6DQogICAgICAgICMgQ3JlYXRlIGEgZGVlcGx5IG5lc3RlZCBzdHJ1Y3R1cmUuDQogICAgICAgIGhlYWQgPSBsYXN0ID0gW10NCiAgICAgICAgIyBUaGUgbWF4IHN0YWNrIGRlcHRoIHNob3VsZCBtYXRjaCB0aGUgdmFsdWUgaW4gUHl0aG9uL21hcnNoYWwuYy4NCiAgICAgICAgTUFYX01BUlNIQUxfU1RBQ0tfREVQVEggPSAyMDAwDQogICAgICAgIGZvciBpIGluIHJhbmdlKE1BWF9NQVJTSEFMX1NUQUNLX0RFUFRIIC0gMik6DQogICAgICAgICAgICBsYXN0LmFwcGVuZChbMF0pDQogICAgICAgICAgICBsYXN0ID0gbGFzdFstMV0NCg0KICAgICAgICAjIFZlcmlmeSB3ZSBkb24ndCBibG93IG91dCB0aGUgc3RhY2sgd2l0aCBkdW1wcy9sb2FkLg0KICAgICAgICBkYXRhID0gbWFyc2hhbC5kdW1wcyhoZWFkKQ0KICAgICAgICBuZXdfaGVhZCA9IG1hcnNoYWwubG9hZHMoZGF0YSkNCiAgICAgICAgIyBEb24ndCB1c2UgPT0gdG8gY29tcGFyZSBvYmplY3RzLCBpdCBjYW4gZXhjZWVkIHRoZSByZWN1cnNpb24gbGltaXQuDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5ld19oZWFkKSwgbGVuKGhlYWQpKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihuZXdfaGVhZFswXSksIGxlbihoZWFkWzBdKSkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obmV3X2hlYWRbLTFdKSwgbGVuKGhlYWRbLTFdKSkNCg0KICAgICAgICBsYXN0LmFwcGVuZChbMF0pDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hcnNoYWwuZHVtcHMsIGhlYWQpDQoNCiAgICBkZWYgdGVzdF9leGFjdF90eXBlX21hdGNoKHNlbGYpOg0KICAgICAgICAjIEZvcm1lciBidWc6DQogICAgICAgICMgICA+Pj4gY2xhc3MgSW50KGludCk6IHBhc3MNCiAgICAgICAgIyAgID4+PiB0eXBlKGxvYWRzKGR1bXBzKEludCgpKSkpDQogICAgICAgICMgICA8dHlwZSAnaW50Jz4NCiAgICAgICAgZm9yIHR5cCBpbiAoaW50LCBsb25nLCBmbG9hdCwgY29tcGxleCwgdHVwbGUsIGxpc3QsIGRpY3QsIHNldCwgZnJvemVuc2V0KToNCiAgICAgICAgICAgICMgTm90ZTogc3RyIGFuZCB1bmljb2RlIHN1YmNsYXNzZXMgYXJlIG5vdCB0ZXN0ZWQgYmVjYXVzZSB0aGV5IGdldCBoYW5kbGVkDQogICAgICAgICAgICAjIGJ5IG1hcnNoYWwncyByb3V0aW5lcyBmb3Igb2JqZWN0cyBzdXBwb3J0aW5nIHRoZSBidWZmZXIgQVBJLg0KICAgICAgICAgICAgc3VidHlwID0gdHlwZSgnc3VidHlwJywgKHR5cCwpLCB7fSkNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hcnNoYWwuZHVtcHMsIHN1YnR5cCgpKQ0KDQogICAgIyBJc3N1ZSAjMTc5MiBpbnRyb2R1Y2VkIGEgY2hhbmdlIGluIGhvdyBtYXJzaGFsIGluY3JlYXNlcyB0aGUgc2l6ZSBvZiBpdHMNCiAgICAjIGludGVybmFsIGJ1ZmZlcjsgdGhpcyB0ZXN0IGVuc3VyZXMgdGhhdCB0aGUgbmV3IGNvZGUgaXMgZXhlcmNpc2VkLg0KICAgIGRlZiB0ZXN0X2xhcmdlX21hcnNoYWwoc2VsZik6DQogICAgICAgIHNpemUgPSBpbnQoMWU2KQ0KICAgICAgICB0ZXN0U3RyaW5nID0gJ2FiYycgKiBzaXplDQogICAgICAgIG1hcnNoYWwuZHVtcHModGVzdFN0cmluZykNCg0KICAgIGRlZiB0ZXN0X2ludmFsaWRfbG9uZ3Moc2VsZik6DQogICAgICAgICMgSXNzdWUgIzcwMTk6IG1hcnNoYWwubG9hZHMgc2hvdWxkbid0IHByb2R1Y2UgdW5ub3JtYWxpemVkIFB5TG9uZ3MNCiAgICAgICAgaW52YWxpZF9zdHJpbmcgPSAnbFx4MDJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJw0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXJzaGFsLmxvYWRzLCBpbnZhbGlkX3N0cmluZykNCg0KDQpkZWYgdGVzdF9tYWluKCk6DQogICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChJbnRUZXN0Q2FzZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0VGVzdENhc2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdUZXN0Q2FzZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVUZXN0Q2FzZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lclRlc3RDYXNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uVGVzdENhc2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdzVGVzdENhc2UpDQoNCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6DQogICAgdGVzdF9tYWluKCkNCg==