ZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQppbmRleCBmMmRkOTdkLi41NzM0ODlhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CkBAIC0xLDggKzEsMTIgQEAKKyMgZW5jb2Rpbmc6IGlzbzg4NTktMTUKKwogaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBpbXBvcnQgc2h1dGlsCiBpbXBvcnQgdGVtcGZpbGUKIGltcG9ydCBTdHJpbmdJTworaW1wb3J0IG1kNQoraW1wb3J0IGVycm5vCiAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHRhcmZpbGUKQEAgLTIwLDQ1MiArMjQsNTQ2IEBACiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgYnoyID0gTm9uZQogCitkZWYgbWQ1c3VtKGRhdGEpOgorICAgIHJldHVybiBtZDUubmV3KGRhdGEpLmhleGRpZ2VzdCgpCisKIGRlZiBwYXRoKHBhdGgpOgogICAgIHJldHVybiB0ZXN0X3N1cHBvcnQuZmluZGZpbGUocGF0aCkKIAotdGVzdHRhciA9IHBhdGgoInRlc3R0YXIudGFyIikKLXRlbXBkaXIgPSBvcy5wYXRoLmpvaW4odGVtcGZpbGUuZ2V0dGVtcGRpcigpLCAidGVzdHRhciIgKyBvcy5leHRzZXAgKyAiZGlyIikKLXRlbXBuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgotbWVtYmVyY291bnQgPSAxMgorVEVNUERJUiA9IG9zLnBhdGguam9pbih0ZW1wZmlsZS5nZXR0ZW1wZGlyKCksICJ0ZXN0X3RhcmZpbGVfdG1wIikKK3Rhcm5hbWUgPSBwYXRoKCJ0ZXN0dGFyLnRhciIpCitnemlwbmFtZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHRhci50YXIuZ3oiKQorYnoybmFtZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHRhci50YXIuYnoyIikKK3RtcG5hbWUgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInRtcC50YXIiKQogCi1kZWYgdGFybmFtZShjb21wPSIiKToKLSAgICBpZiBub3QgY29tcDoKLSAgICAgICAgcmV0dXJuIHRlc3R0YXIKLSAgICByZXR1cm4gb3MucGF0aC5qb2luKHRlbXBkaXIsICIlcyVzJXMiICUgKHRlc3R0YXIsIG9zLmV4dHNlcCwgY29tcCkpCi0KLWRlZiBkaXJuYW1lKCk6Ci0gICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHRlbXBkaXIpOgotICAgICAgICBvcy5ta2Rpcih0ZW1wZGlyKQotICAgIHJldHVybiB0ZW1wZGlyCi0KLWRlZiB0bXBuYW1lKCk6Ci0gICAgcmV0dXJuIHRlbXBuYW1lCittZDVfcmVndHlwZSA9ICI2NWY0NzdjODE4YWQ5ZTE1ZjdmZWFiMGM2ZDM3NzQyZiIKK21kNV9zcGFyc2UgPSAiYTU0ZmJjNGNhNGY0Mzk5YTkwZTFiMjcxNjQwMTJmYzYiCiAKIAotY2xhc3MgQmFzZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGNvbXAgPSAnJwotICAgIG1vZGUgPSAncicKLSAgICBzZXAgPSAnOicKK2NsYXNzIFJlYWRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIHRhcm5hbWUgPSB0YXJuYW1lCisgICAgbW9kZSA9ICJyOiIKIAogICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgbW9kZSA9IHNlbGYubW9kZSArIHNlbGYuc2VwICsgc2VsZi5jb21wCi0gICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUoc2VsZi5jb21wKSwgbW9kZSkKKyAgICAgICAgc2VsZi50YXIgPSB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lLCBtb2RlPXNlbGYubW9kZSkKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgc2VsZi50YXIuY2xvc2UoKQogCi1jbGFzcyBSZWFkVGVzdChCYXNlVGVzdCk6CiAKLSAgICBkZWYgdGVzdChzZWxmKToKLSAgICAgICAgIiIiVGVzdCBtZW1iZXIgZXh0cmFjdGlvbi4KLSAgICAgICAgIiIiCi0gICAgICAgIG1lbWJlcnMgPSAwCi0gICAgICAgIGZvciB0YXJpbmZvIGluIHNlbGYudGFyOgotICAgICAgICAgICAgbWVtYmVycyArPSAxCi0gICAgICAgICAgICBpZiBub3QgdGFyaW5mby5pc3JlZygpOgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBmID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZi5yZWFkKCkpID09IHRhcmluZm8uc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAic2l6ZSByZWFkIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHNpemUiKQotICAgICAgICAgICAgZi5jbG9zZSgpCitjbGFzcyBVc3RhclJlYWRUZXN0KFJlYWRUZXN0KToKIAotICAgICAgICBzZWxmLmFzc2VydF8obWVtYmVycyA9PSBtZW1iZXJjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgZmluZCBhbGwgbWVtYmVycyIpCisgICAgZGVmIHRlc3RfZmlsZW9ial9yZWd1bGFyX2ZpbGUoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3JlZ3R5cGUiKQorICAgICAgICBmb2JqID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKKyAgICAgICAgZGF0YSA9IGZvYmoucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0XygobGVuKGRhdGEpLCBtZDVzdW0oZGF0YSkpID09ICh0YXJpbmZvLnNpemUsIG1kNV9yZWd0eXBlKSwKKyAgICAgICAgICAgICAgICAicmVndWxhciBmaWxlIGV4dHJhY3Rpb24gZmFpbGVkIikKIAotICAgIGRlZiB0ZXN0X3NwYXJzZShzZWxmKToKLSAgICAgICAgIiIiVGVzdCBzcGFyc2UgbWVtYmVyIGV4dHJhY3Rpb24uCi0gICAgICAgICIiIgotICAgICAgICBpZiBzZWxmLnNlcCAhPSAifCI6Ci0gICAgICAgICAgICBmMSA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKCJTLVNQQVJTRSIpCi0gICAgICAgICAgICBmMiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKCJTLVNQQVJTRS1XSVRILU5VTExTIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhmMS5yZWFkKCkgPT0gZjIucmVhZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJfRmlsZU9iamVjdCBmYWlsZWQgb24gc3BhcnNlIGZpbGUgbWVtYmVyIikKKyAgICBkZWYgdGVzdF9maWxlb2JqX3JlYWRsaW5lcyhzZWxmKToKKyAgICAgICAgc2VsZi50YXIuZXh0cmFjdCgidXN0YXIvcmVndHlwZSIsIFRFTVBESVIpCisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3JlZ3R5cGUiKQorICAgICAgICBmb2JqMSA9IG9wZW4ob3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9yZWd0eXBlIiksICJyVSIpCisgICAgICAgIGZvYmoyID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKIAotICAgIGRlZiB0ZXN0X3JlYWRsaW5lcyhzZWxmKToKLSAgICAgICAgIiIiVGVzdCByZWFkbGluZXMoKSBtZXRob2Qgb2YgX0ZpbGVPYmplY3QuCi0gICAgICAgICIiIgotICAgICAgICBpZiBzZWxmLnNlcCAhPSAifCI6Ci0gICAgICAgICAgICBmaWxlbmFtZSA9ICIwLVJFR1RZUEUtVEVYVCIKLSAgICAgICAgICAgIHNlbGYudGFyLmV4dHJhY3QoZmlsZW5hbWUsIGRpcm5hbWUoKSkKLSAgICAgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihkaXJuYW1lKCksIGZpbGVuYW1lKSwgInJVIikKLSAgICAgICAgICAgIGxpbmVzMSA9IGYucmVhZGxpbmVzKCkKLSAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgbGluZXMyID0gc2VsZi50YXIuZXh0cmFjdGZpbGUoZmlsZW5hbWUpLnJlYWRsaW5lcygpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obGluZXMxID09IGxpbmVzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiX0ZpbGVPYmplY3QucmVhZGxpbmUoKSBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSIpCisgICAgICAgIGxpbmVzMSA9IGZvYmoxLnJlYWRsaW5lcygpCisgICAgICAgIGxpbmVzMiA9IGZvYmoyLnJlYWRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsaW5lczEgPT0gbGluZXMyLAorICAgICAgICAgICAgICAgICJmaWxlb2JqLnJlYWRsaW5lcygpIGZhaWxlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4obGluZXMyKSA9PSAxMTQsCisgICAgICAgICAgICAgICAgImZpbGVvYmoucmVhZGxpbmVzKCkgZmFpbGVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxpbmVzMls4M10gPT0gXAorICAgICAgICAgICAgICAgICJJIHdpbGwgZ2xhZGx5IGFkbWl0IHRoYXQgUHl0aG9uIGlzIG5vdCB0aGUgZmFzdGVzdCBydW5uaW5nIHNjcmlwdGluZyBsYW5ndWFnZS5cbiIsCisgICAgICAgICAgICAgICAgImZpbGVvYmoucmVhZGxpbmVzKCkgZmFpbGVkIikKIAotICAgIGRlZiB0ZXN0X2l0ZXIoc2VsZik6Ci0gICAgICAgICMgVGVzdCBpdGVyYXRpb24gb3ZlciBFeEZpbGVPYmplY3QuCi0gICAgICAgIGlmIHNlbGYuc2VwICE9ICJ8IjoKLSAgICAgICAgICAgIGZpbGVuYW1lID0gIjAtUkVHVFlQRS1URVhUIgotICAgICAgICAgICAgc2VsZi50YXIuZXh0cmFjdChmaWxlbmFtZSwgZGlybmFtZSgpKQotICAgICAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKGRpcm5hbWUoKSwgZmlsZW5hbWUpLCAiclUiKQotICAgICAgICAgICAgbGluZXMxID0gZi5yZWFkbGluZXMoKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBsaW5lczIgPSBbbGluZSBmb3IgbGluZSBpbiBzZWxmLnRhci5leHRyYWN0ZmlsZShmaWxlbmFtZSldCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obGluZXMxID09IGxpbmVzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiRXhGaWxlT2JqZWN0IGl0ZXJhdGlvbiBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSIpCisgICAgZGVmIHRlc3RfZmlsZW9ial9pdGVyKHNlbGYpOgorICAgICAgICBzZWxmLnRhci5leHRyYWN0KCJ1c3Rhci9yZWd0eXBlIiwgVEVNUERJUikKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvcmVndHlwZSIpCisgICAgICAgIGZvYmoxID0gb3Blbihvcy5wYXRoLmpvaW4oVEVNUERJUiwgInVzdGFyL3JlZ3R5cGUiKSwgInJVIikKKyAgICAgICAgZm9iajIgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQorICAgICAgICBsaW5lczEgPSBmb2JqMS5yZWFkbGluZXMoKQorICAgICAgICBsaW5lczIgPSBbbGluZSBmb3IgbGluZSBpbiBmb2JqMl0KKyAgICAgICAgc2VsZi5hc3NlcnRfKGxpbmVzMSA9PSBsaW5lczIsCisgICAgICAgICAgICAgICAgICAgICAiZmlsZW9iai5fX2l0ZXJfXygpIGZhaWxlZCIpCiAKLSAgICBkZWYgdGVzdF9zZWVrKHNlbGYpOgotICAgICAgICAiIiJUZXN0IHNlZWsoKSBtZXRob2Qgb2YgX0ZpbGVPYmplY3QsIGluY2wuIHJhbmRvbSByZWFkaW5nLgotICAgICAgICAiIiIKLSAgICAgICAgaWYgc2VsZi5zZXAgIT0gInwiOgotICAgICAgICAgICAgZmlsZW5hbWUgPSAiMC1SRUdUWVBFLVRFWFQiCi0gICAgICAgICAgICBzZWxmLnRhci5leHRyYWN0KGZpbGVuYW1lLCBkaXJuYW1lKCkpCi0gICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oZGlybmFtZSgpLCBmaWxlbmFtZSksICJyYiIpCi0gICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKLSAgICAgICAgICAgIGYuY2xvc2UoKQotCi0gICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKGZpbGVuYW1lKQotICAgICAgICAgICAgZm9iaiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8pCi0KLSAgICAgICAgICAgIHRleHQgPSBmb2JqLnJlYWQoKQotICAgICAgICAgICAgZm9iai5zZWVrKDApCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oMCA9PSBmb2JqLnRlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIGZpbGUncyBzdGFydCBmYWlsZWQiKQotICAgICAgICAgICAgZm9iai5zZWVrKDIwNDgsIDApCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oMjA0OCA9PSBmb2JqLnRlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIGFic29sdXRlIHBvc2l0aW9uIGZhaWxlZCIpCi0gICAgICAgICAgICBmb2JqLnNlZWsoLTEwMjQsIDEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oMTAyNCA9PSBmb2JqLnRlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIG5lZ2F0aXZlIHJlbGF0aXZlIHBvc2l0aW9uIGZhaWxlZCIpCi0gICAgICAgICAgICBmb2JqLnNlZWsoMTAyNCwgMSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygyMDQ4ID09IGZvYmoudGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gcG9zaXRpdmUgcmVsYXRpdmUgcG9zaXRpb24gZmFpbGVkIikKLSAgICAgICAgICAgIHMgPSBmb2JqLnJlYWQoMTApCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocyA9PSBkYXRhWzIwNDg6MjA1OF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQoKSBhZnRlciBzZWVrIGZhaWxlZCIpCi0gICAgICAgICAgICBmb2JqLnNlZWsoMCwgMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLnNpemUgPT0gZm9iai50ZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgInNlZWsoKSB0byBmaWxlJ3MgZW5kIGZhaWxlZCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZm9iai5yZWFkKCkgPT0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQoKSBhdCBmaWxlJ3MgZW5kIGRpZCBub3QgcmV0dXJuIGVtcHR5IHN0cmluZyIpCi0gICAgICAgICAgICBmb2JqLnNlZWsoLXRhcmluZm8uc2l6ZSwgMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygwID09IGZvYmoudGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJyZWxhdGl2ZSBzZWVrKCkgdG8gZmlsZSdzIHN0YXJ0IGZhaWxlZCIpCi0gICAgICAgICAgICBmb2JqLnNlZWsoNTEyKQotICAgICAgICAgICAgczEgPSBmb2JqLnJlYWRsaW5lcygpCi0gICAgICAgICAgICBmb2JqLnNlZWsoNTEyKQotICAgICAgICAgICAgczIgPSBmb2JqLnJlYWRsaW5lcygpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oczEgPT0gczIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRsaW5lcygpIGFmdGVyIHNlZWsgZmFpbGVkIikKLSAgICAgICAgICAgIGZvYmouc2VlaygwKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihmb2JqLnJlYWRsaW5lKCkpID09IGZvYmoudGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZWxsKCkgYWZ0ZXIgcmVhZGxpbmUoKSBmYWlsZWQiKQotICAgICAgICAgICAgZm9iai5zZWVrKDUxMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZm9iai5yZWFkbGluZSgpKSArIDUxMiA9PSBmb2JqLnRlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAidGVsbCgpIGFmdGVyIHNlZWsoKSBhbmQgcmVhZGxpbmUoKSBmYWlsZWQiKQotICAgICAgICAgICAgZm9iai5zZWVrKDApCi0gICAgICAgICAgICBsaW5lID0gZm9iai5yZWFkbGluZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZm9iai5yZWFkKCkgPT0gZGF0YVtsZW4obGluZSk6XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZCgpIGFmdGVyIHJlYWRsaW5lKCkgZmFpbGVkIikKLSAgICAgICAgICAgIGZvYmouY2xvc2UoKQotCi0gICAgZGVmIHRlc3Rfb2xkX2RpcnR5cGUoc2VsZik6Ci0gICAgICAgICIiIlRlc3Qgb2xkIHN0eWxlIGRpcnR5cGUgbWVtYmVyIChidWcgIzEzMzY2MjMpLgotICAgICAgICAiIiIKLSAgICAgICAgIyBPbGQgdGFycyBjcmVhdGUgZGlyZWN0b3J5IG1lbWJlcnMgdXNpbmcgYSBSRUdUWVBFCi0gICAgICAgICMgaGVhZGVyIHdpdGggYSAiLyIgYXBwZW5kZWQgdG8gdGhlIGZpbGVuYW1lIGZpZWxkLgotCi0gICAgICAgICMgQ3JlYXRlIGFuIG9sZCB0YXIgc3R5bGUgZGlyZWN0b3J5IGVudHJ5LgotICAgICAgICBmaWxlbmFtZSA9IHRtcG5hbWUoKQotICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJkaXJlY3RvcnkvIikKLSAgICAgICAgdGFyaW5mby50eXBlID0gdGFyZmlsZS5SRUdUWVBFCi0KLSAgICAgICAgZm9iaiA9IG9wZW4oZmlsZW5hbWUsICJ3IikKLSAgICAgICAgZm9iai53cml0ZSh0YXJpbmZvLnRvYnVmKCkpCisgICAgZGVmIHRlc3RfZmlsZW9ial9zZWVrKHNlbGYpOgorICAgICAgICBzZWxmLnRhci5leHRyYWN0KCJ1c3Rhci9yZWd0eXBlIiwgVEVNUERJUikKKyAgICAgICAgZm9iaiA9IG9wZW4ob3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9yZWd0eXBlIiksICJyYiIpCisgICAgICAgIGRhdGEgPSBmb2JqLnJlYWQoKQogICAgICAgICBmb2JqLmNsb3NlKCkKIAorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9yZWd0eXBlIikKKyAgICAgICAgZm9iaiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8pCisKKyAgICAgICAgdGV4dCA9IGZvYmoucmVhZCgpCisgICAgICAgIGZvYmouc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydF8oMCA9PSBmb2JqLnRlbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gZmlsZSdzIHN0YXJ0IGZhaWxlZCIpCisgICAgICAgIGZvYmouc2VlaygyMDQ4LCAwKQorICAgICAgICBzZWxmLmFzc2VydF8oMjA0OCA9PSBmb2JqLnRlbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gYWJzb2x1dGUgcG9zaXRpb24gZmFpbGVkIikKKyAgICAgICAgZm9iai5zZWVrKC0xMDI0LCAxKQorICAgICAgICBzZWxmLmFzc2VydF8oMTAyNCA9PSBmb2JqLnRlbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gbmVnYXRpdmUgcmVsYXRpdmUgcG9zaXRpb24gZmFpbGVkIikKKyAgICAgICAgZm9iai5zZWVrKDEwMjQsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0XygyMDQ4ID09IGZvYmoudGVsbCgpLAorICAgICAgICAgICAgICAgICAgICAgInNlZWsoKSB0byBwb3NpdGl2ZSByZWxhdGl2ZSBwb3NpdGlvbiBmYWlsZWQiKQorICAgICAgICBzID0gZm9iai5yZWFkKDEwKQorICAgICAgICBzZWxmLmFzc2VydF8ocyA9PSBkYXRhWzIwNDg6MjA1OF0sCisgICAgICAgICAgICAgICAgICAgICAicmVhZCgpIGFmdGVyIHNlZWsgZmFpbGVkIikKKyAgICAgICAgZm9iai5zZWVrKDAsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLnNpemUgPT0gZm9iai50ZWxsKCksCisgICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIGZpbGUncyBlbmQgZmFpbGVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKGZvYmoucmVhZCgpID09ICIiLAorICAgICAgICAgICAgICAgICAgICAgInJlYWQoKSBhdCBmaWxlJ3MgZW5kIGRpZCBub3QgcmV0dXJuIGVtcHR5IHN0cmluZyIpCisgICAgICAgIGZvYmouc2VlaygtdGFyaW5mby5zaXplLCAyKQorICAgICAgICBzZWxmLmFzc2VydF8oMCA9PSBmb2JqLnRlbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICJyZWxhdGl2ZSBzZWVrKCkgdG8gZmlsZSdzIHN0YXJ0IGZhaWxlZCIpCisgICAgICAgIGZvYmouc2Vlayg1MTIpCisgICAgICAgIHMxID0gZm9iai5yZWFkbGluZXMoKQorICAgICAgICBmb2JqLnNlZWsoNTEyKQorICAgICAgICBzMiA9IGZvYmoucmVhZGxpbmVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHMxID09IHMyLAorICAgICAgICAgICAgICAgICAgICAgInJlYWRsaW5lcygpIGFmdGVyIHNlZWsgZmFpbGVkIikKKyAgICAgICAgZm9iai5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZm9iai5yZWFkbGluZSgpKSA9PSBmb2JqLnRlbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICJ0ZWxsKCkgYWZ0ZXIgcmVhZGxpbmUoKSBmYWlsZWQiKQorICAgICAgICBmb2JqLnNlZWsoNTEyKQorICAgICAgICBzZWxmLmFzc2VydF8obGVuKGZvYmoucmVhZGxpbmUoKSkgKyA1MTIgPT0gZm9iai50ZWxsKCksCisgICAgICAgICAgICAgICAgICAgICAidGVsbCgpIGFmdGVyIHNlZWsoKSBhbmQgcmVhZGxpbmUoKSBmYWlsZWQiKQorICAgICAgICBmb2JqLnNlZWsoMCkKKyAgICAgICAgbGluZSA9IGZvYmoucmVhZGxpbmUoKQorICAgICAgICBzZWxmLmFzc2VydF8oZm9iai5yZWFkKCkgPT0gZGF0YVtsZW4obGluZSk6XSwKKyAgICAgICAgICAgICAgICAgICAgICJyZWFkKCkgYWZ0ZXIgcmVhZGxpbmUoKSBmYWlsZWQiKQorICAgICAgICBmb2JqLmNsb3NlKCkKKworCitjbGFzcyBNaXNjUmVhZFRlc3QoUmVhZFRlc3QpOgorCisgICAgZGVmIHRlc3Rfbm9fZmlsZW5hbWUoc2VsZik6CisgICAgICAgIGZvYmogPSBvcGVuKHNlbGYudGFybmFtZSwgInJiIikKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKGZpbGVvYmo9Zm9iaiwgbW9kZT1zZWxmLm1vZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLm5hbWUsIG9zLnBhdGguYWJzcGF0aChmb2JqLm5hbWUpKQorCisgICAgZGVmIHRlc3RfZmFpbF9jb21wKHNlbGYpOgorICAgICAgICAjIEZvciBHemlwIGFuZCBCejIgVGVzdHM6IGZhaWwgd2l0aCBhIFJlYWRFcnJvciBvbiBhbiB1bmNvbXByZXNzZWQgZmlsZS4KKyAgICAgICAgaWYgc2VsZi5tb2RlID09ICJyOiI6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgdGFybmFtZSwgc2VsZi5tb2RlKQorICAgICAgICBmb2JqID0gb3Blbih0YXJuYW1lLCAicmIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBmaWxlb2JqPWZvYmosIG1vZGU9c2VsZi5tb2RlKQorCisgICAgZGVmIHRlc3RfdjdfZGlydHlwZShzZWxmKToKKyAgICAgICAgIyBUZXN0IG9sZCBzdHlsZSBkaXJ0eXBlIG1lbWJlciAoYnVnICMxMzM2NjIzKToKKyAgICAgICAgIyBPbGQgVjcgdGFycyBjcmVhdGUgZGlyZWN0b3J5IG1lbWJlcnMgdXNpbmcgYW4gQVJFR1RZUEUKKyAgICAgICAgIyBoZWFkZXIgd2l0aCBhICIvIiBhcHBlbmRlZCB0byB0aGUgZmlsZW5hbWUgZmllbGQuCisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoIm1pc2MvZGlydHlwZS1vbGQtdjciKQorICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mby50eXBlID09IHRhcmZpbGUuRElSVFlQRSwKKyAgICAgICAgICAgICAgICAidjcgZGlydHlwZSBmYWlsZWQiKQorCisgICAgZGVmIHRlc3RfY2hlY2tfbWVtYmVycyhzZWxmKToKKyAgICAgICAgZm9yIHRhcmluZm8gaW4gc2VsZi50YXI6CisgICAgICAgICAgICBzZWxmLmFzc2VydF8oaW50KHRhcmluZm8ubXRpbWUpID09IDA3NjA2MTM2NjE3LAorICAgICAgICAgICAgICAgICAgICAid3JvbmcgbXRpbWUgZm9yICVzIiAlIHRhcmluZm8ubmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCB0YXJpbmZvLm5hbWUuc3RhcnRzd2l0aCgidXN0YXIvIik6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLnVuYW1lID09ICJ0YXJmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgIndyb25nIHVuYW1lIGZvciAlcyIgJSB0YXJpbmZvLm5hbWUpCisKKyAgICBkZWYgdGVzdF9maW5kX21lbWJlcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLnRhci5nZXRtZW1iZXJzKClbLTFdLm5hbWUgPT0gIm1pc2MvZW9mIiwKKyAgICAgICAgICAgICAgICAiY291bGQgbm90IGZpbmQgYWxsIG1lbWJlcnMiKQorCisgICAgZGVmIHRlc3RfZXh0cmFjdF9oYXJkbGluayhzZWxmKToKKyAgICAgICAgIyBUZXN0IGhhcmRsaW5rIGV4dHJhY3Rpb24gKGUuZy4gYnVnICM4NTcyOTcpLgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGFybmFtZSwgZXJyb3JsZXZlbD0xKQorCisgICAgICAgIHRhci5leHRyYWN0KCJ1c3Rhci9yZWd0eXBlIiwgVEVNUERJUikKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgIyBUZXN0IGlmIGl0IGlzIHN0aWxsIGEgZGlyZWN0b3J5IGVudHJ5IHdoZW4KLSAgICAgICAgICAgICMgcmVhZCBiYWNrLgotICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKGZpbGVuYW1lKQotICAgICAgICAgICAgdGFyaW5mbyA9IHRhci5nZXRtZW1iZXJzKClbMF0KLSAgICAgICAgICAgIHRhci5jbG9zZSgpCisgICAgICAgICAgICB0YXIuZXh0cmFjdCgidXN0YXIvbG5rdHlwZSIsIFRFTVBESVIpCisgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJoYXJkbGluayBub3QgZXh0cmFjdGVkIHByb3Blcmx5IikKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8udHlwZSA9PSB0YXJmaWxlLkRJUlRZUEUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mby5uYW1lLmVuZHN3aXRoKCIvIikpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQotICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZGF0YSA9IG9wZW4ob3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9sbmt0eXBlIiksICJyYiIpLnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1kNXN1bShkYXRhKSwgbWQ1X3JlZ3R5cGUpCiAKLWNsYXNzIFJlYWRTdHJlYW1UZXN0KFJlYWRUZXN0KToKLSAgICBzZXAgPSAifCIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFyLmV4dHJhY3QoInVzdGFyL3N5bXR5cGUiLCBURU1QRElSKQorICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgic3ltbGluayBub3QgZXh0cmFjdGVkIHByb3Blcmx5IikKIAotICAgIGRlZiB0ZXN0KHNlbGYpOgotICAgICAgICAiIiJUZXN0IG1lbWJlciBleHRyYWN0aW9uLCBhbmQgZm9yIFN0cmVhbUVycm9yIHdoZW4KLSAgICAgICAgICAgc2Vla2luZyBiYWNrd2FyZHMuCi0gICAgICAgICIiIgotICAgICAgICBSZWFkVGVzdC50ZXN0KHNlbGYpCi0gICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXJzKClbMF0KLSAgICAgICAgZiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8pCisgICAgICAgIGRhdGEgPSBvcGVuKG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvc3ltdHlwZSIpLCAicmIiKS5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZDVzdW0oZGF0YSksIG1kNV9yZWd0eXBlKQorCisKK2NsYXNzIFN0cmVhbVJlYWRUZXN0KFJlYWRUZXN0KToKKworICAgIG1vZGU9InJ8IgorCisgICAgZGVmIHRlc3RfZmlsZW9ial9yZWd1bGFyX2ZpbGUoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5uZXh0KCkgIyBnZXQgInJlZ3R5cGUiIChjYW4ndCB1c2UgZ2V0bWVtYmVyKQorICAgICAgICBmb2JqID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKKyAgICAgICAgZGF0YSA9IGZvYmoucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0XygobGVuKGRhdGEpLCBtZDVzdW0oZGF0YSkpID09ICh0YXJpbmZvLnNpemUsIG1kNV9yZWd0eXBlKSwKKyAgICAgICAgICAgICAgICAicmVndWxhciBmaWxlIGV4dHJhY3Rpb24gZmFpbGVkIikKKworICAgIGRlZiB0ZXN0X3Byb3Zva2Vfc3RyZWFtX2Vycm9yKHNlbGYpOgorICAgICAgICB0YXJpbmZvcyA9IHNlbGYudGFyLmdldG1lbWJlcnMoKQorICAgICAgICBmID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mb3NbMF0pICMgcmVhZCB0aGUgZmlyc3QgbWVtYmVyCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuU3RyZWFtRXJyb3IsIGYucmVhZCkKIAotICAgIGRlZiB0ZXN0X3N0cmVhbShzZWxmKToKLSAgICAgICAgIiIiQ29tcGFyZSB0aGUgbm9ybWFsIHRhciBhbmQgdGhlIHN0cmVhbSB0YXIuCi0gICAgICAgICIiIgotICAgICAgICBzdHJlYW0gPSBzZWxmLnRhcgotICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGFybmFtZSgpLCAncicpCisgICAgZGVmIHRlc3RfY29tcGFyZV9tZW1iZXJzKHNlbGYpOgorICAgICAgICB0YXIxID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUpCisgICAgICAgIHRhcjIgPSBzZWxmLnRhcgogCi0gICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICB0MSA9IHRhci5uZXh0KCkKLSAgICAgICAgICAgIHQyID0gc3RyZWFtLm5leHQoKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdDEgPSB0YXIxLm5leHQoKQorICAgICAgICAgICAgdDIgPSB0YXIyLm5leHQoKQogICAgICAgICAgICAgaWYgdDEgaXMgTm9uZToKICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHQyIGlzIG5vdCBOb25lLCAic3RyZWFtLm5leHQoKSBmYWlsZWQuIikKIAogICAgICAgICAgICAgaWYgdDIuaXNsbmsoKSBvciB0Mi5pc3N5bSgpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuU3RyZWFtRXJyb3IsIHN0cmVhbS5leHRyYWN0ZmlsZSwgdDIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5TdHJlYW1FcnJvciwgdGFyMi5leHRyYWN0ZmlsZSwgdDIpCiAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIHYxID0gdGFyLmV4dHJhY3RmaWxlKHQxKQotICAgICAgICAgICAgdjIgPSBzdHJlYW0uZXh0cmFjdGZpbGUodDIpCisKKyAgICAgICAgICAgIHYxID0gdGFyMS5leHRyYWN0ZmlsZSh0MSkKKyAgICAgICAgICAgIHYyID0gdGFyMi5leHRyYWN0ZmlsZSh0MikKICAgICAgICAgICAgIGlmIHYxIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2MiBpcyBub3QgTm9uZSwgInN0cmVhbS5leHRyYWN0ZmlsZSgpIGZhaWxlZCIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydF8odjEucmVhZCgpID09IHYyLnJlYWQoKSwgInN0cmVhbSBleHRyYWN0aW9uIGZhaWxlZCIpCiAKLSAgICAgICAgdGFyLmNsb3NlKCkKLSAgICAgICAgc3RyZWFtLmNsb3NlKCkKLQotY2xhc3MgUmVhZERldGVjdFRlc3QoUmVhZFRlc3QpOgotCi0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLnRhciA9IHRhcmZpbGUub3Blbih0YXJuYW1lKHNlbGYuY29tcCksIHNlbGYubW9kZSkKLQotY2xhc3MgUmVhZERldGVjdEZpbGVvYmpUZXN0KFJlYWRUZXN0KToKLQotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgbmFtZSA9IHRhcm5hbWUoc2VsZi5jb21wKQotICAgICAgICBzZWxmLnRhciA9IHRhcmZpbGUub3BlbihuYW1lLCBtb2RlPXNlbGYubW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW9iaj1vcGVuKG5hbWUsICJyYiIpKQotCi1jbGFzcyBSZWFkQXN0ZXJpc2tUZXN0KFJlYWRUZXN0KToKLQotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgbW9kZSA9IHNlbGYubW9kZSArIHNlbGYuc2VwICsgIioiCi0gICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUoc2VsZi5jb21wKSwgbW9kZSkKLQotY2xhc3MgUmVhZFN0cmVhbUFzdGVyaXNrVGVzdChSZWFkU3RyZWFtVGVzdCk6Ci0KLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIG1vZGUgPSBzZWxmLm1vZGUgKyBzZWxmLnNlcCArICIqIgotICAgICAgICBzZWxmLnRhciA9IHRhcmZpbGUub3Blbih0YXJuYW1lKHNlbGYuY29tcCksIG1vZGUpCi0KLWNsYXNzIFdyaXRlVGVzdChCYXNlVGVzdCk6Ci0gICAgbW9kZSA9ICd3JwotCi0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBtb2RlID0gc2VsZi5tb2RlICsgc2VsZi5zZXAgKyBzZWxmLmNvbXAKLSAgICAgICAgc2VsZi5zcmMgPSB0YXJmaWxlLm9wZW4odGFybmFtZShzZWxmLmNvbXApLCAncicpCi0gICAgICAgIHNlbGYuZHN0bmFtZSA9IHRtcG5hbWUoKQotICAgICAgICBzZWxmLmRzdCA9IHRhcmZpbGUub3BlbihzZWxmLmRzdG5hbWUsIG1vZGUpCi0KLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIHNlbGYuc3JjLmNsb3NlKCkKLSAgICAgICAgc2VsZi5kc3QuY2xvc2UoKQotCi0gICAgZGVmIHRlc3RfcG9zaXgoc2VsZik6Ci0gICAgICAgIHNlbGYuZHN0LnBvc2l4ID0gMQotICAgICAgICBzZWxmLl90ZXN0KCkKLQotICAgIGRlZiB0ZXN0X25vbnBvc2l4KHNlbGYpOgotICAgICAgICBzZWxmLmRzdC5wb3NpeCA9IDAKLSAgICAgICAgc2VsZi5fdGVzdCgpCi0KLSAgICBkZWYgdGVzdF9zbWFsbChzZWxmKToKLSAgICAgICAgc2VsZi5kc3QuYWRkKG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCJjZmdwYXJzZXIuMSIpKQotICAgICAgICBzZWxmLmRzdC5jbG9zZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwob3Muc3RhdChzZWxmLmRzdG5hbWUpLnN0X3NpemUsIDApCi0KLSAgICBkZWYgX3Rlc3Qoc2VsZik6Ci0gICAgICAgIGZvciB0YXJpbmZvIGluIHNlbGYuc3JjOgotICAgICAgICAgICAgaWYgbm90IHRhcmluZm8uaXNyZWcoKToKLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgZiA9IHNlbGYuc3JjLmV4dHJhY3RmaWxlKHRhcmluZm8pCi0gICAgICAgICAgICBpZiBzZWxmLmRzdC5wb3NpeCBhbmQgbGVuKHRhcmluZm8ubmFtZSkgPiB0YXJmaWxlLkxFTkdUSF9OQU1FIGFuZCAiLyIgbm90IGluIHRhcmluZm8ubmFtZToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmRzdC5hZGRmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mbywgZikKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5kc3QuYWRkZmlsZSh0YXJpbmZvLCBmKQotCi0gICAgZGVmIHRlc3RfYWRkX3NlbGYoc2VsZik6Ci0gICAgICAgIGRzdG5hbWUgPSBvcy5wYXRoLmFic3BhdGgoc2VsZi5kc3RuYW1lKQotCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kc3QubmFtZSwgZHN0bmFtZSwgImFyY2hpdmUgbmFtZSBtdXN0IGJlIGFic29sdXRlIikKLQotICAgICAgICBzZWxmLmRzdC5hZGQoZHN0bmFtZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRzdC5nZXRuYW1lcygpLCBbXSwgImFkZGVkIHRoZSBhcmNoaXZlIHRvIGl0c2VsZiIpCi0KLSAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKLSAgICAgICAgb3MuY2hkaXIoZGlybmFtZSgpKQotICAgICAgICBzZWxmLmRzdC5hZGQoZHN0bmFtZSkKLSAgICAgICAgb3MuY2hkaXIoY3dkKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZHN0LmdldG5hbWVzKCksIFtdLCAiYWRkZWQgdGhlIGFyY2hpdmUgdG8gaXRzZWxmIikKKyAgICAgICAgdGFyMS5jbG9zZSgpCiAKIAotY2xhc3MgQXBwZW5kVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgIyBUZXN0IGFwcGVuZCBtb2RlIChjcC4gcGF0Y2ggIzE2NTI2ODEpLgorY2xhc3MgRGV0ZWN0UmVhZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCi0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLnRhcm5hbWUgPSB0bXBuYW1lKCkKLSAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi50YXJuYW1lKToKLSAgICAgICAgICAgIG9zLnJlbW92ZShzZWxmLnRhcm5hbWUpCisgICAgZGVmIF90ZXN0ZnVuY19maWxlKHNlbGYsIG5hbWUsIG1vZGUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXJmaWxlLm9wZW4obmFtZSwgbW9kZSkKKyAgICAgICAgZXhjZXB0IHRhcmZpbGUuUmVhZEVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCkKIAotICAgIGRlZiBfYWRkX3Rlc3RmaWxlKHNlbGYsIGZpbGVvYmo9Tm9uZSk6Ci0gICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihzZWxmLnRhcm5hbWUsICJhIiwgZmlsZW9iaj1maWxlb2JqKQotICAgICAgICB0YXIuYWRkZmlsZSh0YXJmaWxlLlRhckluZm8oImJhciIpKQorICAgIGRlZiBfdGVzdGZ1bmNfZmlsZW9iaihzZWxmLCBuYW1lLCBtb2RlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFyZmlsZS5vcGVuKG5hbWUsIG1vZGUsIGZpbGVvYmo9b3BlbihuYW1lLCAicmIiKSkKKyAgICAgICAgZXhjZXB0IHRhcmZpbGUuUmVhZEVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKworICAgIGRlZiBfdGVzdF9tb2RlcyhzZWxmLCB0ZXN0ZnVuYyk6CisgICAgICAgIHRlc3RmdW5jKHRhcm5hbWUsICJyIikKKyAgICAgICAgdGVzdGZ1bmModGFybmFtZSwgInI6IikKKyAgICAgICAgdGVzdGZ1bmModGFybmFtZSwgInI6KiIpCisgICAgICAgIHRlc3RmdW5jKHRhcm5hbWUsICJyfCIpCisgICAgICAgIHRlc3RmdW5jKHRhcm5hbWUsICJyfCoiKQorCisgICAgICAgIGlmIGd6aXA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0YXJuYW1lLCBtb2RlPSJyOmd6IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRhcm5hbWUsIG1vZGU9InJ8Z3oiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgZ3ppcG5hbWUsIG1vZGU9InI6IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIGd6aXBuYW1lLCBtb2RlPSJyfCIpCisKKyAgICAgICAgICAgIHRlc3RmdW5jKGd6aXBuYW1lLCAiciIpCisgICAgICAgICAgICB0ZXN0ZnVuYyhnemlwbmFtZSwgInI6KiIpCisgICAgICAgICAgICB0ZXN0ZnVuYyhnemlwbmFtZSwgInI6Z3oiKQorICAgICAgICAgICAgdGVzdGZ1bmMoZ3ppcG5hbWUsICJyfCoiKQorICAgICAgICAgICAgdGVzdGZ1bmMoZ3ppcG5hbWUsICJyfGd6IikKKworICAgICAgICBpZiBiejI6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0YXJuYW1lLCBtb2RlPSJyOmJ6MiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0YXJuYW1lLCBtb2RlPSJyfGJ6MiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBiejJuYW1lLCBtb2RlPSJyOiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBiejJuYW1lLCBtb2RlPSJyfCIpCisKKyAgICAgICAgICAgIHRlc3RmdW5jKGJ6Mm5hbWUsICJyIikKKyAgICAgICAgICAgIHRlc3RmdW5jKGJ6Mm5hbWUsICJyOioiKQorICAgICAgICAgICAgdGVzdGZ1bmMoYnoybmFtZSwgInI6YnoyIikKKyAgICAgICAgICAgIHRlc3RmdW5jKGJ6Mm5hbWUsICJyfCoiKQorICAgICAgICAgICAgdGVzdGZ1bmMoYnoybmFtZSwgInJ8YnoyIikKKworICAgIGRlZiB0ZXN0X2RldGVjdF9maWxlKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X21vZGVzKHNlbGYuX3Rlc3RmdW5jX2ZpbGUpCisKKyAgICBkZWYgdGVzdF9kZXRlY3RfZmlsZW9iaihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9tb2RlcyhzZWxmLl90ZXN0ZnVuY19maWxlb2JqKQorCisKK2NsYXNzIE1lbWJlclJlYWRUZXN0KFJlYWRUZXN0KToKKworICAgIGRlZiBfdGVzdF9tZW1iZXIoc2VsZiwgdGFyaW5mbywgY2hrc3VtPU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgaWYgY2hrc3VtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1kNXN1bShzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKS5yZWFkKCkpID09IGNoa3N1bSwKKyAgICAgICAgICAgICAgICAgICAgIndyb25nIG1kNXN1bSBmb3IgJXMiICUgdGFyaW5mby5uYW1lKQorCisgICAgICAgIGt3YXJnc1sibXRpbWUiXSA9IDA3NjA2MTM2NjE3CisgICAgICAgIGt3YXJnc1sidWlkIl0gPSAxMDAwCisgICAgICAgIGt3YXJnc1siZ2lkIl0gPSAxMDAKKyAgICAgICAgaWYgIm9sZC12NyIgbm90IGluIHRhcmluZm8ubmFtZToKKyAgICAgICAgICAgICMgVjcgdGFyIGNhbid0IGhhbmRsZSBhbHBoYWJldGljIG93bmVycy4KKyAgICAgICAgICAgIGt3YXJnc1sidW5hbWUiXSA9ICJ0YXJmaWxlIgorICAgICAgICAgICAga3dhcmdzWyJnbmFtZSJdID0gInRhcmZpbGUiCisgICAgICAgIGZvciBrLCB2IGluIGt3YXJncy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhnZXRhdHRyKHRhcmluZm8sIGspID09IHYsCisgICAgICAgICAgICAgICAgICAgICJ3cm9uZyB2YWx1ZSBpbiAlcyBmaWVsZCBvZiAlcyIgJSAoaywgdGFyaW5mby5uYW1lKSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfcmVndHlwZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvcmVndHlwZSIpCisgICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9NzAxMSwgY2hrc3VtPW1kNV9yZWd0eXBlKQorCisgICAgZGVmIHRlc3RfZmluZF9jb250dHlwZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvY29udHR5cGUiKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTcwMTEsIGNoa3N1bT1tZDVfcmVndHlwZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfZGlydHlwZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvZGlydHlwZSIpCisgICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9MCkKKworICAgIGRlZiB0ZXN0X2ZpbmRfZGlydHlwZV93aXRoX3NpemUoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL2RpcnR5cGUtd2l0aC1zaXplIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT0yNTUpCisKKyAgICBkZWYgdGVzdF9maW5kX2xua3R5cGUoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL2xua3R5cGUiKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTAsIGxpbmtuYW1lPSJ1c3Rhci9yZWd0eXBlIikKKworICAgIGRlZiB0ZXN0X2ZpbmRfc3ltdHlwZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvc3ltdHlwZSIpCisgICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9MCwgbGlua25hbWU9InJlZ3R5cGUiKQorCisgICAgZGVmIHRlc3RfZmluZF9ibGt0eXBlKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9ibGt0eXBlIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT0wLCBkZXZtYWpvcj0zLCBkZXZtaW5vcj0wKQorCisgICAgZGVmIHRlc3RfZmluZF9jaHJ0eXBlKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9jaHJ0eXBlIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT0wLCBkZXZtYWpvcj0xLCBkZXZtaW5vcj0zKQorCisgICAgZGVmIHRlc3RfZmluZF9maWZvdHlwZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvZmlmb3R5cGUiKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTApCisKKyAgICBkZWYgdGVzdF9maW5kX3NwYXJzZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvc3BhcnNlIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT04NjAxNiwgY2hrc3VtPW1kNV9zcGFyc2UpCisKKyAgICBkZWYgdGVzdF9maW5kX3VtbGF1dHMoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3VtbGF1dHMtxNbc5Pb83yIpCisgICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9NzAxMSwgY2hrc3VtPW1kNV9yZWd0eXBlKQorCisgICAgZGVmIHRlc3RfZmluZF91c3Rhcl9sb25nbmFtZShzZWxmKToKKyAgICAgICAgbmFtZSA9ICJ1c3Rhci8iICsgIjEyMzQ1LyIgKiAzOSArICIxMjM0NTY3L2xvbmduYW1lIgorICAgICAgICBzZWxmLmFzc2VydF8obmFtZSBpbiBzZWxmLnRhci5nZXRuYW1lcygpKQorCisgICAgZGVmIHRlc3RfZmluZF9yZWd0eXBlX29sZHY3KHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJtaXNjL3JlZ3R5cGUtb2xkLXY3IikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT03MDExLCBjaGtzdW09bWQ1X3JlZ3R5cGUpCisKKyAgICBkZWYgdGVzdF9maW5kX3BheF91bWxhdXRzKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJwYXgvdW1sYXV0cy3E1tzk9vzfIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT03MDExLCBjaGtzdW09bWQ1X3JlZ3R5cGUpCisKKworY2xhc3MgTG9uZ25hbWVUZXN0KFJlYWRUZXN0KToKKworICAgIGRlZiB0ZXN0X3JlYWRfbG9uZ25hbWUoc2VsZik6CisgICAgICAgICMgVGVzdCByZWFkaW5nIG9mIGxvbmduYW1lIChidWcgIzE0NzE0MjcpLgorICAgICAgICBuYW1lID0gc2VsZi5zdWJkaXIgKyAiLyIgKyAiMTIzLyIgKiAxMjUgKyAibG9uZ25hbWUiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIobmFtZSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJsb25nbmFtZSBub3QgZm91bmQiKQorICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mby50eXBlICE9IHRhcmZpbGUuRElSVFlQRSwgInJlYWQgbG9uZ25hbWUgYXMgZGlydHlwZSIpCisKKyAgICBkZWYgdGVzdF9yZWFkX2xvbmdsaW5rKHNlbGYpOgorICAgICAgICBsb25nbmFtZSA9IHNlbGYuc3ViZGlyICsgIi8iICsgIjEyMy8iICogMTI1ICsgImxvbmduYW1lIgorICAgICAgICBsb25nbGluayA9IHNlbGYuc3ViZGlyICsgIi8iICsgIjEyMy8iICogMTI1ICsgImxvbmdsaW5rIgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKGxvbmdsaW5rKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBzZWxmLmZhaWwoImxvbmdsaW5rIG5vdCBmb3VuZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLmxpbmtuYW1lID09IGxvbmduYW1lLCAibGlua25hbWUgd3JvbmciKQorCisgICAgZGVmIHRlc3RfdHJ1bmNhdGVkX2xvbmduYW1lKHNlbGYpOgorICAgICAgICBsb25nbmFtZSA9IHNlbGYuc3ViZGlyICsgIi8iICsgIjEyMy8iICogMTI1ICsgImxvbmduYW1lIgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKGxvbmduYW1lKQorICAgICAgICBvZmZzZXQgPSB0YXJpbmZvLm9mZnNldAorICAgICAgICBzZWxmLnRhci5maWxlb2JqLnNlZWsob2Zmc2V0KQorICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oc2VsZi50YXIuZmlsZW9iai5yZWFkKDE1MzYpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBuYW1lPSJmb28udGFyIiwgZmlsZW9iaj1mb2JqKQorCisKK2NsYXNzIEdOVVJlYWRUZXN0KExvbmduYW1lVGVzdCk6CisKKyAgICBzdWJkaXIgPSAiZ251IgorCisgICAgZGVmIHRlc3Rfc3BhcnNlX2ZpbGUoc2VsZik6CisgICAgICAgIHRhcmluZm8xID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9zcGFyc2UiKQorICAgICAgICBmb2JqMSA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8xKQorICAgICAgICB0YXJpbmZvMiA9IHNlbGYudGFyLmdldG1lbWJlcigiZ251L3NwYXJzZSIpCisgICAgICAgIGZvYmoyID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbzIpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2JqMS5yZWFkKCkgPT0gZm9iajIucmVhZCgpLAorICAgICAgICAgICAgICAgICJzcGFyc2UgZmlsZSBleHRyYWN0aW9uIGZhaWxlZCIpCisKKworY2xhc3MgUGF4UmVhZFRlc3QoUmVhZFRlc3QpOgorCisgICAgc3ViZGlyID0gInBheCIKKworICAgIGRlZiB0ZXN0X3BheF9nbG9iaGVhZGVycyhzZWxmKToKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUpCisgICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0bWVtYmVyKCJwYXgvcmVndHlwZTEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udW5hbWUsICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uZ25hbWUsICJiYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ucGF4X2hlYWRlcnMuZ2V0KCJWRU5ET1IudW1sYXV0cyIpLCAixNbc5Pb83yIpCisKKyAgICAgICAgdGFyaW5mbyA9IHRhci5nZXRtZW1iZXIoInBheC9yZWd0eXBlMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51bmFtZSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5nbmFtZSwgImJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5wYXhfaGVhZGVycy5nZXQoIlZFTkRPUi51bWxhdXRzIiksICLE1tzk9vzfIikKKworICAgICAgICB0YXJpbmZvID0gdGFyLmdldG1lbWJlcigicGF4L3JlZ3R5cGUzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnVuYW1lLCAidGFyZmlsZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5nbmFtZSwgInRhcmZpbGUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ucGF4X2hlYWRlcnMuZ2V0KCJWRU5ET1IudW1sYXV0cyIpLCAixNbc5Pb83yIpCisKKworY2xhc3MgV3JpdGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIG1vZGUgPSAidzoiCisKKyAgICBkZWYgdGVzdF8xMDBfY2hhcl9uYW1lKHNlbGYpOgorICAgICAgICAjIFRoZSBuYW1lIGZpZWxkIGluIGEgdGFyIGhlYWRlciBzdG9yZXMgc3RyaW5ncyBvZiBhdCBtb3N0IDEwMCBjaGFycy4KKyAgICAgICAgIyBJZiBhIHN0cmluZyBpcyBzaG9ydGVyIHRoYW4gMTAwIGNoYXJzIGl0IGhhcyB0byBiZSBwYWRkZWQgd2l0aCAnXDAnLAorICAgICAgICAjIHdoaWNoIGltcGxpZXMgdGhhdCBhIHN0cmluZyBvZiBleGFjdGx5IDEwMCBjaGFycyBpcyBzdG9yZWQgd2l0aG91dAorICAgICAgICAjIGEgdHJhaWxpbmcgJ1wwJy4KKyAgICAgICAgbmFtZSA9ICIwMTIzNDU2Nzg5IiAqIDEwCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCisgICAgICAgIHQgPSB0YXJmaWxlLlRhckluZm8obmFtZSkKKyAgICAgICAgdGFyLmFkZGZpbGUodCkKICAgICAgICAgdGFyLmNsb3NlKCkKIAotICAgIGRlZiBfY3JlYXRlX3Rlc3R0YXIoc2VsZik6Ci0gICAgICAgIHNyYyA9IHRhcmZpbGUub3Blbih0YXJuYW1lKCkpCi0gICAgICAgIHQgPSBzcmMuZ2V0bWVtYmVyKCIwLVJFR1RZUEUiKQotICAgICAgICB0Lm5hbWUgPSAiZm9vIgotICAgICAgICBmID0gc3JjLmV4dHJhY3RmaWxlKHQpCi0gICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihzZWxmLnRhcm5hbWUsICJ3IikKLSAgICAgICAgdGFyLmFkZGZpbGUodCwgZikKLSAgICAgICAgdGFyLmNsb3NlKCkKLQotICAgIGRlZiBfdGVzdChzZWxmLCBuYW1lcz1bImJhciJdLCBmaWxlb2JqPU5vbmUpOgotICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lLCBmaWxlb2JqPWZpbGVvYmopCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXIuZ2V0bmFtZXMoKSA9PSBuYW1lcykKLQotICAgIGRlZiB0ZXN0X25vbl9leGlzdGluZyhzZWxmKToKLSAgICAgICAgc2VsZi5fYWRkX3Rlc3RmaWxlKCkKLSAgICAgICAgc2VsZi5fdGVzdCgpCi0KLSAgICBkZWYgdGVzdF9lbXB0eShzZWxmKToKLSAgICAgICAgb3BlbihzZWxmLnRhcm5hbWUsICJ3YiIpLmNsb3NlKCkKLSAgICAgICAgc2VsZi5fYWRkX3Rlc3RmaWxlKCkKLSAgICAgICAgc2VsZi5fdGVzdCgpCi0KLSAgICBkZWYgdGVzdF9lbXB0eV9maWxlb2JqKHNlbGYpOgotICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oKQotICAgICAgICBzZWxmLl9hZGRfdGVzdGZpbGUoZm9iaikKLSAgICAgICAgZm9iai5zZWVrKDApCi0gICAgICAgIHNlbGYuX3Rlc3QoZmlsZW9iaj1mb2JqKQotCi0gICAgZGVmIHRlc3RfZmlsZW9iaihzZWxmKToKLSAgICAgICAgc2VsZi5fY3JlYXRlX3Rlc3R0YXIoKQotICAgICAgICBkYXRhID0gb3BlbihzZWxmLnRhcm5hbWUsICJyYiIpLnJlYWQoKQotICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oZGF0YSkKLSAgICAgICAgc2VsZi5fYWRkX3Rlc3RmaWxlKGZvYmopCi0gICAgICAgIGZvYmouc2VlaygwKQotICAgICAgICBzZWxmLl90ZXN0KG5hbWVzPVsiZm9vIiwgImJhciJdLCBmaWxlb2JqPWZvYmopCi0KLSAgICBkZWYgdGVzdF9leGlzdGluZyhzZWxmKToKLSAgICAgICAgc2VsZi5fY3JlYXRlX3Rlc3R0YXIoKQotICAgICAgICBzZWxmLl9hZGRfdGVzdGZpbGUoKQotICAgICAgICBzZWxmLl90ZXN0KG5hbWVzPVsiZm9vIiwgImJhciJdKQotCi0KLWNsYXNzIFdyaXRlMTAwVGVzdChCYXNlVGVzdCk6Ci0gICAgIyBUaGUgbmFtZSBmaWVsZCBpbiBhIHRhciBoZWFkZXIgc3RvcmVzIHN0cmluZ3Mgb2YgYXQgbW9zdCAxMDAgY2hhcnMuCi0gICAgIyBJZiBhIHN0cmluZyBpcyBzaG9ydGVyIHRoYW4gMTAwIGNoYXJzIGl0IGhhcyB0byBiZSBwYWRkZWQgd2l0aCAnXDAnLAotICAgICMgd2hpY2ggaW1wbGllcyB0aGF0IGEgc3RyaW5nIG9mIGV4YWN0bHkgMTAwIGNoYXJzIGlzIHN0b3JlZCB3aXRob3V0Ci0gICAgIyBhIHRyYWlsaW5nICdcMCcuCi0KLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYubmFtZSA9ICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKLSAgICAgICAgc2VsZi5uYW1lICs9ICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKLQotICAgICAgICBzZWxmLnRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKCksICJ3IikKLSAgICAgICAgdCA9IHRhcmZpbGUuVGFySW5mbyhzZWxmLm5hbWUpCi0gICAgICAgIHNlbGYudGFyLmFkZGZpbGUodCkKLSAgICAgICAgc2VsZi50YXIuY2xvc2UoKQotCi0gICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUoKSkKLQotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgc2VsZi50YXIuY2xvc2UoKQotCi0gICAgZGVmIHRlc3Qoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50YXIuZ2V0bmFtZXMoKVswXSwgc2VsZi5uYW1lLAorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHRhci5nZXRuYW1lcygpWzBdID09IG5hbWUsCiAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBzdG9yZSAxMDAgY2hhciBmaWxlbmFtZSIpCisgICAgICAgIHRhci5jbG9zZSgpCiAKKyAgICBkZWYgdGVzdF90YXJfc2l6ZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBidWcgIzEwMTM4ODIuCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImZpbGUiKQorICAgICAgICBmb2JqID0gb3BlbihwYXRoLCAid2IiKQorICAgICAgICBmb2JqLndyaXRlKCJhYWEiKQorICAgICAgICBmb2JqLmNsb3NlKCkKKyAgICAgICAgdGFyLmFkZChwYXRoKQorICAgICAgICB0YXIuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5nZXRzaXplKHRtcG5hbWUpID4gMCwKKyAgICAgICAgICAgICAgICAidGFyZmlsZSBpcyBlbXB0eSIpCiAKLWNsYXNzIFdyaXRlU2l6ZTBUZXN0KEJhc2VUZXN0KToKLSAgICBtb2RlID0gJ3cnCisgICAgIyBUaGUgdGVzdF8qX3NpemUgdGVzdHMgdGVzdCBmb3IgYnVnICMxMTY3MTI4LgorICAgIGRlZiB0ZXN0X2ZpbGVfc2l6ZShzZWxmKToKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKIAotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi50bXBkaXIgPSBkaXJuYW1lKCkKLSAgICAgICAgc2VsZi5kc3RuYW1lID0gdG1wbmFtZSgpCi0gICAgICAgIHNlbGYuZHN0ID0gdGFyZmlsZS5vcGVuKHNlbGYuZHN0bmFtZSwgInciKQotCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICBzZWxmLmRzdC5jbG9zZSgpCi0KLSAgICBkZWYgdGVzdF9maWxlKHNlbGYpOgotICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYudG1wZGlyLCAiZmlsZSIpCi0gICAgICAgIGYgPSBvcGVuKHBhdGgsICJ3IikKLSAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgIHRhcmluZm8gPSBzZWxmLmRzdC5nZXR0YXJpbmZvKHBhdGgpCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImZpbGUiKQorICAgICAgICBmb2JqID0gb3BlbihwYXRoLCAid2IiKQorICAgICAgICBmb2JqLmNsb3NlKCkKKyAgICAgICAgdGFyaW5mbyA9IHRhci5nZXR0YXJpbmZvKHBhdGgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5zaXplLCAwKQotICAgICAgICBmID0gb3BlbihwYXRoLCAidyIpCi0gICAgICAgIGYud3JpdGUoImFhYSIpCi0gICAgICAgIGYuY2xvc2UoKQotICAgICAgICB0YXJpbmZvID0gc2VsZi5kc3QuZ2V0dGFyaW5mbyhwYXRoKQorCisgICAgICAgIGZvYmogPSBvcGVuKHBhdGgsICJ3YiIpCisgICAgICAgIGZvYmoud3JpdGUoImFhYSIpCisgICAgICAgIGZvYmouY2xvc2UoKQorICAgICAgICB0YXJpbmZvID0gdGFyLmdldHRhcmluZm8ocGF0aCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnNpemUsIDMpCiAKLSAgICBkZWYgdGVzdF9kaXJlY3Rvcnkoc2VsZik6Ci0gICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi50bXBkaXIsICJkaXJlY3RvcnkiKQotICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLSAgICAgICAgICAgICMgVGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5LCBidXQgaXMgPHdpbms+IGlmIGEgcHJldmlvdXMKLSAgICAgICAgICAgICMgcnVuIHdhcyBraWxsZWQgaW4gbWlkLXN0cmVhbS4KLSAgICAgICAgICAgIHNodXRpbC5ybXRyZWUocGF0aCkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2RpcmVjdG9yeV9zaXplKHNlbGYpOgorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJkaXJlY3RvcnkiKQogICAgICAgICBvcy5ta2RpcihwYXRoKQotICAgICAgICB0YXJpbmZvID0gc2VsZi5kc3QuZ2V0dGFyaW5mbyhwYXRoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uc2l6ZSwgMCkKLQotICAgIGRlZiB0ZXN0X3N5bWxpbmsoc2VsZik6Ci0gICAgICAgIGlmIGhhc2F0dHIob3MsICJzeW1saW5rIik6Ci0gICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYudG1wZGlyLCAic3ltbGluayIpCi0gICAgICAgICAgICBvcy5zeW1saW5rKCJsaW5rX3RhcmdldCIsIHBhdGgpCi0gICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5kc3QuZ2V0dGFyaW5mbyhwYXRoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQorICAgICAgICAgICAgdGFyaW5mbyA9IHRhci5nZXR0YXJpbmZvKHBhdGgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uc2l6ZSwgMCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnJtZGlyKHBhdGgpCisKKyAgICBkZWYgdGVzdF9saW5rX3NpemUoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIob3MsICJsaW5rIik6CisgICAgICAgICAgICBsaW5rID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJsaW5rIikKKyAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihURU1QRElSLCAibGlua190YXJnZXQiKQorICAgICAgICAgICAgb3Blbih0YXJnZXQsICJ3YiIpLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLmxpbmsodGFyZ2V0LCBsaW5rKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCisgICAgICAgICAgICAgICAgdGFyaW5mbyA9IHRhci5nZXR0YXJpbmZvKGxpbmspCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnNpemUsIDApCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh0YXJnZXQpCisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGxpbmspCisKKyAgICBkZWYgdGVzdF9zeW1saW5rX3NpemUoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIob3MsICJzeW1saW5rIik6CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJzeW1saW5rIikKKyAgICAgICAgICAgIG9zLnN5bWxpbmsoImxpbmtfdGFyZ2V0IiwgcGF0aCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQorICAgICAgICAgICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0dGFyaW5mbyhwYXRoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5zaXplLCAwKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUocGF0aCkKKworICAgIGRlZiB0ZXN0X2FkZF9zZWxmKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yICMxMjU3MjU1LgorICAgICAgICBkc3RuYW1lID0gb3MucGF0aC5hYnNwYXRoKHRtcG5hbWUpCisKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHRhci5uYW1lID09IGRzdG5hbWUsICJhcmNoaXZlIG5hbWUgbXVzdCBiZSBhYnNvbHV0ZSIpCisKKyAgICAgICAgdGFyLmFkZChkc3RuYW1lKQorICAgICAgICBzZWxmLmFzc2VydF8odGFyLmdldG5hbWVzKCkgPT0gW10sICJhZGRlZCB0aGUgYXJjaGl2ZSB0byBpdHNlbGYiKQorCisgICAgICAgIGN3ZCA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKFRFTVBESVIpCisgICAgICAgIHRhci5hZGQoZHN0bmFtZSkKKyAgICAgICAgb3MuY2hkaXIoY3dkKQorICAgICAgICBzZWxmLmFzc2VydF8odGFyLmdldG5hbWVzKCkgPT0gW10sICJhZGRlZCB0aGUgYXJjaGl2ZSB0byBpdHNlbGYiKQogCiAKLWNsYXNzIFdyaXRlU3RyZWFtVGVzdChXcml0ZVRlc3QpOgotICAgIHNlcCA9ICd8JworY2xhc3MgU3RyZWFtV3JpdGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotICAgIGRlZiB0ZXN0X3BhZGRpbmcoc2VsZik6Ci0gICAgICAgIHNlbGYuZHN0LmNsb3NlKCkKKyAgICBtb2RlID0gInd8IgogCi0gICAgICAgIGlmIHNlbGYuY29tcCA9PSAiZ3oiOgotICAgICAgICAgICAgZiA9IGd6aXAuR3ppcEZpbGUoc2VsZi5kc3RuYW1lKQotICAgICAgICAgICAgcyA9IGYucmVhZCgpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgZWxpZiBzZWxmLmNvbXAgPT0gImJ6MiI6Ci0gICAgICAgICAgICBmID0gYnoyLkJaMkRlY29tcHJlc3NvcigpCi0gICAgICAgICAgICBzID0gZmlsZShzZWxmLmRzdG5hbWUpLnJlYWQoKQotICAgICAgICAgICAgcyA9IGYuZGVjb21wcmVzcyhzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZi51bnVzZWRfZGF0YSksIDAsICJ0cmFpbGluZyBkYXRhIikKKyAgICBkZWYgdGVzdF9zdHJlYW1fcGFkZGluZyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBidWcgIzE1NDMzMDMuCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgaWYgc2VsZi5tb2RlLmVuZHN3aXRoKCJneiIpOgorICAgICAgICAgICAgZm9iaiA9IGd6aXAuR3ppcEZpbGUodG1wbmFtZSkKKyAgICAgICAgICAgIGRhdGEgPSBmb2JqLnJlYWQoKQorICAgICAgICAgICAgZm9iai5jbG9zZSgpCisgICAgICAgIGVsaWYgc2VsZi5tb2RlLmVuZHN3aXRoKCJiejIiKToKKyAgICAgICAgICAgIGRlYyA9IGJ6Mi5CWjJEZWNvbXByZXNzb3IoKQorICAgICAgICAgICAgZGF0YSA9IG9wZW4odG1wbmFtZSwgInJiIikucmVhZCgpCisgICAgICAgICAgICBkYXRhID0gZGVjLmRlY29tcHJlc3MoZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZGVjLnVudXNlZF9kYXRhKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAiZm91bmQgdHJhaWxpbmcgZGF0YSIpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBmID0gZmlsZShzZWxmLmRzdG5hbWUpCi0gICAgICAgICAgICBzID0gZi5yZWFkKCkKLSAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZm9iaiA9IG9wZW4odG1wbmFtZSwgInJiIikKKyAgICAgICAgICAgIGRhdGEgPSBmb2JqLnJlYWQoKQorICAgICAgICAgICAgZm9iai5jbG9zZSgpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCJcMCIpLCB0YXJmaWxlLlJFQ09SRFNJWkUsCisgICAgICAgIHNlbGYuYXNzZXJ0XyhkYXRhLmNvdW50KCJcMCIpID09IHRhcmZpbGUuUkVDT1JEU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb3JyZWN0IHplcm8gcGFkZGluZyIpCiAKIAotY2xhc3MgV3JpdGVHTlVMb25nVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgIiIiVGhpcyB0ZXN0Y2FzZSBjaGVja3MgZm9yIGNvcnJlY3QgY3JlYXRpb24gb2YgR05VIExvbmduYW1lCi0gICAgICAgYW5kIExvbmdsaW5rIGV4dGVuc2lvbnMuCi0KLSAgICAgICBJdCBjcmVhdGVzIGEgdGFyZmlsZSBhbmQgYWRkcyBlbXB0eSBtZW1iZXJzIHdpdGggZWl0aGVyCi0gICAgICAgbG9uZyBuYW1lcywgbG9uZyBsaW5rbmFtZXMgb3IgYm90aCBhbmQgY29tcGFyZXMgdGhlIHNpemUKLSAgICAgICBvZiB0aGUgdGFyZmlsZSB3aXRoIHRoZSBleHBlY3RlZCBzaXplLgotCi0gICAgICAgSXQgY2hlY2tzIGZvciBTRiBidWcgIzgxMjMyNSBpbiBUYXJGaWxlLl9jcmVhdGVfZ251bG9uZygpLgotCi0gICAgICAgV2hpbGUgSSB3YXMgd3JpdGluZyB0aGlzIHRlc3RjYXNlLCBJIG5vdGljZWQgYSBzZWNvbmQgYnVnCi0gICAgICAgaW4gdGhlIHNhbWUgbWV0aG9kOgotICAgICAgIExvbmd7bmFtZXMsbGlua3N9IHdlcmVuJ3QgbnVsbC10ZXJtaW5hdGVkIHdoaWNoIGxlYWQgdG8KLSAgICAgICBiYWQgdGFyZmlsZXMgd2hlbiB0aGVpciBsZW5ndGggd2FzIGEgbXVsdGlwbGUgb2YgNTEyLiBUaGlzCi0gICAgICAgaXMgdGVzdGVkIGFzIHdlbGwuCi0gICAgIiIiCitjbGFzcyBHTlVXcml0ZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGhpcyB0ZXN0Y2FzZSBjaGVja3MgZm9yIGNvcnJlY3QgY3JlYXRpb24gb2YgR05VIExvbmduYW1lCisgICAgIyBhbmQgTG9uZ2xpbmsgZXh0ZW5kZWQgaGVhZGVycyAoY3AuIGJ1ZyAjODEyMzI1KS4KIAogICAgIGRlZiBfbGVuZ3RoKHNlbGYsIHMpOgogICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChsZW4ocykgKyAxLCA1MTIpCkBAIC00NzQsMTkgKzU3MiwxNyBAQAogICAgICAgICByZXR1cm4gYmxvY2tzICogNTEyCiAKICAgICBkZWYgX2NhbGNfc2l6ZShzZWxmLCBuYW1lLCBsaW5rPU5vbmUpOgotICAgICAgICAjIGluaXRpYWwgdGFyIGhlYWRlcgorICAgICAgICAjIEluaXRpYWwgdGFyIGhlYWRlcgogICAgICAgICBjb3VudCA9IDUxMgogCiAgICAgICAgIGlmIGxlbihuYW1lKSA+IHRhcmZpbGUuTEVOR1RIX05BTUU6Ci0gICAgICAgICAgICAjIGdudSBsb25nbmFtZSBleHRlbmRlZCBoZWFkZXIgKyBsb25nbmFtZQorICAgICAgICAgICAgIyBHTlUgbG9uZ25hbWUgZXh0ZW5kZWQgaGVhZGVyICsgbG9uZ25hbWUKICAgICAgICAgICAgIGNvdW50ICs9IDUxMgogICAgICAgICAgICAgY291bnQgKz0gc2VsZi5fbGVuZ3RoKG5hbWUpCi0KICAgICAgICAgaWYgbGluayBpcyBub3QgTm9uZSBhbmQgbGVuKGxpbmspID4gdGFyZmlsZS5MRU5HVEhfTElOSzoKLSAgICAgICAgICAgICMgZ251IGxvbmdsaW5rIGV4dGVuZGVkIGhlYWRlciArIGxvbmdsaW5rCisgICAgICAgICAgICAjIEdOVSBsb25nbGluayBleHRlbmRlZCBoZWFkZXIgKyBsb25nbGluawogICAgICAgICAgICAgY291bnQgKz0gNTEyCiAgICAgICAgICAgICBjb3VudCArPSBzZWxmLl9sZW5ndGgobGluaykKLQogICAgICAgICByZXR1cm4gY291bnQKIAogICAgIGRlZiBfdGVzdChzZWxmLCBuYW1lLCBsaW5rPU5vbmUpOgpAQCAtNDk1LDE3ICs1OTEsMTcgQEAKICAgICAgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSBsaW5rCiAgICAgICAgICAgICB0YXJpbmZvLnR5cGUgPSB0YXJmaWxlLkxOS1RZUEUKIAotICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSgpLCAidyIpCi0gICAgICAgIHRhci5wb3NpeCA9IEZhbHNlCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIpCisgICAgICAgIHRhci5mb3JtYXQgPSB0YXJmaWxlLkdOVV9GT1JNQVQKICAgICAgICAgdGFyLmFkZGZpbGUodGFyaW5mbykKIAogICAgICAgICB2MSA9IHNlbGYuX2NhbGNfc2l6ZShuYW1lLCBsaW5rKQogICAgICAgICB2MiA9IHRhci5vZmZzZXQKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2MSwgdjIsICJHTlUgbG9uZ25hbWUvbG9uZ2xpbmsgY3JlYXRpb24gZmFpbGVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKHYxID09IHYyLCAiR05VIGxvbmduYW1lL2xvbmdsaW5rIGNyZWF0aW9uIGZhaWxlZCIpCiAKICAgICAgICAgdGFyLmNsb3NlKCkKIAotICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSgpKQorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSkKICAgICAgICAgbWVtYmVyID0gdGFyLm5leHQoKQogICAgICAgICBzZWxmLmZhaWxJZihtZW1iZXIgaXMgTm9uZSwgInVuYWJsZSB0byByZWFkIGxvbmduYW1lIG1lbWJlciIpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLm5hbWUgPT0gbWVtYmVyLm5hbWUgYW5kIFwKQEAgLTU0MiwyNjggKzYzOCwzNTIgQEAKICAgICAgICAgc2VsZi5fdGVzdCgoImxvbmduYW0vIiAqIDEyNykgKyAibG9uZ25hbWVfIiwKICAgICAgICAgICAgICAgICAgICAoImxvbmdsbmsvIiAqIDEyNykgKyAibG9uZ2xpbmtfIikKIAotY2xhc3MgUmVhZEdOVUxvbmdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworY2xhc3MgSGFyZGxpbmtUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRlc3QgdGhlIGNyZWF0aW9uIG9mIExOS1RZUEUgKGhhcmRsaW5rKSBtZW1iZXJzIGluIGFuIGFyY2hpdmUuCiAKICAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUoKSkKKyAgICAgICAgc2VsZi5mb28gPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImZvbyIpCisgICAgICAgIHNlbGYuYmFyID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJiYXIiKQogCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICBzZWxmLnRhci5jbG9zZSgpCisgICAgICAgIGZvYmogPSBvcGVuKHNlbGYuZm9vLCAid2IiKQorICAgICAgICBmb2JqLndyaXRlKCJmb28iKQorICAgICAgICBmb2JqLmNsb3NlKCkKIAotICAgIGRlZiB0ZXN0XzE0NzE0Mjcoc2VsZik6Ci0gICAgICAgICIiIlRlc3QgcmVhZGluZyBvZiBsb25nbmFtZSAoYnVnICMxNDcxNDI3KS4KLSAgICAgICAgIiIiCi0gICAgICAgIG5hbWUgPSAidGVzdC8iICogMjAgKyAiMC1SRUdUWVBFIgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKG5hbWUpCi0gICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgIHRhcmluZm8gPSBOb25lCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvIGlzIG5vdCBOb25lLCAibG9uZ25hbWUgbm90IGZvdW5kIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8udHlwZSAhPSB0YXJmaWxlLkRJUlRZUEUsICJyZWFkIGxvbmduYW1lIGFzIGRpcnR5cGUiKQorICAgICAgICBvcy5saW5rKHNlbGYuZm9vLCBzZWxmLmJhcikKIAotICAgIGRlZiB0ZXN0X3JlYWRfbmFtZShzZWxmKToKLSAgICAgICAgbmFtZSA9ICgiMC1MT05HTkFNRS0iICogMTApWzoxMDFdCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIobmFtZSkKLSAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgdGFyaW5mbyA9IE5vbmUKLSAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8gaXMgbm90IE5vbmUsICJsb25nbmFtZSBub3QgZm91bmQiKQotCi0gICAgZGVmIHRlc3RfcmVhZF9saW5rKHNlbGYpOgotICAgICAgICBsaW5rID0gKCIxLUxPTkdMSU5LLSIgKiAxMClbOjEwMV0KLSAgICAgICAgbmFtZSA9ICgiMC1MT05HTkFNRS0iICogMTApWzoxMDFdCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIobGluaykKLSAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgdGFyaW5mbyA9IE5vbmUKLSAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8gaXMgbm90IE5vbmUsICJsb25nbGluayBub3QgZm91bmQiKQotICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mby5saW5rbmFtZSA9PSBuYW1lLCAibGlua25hbWUgd3JvbmciKQotCi0gICAgZGVmIHRlc3RfdHJ1bmNhdGVkX2xvbmduYW1lKHNlbGYpOgotICAgICAgICBmID0gb3Blbih0YXJuYW1lKCkpCi0gICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTyhmLnJlYWQoMTAyNCkpCi0gICAgICAgIGYuY2xvc2UoKQotICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4obmFtZT0iZm9vLnRhciIsIGZpbGVvYmo9Zm9iaikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbih0YXIuZ2V0bWVtYmVycygpKSA9PSAwLCAiIikKLSAgICAgICAgdGFyLmNsb3NlKCkKLQotCi1jbGFzcyBFeHRyYWN0SGFyZGxpbmtUZXN0KEJhc2VUZXN0KToKLQotICAgIGRlZiB0ZXN0X2hhcmRsaW5rKHNlbGYpOgotICAgICAgICAiIiJUZXN0IGhhcmRsaW5rIGV4dHJhY3Rpb24gKGJ1ZyAjODU3Mjk3KQotICAgICAgICAiIiIKLSAgICAgICAgIyBQcmV2ZW50IGVycm9ycyBmcm9tIGJlaW5nIGNhdWdodAotICAgICAgICBzZWxmLnRhci5lcnJvcmxldmVsID0gMQotCi0gICAgICAgIHNlbGYudGFyLmV4dHJhY3QoIjAtUkVHVFlQRSIsIGRpcm5hbWUoKSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgIyBFeHRyYWN0IDEtTE5LVFlQRSB3aGljaCBpcyBhIGhhcmRsaW5rIHRvIDAtUkVHVFlQRQotICAgICAgICAgICAgc2VsZi50YXIuZXh0cmFjdCgiMS1MTktUWVBFIiwgZGlybmFtZSgpKQotICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciwgZToKLSAgICAgICAgICAgIGltcG9ydCBlcnJubwotICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6Ci0gICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJoYXJkbGluayBub3QgZXh0cmFjdGVkIHByb3Blcmx5IikKLQotY2xhc3MgQ3JlYXRlSGFyZGxpbmtUZXN0KEJhc2VUZXN0KToKLSAgICAiIiJUZXN0IHRoZSBjcmVhdGlvbiBvZiBMTktUWVBFIChoYXJkbGluaykgbWVtYmVycyBpbiBhbiBhcmNoaXZlLgotICAgICAgIEluIHRoaXMgcmVzcGVjdCB0YXJmaWxlLnB5IG1pbWljcyB0aGUgYmVoYXZpb3VyIG9mIEdOVSB0YXI6IElmCi0gICAgICAgYSBmaWxlIGhhcyBhIHN0X25saW5rID4gMSwgaXQgd2lsbCBiZSBhZGRlZCBhIFJFR1RZUEUgbWVtYmVyCi0gICAgICAgb25seSB0aGUgZmlyc3QgdGltZS4KLSAgICAiIiIKLQotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi50YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSgpLCAidyIpCi0KLSAgICAgICAgc2VsZi5mb28gPSBvcy5wYXRoLmpvaW4oZGlybmFtZSgpLCAiZm9vIikKLSAgICAgICAgc2VsZi5iYXIgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSgpLCAiYmFyIikKLQotICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmZvbyk6Ci0gICAgICAgICAgICBvcy5yZW1vdmUoc2VsZi5mb28pCi0gICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuYmFyKToKLSAgICAgICAgICAgIG9zLnJlbW92ZShzZWxmLmJhcikKLQotICAgICAgICBmID0gb3BlbihzZWxmLmZvbywgInciKQotICAgICAgICBmLndyaXRlKCJmb28iKQotICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgc2VsZi50YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciKQogICAgICAgICBzZWxmLnRhci5hZGQoc2VsZi5mb28pCiAKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIG9zLnJlbW92ZShzZWxmLmZvbykKKyAgICAgICAgb3MucmVtb3ZlKHNlbGYuYmFyKQorCiAgICAgZGVmIHRlc3RfYWRkX3R3aWNlKHNlbGYpOgotICAgICAgICAjIElmIHN0X25saW5rID09IDEgdGhlbiB0aGUgc2FtZSBmaWxlIHdpbGwgYmUgYWRkZWQgYXMKLSAgICAgICAgIyBSRUdUWVBFIGV2ZXJ5IHRpbWUuCisgICAgICAgICMgVGhlIHNhbWUgbmFtZSB3aWxsIGJlIGFkZGVkIGFzIGEgUkVHVFlQRSBldmVyeQorICAgICAgICAjIHRpbWUgcmVnYXJkbGVzcyBvZiBzdF9ubGluay4KICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldHRhcmluZm8oc2VsZi5mb28pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby50eXBlLCB0YXJmaWxlLlJFR1RZUEUsCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLnR5cGUgPT0gdGFyZmlsZS5SRUdUWVBFLAogICAgICAgICAgICAgICAgICJhZGQgZmlsZSBhcyByZWd1bGFyIGZhaWxlZCIpCiAKICAgICBkZWYgdGVzdF9hZGRfaGFyZGxpbmsoc2VsZik6Ci0gICAgICAgICMgSWYgc3RfbmxpbmsgPiAxIHRoZW4gdGhlIHNhbWUgZmlsZSB3aWxsIGJlIGFkZGVkIGFzCi0gICAgICAgICMgTE5LVFlQRS4KLSAgICAgICAgb3MubGluayhzZWxmLmZvbywgc2VsZi5iYXIpCi0gICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXR0YXJpbmZvKHNlbGYuZm9vKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udHlwZSwgdGFyZmlsZS5MTktUWVBFLAotICAgICAgICAgICAgICAgICJhZGQgZmlsZSBhcyBoYXJkbGluayBmYWlsZWQiKQotCiAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXR0YXJpbmZvKHNlbGYuYmFyKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udHlwZSwgdGFyZmlsZS5MTktUWVBFLAorICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mby50eXBlID09IHRhcmZpbGUuTE5LVFlQRSwKICAgICAgICAgICAgICAgICAiYWRkIGZpbGUgYXMgaGFyZGxpbmsgZmFpbGVkIikKIAogICAgIGRlZiB0ZXN0X2RlcmVmZXJlbmNlX2hhcmRsaW5rKHNlbGYpOgogICAgICAgICBzZWxmLnRhci5kZXJlZmVyZW5jZSA9IFRydWUKLSAgICAgICAgb3MubGluayhzZWxmLmZvbywgc2VsZi5iYXIpCiAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXR0YXJpbmZvKHNlbGYuYmFyKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udHlwZSwgdGFyZmlsZS5SRUdUWVBFLAorICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mby50eXBlID09IHRhcmZpbGUuUkVHVFlQRSwKICAgICAgICAgICAgICAgICAiZGVyZWZlcmVuY2luZyBoYXJkbGluayBmYWlsZWQiKQogCiAKLSMgR3ppcCBUZXN0Q2FzZXMKLWNsYXNzIFJlYWRUZXN0R3ppcChSZWFkVGVzdCk6Ci0gICAgY29tcCA9ICJneiIKLWNsYXNzIFJlYWRTdHJlYW1UZXN0R3ppcChSZWFkU3RyZWFtVGVzdCk6Ci0gICAgY29tcCA9ICJneiIKLWNsYXNzIFdyaXRlVGVzdEd6aXAoV3JpdGVUZXN0KToKLSAgICBjb21wID0gImd6IgotY2xhc3MgV3JpdGVTdHJlYW1UZXN0R3ppcChXcml0ZVN0cmVhbVRlc3QpOgotICAgIGNvbXAgPSAiZ3oiCi1jbGFzcyBSZWFkRGV0ZWN0VGVzdEd6aXAoUmVhZERldGVjdFRlc3QpOgotICAgIGNvbXAgPSAiZ3oiCi1jbGFzcyBSZWFkRGV0ZWN0RmlsZW9ialRlc3RHemlwKFJlYWREZXRlY3RGaWxlb2JqVGVzdCk6Ci0gICAgY29tcCA9ICJneiIKLWNsYXNzIFJlYWRBc3Rlcmlza1Rlc3RHemlwKFJlYWRBc3Rlcmlza1Rlc3QpOgotICAgIGNvbXAgPSAiZ3oiCi1jbGFzcyBSZWFkU3RyZWFtQXN0ZXJpc2tUZXN0R3ppcChSZWFkU3RyZWFtQXN0ZXJpc2tUZXN0KToKLSAgICBjb21wID0gImd6IgorY2xhc3MgUGF4V3JpdGVUZXN0KEdOVVdyaXRlVGVzdCk6CiAKLSMgRmlsZW1vZGUgdGVzdCBjYXNlcworICAgIGRlZiBfdGVzdChzZWxmLCBuYW1lLCBsaW5rPU5vbmUpOgorICAgICAgICAjIFNlZSBHTlVXcml0ZVRlc3QuCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8obmFtZSkKKyAgICAgICAgaWYgbGluazoKKyAgICAgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSBsaW5rCisgICAgICAgICAgICB0YXJpbmZvLnR5cGUgPSB0YXJmaWxlLkxOS1RZUEUKIAotY2xhc3MgRmlsZU1vZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgdGVzdF9tb2RlcyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJmaWxlLmZpbGVtb2RlKDA3NTUpLCAnLXJ3eHIteHIteCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyZmlsZS5maWxlbW9kZSgwNzExMSksICctLS1zLS1zLS10JykKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXRhcmZpbGUuUEFYX0ZPUk1BVCkKKyAgICAgICAgdGFyLmFkZGZpbGUodGFyaW5mbykKKyAgICAgICAgdGFyLmNsb3NlKCkKIAotY2xhc3MgSGVhZGVyRXJyb3JUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUpCisgICAgICAgIGlmIGxpbms6CisgICAgICAgICAgICBsID0gdGFyLmdldG1lbWJlcnMoKVswXS5saW5rbmFtZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxpbmsgPT0gbCwgIlBBWCBsb25nbGluayBjcmVhdGlvbiBmYWlsZWQiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbiA9IHRhci5nZXRtZW1iZXJzKClbMF0ubmFtZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5hbWUgPT0gbiwgIlBBWCBsb25nbmFtZSBjcmVhdGlvbiBmYWlsZWQiKQorCisgICAgZGVmIHRlc3RfaXNvODg1OV8xNV9maWxlbmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF91bmljb2RlX2ZpbGVuYW1lKCJpc284ODU5LTE1IikKKworICAgIGRlZiB0ZXN0X3V0ZjhfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfdW5pY29kZV9maWxlbmFtZSgidXRmOCIpCisKKyAgICBkZWYgdGVzdF91dGYxNl9maWxlbmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF91bmljb2RlX2ZpbGVuYW1lKCJ1dGYxNiIpCisKKyAgICBkZWYgX3Rlc3RfdW5pY29kZV9maWxlbmFtZShzZWxmLCBlbmNvZGluZyk6CisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIsIGZvcm1hdD10YXJmaWxlLlBBWF9GT1JNQVQpCisgICAgICAgIG5hbWUgPSB1Ilx1MjBhYyIuZW5jb2RlKGVuY29kaW5nKSAjIEV1cm8gc2lnbgorICAgICAgICB0YXIuZW5jb2RpbmcgPSBlbmNvZGluZworICAgICAgICB0YXIuYWRkZmlsZSh0YXJmaWxlLlRhckluZm8obmFtZSkpCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIGVuY29kaW5nPWVuY29kaW5nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRtZW1iZXJzKClbMF0ubmFtZSwgbmFtZSkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfZmlsZW5hbWVfZXJyb3Ioc2VsZik6CisgICAgICAgICMgVGhlIGV1cm8gc2lnbiBmaWxlbmFtZSBjYW5ub3QgYmUgdHJhbnNsYXRlZCB0byBpc284ODU5LTEgZW5jb2RpbmcuCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIsIGZvcm1hdD10YXJmaWxlLlBBWF9GT1JNQVQsIGVuY29kaW5nPSJ1dGY4IikKKyAgICAgICAgbmFtZSA9IHUiXHUyMGFjIi5lbmNvZGUoInV0ZjgiKSAjIEV1cm8gc2lnbgorICAgICAgICB0YXIuYWRkZmlsZSh0YXJmaWxlLlRhckluZm8obmFtZSkpCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCB0YXJmaWxlLm9wZW4sIHRtcG5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQorCisgICAgZGVmIHRlc3RfcGF4X2hlYWRlcnMoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfcGF4X2hlYWRlcnMoeyJmb28iOiAiYmFyIiwgInVpZCI6IDAsICJtdGltZSI6IDEuMjN9KQorCisgICAgICAgIHNlbGYuX3Rlc3RfcGF4X2hlYWRlcnMoeyJldXJvIjogdSJcdTIwYWMiLmVuY29kZSgidXRmOCIpfSkKKworICAgICAgICBzZWxmLl90ZXN0X3BheF9oZWFkZXJzKHsiZXVybyI6IHUiXHUyMGFjIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJldXJvIjogdSJcdTIwYWMiLmVuY29kZSgidXRmOCIpfSkKKworICAgICAgICBzZWxmLl90ZXN0X3BheF9oZWFkZXJzKHt1Ilx1MjBhYyI6ICJldXJvIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3UiXHUyMGFjIi5lbmNvZGUoInV0ZjgiKTogImV1cm8ifSkKKworICAgIGRlZiBfdGVzdF9wYXhfaGVhZGVycyhzZWxmLCBwYXhfaGVhZGVycywgY21wX2hlYWRlcnM9Tm9uZSk6CisgICAgICAgIGlmIGNtcF9oZWFkZXJzIGlzIE5vbmU6CisgICAgICAgICAgICBjbXBfaGVhZGVycyA9IHBheF9oZWFkZXJzCisKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXRhcmZpbGUuUEFYX0ZPUk1BVCwgXAorICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzPXBheF9oZWFkZXJzLCBlbmNvZGluZz0idXRmOCIpCisgICAgICAgIHRhci5hZGRmaWxlKHRhcmZpbGUuVGFySW5mbygidGVzdCIpKQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBlbmNvZGluZz0idXRmOCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLnBheF9oZWFkZXJzLCBjbXBfaGVhZGVycykKIAogICAgIGRlZiB0ZXN0X3RydW5jYXRlZF9oZWFkZXIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuSGVhZGVyRXJyb3IsIHRhcmZpbGUuVGFySW5mby5mcm9tYnVmLCAiIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5IZWFkZXJFcnJvciwgdGFyZmlsZS5UYXJJbmZvLmZyb21idWYsICJmaWxlbmFtZVwwIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5IZWFkZXJFcnJvciwgdGFyZmlsZS5UYXJJbmZvLmZyb21idWYsICJcMCIgKiA1MTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuSGVhZGVyRXJyb3IsIHRhcmZpbGUuVGFySW5mby5mcm9tYnVmLCAiXDAiICogNTEzKQorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9dGFyZmlsZS5QQVhfRk9STUFUKQorICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIpCisgICAgICAgIHRhci5hZGRmaWxlKHRhcmluZm8pCisgICAgICAgIHRhci5jbG9zZSgpCiAKLSAgICBkZWYgdGVzdF9lbXB0eV9oZWFkZXIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuSGVhZGVyRXJyb3IsIHRhcmZpbGUuVGFySW5mby5mcm9tYnVmLCAiXDAiICogNTEyKQorICAgICAgICAjIFNpbXVsYXRlIGEgcHJlbWF0dXJlIEVPRi4KKyAgICAgICAgb3Blbih0bXBuYW1lLCAicmIrIikudHJ1bmNhdGUoMTUzNikKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLmdldG1lbWJlcnMoKSwgW10pCiAKLSAgICBkZWYgdGVzdF9pbnZhbGlkX2hlYWRlcihzZWxmKToKLSAgICAgICAgYnVmID0gdGFyZmlsZS5UYXJJbmZvKCJmaWxlbmFtZSIpLnRvYnVmKCkKLSAgICAgICAgYnVmID0gYnVmWzoxNDhdICsgImZvb1wwXDBcMFwwXDAiICsgYnVmWzE1NjpdICMgaW52YWxpZCBudW1iZXIgZmllbGQuCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuSGVhZGVyRXJyb3IsIHRhcmZpbGUuVGFySW5mby5mcm9tYnVmLCBidWYpCiAKLSAgICBkZWYgdGVzdF9iYWRfY2hlY2tzdW0oc2VsZik6Ci0gICAgICAgIGJ1ZiA9IHRhcmZpbGUuVGFySW5mbygiZmlsZW5hbWUiKS50b2J1ZigpCi0gICAgICAgIGIgPSBidWZbOjE0OF0gKyAiICAgICAgICAiICsgYnVmWzE1NjpdICMgY2xlYXIgdGhlIGNoZWNrc3VtIGZpZWxkLgotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLkhlYWRlckVycm9yLCB0YXJmaWxlLlRhckluZm8uZnJvbWJ1ZiwgYikKLSAgICAgICAgYiA9ICJhIiArIGJ1ZlsxOl0gIyBtYW5pcHVsYXRlIHRoZSBidWZmZXIsIHNvIGNoZWNrc3VtIHdvbid0IG1hdGNoLgotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLkhlYWRlckVycm9yLCB0YXJmaWxlLlRhckluZm8uZnJvbWJ1ZiwgYikKK2NsYXNzIEFwcGVuZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGVzdCBhcHBlbmQgbW9kZSAoY3AuIHBhdGNoICMxNjUyNjgxKS4KIAotY2xhc3MgT3BlbkZpbGVvYmpUZXN0KEJhc2VUZXN0KToKLSAgICAjIFRlc3QgZm9yIFNGIGJ1ZyAjMTQ5NjUwMS4KKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudGFybmFtZSA9IHRtcG5hbWUKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi50YXJuYW1lKToKKyAgICAgICAgICAgIG9zLnJlbW92ZShzZWxmLnRhcm5hbWUpCiAKLSAgICBkZWYgdGVzdF9vcGVuZXIoc2VsZik6Ci0gICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTygiZm9vXG4iKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB0YXJmaWxlLm9wZW4oIiIsICJyIiwgZmlsZW9iaj1mb2JqKQotICAgICAgICBleGNlcHQgdGFyZmlsZS5SZWFkRXJyb3I6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvYmoudGVsbCgpLCAwLCAiZmlsZW9iaidzIHBvc2l0aW9uIGhhcyBtb3ZlZCIpCisgICAgZGVmIF9hZGRfdGVzdGZpbGUoc2VsZiwgZmlsZW9iaj1Ob25lKToKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgImEiLCBmaWxlb2JqPWZpbGVvYmopCisgICAgICAgIHRhci5hZGRmaWxlKHRhcmZpbGUuVGFySW5mbygiYmFyIikpCisgICAgICAgIHRhci5jbG9zZSgpCiAKLWlmIGJ6MjoKLSAgICAjIEJ6aXAyIFRlc3RDYXNlcwotICAgIGNsYXNzIFJlYWRUZXN0QnppcDIoUmVhZFRlc3RHemlwKToKLSAgICAgICAgY29tcCA9ICJiejIiCi0gICAgY2xhc3MgUmVhZFN0cmVhbVRlc3RCemlwMihSZWFkU3RyZWFtVGVzdEd6aXApOgotICAgICAgICBjb21wID0gImJ6MiIKLSAgICBjbGFzcyBXcml0ZVRlc3RCemlwMihXcml0ZVRlc3QpOgotICAgICAgICBjb21wID0gImJ6MiIKLSAgICBjbGFzcyBXcml0ZVN0cmVhbVRlc3RCemlwMihXcml0ZVN0cmVhbVRlc3RHemlwKToKLSAgICAgICAgY29tcCA9ICJiejIiCi0gICAgY2xhc3MgUmVhZERldGVjdFRlc3RCemlwMihSZWFkRGV0ZWN0VGVzdCk6Ci0gICAgICAgIGNvbXAgPSAiYnoyIgotICAgIGNsYXNzIFJlYWREZXRlY3RGaWxlb2JqVGVzdEJ6aXAyKFJlYWREZXRlY3RGaWxlb2JqVGVzdCk6Ci0gICAgICAgIGNvbXAgPSAiYnoyIgotICAgIGNsYXNzIFJlYWRBc3Rlcmlza1Rlc3RCemlwMihSZWFkQXN0ZXJpc2tUZXN0KToKLSAgICAgICAgY29tcCA9ICJiejIiCi0gICAgY2xhc3MgUmVhZFN0cmVhbUFzdGVyaXNrVGVzdEJ6aXAyKFJlYWRTdHJlYW1Bc3Rlcmlza1Rlc3QpOgotICAgICAgICBjb21wID0gImJ6MiIKKyAgICBkZWYgX2NyZWF0ZV90ZXN0dGFyKHNlbGYsIG1vZGU9Inc6Iik6CisgICAgICAgIHNyYyA9IHRhcmZpbGUub3Blbih0YXJuYW1lKQorICAgICAgICB0ID0gc3JjLmdldG1lbWJlcigidXN0YXIvcmVndHlwZSIpCisgICAgICAgIHQubmFtZSA9ICJmb28iCisgICAgICAgIGYgPSBzcmMuZXh0cmFjdGZpbGUodCkKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgbW9kZSkKKyAgICAgICAgdGFyLmFkZGZpbGUodCwgZikKKyAgICAgICAgdGFyLmNsb3NlKCkKIAotIyBJZiBpbXBvcnRpbmcgZ3ppcCBmYWlsZWQsIGRpc2NhcmQgdGhlIEd6aXAgVGVzdENhc2VzLgotaWYgbm90IGd6aXA6Ci0gICAgZGVsIFJlYWRUZXN0R3ppcAotICAgIGRlbCBSZWFkU3RyZWFtVGVzdEd6aXAKLSAgICBkZWwgV3JpdGVUZXN0R3ppcAotICAgIGRlbCBXcml0ZVN0cmVhbVRlc3RHemlwCisgICAgZGVmIF90ZXN0KHNlbGYsIG5hbWVzPVsiYmFyIl0sIGZpbGVvYmo9Tm9uZSk6CisgICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihzZWxmLnRhcm5hbWUsIGZpbGVvYmo9ZmlsZW9iaikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZ2V0bmFtZXMoKSwgbmFtZXMpCisKKyAgICBkZWYgdGVzdF9ub25fZXhpc3Rpbmcoc2VsZik6CisgICAgICAgIHNlbGYuX2FkZF90ZXN0ZmlsZSgpCisgICAgICAgIHNlbGYuX3Rlc3QoKQorCisgICAgZGVmIHRlc3RfZW1wdHkoc2VsZik6CisgICAgICAgIG9wZW4oc2VsZi50YXJuYW1lLCAidyIpLmNsb3NlKCkKKyAgICAgICAgc2VsZi5fYWRkX3Rlc3RmaWxlKCkKKyAgICAgICAgc2VsZi5fdGVzdCgpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9maWxlb2JqKHNlbGYpOgorICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBzZWxmLl9hZGRfdGVzdGZpbGUoZm9iaikKKyAgICAgICAgZm9iai5zZWVrKDApCisgICAgICAgIHNlbGYuX3Rlc3QoZmlsZW9iaj1mb2JqKQorCisgICAgZGVmIHRlc3RfZmlsZW9iaihzZWxmKToKKyAgICAgICAgc2VsZi5fY3JlYXRlX3Rlc3R0YXIoKQorICAgICAgICBkYXRhID0gb3BlbihzZWxmLnRhcm5hbWUpLnJlYWQoKQorICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oZGF0YSkKKyAgICAgICAgc2VsZi5fYWRkX3Rlc3RmaWxlKGZvYmopCisgICAgICAgIGZvYmouc2VlaygwKQorICAgICAgICBzZWxmLl90ZXN0KG5hbWVzPVsiZm9vIiwgImJhciJdLCBmaWxlb2JqPWZvYmopCisKKyAgICBkZWYgdGVzdF9leGlzdGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fY3JlYXRlX3Rlc3R0YXIoKQorICAgICAgICBzZWxmLl9hZGRfdGVzdGZpbGUoKQorICAgICAgICBzZWxmLl90ZXN0KG5hbWVzPVsiZm9vIiwgImJhciJdKQorCisgICAgZGVmIHRlc3RfYXBwZW5kX2d6KHNlbGYpOgorICAgICAgICBpZiBnemlwIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fY3JlYXRlX3Rlc3R0YXIoInc6Z3oiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0bXBuYW1lLCAiYSIpCisKKyAgICBkZWYgdGVzdF9hcHBlbmRfYnoyKHNlbGYpOgorICAgICAgICBpZiBiejIgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9jcmVhdGVfdGVzdHRhcigidzpiejIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0bXBuYW1lLCAiYSIpCisKKworY2xhc3MgTGltaXRzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF91c3Rhcl9saW1pdHMoc2VsZik6CisgICAgICAgICMgMTAwIGNoYXIgbmFtZQorICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIwMTIzNDU2Nzg5IiAqIDEwKQorICAgICAgICB0YXJpbmZvLmNyZWF0ZV91c3Rhcl9oZWFkZXIoKQorCisgICAgICAgICMgMTAxIGNoYXIgbmFtZSB0aGF0IGNhbm5vdCBiZSBzdG9yZWQKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMDEyMzQ1Njc4OSIgKiAxMCArICIwIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby5jcmVhdGVfdXN0YXJfaGVhZGVyKQorCisgICAgICAgICMgMjU2IGNoYXIgbmFtZSB3aXRoIGEgc2xhc2ggYXQgcG9zIDE1NgorICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDYyICsgImxvbmduYW1lIikKKyAgICAgICAgdGFyaW5mby5jcmVhdGVfdXN0YXJfaGVhZGVyKCkKKworICAgICAgICAjIDI1NiBjaGFyIG5hbWUgdGhhdCBjYW5ub3QgYmUgc3RvcmVkCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjEyMzQ1NjcvIiAqIDMxICsgImxvbmduYW1lIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby5jcmVhdGVfdXN0YXJfaGVhZGVyKQorCisgICAgICAgICMgNTEyIGNoYXIgbmFtZQorICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8uY3JlYXRlX3VzdGFyX2hlYWRlcikKKworICAgICAgICAjIDUxMiBjaGFyIGxpbmtuYW1lCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oImxvbmdsaW5rIikKKyAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9ICIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby5jcmVhdGVfdXN0YXJfaGVhZGVyKQorCisgICAgICAgICMgdWlkID4gOCBkaWdpdHMKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibmFtZSIpCisgICAgICAgIHRhcmluZm8udWlkID0gMDEwMDAwMDAwCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8uY3JlYXRlX3VzdGFyX2hlYWRlcikKKworICAgIGRlZiB0ZXN0X2dudV9saW1pdHMoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjEyMy8iICogMTI2ICsgImxvbmduYW1lIikKKyAgICAgICAgdGFyaW5mby5jcmVhdGVfZ251X2hlYWRlcigpCisKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibG9uZ2xpbmsiKQorICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gIjEyMy8iICogMTI2ICsgImxvbmduYW1lIgorICAgICAgICB0YXJpbmZvLmNyZWF0ZV9nbnVfaGVhZGVyKCkKKworICAgICAgICAjIHVpZCA+PSAyNTYgKiogNworICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJuYW1lIikKKyAgICAgICAgdGFyaW5mby51aWQgPSAwNDAwMDAwMDAwMDAwMDAwMDAwMEwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby5jcmVhdGVfZ251X2hlYWRlcikKKworICAgIGRlZiB0ZXN0X3BheF9saW1pdHMoc2VsZik6CisgICAgICAgICMgQSAyNTYgY2hhciBuYW1lIHRoYXQgY2FuIGJlIHN0b3JlZCB3aXRob3V0IGFuIGV4dGVuZGVkIGhlYWRlci4KKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMTIzLyIgKiA2MiArICJsb25nbmFtZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4odGFyaW5mby5jcmVhdGVfcGF4X2hlYWRlcigidXRmOCIpKSA9PSA1MTIsCisgICAgICAgICAgICAgICAgImNyZWF0ZV9wYXhfaGVhZGVyIGF0dGFjaGVkIHN1cGVyZmx1b3VzIGV4dGVuZGVkIGhlYWRlciIpCisKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMTIzLyIgKiAxMjYgKyAibG9uZ25hbWUiKQorICAgICAgICB0YXJpbmZvLmNyZWF0ZV9wYXhfaGVhZGVyKCJ1dGY4IikKKworICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJsb25nbGluayIpCisgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSAiMTIzLyIgKiAxMjYgKyAibG9uZ25hbWUiCisgICAgICAgIHRhcmluZm8uY3JlYXRlX3BheF9oZWFkZXIoInV0ZjgiKQorCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIm5hbWUiKQorICAgICAgICB0YXJpbmZvLnVpZCA9IDA0MDAwMDAwMDAwMDAwMDAwMDAwTAorICAgICAgICB0YXJpbmZvLmNyZWF0ZV9wYXhfaGVhZGVyKCJ1dGY4IikKKworCitjbGFzcyBHemlwTWlzY1JlYWRUZXN0KE1pc2NSZWFkVGVzdCk6CisgICAgdGFybmFtZSA9IGd6aXBuYW1lCisgICAgbW9kZSA9ICJyOmd6IgorY2xhc3MgR3ppcFVzdGFyUmVhZFRlc3QoVXN0YXJSZWFkVGVzdCk6CisgICAgdGFybmFtZSA9IGd6aXBuYW1lCisgICAgbW9kZSA9ICJyOmd6IgorY2xhc3MgR3ppcFN0cmVhbVJlYWRUZXN0KFN0cmVhbVJlYWRUZXN0KToKKyAgICB0YXJuYW1lID0gZ3ppcG5hbWUKKyAgICBtb2RlID0gInJ8Z3oiCitjbGFzcyBHemlwV3JpdGVUZXN0KFdyaXRlVGVzdCk6CisgICAgbW9kZSA9ICJ3Omd6IgorY2xhc3MgR3ppcFN0cmVhbVdyaXRlVGVzdChTdHJlYW1Xcml0ZVRlc3QpOgorICAgIG1vZGUgPSAid3xneiIKKworCitjbGFzcyBCejJNaXNjUmVhZFRlc3QoTWlzY1JlYWRUZXN0KToKKyAgICB0YXJuYW1lID0gYnoybmFtZQorICAgIG1vZGUgPSAicjpiejIiCitjbGFzcyBCejJVc3RhclJlYWRUZXN0KFVzdGFyUmVhZFRlc3QpOgorICAgIHRhcm5hbWUgPSBiejJuYW1lCisgICAgbW9kZSA9ICJyOmJ6MiIKK2NsYXNzIEJ6MlN0cmVhbVJlYWRUZXN0KFN0cmVhbVJlYWRUZXN0KToKKyAgICB0YXJuYW1lID0gYnoybmFtZQorICAgIG1vZGUgPSAicnxiejIiCitjbGFzcyBCejJXcml0ZVRlc3QoV3JpdGVUZXN0KToKKyAgICBtb2RlID0gInc6YnoyIgorY2xhc3MgQnoyU3RyZWFtV3JpdGVUZXN0KFN0cmVhbVdyaXRlVGVzdCk6CisgICAgbW9kZSA9ICJ3fGJ6MiIKIAogZGVmIHRlc3RfbWFpbigpOgotICAgICMgQ3JlYXRlIGFyY2hpdmUuCi0gICAgZiA9IG9wZW4odGFybmFtZSgpLCAicmIiKQotICAgIGZndXRzID0gZi5yZWFkKCkKLSAgICBmLmNsb3NlKCkKLSAgICBpZiBnemlwOgotICAgICAgICAjIGNyZWF0ZSB0ZXN0dGFyLnRhci5negotICAgICAgICB0YXIgPSBnemlwLm9wZW4odGFybmFtZSgiZ3oiKSwgIndiIikKLSAgICAgICAgdGFyLndyaXRlKGZndXRzKQotICAgICAgICB0YXIuY2xvc2UoKQotICAgIGlmIGJ6MjoKLSAgICAgICAgIyBjcmVhdGUgdGVzdHRhci50YXIuYnoyCi0gICAgICAgIHRhciA9IGJ6Mi5CWjJGaWxlKHRhcm5hbWUoImJ6MiIpLCAid2IiKQotICAgICAgICB0YXIud3JpdGUoZmd1dHMpCi0gICAgICAgIHRhci5jbG9zZSgpCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKFRFTVBESVIpOgorICAgICAgICBvcy5ta2RpcihURU1QRElSKQogCiAgICAgdGVzdHMgPSBbCi0gICAgICAgIEZpbGVNb2RlVGVzdCwKLSAgICAgICAgSGVhZGVyRXJyb3JUZXN0LAotICAgICAgICBPcGVuRmlsZW9ialRlc3QsCi0gICAgICAgIFJlYWRUZXN0LAotICAgICAgICBSZWFkU3RyZWFtVGVzdCwKLSAgICAgICAgUmVhZERldGVjdFRlc3QsCi0gICAgICAgIFJlYWREZXRlY3RGaWxlb2JqVGVzdCwKLSAgICAgICAgUmVhZEFzdGVyaXNrVGVzdCwKLSAgICAgICAgUmVhZFN0cmVhbUFzdGVyaXNrVGVzdCwKKyAgICAgICAgVXN0YXJSZWFkVGVzdCwKKyAgICAgICAgTWlzY1JlYWRUZXN0LAorICAgICAgICBTdHJlYW1SZWFkVGVzdCwKKyAgICAgICAgRGV0ZWN0UmVhZFRlc3QsCisgICAgICAgIE1lbWJlclJlYWRUZXN0LAorICAgICAgICBHTlVSZWFkVGVzdCwKKyAgICAgICAgUGF4UmVhZFRlc3QsCiAgICAgICAgIFdyaXRlVGVzdCwKKyAgICAgICAgU3RyZWFtV3JpdGVUZXN0LAorICAgICAgICBHTlVXcml0ZVRlc3QsCisgICAgICAgIFBheFdyaXRlVGVzdCwKICAgICAgICAgQXBwZW5kVGVzdCwKLSAgICAgICAgV3JpdGUxMDBUZXN0LAotICAgICAgICBXcml0ZVNpemUwVGVzdCwKLSAgICAgICAgV3JpdGVTdHJlYW1UZXN0LAotICAgICAgICBXcml0ZUdOVUxvbmdUZXN0LAotICAgICAgICBSZWFkR05VTG9uZ1Rlc3QsCisgICAgICAgIExpbWl0c1Rlc3QsCiAgICAgXQogCiAgICAgaWYgaGFzYXR0cihvcywgImxpbmsiKToKLSAgICAgICAgdGVzdHMuYXBwZW5kKEV4dHJhY3RIYXJkbGlua1Rlc3QpCi0gICAgICAgIHRlc3RzLmFwcGVuZChDcmVhdGVIYXJkbGlua1Rlc3QpCisgICAgICAgIHRlc3RzLmFwcGVuZChIYXJkbGlua1Rlc3QpCisKKyAgICBmb2JqID0gb3Blbih0YXJuYW1lLCAicmIiKQorICAgIGRhdGEgPSBmb2JqLnJlYWQoKQorICAgIGZvYmouY2xvc2UoKQogCiAgICAgaWYgZ3ppcDoKLSAgICAgICAgdGVzdHMuZXh0ZW5kKFsKLSAgICAgICAgICAgIFJlYWRUZXN0R3ppcCwgUmVhZFN0cmVhbVRlc3RHemlwLAotICAgICAgICAgICAgV3JpdGVUZXN0R3ppcCwgV3JpdGVTdHJlYW1UZXN0R3ppcCwKLSAgICAgICAgICAgIFJlYWREZXRlY3RUZXN0R3ppcCwgUmVhZERldGVjdEZpbGVvYmpUZXN0R3ppcCwKLSAgICAgICAgICAgIFJlYWRBc3Rlcmlza1Rlc3RHemlwLCBSZWFkU3RyZWFtQXN0ZXJpc2tUZXN0R3ppcAotICAgICAgICBdKQorICAgICAgICAjIENyZWF0ZSB0ZXN0dGFyLnRhci5neiBhbmQgYWRkIGd6aXAtc3BlY2lmaWMgdGVzdHMuCisgICAgICAgIHRhciA9IGd6aXAub3BlbihnemlwbmFtZSwgIndiIikKKyAgICAgICAgdGFyLndyaXRlKGRhdGEpCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgdGVzdHMgKz0gWworICAgICAgICAgICAgR3ppcE1pc2NSZWFkVGVzdCwKKyAgICAgICAgICAgIEd6aXBVc3RhclJlYWRUZXN0LAorICAgICAgICAgICAgR3ppcFN0cmVhbVJlYWRUZXN0LAorICAgICAgICAgICAgR3ppcFdyaXRlVGVzdCwKKyAgICAgICAgICAgIEd6aXBTdHJlYW1Xcml0ZVRlc3QsCisgICAgICAgIF0KIAogICAgIGlmIGJ6MjoKLSAgICAgICAgdGVzdHMuZXh0ZW5kKFsKLSAgICAgICAgICAgIFJlYWRUZXN0QnppcDIsIFJlYWRTdHJlYW1UZXN0QnppcDIsCi0gICAgICAgICAgICBXcml0ZVRlc3RCemlwMiwgV3JpdGVTdHJlYW1UZXN0QnppcDIsCi0gICAgICAgICAgICBSZWFkRGV0ZWN0VGVzdEJ6aXAyLCBSZWFkRGV0ZWN0RmlsZW9ialRlc3RCemlwMiwKLSAgICAgICAgICAgIFJlYWRBc3Rlcmlza1Rlc3RCemlwMiwgUmVhZFN0cmVhbUFzdGVyaXNrVGVzdEJ6aXAyCi0gICAgICAgIF0pCisgICAgICAgICMgQ3JlYXRlIHRlc3R0YXIudGFyLmJ6MiBhbmQgYWRkIGJ6Mi1zcGVjaWZpYyB0ZXN0cy4KKyAgICAgICAgdGFyID0gYnoyLkJaMkZpbGUoYnoybmFtZSwgIndiIikKKyAgICAgICAgdGFyLndyaXRlKGRhdGEpCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgdGVzdHMgKz0gWworICAgICAgICAgICAgQnoyTWlzY1JlYWRUZXN0LAorICAgICAgICAgICAgQnoyVXN0YXJSZWFkVGVzdCwKKyAgICAgICAgICAgIEJ6MlN0cmVhbVJlYWRUZXN0LAorICAgICAgICAgICAgQnoyV3JpdGVUZXN0LAorICAgICAgICAgICAgQnoyU3RyZWFtV3JpdGVUZXN0LAorICAgICAgICBdCisKICAgICB0cnk6CiAgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQogICAgIGZpbmFsbHk6Ci0gICAgICAgIGlmIGd6aXA6Ci0gICAgICAgICAgICBvcy5yZW1vdmUodGFybmFtZSgiZ3oiKSkKLSAgICAgICAgaWYgYnoyOgotICAgICAgICAgICAgb3MucmVtb3ZlKHRhcm5hbWUoImJ6MiIpKQotICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkaXJuYW1lKCkpOgotICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShkaXJuYW1lKCkpCi0gICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRtcG5hbWUoKSk6Ci0gICAgICAgICAgICBvcy5yZW1vdmUodG1wbmFtZSgpKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhURU1QRElSKToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoVEVNUERJUikKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQorCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0dGFyLnRhciBiL0xpYi90ZXN0L3Rlc3R0YXIudGFyCmluZGV4IDFmNDQ5M2YuLmM0YzgyYjggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3R0YXIudGFyCisrKyBiL0xpYi90ZXN0L3Rlc3R0YXIudGFyCkJpbmFyeSBmaWxlcyBkaWZmZXIK