Mw0NChZae2NPCwAA4wAAAAAAAAAAAAAAAAMAAABAAAAAcyYAAABkAGQBbABaAGQAZAFsAVoBZAZkAmQDhAFaAmQEZAWEAFoDZAFTACkH6QAAAABOYwIAAAAAAAAAAwAAAAMAAAADAAAAcygAAACIAHAKdABqAYMAiQCHAIcBZgJkAWQChAh9AmQDZASEAHwCXwJ8AlMAKQVhVgcAAAogICAgV3JhcCBscnVfY2FjaGUgdG8gc3VwcG9ydCBzdG9yaW5nIHRoZSBjYWNoZSBkYXRhIGluIHRoZSBvYmplY3QgaW5zdGFuY2VzLgoKICAgIEFic3RyYWN0cyB0aGUgY29tbW9uIHBhcmFkaWdtIHdoZXJlIHRoZSBtZXRob2QgZXhwbGljaXRseSBzYXZlcyBhbgogICAgdW5kZXJzY29yZS1wcmVmaXhlZCBwcm90ZWN0ZWQgcHJvcGVydHkgb24gZmlyc3QgY2FsbCBhbmQgcmV0dXJucyB0aGF0CiAgICBzdWJzZXF1ZW50bHkuCgogICAgPj4+IGNsYXNzIE15Q2xhc3M6CiAgICAuLi4gICAgIGNhbGxzID0gMAogICAgLi4uCiAgICAuLi4gICAgIEBtZXRob2RfY2FjaGUKICAgIC4uLiAgICAgZGVmIG1ldGhvZChzZWxmLCB2YWx1ZSk6CiAgICAuLi4gICAgICAgICBzZWxmLmNhbGxzICs9IDEKICAgIC4uLiAgICAgICAgIHJldHVybiB2YWx1ZQoKICAgID4+PiBhID0gTXlDbGFzcygpCiAgICA+Pj4gYS5tZXRob2QoMykKICAgIDMKICAgID4+PiBmb3IgeCBpbiByYW5nZSg3NSk6CiAgICAuLi4gICAgIHJlcyA9IGEubWV0aG9kKHgpCiAgICA+Pj4gYS5jYWxscwogICAgNzUKCiAgICBOb3RlIHRoYXQgdGhlIGFwcGFyZW50IGJlaGF2aW9yIHdpbGwgYmUgZXhhY3RseSBsaWtlIHRoYXQgb2YgbHJ1X2NhY2hlCiAgICBleGNlcHQgdGhhdCB0aGUgY2FjaGUgaXMgc3RvcmVkIG9uIGVhY2ggaW5zdGFuY2UsIHNvIHZhbHVlcyBpbiBvbmUKICAgIGluc3RhbmNlIHdpbGwgbm90IGZsdXNoIHZhbHVlcyBmcm9tIGFub3RoZXIsIGFuZCB3aGVuIGFuIGluc3RhbmNlIGlzCiAgICBkZWxldGVkLCBzbyBhcmUgdGhlIGNhY2hlZCB2YWx1ZXMgZm9yIHRoYXQgaW5zdGFuY2UuCgogICAgPj4+IGIgPSBNeUNsYXNzKCkKICAgID4+PiBmb3IgeCBpbiByYW5nZSgzNSk6CiAgICAuLi4gICAgIHJlcyA9IGIubWV0aG9kKHgpCiAgICA+Pj4gYi5jYWxscwogICAgMzUKICAgID4+PiBhLm1ldGhvZCgwKQogICAgMAogICAgPj4+IGEuY2FsbHMKICAgIDc1CgogICAgTm90ZSB0aGF0IGlmIG1ldGhvZCBoYWQgYmVlbiBkZWNvcmF0ZWQgd2l0aCBgYGZ1bmN0b29scy5scnVfY2FjaGUoKWBgLAogICAgYS5jYWxscyB3b3VsZCBoYXZlIGJlZW4gNzYgKGR1ZSB0byB0aGUgY2FjaGVkIHZhbHVlIG9mIDAgaGF2aW5nIGJlZW4KICAgIGZsdXNoZWQgYnkgdGhlICdiJyBpbnN0YW5jZSkuCgogICAgQ2xlYXIgdGhlIGNhY2hlIHdpdGggYGAuY2FjaGVfY2xlYXIoKWBgCgogICAgPj4+IGEubWV0aG9kLmNhY2hlX2NsZWFyKCkKCiAgICBTYW1lIGZvciBhIG1ldGhvZCB0aGF0IGhhc24ndCB5ZXQgYmVlbiBjYWxsZWQuCgogICAgPj4+IGMgPSBNeUNsYXNzKCkKICAgID4+PiBjLm1ldGhvZC5jYWNoZV9jbGVhcigpCgogICAgQW5vdGhlciBjYWNoZSB3cmFwcGVyIG1heSBiZSBzdXBwbGllZDoKCiAgICA+Pj4gY2FjaGUgPSBmdW5jdG9vbHMubHJ1X2NhY2hlKG1heHNpemU9MikKICAgID4+PiBNeUNsYXNzLm1ldGhvZDIgPSBtZXRob2RfY2FjaGUobGFtYmRhIHNlbGY6IDMsIGNhY2hlX3dyYXBwZXI9Y2FjaGUpCiAgICA+Pj4gYSA9IE15Q2xhc3MoKQogICAgPj4+IGEubWV0aG9kMigpCiAgICAzCgogICAgQ2F1dGlvbiAtIGRvIG5vdCBzdWJzZXF1ZW50bHkgd3JhcCB0aGUgbWV0aG9kIHdpdGggYW5vdGhlciBkZWNvcmF0b3IsIHN1Y2gKICAgIGFzIGBgQHByb3BlcnR5YGAsIHdoaWNoIGNoYW5nZXMgdGhlIHNlbWFudGljcyBvZiB0aGUgZnVuY3Rpb24uCgogICAgU2VlIGFsc28KICAgIGh0dHA6Ly9jb2RlLmFjdGl2ZXN0YXRlLmNvbS9yZWNpcGVzLzU3NzQ1Mi1hLW1lbW9pemUtZGVjb3JhdG9yLWZvci1pbnN0YW5jZS1tZXRob2RzLwogICAgZm9yIGFub3RoZXIgaW1wbGVtZW50YXRpb24gYW5kIGFkZGl0aW9uYWwganVzdGlmaWNhdGlvbi4KICAgIGMBAAAAAAAAAAUAAAAEAAAAHwAAAHMsAAAAdABqAYgBfACDAn0DiAB8A4MBfQR0AnwAiAFqA3wEgwMBAHwEfAF8Ao4BUwApAU4pBNoFdHlwZXPaCk1ldGhvZFR5cGXaB3NldGF0dHLaCF9fbmFtZV9fKQXaBHNlbGbaBGFyZ3PaBmt3YXJnc1oMYm91bmRfbWV0aG9kWg1jYWNoZWRfbWV0aG9kKQLaDWNhY2hlX3dyYXBwZXLaBm1ldGhvZKkA+o4vaG9tZS91ZXRsaHIvRG9jdW1lbnRzL1Nlcm1vUGxvdF9iYWNrZW5kL2RyYWZ0X1NSQU1fYmxhY2tib3gvVUVUUlZfRVNvQ19tcHc4L3ZlbnYvbGliL3B5dGhvbjMuNi9zaXRlLXBhY2thZ2VzL2ltcG9ydGxpYl9tZXRhZGF0YS9fZnVuY3Rvb2xzLnB52gd3cmFwcGVySwAAAHMIAAAAAAIMAQgBDgF6HW1ldGhvZF9jYWNoZS48bG9jYWxzPi53cmFwcGVyYwAAAAAAAAAAAAAAAAEAAABTAAAAcwQAAABkAFMAKQFOcgsAAAByCwAAAHILAAAAcgsAAAByDAAAANoIPGxhbWJkYT5TAAAAcwAAAAB6Hm1ldGhvZF9jYWNoZS48bG9jYWxzPi48bGFtYmRhPikD2glmdW5jdG9vbHPaCWxydV9jYWNoZdoLY2FjaGVfY2xlYXIpA3IKAAAAcgkAAAByDQAAAHILAAAAKQJyCQAAAHIKAAAAcgwAAADaDG1ldGhvZF9jYWNoZQYAAABzCAAAAABDDAIOCAoCchIAAABjAQAAAAAAAAACAAAABAAAAAMAAABzGgAAAHQAagGIAIMBhwBmAWQBZAKECIMBfQF8AVMAKQN6pQogICAgV3JhcCBmdW5jIHNvIGl0J3Mgbm90IGNhbGxlZCBpZiBpdHMgZmlyc3QgcGFyYW0gaXMgTm9uZQoKICAgID4+PiBwcmludF90ZXh0ID0gcGFzc19ub25lKHByaW50KQogICAgPj4+IHByaW50X3RleHQoJ3RleHQnKQogICAgdGV4dAogICAgPj4+IHByaW50X3RleHQoTm9uZSkKICAgIGMBAAAAAAAAAAMAAAADAAAAHwAAAHMcAAAAfABkAGsJchiIAHwAZgF8AZ4CfAKOAVMAZABTACkBTnILAAAAKQPaBXBhcmFtcgcAAAByCAAAACkB2gRmdW5jcgsAAAByDAAAAHINAAAAYwAAAHMEAAAAAAIIAXoacGFzc19ub25lLjxsb2NhbHM+LndyYXBwZXIpAnIPAAAA2gV3cmFwcykCchQAAAByDQAAAHILAAAAKQFyFAAAAHIMAAAA2glwYXNzX25vbmVZAAAAcwQAAAAAChYFchYAAAApAU4pBHICAAAAcg8AAAByEgAAAHIWAAAAcgsAAAByCwAAAHILAAAAcgwAAADaCDxtb2R1bGU+AQAAAHMGAAAACAEIBApT