IyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQ0KaW1wb3J0IHVuaXR0ZXN0DQppbXBvcnQgc2hsZXgNCg0KZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQNCg0KdHJ5Og0KICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTw0KZXhjZXB0IEltcG9ydEVycm9yOg0KICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPDQoNCg0KIyBUaGUgb3JpZ2luYWwgdGVzdCBkYXRhIHNldCB3YXMgZnJvbSBzaGVsbHdvcmRzLCBieSBIYXJ0bXV0IEdvZWJlbC4NCg0KZGF0YSA9IHIiIiJ4fHh8DQpmb28gYmFyfGZvb3xiYXJ8DQogZm9vIGJhcnxmb298YmFyfA0KIGZvbyBiYXIgfGZvb3xiYXJ8DQpmb28gICBiYXIgICAgYmxhICAgICBmYXNlbHxmb298YmFyfGJsYXxmYXNlbHwNCnggeSAgeiAgICAgICAgICAgICAgeHh4eHx4fHl8enx4eHh4fA0KXHggYmFyfFx8eHxiYXJ8DQpcIHggYmFyfFx8eHxiYXJ8DQpcIGJhcnxcfGJhcnwNCmZvbyBceCBiYXJ8Zm9vfFx8eHxiYXJ8DQpmb28gXCB4IGJhcnxmb298XHx4fGJhcnwNCmZvbyBcIGJhcnxmb298XHxiYXJ8DQpmb28gImJhciIgYmxhfGZvb3wiYmFyInxibGF8DQoiZm9vIiAiYmFyIiAiYmxhInwiZm9vInwiYmFyInwiYmxhInwNCiJmb28iIGJhciAiYmxhInwiZm9vInxiYXJ8ImJsYSJ8DQoiZm9vIiBiYXIgYmxhfCJmb28ifGJhcnxibGF8DQpmb28gJ2JhcicgYmxhfGZvb3wnYmFyJ3xibGF8DQonZm9vJyAnYmFyJyAnYmxhJ3wnZm9vJ3wnYmFyJ3wnYmxhJ3wNCidmb28nIGJhciAnYmxhJ3wnZm9vJ3xiYXJ8J2JsYSd8DQonZm9vJyBiYXIgYmxhfCdmb28nfGJhcnxibGF8DQpibHVyYiBmb28iYmFyImJhciJmYXNlbCIgYmF6fGJsdXJifGZvbyJiYXIiYmFyImZhc2VsInxiYXp8DQpibHVyYiBmb28nYmFyJ2JhcidmYXNlbCcgYmF6fGJsdXJifGZvbydiYXInYmFyJ2Zhc2VsJ3xiYXp8DQoiInwiInwNCicnfCcnfA0KZm9vICIiIGJhcnxmb298IiJ8YmFyfA0KZm9vICcnIGJhcnxmb298Jyd8YmFyfA0KZm9vICIiICIiICIiIGJhcnxmb298IiJ8IiJ8IiJ8YmFyfA0KZm9vICcnICcnICcnIGJhcnxmb298Jyd8Jyd8Jyd8YmFyfA0KXCIifFx8IiJ8DQoiXCJ8IlwifA0KImZvb1wgYmFyInwiZm9vXCBiYXIifA0KImZvb1xcIGJhciJ8ImZvb1xcIGJhciJ8DQoiZm9vXFwgYmFyXCJ8ImZvb1xcIGJhclwifA0KImZvb1xcIiBiYXJcIiJ8ImZvb1xcInxiYXJ8XHwiInwNCiJmb29cXCBiYXJcIiBkZmFkZiJ8ImZvb1xcIGJhclwifGRmYWRmInwNCiJmb29cXFwgYmFyXCIgZGZhZGYifCJmb29cXFwgYmFyXCJ8ZGZhZGYifA0KImZvb1xcXHggYmFyXCIgZGZhZGYifCJmb29cXFx4IGJhclwifGRmYWRmInwNCiJmb29ceCBiYXJcIiBkZmFkZiJ8ImZvb1x4IGJhclwifGRmYWRmInwNClwnJ3xcfCcnfA0KJ2Zvb1wgYmFyJ3wnZm9vXCBiYXInfA0KJ2Zvb1xcIGJhcid8J2Zvb1xcIGJhcid8DQoiZm9vXFxceCBiYXJcIiBkZidhXCAnZGYnfCJmb29cXFx4IGJhclwifGRmJ2F8XHwnZGYnfA0KXCJmb28ifFx8ImZvbyJ8DQpcImZvbyJceHxcfCJmb28ifFx8eHwNCiJmb29ceCJ8ImZvb1x4InwNCiJmb29cICJ8ImZvb1wgInwNCmZvb1wgeHh8Zm9vfFx8eHh8DQpmb29cIHhceHxmb298XHx4fFx8eHwNCmZvb1wgeFx4XCIifGZvb3xcfHh8XHx4fFx8IiJ8DQoiZm9vXCB4XHgifCJmb29cIHhceCJ8DQoiZm9vXCB4XHhcXCJ8ImZvb1wgeFx4XFwifA0KImZvb1wgeFx4XFwiImZvb2JhciJ8ImZvb1wgeFx4XFwifCJmb29iYXIifA0KImZvb1wgeFx4XFwiXCcnImZvb2JhciJ8ImZvb1wgeFx4XFwifFx8Jyd8ImZvb2JhciJ8DQoiZm9vXCB4XHhcXCJcJyJmbydvYmFyInwiZm9vXCB4XHhcXCJ8XHwnImZvJ3xvYmFyInwNCiJmb29cIHhceFxcIlwnImZvJ29iYXIiICdkb24nXCcndCd8ImZvb1wgeFx4XFwifFx8JyJmbyd8b2JhciJ8J2Rvbid8XHwnJ3x0J3wNCidmb29cIGJhcid8J2Zvb1wgYmFyJ3wNCidmb29cXCBiYXInfCdmb29cXCBiYXInfA0KZm9vXCBiYXJ8Zm9vfFx8YmFyfA0KZm9vI2JhclxuYmF6fGZvb2JhenwNCjotKSA7LSl8OnwtfCl8O3wtfCl8DQrh6e3z+nzhfOl87XzzfPp8DQoiIiINCg0KcG9zaXhfZGF0YSA9IHIiIiJ4fHh8DQpmb28gYmFyfGZvb3xiYXJ8DQogZm9vIGJhcnxmb298YmFyfA0KIGZvbyBiYXIgfGZvb3xiYXJ8DQpmb28gICBiYXIgICAgYmxhICAgICBmYXNlbHxmb298YmFyfGJsYXxmYXNlbHwNCnggeSAgeiAgICAgICAgICAgICAgeHh4eHx4fHl8enx4eHh4fA0KXHggYmFyfHh8YmFyfA0KXCB4IGJhcnwgeHxiYXJ8DQpcIGJhcnwgYmFyfA0KZm9vIFx4IGJhcnxmb298eHxiYXJ8DQpmb28gXCB4IGJhcnxmb298IHh8YmFyfA0KZm9vIFwgYmFyfGZvb3wgYmFyfA0KZm9vICJiYXIiIGJsYXxmb298YmFyfGJsYXwNCiJmb28iICJiYXIiICJibGEifGZvb3xiYXJ8YmxhfA0KImZvbyIgYmFyICJibGEifGZvb3xiYXJ8YmxhfA0KImZvbyIgYmFyIGJsYXxmb298YmFyfGJsYXwNCmZvbyAnYmFyJyBibGF8Zm9vfGJhcnxibGF8DQonZm9vJyAnYmFyJyAnYmxhJ3xmb298YmFyfGJsYXwNCidmb28nIGJhciAnYmxhJ3xmb298YmFyfGJsYXwNCidmb28nIGJhciBibGF8Zm9vfGJhcnxibGF8DQpibHVyYiBmb28iYmFyImJhciJmYXNlbCIgYmF6fGJsdXJifGZvb2JhcmJhcmZhc2VsfGJhenwNCmJsdXJiIGZvbydiYXInYmFyJ2Zhc2VsJyBiYXp8Ymx1cmJ8Zm9vYmFyYmFyZmFzZWx8YmF6fA0KIiJ8fA0KJyd8fA0KZm9vICIiIGJhcnxmb298fGJhcnwNCmZvbyAnJyBiYXJ8Zm9vfHxiYXJ8DQpmb28gIiIgIiIgIiIgYmFyfGZvb3x8fHxiYXJ8DQpmb28gJycgJycgJycgYmFyfGZvb3x8fHxiYXJ8DQpcInwifA0KIlwiInwifA0KImZvb1wgYmFyInxmb29cIGJhcnwNCiJmb29cXCBiYXIifGZvb1wgYmFyfA0KImZvb1xcIGJhclwiInxmb29cIGJhciJ8DQoiZm9vXFwiIGJhclwifGZvb1x8YmFyInwNCiJmb29cXCBiYXJcIiBkZmFkZiJ8Zm9vXCBiYXIiIGRmYWRmfA0KImZvb1xcXCBiYXJcIiBkZmFkZiJ8Zm9vXFwgYmFyIiBkZmFkZnwNCiJmb29cXFx4IGJhclwiIGRmYWRmInxmb29cXHggYmFyIiBkZmFkZnwNCiJmb29ceCBiYXJcIiBkZmFkZiJ8Zm9vXHggYmFyIiBkZmFkZnwNClwnfCd8DQonZm9vXCBiYXInfGZvb1wgYmFyfA0KJ2Zvb1xcIGJhcid8Zm9vXFwgYmFyfA0KImZvb1xcXHggYmFyXCIgZGYnYVwgJ2RmInxmb29cXHggYmFyIiBkZidhXCAnZGZ8DQpcImZvb3wiZm9vfA0KXCJmb29ceHwiZm9veHwNCiJmb29ceCJ8Zm9vXHh8DQoiZm9vXCAifGZvb1wgfA0KZm9vXCB4eHxmb28geHh8DQpmb29cIHhceHxmb28geHh8DQpmb29cIHhceFwifGZvbyB4eCJ8DQoiZm9vXCB4XHgifGZvb1wgeFx4fA0KImZvb1wgeFx4XFwifGZvb1wgeFx4XHwNCiJmb29cIHhceFxcIiJmb29iYXIifGZvb1wgeFx4XGZvb2JhcnwNCiJmb29cIHhceFxcIlwnImZvb2JhciJ8Zm9vXCB4XHhcJ2Zvb2JhcnwNCiJmb29cIHhceFxcIlwnImZvJ29iYXIifGZvb1wgeFx4XCdmbydvYmFyfA0KImZvb1wgeFx4XFwiXCciZm8nb2JhciIgJ2RvbidcJyd0J3xmb29cIHhceFwnZm8nb2Jhcnxkb24ndHwNCiJmb29cIHhceFxcIlwnImZvJ29iYXIiICdkb24nXCcndCcgXFx8Zm9vXCB4XHhcJ2ZvJ29iYXJ8ZG9uJ3R8XHwNCidmb29cIGJhcid8Zm9vXCBiYXJ8DQonZm9vXFwgYmFyJ3xmb29cXCBiYXJ8DQpmb29cIGJhcnxmb28gYmFyfA0KZm9vI2JhclxuYmF6fGZvb3xiYXp8DQo6LSkgOy0pfDotKXw7LSl8DQrh6e3z+nzh6e3z+nwNCiIiIg0KDQpjbGFzcyBTaGxleFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOg0KICAgIGRlZiBzZXRVcChzZWxmKToNCiAgICAgICAgc2VsZi5kYXRhID0gW3guc3BsaXQoInwiKVs6LTFdDQogICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiBkYXRhLnNwbGl0bGluZXMoKV0NCiAgICAgICAgc2VsZi5wb3NpeF9kYXRhID0gW3guc3BsaXQoInwiKVs6LTFdDQogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiBwb3NpeF9kYXRhLnNwbGl0bGluZXMoKV0NCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5kYXRhOg0KICAgICAgICAgICAgaXRlbVswXSA9IGl0ZW1bMF0ucmVwbGFjZShyIlxuIiwgIlxuIikNCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5wb3NpeF9kYXRhOg0KICAgICAgICAgICAgaXRlbVswXSA9IGl0ZW1bMF0ucmVwbGFjZShyIlxuIiwgIlxuIikNCg0KICAgIGRlZiBzcGxpdFRlc3Qoc2VsZiwgZGF0YSwgY29tbWVudHMpOg0KICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oZGF0YSkpOg0KICAgICAgICAgICAgbCA9IHNobGV4LnNwbGl0KGRhdGFbaV1bMF0sIGNvbW1lbnRzPWNvbW1lbnRzKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLCBkYXRhW2ldWzE6XSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlcyAhPSAlcyIgJQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YVtpXVswXSwgbCwgZGF0YVtpXVsxOl0pKQ0KDQogICAgZGVmIG9sZFNwbGl0KHNlbGYsIHMpOg0KICAgICAgICByZXQgPSBbXQ0KICAgICAgICBsZXggPSBzaGxleC5zaGxleChTdHJpbmdJTyhzKSkNCiAgICAgICAgdG9rID0gbGV4LmdldF90b2tlbigpDQogICAgICAgIHdoaWxlIHRvazoNCiAgICAgICAgICAgIHJldC5hcHBlbmQodG9rKQ0KICAgICAgICAgICAgdG9rID0gbGV4LmdldF90b2tlbigpDQogICAgICAgIHJldHVybiByZXQNCg0KICAgIGRlZiB0ZXN0U3BsaXRQb3NpeChzZWxmKToNCiAgICAgICAgIiIiVGVzdCBkYXRhIHNwbGl0dGluZyB3aXRoIHBvc2l4IHBhcnNlciIiIg0KICAgICAgICBzZWxmLnNwbGl0VGVzdChzZWxmLnBvc2l4X2RhdGEsIGNvbW1lbnRzPVRydWUpDQoNCiAgICBkZWYgdGVzdENvbXBhdChzZWxmKToNCiAgICAgICAgIiIiVGVzdCBjb21wYXRpYmlsaXR5IGludGVyZmFjZSIiIg0KICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5kYXRhKSk6DQogICAgICAgICAgICBsID0gc2VsZi5vbGRTcGxpdChzZWxmLmRhdGFbaV1bMF0pDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwsIHNlbGYuZGF0YVtpXVsxOl0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJXMgIT0gJXMiICUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuZGF0YVtpXVswXSwgbCwgc2VsZi5kYXRhW2ldWzE6XSkpDQoNCiMgQWxsb3cgdGhpcyB0ZXN0IHRvIGJlIHVzZWQgd2l0aCBvbGQgc2hsZXgucHkNCmlmIG5vdCBnZXRhdHRyKHNobGV4LCAic3BsaXQiLCBOb25lKToNCiAgICBmb3IgbWV0aG5hbWUgaW4gZGlyKFNobGV4VGVzdCk6DQogICAgICAgIGlmIG1ldGhuYW1lLnN0YXJ0c3dpdGgoInRlc3QiKSBhbmQgbWV0aG5hbWUgIT0gInRlc3RDb21wYXQiOg0KICAgICAgICAgICAgZGVsYXR0cihTaGxleFRlc3QsIG1ldGhuYW1lKQ0KDQpkZWYgdGVzdF9tYWluKCk6DQogICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTaGxleFRlc3QpDQoNCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6DQogICAgdGVzdF9tYWluKCkNCg==