IyAtKi0gY29kaW5nOiBpc28tODg1OS0xNSAtKi0KCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCBzaHV0aWwKaW1wb3J0IFN0cmluZ0lPCmZyb20gaGFzaGxpYiBpbXBvcnQgbWQ1CmltcG9ydCBlcnJubwoKaW1wb3J0IHVuaXR0ZXN0CmltcG9ydCB0YXJmaWxlCgpmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoKIyBDaGVjayBmb3Igb3VyIGNvbXByZXNzaW9uIG1vZHVsZXMuCnRyeToKICAgIGltcG9ydCBnemlwCiAgICBnemlwLkd6aXBGaWxlCmV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgIGd6aXAgPSBOb25lCnRyeToKICAgIGltcG9ydCBiejIKZXhjZXB0IEltcG9ydEVycm9yOgogICAgYnoyID0gTm9uZQoKZGVmIG1kNXN1bShkYXRhKToKICAgIHJldHVybiBtZDUoZGF0YSkuaGV4ZGlnZXN0KCkKClRFTVBESVIgPSBvcy5wYXRoLmFic3BhdGgodGVzdF9zdXBwb3J0LlRFU1RGTikKdGFybmFtZSA9IHRlc3Rfc3VwcG9ydC5maW5kZmlsZSgidGVzdHRhci50YXIiKQpnemlwbmFtZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHRhci50YXIuZ3oiKQpiejJuYW1lID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0ZXN0dGFyLnRhci5iejIiKQp0bXBuYW1lID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0bXAudGFyIikKCm1kNV9yZWd0eXBlID0gIjY1ZjQ3N2M4MThhZDllMTVmN2ZlYWIwYzZkMzc3NDJmIgptZDVfc3BhcnNlID0gImE1NGZiYzRjYTRmNDM5OWE5MGUxYjI3MTY0MDEyZmM2IgoKCmNsYXNzIFJlYWRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKCiAgICB0YXJuYW1lID0gdGFybmFtZQogICAgbW9kZSA9ICJyOiIKCiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi50YXIgPSB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lLCBtb2RlPXNlbGYubW9kZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIHNlbGYudGFyLmNsb3NlKCkKCgpjbGFzcyBVc3RhclJlYWRUZXN0KFJlYWRUZXN0KToKCiAgICBkZWYgdGVzdF9maWxlb2JqX3JlZ3VsYXJfZmlsZShzZWxmKToKICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9yZWd0eXBlIikKICAgICAgICBmb2JqID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkKICAgICAgICBzZWxmLmFzc2VydFRydWUoKGxlbihkYXRhKSwgbWQ1c3VtKGRhdGEpKSA9PSAodGFyaW5mby5zaXplLCBtZDVfcmVndHlwZSksCiAgICAgICAgICAgICAgICAicmVndWxhciBmaWxlIGV4dHJhY3Rpb24gZmFpbGVkIikKCiAgICBkZWYgdGVzdF9maWxlb2JqX3JlYWRsaW5lcyhzZWxmKToKICAgICAgICBzZWxmLnRhci5leHRyYWN0KCJ1c3Rhci9yZWd0eXBlIiwgVEVNUERJUikKICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9yZWd0eXBlIikKICAgICAgICBmb2JqMSA9IG9wZW4ob3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9yZWd0eXBlIiksICJyVSIpCiAgICAgICAgZm9iajIgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQoKICAgICAgICBsaW5lczEgPSBmb2JqMS5yZWFkbGluZXMoKQogICAgICAgIGxpbmVzMiA9IGZvYmoyLnJlYWRsaW5lcygpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmVzMSA9PSBsaW5lczIsCiAgICAgICAgICAgICAgICAiZmlsZW9iai5yZWFkbGluZXMoKSBmYWlsZWQiKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obGluZXMyKSA9PSAxMTQsCiAgICAgICAgICAgICAgICAiZmlsZW9iai5yZWFkbGluZXMoKSBmYWlsZWQiKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaW5lczJbODNdID09CiAgICAgICAgICAgICAgICAiSSB3aWxsIGdsYWRseSBhZG1pdCB0aGF0IFB5dGhvbiBpcyBub3QgdGhlIGZhc3Rlc3QgcnVubmluZyBzY3JpcHRpbmcgbGFuZ3VhZ2UuXG4iLAogICAgICAgICAgICAgICAgImZpbGVvYmoucmVhZGxpbmVzKCkgZmFpbGVkIikKCiAgICBkZWYgdGVzdF9maWxlb2JqX2l0ZXIoc2VsZik6CiAgICAgICAgc2VsZi50YXIuZXh0cmFjdCgidXN0YXIvcmVndHlwZSIsIFRFTVBESVIpCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvcmVndHlwZSIpCiAgICAgICAgZm9iajEgPSBvcGVuKG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvcmVndHlwZSIpLCAiclUiKQogICAgICAgIGZvYmoyID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKICAgICAgICBsaW5lczEgPSBmb2JqMS5yZWFkbGluZXMoKQogICAgICAgIGxpbmVzMiA9IFtsaW5lIGZvciBsaW5lIGluIGZvYmoyXQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaW5lczEgPT0gbGluZXMyLAogICAgICAgICAgICAgICAgICAgICAiZmlsZW9iai5fX2l0ZXJfXygpIGZhaWxlZCIpCgogICAgZGVmIHRlc3RfZmlsZW9ial9zZWVrKHNlbGYpOgogICAgICAgIHNlbGYudGFyLmV4dHJhY3QoInVzdGFyL3JlZ3R5cGUiLCBURU1QRElSKQogICAgICAgIGZvYmogPSBvcGVuKG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvcmVndHlwZSIpLCAicmIiKQogICAgICAgIGRhdGEgPSBmb2JqLnJlYWQoKQogICAgICAgIGZvYmouY2xvc2UoKQoKICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9yZWd0eXBlIikKICAgICAgICBmb2JqID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKCiAgICAgICAgdGV4dCA9IGZvYmoucmVhZCgpCiAgICAgICAgZm9iai5zZWVrKDApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPT0gZm9iai50ZWxsKCksCiAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gZmlsZSdzIHN0YXJ0IGZhaWxlZCIpCiAgICAgICAgZm9iai5zZWVrKDIwNDgsIDApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIwNDggPT0gZm9iai50ZWxsKCksCiAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gYWJzb2x1dGUgcG9zaXRpb24gZmFpbGVkIikKICAgICAgICBmb2JqLnNlZWsoLTEwMjQsIDEpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDEwMjQgPT0gZm9iai50ZWxsKCksCiAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gbmVnYXRpdmUgcmVsYXRpdmUgcG9zaXRpb24gZmFpbGVkIikKICAgICAgICBmb2JqLnNlZWsoMTAyNCwgMSkKICAgICAgICBzZWxmLmFzc2VydFRydWUoMjA0OCA9PSBmb2JqLnRlbGwoKSwKICAgICAgICAgICAgICAgICAgICAgInNlZWsoKSB0byBwb3NpdGl2ZSByZWxhdGl2ZSBwb3NpdGlvbiBmYWlsZWQiKQogICAgICAgIHMgPSBmb2JqLnJlYWQoMTApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMgPT0gZGF0YVsyMDQ4OjIwNThdLAogICAgICAgICAgICAgICAgICAgICAicmVhZCgpIGFmdGVyIHNlZWsgZmFpbGVkIikKICAgICAgICBmb2JqLnNlZWsoMCwgMikKICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby5zaXplID09IGZvYmoudGVsbCgpLAogICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIGZpbGUncyBlbmQgZmFpbGVkIikKICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9iai5yZWFkKCkgPT0gIiIsCiAgICAgICAgICAgICAgICAgICAgICJyZWFkKCkgYXQgZmlsZSdzIGVuZCBkaWQgbm90IHJldHVybiBlbXB0eSBzdHJpbmciKQogICAgICAgIGZvYmouc2VlaygtdGFyaW5mby5zaXplLCAyKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwID09IGZvYmoudGVsbCgpLAogICAgICAgICAgICAgICAgICAgICAicmVsYXRpdmUgc2VlaygpIHRvIGZpbGUncyBzdGFydCBmYWlsZWQiKQogICAgICAgIGZvYmouc2Vlayg1MTIpCiAgICAgICAgczEgPSBmb2JqLnJlYWRsaW5lcygpCiAgICAgICAgZm9iai5zZWVrKDUxMikKICAgICAgICBzMiA9IGZvYmoucmVhZGxpbmVzKCkKICAgICAgICBzZWxmLmFzc2VydFRydWUoczEgPT0gczIsCiAgICAgICAgICAgICAgICAgICAgICJyZWFkbGluZXMoKSBhZnRlciBzZWVrIGZhaWxlZCIpCiAgICAgICAgZm9iai5zZWVrKDApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihmb2JqLnJlYWRsaW5lKCkpID09IGZvYmoudGVsbCgpLAogICAgICAgICAgICAgICAgICAgICAidGVsbCgpIGFmdGVyIHJlYWRsaW5lKCkgZmFpbGVkIikKICAgICAgICBmb2JqLnNlZWsoNTEyKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZm9iai5yZWFkbGluZSgpKSArIDUxMiA9PSBmb2JqLnRlbGwoKSwKICAgICAgICAgICAgICAgICAgICAgInRlbGwoKSBhZnRlciBzZWVrKCkgYW5kIHJlYWRsaW5lKCkgZmFpbGVkIikKICAgICAgICBmb2JqLnNlZWsoMCkKICAgICAgICBsaW5lID0gZm9iai5yZWFkbGluZSgpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvYmoucmVhZCgpID09IGRhdGFbbGVuKGxpbmUpOl0sCiAgICAgICAgICAgICAgICAgICAgICJyZWFkKCkgYWZ0ZXIgcmVhZGxpbmUoKSBmYWlsZWQiKQogICAgICAgIGZvYmouY2xvc2UoKQoKICAgICMgVGVzdCBpZiBzeW1ib2xpYyBhbmQgaGFyZCBsaW5rcyBhcmUgcmVzb2x2ZWQgYnkgZXh0cmFjdGZpbGUoKS4gIFRoZQogICAgIyB0ZXN0IGxpbmsgbWVtYmVycyBlYWNoIHBvaW50IHRvIGEgcmVndWxhciBtZW1iZXIgd2hvc2UgZGF0YSBpcwogICAgIyBzdXBwb3NlZCB0byBiZSBleHBvcnRlZC4KICAgIGRlZiBfdGVzdF9maWxlb2JqX2xpbmsoc2VsZiwgbG5rdHlwZSwgcmVndHlwZSk6CiAgICAgICAgYSA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKGxua3R5cGUpCiAgICAgICAgYiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHJlZ3R5cGUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLm5hbWUsIGIubmFtZSkKCiAgICBkZWYgdGVzdF9maWxlb2JqX2xpbmsxKHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3RfZmlsZW9ial9saW5rKCJ1c3Rhci9sbmt0eXBlIiwgInVzdGFyL3JlZ3R5cGUiKQoKICAgIGRlZiB0ZXN0X2ZpbGVvYmpfbGluazIoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF9maWxlb2JqX2xpbmsoIi4vdXN0YXIvbGlua3Rlc3QyL2xua3R5cGUiLCAidXN0YXIvbGlua3Rlc3QxL3JlZ3R5cGUiKQoKICAgIGRlZiB0ZXN0X2ZpbGVvYmpfc3ltbGluazEoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF9maWxlb2JqX2xpbmsoInVzdGFyL3N5bXR5cGUiLCAidXN0YXIvcmVndHlwZSIpCgogICAgZGVmIHRlc3RfZmlsZW9ial9zeW1saW5rMihzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X2ZpbGVvYmpfbGluaygiLi91c3Rhci9saW5rdGVzdDIvc3ltdHlwZSIsICJ1c3Rhci9saW5rdGVzdDEvcmVndHlwZSIpCgogICAgZGVmIHRlc3RfaXNzdWUxNDE2MChzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X2ZpbGVvYmpfbGluaygic3ltdHlwZTIiLCAidXN0YXIvcmVndHlwZSIpCgoKY2xhc3MgQ29tbW9uUmVhZFRlc3QoUmVhZFRlc3QpOgoKICAgIGRlZiB0ZXN0X2VtcHR5X3RhcmZpbGUoc2VsZik6CiAgICAgICAgIyBUZXN0IGZvciBpc3N1ZTYxMjM6IEFsbG93IG9wZW5pbmcgZW1wdHkgYXJjaGl2ZXMuCiAgICAgICAgIyBUaGlzIHRlc3QgY2hlY2tzIGlmIHRhcmZpbGUub3BlbigpIGlzIGFibGUgdG8gb3BlbiBhbiBlbXB0eSB0YXIKICAgICAgICAjIGFyY2hpdmUgc3VjY2Vzc2Z1bGx5LiBOb3RlIHRoYXQgYW4gZW1wdHkgdGFyIGFyY2hpdmUgaXMgbm90IHRoZQogICAgICAgICMgc2FtZSBhcyBhbiBlbXB0eSBmaWxlIQogICAgICAgIHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUucmVwbGFjZSgiciIsICJ3IikpLmNsb3NlKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCiAgICAgICAgICAgIHRhci5nZXRuYW1lcygpCiAgICAgICAgZXhjZXB0IHRhcmZpbGUuUmVhZEVycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoInRhcmZpbGUub3BlbigpIGZhaWxlZCBvbiBlbXB0eSBhcmNoaXZlIikKICAgICAgICBzZWxmLmFzc2VydExpc3RFcXVhbCh0YXIuZ2V0bWVtYmVycygpLCBbXSkKCiAgICBkZWYgdGVzdF9udWxsX3RhcmZpbGUoc2VsZik6CiAgICAgICAgIyBUZXN0IGZvciBpc3N1ZTYxMjM6IEFsbG93IG9wZW5pbmcgZW1wdHkgYXJjaGl2ZXMuCiAgICAgICAgIyBUaGlzIHRlc3QgZ3VhcmFudGVlcyB0aGF0IHRhcmZpbGUub3BlbigpIGRvZXMgbm90IHRyZWF0IGFuIGVtcHR5CiAgICAgICAgIyBmaWxlIGFzIGFuIGVtcHR5IHRhciBhcmNoaXZlLgogICAgICAgIG9wZW4odG1wbmFtZSwgIndiIikuY2xvc2UoKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRtcG5hbWUsIHNlbGYubW9kZSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0bXBuYW1lKQoKICAgIGRlZiB0ZXN0X2lnbm9yZV96ZXJvcyhzZWxmKToKICAgICAgICAjIFRlc3QgVGFyRmlsZSdzIGlnbm9yZV96ZXJvcyBvcHRpb24uCiAgICAgICAgaWYgc2VsZi5tb2RlLmVuZHN3aXRoKCI6Z3oiKToKICAgICAgICAgICAgX29wZW4gPSBnemlwLkd6aXBGaWxlCiAgICAgICAgZWxpZiBzZWxmLm1vZGUuZW5kc3dpdGgoIjpiejIiKToKICAgICAgICAgICAgX29wZW4gPSBiejIuQloyRmlsZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9vcGVuID0gb3BlbgoKICAgICAgICBmb3IgY2hhciBpbiAoJ1wwJywgJ2EnKToKICAgICAgICAgICAgIyBUZXN0IGlmIEVPRkhlYWRlckVycm9yICgnXDAnKSBhbmQgSW52YWxpZEhlYWRlckVycm9yICgnYScpCiAgICAgICAgICAgICMgYXJlIGlnbm9yZWQgY29ycmVjdGx5LgogICAgICAgICAgICBmb2JqID0gX29wZW4odG1wbmFtZSwgIndiIikKICAgICAgICAgICAgZm9iai53cml0ZShjaGFyICogMTAyNCkKICAgICAgICAgICAgZm9iai53cml0ZSh0YXJmaWxlLlRhckluZm8oImZvbyIpLnRvYnVmKCkpCiAgICAgICAgICAgIGZvYmouY2xvc2UoKQoKICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIG1vZGU9InIiLCBpZ25vcmVfemVyb3M9VHJ1ZSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRMaXN0RXF1YWwodGFyLmdldG5hbWVzKCksIFsiZm9vIl0sCiAgICAgICAgICAgICAgICAgICAgImlnbm9yZV96ZXJvcz1UcnVlIHNob3VsZCBoYXZlIHNraXBwZWQgdGhlICVyLWJsb2NrcyIgJSBjaGFyKQogICAgICAgICAgICB0YXIuY2xvc2UoKQoKCmNsYXNzIE1pc2NSZWFkVGVzdChDb21tb25SZWFkVGVzdCk6CgogICAgZGVmIHRlc3Rfbm9fbmFtZV9hcmd1bWVudChzZWxmKToKICAgICAgICBmb2JqID0gb3BlbihzZWxmLnRhcm5hbWUsICJyYiIpCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKGZpbGVvYmo9Zm9iaiwgbW9kZT1zZWxmLm1vZGUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIubmFtZSwgb3MucGF0aC5hYnNwYXRoKGZvYmoubmFtZSkpCgogICAgZGVmIHRlc3Rfbm9fbmFtZV9hdHRyaWJ1dGUoc2VsZik6CiAgICAgICAgZGF0YSA9IG9wZW4oc2VsZi50YXJuYW1lLCAicmIiKS5yZWFkKCkKICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oZGF0YSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZ2V0YXR0ciwgZm9iaiwgIm5hbWUiKQogICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihmaWxlb2JqPWZvYmosIG1vZGU9c2VsZi5tb2RlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLm5hbWUsIE5vbmUpCgogICAgZGVmIHRlc3RfZW1wdHlfbmFtZV9hdHRyaWJ1dGUoc2VsZik6CiAgICAgICAgZGF0YSA9IG9wZW4oc2VsZi50YXJuYW1lLCAicmIiKS5yZWFkKCkKICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oZGF0YSkKICAgICAgICBmb2JqLm5hbWUgPSAiIgogICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihmaWxlb2JqPWZvYmosIG1vZGU9c2VsZi5tb2RlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLm5hbWUsIE5vbmUpCgogICAgZGVmIHRlc3RfZmlsZW9ial93aXRoX29mZnNldChzZWxmKToKICAgICAgICAjIFNraXAgdGhlIGZpcnN0IG1lbWJlciBhbmQgc3RvcmUgdmFsdWVzIGZyb20gdGhlIHNlY29uZCBtZW1iZXIKICAgICAgICAjIG9mIHRoZSB0ZXN0dGFyLgogICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihzZWxmLnRhcm5hbWUsIG1vZGU9c2VsZi5tb2RlKQogICAgICAgIHRhci5uZXh0KCkKICAgICAgICB0ID0gdGFyLm5leHQoKQogICAgICAgIG5hbWUgPSB0Lm5hbWUKICAgICAgICBvZmZzZXQgPSB0Lm9mZnNldAogICAgICAgIGRhdGEgPSB0YXIuZXh0cmFjdGZpbGUodCkucmVhZCgpCiAgICAgICAgdGFyLmNsb3NlKCkKCiAgICAgICAgIyBPcGVuIHRoZSB0ZXN0dGFyIGFuZCBzZWVrIHRvIHRoZSBvZmZzZXQgb2YgdGhlIHNlY29uZCBtZW1iZXIuCiAgICAgICAgaWYgc2VsZi5tb2RlLmVuZHN3aXRoKCI6Z3oiKToKICAgICAgICAgICAgX29wZW4gPSBnemlwLkd6aXBGaWxlCiAgICAgICAgZWxpZiBzZWxmLm1vZGUuZW5kc3dpdGgoIjpiejIiKToKICAgICAgICAgICAgX29wZW4gPSBiejIuQloyRmlsZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9vcGVuID0gb3BlbgogICAgICAgIGZvYmogPSBfb3BlbihzZWxmLnRhcm5hbWUsICJyYiIpCiAgICAgICAgZm9iai5zZWVrKG9mZnNldCkKCiAgICAgICAgIyBUZXN0IGlmIHRoZSB0YXJmaWxlIHN0YXJ0cyB3aXRoIHRoZSBzZWNvbmQgbWVtYmVyLgogICAgICAgIHRhciA9IHRhci5vcGVuKHNlbGYudGFybmFtZSwgbW9kZT0icjoiLCBmaWxlb2JqPWZvYmopCiAgICAgICAgdCA9IHRhci5uZXh0KCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubmFtZSwgbmFtZSkKICAgICAgICAjIFJlYWQgdG8gdGhlIGVuZCBvZiBmaWxlb2JqIGFuZCB0ZXN0IGlmIHNlZWtpbmcgYmFjayB0byB0aGUKICAgICAgICAjIGJlZ2lubmluZyB3b3Jrcy4KICAgICAgICB0YXIuZ2V0bWVtYmVycygpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZXh0cmFjdGZpbGUodCkucmVhZCgpLCBkYXRhLAogICAgICAgICAgICAgICAgInNlZWsgYmFjayBkaWQgbm90IHdvcmsiKQogICAgICAgIHRhci5jbG9zZSgpCgogICAgZGVmIHRlc3RfZmFpbF9jb21wKHNlbGYpOgogICAgICAgICMgRm9yIEd6aXAgYW5kIEJ6MiBUZXN0czogZmFpbCB3aXRoIGEgUmVhZEVycm9yIG9uIGFuIHVuY29tcHJlc3NlZCBmaWxlLgogICAgICAgIGlmIHNlbGYubW9kZSA9PSAicjoiOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0YXJuYW1lLCBzZWxmLm1vZGUpCiAgICAgICAgZm9iaiA9IG9wZW4odGFybmFtZSwgInJiIikKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBmaWxlb2JqPWZvYmosIG1vZGU9c2VsZi5tb2RlKQoKICAgIGRlZiB0ZXN0X3Y3X2RpcnR5cGUoc2VsZik6CiAgICAgICAgIyBUZXN0IG9sZCBzdHlsZSBkaXJ0eXBlIG1lbWJlciAoYnVnICMxMzM2NjIzKToKICAgICAgICAjIE9sZCBWNyB0YXJzIGNyZWF0ZSBkaXJlY3RvcnkgbWVtYmVycyB1c2luZyBhbiBBUkVHVFlQRQogICAgICAgICMgaGVhZGVyIHdpdGggYSAiLyIgYXBwZW5kZWQgdG8gdGhlIGZpbGVuYW1lIGZpZWxkLgogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoIm1pc2MvZGlydHlwZS1vbGQtdjciKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnR5cGUgPT0gdGFyZmlsZS5ESVJUWVBFLAogICAgICAgICAgICAgICAgInY3IGRpcnR5cGUgZmFpbGVkIikKCiAgICBkZWYgdGVzdF94c3Rhcl90eXBlKHNlbGYpOgogICAgICAgICMgVGhlIHhzdGFyIGZvcm1hdCBzdG9yZXMgZXh0cmEgYXRpbWUgYW5kIGN0aW1lIGZpZWxkcyBpbnNpZGUgdGhlCiAgICAgICAgIyBzcGFjZSByZXNlcnZlZCBmb3IgdGhlIHByZWZpeCBmaWVsZC4gVGhlIHByZWZpeCBmaWVsZCBtdXN0IGJlCiAgICAgICAgIyBpZ25vcmVkIGluIHRoaXMgY2FzZSwgb3RoZXJ3aXNlIGl0IHdpbGwgbWVzcyB1cCB0aGUgbmFtZS4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYudGFyLmdldG1lbWJlcigibWlzYy9yZWd0eXBlLXhzdGFyIikKICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiZmFpbGVkIHRvIGZpbmQgbWlzYy9yZWd0eXBlLXhzdGFyIChtYW5nbGVkIHByZWZpeD8pIikKCiAgICBkZWYgdGVzdF9jaGVja19tZW1iZXJzKHNlbGYpOgogICAgICAgIGZvciB0YXJpbmZvIGluIHNlbGYudGFyOgogICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50KHRhcmluZm8ubXRpbWUpID09IDA3NjA2MTM2NjE3LAogICAgICAgICAgICAgICAgICAgICJ3cm9uZyBtdGltZSBmb3IgJXMiICUgdGFyaW5mby5uYW1lKQogICAgICAgICAgICBpZiBub3QgdGFyaW5mby5uYW1lLnN0YXJ0c3dpdGgoInVzdGFyLyIpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8udW5hbWUgPT0gInRhcmZpbGUiLAogICAgICAgICAgICAgICAgICAgICJ3cm9uZyB1bmFtZSBmb3IgJXMiICUgdGFyaW5mby5uYW1lKQoKICAgIGRlZiB0ZXN0X2ZpbmRfbWVtYmVycyhzZWxmKToKICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50YXIuZ2V0bWVtYmVycygpWy0xXS5uYW1lID09ICJtaXNjL2VvZiIsCiAgICAgICAgICAgICAgICAiY291bGQgbm90IGZpbmQgYWxsIG1lbWJlcnMiKQoKICAgIGRlZiB0ZXN0X2V4dHJhY3RfaGFyZGxpbmsoc2VsZik6CiAgICAgICAgIyBUZXN0IGhhcmRsaW5rIGV4dHJhY3Rpb24gKGUuZy4gYnVnICM4NTcyOTcpLgogICAgICAgIHdpdGggdGFyZmlsZS5vcGVuKHRhcm5hbWUsIGVycm9ybGV2ZWw9MSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpIGFzIHRhcjoKICAgICAgICAgICAgdGFyLmV4dHJhY3QoInVzdGFyL3JlZ3R5cGUiLCBURU1QRElSKQogICAgICAgICAgICBzZWxmLmFkZENsZWFudXAob3MucmVtb3ZlLCBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInVzdGFyL3JlZ3R5cGUiKSkKCiAgICAgICAgICAgIHRhci5leHRyYWN0KCJ1c3Rhci9sbmt0eXBlIiwgVEVNUERJUikKICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnJlbW92ZSwgb3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9sbmt0eXBlIikpCiAgICAgICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oVEVNUERJUiwgInVzdGFyL2xua3R5cGUiKSwgInJiIikgYXMgZjoKICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1kNXN1bShkYXRhKSwgbWQ1X3JlZ3R5cGUpCgogICAgICAgICAgICB0YXIuZXh0cmFjdCgidXN0YXIvc3ltdHlwZSIsIFRFTVBESVIpCiAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5yZW1vdmUsIG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvc3ltdHlwZSIpKQogICAgICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9zeW10eXBlIiksICJyYiIpIGFzIGY6CiAgICAgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZDVzdW0oZGF0YSksIG1kNV9yZWd0eXBlKQoKICAgIGRlZiB0ZXN0X2V4dHJhY3RhbGwoc2VsZik6CiAgICAgICAgIyBUZXN0IGlmIGV4dHJhY3RhbGwoKSBjb3JyZWN0bHkgcmVzdG9yZXMgZGlyZWN0b3J5IHBlcm1pc3Npb25zCiAgICAgICAgIyBhbmQgdGltZXMgKHNlZSBpc3N1ZTE3MzUpLgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0YXJuYW1lLCBlbmNvZGluZz0iaXNvODg1OS0xIikKICAgICAgICBkaXJlY3RvcmllcyA9IFt0IGZvciB0IGluIHRhciBpZiB0LmlzZGlyKCldCiAgICAgICAgdGFyLmV4dHJhY3RhbGwoVEVNUERJUiwgZGlyZWN0b3JpZXMpCiAgICAgICAgZm9yIHRhcmluZm8gaW4gZGlyZWN0b3JpZXM6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgdGFyaW5mby5uYW1lKQogICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gIndpbjMyIjoKICAgICAgICAgICAgICAgICMgV2luMzIgaGFzIG5vIHN1cHBvcnQgZm9yIGZpbmUgZ3JhaW5lZCBwZXJtaXNzaW9ucy4KICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5tb2RlICYgMDc3Nywgb3Muc3RhdChwYXRoKS5zdF9tb2RlICYgMDc3NykKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLm10aW1lLCBvcy5wYXRoLmdldG10aW1lKHBhdGgpKQogICAgICAgIHRhci5jbG9zZSgpCgogICAgZGVmIHRlc3RfaW5pdF9jbG9zZV9mb2JqKHNlbGYpOgogICAgICAgICMgSXNzdWUgIzczNDE6IENsb3NlIHRoZSBpbnRlcm5hbCBmaWxlIG9iamVjdCBpbiB0aGUgVGFyRmlsZQogICAgICAgICMgY29uc3RydWN0b3IgaW4gY2FzZSBvZiBhbiBlcnJvci4gRm9yIHRoZSB0ZXN0IHdlIHJlbHkgb24KICAgICAgICAjIHRoZSBmYWN0IHRoYXQgb3BlbmluZyBhbiBlbXB0eSBmaWxlIHJhaXNlcyBhIFJlYWRFcnJvci4KICAgICAgICBlbXB0eSA9IG9zLnBhdGguam9pbihURU1QRElSLCAiZW1wdHkiKQogICAgICAgIG9wZW4oZW1wdHksICJ3YiIpLndyaXRlKCIiKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHRhciA9IG9iamVjdC5fX25ld19fKHRhcmZpbGUuVGFyRmlsZSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdGFyLl9faW5pdF9fKGVtcHR5KQogICAgICAgICAgICBleGNlcHQgdGFyZmlsZS5SZWFkRXJyb3I6CiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyLmZpbGVvYmouY2xvc2VkKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJSZWFkRXJyb3Igbm90IHJhaXNlZCIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgb3MucmVtb3ZlKGVtcHR5KQoKICAgIGRlZiB0ZXN0X3BhcmFsbGVsX2l0ZXJhdGlvbihzZWxmKToKICAgICAgICAjIElzc3VlICMxNjYwMTogUmVzdGFydGluZyBpdGVyYXRpb24gb3ZlciB0YXJmaWxlIGNvbnRpbnVlZAogICAgICAgICMgZnJvbSB3aGVyZSBpdCBsZWZ0IG9mZi4KICAgICAgICB3aXRoIHRhcmZpbGUub3BlbihzZWxmLnRhcm5hbWUpIGFzIHRhcjoKICAgICAgICAgICAgZm9yIG0xLCBtMiBpbiB6aXAodGFyLCB0YXIpOgogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMS5vZmZzZXQsIG0yLm9mZnNldCkKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTEubmFtZSwgbTIubmFtZSkKCgpjbGFzcyBTdHJlYW1SZWFkVGVzdChDb21tb25SZWFkVGVzdCk6CgogICAgbW9kZT0icnwiCgogICAgZGVmIHRlc3RfZmlsZW9ial9yZWd1bGFyX2ZpbGUoc2VsZik6CiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLm5leHQoKSAjIGdldCAicmVndHlwZSIgKGNhbid0IHVzZSBnZXRtZW1iZXIpCiAgICAgICAgZm9iaiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8pCiAgICAgICAgZGF0YSA9IGZvYmoucmVhZCgpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChsZW4oZGF0YSksIG1kNXN1bShkYXRhKSkgPT0gKHRhcmluZm8uc2l6ZSwgbWQ1X3JlZ3R5cGUpLAogICAgICAgICAgICAgICAgInJlZ3VsYXIgZmlsZSBleHRyYWN0aW9uIGZhaWxlZCIpCgogICAgZGVmIHRlc3RfcHJvdm9rZV9zdHJlYW1fZXJyb3Ioc2VsZik6CiAgICAgICAgdGFyaW5mb3MgPSBzZWxmLnRhci5nZXRtZW1iZXJzKCkKICAgICAgICBmID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mb3NbMF0pICMgcmVhZCB0aGUgZmlyc3QgbWVtYmVyCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5TdHJlYW1FcnJvciwgZi5yZWFkKQoKICAgIGRlZiB0ZXN0X2NvbXBhcmVfbWVtYmVycyhzZWxmKToKICAgICAgICB0YXIxID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQogICAgICAgIHRhcjIgPSBzZWxmLnRhcgoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0MSA9IHRhcjEubmV4dCgpCiAgICAgICAgICAgIHQyID0gdGFyMi5uZXh0KCkKICAgICAgICAgICAgaWYgdDEgaXMgTm9uZToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiBpcyBub3QgTm9uZSwgInN0cmVhbS5uZXh0KCkgZmFpbGVkLiIpCgogICAgICAgICAgICBpZiB0Mi5pc2xuaygpIG9yIHQyLmlzc3ltKCk6CiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlN0cmVhbUVycm9yLCB0YXIyLmV4dHJhY3RmaWxlLCB0MikKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICB2MSA9IHRhcjEuZXh0cmFjdGZpbGUodDEpCiAgICAgICAgICAgIHYyID0gdGFyMi5leHRyYWN0ZmlsZSh0MikKICAgICAgICAgICAgaWYgdjEgaXMgTm9uZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2MiBpcyBub3QgTm9uZSwgInN0cmVhbS5leHRyYWN0ZmlsZSgpIGZhaWxlZCIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2MS5yZWFkKCkgPT0gdjIucmVhZCgpLCAic3RyZWFtIGV4dHJhY3Rpb24gZmFpbGVkIikKCiAgICAgICAgdGFyMS5jbG9zZSgpCgoKY2xhc3MgRGV0ZWN0UmVhZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgoKICAgIGRlZiBfdGVzdGZ1bmNfZmlsZShzZWxmLCBuYW1lLCBtb2RlKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHRhcmZpbGUub3BlbihuYW1lLCBtb2RlKQogICAgICAgIGV4Y2VwdCB0YXJmaWxlLlJlYWRFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKCkKCiAgICBkZWYgX3Rlc3RmdW5jX2ZpbGVvYmooc2VsZiwgbmFtZSwgbW9kZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB0YXJmaWxlLm9wZW4obmFtZSwgbW9kZSwgZmlsZW9iaj1vcGVuKG5hbWUsICJyYiIpKQogICAgICAgIGV4Y2VwdCB0YXJmaWxlLlJlYWRFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKCkKCiAgICBkZWYgX3Rlc3RfbW9kZXMoc2VsZiwgdGVzdGZ1bmMpOgogICAgICAgIHRlc3RmdW5jKHRhcm5hbWUsICJyIikKICAgICAgICB0ZXN0ZnVuYyh0YXJuYW1lLCAicjoiKQogICAgICAgIHRlc3RmdW5jKHRhcm5hbWUsICJyOioiKQogICAgICAgIHRlc3RmdW5jKHRhcm5hbWUsICJyfCIpCiAgICAgICAgdGVzdGZ1bmModGFybmFtZSwgInJ8KiIpCgogICAgICAgIGlmIGd6aXA6CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRhcm5hbWUsIG1vZGU9InI6Z3oiKQogICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0YXJuYW1lLCBtb2RlPSJyfGd6IikKICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgZ3ppcG5hbWUsIG1vZGU9InI6IikKICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgZ3ppcG5hbWUsIG1vZGU9InJ8IikKCiAgICAgICAgICAgIHRlc3RmdW5jKGd6aXBuYW1lLCAiciIpCiAgICAgICAgICAgIHRlc3RmdW5jKGd6aXBuYW1lLCAicjoqIikKICAgICAgICAgICAgdGVzdGZ1bmMoZ3ppcG5hbWUsICJyOmd6IikKICAgICAgICAgICAgdGVzdGZ1bmMoZ3ppcG5hbWUsICJyfCoiKQogICAgICAgICAgICB0ZXN0ZnVuYyhnemlwbmFtZSwgInJ8Z3oiKQoKICAgICAgICBpZiBiejI6CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRhcm5hbWUsIG1vZGU9InI6YnoyIikKICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgdGFybmFtZSwgbW9kZT0icnxiejIiKQogICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBiejJuYW1lLCBtb2RlPSJyOiIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIGJ6Mm5hbWUsIG1vZGU9InJ8IikKCiAgICAgICAgICAgIHRlc3RmdW5jKGJ6Mm5hbWUsICJyIikKICAgICAgICAgICAgdGVzdGZ1bmMoYnoybmFtZSwgInI6KiIpCiAgICAgICAgICAgIHRlc3RmdW5jKGJ6Mm5hbWUsICJyOmJ6MiIpCiAgICAgICAgICAgIHRlc3RmdW5jKGJ6Mm5hbWUsICJyfCoiKQogICAgICAgICAgICB0ZXN0ZnVuYyhiejJuYW1lLCAicnxiejIiKQoKICAgIGRlZiB0ZXN0X2RldGVjdF9maWxlKHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3RfbW9kZXMoc2VsZi5fdGVzdGZ1bmNfZmlsZSkKCiAgICBkZWYgdGVzdF9kZXRlY3RfZmlsZW9iaihzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X21vZGVzKHNlbGYuX3Rlc3RmdW5jX2ZpbGVvYmopCgogICAgZGVmIHRlc3RfZGV0ZWN0X3N0cmVhbV9iejIoc2VsZik6CiAgICAgICAgIyBPcmlnaW5hbGx5LCB0YXJmaWxlJ3Mgc3RyZWFtIGRldGVjdGlvbiBsb29rZWQgZm9yIHRoZSBzdHJpbmcKICAgICAgICAjICJCWmg5MSIgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiBUaGlzIGlzIGluY29ycmVjdCBiZWNhdXNlCiAgICAgICAgIyB0aGUgJzknIHJlcHJlc2VudHMgdGhlIGJsb2Nrc2l6ZSAoOTAwa0IpLiBJZiB0aGUgZmlsZSB3YXMKICAgICAgICAjIGNvbXByZXNzZWQgdXNpbmcgYW5vdGhlciBibG9ja3NpemUgYXV0b2RldGVjdGlvbiBmYWlscy4KICAgICAgICBpZiBub3QgYnoyOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgd2l0aCBvcGVuKHRhcm5hbWUsICJyYiIpIGFzIGZvYmo6CiAgICAgICAgICAgIGRhdGEgPSBmb2JqLnJlYWQoKQoKICAgICAgICAjIENvbXByZXNzIHdpdGggYmxvY2tzaXplIDEwMGtCLCB0aGUgZmlsZSBzdGFydHMgd2l0aCAiQlpoMTEiLgogICAgICAgIHdpdGggYnoyLkJaMkZpbGUodG1wbmFtZSwgIndiIiwgY29tcHJlc3NsZXZlbD0xKSBhcyBmb2JqOgogICAgICAgICAgICBmb2JqLndyaXRlKGRhdGEpCgogICAgICAgIHNlbGYuX3Rlc3RmdW5jX2ZpbGUodG1wbmFtZSwgInJ8KiIpCgoKY2xhc3MgTWVtYmVyUmVhZFRlc3QoUmVhZFRlc3QpOgoKICAgIGRlZiBfdGVzdF9tZW1iZXIoc2VsZiwgdGFyaW5mbywgY2hrc3VtPU5vbmUsICoqa3dhcmdzKToKICAgICAgICBpZiBjaGtzdW0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZDVzdW0oc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykucmVhZCgpKSA9PSBjaGtzdW0sCiAgICAgICAgICAgICAgICAgICAgIndyb25nIG1kNXN1bSBmb3IgJXMiICUgdGFyaW5mby5uYW1lKQoKICAgICAgICBrd2FyZ3NbIm10aW1lIl0gPSAwNzYwNjEzNjYxNwogICAgICAgIGt3YXJnc1sidWlkIl0gPSAxMDAwCiAgICAgICAga3dhcmdzWyJnaWQiXSA9IDEwMAogICAgICAgIGlmICJvbGQtdjciIG5vdCBpbiB0YXJpbmZvLm5hbWU6CiAgICAgICAgICAgICMgVjcgdGFyIGNhbid0IGhhbmRsZSBhbHBoYWJldGljIG93bmVycy4KICAgICAgICAgICAga3dhcmdzWyJ1bmFtZSJdID0gInRhcmZpbGUiCiAgICAgICAgICAgIGt3YXJnc1siZ25hbWUiXSA9ICJ0YXJmaWxlIgogICAgICAgIGZvciBrLCB2IGluIGt3YXJncy5pdGVyaXRlbXMoKToKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdldGF0dHIodGFyaW5mbywgaykgPT0gdiwKICAgICAgICAgICAgICAgICAgICAid3JvbmcgdmFsdWUgaW4gJXMgZmllbGQgb2YgJXMiICUgKGssIHRhcmluZm8ubmFtZSkpCgogICAgZGVmIHRlc3RfZmluZF9yZWd0eXBlKHNlbGYpOgogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3JlZ3R5cGUiKQogICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9NzAxMSwgY2hrc3VtPW1kNV9yZWd0eXBlKQoKICAgIGRlZiB0ZXN0X2ZpbmRfY29udHR5cGUoc2VsZik6CiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvY29udHR5cGUiKQogICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9NzAxMSwgY2hrc3VtPW1kNV9yZWd0eXBlKQoKICAgIGRlZiB0ZXN0X2ZpbmRfZGlydHlwZShzZWxmKToKICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9kaXJ0eXBlIikKICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTApCgogICAgZGVmIHRlc3RfZmluZF9kaXJ0eXBlX3dpdGhfc2l6ZShzZWxmKToKICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9kaXJ0eXBlLXdpdGgtc2l6ZSIpCiAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT0yNTUpCgogICAgZGVmIHRlc3RfZmluZF9sbmt0eXBlKHNlbGYpOgogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL2xua3R5cGUiKQogICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9MCwgbGlua25hbWU9InVzdGFyL3JlZ3R5cGUiKQoKICAgIGRlZiB0ZXN0X2ZpbmRfc3ltdHlwZShzZWxmKToKICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9zeW10eXBlIikKICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTAsIGxpbmtuYW1lPSJyZWd0eXBlIikKCiAgICBkZWYgdGVzdF9maW5kX2Jsa3R5cGUoc2VsZik6CiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvYmxrdHlwZSIpCiAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT0wLCBkZXZtYWpvcj0zLCBkZXZtaW5vcj0wKQoKICAgIGRlZiB0ZXN0X2ZpbmRfY2hydHlwZShzZWxmKToKICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9jaHJ0eXBlIikKICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTAsIGRldm1ham9yPTEsIGRldm1pbm9yPTMpCgogICAgZGVmIHRlc3RfZmluZF9maWZvdHlwZShzZWxmKToKICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9maWZvdHlwZSIpCiAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT0wKQoKICAgIGRlZiB0ZXN0X2ZpbmRfc3BhcnNlKHNlbGYpOgogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3NwYXJzZSIpCiAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT04NjAxNiwgY2hrc3VtPW1kNV9zcGFyc2UpCgogICAgZGVmIHRlc3RfZmluZF91bWxhdXRzKHNlbGYpOgogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3VtbGF1dHMtxNbc5Pb83yIpCiAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT03MDExLCBjaGtzdW09bWQ1X3JlZ3R5cGUpCgogICAgZGVmIHRlc3RfZmluZF91c3Rhcl9sb25nbmFtZShzZWxmKToKICAgICAgICBuYW1lID0gInVzdGFyLyIgKyAiMTIzNDUvIiAqIDM5ICsgIjEyMzQ1NjcvbG9uZ25hbWUiCiAgICAgICAgc2VsZi5hc3NlcnRJbihuYW1lLCBzZWxmLnRhci5nZXRuYW1lcygpKQoKICAgIGRlZiB0ZXN0X2ZpbmRfcmVndHlwZV9vbGR2NyhzZWxmKToKICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJtaXNjL3JlZ3R5cGUtb2xkLXY3IikKICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTcwMTEsIGNoa3N1bT1tZDVfcmVndHlwZSkKCiAgICBkZWYgdGVzdF9maW5kX3BheF91bWxhdXRzKHNlbGYpOgogICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgbW9kZT1zZWxmLm1vZGUsIGVuY29kaW5nPSJpc284ODU5LTEiKQogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInBheC91bWxhdXRzLcTW3OT2/N8iKQogICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9NzAxMSwgY2hrc3VtPW1kNV9yZWd0eXBlKQoKCmNsYXNzIExvbmduYW1lVGVzdChSZWFkVGVzdCk6CgogICAgZGVmIHRlc3RfcmVhZF9sb25nbmFtZShzZWxmKToKICAgICAgICAjIFRlc3QgcmVhZGluZyBvZiBsb25nbmFtZSAoYnVnICMxNDcxNDI3KS4KICAgICAgICBsb25nbmFtZSA9IHNlbGYuc3ViZGlyICsgIi8iICsgIjEyMy8iICogMTI1ICsgImxvbmduYW1lIgogICAgICAgIHRyeToKICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcihsb25nbmFtZSkKICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgibG9uZ25hbWUgbm90IGZvdW5kIikKICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby50eXBlICE9IHRhcmZpbGUuRElSVFlQRSwgInJlYWQgbG9uZ25hbWUgYXMgZGlydHlwZSIpCgogICAgZGVmIHRlc3RfcmVhZF9sb25nbGluayhzZWxmKToKICAgICAgICBsb25nbmFtZSA9IHNlbGYuc3ViZGlyICsgIi8iICsgIjEyMy8iICogMTI1ICsgImxvbmduYW1lIgogICAgICAgIGxvbmdsaW5rID0gc2VsZi5zdWJkaXIgKyAiLyIgKyAiMTIzLyIgKiAxMjUgKyAibG9uZ2xpbmsiCiAgICAgICAgdHJ5OgogICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKGxvbmdsaW5rKQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKCJsb25nbGluayBub3QgZm91bmQiKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLmxpbmtuYW1lID09IGxvbmduYW1lLCAibGlua25hbWUgd3JvbmciKQoKICAgIGRlZiB0ZXN0X3RydW5jYXRlZF9sb25nbmFtZShzZWxmKToKICAgICAgICBsb25nbmFtZSA9IHNlbGYuc3ViZGlyICsgIi8iICsgIjEyMy8iICogMTI1ICsgImxvbmduYW1lIgogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIobG9uZ25hbWUpCiAgICAgICAgb2Zmc2V0ID0gdGFyaW5mby5vZmZzZXQKICAgICAgICBzZWxmLnRhci5maWxlb2JqLnNlZWsob2Zmc2V0KQogICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTyhzZWxmLnRhci5maWxlb2JqLnJlYWQoMyAqIDUxMikpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgbmFtZT0iZm9vLnRhciIsIGZpbGVvYmo9Zm9iaikKCiAgICBkZWYgdGVzdF9oZWFkZXJfb2Zmc2V0KHNlbGYpOgogICAgICAgICMgVGVzdCBpZiB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBUYXJJbmZvIG9iamVjdCBpbmNsdWRlcwogICAgICAgICMgdGhlIHByZWNlZGluZyBleHRlbmRlZCBoZWFkZXIuCiAgICAgICAgbG9uZ25hbWUgPSBzZWxmLnN1YmRpciArICIvIiArICIxMjMvIiAqIDEyNSArICJsb25nbmFtZSIKICAgICAgICBvZmZzZXQgPSBzZWxmLnRhci5nZXRtZW1iZXIobG9uZ25hbWUpLm9mZnNldAogICAgICAgIGZvYmogPSBvcGVuKHRhcm5hbWUpCiAgICAgICAgZm9iai5zZWVrKG9mZnNldCkKICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvLmZyb21idWYoZm9iai5yZWFkKDUxMikpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnR5cGUsIHNlbGYubG9uZ25hbWV0eXBlKQoKCmNsYXNzIEdOVVJlYWRUZXN0KExvbmduYW1lVGVzdCk6CgogICAgc3ViZGlyID0gImdudSIKICAgIGxvbmduYW1ldHlwZSA9IHRhcmZpbGUuR05VVFlQRV9MT05HTkFNRQoKICAgIGRlZiB0ZXN0X3NwYXJzZV9maWxlKHNlbGYpOgogICAgICAgIHRhcmluZm8xID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9zcGFyc2UiKQogICAgICAgIGZvYmoxID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbzEpCiAgICAgICAgdGFyaW5mbzIgPSBzZWxmLnRhci5nZXRtZW1iZXIoImdudS9zcGFyc2UiKQogICAgICAgIGZvYmoyID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbzIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvYmoxLnJlYWQoKSA9PSBmb2JqMi5yZWFkKCksCiAgICAgICAgICAgICAgICAic3BhcnNlIGZpbGUgZXh0cmFjdGlvbiBmYWlsZWQiKQoKCmNsYXNzIFBheFJlYWRUZXN0KExvbmduYW1lVGVzdCk6CgogICAgc3ViZGlyID0gInBheCIKICAgIGxvbmduYW1ldHlwZSA9IHRhcmZpbGUuWEhEVFlQRQoKICAgIGRlZiB0ZXN0X3BheF9nbG9iYWxfaGVhZGVycyhzZWxmKToKICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGFybmFtZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCgogICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0bWVtYmVyKCJwYXgvcmVndHlwZTEiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51bmFtZSwgImZvbyIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLmduYW1lLCAiYmFyIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ucGF4X2hlYWRlcnMuZ2V0KCJWRU5ET1IudW1sYXV0cyIpLCB1IsTW3OT2/N8iKQoKICAgICAgICB0YXJpbmZvID0gdGFyLmdldG1lbWJlcigicGF4L3JlZ3R5cGUyIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udW5hbWUsICIiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5nbmFtZSwgImJhciIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnBheF9oZWFkZXJzLmdldCgiVkVORE9SLnVtbGF1dHMiKSwgdSLE1tzk9vzfIikKCiAgICAgICAgdGFyaW5mbyA9IHRhci5nZXRtZW1iZXIoInBheC9yZWd0eXBlMyIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnVuYW1lLCAidGFyZmlsZSIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLmduYW1lLCAidGFyZmlsZSIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnBheF9oZWFkZXJzLmdldCgiVkVORE9SLnVtbGF1dHMiKSwgdSLE1tzk9vzfIikKCiAgICBkZWYgdGVzdF9wYXhfbnVtYmVyX2ZpZWxkcyhzZWxmKToKICAgICAgICAjIEFsbCBmb2xsb3dpbmcgbnVtYmVyIGZpZWxkcyBhcmUgcmVhZCBmcm9tIHRoZSBwYXggaGVhZGVyLgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0YXJuYW1lLCBlbmNvZGluZz0iaXNvODg1OS0xIikKICAgICAgICB0YXJpbmZvID0gdGFyLmdldG1lbWJlcigicGF4L3JlZ3R5cGU0IikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uc2l6ZSwgNzAxMSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udWlkLCAxMjMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLmdpZCwgMTIzKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5tdGltZSwgMTA0MTgwODc4My4wKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh0YXJpbmZvLm10aW1lKSwgZmxvYXQpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCh0YXJpbmZvLnBheF9oZWFkZXJzWyJhdGltZSJdKSwgMTA0MTgwODc4My4wKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQodGFyaW5mby5wYXhfaGVhZGVyc1siY3RpbWUiXSksIDEwNDE4MDg3ODMuMCkKCgpjbGFzcyBXcml0ZVRlc3RCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICMgUHV0IGFsbCB3cml0ZSB0ZXN0cyBpbiBoZXJlIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIHRlc3RlZAogICAgIyBpbiBhbGwgcG9zc2libGUgbW9kZSBjb21iaW5hdGlvbnMuCgogICAgZGVmIHRlc3RfZmlsZW9ial9ub19jbG9zZShzZWxmKToKICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oKQogICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihmaWxlb2JqPWZvYmosIG1vZGU9c2VsZi5tb2RlKQogICAgICAgIHRhci5hZGRmaWxlKHRhcmZpbGUuVGFySW5mbygiZm9vIikpCiAgICAgICAgdGFyLmNsb3NlKCkKICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9iai5jbG9zZWQgaXMgRmFsc2UsICJleHRlcm5hbCBmaWxlb2JqcyBtdXN0IG5ldmVyIGNsb3NlZCIpCgoKY2xhc3MgV3JpdGVUZXN0KFdyaXRlVGVzdEJhc2UpOgoKICAgIG1vZGUgPSAidzoiCgogICAgZGVmIHRlc3RfMTAwX2NoYXJfbmFtZShzZWxmKToKICAgICAgICAjIFRoZSBuYW1lIGZpZWxkIGluIGEgdGFyIGhlYWRlciBzdG9yZXMgc3RyaW5ncyBvZiBhdCBtb3N0IDEwMCBjaGFycy4KICAgICAgICAjIElmIGEgc3RyaW5nIGlzIHNob3J0ZXIgdGhhbiAxMDAgY2hhcnMgaXQgaGFzIHRvIGJlIHBhZGRlZCB3aXRoICdcMCcsCiAgICAgICAgIyB3aGljaCBpbXBsaWVzIHRoYXQgYSBzdHJpbmcgb2YgZXhhY3RseSAxMDAgY2hhcnMgaXMgc3RvcmVkIHdpdGhvdXQKICAgICAgICAjIGEgdHJhaWxpbmcgJ1wwJy4KICAgICAgICBuYW1lID0gIjAxMjM0NTY3ODkiICogMTAKICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQogICAgICAgIHQgPSB0YXJmaWxlLlRhckluZm8obmFtZSkKICAgICAgICB0YXIuYWRkZmlsZSh0KQogICAgICAgIHRhci5jbG9zZSgpCgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIuZ2V0bmFtZXMoKVswXSA9PSBuYW1lLAogICAgICAgICAgICAgICAgImZhaWxlZCB0byBzdG9yZSAxMDAgY2hhciBmaWxlbmFtZSIpCiAgICAgICAgdGFyLmNsb3NlKCkKCiAgICBkZWYgdGVzdF90YXJfc2l6ZShzZWxmKToKICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAjMTAxMzg4Mi4KICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImZpbGUiKQogICAgICAgIGZvYmogPSBvcGVuKHBhdGgsICJ3YiIpCiAgICAgICAgZm9iai53cml0ZSgiYWFhIikKICAgICAgICBmb2JqLmNsb3NlKCkKICAgICAgICB0YXIuYWRkKHBhdGgpCiAgICAgICAgdGFyLmNsb3NlKCkKICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5nZXRzaXplKHRtcG5hbWUpID4gMCwKICAgICAgICAgICAgICAgICJ0YXJmaWxlIGlzIGVtcHR5IikKCiAgICAjIFRoZSB0ZXN0Xypfc2l6ZSB0ZXN0cyB0ZXN0IGZvciBidWcgIzExNjcxMjguCiAgICBkZWYgdGVzdF9maWxlX3NpemUoc2VsZik6CiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKCiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihURU1QRElSLCAiZmlsZSIpCiAgICAgICAgZm9iaiA9IG9wZW4ocGF0aCwgIndiIikKICAgICAgICBmb2JqLmNsb3NlKCkKICAgICAgICB0YXJpbmZvID0gdGFyLmdldHRhcmluZm8ocGF0aCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uc2l6ZSwgMCkKCiAgICAgICAgZm9iaiA9IG9wZW4ocGF0aCwgIndiIikKICAgICAgICBmb2JqLndyaXRlKCJhYWEiKQogICAgICAgIGZvYmouY2xvc2UoKQogICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0dGFyaW5mbyhwYXRoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5zaXplLCAzKQoKICAgICAgICB0YXIuY2xvc2UoKQoKICAgIGRlZiB0ZXN0X2RpcmVjdG9yeV9zaXplKHNlbGYpOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImRpcmVjdG9yeSIpCiAgICAgICAgb3MubWtkaXIocGF0aCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCiAgICAgICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0dGFyaW5mbyhwYXRoKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uc2l6ZSwgMCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBvcy5ybWRpcihwYXRoKQoKICAgIGRlZiB0ZXN0X2xpbmtfc2l6ZShzZWxmKToKICAgICAgICBpZiBoYXNhdHRyKG9zLCAibGluayIpOgogICAgICAgICAgICBsaW5rID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJsaW5rIikKICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJsaW5rX3RhcmdldCIpCiAgICAgICAgICAgIGZvYmogPSBvcGVuKHRhcmdldCwgIndiIikKICAgICAgICAgICAgZm9iai53cml0ZSgiYWFhIikKICAgICAgICAgICAgZm9iai5jbG9zZSgpCiAgICAgICAgICAgIG9zLmxpbmsodGFyZ2V0LCBsaW5rKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQogICAgICAgICAgICAgICAgIyBSZWNvcmQgdGhlIGxpbmsgdGFyZ2V0IGluIHRoZSBpbm9kZXMgbGlzdC4KICAgICAgICAgICAgICAgIHRhci5nZXR0YXJpbmZvKHRhcmdldCkKICAgICAgICAgICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0dGFyaW5mbyhsaW5rKQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnNpemUsIDApCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBvcy5yZW1vdmUodGFyZ2V0KQogICAgICAgICAgICAgICAgb3MucmVtb3ZlKGxpbmspCgogICAgZGVmIHRlc3Rfc3ltbGlua19zaXplKHNlbGYpOgogICAgICAgIGlmIGhhc2F0dHIob3MsICJzeW1saW5rIik6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInN5bWxpbmsiKQogICAgICAgICAgICBvcy5zeW1saW5rKCJsaW5rX3RhcmdldCIsIHBhdGgpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCiAgICAgICAgICAgICAgICB0YXJpbmZvID0gdGFyLmdldHRhcmluZm8ocGF0aCkKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5zaXplLCAwKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgb3MucmVtb3ZlKHBhdGgpCgogICAgZGVmIHRlc3RfYWRkX3NlbGYoc2VsZik6CiAgICAgICAgIyBUZXN0IGZvciAjMTI1NzI1NS4KICAgICAgICBkc3RuYW1lID0gb3MucGF0aC5hYnNwYXRoKHRtcG5hbWUpCgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5uYW1lID09IGRzdG5hbWUsICJhcmNoaXZlIG5hbWUgbXVzdCBiZSBhYnNvbHV0ZSIpCgogICAgICAgIHRhci5hZGQoZHN0bmFtZSkKICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyLmdldG5hbWVzKCkgPT0gW10sICJhZGRlZCB0aGUgYXJjaGl2ZSB0byBpdHNlbGYiKQoKICAgICAgICBjd2QgPSBvcy5nZXRjd2QoKQogICAgICAgIG9zLmNoZGlyKFRFTVBESVIpCiAgICAgICAgdGFyLmFkZChkc3RuYW1lKQogICAgICAgIG9zLmNoZGlyKGN3ZCkKICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyLmdldG5hbWVzKCkgPT0gW10sICJhZGRlZCB0aGUgYXJjaGl2ZSB0byBpdHNlbGYiKQoKICAgIGRlZiB0ZXN0X2V4Y2x1ZGUoc2VsZik6CiAgICAgICAgdGVtcGRpciA9IG9zLnBhdGguam9pbihURU1QRElSLCAiZXhjbHVkZSIpCiAgICAgICAgb3MubWtkaXIodGVtcGRpcikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvciBuYW1lIGluICgiZm9vIiwgImJhciIsICJiYXoiKToKICAgICAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgbmFtZSkKICAgICAgICAgICAgICAgIG9wZW4obmFtZSwgIndiIikuY2xvc2UoKQoKICAgICAgICAgICAgZXhjbHVkZSA9IG9zLnBhdGguaXNmaWxlCgogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlLCBlbmNvZGluZz0iaXNvODg1OS0xIikKICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCJ1c2UgdGhlIGZpbHRlciBhcmd1bWVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToKICAgICAgICAgICAgICAgIHRhci5hZGQodGVtcGRpciwgYXJjbmFtZT0iZW1wdHlfZGlyIiwgZXhjbHVkZT1leGNsdWRlKQogICAgICAgICAgICB0YXIuY2xvc2UoKQoKICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJyIikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGFyLmdldG1lbWJlcnMoKSksIDEpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLmdldG5hbWVzKClbMF0sICJlbXB0eV9kaXIiKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcGRpcikKCiAgICBkZWYgdGVzdF9maWx0ZXIoc2VsZik6CiAgICAgICAgdGVtcGRpciA9IG9zLnBhdGguam9pbihURU1QRElSLCAiZmlsdGVyIikKICAgICAgICBvcy5ta2Rpcih0ZW1wZGlyKQogICAgICAgIHRyeToKICAgICAgICAgICAgZm9yIG5hbWUgaW4gKCJmb28iLCAiYmFyIiwgImJheiIpOgogICAgICAgICAgICAgICAgbmFtZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCBuYW1lKQogICAgICAgICAgICAgICAgb3BlbihuYW1lLCAid2IiKS5jbG9zZSgpCgogICAgICAgICAgICBkZWYgZmlsdGVyKHRhcmluZm8pOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5iYXNlbmFtZSh0YXJpbmZvLm5hbWUpID09ICJiYXIiOgogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgdGFyaW5mby51aWQgPSAxMjMKICAgICAgICAgICAgICAgIHRhcmluZm8udW5hbWUgPSAiZm9vIgogICAgICAgICAgICAgICAgcmV0dXJuIHRhcmluZm8KCiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUsIGVuY29kaW5nPSJpc284ODU5LTEiKQogICAgICAgICAgICB0YXIuYWRkKHRlbXBkaXIsIGFyY25hbWU9ImVtcHR5X2RpciIsIGZpbHRlcj1maWx0ZXIpCiAgICAgICAgICAgIHRhci5jbG9zZSgpCgogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInIiKQogICAgICAgICAgICBmb3IgdGFyaW5mbyBpbiB0YXI6CiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udWlkLCAxMjMpCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udW5hbWUsICJmb28iKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0YXIuZ2V0bWVtYmVycygpKSwgMykKICAgICAgICAgICAgdGFyLmNsb3NlKCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBkaXIpCgogICAgIyBHdWFyYW50ZWUgdGhhdCBzdG9yZWQgcGF0aG5hbWVzIGFyZSBub3QgbW9kaWZpZWQuIERvbid0CiAgICAjIHJlbW92ZSAuLyBvciAuLi8gb3IgZG91YmxlIHNsYXNoZXMuIFN0aWxsIG1ha2UgYWJzb2x1dGUKICAgICMgcGF0aG5hbWVzIHJlbGF0aXZlLgogICAgIyBGb3IgZGV0YWlscyBzZWUgYnVnICM2MDU0LgogICAgZGVmIF90ZXN0X3BhdGhuYW1lKHNlbGYsIHBhdGgsIGNtcF9wYXRoPU5vbmUsIGRpcj1GYWxzZSk6CiAgICAgICAgIyBDcmVhdGUgYSB0YXJmaWxlIHdpdGggYW4gZW1wdHkgbWVtYmVyIG5hbWVkIHBhdGgKICAgICAgICAjIGFuZCBjb21wYXJlIHRoZSBzdG9yZWQgbmFtZSB3aXRoIHRoZSBvcmlnaW5hbC4KICAgICAgICBmb28gPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImZvbyIpCiAgICAgICAgaWYgbm90IGRpcjoKICAgICAgICAgICAgb3Blbihmb28sICJ3IikuY2xvc2UoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG9zLm1rZGlyKGZvbykKCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKICAgICAgICB0YXIuYWRkKGZvbywgYXJjbmFtZT1wYXRoKQogICAgICAgIHRhci5jbG9zZSgpCgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAiciIpCiAgICAgICAgdCA9IHRhci5uZXh0KCkKICAgICAgICB0YXIuY2xvc2UoKQoKICAgICAgICBpZiBub3QgZGlyOgogICAgICAgICAgICBvcy5yZW1vdmUoZm9vKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG9zLnJtZGlyKGZvbykKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lm5hbWUsIGNtcF9wYXRoIG9yIHBhdGgucmVwbGFjZShvcy5zZXAsICIvIikpCgogICAgZGVmIHRlc3RfcGF0aG5hbWVzKHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUoImZvbyIpCiAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oImZvbyIsICIuIiwgImJhciIpKQogICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUob3MucGF0aC5qb2luKCJmb28iLCAiLi4iLCAiYmFyIikpCiAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oIi4iLCAiZm9vIikpCiAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oIi4iLCAiZm9vIiwgIi4iKSkKICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiLiIsICJmb28iLCAiLiIsICJiYXIiKSkKICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiLiIsICJmb28iLCAiLi4iLCAiYmFyIikpCiAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oIi4iLCAiZm9vIiwgIi4uIiwgImJhciIpKQogICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUob3MucGF0aC5qb2luKCIuLiIsICJmb28iKSkKICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiLi4iLCAiZm9vIiwgIi4uIikpCiAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oIi4uIiwgImZvbyIsICIuIiwgImJhciIpKQogICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUob3MucGF0aC5qb2luKCIuLiIsICJmb28iLCAiLi4iLCAiYmFyIikpCgogICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUoImZvbyIgKyBvcy5zZXAgKyBvcy5zZXAgKyAiYmFyIikKICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKCJmb28iICsgb3Muc2VwICsgb3Muc2VwLCAiZm9vIiwgZGlyPVRydWUpCgogICAgZGVmIHRlc3RfYWJzX3BhdGhuYW1lcyhzZWxmKToKICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKICAgICAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZSgiQzpcXGZvbyIsICJmb28iKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUoIi9mb28iLCAiZm9vIikKICAgICAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZSgiLy8vZm9vIiwgImZvbyIpCgogICAgZGVmIHRlc3RfY3dkKHNlbGYpOgogICAgICAgICMgVGVzdCBhZGRpbmcgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCiAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKICAgICAgICBvcy5jaGRpcihURU1QRElSKQogICAgICAgIHRyeToKICAgICAgICAgICAgb3BlbigiZm9vIiwgInciKS5jbG9zZSgpCgogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQogICAgICAgICAgICB0YXIuYWRkKCIuIikKICAgICAgICAgICAgdGFyLmNsb3NlKCkKCiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAiciIpCiAgICAgICAgICAgIGZvciB0IGluIHRhcjoKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0Lm5hbWUgPT0gIi4iIG9yIHQubmFtZS5zdGFydHN3aXRoKCIuLyIpKQogICAgICAgICAgICB0YXIuY2xvc2UoKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIG9zLmNoZGlyKGN3ZCkKCiAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnc3ltbGluaycpLCAibmVlZHMgb3Muc3ltbGluayIpCiAgICBkZWYgdGVzdF9leHRyYWN0YWxsX3N5bWxpbmtzKHNlbGYpOgogICAgICAgICMgVGVzdCBpZiBleHRyYWN0YWxsIHdvcmtzIHByb3Blcmx5IHdoZW4gdGFyZmlsZSBjb250YWlucyBzeW1saW5rcwogICAgICAgIHRlbXBkaXIgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInRlc3RzeW1saW5rcyIpCiAgICAgICAgdGVtcGFyY2hpdmUgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInRlc3RzeW1saW5rcy50YXIiKQogICAgICAgIG9zLm1rZGlyKHRlbXBkaXIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzb3VyY2VfZmlsZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCdzb3VyY2UnKQogICAgICAgICAgICB0YXJnZXRfZmlsZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCdzeW1saW5rJykKICAgICAgICAgICAgd2l0aCBvcGVuKHNvdXJjZV9maWxlLCd3JykgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoJ3NvbWV0aGluZ1xuJykKICAgICAgICAgICAgb3Muc3ltbGluayhzb3VyY2VfZmlsZSwgdGFyZ2V0X2ZpbGUpCiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0ZW1wYXJjaGl2ZSwndycpCiAgICAgICAgICAgIHRhci5hZGQoc291cmNlX2ZpbGUsIGFyY25hbWU9b3MucGF0aC5iYXNlbmFtZShzb3VyY2VfZmlsZSkpCiAgICAgICAgICAgIHRhci5hZGQodGFyZ2V0X2ZpbGUsIGFyY25hbWU9b3MucGF0aC5iYXNlbmFtZSh0YXJnZXRfZmlsZSkpCiAgICAgICAgICAgIHRhci5jbG9zZSgpCiAgICAgICAgICAgICMgTGV0J3MgZXh0cmFjdCBpdCB0byB0aGUgbG9jYXRpb24gd2hpY2ggY29udGFpbnMgdGhlIHN5bWxpbmsKICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRlbXBhcmNoaXZlLCdyJykKICAgICAgICAgICAgIyB0aGlzIHNob3VsZCBub3QgcmFpc2UgT1NFcnJvcjogW0Vycm5vIDE3XSBGaWxlIGV4aXN0cwogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0YXIuZXh0cmFjdGFsbChwYXRoPXRlbXBkaXIpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHRyYWN0YWxsIGZhaWxlZCB3aXRoIHN5bWxpbmtlZCBmaWxlcyIpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICB0YXIuY2xvc2UoKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIG9zLnVubGluayh0ZW1wYXJjaGl2ZSkKICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyKQoKICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdzeW1saW5rJyksICJuZWVkcyBvcy5zeW1saW5rIikKICAgIGRlZiB0ZXN0X2V4dHJhY3RhbGxfYnJva2VuX3N5bWxpbmtzKHNlbGYpOgogICAgICAgICMgVGVzdCBpZiBleHRyYWN0YWxsIHdvcmtzIHByb3Blcmx5IHdoZW4gdGFyZmlsZSBjb250YWlucyBicm9rZW4KICAgICAgICAjIHN5bWxpbmtzCiAgICAgICAgdGVtcGRpciA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHN5bWxpbmtzIikKICAgICAgICB0ZW1wYXJjaGl2ZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHN5bWxpbmtzLnRhciIpCiAgICAgICAgb3MubWtkaXIodGVtcGRpcikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNvdXJjZV9maWxlID0gb3MucGF0aC5qb2luKHRlbXBkaXIsJ3NvdXJjZScpCiAgICAgICAgICAgIHRhcmdldF9maWxlID0gb3MucGF0aC5qb2luKHRlbXBkaXIsJ3N5bWxpbmsnKQogICAgICAgICAgICB3aXRoIG9wZW4oc291cmNlX2ZpbGUsJ3cnKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZSgnc29tZXRoaW5nXG4nKQogICAgICAgICAgICBvcy5zeW1saW5rKHNvdXJjZV9maWxlLCB0YXJnZXRfZmlsZSkKICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRlbXBhcmNoaXZlLCd3JykKICAgICAgICAgICAgdGFyLmFkZCh0YXJnZXRfZmlsZSwgYXJjbmFtZT1vcy5wYXRoLmJhc2VuYW1lKHRhcmdldF9maWxlKSkKICAgICAgICAgICAgdGFyLmNsb3NlKCkKICAgICAgICAgICAgIyByZW1vdmUgdGhlIHJlYWwgZmlsZQogICAgICAgICAgICBvcy51bmxpbmsoc291cmNlX2ZpbGUpCiAgICAgICAgICAgICMgTGV0J3MgZXh0cmFjdCBpdCB0byB0aGUgbG9jYXRpb24gd2hpY2ggY29udGFpbnMgdGhlIHN5bWxpbmsKICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRlbXBhcmNoaXZlLCdyJykKICAgICAgICAgICAgIyB0aGlzIHNob3VsZCBub3QgcmFpc2UgT1NFcnJvcjogW0Vycm5vIDE3XSBGaWxlIGV4aXN0cwogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0YXIuZXh0cmFjdGFsbChwYXRoPXRlbXBkaXIpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHRyYWN0YWxsIGZhaWxlZCB3aXRoIGJyb2tlbiBzeW1saW5rZWQgZmlsZXMiKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGFyLmNsb3NlKCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBvcy51bmxpbmsodGVtcGFyY2hpdmUpCiAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcGRpcikKCiAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnbGluaycpLCAibmVlZHMgb3MubGluayIpCiAgICBkZWYgdGVzdF9leHRyYWN0YWxsX2hhcmRsaW5rcyhzZWxmKToKICAgICAgICAjIFRlc3QgaWYgZXh0cmFjdGFsbCB3b3JrcyBwcm9wZXJseSB3aGVuIHRhcmZpbGUgY29udGFpbnMgc3ltbGlua3MKICAgICAgICB0ZW1wZGlyID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0ZXN0c3ltbGlua3MiKQogICAgICAgIHRlbXBhcmNoaXZlID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0ZXN0c3ltbGlua3MudGFyIikKICAgICAgICBvcy5ta2Rpcih0ZW1wZGlyKQogICAgICAgIHRyeToKICAgICAgICAgICAgc291cmNlX2ZpbGUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwnc291cmNlJykKICAgICAgICAgICAgdGFyZ2V0X2ZpbGUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwnc3ltbGluaycpCiAgICAgICAgICAgIHdpdGggb3Blbihzb3VyY2VfZmlsZSwndycpIGFzIGY6CiAgICAgICAgICAgICAgICBmLndyaXRlKCdzb21ldGhpbmdcbicpCiAgICAgICAgICAgIG9zLmxpbmsoc291cmNlX2ZpbGUsIHRhcmdldF9maWxlKQogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGVtcGFyY2hpdmUsJ3cnKQogICAgICAgICAgICB0YXIuYWRkKHNvdXJjZV9maWxlLCBhcmNuYW1lPW9zLnBhdGguYmFzZW5hbWUoc291cmNlX2ZpbGUpKQogICAgICAgICAgICB0YXIuYWRkKHRhcmdldF9maWxlLCBhcmNuYW1lPW9zLnBhdGguYmFzZW5hbWUodGFyZ2V0X2ZpbGUpKQogICAgICAgICAgICB0YXIuY2xvc2UoKQogICAgICAgICAgICAjIExldCdzIGV4dHJhY3QgaXQgdG8gdGhlIGxvY2F0aW9uIHdoaWNoIGNvbnRhaW5zIHRoZSBzeW1saW5rCiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0ZW1wYXJjaGl2ZSwncicpCiAgICAgICAgICAgICMgdGhpcyBzaG91bGQgbm90IHJhaXNlIE9TRXJyb3I6IFtFcnJubyAxN10gRmlsZSBleGlzdHMKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdGFyLmV4dHJhY3RhbGwocGF0aD10ZW1wZGlyKQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXh0cmFjdGFsbCBmYWlsZWQgd2l0aCBsaW5rZWQgZmlsZXMiKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGFyLmNsb3NlKCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBvcy51bmxpbmsodGVtcGFyY2hpdmUpCiAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcGRpcikKCmNsYXNzIFN0cmVhbVdyaXRlVGVzdChXcml0ZVRlc3RCYXNlKToKCiAgICBtb2RlID0gInd8IgoKICAgIGRlZiB0ZXN0X3N0cmVhbV9wYWRkaW5nKHNlbGYpOgogICAgICAgICMgVGVzdCBmb3IgYnVnICMxNTQzMzAzLgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCiAgICAgICAgdGFyLmNsb3NlKCkKCiAgICAgICAgaWYgc2VsZi5tb2RlLmVuZHN3aXRoKCJneiIpOgogICAgICAgICAgICBmb2JqID0gZ3ppcC5HemlwRmlsZSh0bXBuYW1lKQogICAgICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkKICAgICAgICAgICAgZm9iai5jbG9zZSgpCiAgICAgICAgZWxpZiBzZWxmLm1vZGUuZW5kc3dpdGgoImJ6MiIpOgogICAgICAgICAgICBkZWMgPSBiejIuQloyRGVjb21wcmVzc29yKCkKICAgICAgICAgICAgZGF0YSA9IG9wZW4odG1wbmFtZSwgInJiIikucmVhZCgpCiAgICAgICAgICAgIGRhdGEgPSBkZWMuZGVjb21wcmVzcyhkYXRhKQogICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGRlYy51bnVzZWRfZGF0YSkgPT0gMCwKICAgICAgICAgICAgICAgICAgICAiZm91bmQgdHJhaWxpbmcgZGF0YSIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9iaiA9IG9wZW4odG1wbmFtZSwgInJiIikKICAgICAgICAgICAgZGF0YSA9IGZvYmoucmVhZCgpCiAgICAgICAgICAgIGZvYmouY2xvc2UoKQoKICAgICAgICBzZWxmLmFzc2VydFRydWUoZGF0YS5jb3VudCgiXDAiKSA9PSB0YXJmaWxlLlJFQ09SRFNJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb3JyZWN0IHplcm8gcGFkZGluZyIpCgogICAgZGVmIHRlc3RfZmlsZV9tb2RlKHNlbGYpOgogICAgICAgICMgVGVzdCBmb3IgaXNzdWUgIzg0NjQ6IENyZWF0ZSBmaWxlcyB3aXRoIGNvcnJlY3QKICAgICAgICAjIHBlcm1pc3Npb25zLgogICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiIG9yIG5vdCBoYXNhdHRyKG9zLCAidW1hc2siKToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRtcG5hbWUpOgogICAgICAgICAgICBvcy5yZW1vdmUodG1wbmFtZSkKCiAgICAgICAgb3JpZ2luYWxfdW1hc2sgPSBvcy51bWFzaygwMDIyKQogICAgICAgIHRyeToKICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKICAgICAgICAgICAgdGFyLmNsb3NlKCkKICAgICAgICAgICAgbW9kZSA9IG9zLnN0YXQodG1wbmFtZSkuc3RfbW9kZSAmIDA3NzcKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2RlLCAwNjQ0LCAid3JvbmcgZmlsZSBwZXJtaXNzaW9ucyIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgb3MudW1hc2sob3JpZ2luYWxfdW1hc2spCgogICAgZGVmIHRlc3RfaXNzdWUxMzYzOShzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggdGFyZmlsZS5vcGVuKHVuaWNvZGUodG1wbmFtZSwgc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKSwgc2VsZi5tb2RlKToKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoIl9TdHJlYW0gZmFpbGVkIHRvIHdyaXRlIHVuaWNvZGUgZmlsZW5hbWUiKQoKCmNsYXNzIEdOVVdyaXRlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAjIFRoaXMgdGVzdGNhc2UgY2hlY2tzIGZvciBjb3JyZWN0IGNyZWF0aW9uIG9mIEdOVSBMb25nbmFtZQogICAgIyBhbmQgTG9uZ2xpbmsgZXh0ZW5kZWQgaGVhZGVycyAoY3AuIGJ1ZyAjODEyMzI1KS4KCiAgICBkZWYgX2xlbmd0aChzZWxmLCBzKToKICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChsZW4ocykgKyAxLCA1MTIpCiAgICAgICAgaWYgcmVtYWluZGVyOgogICAgICAgICAgICBibG9ja3MgKz0gMQogICAgICAgIHJldHVybiBibG9ja3MgKiA1MTIKCiAgICBkZWYgX2NhbGNfc2l6ZShzZWxmLCBuYW1lLCBsaW5rPU5vbmUpOgogICAgICAgICMgSW5pdGlhbCB0YXIgaGVhZGVyCiAgICAgICAgY291bnQgPSA1MTIKCiAgICAgICAgaWYgbGVuKG5hbWUpID4gdGFyZmlsZS5MRU5HVEhfTkFNRToKICAgICAgICAgICAgIyBHTlUgbG9uZ25hbWUgZXh0ZW5kZWQgaGVhZGVyICsgbG9uZ25hbWUKICAgICAgICAgICAgY291bnQgKz0gNTEyCiAgICAgICAgICAgIGNvdW50ICs9IHNlbGYuX2xlbmd0aChuYW1lKQogICAgICAgIGlmIGxpbmsgaXMgbm90IE5vbmUgYW5kIGxlbihsaW5rKSA+IHRhcmZpbGUuTEVOR1RIX0xJTks6CiAgICAgICAgICAgICMgR05VIGxvbmdsaW5rIGV4dGVuZGVkIGhlYWRlciArIGxvbmdsaW5rCiAgICAgICAgICAgIGNvdW50ICs9IDUxMgogICAgICAgICAgICBjb3VudCArPSBzZWxmLl9sZW5ndGgobGluaykKICAgICAgICByZXR1cm4gY291bnQKCiAgICBkZWYgX3Rlc3Qoc2VsZiwgbmFtZSwgbGluaz1Ob25lKToKICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKG5hbWUpCiAgICAgICAgaWYgbGluazoKICAgICAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9IGxpbmsKICAgICAgICAgICAgdGFyaW5mby50eXBlID0gdGFyZmlsZS5MTktUWVBFCgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIpCiAgICAgICAgdGFyLmZvcm1hdCA9IHRhcmZpbGUuR05VX0ZPUk1BVAogICAgICAgIHRhci5hZGRmaWxlKHRhcmluZm8pCgogICAgICAgIHYxID0gc2VsZi5fY2FsY19zaXplKG5hbWUsIGxpbmspCiAgICAgICAgdjIgPSB0YXIub2Zmc2V0CiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYxID09IHYyLCAiR05VIGxvbmduYW1lL2xvbmdsaW5rIGNyZWF0aW9uIGZhaWxlZCIpCgogICAgICAgIHRhci5jbG9zZSgpCgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKQogICAgICAgIG1lbWJlciA9IHRhci5uZXh0KCkKICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShtZW1iZXIsCiAgICAgICAgICAgICAgICAidW5hYmxlIHRvIHJlYWQgbG9uZ25hbWUgbWVtYmVyIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ubmFtZSwgbWVtYmVyLm5hbWUsCiAgICAgICAgICAgICAgICAidW5hYmxlIHRvIHJlYWQgbG9uZ25hbWUgbWVtYmVyIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ubGlua25hbWUsIG1lbWJlci5saW5rbmFtZSwKICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gcmVhZCBsb25nbmFtZSBtZW1iZXIiKQoKICAgIGRlZiB0ZXN0X2xvbmduYW1lXzEwMjMoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdCgoImxvbmduYW0vIiAqIDEyNykgKyAibG9uZ25hbSIpCgogICAgZGVmIHRlc3RfbG9uZ25hbWVfMTAyNChzZWxmKToKICAgICAgICBzZWxmLl90ZXN0KCgibG9uZ25hbS8iICogMTI3KSArICJsb25nbmFtZSIpCgogICAgZGVmIHRlc3RfbG9uZ25hbWVfMTAyNShzZWxmKToKICAgICAgICBzZWxmLl90ZXN0KCgibG9uZ25hbS8iICogMTI3KSArICJsb25nbmFtZV8iKQoKICAgIGRlZiB0ZXN0X2xvbmdsaW5rXzEwMjMoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdCgibmFtZSIsICgibG9uZ2xuay8iICogMTI3KSArICJsb25nbG5rIikKCiAgICBkZWYgdGVzdF9sb25nbGlua18xMDI0KHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3QoIm5hbWUiLCAoImxvbmdsbmsvIiAqIDEyNykgKyAibG9uZ2xpbmsiKQoKICAgIGRlZiB0ZXN0X2xvbmdsaW5rXzEwMjUoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdCgibmFtZSIsICgibG9uZ2xuay8iICogMTI3KSArICJsb25nbGlua18iKQoKICAgIGRlZiB0ZXN0X2xvbmduYW1lbGlua18xMDIzKHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3QoKCJsb25nbmFtLyIgKiAxMjcpICsgImxvbmduYW0iLAogICAgICAgICAgICAgICAgICAgKCJsb25nbG5rLyIgKiAxMjcpICsgImxvbmdsbmsiKQoKICAgIGRlZiB0ZXN0X2xvbmduYW1lbGlua18xMDI0KHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3QoKCJsb25nbmFtLyIgKiAxMjcpICsgImxvbmduYW1lIiwKICAgICAgICAgICAgICAgICAgICgibG9uZ2xuay8iICogMTI3KSArICJsb25nbGluayIpCgogICAgZGVmIHRlc3RfbG9uZ25hbWVsaW5rXzEwMjUoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdCgoImxvbmduYW0vIiAqIDEyNykgKyAibG9uZ25hbWVfIiwKICAgICAgICAgICAgICAgICAgICgibG9uZ2xuay8iICogMTI3KSArICJsb25nbGlua18iKQoKCmNsYXNzIEhhcmRsaW5rVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAjIFRlc3QgdGhlIGNyZWF0aW9uIG9mIExOS1RZUEUgKGhhcmRsaW5rKSBtZW1iZXJzIGluIGFuIGFyY2hpdmUuCgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuZm9vID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJmb28iKQogICAgICAgIHNlbGYuYmFyID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJiYXIiKQoKICAgICAgICBmb2JqID0gb3BlbihzZWxmLmZvbywgIndiIikKICAgICAgICBmb2JqLndyaXRlKCJmb28iKQogICAgICAgIGZvYmouY2xvc2UoKQoKICAgICAgICBvcy5saW5rKHNlbGYuZm9vLCBzZWxmLmJhcikKCiAgICAgICAgc2VsZi50YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciKQogICAgICAgIHNlbGYudGFyLmFkZChzZWxmLmZvbykKCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgc2VsZi50YXIuY2xvc2UoKQogICAgICAgIG9zLnJlbW92ZShzZWxmLmZvbykKICAgICAgICBvcy5yZW1vdmUoc2VsZi5iYXIpCgogICAgZGVmIHRlc3RfYWRkX3R3aWNlKHNlbGYpOgogICAgICAgICMgVGhlIHNhbWUgbmFtZSB3aWxsIGJlIGFkZGVkIGFzIGEgUkVHVFlQRSBldmVyeQogICAgICAgICMgdGltZSByZWdhcmRsZXNzIG9mIHN0X25saW5rLgogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXR0YXJpbmZvKHNlbGYuZm9vKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnR5cGUgPT0gdGFyZmlsZS5SRUdUWVBFLAogICAgICAgICAgICAgICAgImFkZCBmaWxlIGFzIHJlZ3VsYXIgZmFpbGVkIikKCiAgICBkZWYgdGVzdF9hZGRfaGFyZGxpbmsoc2VsZik6CiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldHRhcmluZm8oc2VsZi5iYXIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8udHlwZSA9PSB0YXJmaWxlLkxOS1RZUEUsCiAgICAgICAgICAgICAgICAiYWRkIGZpbGUgYXMgaGFyZGxpbmsgZmFpbGVkIikKCiAgICBkZWYgdGVzdF9kZXJlZmVyZW5jZV9oYXJkbGluayhzZWxmKToKICAgICAgICBzZWxmLnRhci5kZXJlZmVyZW5jZSA9IFRydWUKICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0dGFyaW5mbyhzZWxmLmJhcikKICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby50eXBlID09IHRhcmZpbGUuUkVHVFlQRSwKICAgICAgICAgICAgICAgICJkZXJlZmVyZW5jaW5nIGhhcmRsaW5rIGZhaWxlZCIpCgoKY2xhc3MgUGF4V3JpdGVUZXN0KEdOVVdyaXRlVGVzdCk6CgogICAgZGVmIF90ZXN0KHNlbGYsIG5hbWUsIGxpbms9Tm9uZSk6CiAgICAgICAgIyBTZWUgR05VV3JpdGVUZXN0LgogICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8obmFtZSkKICAgICAgICBpZiBsaW5rOgogICAgICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gbGluawogICAgICAgICAgICB0YXJpbmZvLnR5cGUgPSB0YXJmaWxlLkxOS1RZUEUKCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXRhcmZpbGUuUEFYX0ZPUk1BVCkKICAgICAgICB0YXIuYWRkZmlsZSh0YXJpbmZvKQogICAgICAgIHRhci5jbG9zZSgpCgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKQogICAgICAgIGlmIGxpbms6CiAgICAgICAgICAgIGwgPSB0YXIuZ2V0bWVtYmVycygpWzBdLmxpbmtuYW1lCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaW5rID09IGwsICJQQVggbG9uZ2xpbmsgY3JlYXRpb24gZmFpbGVkIikKICAgICAgICBlbHNlOgogICAgICAgICAgICBuID0gdGFyLmdldG1lbWJlcnMoKVswXS5uYW1lCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuYW1lID09IG4sICJQQVggbG9uZ25hbWUgY3JlYXRpb24gZmFpbGVkIikKCiAgICBkZWYgdGVzdF9wYXhfZ2xvYmFsX2hlYWRlcihzZWxmKToKICAgICAgICBwYXhfaGVhZGVycyA9IHsKICAgICAgICAgICAgICAgIHUiZm9vIjogdSJiYXIiLAogICAgICAgICAgICAgICAgdSJ1aWQiOiB1IjAiLAogICAgICAgICAgICAgICAgdSJtdGltZSI6IHUiMS4yMyIsCiAgICAgICAgICAgICAgICB1InRlc3QiOiB1IuT2/CIsCiAgICAgICAgICAgICAgICB1IuT2/CI6IHUidGVzdCJ9CgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIsIGZvcm1hdD10YXJmaWxlLlBBWF9GT1JNQVQsCiAgICAgICAgICAgICAgICBwYXhfaGVhZGVycz1wYXhfaGVhZGVycykKICAgICAgICB0YXIuYWRkZmlsZSh0YXJmaWxlLlRhckluZm8oInRlc3QiKSkKICAgICAgICB0YXIuY2xvc2UoKQoKICAgICAgICAjIFRlc3QgaWYgdGhlIGdsb2JhbCBoZWFkZXIgd2FzIHdyaXR0ZW4gY29ycmVjdGx5LgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBlbmNvZGluZz0iaXNvODg1OS0xIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5wYXhfaGVhZGVycywgcGF4X2hlYWRlcnMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZ2V0bWVtYmVycygpWzBdLnBheF9oZWFkZXJzLCBwYXhfaGVhZGVycykKCiAgICAgICAgIyBUZXN0IGlmIGFsbCB0aGUgZmllbGRzIGFyZSB1bmljb2RlLgogICAgICAgIGZvciBrZXksIHZhbCBpbiB0YXIucGF4X2hlYWRlcnMuaXRlcml0ZW1zKCk6CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGtleSkgaXMgdW5pY29kZSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodmFsKSBpcyB1bmljb2RlKQogICAgICAgICAgICBpZiBrZXkgaW4gdGFyZmlsZS5QQVhfTlVNQkVSX0ZJRUxEUzoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICB0YXJmaWxlLlBBWF9OVU1CRVJfRklFTERTW2tleV0odmFsKQogICAgICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgidW5hYmxlIHRvIGNvbnZlcnQgcGF4IGhlYWRlciBmaWVsZCIpCgogICAgZGVmIHRlc3RfcGF4X2V4dGVuZGVkX2hlYWRlcihzZWxmKToKICAgICAgICAjIFRoZSBmaWVsZHMgZnJvbSB0aGUgcGF4IGhlYWRlciBoYXZlIHByaW9yaXR5IG92ZXIgdGhlCiAgICAgICAgIyBUYXJJbmZvLgogICAgICAgIHBheF9oZWFkZXJzID0ge3UicGF0aCI6IHUiZm9vIiwgdSJ1aWQiOiB1IjEyMyJ9CgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIsIGZvcm1hdD10YXJmaWxlLlBBWF9GT1JNQVQsIGVuY29kaW5nPSJpc284ODU5LTEiKQogICAgICAgIHQgPSB0YXJmaWxlLlRhckluZm8oKQogICAgICAgIHQubmFtZSA9IHUi5Pb8IiAgICAgIyBub24tQVNDSUkKICAgICAgICB0LnVpZCA9IDgqKjggICAgICAgICMgdG9vIGxhcmdlCiAgICAgICAgdC5wYXhfaGVhZGVycyA9IHBheF9oZWFkZXJzCiAgICAgICAgdGFyLmFkZGZpbGUodCkKICAgICAgICB0YXIuY2xvc2UoKQoKICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCiAgICAgICAgdCA9IHRhci5nZXRtZW1iZXJzKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQucGF4X2hlYWRlcnMsIHBheF9oZWFkZXJzKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5uYW1lLCAiZm9vIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudWlkLCAxMjMpCgoKY2xhc3MgVXN0YXJVbmljb2RlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAjIEFsbCAqVW5pY29kZVRlc3RzIEZJWE1FCgogICAgZm9ybWF0ID0gdGFyZmlsZS5VU1RBUl9GT1JNQVQKCiAgICBkZWYgdGVzdF9pc284ODU5XzFfZmlsZW5hbWUoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF91bmljb2RlX2ZpbGVuYW1lKCJpc284ODU5LTEiKQoKICAgIGRlZiB0ZXN0X3V0ZjdfZmlsZW5hbWUoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF91bmljb2RlX2ZpbGVuYW1lKCJ1dGY3IikKCiAgICBkZWYgdGVzdF91dGY4X2ZpbGVuYW1lKHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3RfdW5pY29kZV9maWxlbmFtZSgidXRmOCIpCgogICAgZGVmIF90ZXN0X3VuaWNvZGVfZmlsZW5hbWUoc2VsZiwgZW5jb2RpbmcpOgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIsIGZvcm1hdD1zZWxmLmZvcm1hdCwgZW5jb2Rpbmc9ZW5jb2RpbmcsIGVycm9ycz0ic3RyaWN0IikKICAgICAgICBuYW1lID0gdSLk9vwiCiAgICAgICAgdGFyLmFkZGZpbGUodGFyZmlsZS5UYXJJbmZvKG5hbWUpKQogICAgICAgIHRhci5jbG9zZSgpCgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBlbmNvZGluZz1lbmNvZGluZykKICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0YXIuZ2V0bmFtZXMoKVswXSkgaXMgbm90IHVuaWNvZGUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZ2V0bWVtYmVycygpWzBdLm5hbWUsIG5hbWUuZW5jb2RlKGVuY29kaW5nKSkKICAgICAgICB0YXIuY2xvc2UoKQoKICAgIGRlZiB0ZXN0X3VuaWNvZGVfZmlsZW5hbWVfZXJyb3Ioc2VsZik6CiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXNlbGYuZm9ybWF0LCBlbmNvZGluZz0iYXNjaWkiLCBlcnJvcnM9InN0cmljdCIpCiAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygpCgogICAgICAgIHRhcmluZm8ubmFtZSA9ICLk9vwiCiAgICAgICAgaWYgc2VsZi5mb3JtYXQgPT0gdGFyZmlsZS5QQVhfRk9STUFUOgogICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHRhci5hZGRmaWxlLCB0YXJpbmZvKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRhci5hZGRmaWxlKHRhcmluZm8pCgogICAgICAgIHRhcmluZm8ubmFtZSA9IHUi5Pb8IgogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgdGFyLmFkZGZpbGUsIHRhcmluZm8pCgogICAgICAgIHRhcmluZm8ubmFtZSA9ICJmb28iCiAgICAgICAgdGFyaW5mby51bmFtZSA9IHUi5Pb8IgogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgdGFyLmFkZGZpbGUsIHRhcmluZm8pCgogICAgZGVmIHRlc3RfdW5pY29kZV9hcmd1bWVudChzZWxmKToKICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGFybmFtZSwgInIiLCBlbmNvZGluZz0iaXNvODg1OS0xIiwgZXJyb3JzPSJzdHJpY3QiKQogICAgICAgIGZvciB0IGluIHRhcjoKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodC5uYW1lKSBpcyBzdHIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHQubGlua25hbWUpIGlzIHN0cikKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodC51bmFtZSkgaXMgc3RyKQogICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0LmduYW1lKSBpcyBzdHIpCiAgICAgICAgdGFyLmNsb3NlKCkKCiAgICBkZWYgdGVzdF91bmFtZV91bmljb2RlKHNlbGYpOgogICAgICAgIGZvciBuYW1lIGluICh1IuT2/CIsICLk9vwiKToKICAgICAgICAgICAgdCA9IHRhcmZpbGUuVGFySW5mbygiZm9vIikKICAgICAgICAgICAgdC51bmFtZSA9IG5hbWUKICAgICAgICAgICAgdC5nbmFtZSA9IG5hbWUKCiAgICAgICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTygpCiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3BlbigiZm9vLnRhciIsIG1vZGU9InciLCBmaWxlb2JqPWZvYmosIGZvcm1hdD1zZWxmLmZvcm1hdCwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCiAgICAgICAgICAgIHRhci5hZGRmaWxlKHQpCiAgICAgICAgICAgIHRhci5jbG9zZSgpCiAgICAgICAgICAgIGZvYmouc2VlaygwKQoKICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKCJmb28udGFyIiwgZmlsZW9iaj1mb2JqLCBlbmNvZGluZz0iaXNvODg1OS0xIikKICAgICAgICAgICAgdCA9IHRhci5nZXRtZW1iZXIoImZvbyIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC51bmFtZSwgIuT2/CIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5nbmFtZSwgIuT2/CIpCgoKY2xhc3MgR05VVW5pY29kZVRlc3QoVXN0YXJVbmljb2RlVGVzdCk6CgogICAgZm9ybWF0ID0gdGFyZmlsZS5HTlVfRk9STUFUCgoKY2xhc3MgUGF4VW5pY29kZVRlc3QoVXN0YXJVbmljb2RlVGVzdCk6CgogICAgZm9ybWF0ID0gdGFyZmlsZS5QQVhfRk9STUFUCgogICAgZGVmIF9jcmVhdGVfdW5pY29kZV9uYW1lKHNlbGYsIG5hbWUpOgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIsIGZvcm1hdD1zZWxmLmZvcm1hdCkKICAgICAgICB0ID0gdGFyZmlsZS5UYXJJbmZvKCkKICAgICAgICB0LnBheF9oZWFkZXJzWyJwYXRoIl0gPSBuYW1lCiAgICAgICAgdGFyLmFkZGZpbGUodCkKICAgICAgICB0YXIuY2xvc2UoKQoKICAgIGRlZiB0ZXN0X2Vycm9yX2hhbmRsZXJzKHNlbGYpOgogICAgICAgICMgVGVzdCBpZiB0aGUgdW5pY29kZSBlcnJvciBoYW5kbGVycyB3b3JrIGNvcnJlY3RseSBmb3IgY2hhcmFjdGVycwogICAgICAgICMgdGhhdCBjYW5ub3QgYmUgZXhwcmVzc2VkIGluIGEgZ2l2ZW4gZW5jb2RpbmcuCiAgICAgICAgc2VsZi5fY3JlYXRlX3VuaWNvZGVfbmFtZSh1IuT2/CIpCgogICAgICAgIGZvciBoYW5kbGVyLCBuYW1lIGluICgoInV0Zi04IiwgdSLk9vwiLmVuY29kZSgidXRmOCIpKSwKICAgICAgICAgICAgICAgICAgICAoInJlcGxhY2UiLCAiPz8/IiksICgiaWdub3JlIiwgIiIpKToKICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIGZvcm1hdD1zZWxmLmZvcm1hdCwgZW5jb2Rpbmc9ImFzY2lpIiwKICAgICAgICAgICAgICAgICAgICBlcnJvcnM9aGFuZGxlcikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZ2V0bmFtZXMoKVswXSwgbmFtZSkKCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCB0YXJmaWxlLm9wZW4sIHRtcG5hbWUsCiAgICAgICAgICAgICAgICBlbmNvZGluZz0iYXNjaWkiLCBlcnJvcnM9InN0cmljdCIpCgogICAgZGVmIHRlc3RfZXJyb3JfaGFuZGxlcl91dGY4KHNlbGYpOgogICAgICAgICMgQ3JlYXRlIGEgcGF0aG5hbWUgdGhhdCBoYXMgb25lIGNvbXBvbmVudCByZXByZXNlbnRhYmxlIHVzaW5nCiAgICAgICAgIyBpc284ODU5LTEgYW5kIHRoZSBvdGhlciBvbmx5IGluIGlzbzg4NTktMTUuCiAgICAgICAgc2VsZi5fY3JlYXRlX3VuaWNvZGVfbmFtZSh1IuT2/C+kIikKCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIGZvcm1hdD1zZWxmLmZvcm1hdCwgZW5jb2Rpbmc9Imlzbzg4NTktMSIsCiAgICAgICAgICAgICAgICBlcnJvcnM9InV0Zi04IikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRuYW1lcygpWzBdLCAi5Pb8LyIgKyB1IqQiLmVuY29kZSgidXRmOCIpKQoKCmNsYXNzIEFwcGVuZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIyBUZXN0IGFwcGVuZCBtb2RlIChjcC4gcGF0Y2ggIzE2NTI2ODEpLgoKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLnRhcm5hbWUgPSB0bXBuYW1lCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi50YXJuYW1lKToKICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYudGFybmFtZSkKCiAgICBkZWYgX2FkZF90ZXN0ZmlsZShzZWxmLCBmaWxlb2JqPU5vbmUpOgogICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihzZWxmLnRhcm5hbWUsICJhIiwgZmlsZW9iaj1maWxlb2JqKQogICAgICAgIHRhci5hZGRmaWxlKHRhcmZpbGUuVGFySW5mbygiYmFyIikpCiAgICAgICAgdGFyLmNsb3NlKCkKCiAgICBkZWYgX2NyZWF0ZV90ZXN0dGFyKHNlbGYsIG1vZGU9Inc6Iik6CiAgICAgICAgc3JjID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQogICAgICAgIHQgPSBzcmMuZ2V0bWVtYmVyKCJ1c3Rhci9yZWd0eXBlIikKICAgICAgICB0Lm5hbWUgPSAiZm9vIgogICAgICAgIGYgPSBzcmMuZXh0cmFjdGZpbGUodCkKICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lLCBtb2RlKQogICAgICAgIHRhci5hZGRmaWxlKHQsIGYpCiAgICAgICAgdGFyLmNsb3NlKCkKCiAgICBkZWYgX3Rlc3Qoc2VsZiwgbmFtZXM9WyJiYXIiXSwgZmlsZW9iaj1Ob25lKToKICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lLCBmaWxlb2JqPWZpbGVvYmopCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZ2V0bmFtZXMoKSwgbmFtZXMpCgogICAgZGVmIHRlc3Rfbm9uX2V4aXN0aW5nKHNlbGYpOgogICAgICAgIHNlbGYuX2FkZF90ZXN0ZmlsZSgpCiAgICAgICAgc2VsZi5fdGVzdCgpCgogICAgZGVmIHRlc3RfZW1wdHkoc2VsZik6CiAgICAgICAgdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgInc6IikuY2xvc2UoKQogICAgICAgIHNlbGYuX2FkZF90ZXN0ZmlsZSgpCiAgICAgICAgc2VsZi5fdGVzdCgpCgogICAgZGVmIHRlc3RfZW1wdHlfZmlsZW9iaihzZWxmKToKICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oIlwwIiAqIDEwMjQpCiAgICAgICAgc2VsZi5fYWRkX3Rlc3RmaWxlKGZvYmopCiAgICAgICAgZm9iai5zZWVrKDApCiAgICAgICAgc2VsZi5fdGVzdChmaWxlb2JqPWZvYmopCgogICAgZGVmIHRlc3RfZmlsZW9iaihzZWxmKToKICAgICAgICBzZWxmLl9jcmVhdGVfdGVzdHRhcigpCiAgICAgICAgZGF0YSA9IG9wZW4oc2VsZi50YXJuYW1lKS5yZWFkKCkKICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oZGF0YSkKICAgICAgICBzZWxmLl9hZGRfdGVzdGZpbGUoZm9iaikKICAgICAgICBmb2JqLnNlZWsoMCkKICAgICAgICBzZWxmLl90ZXN0KG5hbWVzPVsiZm9vIiwgImJhciJdLCBmaWxlb2JqPWZvYmopCgogICAgZGVmIHRlc3RfZXhpc3Rpbmcoc2VsZik6CiAgICAgICAgc2VsZi5fY3JlYXRlX3Rlc3R0YXIoKQogICAgICAgIHNlbGYuX2FkZF90ZXN0ZmlsZSgpCiAgICAgICAgc2VsZi5fdGVzdChuYW1lcz1bImZvbyIsICJiYXIiXSkKCiAgICBkZWYgdGVzdF9hcHBlbmRfZ3ooc2VsZik6CiAgICAgICAgaWYgZ3ppcCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLl9jcmVhdGVfdGVzdHRhcigidzpneiIpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgdG1wbmFtZSwgImEiKQoKICAgIGRlZiB0ZXN0X2FwcGVuZF9iejIoc2VsZik6CiAgICAgICAgaWYgYnoyIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuX2NyZWF0ZV90ZXN0dGFyKCJ3OmJ6MiIpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgdG1wbmFtZSwgImEiKQoKICAgICMgQXBwZW5kIG1vZGUgaXMgc3VwcG9zZWQgdG8gZmFpbCBpZiB0aGUgdGFyZmlsZSB0byBhcHBlbmQgdG8KICAgICMgZG9lcyBub3QgZW5kIHdpdGggYSB6ZXJvIGJsb2NrLgogICAgZGVmIF90ZXN0X2Vycm9yKHNlbGYsIGRhdGEpOgogICAgICAgIG9wZW4oc2VsZi50YXJuYW1lLCAid2IiKS53cml0ZShkYXRhKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCBzZWxmLl9hZGRfdGVzdGZpbGUpCgogICAgZGVmIHRlc3RfbnVsbChzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X2Vycm9yKCIiKQoKICAgIGRlZiB0ZXN0X2luY29tcGxldGUoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF9lcnJvcigiXDAiICogMTMpCgogICAgZGVmIHRlc3RfcHJlbWF0dXJlX2VvZihzZWxmKToKICAgICAgICBkYXRhID0gdGFyZmlsZS5UYXJJbmZvKCJmb28iKS50b2J1ZigpCiAgICAgICAgc2VsZi5fdGVzdF9lcnJvcihkYXRhKQoKICAgIGRlZiB0ZXN0X3RyYWlsaW5nX2dhcmJhZ2Uoc2VsZik6CiAgICAgICAgZGF0YSA9IHRhcmZpbGUuVGFySW5mbygiZm9vIikudG9idWYoKQogICAgICAgIHNlbGYuX3Rlc3RfZXJyb3IoZGF0YSArICJcMCIgKiAxMykKCiAgICBkZWYgdGVzdF9pbnZhbGlkKHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3RfZXJyb3IoImEiICogNTEyKQoKCmNsYXNzIExpbWl0c1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgoKICAgIGRlZiB0ZXN0X3VzdGFyX2xpbWl0cyhzZWxmKToKICAgICAgICAjIDEwMCBjaGFyIG5hbWUKICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIwMTIzNDU2Nzg5IiAqIDEwKQogICAgICAgIHRhcmluZm8udG9idWYodGFyZmlsZS5VU1RBUl9GT1JNQVQpCgogICAgICAgICMgMTAxIGNoYXIgbmFtZSB0aGF0IGNhbm5vdCBiZSBzdG9yZWQKICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIwMTIzNDU2Nzg5IiAqIDEwICsgIjAiKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8udG9idWYsIHRhcmZpbGUuVVNUQVJfRk9STUFUKQoKICAgICAgICAjIDI1NiBjaGFyIG5hbWUgd2l0aCBhIHNsYXNoIGF0IHBvcyAxNTYKICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDYyICsgImxvbmduYW1lIikKICAgICAgICB0YXJpbmZvLnRvYnVmKHRhcmZpbGUuVVNUQVJfRk9STUFUKQoKICAgICAgICAjIDI1NiBjaGFyIG5hbWUgdGhhdCBjYW5ub3QgYmUgc3RvcmVkCiAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMTIzNDU2Ny8iICogMzEgKyAibG9uZ25hbWUiKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8udG9idWYsIHRhcmZpbGUuVVNUQVJfRk9STUFUKQoKICAgICAgICAjIDUxMiBjaGFyIG5hbWUKICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby50b2J1ZiwgdGFyZmlsZS5VU1RBUl9GT1JNQVQpCgogICAgICAgICMgNTEyIGNoYXIgbGlua25hbWUKICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJsb25nbGluayIpCiAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9ICIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLnRvYnVmLCB0YXJmaWxlLlVTVEFSX0ZPUk1BVCkKCiAgICAgICAgIyB1aWQgPiA4IGRpZ2l0cwogICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIm5hbWUiKQogICAgICAgIHRhcmluZm8udWlkID0gMDEwMDAwMDAwCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby50b2J1ZiwgdGFyZmlsZS5VU1RBUl9GT1JNQVQpCgogICAgZGVmIHRlc3RfZ251X2xpbWl0cyhzZWxmKToKICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIpCiAgICAgICAgdGFyaW5mby50b2J1Zih0YXJmaWxlLkdOVV9GT1JNQVQpCgogICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oImxvbmdsaW5rIikKICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gIjEyMy8iICogMTI2ICsgImxvbmduYW1lIgogICAgICAgIHRhcmluZm8udG9idWYodGFyZmlsZS5HTlVfRk9STUFUKQoKICAgICAgICAjIHVpZCA+PSAyNTYgKiogNwogICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIm5hbWUiKQogICAgICAgIHRhcmluZm8udWlkID0gMDQwMDAwMDAwMDAwMDAwMDAwMDBMCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby50b2J1ZiwgdGFyZmlsZS5HTlVfRk9STUFUKQoKICAgIGRlZiB0ZXN0X3BheF9saW1pdHMoc2VsZik6CiAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMTIzLyIgKiAxMjYgKyAibG9uZ25hbWUiKQogICAgICAgIHRhcmluZm8udG9idWYodGFyZmlsZS5QQVhfRk9STUFUKQoKICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJsb25nbGluayIpCiAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9ICIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIKICAgICAgICB0YXJpbmZvLnRvYnVmKHRhcmZpbGUuUEFYX0ZPUk1BVCkKCiAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibmFtZSIpCiAgICAgICAgdGFyaW5mby51aWQgPSAwNDAwMDAwMDAwMDAwMDAwMDAwMEwKICAgICAgICB0YXJpbmZvLnRvYnVmKHRhcmZpbGUuUEFYX0ZPUk1BVCkKCgpjbGFzcyBDb250ZXh0TWFuYWdlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgoKICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgogICAgICAgIHdpdGggdGFyZmlsZS5vcGVuKHRhcm5hbWUpIGFzIHRhcjoKICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0YXIuY2xvc2VkLCAiY2xvc2VkIGluc2lkZSBydW50aW1lIGNvbnRleHQiKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIuY2xvc2VkLCAiY29udGV4dCBtYW5hZ2VyIGZhaWxlZCIpCgogICAgZGVmIHRlc3RfY2xvc2VkKHNlbGYpOgogICAgICAgICMgVGhlIF9fZW50ZXJfXygpIG1ldGhvZCBpcyBzdXBwb3NlZCB0byByYWlzZSBJT0Vycm9yCiAgICAgICAgIyBpZiB0aGUgVGFyRmlsZSBvYmplY3QgaXMgYWxyZWFkeSBjbG9zZWQuCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUpCiAgICAgICAgdGFyLmNsb3NlKCkKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IpOgogICAgICAgICAgICB3aXRoIHRhcjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgdGVzdF9leGNlcHRpb24oc2VsZik6CiAgICAgICAgIyBUZXN0IGlmIHRoZSBJT0Vycm9yIGV4Y2VwdGlvbiBpcyBwYXNzZWQgdGhyb3VnaCBwcm9wZXJseS4KICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbikgYXMgZXhjOgogICAgICAgICAgICB3aXRoIHRhcmZpbGUub3Blbih0YXJuYW1lKSBhcyB0YXI6CiAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yCiAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGV4Yy5leGNlcHRpb24sIElPRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyBleGNlcHRpb24gcmFpc2VkIGluIGNvbnRleHQgbWFuYWdlciIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5jbG9zZWQsICJjb250ZXh0IG1hbmFnZXIgZmFpbGVkIikKCiAgICBkZWYgdGVzdF9ub19lb2Yoc2VsZik6CiAgICAgICAgIyBfX2V4aXRfXygpIG11c3Qgbm90IHdyaXRlIGVuZC1vZi1hcmNoaXZlIGJsb2NrcyBpZiBhbgogICAgICAgICMgZXhjZXB0aW9uIHdhcyByYWlzZWQuCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIpIGFzIHRhcjoKICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbgogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgcGFzcwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucGF0aC5nZXRzaXplKHRtcG5hbWUpLCAwLAogICAgICAgICAgICAgICAgImNvbnRleHQgbWFuYWdlciB3cm90ZSBhbiBlbmQtb2YtYXJjaGl2ZSBibG9jayIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5jbG9zZWQsICJjb250ZXh0IG1hbmFnZXIgZmFpbGVkIikKCiAgICBkZWYgdGVzdF9lb2Yoc2VsZik6CiAgICAgICAgIyBfX2V4aXRfXygpIG11c3Qgd3JpdGUgZW5kLW9mLWFyY2hpdmUgYmxvY2tzLCBpLmUuIGNhbGwKICAgICAgICAjIFRhckZpbGUuY2xvc2UoKSBpZiB0aGVyZSB3YXMgbm8gZXJyb3IuCiAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciKToKICAgICAgICAgICAgcGFzcwogICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwob3MucGF0aC5nZXRzaXplKHRtcG5hbWUpLCAwLAogICAgICAgICAgICAgICAgImNvbnRleHQgbWFuYWdlciB3cm90ZSBubyBlbmQtb2YtYXJjaGl2ZSBibG9jayIpCgogICAgZGVmIHRlc3RfZmlsZW9iaihzZWxmKToKICAgICAgICAjIFRlc3QgdGhhdCBfX2V4aXRfXygpIGRpZCBub3QgY2xvc2UgdGhlIGV4dGVybmFsIGZpbGUKICAgICAgICAjIG9iamVjdC4KICAgICAgICBmb2JqID0gb3Blbih0bXBuYW1lLCAid2IiKQogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4oZmlsZW9iaj1mb2JqLCBtb2RlPSJ3IikgYXMgdGFyOgogICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBwYXNzCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmb2JqLmNsb3NlZCwgImV4dGVybmFsIGZpbGUgb2JqZWN0IHdhcyBjbG9zZWQiKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIuY2xvc2VkLCAiY29udGV4dCBtYW5hZ2VyIGZhaWxlZCIpCiAgICAgICAgZm9iai5jbG9zZSgpCgoKY2xhc3MgTGlua0VtdWxhdGlvblRlc3QoUmVhZFRlc3QpOgoKICAgICMgVGVzdCBmb3IgaXNzdWUgIzg3NDEgcmVncmVzc2lvbi4gT24gcGxhdGZvcm1zIHRoYXQgZG8gbm90IHN1cHBvcnQKICAgICMgc3ltYm9saWMgb3IgaGFyZCBsaW5rcyB0YXJmaWxlIHRyaWVzIHRvIGV4dHJhY3QgdGhlc2UgdHlwZXMgb2YgbWVtYmVycyBhcwogICAgIyB0aGUgcmVndWxhciBmaWxlcyB0aGV5IHBvaW50IHRvLgogICAgZGVmIF90ZXN0X2xpbmtfZXh0cmFjdGlvbihzZWxmLCBuYW1lKToKICAgICAgICBzZWxmLnRhci5leHRyYWN0KG5hbWUsIFRFTVBESVIpCiAgICAgICAgZGF0YSA9IG9wZW4ob3MucGF0aC5qb2luKFRFTVBESVIsIG5hbWUpLCAicmIiKS5yZWFkKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1kNXN1bShkYXRhKSwgbWQ1X3JlZ3R5cGUpCgogICAgZGVmIHRlc3RfaGFyZGxpbmtfZXh0cmFjdGlvbjEoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF9saW5rX2V4dHJhY3Rpb24oInVzdGFyL2xua3R5cGUiKQoKICAgIGRlZiB0ZXN0X2hhcmRsaW5rX2V4dHJhY3Rpb24yKHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3RfbGlua19leHRyYWN0aW9uKCIuL3VzdGFyL2xpbmt0ZXN0Mi9sbmt0eXBlIikKCiAgICBkZWYgdGVzdF9zeW1saW5rX2V4dHJhY3Rpb24xKHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3RfbGlua19leHRyYWN0aW9uKCJ1c3Rhci9zeW10eXBlIikKCiAgICBkZWYgdGVzdF9zeW1saW5rX2V4dHJhY3Rpb24yKHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3RfbGlua19leHRyYWN0aW9uKCIuL3VzdGFyL2xpbmt0ZXN0Mi9zeW10eXBlIikKCgpjbGFzcyBHemlwTWlzY1JlYWRUZXN0KE1pc2NSZWFkVGVzdCk6CiAgICB0YXJuYW1lID0gZ3ppcG5hbWUKICAgIG1vZGUgPSAicjpneiIKY2xhc3MgR3ppcFVzdGFyUmVhZFRlc3QoVXN0YXJSZWFkVGVzdCk6CiAgICB0YXJuYW1lID0gZ3ppcG5hbWUKICAgIG1vZGUgPSAicjpneiIKY2xhc3MgR3ppcFN0cmVhbVJlYWRUZXN0KFN0cmVhbVJlYWRUZXN0KToKICAgIHRhcm5hbWUgPSBnemlwbmFtZQogICAgbW9kZSA9ICJyfGd6IgpjbGFzcyBHemlwV3JpdGVUZXN0KFdyaXRlVGVzdCk6CiAgICBtb2RlID0gInc6Z3oiCmNsYXNzIEd6aXBTdHJlYW1Xcml0ZVRlc3QoU3RyZWFtV3JpdGVUZXN0KToKICAgIG1vZGUgPSAid3xneiIKCgpjbGFzcyBCejJNaXNjUmVhZFRlc3QoTWlzY1JlYWRUZXN0KToKICAgIHRhcm5hbWUgPSBiejJuYW1lCiAgICBtb2RlID0gInI6YnoyIgpjbGFzcyBCejJVc3RhclJlYWRUZXN0KFVzdGFyUmVhZFRlc3QpOgogICAgdGFybmFtZSA9IGJ6Mm5hbWUKICAgIG1vZGUgPSAicjpiejIiCmNsYXNzIEJ6MlN0cmVhbVJlYWRUZXN0KFN0cmVhbVJlYWRUZXN0KToKICAgIHRhcm5hbWUgPSBiejJuYW1lCiAgICBtb2RlID0gInJ8YnoyIgpjbGFzcyBCejJXcml0ZVRlc3QoV3JpdGVUZXN0KToKICAgIG1vZGUgPSAidzpiejIiCmNsYXNzIEJ6MlN0cmVhbVdyaXRlVGVzdChTdHJlYW1Xcml0ZVRlc3QpOgogICAgbW9kZSA9ICJ3fGJ6MiIKCmNsYXNzIEJ6MlBhcnRpYWxSZWFkVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAjIElzc3VlNTA2ODogVGhlIF9CWjJQcm94eS5yZWFkKCkgbWV0aG9kIGxvb3BzIGZvcmV2ZXIKICAgICMgb24gYW4gZW1wdHkgb3IgcGFydGlhbCBiemlwcGVkIGZpbGUuCgogICAgZGVmIF90ZXN0X3BhcnRpYWxfaW5wdXQoc2VsZiwgbW9kZSk6CiAgICAgICAgY2xhc3MgTXlTdHJpbmdJTyhTdHJpbmdJTy5TdHJpbmdJTyk6CiAgICAgICAgICAgIGhpdF9lb2YgPSBGYWxzZQogICAgICAgICAgICBkZWYgcmVhZChzZWxmLCBuKToKICAgICAgICAgICAgICAgIGlmIHNlbGYuaGl0X2VvZjoKICAgICAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiaW5maW5pdGUgbG9vcCBkZXRlY3RlZCBpbiB0YXJmaWxlLm9wZW4oKSIpCiAgICAgICAgICAgICAgICBzZWxmLmhpdF9lb2YgPSBzZWxmLnBvcyA9PSBzZWxmLmxlbgogICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZ0lPLlN0cmluZ0lPLnJlYWQoc2VsZiwgbikKICAgICAgICAgICAgZGVmIHNlZWsoc2VsZiwgKmFyZ3MpOgogICAgICAgICAgICAgICAgc2VsZi5oaXRfZW9mID0gRmFsc2UKICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmdJTy5TdHJpbmdJTy5zZWVrKHNlbGYsICphcmdzKQoKICAgICAgICBkYXRhID0gYnoyLmNvbXByZXNzKHRhcmZpbGUuVGFySW5mbygiZm9vIikudG9idWYoKSkKICAgICAgICBmb3IgeCBpbiByYW5nZShsZW4oZGF0YSkgKyAxKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdGFyZmlsZS5vcGVuKGZpbGVvYmo9TXlTdHJpbmdJTyhkYXRhWzp4XSksIG1vZGU9bW9kZSkKICAgICAgICAgICAgZXhjZXB0IHRhcmZpbGUuUmVhZEVycm9yOgogICAgICAgICAgICAgICAgcGFzcyAjIHdlIGhhdmUgbm8gaW50ZXJlc3QgaW4gUmVhZEVycm9ycwoKICAgIGRlZiB0ZXN0X3BhcnRpYWxfaW5wdXQoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF9wYXJ0aWFsX2lucHV0KCJyIikKCiAgICBkZWYgdGVzdF9wYXJ0aWFsX2lucHV0X2J6MihzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X3BhcnRpYWxfaW5wdXQoInI6YnoyIikKCgpkZWYgdGVzdF9tYWluKCk6CiAgICBvcy5tYWtlZGlycyhURU1QRElSKQoKICAgIHRlc3RzID0gWwogICAgICAgIFVzdGFyUmVhZFRlc3QsCiAgICAgICAgTWlzY1JlYWRUZXN0LAogICAgICAgIFN0cmVhbVJlYWRUZXN0LAogICAgICAgIERldGVjdFJlYWRUZXN0LAogICAgICAgIE1lbWJlclJlYWRUZXN0LAogICAgICAgIEdOVVJlYWRUZXN0LAogICAgICAgIFBheFJlYWRUZXN0LAogICAgICAgIFdyaXRlVGVzdCwKICAgICAgICBTdHJlYW1Xcml0ZVRlc3QsCiAgICAgICAgR05VV3JpdGVUZXN0LAogICAgICAgIFBheFdyaXRlVGVzdCwKICAgICAgICBVc3RhclVuaWNvZGVUZXN0LAogICAgICAgIEdOVVVuaWNvZGVUZXN0LAogICAgICAgIFBheFVuaWNvZGVUZXN0LAogICAgICAgIEFwcGVuZFRlc3QsCiAgICAgICAgTGltaXRzVGVzdCwKICAgICAgICBDb250ZXh0TWFuYWdlclRlc3QsCiAgICBdCgogICAgaWYgaGFzYXR0cihvcywgImxpbmsiKToKICAgICAgICB0ZXN0cy5hcHBlbmQoSGFyZGxpbmtUZXN0KQogICAgZWxzZToKICAgICAgICB0ZXN0cy5hcHBlbmQoTGlua0VtdWxhdGlvblRlc3QpCgogICAgZm9iaiA9IG9wZW4odGFybmFtZSwgInJiIikKICAgIGRhdGEgPSBmb2JqLnJlYWQoKQogICAgZm9iai5jbG9zZSgpCgogICAgaWYgZ3ppcDoKICAgICAgICAjIENyZWF0ZSB0ZXN0dGFyLnRhci5neiBhbmQgYWRkIGd6aXAtc3BlY2lmaWMgdGVzdHMuCiAgICAgICAgdGFyID0gZ3ppcC5vcGVuKGd6aXBuYW1lLCAid2IiKQogICAgICAgIHRhci53cml0ZShkYXRhKQogICAgICAgIHRhci5jbG9zZSgpCgogICAgICAgIHRlc3RzICs9IFsKICAgICAgICAgICAgR3ppcE1pc2NSZWFkVGVzdCwKICAgICAgICAgICAgR3ppcFVzdGFyUmVhZFRlc3QsCiAgICAgICAgICAgIEd6aXBTdHJlYW1SZWFkVGVzdCwKICAgICAgICAgICAgR3ppcFdyaXRlVGVzdCwKICAgICAgICAgICAgR3ppcFN0cmVhbVdyaXRlVGVzdCwKICAgICAgICBdCgogICAgaWYgYnoyOgogICAgICAgICMgQ3JlYXRlIHRlc3R0YXIudGFyLmJ6MiBhbmQgYWRkIGJ6Mi1zcGVjaWZpYyB0ZXN0cy4KICAgICAgICB0YXIgPSBiejIuQloyRmlsZShiejJuYW1lLCAid2IiKQogICAgICAgIHRhci53cml0ZShkYXRhKQogICAgICAgIHRhci5jbG9zZSgpCgogICAgICAgIHRlc3RzICs9IFsKICAgICAgICAgICAgQnoyTWlzY1JlYWRUZXN0LAogICAgICAgICAgICBCejJVc3RhclJlYWRUZXN0LAogICAgICAgICAgICBCejJTdHJlYW1SZWFkVGVzdCwKICAgICAgICAgICAgQnoyV3JpdGVUZXN0LAogICAgICAgICAgICBCejJTdHJlYW1Xcml0ZVRlc3QsCiAgICAgICAgICAgIEJ6MlBhcnRpYWxSZWFkVGVzdCwKICAgICAgICBdCgogICAgdHJ5OgogICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQogICAgZmluYWxseToKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhURU1QRElSKToKICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShURU1QRElSKQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHRlc3RfbWFpbigpCg==